From 7504cc3a3899291779c9e35686f8b2b44d1841e3 Mon Sep 17 00:00:00 2001 From: Xenmai Date: Fri, 10 Nov 2017 18:42:55 +0100 Subject: [PATCH] Strike Command Also fixed and improved the Heal command --- .../denizen2sponge/Denizen2Sponge.java | 1 + .../commands/entity/HealCommand.java | 61 ++++++++++++----- .../commands/player/BanCommand.java | 4 +- .../commands/player/PardonCommand.java | 4 +- .../commands/world/StrikeCommand.java | 68 +++++++++++++++++++ 5 files changed, 118 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/denizenscript/denizen2sponge/commands/world/StrikeCommand.java diff --git a/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java b/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java index 83419d2..2d80b34 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java +++ b/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java @@ -168,6 +168,7 @@ public void onServerStart(GamePreInitializationEvent event) { Denizen2Core.register(new RemoveGameRuleCommand()); Denizen2Core.register(new SetBlockCommand()); Denizen2Core.register(new SetGameRuleCommand()); + Denizen2Core.register(new StrikeCommand()); Denizen2Core.register(new UnloadWorldCommand()); Denizen2Core.register(new WeatherCommand()); // Events: Entity diff --git a/src/main/java/com/denizenscript/denizen2sponge/commands/entity/HealCommand.java b/src/main/java/com/denizenscript/denizen2sponge/commands/entity/HealCommand.java index 2832366..15aaddd 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/commands/entity/HealCommand.java +++ b/src/main/java/com/denizenscript/denizen2sponge/commands/entity/HealCommand.java @@ -57,31 +57,52 @@ public void execute(CommandQueue queue, CommandEntry entry) { EntityTag entityTag = EntityTag.getFor(queue.error, entry.getArgumentObject(queue, 0)); Living ent = (Living) entityTag.getInternal(); NumberTag amount = NumberTag.getFor(queue.error, entry.getArgumentObject(queue, 1)); - String operation; + Boolean set; if (entry.namedArgs.containsKey("operation")) { - operation = CoreUtilities.toLowerCase(entry.getNamedArgumentObject(queue, "operation").toString()); - if (!(operation.equals("add") || operation.equals("set"))) { + String operation = CoreUtilities.toLowerCase(entry.getNamedArgumentObject(queue, "operation").toString()); + if (operation.equals("add")) { + set = false; + } + else if (operation.equals("set")) { + set = true; + } + else { queue.handleError(entry, "Invalid operation: '" + operation + "'!"); return; } } else { - operation = "add"; + set = false; } String type; - double value; if (entry.namedArgs.containsKey("type")) { type = CoreUtilities.toLowerCase(entry.getNamedArgumentObject(queue, "type").toString()); switch (type) { case "remaining": - value = ent.health().transform(operation.equals("add") ? - x -> x + amount.getInternal() : x -> amount.getInternal()).get(); - ent.offer(Keys.HEALTH, value); + if (set) { + if (amount.getInternal() < 0) { + queue.handleError(entry, "You can't set health to negative values!"); + return; + } + ent.offer(Keys.HEALTH, Math.min(amount.getInternal(), ent.maxHealth().get())); + } + else { + ent.offer(Keys.HEALTH, ent.health().transform( + x -> Math.max(Math.min(x + amount.getInternal(), ent.maxHealth().get()), 0)).get()); + } break; case "maximum": - value = ent.maxHealth().transform(operation.equals("add") ? - x -> x + amount.getInternal() : x -> amount.getInternal()).get(); - ent.offer(Keys.MAX_HEALTH, value); + if (set) { + if (amount.getInternal() < 0) { + queue.handleError(entry, "You can't set max health to negative values!"); + return; + } + ent.offer(Keys.MAX_HEALTH, amount.getInternal()); + } + else { + ent.offer(Keys.MAX_HEALTH, ent.maxHealth().transform( + x -> Math.max(x + amount.getInternal(), 0)).get()); + } break; default: queue.handleError(entry, "Invalid health type: '" + type + "'!"); @@ -90,14 +111,22 @@ public void execute(CommandQueue queue, CommandEntry entry) { } else { type = "remaining"; - value = ent.health().transform(operation.equals("add") ? - x -> x + amount.getInternal() : x -> amount.getInternal()).get(); - ent.offer(Keys.HEALTH, value); + if (set) { + if (amount.getInternal() < 0) { + queue.handleError(entry, "You can't set health to negative values!"); + return; + } + ent.offer(Keys.HEALTH, Math.min(amount.getInternal(), ent.maxHealth().get())); + } + else { + ent.offer(Keys.HEALTH, ent.health().transform( + x -> Math.max(Math.min(x + amount.getInternal(), ent.maxHealth().get()), 0)).get()); + } } if (queue.shouldShowGood()) { - queue.outGood(ColorSet.emphasis + (operation.equals("add") ? "Increasing" : "Setting") + + queue.outGood(ColorSet.emphasis + (set ? "Setting" : "Increasing") + ColorSet.good + " the " + ColorSet.emphasis + type + ColorSet.good + " health of " + - ColorSet.emphasis + entityTag.debug() + ColorSet.good + (operation.equals("add") ? " by " : " to ") + + ColorSet.emphasis + entityTag.debug() + ColorSet.good + (set ? " to " : " by ") + ColorSet.emphasis + amount.debug() + ColorSet.good + "!"); } } diff --git a/src/main/java/com/denizenscript/denizen2sponge/commands/player/BanCommand.java b/src/main/java/com/denizenscript/denizen2sponge/commands/player/BanCommand.java index f2c6d2c..83849af 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/commands/player/BanCommand.java +++ b/src/main/java/com/denizenscript/denizen2sponge/commands/player/BanCommand.java @@ -25,7 +25,7 @@ public class BanCommand extends AbstractCommand { // <--[command] // @Since 0.3.0 // @Name ban - // @Arguments // [duration] [reason] + // @Arguments / [duration] [reason] // @Short bans a player. // @Updated 2017/04/08 // @Group Player @@ -48,7 +48,7 @@ public String getName() { @Override public String getArguments() { - return "// [duration] [reason]"; + return "/ [duration] [reason]"; } @Override diff --git a/src/main/java/com/denizenscript/denizen2sponge/commands/player/PardonCommand.java b/src/main/java/com/denizenscript/denizen2sponge/commands/player/PardonCommand.java index d1c4ea0..ec29872 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/commands/player/PardonCommand.java +++ b/src/main/java/com/denizenscript/denizen2sponge/commands/player/PardonCommand.java @@ -18,7 +18,7 @@ public class PardonCommand extends AbstractCommand { // <--[command] // @Since 0.3.0 // @Name pardon - // @Arguments / + // @Arguments / // @Short pardons a player. // @Updated 2017/04/08 // @Group Player @@ -38,7 +38,7 @@ public String getName() { @Override public String getArguments() { - return "/"; + return "/"; } @Override diff --git a/src/main/java/com/denizenscript/denizen2sponge/commands/world/StrikeCommand.java b/src/main/java/com/denizenscript/denizen2sponge/commands/world/StrikeCommand.java new file mode 100644 index 0000000..326e30a --- /dev/null +++ b/src/main/java/com/denizenscript/denizen2sponge/commands/world/StrikeCommand.java @@ -0,0 +1,68 @@ +package com.denizenscript.denizen2sponge.commands.world; + +import com.denizenscript.denizen2core.commands.AbstractCommand; +import com.denizenscript.denizen2core.commands.CommandEntry; +import com.denizenscript.denizen2core.commands.CommandQueue; +import com.denizenscript.denizen2core.tags.objects.BooleanTag; +import com.denizenscript.denizen2core.utilities.debugging.ColorSet; +import com.denizenscript.denizen2sponge.tags.objects.LocationTag; +import org.spongepowered.api.entity.EntityTypes; +import org.spongepowered.api.entity.weather.WeatherEffect; + +public class StrikeCommand extends AbstractCommand { + + // <--[command] + // @Since 0.4.0 + // @Name strike + // @Arguments + // @Short strikes lightning. + // @Updated 2017/11/10 + // @Group World + // @Minimum 1 + // @Maximum 1 + // @Named ambient (BooleanTag) Sets whether the lightning will affect entities. + // @Description + // Strikes lightning upon a location. Optionally specify whether it will affect entities + // or not. Damaging lightning will also charge creepers and turn pigs into pig zombies. + // @Example + // # This example strikes a damaging lightning upon the player. + // - strike --ambient false + // --> + + @Override + public String getName() { + return "strike"; + } + + @Override + public String getArguments() { + return ""; + } + + @Override + public int getMinimumArguments() { + return 1; + } + + @Override + public int getMaximumArguments() { + return 1; + } + + @Override + public void execute(CommandQueue queue, CommandEntry entry) { + LocationTag loc = LocationTag.getFor(queue.error, entry.getArgumentObject(queue, 0)); + WeatherEffect ent = (WeatherEffect) loc.getInternal().world.createEntity(EntityTypes.LIGHTNING, + loc.getInternal().toVector3d()); + if (entry.namedArgs.containsKey("ambient")) { + BooleanTag ambient = BooleanTag.getFor(queue.error, entry.getNamedArgumentObject(queue, "ambient")); + ent.setEffect(ambient.getInternal()); + } + loc.getInternal().world.spawnEntity(ent); + if (queue.shouldShowGood()) { + queue.outGood("Successfully struck " + ColorSet.emphasis + + (ent.isEffect() ? "ambient" : "damaging") + ColorSet.good + + " lightning at location " + ColorSet.emphasis + loc.debug() + ColorSet.good + "!"); + } + } +}