EnchantmentCommands.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package me.km.snuviscript.commands;
  2. import java.util.LinkedHashMap;
  3. import java.util.Map;
  4. import java.util.Map.Entry;
  5. import me.hammerle.snuviscript.code.ScriptManager;
  6. import me.km.utils.Mapper;
  7. import net.minecraft.enchantment.Enchantment;
  8. import net.minecraft.enchantment.EnchantmentData;
  9. import net.minecraft.enchantment.EnchantmentHelper;
  10. import net.minecraft.item.EnchantedBookItem;
  11. import net.minecraft.item.ItemStack;
  12. import net.minecraft.item.Items;
  13. import net.minecraft.nbt.CompoundNBT;
  14. import net.minecraft.nbt.ListNBT;
  15. import net.minecraft.util.ResourceLocation;
  16. import net.minecraftforge.registries.ForgeRegistries;
  17. public class EnchantmentCommands {
  18. public static void registerFunctions(ScriptManager sm) {
  19. sm.registerFunction("enchantment.get", (sc, in) -> Mapper.getEnchantment(in[0].getString(sc)));
  20. sm.registerFunction("enchantment.add", (sc, in) -> {
  21. ((ItemStack) in[1].get(sc)).addEnchantment((Enchantment) in[0].get(sc), in[2].getInt(sc));
  22. return true;
  23. });
  24. sm.registerFunction("enchantment.getlevel", (sc, in) -> {
  25. return (double) EnchantmentHelper.getEnchantmentLevel((Enchantment) in[0].get(sc), (ItemStack) in[1].get(sc));
  26. });
  27. sm.registerFunction("enchantment.readfromitem", (sc, in) -> {
  28. return getEnchantments((ItemStack) in[0].get(sc));
  29. });
  30. sm.registerConsumer("enchantment.writetoitem", (sc, in) -> {
  31. setEnchantments((Map<Enchantment, Double>) in[0].get(sc), (ItemStack) in[1].get(sc));
  32. });
  33. }
  34. private static Map<Enchantment, Double> getEnchantments(ItemStack stack) {
  35. ListNBT listnbt = stack.getItem() == Items.ENCHANTED_BOOK ? EnchantedBookItem.getEnchantments(stack) : stack.getEnchantmentTagList();
  36. return listToMap(listnbt);
  37. }
  38. private static Map<Enchantment, Double> listToMap(ListNBT list) {
  39. Map<Enchantment, Double> map = new LinkedHashMap<>();
  40. for(int i = 0; i < list.size(); ++i) {
  41. CompoundNBT c = list.getCompound(i);
  42. Enchantment ench = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryCreate(c.getString("id")));
  43. if(ench != null) {
  44. map.put(ench, (double) c.getInt("lvl"));
  45. }
  46. }
  47. return map;
  48. }
  49. private static void setEnchantments(Map<Enchantment, Double> enchMap, ItemStack stack) {
  50. ListNBT list = new ListNBT();
  51. for(Entry<Enchantment, Double> entry : enchMap.entrySet()) {
  52. Enchantment ench = entry.getKey();
  53. if(ench != null) {
  54. int i = entry.getValue().intValue();
  55. CompoundNBT c = new CompoundNBT();
  56. c.putString("id", String.valueOf(ForgeRegistries.ENCHANTMENTS.getKey(ench)));
  57. c.putShort("lvl", (short) i);
  58. list.add(c);
  59. if(stack.getItem() == Items.ENCHANTED_BOOK) {
  60. EnchantedBookItem.addEnchantment(stack, new EnchantmentData(ench, i));
  61. }
  62. }
  63. }
  64. if(list.isEmpty()) {
  65. stack.removeChildTag("Enchantments");
  66. } else if(stack.getItem() != Items.ENCHANTED_BOOK) {
  67. stack.setTagInfo("Enchantments", list);
  68. }
  69. }
  70. }