From 481fc975450ec58db1faf14f776205127b0365c0 Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 25 Jun 2021 18:38:49 -0300 Subject: [PATCH] changes to entity load handler / not backwards compatible --- .../ServerEntityManager_scarpetMixin.java | 38 +++++++++++++++++++ .../mixins/ServerWorld_scarpetMixin.java | 4 +- .../java/carpet/script/CarpetEventServer.java | 11 +++--- src/main/resources/carpet.mixins.json | 1 + 4 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 src/main/java/carpet/mixins/ServerEntityManager_scarpetMixin.java diff --git a/src/main/java/carpet/mixins/ServerEntityManager_scarpetMixin.java b/src/main/java/carpet/mixins/ServerEntityManager_scarpetMixin.java new file mode 100644 index 00000000..04191e62 --- /dev/null +++ b/src/main/java/carpet/mixins/ServerEntityManager_scarpetMixin.java @@ -0,0 +1,38 @@ +package carpet.mixins; + +import carpet.script.CarpetEventServer; +import carpet.script.CarpetScriptServer; +import net.minecraft.entity.Entity; +import net.minecraft.server.world.ServerEntityManager; +import net.minecraft.world.entity.EntityLike; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ServerEntityManager.class) +public class ServerEntityManager_scarpetMixin +{ + @Inject(method = "addEntity(Lnet/minecraft/world/entity/EntityLike;Z)Z", at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/entity/EntityTrackingStatus;shouldTick()Z" + )) + private void handleAddedEntity(EntityLike entityLike, boolean existing, CallbackInfoReturnable cir) + { + Entity entity = (Entity)entityLike; + CarpetEventServer.Event event = CarpetEventServer.Event.ENTITY_LOAD.get(entity.getType()); + if (event != null) + { + if (event.isNeeded()) + { + event.onEntityAction(entity, !existing); + } + } + else + { + CarpetScriptServer.LOG.error("Failed to handle entity type " + entity.getType().getTranslationKey()); + } + + } + +} diff --git a/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java b/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java index eed77037..592eaf53 100644 --- a/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java +++ b/src/main/java/carpet/mixins/ServerWorld_scarpetMixin.java @@ -26,7 +26,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import static carpet.script.CarpetEventServer.Event.ENTITY_LOAD; import static carpet.script.CarpetEventServer.Event.EXPLOSION; import static carpet.script.CarpetEventServer.Event.LIGHTNING; @@ -46,6 +45,8 @@ public class ServerWorld_scarpetMixin implements ServerWorldInterface if (LIGHTNING.isNeeded()) LIGHTNING.onWorldEventFlag((ServerWorld) (Object)this, blockPos, bl2?1:0); } + /* + moved to ServerEntityManager_scarpetMixin in 1.17 @Redirect(method = "addEntity", at = @At( value = "INVOKE", target = "Lnet/minecraft/server/world/ServerEntityManager;addEntity(Lnet/minecraft/world/entity/EntityLike;)Z" @@ -66,6 +67,7 @@ public class ServerWorld_scarpetMixin implements ServerWorldInterface }; return success; } + */ @Inject(method = "createExplosion", at = @At("HEAD")) private void handleExplosion(/*@Nullable*/ Entity entity, /*@Nullable*/ DamageSource damageSource, /*@Nullable*/ ExplosionBehavior explosionBehavior, double d, double e, double f, float g, boolean bl, Explosion.DestructionType destructionType, CallbackInfoReturnable cir) diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index 03bc08d7..5b3d8a19 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -933,16 +933,17 @@ public class CarpetEventServer return "entity_loaded_" + ValueConversions.of(Registry.ENTITY_TYPE.getId(et)).getString(); } - public static final Map, Event> ENTITY_LOAD= new HashMap, Event>() {{ + public static final Map, Event> ENTITY_LOAD= new HashMap<>() + {{ EntityType.get("zombie"); Registry.ENTITY_TYPE.forEach(et -> { - put(et, new Event(getEntityLoadEventName(et), 1, true, false) + put(et, new Event(getEntityLoadEventName(et), 2, true, false) { @Override - public void onEntityAction(Entity entity) + public void onEntityAction(Entity entity, boolean created) { handler.call( - () -> Collections.singletonList(new EntityValue(entity)), + () -> Arrays.asList(new EntityValue(entity), BooleanValue.of(created)), () -> CarpetServer.minecraft_server.getCommandSource().withWorld((ServerWorld) entity.world).withLevel(CarpetSettings.runPermissionLevel) ); } @@ -1040,7 +1041,7 @@ public class CarpetEventServer public void onBlockPlaced(ServerPlayerEntity player, BlockPos pos, Hand enumhand, ItemStack itemstack) { } public void onEntityHandAction(ServerPlayerEntity player, Entity entity, Hand enumhand) { } public void onHandAction(ServerPlayerEntity player, Hand enumhand) { } - public void onEntityAction(Entity entity) { } + public void onEntityAction(Entity entity, boolean created) { } public void onDimensionChange(ServerPlayerEntity player, Vec3d from, Vec3d to, RegistryKey fromDim, RegistryKey dimTo) {} public void onDamage(Entity target, float amount, DamageSource source) { } public void onRecipeSelected(ServerPlayerEntity player, Identifier recipe, boolean fullStack) {} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index e0cc1ada..56c8e365 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -188,6 +188,7 @@ "StatType_scarpetMixin", "PointOfInterest_scarpetMixin", "ServerWorld_scarpetMixin", + "ServerEntityManager_scarpetMixin", "HungerManagerMixin_scarpetEventsMixin", "ReloadCommand_reloadAppsMixin", "CrashReport_addScarpetAppsMixin",