From a32a14f13406c1c2a7b6e54be273f9732f4ae9c6 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 16 Sep 2022 17:54:20 +0200 Subject: [PATCH] Fixed multiple spell entities being spawned when far away --- .../unicopia/ability/magic/spell/PlaceableSpell.java | 11 +++++++---- .../unicopia/entity/EntityReference.java | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java index 8e0d0b9a..d976aaeb 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java @@ -79,7 +79,7 @@ public class PlaceableSpell extends AbstractDelegatingSpell { setDirty(); } - if (getSpellEntity(source).isEmpty()) { + if (getWorld(source).map(castEntity::isUnlinked).orElse(false)) { CastSpellEntity entity = UEntities.CAST_SPELL.create(source.getReferenceWorld()); Vec3d pos = castEntity.getPosition().orElse(source.getOriginVector()); entity.updatePositionAndAngles(pos.x, pos.y, pos.z, 0, 0); @@ -119,10 +119,13 @@ public class PlaceableSpell extends AbstractDelegatingSpell { super.onDestroyed(source); } - protected Optional getSpellEntity(Caster source) { + public Optional getSpellEntity(Caster source) { + return getWorld(source).map(castEntity::get); + } + + protected Optional getWorld(Caster source) { return Optional.ofNullable(dimension) - .map(dim -> source.getReferenceWorld().getServer().getWorld(dimension)) - .map(castEntity::get); + .map(dim -> source.getReferenceWorld().getServer().getWorld(dim)); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityReference.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityReference.java index 1d444617..69697472 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityReference.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityReference.java @@ -69,6 +69,10 @@ public class EntityReference implements NbtSerialisable { return entity != null && entity.getUuid().equals(uuid.orElse(null)); } + public boolean isUnlinked(World world) { + return getId().isEmpty() || getOrEmpty(world).map(e -> e.isRemoved()).orElse(false); + } + public boolean isPresent(World world) { return getOrEmpty(world).isPresent(); }