From b9fab32f8835f50ce4da55ed7fd8adc5eaf90804 Mon Sep 17 00:00:00 2001 From: Jules Date: Sun, 6 Feb 2022 21:23:07 +0100 Subject: [PATCH] Fully added back event triggers --- .../api/player/profess/PlayerClass.java | 21 +++++++- .../player/profess/event/EventTrigger.java | 43 +++++++++++++++++ .../profess/event/EventTriggerHandler.java | 8 ++++ .../event/trigger/AttackEventTrigger.java | 33 +++++++++++++ .../event/trigger/BlockBrokenTrigger.java | 24 ++++++++++ .../event/trigger/BlockPlacedTrigger.java | 24 ++++++++++ .../trigger/ClassChosenEventTrigger.java | 29 +++++++++++ .../event/trigger/LevelUpEventTrigger.java | 42 ++++++++++++++++ .../trigger/MultipleLevelUpEventTrigger.java | 48 +++++++++++++++++++ .../Indyuce/mmocore/manager/ClassManager.java | 44 +++++++++++++---- 10 files changed, 307 insertions(+), 9 deletions(-) create mode 100644 src/main/java/net/Indyuce/mmocore/api/player/profess/event/EventTrigger.java create mode 100644 src/main/java/net/Indyuce/mmocore/api/player/profess/event/EventTriggerHandler.java create mode 100644 src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/AttackEventTrigger.java create mode 100644 src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/BlockBrokenTrigger.java create mode 100644 src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/BlockPlacedTrigger.java create mode 100644 src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/ClassChosenEventTrigger.java create mode 100644 src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/LevelUpEventTrigger.java create mode 100644 src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/MultipleLevelUpEventTrigger.java diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java index c64ef2cc..633f8f9d 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java @@ -7,6 +7,7 @@ import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.util.PostLoadObject; import io.lumine.mythic.lib.version.VersionMaterial; import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.profess.event.EventTrigger; import net.Indyuce.mmocore.api.player.profess.resource.ManaDisplayOptions; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.profess.resource.ResourceRegeneration; @@ -55,6 +56,9 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { private final Map classTriggers = new HashMap<>(); private final Map resourceHandlers = new HashMap<>(); + @Deprecated + private final Map eventTriggers = new HashMap<>(); + private final CastingParticle castParticle; public PlayerClass(String id, FileConfiguration config) { @@ -107,7 +111,7 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { for (String key : config.getConfigurationSection("triggers").getKeys(false)) { try { String format = key.toLowerCase().replace("_", "-").replace(" ", "-"); - classTriggers.put(format, new ClassTrigger(format, config.getStringList("triggers." + key))); + eventTriggers.put(format, new EventTrigger(format, config.getStringList("triggers." + key))); } catch (IllegalArgumentException exception) { MMOCore.log(Level.WARNING, "Could not load trigger '" + key + "' from class '" + id + "':" + exception.getMessage()); } @@ -296,6 +300,21 @@ public class PlayerClass extends PostLoadObject implements ExperienceObject { return classTriggers.get(type); } + @Deprecated + public Set getEventTriggers() { + return eventTriggers.keySet(); + } + + @Deprecated + public boolean hasEventTriggers(String name) { + return eventTriggers.containsKey(name); + } + + @Deprecated + public EventTrigger getEventTriggers(String name) { + return eventTriggers.get(name); + } + @Deprecated public void setStat(StatType type, double base, double perLevel) { setStat(type, new LinearValue(base, perLevel)); diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/event/EventTrigger.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/EventTrigger.java new file mode 100644 index 00000000..17923fbd --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/EventTrigger.java @@ -0,0 +1,43 @@ +package net.Indyuce.mmocore.api.player.profess.event; + +import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.quest.trigger.Trigger; +import net.Indyuce.mmocore.experience.droptable.ExperienceTable; +import org.apache.commons.lang.Validate; + +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.logging.Level; + +/** + * @deprecated Should have NEVER been implemented that way + */ +@Deprecated +public class EventTrigger { + private final String event; + private final Set triggers = new LinkedHashSet<>(); + + public EventTrigger(String event, List list) { + Validate.notNull(list, "Could not load trigger list"); + + this.event = event; + + for (String format : list) + try { + triggers.add(MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(format))); + } catch (IllegalArgumentException exception) { + MMOCore.plugin.getLogger().log(Level.WARNING, + "Could not load trigger '" + format + "' from event trigger '" + event + "': " + exception.getMessage()); + } + } + + public String getEvent() { + return event; + } + + public Set getTriggers() { + return triggers; + } +} diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/event/EventTriggerHandler.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/EventTriggerHandler.java new file mode 100644 index 00000000..3645d281 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/EventTriggerHandler.java @@ -0,0 +1,8 @@ +package net.Indyuce.mmocore.api.player.profess.event; + +import org.bukkit.event.Listener; + +@Deprecated +public interface EventTriggerHandler extends Listener { + boolean handles(String event); +} diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/AttackEventTrigger.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/AttackEventTrigger.java new file mode 100644 index 00000000..e2b3d8e7 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/AttackEventTrigger.java @@ -0,0 +1,33 @@ +package net.Indyuce.mmocore.api.player.profess.event.trigger; + +import io.lumine.mythic.lib.api.event.PlayerAttackEvent; +import io.lumine.mythic.lib.damage.DamageType; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.profess.PlayerClass; +import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +@Deprecated +public class AttackEventTrigger implements EventTriggerHandler { + + @Override + public boolean handles(String event) { + return event.endsWith("-damage"); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void a(PlayerAttackEvent event) { + // We don't want players dying by themselves when using an enderpearl. + if (event.getPlayer().equals(event.getEntity())) return; + + PlayerData player = PlayerData.get(event.getData().getUniqueId()); + PlayerClass profess = player.getProfess(); + + for (DamageType type : event.getAttack().getDamage().collectTypes()) { + String path = type.getPath() + "-damage"; + if (profess.hasEventTriggers(path)) + profess.getEventTriggers(path).getTriggers().forEach(trigger -> trigger.apply(player)); + } + } +} diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/BlockBrokenTrigger.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/BlockBrokenTrigger.java new file mode 100644 index 00000000..89ad08c8 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/BlockBrokenTrigger.java @@ -0,0 +1,24 @@ +package net.Indyuce.mmocore.api.player.profess.event.trigger; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; + +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; + +@Deprecated +public class BlockBrokenTrigger implements EventTriggerHandler { + + @Override + public boolean handles(String event) { + return event.startsWith("break-block"); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void a(BlockBreakEvent event) { + PlayerData player = PlayerData.get(event.getPlayer()); + if (player.getProfess().hasEventTriggers("break-block")) + player.getProfess().getEventTriggers("break-block").getTriggers().forEach(trigger -> trigger.apply(player)); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/BlockPlacedTrigger.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/BlockPlacedTrigger.java new file mode 100644 index 00000000..bf6c751c --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/BlockPlacedTrigger.java @@ -0,0 +1,24 @@ +package net.Indyuce.mmocore.api.player.profess.event.trigger; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; + +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; + +@Deprecated +public class BlockPlacedTrigger implements EventTriggerHandler { + + @Override + public boolean handles(String event) { + return event.startsWith("place-block"); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void a(BlockPlaceEvent event) { + PlayerData player = PlayerData.get(event.getPlayer()); + if (player.getProfess().hasEventTriggers("place-block")) + player.getProfess().getEventTriggers("place-block").getTriggers().forEach(trigger -> trigger.apply(player)); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/ClassChosenEventTrigger.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/ClassChosenEventTrigger.java new file mode 100644 index 00000000..7e504fb7 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/ClassChosenEventTrigger.java @@ -0,0 +1,29 @@ +package net.Indyuce.mmocore.api.player.profess.event.trigger; + +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.event.PlayerChangeClassEvent; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +@Deprecated +public class ClassChosenEventTrigger implements EventTriggerHandler { + + @Override + public boolean handles(String event) { + return event.startsWith("class-chosen"); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void a(PlayerChangeClassEvent event) { + PlayerData player = event.getData(); + if (event.getNewClass().hasEventTriggers("class-chosen")) { + Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> { + event.getNewClass().getEventTriggers("class-chosen").getTriggers().forEach(trigger -> trigger.apply(player)); + }, 1); + + } + } +} diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/LevelUpEventTrigger.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/LevelUpEventTrigger.java new file mode 100644 index 00000000..325aaf5d --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/LevelUpEventTrigger.java @@ -0,0 +1,42 @@ +package net.Indyuce.mmocore.api.player.profess.event.trigger; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.profess.PlayerClass; +import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; + +@Deprecated +public class LevelUpEventTrigger implements EventTriggerHandler { + + @Override + public boolean handles(String event) { + return event.startsWith("level-up"); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void a(PlayerLevelUpEvent event) { + PlayerData player = event.getData(); + PlayerClass profess = player.getProfess(); + + for(int i = event.getOldLevel(); i < event.getNewLevel(); i++) { + int level = i + 1; + if(event.hasProfession()) { + String prof = event.getProfession().getId().toLowerCase(); + processTrigger(player, profess, "level-up-" + prof); + processTrigger(player, profess, "level-up-" + prof + "-" + level); + } else { + processTrigger(player, profess, "level-up"); + processTrigger(player, profess, "level-up-" + level); + if(profess.getMaxLevel() == level) + processTrigger(player, profess, "level-up-max"); + } + } + } + + public void processTrigger(PlayerData player, PlayerClass profess, String trigger) { + if(profess.hasEventTriggers(trigger)) profess.getEventTriggers(trigger).getTriggers().forEach(t -> t.apply(player)); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/MultipleLevelUpEventTrigger.java b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/MultipleLevelUpEventTrigger.java new file mode 100644 index 00000000..20f4800b --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/player/profess/event/trigger/MultipleLevelUpEventTrigger.java @@ -0,0 +1,48 @@ +package net.Indyuce.mmocore.api.player.profess.event.trigger; + +import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.api.player.profess.PlayerClass; +import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; + +import java.text.DecimalFormat; + +@Deprecated +public class MultipleLevelUpEventTrigger implements EventTriggerHandler { + + @Override + public boolean handles(String event) { + return event.startsWith("level-up-multiple"); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void a(PlayerLevelUpEvent event) { + PlayerData player = event.getData(); + PlayerClass profess = player.getProfess(); + + for(int i = event.getOldLevel(); i < event.getNewLevel(); i++) { + int level = i + 1; + + for (String t : profess.getEventTriggers()){ + if (t.startsWith("level-up-multiple")) { + String[] split = t.split("-"); + double multiple = Double.parseDouble(split[split.length-1]); + if (level / multiple % 1 == 0) { + DecimalFormat f = new DecimalFormat("#"); + if (event.hasProfession()) { + processTrigger(player, profess, "level-up-multiple-" + event.getProfession().getId().toLowerCase() + "-" + f.format(multiple)); + } else { + processTrigger(player, profess, "level-up-multiple-" + f.format(multiple)); + } + } + } + } + } + } + + public void processTrigger(PlayerData player, PlayerClass profess, String trigger) { + if(profess.hasEventTriggers(trigger)) profess.getEventTriggers(trigger).getTriggers().forEach(t -> t.apply(player)); + } +} diff --git a/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java b/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java index f173cc23..e94bb005 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java @@ -4,14 +4,16 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.ClassOption; import net.Indyuce.mmocore.api.player.profess.PlayerClass; +import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; +import net.Indyuce.mmocore.api.player.profess.event.trigger.*; import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.event.HandlerList; import java.io.File; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.logging.Level; public class ClassManager implements MMOCoreManager { @@ -23,6 +25,26 @@ public class ClassManager implements MMOCoreManager { */ private PlayerClass defaultClass; + /** + * Same different types of trigger events to be able to + * map them later in the player class instances. + */ + private final Set triggerHandlers = new HashSet<>(); + + public ClassManager() { + registerEvent(new LevelUpEventTrigger()); + registerEvent(new AttackEventTrigger()); + registerEvent(new ClassChosenEventTrigger()); + registerEvent(new BlockBrokenTrigger()); + registerEvent(new BlockPlacedTrigger()); + registerEvent(new MultipleLevelUpEventTrigger()); + } + + @Deprecated + public void registerEvent(EventTriggerHandler handler) { + triggerHandlers.add(handler); + } + public void register(PlayerClass playerClass) { map.put(playerClass.getId(), playerClass); } @@ -48,15 +70,18 @@ public class ClassManager implements MMOCoreManager { return defaultClass; } - public void reloadPlayerClasses() { - PlayerData.getAll().forEach(data -> data.setClass(get(data.getProfess().getId()))); - } - @Override public void initialize(boolean clearBefore) { - if (clearBefore) + if (clearBefore) { map.clear(); + /* + * Do not clear the list of trigger listeners, since it's only setup + * once the server loads and it is never modified. + */ + triggerHandlers.forEach(HandlerList::unregisterAll); + } + for (File file : new File(MMOCore.plugin.getDataFolder() + "/classes").listFiles()) try { String id = file.getName().substring(0, file.getName().length() - 4); @@ -74,5 +99,8 @@ public class ClassManager implements MMOCoreManager { defaultClass = map.values().stream().filter(profess -> profess.hasOption(ClassOption.DEFAULT)).findFirst() .orElse(new PlayerClass("HUMAN", "Human", Material.LEATHER_BOOTS)); + + // Register event triggers + triggerHandlers.forEach(handler -> Bukkit.getPluginManager().registerEvents(handler, MMOCore.plugin)); } }