今天给用户测试插件时偶然发现短时间内频繁点击同一个物品时,使用ProtocolLib改包的物品Lore会突然消失不见,需要重新点击背包内其他物品才能恢复。
国内外大部分作者做这种功能时,都是使用WindowItems+SetSlots的,SetSlots没什么太大问题,但是WindowItems大部分作者是这么写的:
(这里引用ProtocolStringReplacer插件的相关代码)

最后只改了itemListModifier内的内容,但这么做是有缺陷的,就是本文开头提及的。不过PSR这个并不存在这个问题,因为服务端层面好像也把这个物品改掉了,没细看,不太清楚。
查看原版服务端相关内容,可以发现还有一个单独ItemStack对象,叫做carriedItem,这个就是更新UI后,玩家手上正在拿的物品。

同时在wiki.vg也可查看到相关资料:

简单来说,就是还需要在这里添加packet.getItemModifier(),并最后packet.getItemModifier().write(0, newItem),如果加了以后出现IndexOutOfBoundsException报错,可以在前面添加packet.getItemModifier().size() != 0的判定。
我已在论坛、SpigotMC上下载多个有这种功能的插件(因为我想看看是不是我自己的问题),发现大部分中招,故发此文提醒一下。
国内外大部分作者做这种功能时,都是使用WindowItems+SetSlots的,SetSlots没什么太大问题,但是WindowItems大部分作者是这么写的:
(这里引用ProtocolStringReplacer插件的相关代码)

最后只改了itemListModifier内的内容,但这么做是有缺陷的,就是本文开头提及的。不过PSR这个并不存在这个问题,因为服务端层面好像也把这个物品改掉了,没细看,不太清楚。
查看原版服务端相关内容,可以发现还有一个单独ItemStack对象,叫做carriedItem,这个就是更新UI后,玩家手上正在拿的物品。

同时在wiki.vg也可查看到相关资料:

简单来说,就是还需要在这里添加packet.getItemModifier(),并最后packet.getItemModifier().write(0, newItem),如果加了以后出现IndexOutOfBoundsException报错,可以在前面添加packet.getItemModifier().size() != 0的判定。
我已在论坛、SpigotMC上下载多个有这种功能的插件(因为我想看看是不是我自己的问题),发现大部分中招,故发此文提醒一下。