diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index c2cf93a8..843165a7 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -71,7 +71,7 @@ public interface URenderers { EntityRendererRegistry.register(UEntities.BUTTERFLY, ButterflyEntityRenderer::new); EntityRendererRegistry.register(UEntities.FLOATING_ARTEFACT, FloatingArtefactEntityRenderer::new); EntityRendererRegistry.register(UEntities.CAST_SPELL, CastSpellEntityRenderer::new); - EntityRendererRegistry.register(UEntities.FAIRY, FairyEntityRenderer::new); + EntityRendererRegistry.register(UEntities.TWITTERMITE, FairyEntityRenderer::new); EntityRendererRegistry.register(UEntities.SPELLBOOK, SpellbookEntityRenderer::new); ColorProviderRegistry.ITEM.register((stack, i) -> i > 0 ? -1 : ((DyeableItem)stack.getItem()).getColor(stack), UItems.FRIENDSHIP_BRACELET); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityReference.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityReference.java index 245d5eda..3c6c367b 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityReference.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityReference.java @@ -10,6 +10,7 @@ import com.minelittlepony.unicopia.util.NbtSerialisable; import net.minecraft.entity.Entity; import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -29,33 +30,42 @@ public class EntityReference implements NbtSerialisable { } } + /** + * Gets the position the last known position of the assigned entity. + */ public Optional getPosition() { return pos; } public boolean isPresent(World world) { - T entity = get(world); - return entity != null && !entity.isRemoved(); + return getOrEmpty(world).isPresent(); } public void ifPresent(World world, Consumer consumer) { - if (isPresent(world)) { - consumer.accept(get(world)); - } + getOrEmpty(world).ifPresent(consumer); + } + + @Nullable + public T get(World world) { + return getOrEmpty(world).orElse(null); } @SuppressWarnings("unchecked") - @Nullable - public T get(World world) { + public Optional getOrEmpty(World world) { if (uuid != null && world instanceof ServerWorld) { - return (T)((ServerWorld)world).getEntity(uuid); + return Optional.ofNullable((T)((ServerWorld)world).getEntity(uuid)).filter(this::checkReference); } if (clientId != 0) { - return (T)world.getEntityById(clientId); + return Optional.ofNullable((T)world.getEntityById(clientId)).filter(this::checkReference); } - return null; + return Optional.empty(); + } + + private boolean checkReference(Entity e) { + pos = Optional.of(e.getPos()); + return !e.isRemoved(); } @Override @@ -72,7 +82,7 @@ public class EntityReference implements NbtSerialisable { @Override public void fromNBT(NbtCompound tag) { uuid = tag.containsUuid("uuid") ? tag.getUuid("uuid") : null; - pos = tag.contains("pos") ? Optional.ofNullable(NbtSerialisable.readVector(tag.getList("pos", 6))) : Optional.empty(); + pos = tag.contains("pos") ? Optional.ofNullable(NbtSerialisable.readVector(tag.getList("pos", NbtElement.DOUBLE_TYPE))) : Optional.empty(); clientId = tag.getInt("clientId"); } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/UEntities.java b/src/main/java/com/minelittlepony/unicopia/entity/UEntities.java index 6a89e655..00359b02 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/UEntities.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/UEntities.java @@ -31,7 +31,7 @@ public interface UEntities { EntityType CAST_SPELL = register("cast_spell", FabricEntityTypeBuilder.create(SpawnGroup.MISC, CastSpellEntity::new) .trackRangeBlocks(200) .dimensions(EntityDimensions.fixed(1, 0.4F))); - EntityType FAIRY = register("fairy", FabricEntityTypeBuilder.create(SpawnGroup.MISC, FairyEntity::new) + EntityType TWITTERMITE = register("twittermite", FabricEntityTypeBuilder.create(SpawnGroup.MISC, FairyEntity::new) .trackRangeBlocks(200) .dimensions(EntityDimensions.fixed(0.1F, 0.1F))); EntityType SPELLBOOK = register("spellbook", FabricEntityTypeBuilder.create(SpawnGroup.MISC, SpellbookEntity::new) @@ -46,7 +46,7 @@ public interface UEntities { static void bootstrap() { FabricDefaultAttributeRegistry.register(BUTTERFLY, ButterflyEntity.createButterflyAttributes()); FabricDefaultAttributeRegistry.register(SPELLBOOK, SpellbookEntity.createMobAttributes()); - FabricDefaultAttributeRegistry.register(FAIRY, FairyEntity.createMobAttributes()); + FabricDefaultAttributeRegistry.register(TWITTERMITE, FairyEntity.createMobAttributes()); final Predicate butterflySpawnable = BiomeSelectors.foundInOverworld() .and(ctx -> ctx.getBiome().getPrecipitation() == Biome.Precipitation.RAIN); diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 62e8cb0f..cf781f38 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -79,6 +79,7 @@ "block.unicopia.rocks": "Rocks", "entity.unicopia.butterfly": "Butterfly", + "entity.unicopia.twittermite": "Twittermite", "entity.unicopia.cast_spell": "Cast Spell", "entity.unicopia.cast_spell.by": "a spell cast by %s", "entity.unicopia.spellbook": "Spellbook",