本帖最后由 凌语丶 于 2023-3-11 20:44 编辑
求助各位带佬 如何写一个灵魂绑定的死亡不掉落?
目前有2种思路
1.在玩家死亡时Map保存物品 然后在玩家重生时复原
bug: 玩家死亡后服务器关闭
2.在玩家死亡时保存物品 1tick后复原
bug: 玩家死亡后被踢出服务器 npe
如何写一个灵魂绑定的死亡不掉落? 或者说 有没有什么好的方法可以修复上述bug?
求助各位带佬 如何写一个灵魂绑定的死亡不掉落?
目前有2种思路
1.在玩家死亡时Map保存物品 然后在玩家重生时复原
bug: 玩家死亡后服务器关闭
2.在玩家死亡时保存物品 1tick后复原
bug: 玩家死亡后被踢出服务器 npe
如何写一个灵魂绑定的死亡不掉落? 或者说 有没有什么好的方法可以修复上述bug?
本帖最后由 结冰的离季 于 2023-3-11 20:48 编辑
把drop删除然后直接 往 player 的 inventory add 这个物品,如果add时玩家不在线就得考虑邮件之类的方式存到数据库了
https://github.com/SakuraTown/SakuraBind/blob/f1af498a7218262d9f4c2eda4ff93d4bef99bce5/plugin/src/main/kotlin/top/iseason/bukkit/sakurabind/listener/ItemListener.kt#L606
把drop删除然后直接 往 player 的 inventory add 这个物品,如果add时玩家不在线就得考虑邮件之类的方式存到数据库了
https://github.com/SakuraTown/SakuraBind/blob/f1af498a7218262d9f4c2eda4ff93d4bef99bce5/plugin/src/main/kotlin/top/iseason/bukkit/sakurabind/listener/ItemListener.kt#L606
结冰的离季 发表于 2023-3-11 20:44
把drop删除然后直接 往 player 的 inventory add 这个物品,如果add时玩家不在线就得考虑邮件之类的方式存到 ...
草???
这玩意 开异步可以 不开异步就不行???
凌语丶 发表于 2023-3-11 20:58
草???
这玩意 开异步可以 不开异步就不行???
跟异步没关系,主要是送回的时候需要判断玩家状态,我这个如果离线就保存到数据库中,当然你可以试试不判断状态有没有问题
结冰的离季 发表于 2023-3-11 21:02
跟异步没关系,主要是送回的时候需要判断玩家状态,我这个如果离线就保存到数据库中,当然你可以试试不判 ...
刚刚测试了一下 在event里边直接setback就不会成功,但是异步就可以了
凌语丶 发表于 2023-3-11 21:08
刚刚测试了一下 在event里边直接setback就不会成功,但是异步就可以了
保证送回物品在event结束之后触发就行 BukkitTask的同步也可以的
换一种思路,开死亡不掉落,然后玩家死亡时遍历他的物品栏,没绑定的物品给掉出来即可。(删除物品栏里的,从玩家所在位置生成对应掉落物)
针织薄外套 发表于 2023-3-12 02:46
换一种思路,开死亡不掉落,然后玩家死亡时遍历他的物品栏,没绑定的物品给掉出来即可。(删除物品栏里的, ...
emmmm
这个我怕破坏原版的一些机制,不太敢动
监听PlayerDeathEvent事件
读取 getDrops 的物品,将需要保留的物品从其中移除
如果是Paper端可以使用 getItemsToKeep()
如果是Bukkit/Spigot 需要手动将其添加回玩家的背包
读取 getDrops 的物品,将需要保留的物品从其中移除
如果是Paper端可以使用 getItemsToKeep()
如果是Bukkit/Spigot 需要手动将其添加回玩家的背包
监听玩家死亡,判断物品是否有灵魂绑定,如果有就存入一个临时变量,然后玩家复活后再加进玩家背包
可以尝试
死亡把物品存到缓存里,
判断玩家是否在线,如果在线则直接复原物品
不在线则等玩家第二次进入服务器再复原物品
死亡把物品存到缓存里,
判断玩家是否在线,如果在线则直接复原物品
不在线则等玩家第二次进入服务器再复原物品
对于你的问题我是一窍不通!!!



但是我用你的问题问了下chatCPT,它给了我一些回答,我也看不懂,不知道能不能帮助到你。




但是我用你的问题问了下chatCPT,它给了我一些回答,我也看不懂,不知道能不能帮助到你。
在Bukkit中实现灵魂绑定的死亡不掉落可以通过以下步骤:
- 在玩家死亡时,通过 PlayerDeathEvent 获取玩家死亡前的装备和物品,并将其存储到一个地方,例如一个 Map 中。
- 创建一个 Runnable ,用于在一段时间后恢复玩家的物品。你可以使用 Bukkit 的 scheduler 来实现这一点,例如:
- 如果玩家在等待期间退出服务器,则可以将其存储在一个 Map 中,并在玩家下次登录时恢复其物品。
- 如果服务器关闭,则可以将所有等待恢复的物品存储在一个数据库中,以便在服务器重启后恢复它们。
关于上述提到的两个bug:
- 如果服务器关闭,则可以将等待恢复的物品存储在数据库中,以便在服务器重启后恢复它们。
- 如果玩家死亡后被踢出服务器,则需要将其等待恢复的物品存储在一个 Map 中,并在玩家下次登录时恢复它们。
总的来说,实现灵魂绑定的死亡不掉落需要考虑到玩家死亡的各种情况,并采取相应的措施来保护玩家的物品。