NovaEngineering-Source / ModularMachinery-Community-Edition

Customize your machinery with more powerful features.
https://www.curseforge.com/minecraft/mc-mods/modularmachinery-community-edition
GNU General Public License v3.0
28 stars 12 forks source link

疑似异步搜索配方导致的数据丢失 #41

Closed SST-03 closed 10 months ago

SST-03 commented 10 months ago

如题。

我设计了两个升级(mods.modularmachinery.MachineUpgrade),并在相同的事件(addRecipeCheckHandler(event,upgrade))里,以相同的代码向RecipeEvent.activeRecipe.data写入了数据(设计上是加载顺序靠后的升级读取加载顺序靠前的升级写下的数据),但是:只有注册顺序靠后的升级写入的数据能在RecipePrimer绑定的addCheckHandler(event)中通过读取event.activeRecipe.data得到。


代码(简化版):

MachineUpgradeBuilder.newBuilder("upgrade1","升级1",1,8) .addRecipeCheckHandler(function(cevent as RecipeEvent,upgrade as `MachineUpgrade){ var Data = {"data": 0, "data2":1, } + event.activeRecipe.data; Data += {"data":Data.data.asInt()+5, "data2":5}; event.activeRecipe.data = Data;}).buildAndRegister();

MachineUpgradeBuilder.newBuilder("upgrade2","升级2",1,8) .addRecipeCheckHandler(function(cevent as RecipeEvent,upgrade as `MachineUpgrade){ var Data = {"data": 0, "data2":1, } + event.activeRecipe.data; Data += {"data":Data.data.asInt()+7}; event.activeRecipe.data = Data;}).buildAndRegister();

RecipeBuilder.newBuilder("recipe1","machine",100) .addFluidInput(1000) .addFluidOutput(1000) .addCheckHandler(function(event as RecipeCheckEvent){ print(event.activeRecipe.data.asString()); }).build();

期望: 升级1检查配方时,event.activeRecipe.data为空Map,则接受{"data": 0 },输出{"data": 5, "data2": 5}; 升级2检查配方时,event.activeRecipe.data为{"data": 5, "data2": 5},则接受{"data": 5, "data2": 5},输出{"data": 12, "data2": 5}; 控制器检查配方时,event.activeRecipe.data为{"data": 12, "data2": 5},则输出 {"data": 12, "data2": 5}

实际:输出 {"data": 7 , "data2": 5}


猜想:异步搜索配方时,多个升级的事件同时触发,并按照注册顺序依次覆盖数据;但这说不通为何data2就成功写入了,也许是特性。

KasumiNova commented 10 months ago

有没有考虑过NBT数据合并导致的错误?

SST-03 commented 10 months ago

问题解决,是CrT的IData复写机制的锅