From f33260cf2dac1f82ec8b49ffec28c59d4617621c Mon Sep 17 00:00:00 2001 From: "Luis C.M" <42545778+c0508383@users.noreply.github.com> Date: Thu, 27 Jul 2023 22:53:37 -0500 Subject: [PATCH] ScriptEntity: -Fixed setDimension() not properly teleporting entities, sometimes causing duplicates. --- .../npcs/scripted/entity/ScriptEntity.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java index a3bbf4e59..42cfc3985 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEntity.java @@ -15,6 +15,8 @@ import net.minecraft.nbt.NBTTagIntArray; import net.minecraft.nbt.NBTTagString; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import noppes.npcs.NoppesUtilPlayer; import noppes.npcs.NoppesUtilServer; import noppes.npcs.api.INbt; import noppes.npcs.api.IParticle; @@ -427,7 +429,7 @@ public class ScriptEntity implements IEntity { public void setDimension(int dimensionId) { IWorld world = NpcAPI.Instance().getIWorld(dimensionId); if (world != null) { - World mcWorld = world.getMCWorld(); + WorldServer mcWorld = world.getMCWorld(); if (this.entity.riddenByEntity != null) { this.entity.riddenByEntity.mountEntity((Entity)null); @@ -436,9 +438,23 @@ public class ScriptEntity implements IEntity { { this.entity.mountEntity((Entity)null); } + WorldServer prevWorld = ((WorldServer)this.entity.worldObj); + prevWorld.unloadEntities(new ArrayList(Collections.singleton(this.entity))); + prevWorld.resetUpdateEntityTick(); + prevWorld.onEntityRemoved(this.entity); + this.entity.worldObj = mcWorld; this.entity.dimension = dimensionId; mcWorld.addLoadedEntities(new ArrayList(Collections.singleton(this.entity))); + mcWorld.resetUpdateEntityTick(); + + mcWorld.updateEntityWithOptionalForce(this.entity, false); + if (this.entity instanceof EntityNPCInterface) { + ((EntityNPCInterface) this.entity).updateClient(); + } + + mcWorld.spawnEntityInWorld(this.entity); + this.entity.velocityChanged = true; } }