From 659377d2c66d60e40e2bf68d1baf9d71f6f6ce12 Mon Sep 17 00:00:00 2001 From: WakelessSloth56 Date: Wed, 28 Sep 2022 02:04:29 +0800 Subject: [PATCH] refactor(next): enchantment --- .../arnicalib/game/enchantment/EnchUtils.java | 52 +++++++ .../game/enchantment/EnchantmentIterator.java | 55 ++++++++ .../game/enchantment/EnchantmentRegistry.java | 32 +++++ .../mcmod/arnicalib/utils/game/EnchUtils.java | 129 ------------------ 4 files changed, 139 insertions(+), 129 deletions(-) create mode 100644 src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchUtils.java create mode 100644 src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchantmentIterator.java create mode 100644 src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchantmentRegistry.java delete mode 100644 src/main/java/org/auioc/mcmod/arnicalib/utils/game/EnchUtils.java diff --git a/src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchUtils.java b/src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchUtils.java new file mode 100644 index 00000000..ffdcdef0 --- /dev/null +++ b/src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchUtils.java @@ -0,0 +1,52 @@ +package org.auioc.mcmod.arnicalib.game.enchantment; + +import org.apache.commons.lang3.RandomUtils; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; + +public interface EnchUtils { + + static void enchantOne(ListTag enchantments, int index, int level) { + CompoundTag nbt = enchantments.getCompound(index); + nbt.putShort("lvl", (short) (nbt.getShort("lvl") + level)); + } + + static void enchantOne(CompoundTag enchantment, int level) { + enchantment.putShort("lvl", (short) (enchantment.getShort("lvl") + level)); + } + + static void enchantAll(ListTag enchantments, int level) { + for (int i = 0; i < enchantments.size(); i++) { + enchantOne(enchantments.getCompound(i), level); + } + } + + static void enchantRandom(ListTag enchantments, int level) { + enchantOne(enchantments.getCompound(RandomUtils.nextInt(0, enchantments.size())), level); + } + + + static CompoundTag getHighestEnchantment(ListTag enchantments) { + int index = 0; + short highestLevel = 0; + for (int i = 0, l = enchantments.size(); i < l; i++) { + short lvl = enchantments.getCompound(i).getShort("lvl"); + if (lvl > highestLevel) { + index = i; + highestLevel = lvl; + } + } + return enchantments.getCompound(index); + } + + static boolean isOverLimit(ListTag enchantments) { + for (int i = 0, l = enchantments.size(); i < l; i++) { + CompoundTag ench = enchantments.getCompound(i); + if (ench.getShort("lvl") > (EnchantmentRegistry.getOrElseThrow(ench.getString("id"))).getMaxLevel()) { + return true; + } + } + return false; + } + +} diff --git a/src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchantmentIterator.java b/src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchantmentIterator.java new file mode 100644 index 00000000..5e7cbc5b --- /dev/null +++ b/src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchantmentIterator.java @@ -0,0 +1,55 @@ +package org.auioc.mcmod.arnicalib.game.enchantment; + +import java.util.Map; +import java.util.function.Predicate; +import org.auioc.mcmod.arnicalib.game.enchantment.EnchantmentVisitor.BiEnchantmentVisitor; +import org.auioc.mcmod.arnicalib.game.enchantment.EnchantmentVisitor.QuadEnchantmentVisitor; +import org.auioc.mcmod.arnicalib.game.enchantment.EnchantmentVisitor.TriEnchantmentVisitor; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; + +public class EnchantmentIterator { + + public static void run(BiEnchantmentVisitor visitor, Map enchMap) { + for (var enchEntry : enchMap.entrySet()) visitor.accept(enchEntry.getKey(), enchEntry.getValue()); + } + + public static void runOnItem(BiEnchantmentVisitor visitor, ItemStack itemStack) { + if (!itemStack.isEmpty()) run(visitor, EnchantmentHelper.getEnchantments(itemStack)); + } + + public static void runOnItems(TriEnchantmentVisitor visitor, Iterable itemStacks, Predicate predicate) { + for (var itemStack : itemStacks) { + if (!itemStack.isEmpty() && predicate.test(itemStack)) { + runOnItem((ench, lvl) -> visitor.accept(itemStack, ench, lvl), itemStack); + } + } + } + + public static void runOnItems(TriEnchantmentVisitor visitor, Iterable itemStacks) { + runOnItems(visitor, itemStacks, (o) -> true); + } + + public static void runOnLiving(QuadEnchantmentVisitor visitor, LivingEntity living, EquipmentSlot[] slots) { + for (EquipmentSlot slot : slots) { + var itemStack = living.getItemBySlot(slot); + runOnItem((ench, lvl) -> { + if (ench instanceof IValidSlotsVisibleEnchantment _ench) { + if (_ench.isValidSlot(slot)) { + visitor.accept(slot, itemStack, ench, lvl); + } + } else { + visitor.accept(slot, itemStack, ench, lvl); + } + }, itemStack); + } + } + + public static void runOnLiving(QuadEnchantmentVisitor visitor, LivingEntity living) { + runOnLiving(visitor, living, EquipmentSlot.values()); + } + +} diff --git a/src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchantmentRegistry.java b/src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchantmentRegistry.java new file mode 100644 index 00000000..f5ca31ba --- /dev/null +++ b/src/main/java/org/auioc/mcmod/arnicalib/game/enchantment/EnchantmentRegistry.java @@ -0,0 +1,32 @@ +package org.auioc.mcmod.arnicalib.game.enchantment; + +import java.util.Optional; +import javax.annotation.Nonnull; +import org.auioc.mcmod.arnicalib.game.registry.RegistryEntryException; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraftforge.registries.ForgeRegistries; + +public class EnchantmentRegistry { + + @Nonnull + public static Optional get(ResourceLocation id) { + return Optional.ofNullable(ForgeRegistries.ENCHANTMENTS.containsKey(id) ? ForgeRegistries.ENCHANTMENTS.getValue(id) : null); + } + + @Nonnull + public static Optional get(String id) { + return get(new ResourceLocation(id)); + } + + @Nonnull + public static Enchantment getOrElseThrow(ResourceLocation id) { + return get(id).orElseThrow(RegistryEntryException.UNKNOWN_ENCHANTMENT.create(id.toString())); + } + + @Nonnull + public static Enchantment getOrElseThrow(String id) { + return get(id).orElseThrow(RegistryEntryException.UNKNOWN_ENCHANTMENT.create(id.toString())); + } + +} diff --git a/src/main/java/org/auioc/mcmod/arnicalib/utils/game/EnchUtils.java b/src/main/java/org/auioc/mcmod/arnicalib/utils/game/EnchUtils.java deleted file mode 100644 index 3736a1c5..00000000 --- a/src/main/java/org/auioc/mcmod/arnicalib/utils/game/EnchUtils.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.auioc.mcmod.arnicalib.utils.game; - -import java.util.Map; -import java.util.Optional; -import java.util.function.Predicate; -import javax.annotation.Nonnull; -import org.apache.commons.lang3.RandomUtils; -import org.auioc.mcmod.arnicalib.game.enchantment.EnchantmentVisitor.BiEnchantmentVisitor; -import org.auioc.mcmod.arnicalib.game.enchantment.EnchantmentVisitor.QuadEnchantmentVisitor; -import org.auioc.mcmod.arnicalib.game.enchantment.EnchantmentVisitor.TriEnchantmentVisitor; -import org.auioc.mcmod.arnicalib.game.enchantment.IValidSlotsVisibleEnchantment; -import org.auioc.mcmod.arnicalib.game.registry.RegistryEntryException; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraftforge.registries.ForgeRegistries; - -public interface EnchUtils { - - @Nonnull - static Optional getEnchantment(ResourceLocation id) { - return Optional.ofNullable(ForgeRegistries.ENCHANTMENTS.containsKey(id) ? ForgeRegistries.ENCHANTMENTS.getValue(id) : null); - } - - @Nonnull - static Optional getEnchantment(String id) { - return getEnchantment(new ResourceLocation(id)); - } - - @Nonnull - static Enchantment getEnchantmentOrElseThrow(ResourceLocation id) { - return getEnchantment(id).orElseThrow(RegistryEntryException.UNKNOWN_ENCHANTMENT.create(id.toString())); - } - - @Nonnull - static Enchantment getEnchantmentOrElseThrow(String id) { - return getEnchantment(id).orElseThrow(RegistryEntryException.UNKNOWN_ENCHANTMENT.create(id.toString())); - } - - - static void enchantOne(ListTag enchantments, int index, int level) { - CompoundTag nbt = enchantments.getCompound(index); - nbt.putShort("lvl", (short) (nbt.getShort("lvl") + level)); - } - - static void enchantOne(CompoundTag enchantment, int level) { - enchantment.putShort("lvl", (short) (enchantment.getShort("lvl") + level)); - } - - static void enchantAll(ListTag enchantments, int level) { - for (int i = 0; i < enchantments.size(); i++) { - enchantOne(enchantments.getCompound(i), level); - } - } - - static void enchantRandom(ListTag enchantments, int level) { - enchantOne(enchantments.getCompound(RandomUtils.nextInt(0, enchantments.size())), level); - } - - - static CompoundTag getHighestEnchantment(ListTag enchantments) { - int index = 0; - short highestLevel = 0; - for (int i = 0, l = enchantments.size(); i < l; i++) { - short lvl = enchantments.getCompound(i).getShort("lvl"); - if (lvl > highestLevel) { - index = i; - highestLevel = lvl; - } - } - return enchantments.getCompound(index); - } - - static boolean isOverLimit(ListTag enchantments) { - for (int i = 0, l = enchantments.size(); i < l; i++) { - CompoundTag ench = enchantments.getCompound(i); - if (ench.getShort("lvl") > (getEnchantmentOrElseThrow(ench.getString("id"))).getMaxLevel()) { - return true; - } - } - return false; - } - - - static void runIteration(BiEnchantmentVisitor visitor, Map enchMap) { - for (var enchEntry : enchMap.entrySet()) visitor.accept(enchEntry.getKey(), enchEntry.getValue()); - } - - static void runIterationOnItem(BiEnchantmentVisitor visitor, ItemStack itemStack) { - if (!itemStack.isEmpty()) runIteration(visitor, EnchantmentHelper.getEnchantments(itemStack)); - } - - static void runIterationOnItems(TriEnchantmentVisitor visitor, Iterable itemStacks, Predicate predicate) { - for (var itemStack : itemStacks) { - if (!itemStack.isEmpty() && predicate.test(itemStack)) { - runIterationOnItem((ench, lvl) -> visitor.accept(itemStack, ench, lvl), itemStack); - } - } - } - - static void runIterationOnItems(TriEnchantmentVisitor visitor, Iterable itemStacks) { - runIterationOnItems(visitor, itemStacks, (o) -> true); - } - - static void runIterationOnLiving(QuadEnchantmentVisitor visitor, LivingEntity living, EquipmentSlot[] slots) { - for (EquipmentSlot slot : slots) { - var itemStack = living.getItemBySlot(slot); - runIterationOnItem((ench, lvl) -> { - if (ench instanceof IValidSlotsVisibleEnchantment _ench) { - if (_ench.isValidSlot(slot)) { - visitor.accept(slot, itemStack, ench, lvl); - } - } else { - visitor.accept(slot, itemStack, ench, lvl); - } - }, itemStack); - } - } - - static void runIterationOnLiving(QuadEnchantmentVisitor visitor, LivingEntity living) { - runIterationOnLiving(visitor, living, EquipmentSlot.values()); - } - -}