Skip to content

Commit

Permalink
fix : issue with CustomCraft hidden enchantment
Browse files Browse the repository at this point in the history
  • Loading branch information
fhebuterne committed Feb 27, 2024
1 parent 4f0dd1e commit c5c654d
Show file tree
Hide file tree
Showing 23 changed files with 646 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -34,20 +33,21 @@ public class CustomCraft extends JavaPlugin {
// TODO : Maybe HashMap<UUID, HashMap<ActionType, T>> tmpData ?
private HashMap<UUID, PrepareCustomCraft> tmpData = new HashMap<>();

public CustomCraftEnchantment customCraftEnchantment;
public Enchantment customCraftEnchantment;

public static final String PLUGIN_NAME = "CustomCraft";
public static Plugin plugin;

@Override
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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,28 @@
import java.lang.reflect.Type;

public class ItemStackAdapter implements JsonSerializer<ItemStack>, JsonDeserializer<ItemStack> {
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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -17,7 +18,7 @@ public class ItemStackMapKeyAdapter implements JsonSerializer<HashMap<ItemStack,
private final ItemStackSerializer itemStackSerializer;

public ItemStackMapKeyAdapter() {
this.itemStackSerializer = NmsLoader.loadNms(null);
this.itemStackSerializer = NmsLoader.loadNms();
this.gson = new GsonBuilder().create();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.google.common.reflect.TypeToken;
import com.google.gson.*;
import fr.fabienhebuterne.customcraft.CustomCraft;
import fr.fabienhebuterne.customcraft.nms.ItemStackSerializer;
import fr.fabienhebuterne.customcraft.nms.NmsLoader;
import org.bukkit.inventory.ItemStack;
Expand All @@ -16,7 +17,7 @@ public class ItemStackMapValueAdapter implements JsonSerializer<HashMap<Integer,
private final ItemStackSerializer itemStackSerializer;

public ItemStackMapValueAdapter() {
this.itemStackSerializer = NmsLoader.loadNms(null);
this.itemStackSerializer = NmsLoader.loadNms();
this.gson = new GsonBuilder().create();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package fr.fabienhebuterne.customcraft.nms;

import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.NamespacedKey;

import static fr.fabienhebuterne.customcraft.CustomCraft.PLUGIN_NAME;
import static fr.fabienhebuterne.customcraft.CustomCraft.plugin;

public class NmsLoader {

public static ItemStackSerializer loadNms(Plugin plugin) {
public static ItemStackSerializer loadNms() {
String currentVersion = Bukkit.getServer().getClass().getPackage().getName()
.replace(".", ",").split(",")[3];

Expand All @@ -16,14 +19,16 @@ public static ItemStackSerializer loadNms(Plugin plugin) {
}
}

NamespacedKey namespacedKey = new NamespacedKey(plugin, PLUGIN_NAME);

return switch (currentVersion) {
case "v1_18_R2" -> 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) {
Expand Down
1 change: 1 addition & 0 deletions install-dependency-in-cache.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
}
Loading

0 comments on commit c5c654d

Please sign in to comment.