Fixed mobs not being able to wear the amulets when trinkets is present

This commit is contained in:
Sollace 2024-02-24 13:06:32 +00:00
parent 4b66dd517f
commit 3606c5b0f2
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
11 changed files with 30 additions and 27 deletions

View file

@ -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();

View file

@ -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<LivingEntity> {
default Stream<ItemStack> 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);
}
}
}

View file

@ -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)));

View file

@ -512,7 +512,7 @@ public abstract class Living<T extends LivingEntity> implements Equine<T>, 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<T extends LivingEntity> implements Equine<T>, 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)
);
}

View file

@ -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;
}

View file

@ -530,7 +530,7 @@ public class Pony extends Living<PlayerEntity> implements Copyable<Pony>, 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);
}

View file

@ -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);

View file

@ -126,13 +126,14 @@ public class FriendshipBraceletItem extends WearableItem implements DyeableItem,
public static Stream<ItemStack> 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<ItemStack> 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);
}
}

View file

@ -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);

View file

@ -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<ItemStack> 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();
}

View file

@ -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();
}
}