mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-02-17 10:24:23 +01:00
Fixed mobs not being able to wear the amulets when trinkets is present
This commit is contained in:
parent
4b66dd517f
commit
3606c5b0f2
11 changed files with 30 additions and 27 deletions
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)));
|
||||
|
||||
|
|
|
@ -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)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue