From 9607a4c57f6037b79620e8dbd29574dff9e18b23 Mon Sep 17 00:00:00 2001 From: Xenmai Date: Fri, 13 Oct 2017 05:59:40 +0200 Subject: [PATCH] Statistic Changes Event --- .../denizen2sponge/Denizen2Sponge.java | 1 + .../events/D2SpongeEventHelper.java | 2 +- .../player/StatisticChangesScriptEvent.java | 113 ++++++++++++++++++ .../events/server/CommandSentScriptEvent.java | 2 +- 4 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/denizenscript/denizen2sponge/events/player/StatisticChangesScriptEvent.java diff --git a/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java b/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java index 80d86e5..5b6bbea 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java +++ b/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java @@ -191,6 +191,7 @@ public void onServerStart(GamePreInitializationEvent event) { Denizen2Core.register(new PlayerRightClicksBlockScriptEvent()); Denizen2Core.register(new PlayerRightClicksEntityScriptEvent()); Denizen2Core.register(new PlayerRightClicksScriptEvent()); + Denizen2Core.register(new StatisticChangesScriptEvent()); // Events: Server Denizen2Core.register(new ClientPingsServerScriptEvent()); Denizen2Core.register(new CommandSentScriptEvent()); diff --git a/src/main/java/com/denizenscript/denizen2sponge/events/D2SpongeEventHelper.java b/src/main/java/com/denizenscript/denizen2sponge/events/D2SpongeEventHelper.java index fa82d99..622d627 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/events/D2SpongeEventHelper.java +++ b/src/main/java/com/denizenscript/denizen2sponge/events/D2SpongeEventHelper.java @@ -78,7 +78,7 @@ public static boolean checkString(String inpStr, ScriptEvent.ScriptEventData dat return true; } for (AbstractTagObject ato : ListTag.getFor(error, data.switches.get(tname)).getInternal()) { - if (!CoreUtilities.toLowerCase((TextTag.getFor(error, ato)).getInternal()).equals(inpStr)) { + if (CoreUtilities.toLowerCase((TextTag.getFor(error, ato)).getInternal()).equals(inpStr)) { return true; } } diff --git a/src/main/java/com/denizenscript/denizen2sponge/events/player/StatisticChangesScriptEvent.java b/src/main/java/com/denizenscript/denizen2sponge/events/player/StatisticChangesScriptEvent.java new file mode 100644 index 0000000..475309a --- /dev/null +++ b/src/main/java/com/denizenscript/denizen2sponge/events/player/StatisticChangesScriptEvent.java @@ -0,0 +1,113 @@ +package com.denizenscript.denizen2sponge.events.player; + +import com.denizenscript.denizen2core.events.ScriptEvent; +import com.denizenscript.denizen2core.tags.AbstractTagObject; +import com.denizenscript.denizen2core.tags.objects.IntegerTag; +import com.denizenscript.denizen2core.tags.objects.TextTag; +import com.denizenscript.denizen2sponge.Denizen2Sponge; +import com.denizenscript.denizen2sponge.events.D2SpongeEventHelper; +import com.denizenscript.denizen2sponge.tags.objects.PlayerTag; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.filter.cause.Root; +import org.spongepowered.api.event.statistic.ChangeStatisticEvent; + +import java.util.HashMap; + +public class StatisticChangesScriptEvent extends ScriptEvent { + + // <--[event] + // @Events + // statistic changes + // + // @Updated 2017/10/13 + // + // @Cancellable true + // + // @Group Player + // + // @Triggers when a player statistic changes. + // + // @Switch statistic (TextTag) checks the statistic. + // + // @Context + // player (PlayerTag) returns the player that owns the statistic. + // statistic (TextTag) returns the changed statistic. + // old_value (IntegerTag) returns the old statistic value. + // new_value (IntegerTag) returns the new statistic value. + // + // @Determinations + // value (IntegerTag) sets the new statistic value. + // --> + + @Override + public String getName() { + return "StatisticChanges"; + } + + @Override + public boolean couldMatch(ScriptEventData data) { + return data.eventPath.startsWith("statistic changes"); + } + + @Override + public boolean matches(ScriptEventData data) { + return D2SpongeEventHelper.checkString(statistic.getInternal(), data, this::error, "statistic"); + } + + public PlayerTag player; + + public TextTag statistic; + + public IntegerTag old_value; + + public IntegerTag new_value; + + public ChangeStatisticEvent.TargetPlayer internal; + + @Override + public HashMap getDefinitions(ScriptEventData data) { + HashMap defs = super.getDefinitions(data); + defs.put("player", player); + defs.put("statistic", statistic); + defs.put("old_value", old_value); + defs.put("new_value", new_value); + return defs; + } + + @Override + public void enable() { + Sponge.getEventManager().registerListeners(Denizen2Sponge.instance, this); + } + + @Override + public void disable() { + Sponge.getEventManager().unregisterListeners(this); + } + + @Listener + public void onStatisticChanges(ChangeStatisticEvent.TargetPlayer evt, @Root Player player) { + StatisticChangesScriptEvent event = (StatisticChangesScriptEvent) clone(); + event.internal = evt; + event.player = new PlayerTag(player); + event.statistic = new TextTag(evt.getStatistic().getId()); + event.old_value = new IntegerTag(evt.getOriginalValue()); + event.new_value = new IntegerTag(evt.getValue()); + event.cancelled = evt.isCancelled(); + event.run(); + evt.setCancelled(event.cancelled); + } + + @Override + public void applyDetermination(boolean errors, String determination, AbstractTagObject value) { + if (determination.equals("value")) { + IntegerTag it = IntegerTag.getFor(this::error, value); + new_value = it; + internal.setValue(it.getInternal()); + } + else { + super.applyDetermination(errors, determination, value); + } + } +} diff --git a/src/main/java/com/denizenscript/denizen2sponge/events/server/CommandSentScriptEvent.java b/src/main/java/com/denizenscript/denizen2sponge/events/server/CommandSentScriptEvent.java index 7cc31df..0c393d9 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/events/server/CommandSentScriptEvent.java +++ b/src/main/java/com/denizenscript/denizen2sponge/events/server/CommandSentScriptEvent.java @@ -175,7 +175,7 @@ else if (source instanceof CommandBlockMinecart) { @Override public void applyDetermination(boolean errors, String determination, AbstractTagObject value) { if (determination.equals("command")) { - TextTag tt = TextTag.getFor(this::error, value); + TextTag tt = new TextTag(value.toString()); command = tt; internal.setCommand(tt.getInternal()); }