TUSB / TheUnusualSkyBlock

Minecraft 配布ワールド 「The Unusual SkyBlock」用データパックリポジトリ
https://skyblock.jp
43 stars 2 forks source link

[バグ] SettingsにおいてGlobal:1bを使用した際特定の組み合わせで実行エンティティが消滅する #127

Closed anminmakura closed 2 years ago

anminmakura commented 2 years ago

発生したTUSBv13のVersion

v13.1.1α

概要

三角様のターン4-2及びデバッグマンの3-1のCall_Skillにおいて こちらが意図しないバグによって実行時にMOBが消滅してしまう。

該当のCallが作動した際、MOBが消えてしまうのも問題ではあるが 消滅時に本来であれば複数回実行されないCall_Skillが1回以上同じタイミングで起こっている。

再現方法

原因となるコマンドを参照。

予想される動作

デバッグマンのログとして 正常なログが 1-1 1-2 <実行ログ> 1-4 1-5

であるのに対して

現報告においてのログが 1-1 1-2 <実行ログ> <実行ログ>

または

1-1 1-2 <実行ログ> <実行ログ> <実行ログ> <実行ログ>

だった。 またこの時実行したエンティティはCall Spawnの召喚成功と共に消滅している。

原因となるコマンド

※実際に消えるCall
{Settings:[{Global:1b,Name:"Facing",Target:{Look:"Friendly",Radius:16.0d,IgnoreBlocks:true}}],Condition:[{Name:"HasTarget",Global:true,Target:{Look:"Friendly",Radius:16.0d,IgnoreBlocks:true}}]},{Settings:[{Name:"Anchor",Anchor:"Eyes"},{Name:"Rotation",Direction:[-30f,-7f]},{Name:"Direction",Speed:1.52d}],Name:"Spawn",SpawnEntities:[[{Tags:[Global,Ground,Shoot,TriangularMan,5WayArrow],Level:1}]]},{Settings:[{Name:"Anchor",Anchor:"Eyes"},{Name:"Rotation",Direction:[-15f,-7f]},{Name:"Direction",Speed:1.52d}],Name:"Spawn",SpawnEntities:[[{Tags:[Global,Ground,Shoot,TriangularMan,5WayArrow],Level:1}]]},{Settings:[{Name:"Anchor",Anchor:"Eyes"},{Name:"Rotation",Direction:[0f,-7f]},{Name:"Direction",Speed:1.52d}],Name:"Spawn",SpawnEntities:[[{Tags:[Global,Ground,Shoot,TriangularMan,5WayArrow],Level:1}]]},{Settings:[{Name:"Anchor",Anchor:"Eyes"},{Name:"Rotation",Direction:[15f,-7f]},{Name:"Direction",Speed:1.52d}],Name:"Spawn",SpawnEntities:[[{Tags:[Global,Ground,Shoot,TriangularMan,5WayArrow],Level:1}]]},{Settings:[{Name:"Anchor",Anchor:"Eyes"},{Name:"Rotation",Direction:[30f,-7f]},{Name:"Direction",Speed:1.52d}],Name:"Spawn",SpawnEntities:[[{Tags:[Global,Ground,Shoot,TriangularMan,5WayArrow],Level:1}]]},{Settings:[{Name:"Facing",Target:{Look:"Friendly",Radius:24d,IgnoreBlocks:true},Anchor:"Eyes"}],Name:"Function",Tags:[Global,Event,Function,CommonExe,TpWithRotation]}

