From 0ac214963f484dcb9fa98a2a1703fbf27dc13ace Mon Sep 17 00:00:00 2001 From: intricate Date: Wed, 19 Jan 2022 17:36:16 -0300 Subject: [PATCH] Add on_move Entity Event for Scarpet (#1096) * Add ON_MOVE Entity Event for Scarpet * Update src/main/java/carpet/script/EntityEventsGroup.java * Add on_move to Entities.md * Switch to ValueConversions * Update docs/scarpet/api/Entities.md Co-authored-by: gnembon <41132274+gnembon@users.noreply.github.com> * Fix #1126 * undo last commit cause it was on the wrong branch Co-authored-by: gnembon <41132274+gnembon@users.noreply.github.com> --- docs/scarpet/api/Entities.md | 1 + .../mixins/Entity_scarpetEventsMixin.java | 17 +++++++++++++++++ .../java/carpet/script/EntityEventsGroup.java | 15 +++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/docs/scarpet/api/Entities.md b/docs/scarpet/api/Entities.md index 044e1837..bd12373d 100644 --- a/docs/scarpet/api/Entities.md +++ b/docs/scarpet/api/Entities.md @@ -858,6 +858,7 @@ defining the callback with `entity_event`. The following events can be handled by entities: * `'on_tick'`: executes every tick right before the entity is ticked in the game. Required arguments: `entity` +* `'on_move'`: executes every time an entity changes position, invoked just after it has been moved to the new position. Required arguments: `entity, velocity, pos1, pos2` * `'on_death'`: executes once when a living entity dies. Required arguments: `entity, reason` * `'on_removed'`: execute once when an entity is removed. Required arguments: `entity` * `'on_damaged'`: executed every time a living entity is about to receive damage. diff --git a/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java b/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java index 0070517a..02ac6184 100644 --- a/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java +++ b/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java @@ -3,6 +3,7 @@ package carpet.mixins; import carpet.fakes.EntityInterface; import carpet.script.EntityEventsGroup; import net.minecraft.entity.Entity; +import net.minecraft.util.math.Vec3d; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -19,10 +20,14 @@ public abstract class Entity_scarpetEventsMixin implements EntityInterface @Shadow public abstract boolean isRemoved(); + @Shadow private Vec3d pos, velocity; + private boolean permanentVehicle; private final EntityEventsGroup events = new EntityEventsGroup((Entity) (Object)this); + private Vec3d pos1, motion; + @Override public EntityEventsGroup getEventContainer() { @@ -79,4 +84,16 @@ public abstract class Entity_scarpetEventsMixin implements EntityInterface } + @Inject(method = "setPos", at = @At("HEAD")) + private void firstPos(CallbackInfo ci) + { + pos1 = this.pos; + motion = this.velocity; + } + + @Inject(method = "setPos", at = @At("TAIL")) + private void secondPos(CallbackInfo ci) + { + events.onEvent(EntityEventsGroup.Event.ON_MOVE, motion, pos1, this.pos); + } } diff --git a/src/main/java/carpet/script/EntityEventsGroup.java b/src/main/java/carpet/script/EntityEventsGroup.java index 16655d7c..5e51278f 100644 --- a/src/main/java/carpet/script/EntityEventsGroup.java +++ b/src/main/java/carpet/script/EntityEventsGroup.java @@ -7,8 +7,10 @@ import carpet.script.value.FunctionValue; import carpet.script.value.NumericValue; import carpet.script.value.StringValue; import carpet.script.value.Value; +import carpet.script.value.ValueConversions; import net.minecraft.entity.Entity; import net.minecraft.entity.damage.DamageSource; +import net.minecraft.util.math.Vec3d; import java.util.Arrays; import java.util.Collections; @@ -108,6 +110,19 @@ public class EntityEventsGroup ); } }; + public static final Event ON_MOVE = new Event("on_move", 3) + { + @Override + public List makeArgs(Entity entity, Object... providedArgs) + { + return Arrays.asList( + new EntityValue(entity), + ValueConversions.of((Vec3d) providedArgs[0]), + ValueConversions.of((Vec3d) providedArgs[1]), + ValueConversions.of((Vec3d) providedArgs[2]) + ); + } + }; public final int argcount; public final String id;