Modular Machinery: Community Edition

Modular Machinery: Community Edition

239k Downloads

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

SST-03 opened this issue · 2 comments

commented

如题。

我设计了两个升级(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(liquid:water*1000)
.addFluidOutput(liquid:lava*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就成功写入了,也许是特性。

commented

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

commented

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