※省略しない場合消えない。
{Condition:[{Name:"HasTarget",Global:true,Target:{Look:"Friendly",Radius:16.0d,IgnoreBlocks:true}}]},{Settings:[{Name:"Facing",Target:{Look:"Friendly",Radius:16.0d,IgnoreBlocks:true}},{Name:"Anchor",Anchor:"Eyes"},{Name:"Rotation",Direction:[-30f,-7f]},{Name:"Direction",Speed:1.52d}],Name:"Spawn",SpawnEntities:[[{Tags:[Global,Ground,Shoot,TriangularMan,5WayArrow],Level:1}]]},{Settings:[{Name:"Facing",Target:{Look:"Friendly",Radius:16.0d,IgnoreBlocks:true}},{Name:"Anchor",Anchor:"Eyes"},{Name:"Rotation",Direction:[-15f,-7f]},{Name:"Direction",Speed:1.52d}],Name:"Spawn",SpawnEntities:[[{Tags:[Global,Ground,Shoot,TriangularMan,5WayArrow],Level:1}]]},{Settings:[{Name:"Facing",Target:{Look:"Friendly",Radius:16.0d,IgnoreBlocks:true}},{Name:"Anchor",Anchor:"Eyes"},{Name:"Rotation",Direction:[0f,-7f]},{Name:"Direction",Speed:1.52d}],Name:"Spawn",SpawnEntities:[[{Tags:[Global,Ground,Shoot,TriangularMan,5WayArrow],Level:1}]]},{Settings:[{Name:"Facing",Target:{Look:"Friendly",Radius:16.0d,IgnoreBlocks:true}},{Name:"Anchor",Anchor:"Eyes"},{Name:"Rotation",Direction:[15f,-7f]},{Name:"Direction",Speed:1.52d}],Name:"Spawn",SpawnEntities:[[{Tags:[Global,Ground,Shoot,TriangularMan,5WayArrow],Level:1}]]},{Settings:[{Name:"Facing",Target:{Look:"Friendly",Radius:16.0d,IgnoreBlocks:true}},{Name:"Anchor",Anchor:"Eyes"},{Name:"Rotation",Direction:[30f,-7f]},{Name:"Direction",Speed:1.52d}],Name:"Spawn",SpawnEntities:[[{Tags:[Global,Ground,Shoot,TriangularMan,5WayArrow],Level:1}]]},{Settings:[{Name:"Facing",Target:{Look:"Friendly",Radius:24d,IgnoreBlocks:true},Anchor:"Eyes"}],Name:"Function",Tags:[Global,Event,Function,CommonExe,TpWithRotation]}

NBTデータ

/summon minecraft:villager -3835.50 20.00 756.50 {NoGravity: 1b, Brain: {memories: {}}, HurtByTimestamp: 0, Attributes: [{Base: 0.0d, Name: "minecraft:generic.movement_speed"}, {Base: 0.0d, Name: "minecraft:generic.knockback_resistance"}, {Base: 32.0d, Name: "minecraft:generic.follow_range"}, {Base: 0.0d, Name: "minecraft:generic.attack_knockback"}], FoodLevel: 0b, Invulnerable: 0b, FallFlying: 0b, ForcedAge: 0, Gossips: [], PortalCooldown: 0, AbsorptionAmount: 1000000.0f, LastRestock: 0L, FallDistance: 0.0f, DeathTime: 19s, Xp: 0, LastGossipDecay: 7818299L, HandDropChances: [0.085f, 0.085f], PersistenceRequired: 0b, Tags: ["Mob", "Initialized", "m.mob_view", "HasAI", "SmartMotion", "Enemy", "DelayedData", "CallOnInit", "NativeTask"], Age: 0, Motion: [0.0d, 0.0d, 0.0d], Health: 20.0f, LeftHanded: 0b, Air: 300s, OnGround: 1b, NoAI: 1b, Rotation: [72.87564f, 0.0f], HandItems: [{}, {}], RestocksToday: 0, ArmorDropChances: [0.085f, 0.085f, 0.085f, 0.085f], CustomName: '{"extra":[{"color":"#FFFFFF","translate":"デバッグマン"},{"text":" Lv"},{"text":"1"}],"text":""}', Fire: 0s, ArmorItems: [{}, {}, {}, {}], CanPickUpLoot: 1b, VillagerData: {profession: "minecraft:none", level: 1, type: "minecraft:plains"}, DeathLootTable: "minecraft:empty", HurtTime: 0s, Inventory: []}

ログ

