Fully added back event triggers

This commit is contained in:
Jules 2022-02-06 21:23:07 +01:00
parent fd3a245125
commit b9fab32f88
10 changed files with 307 additions and 9 deletions

View File

@ -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<String, ClassTrigger> classTriggers = new HashMap<>();
private final Map<PlayerResource, ResourceRegeneration> resourceHandlers = new HashMap<>();
@Deprecated
private final Map<String, EventTrigger> 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<String> 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));

View File

@ -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<Trigger> triggers = new LinkedHashSet<>();
public EventTrigger(String event, List<String> 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<Trigger> getTriggers() {
return triggers;
}
}

View File

@ -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);
}

View File

@ -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));
}
}
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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);
}
}
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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<EventTriggerHandler> 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));
}
}