From 65cf69124221522351a53e7170c4b38900eec07b Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 9 Dec 2022 21:19:45 +0000 Subject: [PATCH] Passive mobs will now correctly flee from players that have been wearing the alicorn amulet at least 1 day --- .../render/IcarusWingsFeatureRenderer.java | 4 ++-- .../unicopia/entity/AmuletSelectors.java | 6 +++++ .../unicopia/entity/Creature.java | 2 +- .../unicopia/entity/ItemTracker.java | 22 +++++++++++++++++++ .../unicopia/entity/Living.java | 6 ++++- .../unicopia/entity/player/Pony.java | 4 ++-- 6 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/IcarusWingsFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/IcarusWingsFeatureRenderer.java index 94fc1355..471a1bab 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/IcarusWingsFeatureRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/IcarusWingsFeatureRenderer.java @@ -1,7 +1,7 @@ package com.minelittlepony.unicopia.client.render; import com.minelittlepony.unicopia.Unicopia; -import com.minelittlepony.unicopia.item.UItems; +import com.minelittlepony.unicopia.entity.AmuletSelectors; import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.model.BipedEntityModel; @@ -18,7 +18,7 @@ public class IcarusWingsFeatureRenderer extends WingsFea @Override protected boolean canRender(E entity) { - return !super.canRender(entity) && UItems.PEGASUS_AMULET.isApplicable(entity); + return !super.canRender(entity) && AmuletSelectors.PEGASUS_AMULET.test(entity); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/AmuletSelectors.java b/src/main/java/com/minelittlepony/unicopia/entity/AmuletSelectors.java index d23c00f9..3ada5277 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/AmuletSelectors.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/AmuletSelectors.java @@ -8,4 +8,10 @@ import net.minecraft.entity.LivingEntity; public interface AmuletSelectors { Predicate ALICORN_AMULET = UItems.ALICORN_AMULET::isApplicable; + Predicate PEGASUS_AMULET = UItems.PEGASUS_AMULET::isApplicable; + + Predicate ALICORN_AMULET_AFTER_1_DAYS = ALICORN_AMULET.and(ItemTracker.wearing(UItems.ALICORN_AMULET, ItemTracker.after(ItemTracker.DAYS))); + Predicate ALICORN_AMULET_AFTER_2_DAYS = ALICORN_AMULET.and(ItemTracker.wearing(UItems.ALICORN_AMULET, ItemTracker.after(2 * ItemTracker.DAYS))); + Predicate ALICORN_AMULET_AFTER_3_DAYS = ALICORN_AMULET.and(ItemTracker.wearing(UItems.ALICORN_AMULET, ItemTracker.after(3 * ItemTracker.DAYS))); + Predicate ALICORN_AMULET_AFTER_4_DAYS = ALICORN_AMULET.and(ItemTracker.wearing(UItems.ALICORN_AMULET, ItemTracker.after(3 * ItemTracker.DAYS))); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Creature.java b/src/main/java/com/minelittlepony/unicopia/entity/Creature.java index 2ab8cb39..f3b8d607 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Creature.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Creature.java @@ -130,7 +130,7 @@ public class Creature extends Living implements WeaklyOwned(mob, LivingEntity.class, 10, 1.5, 1.9, AmuletSelectors.ALICORN_AMULET)); } if (entity instanceof PassiveEntity mob) { - goals.add(1, new FleeEntityGoal<>(mob, LivingEntity.class, 10, 1.1, 1.7, AmuletSelectors.ALICORN_AMULET)); + goals.add(1, new FleeEntityGoal<>(mob, LivingEntity.class, 10, 1.1, 1.7, AmuletSelectors.ALICORN_AMULET_AFTER_1_DAYS)); } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/ItemTracker.java b/src/main/java/com/minelittlepony/unicopia/entity/ItemTracker.java index 4e3c4338..a5cfcf95 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/ItemTracker.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/ItemTracker.java @@ -1,10 +1,12 @@ package com.minelittlepony.unicopia.entity; import java.util.*; +import java.util.function.Predicate; import java.util.stream.Stream; import com.minelittlepony.unicopia.util.NbtSerialisable; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; @@ -20,6 +22,26 @@ public class ItemTracker implements NbtSerialisable { private final Map items = new HashMap<>(); + public static Predicate wearing(Trackable charm, Predicate range) { + return e -> Living.getOrEmpty(e) + .map(Living::getArmour) + .map(a -> a.getTicks(charm)) + .filter(range) + .isPresent(); + } + + public static Predicate between(long minTime, long maxTime) { + return before(maxTime).and(after(minTime)); + } + + public static Predicate before(long maxTime) { + return ticks -> ticks <= maxTime; + } + + public static Predicate after(long maxTime) { + return ticks -> ticks <= maxTime; + } + public void update(Living living, Stream stacks) { final Set found = new HashSet<>(); final Set foundStacks = new HashSet<>(); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Living.java b/src/main/java/com/minelittlepony/unicopia/entity/Living.java index 007ede28..d395f5c1 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Living.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Living.java @@ -273,8 +273,12 @@ public abstract class Living implements Equine, Caste updateVelocity(entity); } + public static Optional> getOrEmpty(LivingEntity entity) { + return PonyContainer.of(entity).map(a -> a instanceof Living ? (Living)a.get() : null); + } + public static Living living(Entity entity) { - return PonyContainer.of(entity).map(a -> a instanceof Living ? (Living)a.get() : null).orElse(null); + return entity instanceof LivingEntity ? getOrEmpty((LivingEntity)entity).orElse(null) : null; } public static void updateVelocity(Entity entity) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 91f45b61..fa73a9b3 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -164,7 +164,7 @@ public class Pony extends Living implements Transmittable, Copieab @Override public Race getSpecies() { - if (UItems.ALICORN_AMULET.isApplicable(entity)) { + if (AmuletSelectors.ALICORN_AMULET.test(entity)) { return Race.ALICORN; } @@ -504,7 +504,7 @@ public class Pony extends Living implements Transmittable, Copieab public Optional trySleep(BlockPos pos) { - if (UItems.ALICORN_AMULET.isApplicable(entity)) { + if (AmuletSelectors.ALICORN_AMULET.test(entity)) { return Optional.of(Text.translatable("block.unicopia.bed.not_tired")); }