diff --git a/common/src/main/java/fr/fabienhebuterne/customcraft/CustomCraft.java b/common/src/main/java/fr/fabienhebuterne/customcraft/CustomCraft.java index 577243a..85a54b4 100644 --- a/common/src/main/java/fr/fabienhebuterne/customcraft/CustomCraft.java +++ b/common/src/main/java/fr/fabienhebuterne/customcraft/CustomCraft.java @@ -1,7 +1,6 @@ package fr.fabienhebuterne.customcraft; import fr.fabienhebuterne.customcraft.commands.factory.CallCommandFactoryInit; -import fr.fabienhebuterne.customcraft.domain.CustomCraftEnchantment; import fr.fabienhebuterne.customcraft.domain.PrepareCustomCraft; import fr.fabienhebuterne.customcraft.domain.config.ConfigService; import fr.fabienhebuterne.customcraft.domain.config.CustomCraftConfig; @@ -10,12 +9,12 @@ import fr.fabienhebuterne.customcraft.domain.recipe.RecipeLoadService; import fr.fabienhebuterne.customcraft.listeners.InventoryClickEventListener; import fr.fabienhebuterne.customcraft.listeners.PlayerInteractEventListener; -import fr.fabienhebuterne.customcraft.nms.BaseReflection; import fr.fabienhebuterne.customcraft.nms.ItemStackSerializer; import fr.fabienhebuterne.customcraft.nms.NmsLoader; -import org.bukkit.NamespacedKey; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import java.io.IOException; @@ -34,9 +33,10 @@ public class CustomCraft extends JavaPlugin { // TODO : Maybe HashMap> tmpData ? private HashMap tmpData = new HashMap<>(); - public CustomCraftEnchantment customCraftEnchantment; + public Enchantment customCraftEnchantment; public static final String PLUGIN_NAME = "CustomCraft"; + public static Plugin plugin; @Override public void onDisable() { @@ -44,10 +44,10 @@ public void onDisable() { @Override public void onEnable() { - customCraftEnchantment = new CustomCraftEnchantment(new NamespacedKey(this, PLUGIN_NAME)); - BaseReflection.enchantmentRegistration(customCraftEnchantment); - - this.itemStackSerializer = NmsLoader.loadNms(this); + plugin = this; + this.itemStackSerializer = NmsLoader.loadNms(); + this.itemStackSerializer.loadCustomCraftEnchantment(); + this.customCraftEnchantment = this.itemStackSerializer.getCustomCraftEnchantment(); // TODO : Add brigadier lib to implement command autocompletion in game try { diff --git a/common/src/main/java/fr/fabienhebuterne/customcraft/json/ItemStackAdapter.java b/common/src/main/java/fr/fabienhebuterne/customcraft/json/ItemStackAdapter.java index 28c8b8d..8f663e8 100644 --- a/common/src/main/java/fr/fabienhebuterne/customcraft/json/ItemStackAdapter.java +++ b/common/src/main/java/fr/fabienhebuterne/customcraft/json/ItemStackAdapter.java @@ -8,22 +8,28 @@ import java.lang.reflect.Type; public class ItemStackAdapter implements JsonSerializer, JsonDeserializer { - private final Gson gson; + private Gson gson; private final ItemStackSerializer itemStackSerializer; public ItemStackAdapter() { - this.itemStackSerializer = NmsLoader.loadNms(null); + this.itemStackSerializer = NmsLoader.loadNms(); this.gson = new GsonBuilder().create(); } @Override public ItemStack deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException { + if (this.gson == null) { + this.gson = new GsonBuilder().create(); + } String itemStackBase64 = this.gson.fromJson(jsonElement, String.class); return this.itemStackSerializer.deserializeItemStack(itemStackBase64); } @Override public JsonElement serialize(ItemStack itemStack, Type type, JsonSerializationContext context) { + if (this.gson == null) { + this.gson = new GsonBuilder().create(); + } String base64 = this.itemStackSerializer.serializeItemStack(itemStack); return this.gson.toJsonTree(base64); } diff --git a/common/src/main/java/fr/fabienhebuterne/customcraft/json/ItemStackMapKeyAdapter.java b/common/src/main/java/fr/fabienhebuterne/customcraft/json/ItemStackMapKeyAdapter.java index ebf8eb7..80d7e00 100644 --- a/common/src/main/java/fr/fabienhebuterne/customcraft/json/ItemStackMapKeyAdapter.java +++ b/common/src/main/java/fr/fabienhebuterne/customcraft/json/ItemStackMapKeyAdapter.java @@ -2,6 +2,7 @@ import com.google.common.reflect.TypeToken; import com.google.gson.*; +import fr.fabienhebuterne.customcraft.CustomCraft; import fr.fabienhebuterne.customcraft.domain.config.OptionItemStackConfig; import fr.fabienhebuterne.customcraft.nms.ItemStackSerializer; import fr.fabienhebuterne.customcraft.nms.NmsLoader; @@ -17,7 +18,7 @@ public class ItemStackMapKeyAdapter implements JsonSerializer new ItemStackSerializer_1_18_R2(); - case "v1_19_R1" -> new ItemStackSerializer_1_19_R1(); - case "v1_19_R2" -> new ItemStackSerializer_1_19_R2(); - case "v1_19_R3" -> new ItemStackSerializer_1_19_R3(); - case "v1_20_R1" -> new ItemStackSerializer_1_20_R1(); - case "v1_20_R2" -> new ItemStackSerializer_1_20_R2(); - case "v1_20_R3" -> new ItemStackSerializer_1_20_R3(); + case "v1_18_R2" -> new ItemStackSerializer_1_18_R2(namespacedKey); + case "v1_19_R1" -> new ItemStackSerializer_1_19_R1(namespacedKey); + case "v1_19_R2" -> new ItemStackSerializer_1_19_R2(namespacedKey); + case "v1_19_R3" -> new ItemStackSerializer_1_19_R3(namespacedKey); + case "v1_20_R1" -> new ItemStackSerializer_1_20_R1(namespacedKey); + case "v1_20_R2" -> new ItemStackSerializer_1_20_R2(namespacedKey); + case "v1_20_R3" -> new ItemStackSerializer_1_20_R3(namespacedKey); default -> { Bukkit.getLogger().severe("Your server version isn't compatible with CustomCraft"); if (plugin != null) { diff --git a/install-dependency-in-cache.sh b/install-dependency-in-cache.sh index 1a4f128..7152cd8 100644 --- a/install-dependency-in-cache.sh +++ b/install-dependency-in-cache.sh @@ -21,6 +21,7 @@ versionsMd5=( '1.20.1:spigot-1.20.1-R0.1-SNAPSHOT.jar:9424a0c2ab2937e2087f04ea3104d638' '1.20.2:spigot-1.20.2-R0.1-SNAPSHOT.jar:e7c864e4a13e2486e4509bf8cc89af3e' '1.20.4:spigot-1.20.4-R0.1-SNAPSHOT.jar:44282b85c0c886d5abb812b13c8667de' + '1.20.4:datafixerupper-6.0.8.jar:d20e6e9dedd37803586d8b134730655f' ) for versionWithMd5 in "${versionsMd5[@]}"; do diff --git a/nms/interfaces/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer.java b/nms/interfaces/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer.java index 1369da6..8521863 100644 --- a/nms/interfaces/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer.java +++ b/nms/interfaces/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer.java @@ -1,8 +1,11 @@ package fr.fabienhebuterne.customcraft.nms; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; public interface ItemStackSerializer { - public String serializeItemStack(ItemStack itemStack); - public ItemStack deserializeItemStack(String itemStack); + String serializeItemStack(ItemStack itemStack); + ItemStack deserializeItemStack(String itemStack); + void loadCustomCraftEnchantment(); + Enchantment getCustomCraftEnchantment(); } diff --git a/nms/v1_18_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java b/nms/v1_18_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java new file mode 100644 index 0000000..88baab4 --- /dev/null +++ b/nms/v1_18_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java @@ -0,0 +1,52 @@ +package fr.fabienhebuterne.customcraft.nms; + +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.inventory.ItemStack; + +public class CustomCraftEnchantment extends Enchantment { + public CustomCraftEnchantment(NamespacedKey key) { + super(key); + } + + @Override + public String getName() { + return getKey().getKey(); + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public int getStartLevel() { + return 1; + } + + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.ALL; + } + + @Override + public boolean isTreasure() { + return false; + } + + @Override + public boolean isCursed() { + return false; + } + + @Override + public boolean conflictsWith(Enchantment other) { + return false; + } + + @Override + public boolean canEnchantItem(ItemStack item) { + return true; + } +} diff --git a/nms/v1_18_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_18_R2.java b/nms/v1_18_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_18_R2.java index 55aabff..9a39065 100644 --- a/nms/v1_18_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_18_R2.java +++ b/nms/v1_18_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_18_R2.java @@ -3,14 +3,24 @@ import com.google.common.io.BaseEncoding; import net.minecraft.nbt.NBTCompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.lang.reflect.Field; public class ItemStackSerializer_1_18_R2 implements ItemStackSerializer { + + CustomCraftEnchantment customCraftEnchantment; + + ItemStackSerializer_1_18_R2(NamespacedKey namespacedKey) { + customCraftEnchantment = new CustomCraftEnchantment(namespacedKey); + } + @Override public String serializeItemStack(ItemStack itemStack) { if (itemStack == null) { @@ -50,4 +60,25 @@ public ItemStack deserializeItemStack(String itemStack) { return null; } + + @Override + public void loadCustomCraftEnchantment() { + + try { + Field acceptNewEnchantement = Enchantment.class.getDeclaredField("acceptingNew"); + acceptNewEnchantement.setAccessible(true); + acceptNewEnchantement.set(null, true); + Enchantment.registerEnchantment(customCraftEnchantment); + } catch (Exception e) { + e.printStackTrace(); + } finally { + Enchantment.stopAcceptingRegistrations(); + } + } + + @Override + public Enchantment getCustomCraftEnchantment() { + return customCraftEnchantment; + } + } diff --git a/nms/v1_19_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java b/nms/v1_19_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java new file mode 100644 index 0000000..88baab4 --- /dev/null +++ b/nms/v1_19_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java @@ -0,0 +1,52 @@ +package fr.fabienhebuterne.customcraft.nms; + +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.inventory.ItemStack; + +public class CustomCraftEnchantment extends Enchantment { + public CustomCraftEnchantment(NamespacedKey key) { + super(key); + } + + @Override + public String getName() { + return getKey().getKey(); + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public int getStartLevel() { + return 1; + } + + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.ALL; + } + + @Override + public boolean isTreasure() { + return false; + } + + @Override + public boolean isCursed() { + return false; + } + + @Override + public boolean conflictsWith(Enchantment other) { + return false; + } + + @Override + public boolean canEnchantItem(ItemStack item) { + return true; + } +} diff --git a/nms/v1_19_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R1.java b/nms/v1_19_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R1.java index 2dcb486..fcae7b2 100644 --- a/nms/v1_19_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R1.java +++ b/nms/v1_19_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R1.java @@ -3,14 +3,24 @@ import com.google.common.io.BaseEncoding; import net.minecraft.nbt.NBTCompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.lang.reflect.Field; public class ItemStackSerializer_1_19_R1 implements ItemStackSerializer { + + CustomCraftEnchantment customCraftEnchantment; + + ItemStackSerializer_1_19_R1(NamespacedKey namespacedKey) { + customCraftEnchantment = new CustomCraftEnchantment(namespacedKey); + } + @Override public String serializeItemStack(ItemStack itemStack) { if (itemStack == null) { @@ -50,4 +60,23 @@ public ItemStack deserializeItemStack(String itemStack) { return null; } + + @Override + public void loadCustomCraftEnchantment() { + try { + Field acceptNewEnchantement = Enchantment.class.getDeclaredField("acceptingNew"); + acceptNewEnchantement.setAccessible(true); + acceptNewEnchantement.set(null, true); + Enchantment.registerEnchantment(customCraftEnchantment); + } catch (Exception e) { + e.printStackTrace(); + } finally { + Enchantment.stopAcceptingRegistrations(); + } + } + + @Override + public Enchantment getCustomCraftEnchantment() { + return customCraftEnchantment; + } } diff --git a/nms/v1_19_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java b/nms/v1_19_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java new file mode 100644 index 0000000..88baab4 --- /dev/null +++ b/nms/v1_19_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java @@ -0,0 +1,52 @@ +package fr.fabienhebuterne.customcraft.nms; + +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.inventory.ItemStack; + +public class CustomCraftEnchantment extends Enchantment { + public CustomCraftEnchantment(NamespacedKey key) { + super(key); + } + + @Override + public String getName() { + return getKey().getKey(); + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public int getStartLevel() { + return 1; + } + + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.ALL; + } + + @Override + public boolean isTreasure() { + return false; + } + + @Override + public boolean isCursed() { + return false; + } + + @Override + public boolean conflictsWith(Enchantment other) { + return false; + } + + @Override + public boolean canEnchantItem(ItemStack item) { + return true; + } +} diff --git a/nms/v1_19_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R2.java b/nms/v1_19_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R2.java index 3f1efa0..937ff27 100644 --- a/nms/v1_19_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R2.java +++ b/nms/v1_19_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R2.java @@ -3,14 +3,24 @@ import com.google.common.io.BaseEncoding; import net.minecraft.nbt.NBTCompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.lang.reflect.Field; public class ItemStackSerializer_1_19_R2 implements ItemStackSerializer { + + CustomCraftEnchantment customCraftEnchantment; + + ItemStackSerializer_1_19_R2(NamespacedKey namespacedKey) { + customCraftEnchantment = new CustomCraftEnchantment(namespacedKey); + } + @Override public String serializeItemStack(ItemStack itemStack) { if (itemStack == null) { @@ -50,4 +60,23 @@ public ItemStack deserializeItemStack(String itemStack) { return null; } + + @Override + public void loadCustomCraftEnchantment() { + try { + Field acceptNewEnchantement = Enchantment.class.getDeclaredField("acceptingNew"); + acceptNewEnchantement.setAccessible(true); + acceptNewEnchantement.set(null, true); + Enchantment.registerEnchantment(customCraftEnchantment); + } catch (Exception e) { + e.printStackTrace(); + } finally { + Enchantment.stopAcceptingRegistrations(); + } + } + + @Override + public Enchantment getCustomCraftEnchantment() { + return customCraftEnchantment; + } } diff --git a/nms/v1_19_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java b/nms/v1_19_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java new file mode 100644 index 0000000..88baab4 --- /dev/null +++ b/nms/v1_19_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java @@ -0,0 +1,52 @@ +package fr.fabienhebuterne.customcraft.nms; + +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.inventory.ItemStack; + +public class CustomCraftEnchantment extends Enchantment { + public CustomCraftEnchantment(NamespacedKey key) { + super(key); + } + + @Override + public String getName() { + return getKey().getKey(); + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public int getStartLevel() { + return 1; + } + + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.ALL; + } + + @Override + public boolean isTreasure() { + return false; + } + + @Override + public boolean isCursed() { + return false; + } + + @Override + public boolean conflictsWith(Enchantment other) { + return false; + } + + @Override + public boolean canEnchantItem(ItemStack item) { + return true; + } +} diff --git a/nms/v1_19_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R3.java b/nms/v1_19_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R3.java index 1951e77..f354fb8 100644 --- a/nms/v1_19_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R3.java +++ b/nms/v1_19_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_19_R3.java @@ -3,14 +3,24 @@ import com.google.common.io.BaseEncoding; import net.minecraft.nbt.NBTCompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.lang.reflect.Field; public class ItemStackSerializer_1_19_R3 implements ItemStackSerializer { + + CustomCraftEnchantment customCraftEnchantment; + + ItemStackSerializer_1_19_R3(NamespacedKey namespacedKey) { + customCraftEnchantment = new CustomCraftEnchantment(namespacedKey); + } + @Override public String serializeItemStack(ItemStack itemStack) { if (itemStack == null) { @@ -50,4 +60,23 @@ public ItemStack deserializeItemStack(String itemStack) { return null; } + + @Override + public void loadCustomCraftEnchantment() { + try { + Field acceptNewEnchantement = Enchantment.class.getDeclaredField("acceptingNew"); + acceptNewEnchantement.setAccessible(true); + acceptNewEnchantement.set(null, true); + Enchantment.registerEnchantment(customCraftEnchantment); + } catch (Exception e) { + e.printStackTrace(); + } finally { + Enchantment.stopAcceptingRegistrations(); + } + } + + @Override + public Enchantment getCustomCraftEnchantment() { + return customCraftEnchantment; + } } diff --git a/nms/v1_20_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java b/nms/v1_20_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java new file mode 100644 index 0000000..88baab4 --- /dev/null +++ b/nms/v1_20_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java @@ -0,0 +1,52 @@ +package fr.fabienhebuterne.customcraft.nms; + +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.inventory.ItemStack; + +public class CustomCraftEnchantment extends Enchantment { + public CustomCraftEnchantment(NamespacedKey key) { + super(key); + } + + @Override + public String getName() { + return getKey().getKey(); + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public int getStartLevel() { + return 1; + } + + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.ALL; + } + + @Override + public boolean isTreasure() { + return false; + } + + @Override + public boolean isCursed() { + return false; + } + + @Override + public boolean conflictsWith(Enchantment other) { + return false; + } + + @Override + public boolean canEnchantItem(ItemStack item) { + return true; + } +} diff --git a/nms/v1_20_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R1.java b/nms/v1_20_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R1.java index 2f5f8ec..ce93ade 100644 --- a/nms/v1_20_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R1.java +++ b/nms/v1_20_R1/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R1.java @@ -3,14 +3,24 @@ import com.google.common.io.BaseEncoding; import net.minecraft.nbt.NBTCompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.lang.reflect.Field; public class ItemStackSerializer_1_20_R1 implements ItemStackSerializer { + + CustomCraftEnchantment customCraftEnchantment; + + ItemStackSerializer_1_20_R1(NamespacedKey namespacedKey) { + customCraftEnchantment = new CustomCraftEnchantment(namespacedKey); + } + @Override public String serializeItemStack(ItemStack itemStack) { if (itemStack == null) { @@ -50,4 +60,23 @@ public ItemStack deserializeItemStack(String itemStack) { return null; } + + @Override + public void loadCustomCraftEnchantment() { + try { + Field acceptNewEnchantement = Enchantment.class.getDeclaredField("acceptingNew"); + acceptNewEnchantement.setAccessible(true); + acceptNewEnchantement.set(null, true); + Enchantment.registerEnchantment(customCraftEnchantment); + } catch (Exception e) { + e.printStackTrace(); + } finally { + Enchantment.stopAcceptingRegistrations(); + } + } + + @Override + public Enchantment getCustomCraftEnchantment() { + return customCraftEnchantment; + } } diff --git a/nms/v1_20_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java b/nms/v1_20_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java new file mode 100644 index 0000000..88baab4 --- /dev/null +++ b/nms/v1_20_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantment.java @@ -0,0 +1,52 @@ +package fr.fabienhebuterne.customcraft.nms; + +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.inventory.ItemStack; + +public class CustomCraftEnchantment extends Enchantment { + public CustomCraftEnchantment(NamespacedKey key) { + super(key); + } + + @Override + public String getName() { + return getKey().getKey(); + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public int getStartLevel() { + return 1; + } + + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.ALL; + } + + @Override + public boolean isTreasure() { + return false; + } + + @Override + public boolean isCursed() { + return false; + } + + @Override + public boolean conflictsWith(Enchantment other) { + return false; + } + + @Override + public boolean canEnchantItem(ItemStack item) { + return true; + } +} diff --git a/nms/v1_20_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R2.java b/nms/v1_20_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R2.java index 340a415..e26a85a 100644 --- a/nms/v1_20_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R2.java +++ b/nms/v1_20_R2/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R2.java @@ -3,14 +3,24 @@ import com.google.common.io.BaseEncoding; import net.minecraft.nbt.NBTCompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.lang.reflect.Field; public class ItemStackSerializer_1_20_R2 implements ItemStackSerializer { + + CustomCraftEnchantment customCraftEnchantment; + + ItemStackSerializer_1_20_R2(NamespacedKey namespacedKey) { + customCraftEnchantment = new CustomCraftEnchantment(namespacedKey); + } + @Override public String serializeItemStack(ItemStack itemStack) { if (itemStack == null) { @@ -50,4 +60,23 @@ public ItemStack deserializeItemStack(String itemStack) { return null; } + + @Override + public void loadCustomCraftEnchantment() { + try { + Field acceptNewEnchantement = Enchantment.class.getDeclaredField("acceptingNew"); + acceptNewEnchantement.setAccessible(true); + acceptNewEnchantement.set(null, true); + Enchantment.registerEnchantment(customCraftEnchantment); + } catch (Exception e) { + e.printStackTrace(); + } finally { + Enchantment.stopAcceptingRegistrations(); + } + } + + @Override + public Enchantment getCustomCraftEnchantment() { + return customCraftEnchantment; + } } diff --git a/nms/v1_20_R3/build.gradle.kts b/nms/v1_20_R3/build.gradle.kts index 1c5f708..9e982df 100644 --- a/nms/v1_20_R3/build.gradle.kts +++ b/nms/v1_20_R3/build.gradle.kts @@ -6,4 +6,5 @@ dependencies { implementation(project(":nms:interfaces")) compileOnly("org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT") compileOnly(files("../../tmp/1.20.4/spigot-1.20.4-R0.1-SNAPSHOT.jar")) + compileOnly(files("../../tmp/1.20.4/datafixerupper-6.0.8.jar")) } \ No newline at end of file diff --git a/nms/v1_20_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantmentLegacy.java b/nms/v1_20_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantmentLegacy.java new file mode 100644 index 0000000..2b386dc --- /dev/null +++ b/nms/v1_20_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantmentLegacy.java @@ -0,0 +1,61 @@ +package fr.fabienhebuterne.customcraft.nms; + +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.enchantments.EnchantmentTarget; +import org.bukkit.inventory.ItemStack; + +public class CustomCraftEnchantmentLegacy extends Enchantment { + + private NamespacedKey key; + + public CustomCraftEnchantmentLegacy(NamespacedKey key) { + super(); + this.key = key; + } + + @Override + public String getName() { + return getKey().getKey(); + } + + @Override + public int getMaxLevel() { + return 1; + } + + @Override + public int getStartLevel() { + return 1; + } + + @Override + public EnchantmentTarget getItemTarget() { + return EnchantmentTarget.ALL; + } + + @Override + public boolean isTreasure() { + return false; + } + + @Override + public boolean isCursed() { + return false; + } + + @Override + public boolean conflictsWith(Enchantment other) { + return false; + } + + @Override + public boolean canEnchantItem(ItemStack item) { + return true; + } + + @Override + public NamespacedKey getKey() { + return key; + } +} diff --git a/nms/v1_20_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantmentVanilla.java b/nms/v1_20_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantmentVanilla.java new file mode 100644 index 0000000..b9223ad --- /dev/null +++ b/nms/v1_20_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/CustomCraftEnchantmentVanilla.java @@ -0,0 +1,13 @@ +package fr.fabienhebuterne.customcraft.nms; + +import net.minecraft.world.entity.EnumItemSlot; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentSlotType; + +public class CustomCraftEnchantmentVanilla extends Enchantment { + + public CustomCraftEnchantmentVanilla() { + super(Rarity.d, EnchantmentSlotType.n, new EnumItemSlot[]{}); + } + +} diff --git a/nms/v1_20_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R3.java b/nms/v1_20_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R3.java index cae36fb..78e0863 100644 --- a/nms/v1_20_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R3.java +++ b/nms/v1_20_R3/src/main/java/fr/fabienhebuterne/customcraft/nms/ItemStackSerializer_1_20_R3.java @@ -1,17 +1,31 @@ package fr.fabienhebuterne.customcraft.nms; import com.google.common.io.BaseEncoding; +import net.minecraft.core.IRegistry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.NBTCompressedStreamTools; import net.minecraft.nbt.NBTReadLimiter; import net.minecraft.nbt.NBTTagCompound; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.lang.reflect.Field; +import java.util.IdentityHashMap; public class ItemStackSerializer_1_20_R3 implements ItemStackSerializer { + + CustomCraftEnchantmentLegacy customCraftEnchantment; + + ItemStackSerializer_1_20_R3(NamespacedKey namespacedKey) { + customCraftEnchantment = new CustomCraftEnchantmentLegacy(namespacedKey); + } + @Override public String serializeItemStack(ItemStack itemStack) { if (itemStack == null) { @@ -51,4 +65,33 @@ public ItemStack deserializeItemStack(String itemStack) { return null; } + + @Override + public void loadCustomCraftEnchantment() { + Bukkit.getLogger().info("[CUSTOMCRAFT] Start to loaded custom enchantment"); + // unfreeze registry + try { + Field enchantFreezeField = BuiltInRegistries.f.getClass().getDeclaredField("l"); + enchantFreezeField.setAccessible(true); + enchantFreezeField.setBoolean(BuiltInRegistries.f, false); + Field enchantMapField = BuiltInRegistries.f.getClass().getDeclaredField("m"); + enchantMapField.setAccessible(true); + enchantMapField.set(BuiltInRegistries.f, new IdentityHashMap<>()); + } catch (IllegalAccessException | NoSuchFieldException e) { + throw new RuntimeException(e); + } + + // init nms enchant + CustomCraftEnchantmentVanilla customCraftEnchantment = new CustomCraftEnchantmentVanilla(); + IRegistry.a(BuiltInRegistries.f, "customcraft:customcraft", customCraftEnchantment); + + // freeze registry + BuiltInRegistries.f.l(); + Bukkit.getLogger().info("[CUSTOMCRAFT] Finish to loaded custom enchantment"); + } + + @Override + public Enchantment getCustomCraftEnchantment() { + return customCraftEnchantment; + } }