EnchantmentCommands.java 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. @SuppressWarnings("unchecked")
  19. public static void registerFunctions(ScriptManager sm) {
  20. sm.registerFunction("enchantment.get",
  21. (sc, in) -> Mapper.getEnchantment(in[0].getString(sc)));
  22. sm.registerFunction("enchantment.add", (sc, in) -> {
  23. ((ItemStack) in[1].get(sc)).addEnchantment((Enchantment) in[0].get(sc),
  24. in[2].getInt(sc));
  25. return true;
  26. });
  27. sm.registerFunction("enchantment.getlevel", (sc, in) -> {
  28. return (double) EnchantmentHelper.getEnchantmentLevel((Enchantment) in[0].get(sc),
  29. (ItemStack) in[1].get(sc));
  30. });
  31. sm.registerFunction("enchantment.readfromitem", (sc, in) -> {
  32. return getEnchantments((ItemStack) in[0].get(sc));
  33. });
  34. sm.registerConsumer("enchantment.writetoitem", (sc, in) -> {
  35. setEnchantments((Map<Enchantment, Double>) in[0].get(sc), (ItemStack) in[1].get(sc));
  36. });
  37. }
  38. private static Map<Enchantment, Double> getEnchantments(ItemStack stack) {
  39. ListNBT listnbt =
  40. stack.getItem() == Items.ENCHANTED_BOOK ? EnchantedBookItem.getEnchantments(stack)
  41. : stack.getEnchantmentTagList();
  42. return listToMap(listnbt);
  43. }
  44. private static Map<Enchantment, Double> listToMap(ListNBT list) {
  45. Map<Enchantment, Double> map = new LinkedHashMap<>();
  46. for(int i = 0; i < list.size(); ++i) {
  47. CompoundNBT c = list.getCompound(i);
  48. Enchantment ench = ForgeRegistries.ENCHANTMENTS
  49. .getValue(ResourceLocation.tryCreate(c.getString("id")));
  50. if(ench != null) {
  51. map.put(ench, (double) c.getInt("lvl"));
  52. }
  53. }
  54. return map;
  55. }
  56. private static void setEnchantments(Map<Enchantment, Double> enchMap, ItemStack stack) {
  57. ListNBT list = new ListNBT();
  58. for(Entry<Enchantment, Double> entry : enchMap.entrySet()) {
  59. Enchantment ench = entry.getKey();
  60. if(ench != null) {
  61. int i = entry.getValue().intValue();
  62. CompoundNBT c = new CompoundNBT();
  63. c.putString("id", String.valueOf(ForgeRegistries.ENCHANTMENTS.getKey(ench)));
  64. c.putShort("lvl", (short) i);
  65. list.add(c);
  66. if(stack.getItem() == Items.ENCHANTED_BOOK) {
  67. EnchantedBookItem.addEnchantment(stack, new EnchantmentData(ench, i));
  68. }
  69. }
  70. }
  71. if(list.isEmpty()) {
  72. stack.removeChildTag("Enchantments");
  73. } else if(stack.getItem() != Items.ENCHANTED_BOOK) {
  74. stack.setTagInfo("Enchantments", list);
  75. }
  76. }
  77. }