
疑似异步搜索配方导致的数据丢失
SST-03 opened this issue · 2 comments
如题。
我设计了两个升级(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就成功写入了,也许是特性。