Skip to content

Commit

Permalink
Fixed mobs not being able to wear the amulets when trinkets is present
Browse files Browse the repository at this point in the history
  • Loading branch information
Sollace committed Feb 24, 2024
1 parent 4b66dd5 commit 3606c5b
Show file tree
Hide file tree
Showing 11 changed files with 30 additions and 27 deletions.
2 changes: 1 addition & 1 deletion src/main/java/com/minelittlepony/unicopia/Unicopia.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public void onInitialize() {
UCriteria.bootstrap();
UEntities.bootstrap();
Commands.bootstrap();
TrinketsDelegate.getInstance().bootstrap();
TrinketsDelegate.getInstance(null).bootstrap();

ServerTickEvents.END_WORLD_TICK.register(w -> {
((BlockDestructionManager.Source)w).getDestructionManager().tick();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@
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;

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

Expand Down Expand Up @@ -101,15 +103,15 @@ default boolean isTrinketSlot(Slot slot) {
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) {
return getEquippedStacks(slot).findFirst().orElse(ItemStack.EMPTY);
}

default void equipStack(Identifier slot, ItemStack stack) {
TrinketsDelegate.getInstance().setEquippedStack(asEntity(), slot, stack);
TrinketsDelegate.getInstance(asEntity()).setEquippedStack(asEntity(), slot, stack);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -149,10 +149,10 @@ public Pair<Identifier, Identifier> getBackgroundSprite() {
}
});

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

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/minelittlepony/unicopia/entity/Living.java
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,7 @@ public Optional<Boolean> onDamage(DamageSource source, float amount) {
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);
}
}
Expand Down Expand Up @@ -550,7 +550,7 @@ protected Stream<ItemStack> getArmourStacks() {
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)
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public static boolean hasSunExposure(LivingEntity entity) {
}

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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ private void updateBatPonyAbilities() {
}

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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public int getMaxCharge() {
}

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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,13 +126,14 @@ public static Stream<Pony> getPartyMembers(Caster<?> caster, double radius) {

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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public boolean isApplicable(LivingEntity entity) {
}

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);
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/com/minelittlepony/unicopia/item/WearableItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -37,8 +37,8 @@ private static FabricItemSettings configureEquipmentSlotSupplier(FabricItemSetti
@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));
Expand Down Expand Up @@ -66,10 +66,10 @@ public static boolean dispenseArmor(BlockPointer pointer, ItemStack armor) {
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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ private Object onGetSlot(DefaultedList<Slot> sender, int index) {
)
// 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",
Expand All @@ -50,7 +50,7 @@ protected int onGetMaxItemCount(Slot sender, ItemStack stack) {
)
// 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",
Expand All @@ -60,6 +60,6 @@ protected boolean canNotInsert(ItemStack sender) {
)
)
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();
}
}

0 comments on commit 3606c5b

Please sign in to comment.