From 12eae97a486f0a56f56dfcecbb5ce0105b6bed4b Mon Sep 17 00:00:00 2001 From: Yi Cao Date: Sat, 23 Apr 2022 21:37:04 +0800 Subject: [PATCH] Attempt 3 --- .../dimthread/mixin/EntityMixin.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/wearblackallday/dimthread/mixin/EntityMixin.java b/src/main/java/wearblackallday/dimthread/mixin/EntityMixin.java index 2f44328..eeeaecf 100644 --- a/src/main/java/wearblackallday/dimthread/mixin/EntityMixin.java +++ b/src/main/java/wearblackallday/dimthread/mixin/EntityMixin.java @@ -5,10 +5,12 @@ import net.minecraft.server.world.ServerWorld; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; 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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import wearblackallday.dimthread.DimThread; @@ -17,6 +19,11 @@ @Mixin(Entity.class) public abstract class EntityMixin implements Cloneable { + public boolean isCloned = false; + + @Shadow @Final + abstract void setRemoved(Entity.RemovalReason reason); + /** * Schedules moving entities between dimensions to the server thread. Once all * the world finish ticking, {@code moveToWorld()} is processed in a safe manner @@ -42,11 +49,26 @@ public void moveToWorld(ServerWorld destination, CallbackInfoReturnable destination.getServer().execute( () -> finalSnapshot.moveToWorld(destination) ); + this.removeFromDimension(); ci.setReturnValue(null); } } + /** + * @author xiaoyu2006 + * @reason If this is a cloned entity, it should not execute removeFromDimension. + */ + @Overwrite + public void removeFromDimension() { + if (this.isCloned) { + return; + } + this.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION); + } + protected Object clone() throws CloneNotSupportedException { - return super.clone(); + EntityMixin cloned = (EntityMixin) super.clone(); + cloned.isCloned = true; + return cloned; } }