From 24991f56223f280d77d6a866317d20871cf975a7 Mon Sep 17 00:00:00 2001 From: Xenmai Date: Fri, 24 Mar 2017 02:26:02 +0100 Subject: [PATCH] Entity Killed and Death Added some missing documentation as well as damage determination. --- .../denizen2sponge/Denizen2Sponge.java | 6 +- .../entity/EntityDamagedScriptEvent.java | 19 ++- .../events/entity/EntityDiesScriptEvent.java | 110 ++++++++++++++++++ .../entity/EntityKilledScriptEvent.java | 100 ++++++++++++++++ .../player/PlayerBreaksBlockScriptEvent.java | 2 + .../player/PlayerPlacesBlockScriptEvent.java | 2 + 6 files changed, 233 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityDiesScriptEvent.java create mode 100644 src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityKilledScriptEvent.java diff --git a/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java b/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java index 055ec42..48f4349 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java +++ b/src/main/java/com/denizenscript/denizen2sponge/Denizen2Sponge.java @@ -14,14 +14,12 @@ import com.denizenscript.denizen2sponge.commands.world.EditBlockCommand; import com.denizenscript.denizen2sponge.commands.world.PlayEffectCommand; import com.denizenscript.denizen2sponge.commands.world.SetBlockCommand; -import com.denizenscript.denizen2sponge.events.entity.EntityDamagedScriptEvent; +import com.denizenscript.denizen2sponge.events.entity.*; import com.denizenscript.denizen2sponge.events.player.*; -import com.denizenscript.denizen2sponge.events.entity.EntityMovesScriptEvent; import com.denizenscript.denizen2sponge.events.server.ClientPingsServerScriptEvent; import com.denizenscript.denizen2sponge.events.server.InternalScriptEvent; import com.denizenscript.denizen2sponge.events.server.ServerStopsScriptEvent; import com.denizenscript.denizen2sponge.events.world.BlockChangeScriptEvent; -import com.denizenscript.denizen2sponge.events.entity.EntitySpawnScriptEvent; import com.denizenscript.denizen2sponge.spongecommands.ExCommand; import com.denizenscript.denizen2sponge.spongeevents.Denizen2SpongeLoadedEvent; import com.denizenscript.denizen2sponge.spongeevents.Denizen2SpongeLoadingEvent; @@ -139,6 +137,8 @@ public void onServerStart(GamePreInitializationEvent event) { Denizen2Core.register(new SetBlockCommand()); // Events: Entity Denizen2Core.register(new EntityDamagedScriptEvent()); + Denizen2Core.register(new EntityDiesScriptEvent()); + Denizen2Core.register(new EntityKilledScriptEvent()); Denizen2Core.register(new EntityMovesScriptEvent()); Denizen2Core.register(new EntitySpawnScriptEvent()); // Events: Player diff --git a/src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityDamagedScriptEvent.java b/src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityDamagedScriptEvent.java index 741a648..37eb4eb 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityDamagedScriptEvent.java +++ b/src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityDamagedScriptEvent.java @@ -8,9 +8,12 @@ import com.denizenscript.denizen2sponge.tags.objects.*; import org.spongepowered.api.Sponge; import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.cause.entity.damage.DamageModifier; import org.spongepowered.api.event.entity.DamageEntityEvent; +import org.spongepowered.api.util.Tuple; import java.util.HashMap; +import java.util.function.Function; public class EntityDamagedScriptEvent extends ScriptEvent { @@ -18,7 +21,7 @@ public class EntityDamagedScriptEvent extends ScriptEvent { // @Events // entity damaged // - // @Updated 2016/09/28 + // @Updated 2017/03/24 // // @Group Entity // @@ -33,7 +36,7 @@ public class EntityDamagedScriptEvent extends ScriptEvent { // damage (NumberTag) returns the amount of damage applied. // // @Determinations - // None. + // damage (NumberTag) to set the amount of damage applied. // --> @Override @@ -89,6 +92,16 @@ public void onEntityDamaged(DamageEntityEvent evt) { @Override public void applyDetermination(boolean errors, String determination, AbstractTagObject value) { - super.applyDetermination(errors, determination, value); + if (determination.equals("damage")) { + NumberTag nt = NumberTag.getFor(this::error, value); + damage = nt; + internal.setBaseDamage(nt.getInternal()); + for (Tuple> tuple : internal.getModifiers()) { + internal.setDamage(tuple.getFirst(), (x) -> 0.0); + } + } + else { + super.applyDetermination(errors, determination, value); + } } } diff --git a/src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityDiesScriptEvent.java b/src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityDiesScriptEvent.java new file mode 100644 index 0000000..7896bf7 --- /dev/null +++ b/src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityDiesScriptEvent.java @@ -0,0 +1,110 @@ +package com.denizenscript.denizen2sponge.events.entity; + +import com.denizenscript.denizen2core.events.ScriptEvent; +import com.denizenscript.denizen2core.tags.AbstractTagObject; +import com.denizenscript.denizen2core.tags.objects.BooleanTag; +import com.denizenscript.denizen2core.tags.objects.NumberTag; +import com.denizenscript.denizen2sponge.Denizen2Sponge; +import com.denizenscript.denizen2sponge.events.D2SpongeEventHelper; +import com.denizenscript.denizen2sponge.tags.objects.EntityTag; +import com.denizenscript.denizen2sponge.tags.objects.FormattedTextTag; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.cause.entity.damage.DamageModifier; +import org.spongepowered.api.event.entity.DamageEntityEvent; +import org.spongepowered.api.event.entity.DestructEntityEvent; +import org.spongepowered.api.util.Tuple; + +import java.util.HashMap; +import java.util.function.Function; + +public class EntityDiesScriptEvent extends ScriptEvent { + + // <--[event] + // @Events + // entity dies + // + // @Updated 2017/03/24 + // + // @Group Entity + // + // @Cancellable false + // + // @Triggers when an entity dies. + // + // @Switch type (EntityTypeTag) checks the entity type. + // + // @Context + // entity (EntityTag) returns the entity that died. + // message (FormattedTextTag) returns the message that will be broadcast to the server. + // + // @Determinations + // message (FormattedTextTag) to set the message displayed when the entity dies. + // cancel_message (BooleanTag) to set whether the death message is cancelled. + // --> + + @Override + public String getName() { + return "EntityDies"; + } + + @Override + public boolean couldMatch(ScriptEventData data) { + return data.eventPath.startsWith("entity dies"); + } + + @Override + public boolean matches(ScriptEventData data) { + return D2SpongeEventHelper.checkEntityType(entity.getInternal().getType(), data, this::error); + } + + public EntityTag entity; + + public FormattedTextTag message; + + public DestructEntityEvent.Death internal; + + @Override + public HashMap getDefinitions(ScriptEventData data) { + HashMap defs = super.getDefinitions(data); + defs.put("entity", entity); + defs.put("message", message); + return defs; + } + + @Override + public void enable() { + Sponge.getEventManager().registerListeners(Denizen2Sponge.instance, this); + } + + @Override + public void disable() { + Sponge.getEventManager().unregisterListeners(this); + } + + @Listener + public void onEntityDies(DestructEntityEvent.Death evt) { + EntityDiesScriptEvent event = (EntityDiesScriptEvent) clone(); + event.internal = evt; + event.entity = new EntityTag(evt.getTargetEntity()); + event.message = new FormattedTextTag(evt.getMessage()); + event.run(); + } + + @Override + public void applyDetermination(boolean errors, String determination, AbstractTagObject value) { + if (determination.equals("message")) { + FormattedTextTag ftt = FormattedTextTag.getFor(this::error, value); + message = ftt; + internal.setMessage(ftt.getInternal()); + } + else if (determination.equals("cancel_message")) { + // TODO: Context for this? + BooleanTag bt = BooleanTag.getFor(this::error, value); + internal.setMessageCancelled(bt.getInternal()); + } + else { + super.applyDetermination(errors, determination, value); + } + } +} diff --git a/src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityKilledScriptEvent.java b/src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityKilledScriptEvent.java new file mode 100644 index 0000000..6be71a8 --- /dev/null +++ b/src/main/java/com/denizenscript/denizen2sponge/events/entity/EntityKilledScriptEvent.java @@ -0,0 +1,100 @@ +package com.denizenscript.denizen2sponge.events.entity; + +import com.denizenscript.denizen2core.events.ScriptEvent; +import com.denizenscript.denizen2core.tags.AbstractTagObject; +import com.denizenscript.denizen2core.tags.objects.NumberTag; +import com.denizenscript.denizen2sponge.Denizen2Sponge; +import com.denizenscript.denizen2sponge.events.D2SpongeEventHelper; +import com.denizenscript.denizen2sponge.tags.objects.EntityTag; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.cause.entity.damage.DamageModifier; +import org.spongepowered.api.event.entity.DamageEntityEvent; +import org.spongepowered.api.util.Tuple; + +import java.util.HashMap; +import java.util.function.Function; + +public class EntityKilledScriptEvent extends ScriptEvent { + + // <--[event] + // @Events + // entity killed + // + // @Updated 2017/03/24 + // + // @Group Entity + // + // @Cancellable true + // + // @Triggers when an entity is killed. + // + // @Switch type (EntityTypeTag) checks the entity type. + // + // @Context + // entity (EntityTag) returns the entity that was killed. + // damage (NumberTag) returns the amount of damage applied. + // + // @Determinations + // None. + // --> + + @Override + public String getName() { + return "EntityKilled"; + } + + @Override + public boolean couldMatch(ScriptEventData data) { + return data.eventPath.startsWith("entity killed"); + } + + @Override + public boolean matches(ScriptEventData data) { + return D2SpongeEventHelper.checkEntityType(entity.getInternal().getType(), data, this::error); + } + + public EntityTag entity; + + public NumberTag damage; + + public DamageEntityEvent internal; + + @Override + public HashMap getDefinitions(ScriptEventData data) { + HashMap defs = super.getDefinitions(data); + defs.put("entity", entity); + defs.put("damage", damage); + return defs; + } + + @Override + public void enable() { + Sponge.getEventManager().registerListeners(Denizen2Sponge.instance, this); + } + + @Override + public void disable() { + Sponge.getEventManager().unregisterListeners(this); + } + + @Listener + public void onEntityKilled(DamageEntityEvent evt) { + EntityKilledScriptEvent event = (EntityKilledScriptEvent) clone(); + event.internal = evt; + if (!evt.willCauseDeath()) { + return; + } + event.entity = new EntityTag(evt.getTargetEntity()); + event.damage = new NumberTag(evt.getFinalDamage()); + event.cancelled = evt.isCancelled(); + // TODO: Cause viewing + event.run(); + evt.setCancelled(event.cancelled); + } + + @Override + public void applyDetermination(boolean errors, String determination, AbstractTagObject value) { + super.applyDetermination(errors, determination, value); + } +} diff --git a/src/main/java/com/denizenscript/denizen2sponge/events/player/PlayerBreaksBlockScriptEvent.java b/src/main/java/com/denizenscript/denizen2sponge/events/player/PlayerBreaksBlockScriptEvent.java index 2b6e2c5..8da62fb 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/events/player/PlayerBreaksBlockScriptEvent.java +++ b/src/main/java/com/denizenscript/denizen2sponge/events/player/PlayerBreaksBlockScriptEvent.java @@ -32,6 +32,8 @@ public class PlayerBreaksBlockScriptEvent extends ScriptEvent { // // @Triggers when a player breaks a block. // + // @Switch type (BlockTypeTag) checks the block type. + // // @Context // player (PlayerTag) returns the player that broke the block. // material (BlockTypeTag) returns the broken material. diff --git a/src/main/java/com/denizenscript/denizen2sponge/events/player/PlayerPlacesBlockScriptEvent.java b/src/main/java/com/denizenscript/denizen2sponge/events/player/PlayerPlacesBlockScriptEvent.java index 5d9fbf8..1197297 100644 --- a/src/main/java/com/denizenscript/denizen2sponge/events/player/PlayerPlacesBlockScriptEvent.java +++ b/src/main/java/com/denizenscript/denizen2sponge/events/player/PlayerPlacesBlockScriptEvent.java @@ -31,6 +31,8 @@ public class PlayerPlacesBlockScriptEvent extends ScriptEvent { // // @Triggers when a player places a block. // + // @Switch type (BlockTypeTag) checks the block type. + // // @Context // player (PlayerTag) returns the player that broke the block. // material (BlockTypeTag) returns the placed material.