LiteLDev/LeviLamina

[Bug]: 监听玩家操作方块容器事件刷屏 - legacy-script-engine

MoonlightUU opened this issue · 10 comments

Describe the bug

监听玩家操作方块容器时 编辑方块实体NBT 或 操作方块容器成功 导致的死循环 qaq

To Reproduce

mc.listen('onContainerChange', function(pl, bl, slotNum, oit, nit) {
let containerBlock = bl.getContainer();
return log(containerBlock.removeItem(0, 1))
//如果往容器第一格放入物品将会刷屏 即使玩家只放入一次

Expected behavior

期望修复 ovo

Screenshots

none

Platform

Windows 10

Version

此服务器正在运行基岩版专用服务器版本 1.20.81-1.671+a9081c5 带有 LeviLamina-0.12.2+916edf645

Additional context

No response

这个显然是你的代码写的有问题 再好好看看lse文档吧

这个显然是你的代码写的有问题 再好好看看lse文档吧

指出错误

removeItem会造成容器更改

removeItem会造成容器更改

所以是玩家在服务器removeItem了么?

removeItem会造成容器更改

所以是玩家在服务器removeItem了么?

当然是因为removeItem会导致容器更改,容器更改会产生onContainerChange事件,onContainerChange里调removeItem不就死循环了吗😥

removeItem会造成容器更改

给你举个例子吧 这个事件监听容器变更 但是 只能监听玩家去操作容器; 而不是监听容器本身变化 ;
比如 玩家前面有个箱子 漏斗放入一个泥土 那这个事件有反应吗? 没有 ;
再比如 玩家打开了这个箱子 漏斗放入一个泥土 那这个事件有反应吗? 有了;

回到正题 这些操作? 是玩家做的吗 不是 它只是打开了箱子; 现在 ? 你知道我说的问题在哪了吗?

removeItem会造成容器更改

所以是玩家在服务器removeItem了么?

当然是因为removeItem会导致容器更改,容器更改会产生onContainerChange事件,onContainerChange里调removeItem不就死循环了吗😥

再说另外一个问题 更改方块的实体nbt 比如我把方块实体的自定义名称更改了; 写入;
这个事件触发时 如果进行上面的操作 同样死循环;
那么 是玩家更改了方块nbt吗? 它只是打开了容器...

removeItem会造成容器更改

所以是玩家在服务器removeItem了么?

当然是因为removeItem会导致容器更改,容器更改会产生onContainerChange事件,onContainerChange里调removeItem不就死循环了吗😥

再说另外一个问题 更改方块的实体nbt 比如我把方块实体的自定义名称更改了; 写入;

这个事件触发时 如果进行上面的操作 同样死循环;

那么 是玩家更改了方块nbt吗? 它只是打开了容器...

1.这是levilamina的issue,不是lse的
2.lse目前只做维护,并会在ls完成后停止,不会再做其他的更改了
3.你这个直接在外层加个flag做个特判就解决了,为什么要搞这么复杂

该事件监听容器变化,至于变化是谁造成的,不由script engine负责,script只转发原始事件。该行为是预期行为。有需要请自行处理该逻辑问题