Skip to content

Commit 742b7ee

Browse files
committed
Rework on user item restore cache
1 parent c7d1bdb commit 742b7ee

File tree

8 files changed

+46
-51
lines changed

8 files changed

+46
-51
lines changed

bukkit/src/main/java/io/github/rothes/protocolstringreplacer/ProtocolStringReplacer.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
import io.github.rothes.protocolstringreplacer.upgrade.AbstractUpgradeHandler;
1919
import io.github.rothes.protocolstringreplacer.upgrade.UpgradeEnum;
2020
import io.github.rothes.protocolstringreplacer.util.FileUtils;
21-
import kotlin.Unit;
22-
import kotlin.jvm.functions.Function1;
2321
import org.apache.commons.lang.Validate;
2422
import org.bukkit.Bukkit;
2523
import org.bukkit.configuration.ConfigurationSection;
@@ -43,7 +41,6 @@
4341
import java.nio.file.StandardCopyOption;
4442
import java.util.HashMap;
4543
import java.util.LinkedList;
46-
import java.util.Locale;
4744
import java.util.logging.Level;
4845
import java.util.logging.Logger;
4946
import java.util.regex.Pattern;
@@ -475,7 +472,7 @@ public void reload(@Nonnull PsrUser user) {
475472
packetListenerManager.removeListeners();
476473
packetListenerManager.initialize();
477474
for (Player player : Bukkit.getOnlinePlayers()) {
478-
userManager.getUser(player).clearUserMetaCache();
475+
userManager.getUser(player).clearUserItemRestoreCache();
479476
player.updateInventory();
480477
}
481478
user.sendFilteredText(PsrLocalization.getPrefixedLocaledMessage("Sender.Commands.Reload.Complete"));

bukkit/src/main/java/io/github/rothes/protocolstringreplacer/api/user/PsrUser.java

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.comphenix.protocol.wrappers.ComponentConverter;
88
import com.comphenix.protocol.wrappers.EnumWrappers;
99
import com.comphenix.protocol.wrappers.WrappedChatComponent;
10-
import de.tr7zw.changeme.nbtapi.NBTItem;
10+
import de.tr7zw.changeme.nbtapi.NBT;
1111
import io.github.rothes.protocolstringreplacer.ProtocolStringReplacer;
1212
import io.github.rothes.protocolstringreplacer.api.capture.CaptureInfo;
1313
import io.github.rothes.protocolstringreplacer.replacer.ListenType;
@@ -23,7 +23,6 @@
2323
import org.bukkit.command.ConsoleCommandSender;
2424
import org.bukkit.entity.Player;
2525
import org.bukkit.inventory.ItemStack;
26-
import org.bukkit.inventory.meta.ItemMeta;
2726
import org.bukkit.permissions.Permission;
2827

2928
import javax.annotation.Nonnull;
@@ -40,13 +39,13 @@
4039

4140
public class PsrUser {
4241

43-
private static Method getLocaleLegacy = getLegacyLocaleMethod();
42+
private static final Method getLocaleLegacy = getLegacyLocaleMethod();
4443

4544
private UUID uuid;
4645
private Player player;
4746
private CommandSender sender;
4847

49-
private final HashMap<Short, ItemMeta> metaCache = new HashMap<>();
48+
private final HashMap<Short, ItemStack> itemRestoreCache = new HashMap<>();
5049
private String currentWindowTitle;
5150
private String clientLocale;
5251
private boolean inAnvil;
@@ -115,8 +114,8 @@ public Player getPlayer() {
115114
return player;
116115
}
117116

118-
public HashMap<Short, ItemMeta> getMetaCache() {
119-
return metaCache;
117+
public HashMap<Short, ItemStack> getItemRestoreCache() {
118+
return itemRestoreCache;
120119
}
121120

122121
public Short nextUniqueCacheKey() {
@@ -350,23 +349,20 @@ public void sendMessage(String text) {
350349
}
351350

352351

353-
public void clearUserMetaCache() {
354-
getMetaCache().clear();
352+
public void clearUserItemRestoreCache() {
353+
getItemRestoreCache().clear();
355354
uniqueCacheKey = 0;
356355
}
357356

358-
public void saveUserMetaCache(ItemStack originalItem, ItemStack replacedItem) {
357+
public void saveUserItemRestoreCache(ItemStack originalItem, ItemStack replacedItem) {
359358
if (this.hasPermission("protocolstringreplacer.feature.usermetacache")) {
360359
if (ProtocolStringReplacer.getInstance().getConfigManager().removeCacheWhenMerchantTrade && isInMerchant()) {
361360
return;
362361
}
363-
ItemMeta originalMeta = originalItem.getItemMeta();
364-
if (!originalMeta.equals(replacedItem.getItemMeta())) {
365-
NBTItem nbtItem = new NBTItem(replacedItem);
366-
nbtItem.addCompound("ProtocolStringReplacer").setShort("UserMetaCacheKey", nextUniqueCacheKey());
367-
replacedItem.setItemMeta(nbtItem.getItem().getItemMeta());
368-
this.getMetaCache().put(uniqueCacheKey, originalMeta);
369-
}
362+
NBT.modify(replacedItem, nbt -> {
363+
nbt.getOrCreateCompound("ProtocolStringReplacer").setShort("UserMetaCacheKey", nextUniqueCacheKey());
364+
});
365+
this.getItemRestoreCache().put(uniqueCacheKey, originalItem);
370366
}
371367
}
372368

@@ -376,7 +372,7 @@ public String toString() {
376372
"uuid=" + uuid +
377373
", player=" + player +
378374
", currentWindowTitle='" + currentWindowTitle + '\'' +
379-
", metaCache=" + metaCache +
375+
", metaCache=" + itemRestoreCache +
380376
", uniqueCacheKey=" + uniqueCacheKey +
381377
", editorReplacerConfig=" + editorReplacerConfig +
382378
'}';
Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package io.github.rothes.protocolstringreplacer.packetlistener.client.itemstack;
22

33
import com.comphenix.protocol.PacketType;
4-
import de.tr7zw.changeme.nbtapi.NBTItem;
4+
import de.tr7zw.changeme.nbtapi.NBT;
55
import io.github.rothes.protocolstringreplacer.ProtocolStringReplacer;
66
import io.github.rothes.protocolstringreplacer.packetlistener.client.BaseClientPacketListener;
77
import io.github.rothes.protocolstringreplacer.api.user.PsrUser;
88
import org.bukkit.inventory.ItemStack;
9-
import org.bukkit.inventory.meta.ItemMeta;
109

1110
import java.util.HashMap;
1211

@@ -16,27 +15,27 @@ protected BaseClientItemPacketListener(PacketType packetType) {
1615
super(packetType);
1716
}
1817

19-
protected void restoreItem(PsrUser user, ItemStack itemStack) {
18+
protected ItemStack restoreItem(PsrUser user, ItemStack itemStack) {
2019
if (!itemStack.hasItemMeta()) {
21-
return;
20+
return itemStack;
2221
}
23-
NBTItem nbtItem = new NBTItem(itemStack);
24-
if (!nbtItem.hasTag("ProtocolStringReplacer")) {
25-
return;
26-
}
27-
Short uniqueCacheKey = nbtItem.getCompound("ProtocolStringReplacer").getShort("UserMetaCacheKey");
28-
29-
if (uniqueCacheKey != null) {
30-
HashMap<Short, ItemMeta> userMetaCache = user.getMetaCache();
31-
ItemMeta original = userMetaCache.get(uniqueCacheKey);
32-
if (original == null) {
33-
ProtocolStringReplacer.warn("Failed to get original ItemMeta by meta-cache key, ignoring.\n" + itemStack);
34-
return;
22+
return NBT.get(itemStack, nbt -> {
23+
if (nbt.hasTag("ProtocolStringReplacer")) {
24+
Short uniqueCacheKey = nbt.getCompound("ProtocolStringReplacer").getShort("UserMetaCacheKey");
25+
if (uniqueCacheKey != null) {
26+
HashMap<Short, ItemStack> userItemRestoreCache = user.getItemRestoreCache();
27+
ItemStack original = userItemRestoreCache.get(uniqueCacheKey);
28+
if (original == null) {
29+
ProtocolStringReplacer.warn("Failed to get original ItemMeta by meta-cache key, ignoring.\n" + itemStack);
30+
return itemStack;
31+
}
32+
return original;
33+
} else {
34+
ProtocolStringReplacer.warn("Failed to get original ItemMeta by meta-cache key due to null, ignoring.\n" + itemStack);
35+
}
3536
}
36-
itemStack.setItemMeta(original);
37-
} else {
38-
ProtocolStringReplacer.warn("Failed to get original ItemMeta by meta-cache key due to null, ignoring.\n" + itemStack);
39-
}
37+
return itemStack;
38+
});
4039
}
4140

4241
}

bukkit/src/main/java/io/github/rothes/protocolstringreplacer/packetlistener/client/itemstack/SetCreativeSlot.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.comphenix.protocol.PacketType;
44
import com.comphenix.protocol.events.PacketEvent;
5+
import com.comphenix.protocol.reflect.StructureModifier;
56
import io.github.rothes.protocolstringreplacer.api.user.PsrUser;
67
import org.bukkit.inventory.ItemStack;
78

@@ -17,8 +18,9 @@ protected void process(PacketEvent packetEvent) {
1718
return;
1819
}
1920
if (user.hasPermission("protocolstringreplacer.feature.usermetacache")) {
20-
ItemStack itemStack = packetEvent.getPacket().getItemModifier().read(0);
21-
restoreItem(user, itemStack);
21+
StructureModifier<org.bukkit.inventory.ItemStack> itemModifier = packetEvent.getPacket().getItemModifier();
22+
ItemStack itemStack = itemModifier.read(0);
23+
itemModifier.write(0, restoreItem(user, itemStack));
2224
}
2325
}
2426

bukkit/src/main/java/io/github/rothes/protocolstringreplacer/packetlistener/client/itemstack/WindowClick.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ protected void process(PacketEvent packetEvent) {
1717
return;
1818
}
1919
if (user.hasPermission("protocolstringreplacer.feature.usermetacache.noncreative")) {
20-
ItemStack itemStack = packetEvent.getPacket().getItemModifier().read(0);
21-
restoreItem(user, itemStack);
20+
com.comphenix.protocol.reflect.StructureModifier<org.bukkit.inventory.ItemStack> itemModifier = packetEvent.getPacket().getItemModifier();
21+
ItemStack itemStack = itemModifier.read(0);
22+
itemModifier.write(0, restoreItem(user, itemStack));
2223
}
2324
}
2425

bukkit/src/main/java/io/github/rothes/protocolstringreplacer/packetlistener/server/BaseServerPacketListener.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,15 +321,15 @@ protected static ItemStack replaceItemStack(@Nonnull PacketEvent packetEvent, @N
321321

322322
replacerManager.setPapi(user, container.getTexts(), papiIndexes);
323323
}
324-
container.getResult();
324+
ItemStack result = container.getResult();
325325

326-
if (saveCache && !original.isSimilar(itemStack)) {
327-
user.saveUserMetaCache(original, itemStack);
326+
if (saveCache && !original.equals(result)) {
327+
user.saveUserItemRestoreCache(original, result);
328328
}
329329
if (user.isCapturing(listenType)) {
330330
captureItemStackInfo(user, original, listenType, nbt, lore, entries);
331331
}
332-
return container.getResult();
332+
return result;
333333
} catch (Throwable t) {
334334
t.printStackTrace();
335335
}

bukkit/src/main/kotlin/io/github/rothes/protocolstringreplacer/packetlistener/server/itemstack/WindowItems.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class WindowItems : BaseServerItemPacketListener(PacketType.Play.Server.WINDOW_I
1212

1313
override fun process(packetEvent: PacketEvent) {
1414
val user = getEventUser(packetEvent) ?: return
15-
user.clearUserMetaCache()
15+
user.clearUserItemRestoreCache()
1616
val replacerManager = ProtocolStringReplacer.getInstance().replacerManager
1717
val nbt = replacerManager.getAcceptedReplacers(user, itemNbtFilter)
1818
val lore = replacerManager.getAcceptedReplacers(user, itemLoreFilter)

bukkit/src/main/kotlin/io/github/rothes/protocolstringreplacer/packetlistener/server/itemstack/WindowItemsPost11.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class WindowItemsPost11 : BaseServerItemPacketListener(PacketType.Play.Server.WI
1111

1212
override fun process(packetEvent: PacketEvent) {
1313
val user = getEventUser(packetEvent) ?: return
14-
user.clearUserMetaCache()
14+
user.clearUserItemRestoreCache()
1515
val replacerManager = ProtocolStringReplacer.getInstance().replacerManager
1616
val nbt = replacerManager.getAcceptedReplacers(user, itemNbtFilter)
1717
val lore = replacerManager.getAcceptedReplacers(user, itemLoreFilter)

0 commit comments

Comments
 (0)