diff --git a/gradle.properties b/gradle.properties index 0efd6691..c493a91a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ loader_version_range=[2,) mod_id=reliquary mod_name=Reliquary mod_license=GNU General Public License v3.0 -mod_version=2.0.36 +mod_version=2.0.37 mod_group_id=reliquary mod_authors=x3n0ph0b3, TheMike, P3pp3rF1y mod_description=Two words: magical swag. Oh, and a gun. diff --git a/src/main/java/reliquary/compat/curios/CuriosCharmInventoryHandler.java b/src/main/java/reliquary/compat/curios/CuriosCharmInventoryHandler.java index 336910f2..66c43729 100644 --- a/src/main/java/reliquary/compat/curios/CuriosCharmInventoryHandler.java +++ b/src/main/java/reliquary/compat/curios/CuriosCharmInventoryHandler.java @@ -4,26 +4,25 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import reliquary.init.ModItems; -import reliquary.items.MobCharmDefinition; import reliquary.items.MobCharmItem; import reliquary.items.util.ICuriosItem; import top.theillusivec4.curios.api.CuriosApi; +import java.util.Set; + public class CuriosCharmInventoryHandler extends MobCharmItem.CharmInventoryHandler { @Override - public boolean playerHasMobCharm(Player player, MobCharmDefinition charmDefinition) { - if (super.playerHasMobCharm(player, charmDefinition)) { - return true; - } - return CuriosApi.getCuriosInventory(player).map(handler -> handler.getStacksHandler(ICuriosItem.Type.BELT.getIdentifier()).map(stackHandler -> { + protected Set getCharmRegistryNames(Player player) { + Set ret = super.getCharmRegistryNames(player); + CuriosApi.getCuriosInventory(player).flatMap(handler -> handler.getStacksHandler(ICuriosItem.Type.BELT.getIdentifier())).ifPresent(stackHandler -> { for (int slot = 0; slot < stackHandler.getSlots(); slot++) { ItemStack baubleStack = stackHandler.getStacks().getStackInSlot(slot); - if (!baubleStack.isEmpty() && baubleStack.getItem() == ModItems.MOB_CHARM_BELT.get() && ModItems.MOB_CHARM_BELT.get().hasCharm(baubleStack, charmDefinition.getRegistryName())) { - return true; + if (!baubleStack.isEmpty() && baubleStack.getItem() == ModItems.MOB_CHARM_BELT.get()) { + ret.addAll(ModItems.MOB_CHARM_BELT.get().getCharmRegistryNames(baubleStack)); } } - return false; - }).orElse(false)).orElse(false); + }); + return ret; } @Override @@ -39,7 +38,7 @@ public boolean damagePlayersMobCharm(ServerPlayer player, String entityRegistryN continue; } - if (damageMobCharmInBelt((ServerPlayer) player, entityRegistryName, baubleStack)) { + if (damageMobCharmInBelt(player, entityRegistryName, baubleStack)) { return true; } } diff --git a/src/main/java/reliquary/items/MobCharmBeltItem.java b/src/main/java/reliquary/items/MobCharmBeltItem.java index a752ea4e..3a99df63 100644 --- a/src/main/java/reliquary/items/MobCharmBeltItem.java +++ b/src/main/java/reliquary/items/MobCharmBeltItem.java @@ -18,6 +18,9 @@ import reliquary.items.util.ICuriosItem; import reliquary.reference.Config; +import java.util.HashSet; +import java.util.Set; + public class MobCharmBeltItem extends ItemBase implements ICuriosItem { private static final String SLOTS_TAG = "Slots"; @@ -176,4 +179,14 @@ ItemStack damageCharm(Player player, ItemStack belt, String entityRegistryName) return ItemStack.EMPTY; } + + public Set getCharmRegistryNames(ItemStack slotStack) { + Set ret = new HashSet<>(); + ListTag mobCharms = slotStack.getOrCreateTag().getList(SLOTS_TAG, Tag.TAG_COMPOUND); + for (int i = 0; i < mobCharms.size(); i++) { + ItemStack charmStack = ItemStack.of(mobCharms.getCompound(i)); + ret.add(MobCharmItem.getEntityRegistryName(charmStack)); + } + return ret; + } } diff --git a/src/main/java/reliquary/items/MobCharmItem.java b/src/main/java/reliquary/items/MobCharmItem.java index 07599460..c3c6db4f 100644 --- a/src/main/java/reliquary/items/MobCharmItem.java +++ b/src/main/java/reliquary/items/MobCharmItem.java @@ -31,8 +31,7 @@ import reliquary.util.WorldHelper; import javax.annotation.Nullable; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.function.Consumer; public class MobCharmItem extends ItemBase { @@ -216,18 +215,34 @@ public void setCharmInventoryHandler(CharmInventoryHandler charmInventoryHandler } public static class CharmInventoryHandler { - public boolean playerHasMobCharm(Player player, MobCharmDefinition charmDefinition) { - String registryName = charmDefinition.getRegistryName(); + private static long lastCharmCacheTime = -1; + private static final Map> charmsInInventoryCache = new HashMap<>(); + protected Set getCharmRegistryNames(Player player) { + Set ret = new HashSet<>(); for (ItemStack slotStack : player.getInventory().items) { if (slotStack.isEmpty()) { continue; } - if (ModItems.MOB_CHARM.get().isCharmOrBeltFor(slotStack, registryName)) { - return true; + if (slotStack.getItem() == ModItems.MOB_CHARM.get()) { + ret.add(getEntityRegistryName(slotStack)); + } + if (slotStack.getItem() == ModItems.MOB_CHARM_BELT.get()) { + ret.addAll(ModItems.MOB_CHARM_BELT.get().getCharmRegistryNames(slotStack)); } } - return false; + return ret; + } + + public boolean playerHasMobCharm(Player player, MobCharmDefinition charmDefinition) { + String registryName = charmDefinition.getRegistryName(); + + if (lastCharmCacheTime != player.level().getGameTime()) { + lastCharmCacheTime = player.level().getGameTime(); + charmsInInventoryCache.clear(); + charmsInInventoryCache.put(player.getUUID(), getCharmRegistryNames(player)); + } + return charmsInInventoryCache.get(player.getUUID()).contains(registryName); } public boolean damagePlayersMobCharm(ServerPlayer player, String entityRegistryName) {