Skip to content

Commit f89aa71

Browse files
authored
fix: method missmatched arguments (#34)
* fix: method missmatched arguments * feat: update item on pickup * chore: code style
1 parent 7ada618 commit f89aa71

File tree

8 files changed

+145
-11
lines changed

8 files changed

+145
-11
lines changed

zip-api/src/main/java/net/imprex/zip/api/ZIPBackpack.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ public interface ZIPBackpack {
99
void save();
1010

1111
void open(Player player);
12+
13+
void updateItem(ItemStack item);
1214

1315
boolean applyOnItem(ItemStack item);
1416

zip-api/src/main/java/net/imprex/zip/api/ZIPBackpackType.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package net.imprex.zip.api;
22

3+
import java.util.List;
4+
35
import org.bukkit.inventory.ItemStack;
46

57
public interface ZIPBackpackType {
@@ -8,11 +10,19 @@ public interface ZIPBackpackType {
810

911
ZIPBackpack create();
1012

13+
void updateItem(ItemStack item);
14+
1115
int getInventoryRows();
1216

1317
String getUniqueName();
1418

1519
String getDisplayName();
20+
21+
String getItemTexture();
22+
23+
List<String> getLore();
24+
25+
int getCustomModelData();
1626

1727
ItemStack getItem();
1828

zip-common/src/main/java/net/imprex/zip/common/ReflectionUtil.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import java.lang.reflect.Constructor;
44
import java.lang.reflect.Field;
55
import java.lang.reflect.Method;
6+
import java.util.Arrays;
7+
import java.util.HashSet;
8+
import java.util.Set;
69

710
public class ReflectionUtil {
811

@@ -104,6 +107,38 @@ public static Method getMethod(Class<?> clazz, String name, Class<?>... paramete
104107
}
105108
}
106109

110+
public static Method searchMethod(Class<?> clazz, Class<?> returnType, Class<?>... parameterTypes) {
111+
return findMethod(clazz, returnType, parameterTypes, new HashSet<Class<?>>());
112+
}
113+
114+
private static Method findMethod(Class<?> clazz, Class<?> returnType, Class<?>[] parameterTypes, Set<Class<?>> visitedClasses) {
115+
if (clazz == null || visitedClasses.contains(clazz)) {
116+
return null;
117+
}
118+
visitedClasses.add(clazz);
119+
120+
for (Method method : clazz.getDeclaredMethods()) {
121+
if (method.getReturnType().equals(returnType) && Arrays.equals(method.getParameterTypes(), parameterTypes)) {
122+
method.setAccessible(true);
123+
return method;
124+
}
125+
}
126+
127+
Method superClassMethod = findMethod(clazz.getSuperclass(), returnType, parameterTypes, visitedClasses);
128+
if (superClassMethod != null) {
129+
return superClassMethod;
130+
}
131+
132+
for (Class<?> interfaceClass : clazz.getInterfaces()) {
133+
Method interfaceMethod = findMethod(interfaceClass, returnType, parameterTypes, visitedClasses);
134+
if (interfaceMethod != null) {
135+
return interfaceMethod;
136+
}
137+
}
138+
139+
return null;
140+
}
141+
107142
public static Constructor<?> getConstructor(Class<?> clazz, Class<?>... parameterTypes) {
108143
try {
109144
return clazz.getConstructor(parameterTypes);

zip-nms/zip-nms-v1_21_R1/pom.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<dependency>
2222
<groupId>org.spigotmc</groupId>
2323
<artifactId>spigot</artifactId>
24-
<version>1.21-R0.1-SNAPSHOT</version>
24+
<version>1.21.1-R0.1-SNAPSHOT</version>
2525
<classifier>remapped-mojang</classifier>
2626
<scope>provided</scope>
2727
</dependency>
@@ -42,10 +42,10 @@
4242
<id>remap-obf</id>
4343
<configuration>
4444
<srgIn>
45-
org.spigotmc:minecraft-server:1.21-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
45+
org.spigotmc:minecraft-server:1.21.1-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
4646
<reverse>true</reverse>
4747
<remappedDependencies>
48-
org.spigotmc:spigot:1.21-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
48+
org.spigotmc:spigot:1.21.1-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
4949
<remappedArtifactAttached>true</remappedArtifactAttached>
5050
<remappedClassifierName>remapped-obf</remappedClassifierName>
5151
</configuration>
@@ -60,9 +60,9 @@
6060
<inputFile>
6161
${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
6262
<srgIn>
63-
org.spigotmc:minecraft-server:1.21-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
63+
org.spigotmc:minecraft-server:1.21.1-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
6464
<remappedDependencies>
65-
org.spigotmc:spigot:1.21-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
65+
org.spigotmc:spigot:1.21.1-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
6666
</configuration>
6767
</execution>
6868
</executions>

zip-nms/zip-nms-v1_21_R1/src/main/java/net/imprex/zip/nms/v1_21_R1/ZipNmsManager.java

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import java.io.ByteArrayInputStream;
44
import java.io.ByteArrayOutputStream;
5+
import java.lang.reflect.InvocationTargetException;
56
import java.lang.reflect.Method;
67
import java.util.ArrayList;
78
import java.util.List;
89
import java.util.Optional;
910
import java.util.UUID;
11+
import java.util.function.BiConsumer;
1012

1113
import org.bukkit.Material;
1214
import org.bukkit.craftbukkit.v1_21_R1.CraftRegistry;
@@ -25,19 +27,50 @@
2527
import net.minecraft.nbt.NbtAccounter;
2628
import net.minecraft.nbt.NbtIo;
2729
import net.minecraft.nbt.Tag;
30+
import net.minecraft.world.item.component.ResolvableProfile;
2831

2932
public class ZipNmsManager implements NmsManager {
3033

31-
private static final Class<?> CRAFTMETASKULL_CLASS = ReflectionUtil.getCraftBukkitClass("inventory.CraftMetaSkull");
32-
private static final Method CRAFTMETASKULL_SET_PROFILE = ReflectionUtil.getMethod(CRAFTMETASKULL_CLASS,
33-
"setProfile", GameProfile.class);
34+
private static final BiConsumer<SkullMeta, GameProfile> SET_PROFILE;
3435

3536
private static final RegistryAccess DEFAULT_REGISTRY = CraftRegistry.getMinecraftRegistry();
3637

3738
private static final CompoundTag NBT_EMPTY_ITEMSTACK = new CompoundTag();
3839

3940
static {
4041
NBT_EMPTY_ITEMSTACK.putString("id", "minecraft:air");
42+
43+
BiConsumer<SkullMeta, GameProfile> setProfile = (meta, profile) -> {
44+
throw new NullPointerException("Unable to find 'setProfile' method!");
45+
};
46+
47+
Class<?> craftMetaSkullClass = new ItemStack(Material.PLAYER_HEAD)
48+
.getItemMeta()
49+
.getClass();
50+
51+
Method setResolvableProfileMethod = ReflectionUtil.searchMethod(craftMetaSkullClass, void.class, ResolvableProfile.class);
52+
if (setResolvableProfileMethod != null) {
53+
setProfile = (meta, profile) -> {
54+
try {
55+
setResolvableProfileMethod.invoke(meta, new ResolvableProfile(profile));
56+
} catch (IllegalAccessException | InvocationTargetException e) {
57+
e.printStackTrace();
58+
}
59+
};
60+
} else {
61+
Method setProfileMethod = ReflectionUtil.searchMethod(craftMetaSkullClass, void.class, GameProfile.class);
62+
if (setProfileMethod != null) {
63+
setProfile = (meta, profile) -> {
64+
try {
65+
setProfileMethod.invoke(meta, profile);
66+
} catch (IllegalAccessException | InvocationTargetException e) {
67+
e.printStackTrace();
68+
}
69+
};
70+
}
71+
}
72+
73+
SET_PROFILE = setProfile;
4174
}
4275

4376
public byte[] nbtToBinary(CompoundTag compound) {
@@ -103,9 +136,10 @@ public void setSkullProfile(SkullMeta meta, String texture) {
103136
try {
104137
GameProfile gameProfile = new GameProfile(UUID.randomUUID(), "");
105138
gameProfile.getProperties().put("textures", new Property("textures", texture));
106-
CRAFTMETASKULL_SET_PROFILE.invoke(meta, gameProfile);
139+
140+
SET_PROFILE.accept(meta, gameProfile);
107141
} catch (Exception e) {
108-
throw new ClassCastException("Error by setting skull profile");
142+
e.printStackTrace();
109143
}
110144
}
111145

zip-plugin/src/main/java/net/imprex/zip/Backpack.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@ public void open(Player player) {
136136
}
137137
}
138138

139+
@Override
140+
public void updateItem(ItemStack item) {
141+
this.type.updateItem(item);
142+
}
143+
139144
@Override
140145
public boolean applyOnItem(ItemStack item) {
141146
if (item != null && item.hasItemMeta()) {

zip-plugin/src/main/java/net/imprex/zip/BackpackListener.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.bukkit.event.Listener;
77
import org.bukkit.event.block.Action;
88
import org.bukkit.event.block.BlockPlaceEvent;
9+
import org.bukkit.event.entity.EntityPickupItemEvent;
910
import org.bukkit.event.inventory.ClickType;
1011
import org.bukkit.event.inventory.CraftItemEvent;
1112
import org.bukkit.event.inventory.InventoryClickEvent;
@@ -81,9 +82,21 @@ public void onInventoryClose(InventoryCloseEvent event) {
8182
}
8283
}
8384

85+
@EventHandler(ignoreCancelled = false)
86+
public void onPlayerPickupItem(EntityPickupItemEvent event) {
87+
ItemStack item = event.getItem().getItemStack();
88+
Backpack backpack = this.backpackHandler.getBackpack(item);
89+
if (backpack != null) {
90+
// update backpack attributes on pickup
91+
// for example when the texture has changed
92+
backpack.updateItem(item);
93+
}
94+
}
95+
8496
@EventHandler(ignoreCancelled = false)
8597
public void onPlayerDropItem(PlayerDropItemEvent event) {
86-
Backpack backpack = this.backpackHandler.getBackpack(event.getItemDrop().getItemStack());
98+
ItemStack item = event.getItemDrop().getItemStack();
99+
Backpack backpack = this.backpackHandler.getBackpack(item);
87100
if (backpack != null) {
88101
event.getPlayer().closeInventory();
89102
}

zip-plugin/src/main/java/net/imprex/zip/BackpackType.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package net.imprex.zip;
22

3+
import java.util.Collections;
4+
import java.util.List;
5+
36
import org.bukkit.Material;
47
import org.bukkit.inventory.ItemStack;
8+
import org.bukkit.inventory.meta.ItemMeta;
9+
import org.bukkit.inventory.meta.SkullMeta;
510
import org.bukkit.persistence.PersistentDataType;
611

712
import net.imprex.zip.api.ZIPBackpackType;
@@ -42,6 +47,21 @@ public ItemStack createItem() {
4247
public Backpack create() {
4348
return new Backpack(this.plugin, this, null);
4449
}
50+
51+
@Override
52+
public void updateItem(ItemStack item) {
53+
if (item != null && item.hasItemMeta()) {
54+
ItemMeta meta = item.getItemMeta();
55+
meta.setDisplayName(this.config.displayName);
56+
meta.setLore(this.config.lore);
57+
meta.setCustomModelData(this.config.customModelData);
58+
59+
if (meta instanceof SkullMeta skullMeta) {
60+
NmsInstance.setSkullProfile(skullMeta, this.config.texture);
61+
}
62+
item.setItemMeta(meta);
63+
}
64+
}
4565

4666
@Override
4767
public int getInventoryRows() {
@@ -57,6 +77,21 @@ public String getUniqueName() {
5777
public String getDisplayName() {
5878
return this.config.displayName;
5979
}
80+
81+
@Override
82+
public String getItemTexture() {
83+
return this.config.texture;
84+
}
85+
86+
@Override
87+
public List<String> getLore() {
88+
return Collections.unmodifiableList(this.config.lore);
89+
}
90+
91+
@Override
92+
public int getCustomModelData() {
93+
return this.config.customModelData;
94+
}
6095

6196
@Override
6297
public ItemStack getItem() {

0 commit comments

Comments
 (0)