失敗ログ [CHAT] CallSkill 1-1 22:40:03.006 net.minecraft.server.MinecraftServer Server thread [✦anminmakura✦:ゲームモードをサバイバルモードに変更しました] 22:40:03.007 dxb Render thread [CHAT] ゲームモードをサバイバルモードに変更しました 22:40:03.545 dxb Render thread [CHAT] CallSkill 2-1 22:40:03.849 dxb Render thread [CHAT] 実行前の座標 デバッグマン Lv1 : [-3835.5d,20.0d,756.5d] 22:40:03.849 dxb Render thread [CHAT] デバッグマン Lv1 : [-3835.5d,20.0d,756.5d] 22:40:03.849 dxb Render thread [CHAT] 実行前の座標 デバッグマン Lv1 : [-3835.5d,20.0d,756.5d] 22:40:03.849 dxb Render thread [CHAT] デバッグマン Lv1 : [-3835.5d,20.0d,756.5d]

成功ログ 22:39:04.043 dxb Render thread [CHAT] CallSkill 1-1 22:39:04.841 dxb Render thread [CHAT] CallSkill 2-1 22:39:05.145 dxb Render thread [CHAT] 実行前の座標 デバッグマン Lv1 : [-3836.5d,20.0d,755.5d] 22:39:05.145 dxb Render thread [CHAT] デバッグマン Lv1 : [-3836.5d,20.0d,755.5d] 22:39:05.444 dxb Render thread [CHAT] 実行前の座標 デバッグマン Lv1 : [-3836.5d,20.0d,755.5d] 22:39:05.444 dxb Render thread [CHAT] デバッグマン Lv1 : [-3836.5d,20.0d,755.5d] 22:39:05.747 dxb Render thread [CHAT] 実行前の座標 デバッグマン Lv1 : [-3836.5d,20.0d,755.5d] 22:39:05.747 dxb Render thread [CHAT] デバッグマン Lv1 : [-3836.5d,20.0d,755.5d] 22:39:06.540 dxb Render thread [CHAT] CallSkill 4-1 22:39:06.942 net.minecraft.server.MinecraftServer Server thread [✦anminmakura✦:ゲームモードをクリエイティブモードに変更しました] 22:39:06.947 dxb Render thread [CHAT] ゲームモードをクリエイティブモードに変更しました 22:39:07.343 dxb Render thread [CHAT] CallSkill 5-1

NePonpon commented 2 years ago

この問題の細分化

この問題は以下の2つに分けられる。

最後のCallが2回実行される現象

処理について

enemy:ai/call/settings/

#L12

#L13
execute unless data storage mob_data: Settings.Name if data storage mob_data: Settings{Global:1b} if score 00000000-0000-0000-0000-000000000002 _ matches 1 at 0-0-0-0-1 run function enemy:ai/call/execute/fork
#L14
execute unless data storage mob_data: Settings.Name unless data storage mob_data: Settings{Global:1b} if score 00000000-0000-0000-0000-000000000002 _ matches 1 at 0-0-0-0-1 run function enemy:ai/call/call
#L15

SettingsのGlobalを使った場合、13行目から処理が分岐しすべてのCallが実行されていく。 もし複数のCallがあり、その中にSettingsを含むCallがあった場合、ストレージmob_data: Settings{}となる。 その状態で13行目からの分岐が終了したとき、14行目のexecuteの条件(※00000000-0000-0000-0000-000000000002 _ のスコアが更新されていないことが必要)を満たすため、最後のCallを再び実行してしまう。

修正方法

enemy:ai/call/settings/の13行目と14行目を入れ替える。

Globalの処理の場合mob_data: Settings{}になることはないし、それ以外のSettingsの場合mob_data: Settings{Global:1b}になることはないため、処理が破綻することはないと思われる。

エンティティが消滅する現象

詳細

先ほどの最後のCallが2回実行される現象で説明できる。Callの中にSettingsがあった場合、enemy:ai/call/settings/initを通るため、処理終了後0-0-0-0-1が返却される。Callが2回実行される現象の2回目実行のとき、at 0-0-0-0-1があるので実行位置がコントロールエリアになり、tpを使った処理の場合消滅するように見える。