From 06b3f7c53256640fbabab94c789b33f6bd2308bc Mon Sep 17 00:00:00 2001 From: gnembon Date: Tue, 3 Sep 2019 09:16:18 -0300 Subject: [PATCH] more entity events and entity item api --- .../java/carpet/fakes/EntityInterface.java | 5 +- .../carpet/fakes/ItemEntityInterface.java | 7 +++ .../DamageTracker_scarpetEventMixin.java | 24 +++++++++ .../mixins/Entity_scarpetEventsMixin.java | 53 ++++++++++++++++--- .../java/carpet/mixins/ItemEntityMixin.java | 9 ++-- .../java/carpet/script/CarpetEventServer.java | 25 +++++++++ .../java/carpet/script/value/EntityValue.java | 12 ++++- src/main/java/carpet/utils/IItemEntity.java | 6 --- src/main/resources/carpet.mixins.json | 1 + 9 files changed, 121 insertions(+), 21 deletions(-) create mode 100644 src/main/java/carpet/fakes/ItemEntityInterface.java create mode 100644 src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java delete mode 100644 src/main/java/carpet/utils/IItemEntity.java diff --git a/src/main/java/carpet/fakes/EntityInterface.java b/src/main/java/carpet/fakes/EntityInterface.java index 723e5425..cff3c98f 100644 --- a/src/main/java/carpet/fakes/EntityInterface.java +++ b/src/main/java/carpet/fakes/EntityInterface.java @@ -4,6 +4,7 @@ import carpet.script.CarpetContext; import carpet.script.CarpetEventServer; import carpet.script.ScriptHost; import carpet.script.value.Value; +import net.minecraft.entity.damage.DamageSource; import java.util.List; @@ -13,8 +14,8 @@ public interface EntityInterface //scarpet part void onDeathCallback(String reason); void setDeathCallback(CarpetContext cc, String function, List extraArgs); - void onDamageCallback(); + void onDamageCallback(float amount, DamageSource source); void setDamageCallback(CarpetContext cc, String function, List extraArgs); - void onRemovedCallback(); void setRemovedCallback(CarpetContext cc, String function, List extraArgs); + void setTickCallback(CarpetContext cc, String function, List extraArgs); } diff --git a/src/main/java/carpet/fakes/ItemEntityInterface.java b/src/main/java/carpet/fakes/ItemEntityInterface.java new file mode 100644 index 00000000..d4b8e839 --- /dev/null +++ b/src/main/java/carpet/fakes/ItemEntityInterface.java @@ -0,0 +1,7 @@ +package carpet.fakes; + +public interface ItemEntityInterface +{ + int getAge(); + int getPickupDelay(); +} diff --git a/src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java b/src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java new file mode 100644 index 00000000..d2b1a68c --- /dev/null +++ b/src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java @@ -0,0 +1,24 @@ +package carpet.mixins; + +import carpet.fakes.EntityInterface; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.damage.DamageTracker; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(DamageTracker.class) +public class DamageTracker_scarpetEventMixin +{ + @Shadow @Final private LivingEntity entity; + + @Inject(method = "onDamage", at = @At("HEAD")) + private void onDamageTaken(DamageSource damageSource_1, float float_1, float float_2, CallbackInfo ci) + { + ((EntityInterface)entity).onDamageCallback(float_2, damageSource_1); + } +} diff --git a/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java b/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java index bb798e6c..61822c65 100644 --- a/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java +++ b/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java @@ -8,6 +8,7 @@ import carpet.script.ScriptHost; import carpet.script.value.Value; import carpet.settings.CarpetSettings; import net.minecraft.entity.Entity; +import net.minecraft.entity.damage.DamageSource; import org.lwjgl.system.CallbackI; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -23,16 +24,11 @@ public abstract class Entity_scarpetEventsMixin implements EntityInterface @Shadow public boolean removed; private CarpetEventServer.ScheduledCall deathCall; private CarpetEventServer.ScheduledCall removeCall; + private CarpetEventServer.ScheduledCall tickCall; + private CarpetEventServer.ScheduledCall damageCall; + - @Override - public void onDeathCallback(String reason) - { - if (deathCall != null) - { - CarpetServer.scriptServer.events.onEntityDeath(deathCall, (Entity)(Object)this, reason); - } - } @Override public void setDeathCallback(CarpetContext cc, String function, List extraArgs) @@ -46,6 +42,47 @@ public abstract class Entity_scarpetEventsMixin implements EntityInterface removeCall = CarpetServer.scriptServer.events.makeRemovedCall(cc, function, extraArgs); } + @Override + public void setTickCallback(CarpetContext cc, String function, List extraArgs) + { + tickCall = CarpetServer.scriptServer.events.makeTickCall(cc, function, extraArgs); + } + + @Override + public void setDamageCallback(CarpetContext cc, String function, List extraArgs) + { + damageCall = CarpetServer.scriptServer.events.makeDamageCall(cc, function, extraArgs); + } + + + @Override + public void onDeathCallback(String reason) + { + if (deathCall != null) + { + CarpetServer.scriptServer.events.onEntityDeath(deathCall, (Entity)(Object)this, reason); + } + } + + @Override + public void onDamageCallback(float amount, DamageSource source) + { + if (damageCall != null) + { + CarpetServer.scriptServer.events.onEntityDamage(damageCall, (Entity)(Object)this, amount, source); + } + } + + + @Inject(method = "tick", at = @At("HEAD")) + private void onTickCall(CallbackInfo ci) + { + if (tickCall != null) + { + CarpetServer.scriptServer.events.onEntityTick(tickCall, (Entity) (Object) this); + } + } + @Inject(method = "remove", at = @At("HEAD")) private void onRemove(CallbackInfo ci) diff --git a/src/main/java/carpet/mixins/ItemEntityMixin.java b/src/main/java/carpet/mixins/ItemEntityMixin.java index 9ba0ea66..3af00790 100644 --- a/src/main/java/carpet/mixins/ItemEntityMixin.java +++ b/src/main/java/carpet/mixins/ItemEntityMixin.java @@ -2,7 +2,7 @@ package carpet.mixins; import carpet.settings.CarpetSettings; import carpet.helpers.InventoryHelper; -import carpet.utils.IItemEntity; +import carpet.fakes.ItemEntityInterface; import net.minecraft.block.ShulkerBoxBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -18,7 +18,8 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ItemEntity.class) -public abstract class ItemEntityMixin extends Entity implements IItemEntity { +public abstract class ItemEntityMixin extends Entity implements ItemEntityInterface +{ private static final int SHULKERBOX_MAX_STACK_AMOUNT = 64; @Shadow private int age; @@ -89,8 +90,8 @@ public abstract class ItemEntityMixin extends Entity implements IItemEntity { selfStack.increment(amount); self.setStack(selfStack); - this.pickupDelay = Math.max(((IItemEntity)other).getPickupDelay(), this.pickupDelay); - this.age = Math.min(((IItemEntity)other).getAge(), this.age); + this.pickupDelay = Math.max(((ItemEntityInterface)other).getPickupDelay(), this.pickupDelay); + this.age = Math.min(((ItemEntityInterface)other).getAge(), this.age); otherStack.decrement(amount); if (otherStack.isEmpty()) diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index 507b2a48..28d76232 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -9,6 +9,7 @@ import carpet.script.value.StringValue; import carpet.script.value.Value; import carpet.settings.CarpetSettings; import net.minecraft.block.BlockState; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.entity.Entity; @@ -390,6 +391,15 @@ public class CarpetEventServer { return makeEventCall(cc, function, extraArgs, 1); } + public ScheduledCall makeTickCall(CarpetContext cc, String function, List extraArgs) + { + return makeEventCall(cc, function, extraArgs, 1); + } + public ScheduledCall makeDamageCall(CarpetContext cc, String function, List extraArgs) + { + return makeEventCall(cc, function, extraArgs, 3); + } + public void onEntityDeath(ScheduledCall call, Entity e, String reason) @@ -400,5 +410,20 @@ public class CarpetEventServer { removeCall.execute(Collections.singletonList((c, t) -> new EntityValue(entity))); } + public void onEntityTick(ScheduledCall tickCall, Entity entity) + { + tickCall.execute(Collections.singletonList((c, t) -> new EntityValue(entity))); + } + public void onEntityDamage(ScheduledCall call, Entity e, float amount, DamageSource source) + { + call.execute(Arrays.asList( + (c, t) -> new EntityValue(e), + (c, t) -> new NumericValue(amount), + (c, t) -> new StringValue(source.getName()), + (c, t) -> source.getAttacker()==null?Value.NULL:new EntityValue(source.getAttacker()) + )); + } + + } diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 982d997c..664ef537 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -1,6 +1,7 @@ package carpet.script.value; import carpet.fakes.EntityInterface; +import carpet.fakes.ItemEntityInterface; import carpet.fakes.MobEntityInterface; import carpet.helpers.Tracer; import carpet.script.CarpetContext; @@ -216,8 +217,8 @@ public class EntityValue extends Value put("age", (e, a) -> new NumericValue(e.age)); put("item", (e, a) -> (e instanceof ItemEntity)?new StringValue(((ItemEntity) e).getStack().getName().getString()):Value.NULL); put("count", (e, a) -> (e instanceof ItemEntity)?new NumericValue(((ItemEntity) e).getStack().getCount()):Value.NULL); + put("pickup_delay", (e, a) -> (e instanceof ItemEntity)?new NumericValue(((ItemEntityInterface) e).getPickupDelay()):Value.NULL); // ItemEntity -> despawn timer via ssGetAge - // TODO item pickup delay read and write put("is_baby", (e, a) -> (e instanceof LivingEntity)?new NumericValue(((LivingEntity) e).isBaby()):Value.NULL); put("target", (e, a) -> { if (e instanceof MobEntity) @@ -692,6 +693,13 @@ public class EntityValue extends Value } }); //requires mixing + put("pickup_delay", (e, v) -> + { + if (e instanceof ItemEntity) + { + ((ItemEntity) e).setPickupDelay((int)NumericValue.asNumber(v).getLong()); + } + }); // gamemode // spectate @@ -721,5 +729,7 @@ public class EntityValue extends Value private static Map>> events = new HashMap>>() {{ put("on_death", (c, e, f, l) -> ((EntityInterface)e).setDeathCallback(c, f, l)); put("on_removed", (c, e, f, l) -> ((EntityInterface)e).setRemovedCallback(c, f, l)); + put("on_tick", (c, e, f, l) -> ((EntityInterface)e).setTickCallback(c, f, l)); + put("on_damage", (c, e, f, l) -> ((EntityInterface)e).setDamageCallback(c, f, l)); }}; } diff --git a/src/main/java/carpet/utils/IItemEntity.java b/src/main/java/carpet/utils/IItemEntity.java deleted file mode 100644 index 2b7b2b10..00000000 --- a/src/main/java/carpet/utils/IItemEntity.java +++ /dev/null @@ -1,6 +0,0 @@ -package carpet.utils; - -public interface IItemEntity { - int getAge(); - int getPickupDelay(); -} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 7e0219ad..174a43f0 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -119,6 +119,7 @@ "Entity_scarpetEventsMixin", "LivingEntity_scarpetEventsMixin", + "DamageTracker_scarpetEventMixin", "PistonBlock_movableTEMixin",