From 3606c5b0f2690723fc1fb4403bc1b65e32422ad6 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 24 Feb 2024 13:06:32 +0000 Subject: [PATCH] Fixed mobs not being able to wear the amulets when trinkets is present --- .../java/com/minelittlepony/unicopia/Unicopia.java | 2 +- .../unicopia/compat/trinkets/TrinketsDelegate.java | 12 +++++++----- .../unicopia/container/SpellbookScreenHandler.java | 8 ++++---- .../com/minelittlepony/unicopia/entity/Living.java | 4 ++-- .../entity/effect/SunBlindnessStatusEffect.java | 2 +- .../minelittlepony/unicopia/entity/player/Pony.java | 2 +- .../com/minelittlepony/unicopia/item/AmuletItem.java | 2 +- .../unicopia/item/FriendshipBraceletItem.java | 7 ++++--- .../minelittlepony/unicopia/item/GlassesItem.java | 2 +- .../minelittlepony/unicopia/item/WearableItem.java | 10 +++++----- .../unicopia/mixin/trinkets/MixinScreenHandler.java | 6 +++--- 11 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index 03e48838..4758e13f 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -69,7 +69,7 @@ public class Unicopia implements ModInitializer { UCriteria.bootstrap(); UEntities.bootstrap(); Commands.bootstrap(); - TrinketsDelegate.getInstance().bootstrap(); + TrinketsDelegate.getInstance(null).bootstrap(); ServerTickEvents.END_WORLD_TICK.register(w -> { ((BlockDestructionManager.Source)w).getDestructionManager().tick(); diff --git a/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java b/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java index dfa184dc..6c896cf4 100644 --- a/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java @@ -4,6 +4,8 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.jetbrains.annotations.Nullable; + import com.minelittlepony.unicopia.EntityConvertable; import com.minelittlepony.unicopia.container.SpellbookScreenHandler; @@ -11,6 +13,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.MobEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; @@ -26,11 +29,10 @@ public interface TrinketsDelegate { TrinketsDelegate EMPTY = new TrinketsDelegate() {}; - static TrinketsDelegate getInstance() { - if (!hasTrinkets()) { + static TrinketsDelegate getInstance(@Nullable LivingEntity entity) { + if (!(entity instanceof PlayerEntity && hasTrinkets())) { return EMPTY; } - return TrinketsDelegateImpl.INSTANCE; } @@ -101,7 +103,7 @@ public interface TrinketsDelegate { interface Inventory extends EntityConvertable { default Stream getEquippedStacks(Identifier slot) { - return TrinketsDelegate.getInstance().getEquipped(asEntity(), slot); + return TrinketsDelegate.getInstance(asEntity()).getEquipped(asEntity(), slot); } default ItemStack getEquippedStack(Identifier slot) { @@ -109,7 +111,7 @@ public interface TrinketsDelegate { } default void equipStack(Identifier slot, ItemStack stack) { - TrinketsDelegate.getInstance().setEquippedStack(asEntity(), slot, stack); + TrinketsDelegate.getInstance(asEntity()).setEquippedStack(asEntity(), slot, stack); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java index 0bed725f..5f675f85 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java @@ -149,10 +149,10 @@ public class SpellbookScreenHandler extends ScreenHandler { } }); - TrinketsDelegate.getInstance().createSlot(this, inv.player, TrinketsDelegate.FACE, 0, rightHandX, inventoryY + slotSpacing * 6).ifPresent(this::addSlot); - TrinketsDelegate.getInstance().createSlot(this, inv.player, TrinketsDelegate.NECKLACE, 0, leftHandX, equipmentY + slotSpacing).ifPresent(this::addSlot); - TrinketsDelegate.getInstance().createSlot(this, inv.player, TrinketsDelegate.MAINHAND, 0, leftHandX, equipmentY).ifPresent(this::addSlot); - TrinketsDelegate.getInstance().createSlot(this, inv.player, TrinketsDelegate.OFFHAND, 0, rightHandX, equipmentY).ifPresent(this::addSlot); + TrinketsDelegate.getInstance(inv.player).createSlot(this, inv.player, TrinketsDelegate.FACE, 0, rightHandX, inventoryY + slotSpacing * 6).ifPresent(this::addSlot); + TrinketsDelegate.getInstance(inv.player).createSlot(this, inv.player, TrinketsDelegate.NECKLACE, 0, leftHandX, equipmentY + slotSpacing).ifPresent(this::addSlot); + TrinketsDelegate.getInstance(inv.player).createSlot(this, inv.player, TrinketsDelegate.MAINHAND, 0, leftHandX, equipmentY).ifPresent(this::addSlot); + TrinketsDelegate.getInstance(inv.player).createSlot(this, inv.player, TrinketsDelegate.OFFHAND, 0, rightHandX, equipmentY).ifPresent(this::addSlot); addSlot(outputSlot = new OutputSlot(this, inventory.player, input, result, 0, gemPos.get(0))); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Living.java b/src/main/java/com/minelittlepony/unicopia/entity/Living.java index 53384423..40d6ee7f 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Living.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Living.java @@ -512,7 +512,7 @@ public abstract class Living implements Equine, Caste if (glasses.getItem() == UItems.SUNGLASSES) { ItemStack broken = UItems.BROKEN_SUNGLASSES.getDefaultStack(); broken.setNbt(glasses.getNbt()); - TrinketsDelegate.getInstance().setEquippedStack(entity, TrinketsDelegate.FACE, broken); + TrinketsDelegate.getInstance(entity).setEquippedStack(entity, TrinketsDelegate.FACE, broken); playSound(USounds.ITEM_SUNGLASSES_SHATTER, 1, 1); } } @@ -550,7 +550,7 @@ public abstract class Living implements Equine, Caste return StreamSupport.stream(entity.getArmorItems().spliterator(), false); } return Stream.concat( - TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.NECKLACE), + TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.NECKLACE), StreamSupport.stream(entity.getArmorItems().spliterator(), false) ); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/SunBlindnessStatusEffect.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/SunBlindnessStatusEffect.java index 0361d84b..c9f679c6 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/SunBlindnessStatusEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/SunBlindnessStatusEffect.java @@ -73,7 +73,7 @@ public class SunBlindnessStatusEffect extends StatusEffect { } if (entity.getEquippedStack(EquipmentSlot.HEAD).isIn(UTags.SHADES) - || TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.FACE).anyMatch(i -> i.isIn(UTags.SHADES)) + || TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.FACE).anyMatch(i -> i.isIn(UTags.SHADES)) || entity.isSubmergedInWater()) { return false; } 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 072cee98..67a93b73 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -530,7 +530,7 @@ public class Pony extends Living implements Copyable, Update } if (getObservedSpecies() == Race.BAT && !entity.hasPortalCooldown()) { - boolean hasShades = TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.FACE).anyMatch(s -> s.isIn(UTags.SHADES)); + boolean hasShades = TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.FACE).anyMatch(s -> s.isIn(UTags.SHADES)); if (!this.hasShades && hasShades && getObservedSpecies() == Race.BAT) { UCriteria.WEAR_SHADES.trigger(entity); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java b/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java index a8c34938..b59a878e 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java @@ -95,7 +95,7 @@ public class AmuletItem extends WearableItem implements ChargeableItem { } public static ItemStack getForEntity(LivingEntity entity) { - return TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.NECKLACE) + return TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.NECKLACE) .filter(stack -> stack.getItem() instanceof AmuletItem) .findFirst() .orElse(ItemStack.EMPTY); diff --git a/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java b/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java index 4062ae4a..f48e9867 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java @@ -126,13 +126,14 @@ public class FriendshipBraceletItem extends WearableItem implements DyeableItem, public static Stream getWornBangles(LivingEntity entity) { return Stream.concat( - TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.MAINHAND), - TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.OFFHAND) + TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.MAINHAND), + TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.OFFHAND) ).filter(stack -> stack.getItem() == UItems.FRIENDSHIP_BRACELET); } public static Stream getWornBangles(LivingEntity entity, Identifier slot) { - return TrinketsDelegate.getInstance().getEquipped(entity, slot) + return TrinketsDelegate.getInstance(entity) + .getEquipped(entity, slot) .filter(stack -> stack.getItem() == UItems.FRIENDSHIP_BRACELET); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/GlassesItem.java b/src/main/java/com/minelittlepony/unicopia/item/GlassesItem.java index f915d1bf..3c49931e 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/GlassesItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/GlassesItem.java @@ -29,7 +29,7 @@ public class GlassesItem extends WearableItem { } public static ItemStack getForEntity(LivingEntity entity) { - return TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.FACE) + return TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.FACE) .filter(stack -> stack.getItem() instanceof GlassesItem) .findFirst() .orElse(ItemStack.EMPTY); diff --git a/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java b/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java index 1b7067da..fcdf7d9f 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java @@ -24,7 +24,7 @@ public abstract class WearableItem extends Item implements Equipment { public WearableItem(FabricItemSettings settings) { super(configureEquipmentSlotSupplier(settings)); DispenserBlock.registerBehavior(this, DISPENSER_BEHAVIOR); - TrinketsDelegate.getInstance().registerTrinket(this); + TrinketsDelegate.getInstance(null).registerTrinket(this); } private static FabricItemSettings configureEquipmentSlotSupplier(FabricItemSettings settings) { @@ -37,8 +37,8 @@ public abstract class WearableItem extends Item implements Equipment { @Override public TypedActionResult use(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getStackInHand(hand); - return TrinketsDelegate.getInstance().getAvailableTrinketSlots(player, TrinketsDelegate.ALL).stream() - .filter(slotId -> TrinketsDelegate.getInstance().equipStack(player, slotId, stack)) + return TrinketsDelegate.getInstance(player).getAvailableTrinketSlots(player, TrinketsDelegate.ALL).stream() + .filter(slotId -> TrinketsDelegate.getInstance(player).equipStack(player, slotId, stack)) .findAny() .map(slotId -> TypedActionResult.success(stack, world.isClient())) .orElseGet(() -> TypedActionResult.fail(stack)); @@ -66,10 +66,10 @@ public abstract class WearableItem extends Item implements Equipment { EntityPredicates.EXCEPT_SPECTATOR ) .stream() - .flatMap(entity -> TrinketsDelegate.getInstance() + .flatMap(entity -> TrinketsDelegate.getInstance(entity) .getAvailableTrinketSlots(entity, TrinketsDelegate.ALL) .stream() - .filter(slotId -> TrinketsDelegate.getInstance().equipStack(entity, slotId, armor))) + .filter(slotId -> TrinketsDelegate.getInstance(entity).equipStack(entity, slotId, armor))) .findFirst() .isPresent(); } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/trinkets/MixinScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/mixin/trinkets/MixinScreenHandler.java index f716263d..32484ca0 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/trinkets/MixinScreenHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/trinkets/MixinScreenHandler.java @@ -38,7 +38,7 @@ abstract class MixinScreenHandler { ) // redirect slot.getMaxItemCount() to stack aware version protected int onGetMaxItemCount(Slot sender, ItemStack stack) { - return TrinketsDelegate.getInstance().isTrinketSlot(sender) ? sender.getMaxItemCount(stack) : sender.getMaxItemCount(); + return TrinketsDelegate.getInstance(null).isTrinketSlot(sender) ? sender.getMaxItemCount(stack) : sender.getMaxItemCount(); } @Redirect(method = "insertItem", @@ -50,7 +50,7 @@ abstract class MixinScreenHandler { ) // redirect "if (!itemStack.isEmpty() && ItemStack.canCombine(stack, itemStack))" -> "if (!canNotInsert(itemStack, slot) && ItemStack.canCombine(stack, itemStack))" protected boolean canNotInsert(ItemStack sender) { - return sender.isEmpty() || (TrinketsDelegate.getInstance().isTrinketSlot(currentSlot) && (currentSlot.getStack().getCount() + sender.getCount()) <= currentSlot.getMaxItemCount(sender)); + return sender.isEmpty() || (TrinketsDelegate.getInstance(null).isTrinketSlot(currentSlot) && (currentSlot.getStack().getCount() + sender.getCount()) <= currentSlot.getMaxItemCount(sender)); } @Redirect(method = "canInsertItemIntoSlot", @@ -60,6 +60,6 @@ abstract class MixinScreenHandler { ) ) private static int onGetMaxCount(ItemStack sender, @Nullable Slot slot) { - return TrinketsDelegate.getInstance().isTrinketSlot(slot) ? slot.getMaxItemCount(sender) : sender.getMaxCount(); + return TrinketsDelegate.getInstance(null).isTrinketSlot(slot) ? slot.getMaxItemCount(sender) : sender.getMaxCount(); } }