Skip to content

Commit 7e4c850

Browse files
committed
bug fix
1 parent cb4824a commit 7e4c850

File tree

17 files changed

+145
-22
lines changed

17 files changed

+145
-22
lines changed

api/src/main/java/net/azisaba/loreeditor/api/util/ReflectionUtil.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,14 @@ public static boolean isModernNMS() {
8787
throw new RuntimeException(e);
8888
}
8989
}
90+
91+
public static void setField(@NotNull Object o, @NotNull String fieldName, @NotNull Object value) {
92+
try {
93+
Field field = o.getClass().getDeclaredField(fieldName);
94+
field.setAccessible(true);
95+
field.set(o, value);
96+
} catch (ReflectiveOperationException e) {
97+
throw new RuntimeException(e);
98+
}
99+
}
90100
}

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ plugins {
88

99
allprojects {
1010
group = "net.azisaba.loreeditor"
11-
version = "1.2.0"
11+
version = "1.2.1"
1212

1313
apply {
1414
plugin("java")

common/src/main/java/net/azisaba/loreeditor/common/network/PacketPreHandler.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ public PacketPreHandler(@NotNull Plugin plugin, @NotNull Player player) {
5050
public void channelRead(@NotNull ChannelHandlerContext ctx, @NotNull Object msg) throws Exception {
5151
// client -> server
5252
try {
53-
if (msg.getClass().getSimpleName().contains("SetCreativeSlot")) {
53+
if (msg.getClass().getSimpleName().contains("SetCreative")) {
5454
ServerboundSetCreativeSlot packet = ServerboundSetCreativeSlot.getInstance(msg);
5555
reverseProcessItemStack(packet.getItem());
56-
} else if (msg.getClass().getSimpleName().contains("WindowClick")) {
56+
} else if (msg.getClass().getSimpleName().contains("WindowClick") || msg.getClass().getSimpleName().contains("ContainerClick")) {
5757
ServerboundClickContainerSlot packet = ServerboundClickContainerSlot.getInstance(msg);
5858
reverseProcessItemStack(packet.getItem());
59-
} else if (msg.getClass().getSimpleName().contains("CloseWindow")) {
59+
} else if (msg.getClass().getSimpleName().contains("ContainerClose") || msg.getClass().getSimpleName().contains("WindowClose")) {
6060
if (player.getOpenInventory().getType() == InventoryType.MERCHANT) {
6161
// re-add lore after trading
6262
Bukkit.getScheduler().runTask(plugin, player::updateInventory);
@@ -75,23 +75,28 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)
7575
if (msg.getClass().getSimpleName().contains("WindowItems") || msg.getClass().getSimpleName().contains("ContainerSetContent")) {
7676
if (player.getOpenInventory().getType() != InventoryType.MERCHANT) {
7777
ClientboundWindowItems packet = ClientboundWindowItems.getInstance(msg);
78-
packet.getItems().forEach(i -> {
78+
packet.setItems(packet.getItems().stream().map(ItemStack::copy).peek(i -> {
7979
PROCESS_ITEM_PERF_COUNTER.recordStart();
8080
try {
8181
processItemStack(i);
8282
} finally {
8383
PROCESS_ITEM_PERF_COUNTER.recordEnd();
8484
}
85-
});
85+
}).collect(Collectors.toList()));
8686
}
8787
} else if (msg.getClass().getSimpleName().contains("SetSlot")) {
8888
if (player.getOpenInventory().getType() != InventoryType.MERCHANT) {
8989
ClientboundSetSlot packet = ClientboundSetSlot.getInstance(msg);
90-
PROCESS_ITEM_PERF_COUNTER.recordStart();
91-
try {
92-
processItemStack(packet.getItem());
93-
} finally {
94-
PROCESS_ITEM_PERF_COUNTER.recordEnd();
90+
ItemStack item = packet.getItem();
91+
if (item != null) {
92+
item = item.copy();
93+
PROCESS_ITEM_PERF_COUNTER.recordStart();
94+
try {
95+
processItemStack(item);
96+
} finally {
97+
PROCESS_ITEM_PERF_COUNTER.recordEnd();
98+
}
99+
packet.replaceItem(item);
95100
}
96101
}
97102
}
@@ -102,14 +107,14 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)
102107
}
103108

104109
public void processItemStack(@Nullable ItemStack item) {
105-
if (item == null) return;
110+
if (item == null || item.getCount() == 0) return;
106111
CompoundTag tag = item.getTag();
107112
boolean hadTag = tag != null;
108113
if (tag == null) {
109114
tag = CompoundTag.getInstance(null).constructor();
110115
}
111116
if (tag.hasKeyOfType("lore_editor", 10)) {
112-
reverseProcessItemStack(item);
117+
return;
113118
}
114119
CompoundTag loreEditorTag = CompoundTag.getInstance(null).constructor();
115120
AtomicReference<CompoundTag> displayTag = new AtomicReference<>(tag.getCompound("display"));

common/src/main/java/net/azisaba/loreeditor/common/network/packet/ClientboundSetSlot.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,10 @@ public interface ClientboundSetSlot {
1212

1313
@Nullable
1414
ItemStack getItem();
15+
16+
/**
17+
* Replaces the item tag/component. Other properties of the item stack are not guaranteed to be preserved.
18+
* @param item new item tag/component
19+
*/
20+
void replaceItem(@NotNull ItemStack item);
1521
}

common/src/main/java/net/azisaba/loreeditor/common/network/packet/ClientboundWindowItems.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ public interface ClientboundWindowItems {
1919
*/
2020
@NotNull
2121
List<ItemStack> getItems();
22+
23+
void setItems(@NotNull List<ItemStack> items);
2224
}

v1_15_R1/src/main/java/net/azisaba/loreeditor/v1_15_R1/network/packet/ClientboundSetSlotImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,9 @@ public ClientboundSetSlotImpl(PacketPlayOutSetSlot handle) {
2929
public @Nullable ItemStack getItem() {
3030
return ItemStackImpl.getInstance(ReflectionUtil.getField(handle, "c"));
3131
}
32+
33+
@Override
34+
public void replaceItem(@NotNull ItemStack item) {
35+
ReflectionUtil.setField(handle, "c", ((ItemStackImpl) item).getHandle());
36+
}
3237
}

v1_15_R1/src/main/java/net/azisaba/loreeditor/v1_15_R1/network/packet/ClientboundWindowItemsImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,13 @@ public ClientboundWindowItemsImpl(@NotNull PacketPlayOutWindowItems handle) {
3535
}
3636
return items;
3737
}
38+
39+
@Override
40+
public void setItems(@NotNull List<ItemStack> items) {
41+
List<Object> list = new ArrayList<>();
42+
for (ItemStack item : items) {
43+
list.add(((ItemStackImpl) item).getHandle());
44+
}
45+
ReflectionUtil.setField(getHandle(), "b", list);
46+
}
3847
}

v1_16_R3/src/main/java/net/azisaba/loreeditor/v1_16_R3/network/packet/ClientboundSetSlotImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,9 @@ public ClientboundSetSlotImpl(PacketPlayOutSetSlot handle) {
2929
public @Nullable ItemStack getItem() {
3030
return ItemStackImpl.getInstance(ReflectionUtil.getField(handle, "c"));
3131
}
32+
33+
@Override
34+
public void replaceItem(@NotNull ItemStack item) {
35+
ReflectionUtil.setField(handle, "c", ((ItemStackImpl) item).getHandle());
36+
}
3237
}

v1_16_R3/src/main/java/net/azisaba/loreeditor/v1_16_R3/network/packet/ClientboundWindowItemsImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,13 @@ public ClientboundWindowItemsImpl(@NotNull PacketPlayOutWindowItems handle) {
3535
}
3636
return items;
3737
}
38+
39+
@Override
40+
public void setItems(@NotNull List<ItemStack> items) {
41+
List<Object> list = new ArrayList<>();
42+
for (ItemStack item : items) {
43+
list.add(((ItemStackImpl) item).getHandle());
44+
}
45+
ReflectionUtil.setField(getHandle(), "b", list);
46+
}
3847
}

v1_19_R3/src/main/java/net/azisaba/loreeditor/v1_19_R3/network/packet/ClientboundSetSlotImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,10 @@ public ClientboundSetSlotImpl(PacketPlayOutSetSlot handle) {
2929
public @Nullable ItemStack getItem() {
3030
return ItemStackImpl.getInstance(ReflectionUtil.getField(handle, "f"));
3131
}
32+
33+
@Override
34+
public void replaceItem(@NotNull ItemStack item) {
35+
if (getItem() == null) throw new IllegalStateException("Cannot replace null item (for now)");
36+
getItem().setTag(item.getTag());
37+
}
3238
}

0 commit comments

Comments
 (0)