Skip to content

Commit d87abbe

Browse files
committed
Moved villager trade display off to NMS proxy
1 parent c6fef37 commit d87abbe

File tree

6 files changed

+212
-46
lines changed

6 files changed

+212
-46
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.willfp.eco.core.proxy.v1_15_R1;
2+
3+
import com.willfp.eco.core.proxy.proxies.VillagerTradeProxy;
4+
import com.willfp.ecoenchants.display.EnchantDisplay;
5+
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
6+
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftMerchantRecipe;
7+
import org.bukkit.inventory.ItemStack;
8+
import org.bukkit.inventory.MerchantRecipe;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
import java.lang.reflect.Field;
12+
import java.lang.reflect.Modifier;
13+
14+
public final class VillagerTrade implements VillagerTradeProxy {
15+
@Override
16+
public void displayTradeEnchantments(@NotNull final MerchantRecipe merchantRecipe) {
17+
try {
18+
// Enables removing final modifier
19+
Field modifiersField = Field.class.getDeclaredField("modifiers");
20+
modifiersField.setAccessible(true);
21+
22+
// Bukkit MerchantRecipe result
23+
Field fResult = MerchantRecipe.class.getDeclaredField("result");
24+
fResult.setAccessible(true);
25+
ItemStack result = EnchantDisplay.displayEnchantments(merchantRecipe.getResult());
26+
EnchantDisplay.addV(result);
27+
fResult.set(merchantRecipe, result);
28+
29+
// Get NMS MerchantRecipe from CraftMerchantRecipe
30+
Field fHandle = CraftMerchantRecipe.class.getDeclaredField("handle");
31+
fHandle.setAccessible(true);
32+
net.minecraft.server.v1_15_R1.MerchantRecipe handle = (net.minecraft.server.v1_15_R1.MerchantRecipe) fHandle.get(merchantRecipe); // NMS Recipe
33+
modifiersField.setInt(fHandle, fHandle.getModifiers() & ~Modifier.FINAL); // Remove final
34+
35+
Field fSelling = net.minecraft.server.v1_15_R1.MerchantRecipe.class.getDeclaredField("sellingItem");
36+
fSelling.setAccessible(true);
37+
modifiersField.setInt(fSelling, fSelling.getModifiers() & ~Modifier.FINAL);
38+
39+
ItemStack selling = CraftItemStack.asBukkitCopy(handle.sellingItem);
40+
EnchantDisplay.displayEnchantments(selling);
41+
EnchantDisplay.addV(selling);
42+
43+
fSelling.set(handle, CraftItemStack.asNMSCopy(selling));
44+
} catch (IllegalAccessException | NoSuchFieldException e) {
45+
e.printStackTrace();
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.willfp.eco.core.proxy.v1_16_R1;
2+
3+
import com.willfp.eco.core.proxy.proxies.VillagerTradeProxy;
4+
import com.willfp.ecoenchants.display.EnchantDisplay;
5+
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack;
6+
import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftMerchantRecipe;
7+
import org.bukkit.inventory.ItemStack;
8+
import org.bukkit.inventory.MerchantRecipe;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
import java.lang.reflect.Field;
12+
import java.lang.reflect.Modifier;
13+
14+
public final class VillagerTrade implements VillagerTradeProxy {
15+
@Override
16+
public void displayTradeEnchantments(@NotNull final MerchantRecipe merchantRecipe) {
17+
try {
18+
// Enables removing final modifier
19+
Field modifiersField = Field.class.getDeclaredField("modifiers");
20+
modifiersField.setAccessible(true);
21+
22+
// Bukkit MerchantRecipe result
23+
Field fResult = MerchantRecipe.class.getDeclaredField("result");
24+
fResult.setAccessible(true);
25+
ItemStack result = EnchantDisplay.displayEnchantments(merchantRecipe.getResult());
26+
EnchantDisplay.addV(result);
27+
fResult.set(merchantRecipe, result);
28+
29+
// Get NMS MerchantRecipe from CraftMerchantRecipe
30+
Field fHandle = CraftMerchantRecipe.class.getDeclaredField("handle");
31+
fHandle.setAccessible(true);
32+
net.minecraft.server.v1_16_R1.MerchantRecipe handle = (net.minecraft.server.v1_16_R1.MerchantRecipe) fHandle.get(merchantRecipe); // NMS Recipe
33+
modifiersField.setInt(fHandle, fHandle.getModifiers() & ~Modifier.FINAL); // Remove final
34+
35+
Field fSelling = net.minecraft.server.v1_16_R1.MerchantRecipe.class.getDeclaredField("sellingItem");
36+
fSelling.setAccessible(true);
37+
modifiersField.setInt(fSelling, fSelling.getModifiers() & ~Modifier.FINAL);
38+
39+
ItemStack selling = CraftItemStack.asBukkitCopy(handle.sellingItem);
40+
EnchantDisplay.displayEnchantments(selling);
41+
EnchantDisplay.addV(selling);
42+
43+
fSelling.set(handle, CraftItemStack.asNMSCopy(selling));
44+
} catch (IllegalAccessException | NoSuchFieldException e) {
45+
e.printStackTrace();
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.willfp.eco.core.proxy.v1_16_R2;
2+
3+
import com.willfp.eco.core.proxy.proxies.VillagerTradeProxy;
4+
import com.willfp.ecoenchants.display.EnchantDisplay;
5+
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack;
6+
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftMerchantRecipe;
7+
import org.bukkit.inventory.ItemStack;
8+
import org.bukkit.inventory.MerchantRecipe;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
import java.lang.reflect.Field;
12+
import java.lang.reflect.Modifier;
13+
14+
public final class VillagerTrade implements VillagerTradeProxy {
15+
@Override
16+
public void displayTradeEnchantments(@NotNull final MerchantRecipe merchantRecipe) {
17+
try {
18+
// Enables removing final modifier
19+
Field modifiersField = Field.class.getDeclaredField("modifiers");
20+
modifiersField.setAccessible(true);
21+
22+
// Bukkit MerchantRecipe result
23+
Field fResult = MerchantRecipe.class.getDeclaredField("result");
24+
fResult.setAccessible(true);
25+
ItemStack result = EnchantDisplay.displayEnchantments(merchantRecipe.getResult());
26+
EnchantDisplay.addV(result);
27+
fResult.set(merchantRecipe, result);
28+
29+
// Get NMS MerchantRecipe from CraftMerchantRecipe
30+
Field fHandle = CraftMerchantRecipe.class.getDeclaredField("handle");
31+
fHandle.setAccessible(true);
32+
net.minecraft.server.v1_16_R2.MerchantRecipe handle = (net.minecraft.server.v1_16_R2.MerchantRecipe) fHandle.get(merchantRecipe); // NMS Recipe
33+
modifiersField.setInt(fHandle, fHandle.getModifiers() & ~Modifier.FINAL); // Remove final
34+
35+
Field fSelling = net.minecraft.server.v1_16_R2.MerchantRecipe.class.getDeclaredField("sellingItem");
36+
fSelling.setAccessible(true);
37+
modifiersField.setInt(fSelling, fSelling.getModifiers() & ~Modifier.FINAL);
38+
39+
ItemStack selling = CraftItemStack.asBukkitCopy(handle.sellingItem);
40+
EnchantDisplay.displayEnchantments(selling);
41+
EnchantDisplay.addV(selling);
42+
43+
fSelling.set(handle, CraftItemStack.asNMSCopy(selling));
44+
} catch (IllegalAccessException | NoSuchFieldException e) {
45+
e.printStackTrace();
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.willfp.eco.core.proxy.v1_16_R3;
2+
3+
import com.willfp.eco.core.proxy.proxies.VillagerTradeProxy;
4+
import com.willfp.ecoenchants.display.EnchantDisplay;
5+
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
6+
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftMerchantRecipe;
7+
import org.bukkit.inventory.ItemStack;
8+
import org.bukkit.inventory.MerchantRecipe;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
import java.lang.reflect.Field;
12+
import java.lang.reflect.Modifier;
13+
14+
public final class VillagerTrade implements VillagerTradeProxy {
15+
@Override
16+
public void displayTradeEnchantments(@NotNull final MerchantRecipe merchantRecipe) {
17+
try {
18+
// Enables removing final modifier
19+
Field modifiersField = Field.class.getDeclaredField("modifiers");
20+
modifiersField.setAccessible(true);
21+
22+
// Bukkit MerchantRecipe result
23+
Field fResult = MerchantRecipe.class.getDeclaredField("result");
24+
fResult.setAccessible(true);
25+
ItemStack result = EnchantDisplay.displayEnchantments(merchantRecipe.getResult());
26+
EnchantDisplay.addV(result);
27+
fResult.set(merchantRecipe, result);
28+
29+
// Get NMS MerchantRecipe from CraftMerchantRecipe
30+
Field fHandle = CraftMerchantRecipe.class.getDeclaredField("handle");
31+
fHandle.setAccessible(true);
32+
net.minecraft.server.v1_16_R3.MerchantRecipe handle = (net.minecraft.server.v1_16_R3.MerchantRecipe) fHandle.get(merchantRecipe); // NMS Recipe
33+
modifiersField.setInt(fHandle, fHandle.getModifiers() & ~Modifier.FINAL); // Remove final
34+
35+
Field fSelling = net.minecraft.server.v1_16_R3.MerchantRecipe.class.getDeclaredField("sellingItem");
36+
fSelling.setAccessible(true);
37+
modifiersField.setInt(fSelling, fSelling.getModifiers() & ~Modifier.FINAL);
38+
39+
ItemStack selling = CraftItemStack.asBukkitCopy(handle.sellingItem);
40+
EnchantDisplay.displayEnchantments(selling);
41+
EnchantDisplay.addV(selling);
42+
43+
fSelling.set(handle, CraftItemStack.asNMSCopy(selling));
44+
} catch (IllegalAccessException | NoSuchFieldException e) {
45+
e.printStackTrace();
46+
}
47+
}
48+
}

eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketOpenWindowMerchant.java

+7-46
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,14 @@
22

33
import com.comphenix.protocol.PacketType;
44
import com.comphenix.protocol.events.PacketContainer;
5-
import com.willfp.eco.core.proxy.ProxyConstants;
6-
import com.willfp.eco.util.protocollib.AbstractPacketAdapter;
5+
import com.willfp.eco.core.proxy.proxies.VillagerTradeProxy;
6+
import com.willfp.eco.util.ProxyUtils;
77
import com.willfp.eco.util.plugin.AbstractEcoPlugin;
8-
import com.willfp.ecoenchants.display.EnchantDisplay;
8+
import com.willfp.eco.util.protocollib.AbstractPacketAdapter;
99
import com.willfp.ecoenchants.enchantments.meta.EnchantmentTarget;
10-
import org.bukkit.inventory.ItemStack;
1110
import org.bukkit.inventory.MerchantRecipe;
1211
import org.jetbrains.annotations.NotNull;
1312

14-
import java.lang.reflect.Field;
15-
import java.lang.reflect.InvocationTargetException;
16-
import java.lang.reflect.Modifier;
1713
import java.util.List;
1814
import java.util.stream.Collectors;
1915

@@ -32,46 +28,11 @@ public void onSend(@NotNull final PacketContainer packet) {
3228
List<MerchantRecipe> recipes = packet.getMerchantRecipeLists().readSafely(0);
3329

3430
recipes = recipes.stream().peek(merchantRecipe -> {
35-
try {
36-
if (!EnchantmentTarget.ALL.getMaterials().contains(merchantRecipe.getResult().getType())) {
37-
return;
38-
}
39-
40-
// Enables removing final modifier
41-
Field modifiersField = Field.class.getDeclaredField("modifiers");
42-
modifiersField.setAccessible(true);
43-
44-
// Bukkit MerchantRecipe result
45-
Field fResult = merchantRecipe.getClass().getSuperclass().getDeclaredField("result");
46-
fResult.setAccessible(true);
47-
ItemStack result = EnchantDisplay.displayEnchantments(merchantRecipe.getResult());
48-
result = EnchantDisplay.addV(result);
49-
fResult.set(merchantRecipe, result);
50-
51-
// Get NMS MerchantRecipe from CraftMerchantRecipe
52-
Field fHandle = merchantRecipe.getClass().getDeclaredField("handle");
53-
fHandle.setAccessible(true);
54-
Object handle = fHandle.get(merchantRecipe); // NMS Recipe
55-
modifiersField.setInt(fHandle, fHandle.getModifiers() & ~Modifier.FINAL); // Remove final
56-
57-
// NMS MerchantRecipe
58-
Field fSelling = fHandle.get(merchantRecipe).getClass().getDeclaredField("sellingItem");
59-
fSelling.setAccessible(true);
60-
Object selling = fSelling.get(handle); // NMS Selling ItemStack
61-
modifiersField.setInt(fSelling, fSelling.getModifiers() & ~Modifier.FINAL);
62-
63-
// Reflectively access CraftItemStack.class for respective version
64-
Class<?> craftItemStack = Class.forName("org.bukkit.craftbukkit." + ProxyConstants.NMS_VERSION + ".inventory.CraftItemStack");
65-
66-
// Bukkit Result ItemStack from NMS Result ItemStack
67-
ItemStack nmsSelling = (ItemStack) craftItemStack.getMethod("asBukkitCopy", selling.getClass()).invoke(null, selling);
68-
nmsSelling = EnchantDisplay.displayEnchantments(nmsSelling);
69-
nmsSelling = EnchantDisplay.addV(nmsSelling);
70-
fSelling.set(handle, craftItemStack.getMethod("asNMSCopy", ItemStack.class).invoke(null, nmsSelling));
71-
72-
} catch (IllegalAccessException | NoSuchFieldException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException e) {
73-
e.printStackTrace();
31+
if (!EnchantmentTarget.ALL.getMaterials().contains(merchantRecipe.getResult().getType())) {
32+
return;
7433
}
34+
35+
ProxyUtils.getProxy(VillagerTradeProxy.class).displayTradeEnchantments(merchantRecipe);
7536
}).collect(Collectors.toList());
7637

7738
packet.getMerchantRecipeLists().writeSafely(0, recipes);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.willfp.eco.core.proxy.proxies;
2+
3+
import com.willfp.eco.core.proxy.AbstractProxy;
4+
import org.bukkit.inventory.MerchantRecipe;
5+
6+
public interface VillagerTradeProxy extends AbstractProxy {
7+
/**
8+
* Apply enchant display to the result of trades.
9+
*
10+
* @param merchantRecipe The recipe to modify.
11+
*/
12+
void displayTradeEnchantments(MerchantRecipe merchantRecipe);
13+
}

0 commit comments

Comments
 (0)