From d8954e5c38925253fd67a7dc56ed3830aac9916d Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 30 Aug 2017 13:19:18 +1000 Subject: [PATCH] Fix fly animal AI with custom blocks. --- MCGalaxy/Blocks/Physics/BirdPhysics.cs | 25 +++++++++++--------- MCGalaxy/Blocks/Physics/DoorPhysics.cs | 4 +--- MCGalaxy/Blocks/Physics/HunterPhysics.cs | 29 ++++++++++++------------ MCGalaxy/Levels/Level.Physics.cs | 6 +++++ 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/MCGalaxy/Blocks/Physics/BirdPhysics.cs b/MCGalaxy/Blocks/Physics/BirdPhysics.cs index 4ec999cd0..b62803f81 100644 --- a/MCGalaxy/Blocks/Physics/BirdPhysics.cs +++ b/MCGalaxy/Blocks/Physics/BirdPhysics.cs @@ -24,49 +24,52 @@ namespace MCGalaxy.Blocks.Physics { Random rand = lvl.physRandom; ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); + ExtBlock block = lvl.GetBlock(x, y, z); int index; switch (rand.Next(1, 15)) { case 1: - if (lvl.IsAirAt(x, (ushort)(y - 1), z, out index)) - lvl.AddUpdate(index, lvl.blocks[C.b]); + if (lvl.IsAirAt(x, (ushort)(y - 1), z, out index)) { + lvl.AddUpdate(index, block); + } else goto case 3; break; case 2: - if (lvl.IsAirAt(x, (ushort)(y + 1), z, out index)) - lvl.AddUpdate(index, lvl.blocks[C.b]); + if (lvl.IsAirAt(x, (ushort)(y + 1), z, out index)) { + lvl.AddUpdate(index, block); + } else goto case 6; break; case 3: case 4: case 5: - FlyTo(lvl, ref C, x - 1, y, z); + FlyTo(lvl, ref C, (ushort)(x - 1), y, z, block); break; case 6: case 7: case 8: - FlyTo(lvl, ref C, x + 1, y, z); + FlyTo(lvl, ref C, (ushort)(x + 1), y, z, block); break; case 9: case 10: case 11: - FlyTo(lvl, ref C, x, y, z - 1); + FlyTo(lvl, ref C, x, y, (ushort)(z - 1), block); break; default: - FlyTo(lvl, ref C, x, y, z + 1); + FlyTo(lvl, ref C, x, y, (ushort)(z + 1), block); break; } lvl.AddUpdate(C.b, Block.Air); C.data.Data = PhysicsArgs.RemoveFromChecks; } - static void FlyTo(Level lvl, ref Check C, int x, int y, int z) { - int index = lvl.PosToInt((ushort)x, (ushort)y, (ushort)z); + static void FlyTo(Level lvl, ref Check C, ushort x, ushort y, ushort z, ExtBlock block) { + int index = lvl.PosToInt(x, y, z); if (index < 0) return; switch (lvl.blocks[index]) { case Block.Air: - lvl.AddUpdate(index, lvl.blocks[C.b]); + lvl.AddUpdate(index, block); break; case Block.Op_Air: break; diff --git a/MCGalaxy/Blocks/Physics/DoorPhysics.cs b/MCGalaxy/Blocks/Physics/DoorPhysics.cs index 735ba582b..29d84e036 100644 --- a/MCGalaxy/Blocks/Physics/DoorPhysics.cs +++ b/MCGalaxy/Blocks/Physics/DoorPhysics.cs @@ -59,9 +59,7 @@ namespace MCGalaxy.Blocks.Physics { block = ExtBlock.FromIndex(lvl.BlockProps[block.Index].oDoorIndex); if (index >= 0 && oDoor == block) { - PhysicsArgs args = default(PhysicsArgs); - args.ExtBlock = oDoor.BlockID == Block.custom_block; - lvl.AddUpdate(index, oDoor.RawID, true, args); + lvl.AddUpdate(index, oDoor, true); } } diff --git a/MCGalaxy/Blocks/Physics/HunterPhysics.cs b/MCGalaxy/Blocks/Physics/HunterPhysics.cs index da5892330..5bdee091c 100644 --- a/MCGalaxy/Blocks/Physics/HunterPhysics.cs +++ b/MCGalaxy/Blocks/Physics/HunterPhysics.cs @@ -36,7 +36,7 @@ namespace MCGalaxy.Blocks.Physics { case 3: if (closest.Pos.BlockX != x) { index = lvl.PosToInt((ushort)(x + Math.Sign(closest.Pos.BlockX - x)), y, z); - if (MoveFish(lvl, C.b, index, target)) return; + if (MoveTo(lvl, C.b, index, target)) return; } dirsVisited++; @@ -47,7 +47,7 @@ namespace MCGalaxy.Blocks.Physics { case 6: if (closest.Pos.BlockY != y) { index = lvl.PosToInt(x, (ushort)(y + Math.Sign(closest.Pos.BlockY - y)), z); - if (MoveFish(lvl, C.b, index, target)) return; + if (MoveTo(lvl, C.b, index, target)) return; } dirsVisited++; @@ -58,7 +58,7 @@ namespace MCGalaxy.Blocks.Physics { case 9: if (closest.Pos.BlockZ != z) { index = lvl.PosToInt(x, y, (ushort)(z + Math.Sign(closest.Pos.BlockZ - z))); - if (MoveFish(lvl, C.b, index, target)) return; + if (MoveTo(lvl, C.b, index, target)) return; } dirsVisited++; @@ -84,7 +84,7 @@ namespace MCGalaxy.Blocks.Physics { case 3: if (closest.Pos.BlockX != x) { index = lvl.PosToInt((ushort)(x - Math.Sign(closest.Pos.BlockX - x)), y, z); - if (MoveFish(lvl, C.b, index, target)) return; + if (MoveTo(lvl, C.b, index, target)) return; } dirsVisited++; @@ -95,7 +95,7 @@ namespace MCGalaxy.Blocks.Physics { case 6: if (closest.Pos.BlockY != y) { index = lvl.PosToInt(x, (ushort)(y - Math.Sign(closest.Pos.BlockY - y)), z); - if (MoveFish(lvl, C.b, index, target)) return; + if (MoveTo(lvl, C.b, index, target)) return; } dirsVisited++; @@ -106,7 +106,7 @@ namespace MCGalaxy.Blocks.Physics { case 9: if (closest.Pos.BlockZ != z) { index = lvl.PosToInt(x, y, (ushort)(z - Math.Sign(closest.Pos.BlockZ - z))); - if (MoveFish(lvl, C.b, index, target)) return; + if (MoveTo(lvl, C.b, index, target)) return; } dirsVisited++; @@ -117,9 +117,8 @@ namespace MCGalaxy.Blocks.Physics { RandomlyMove(lvl, ref C, rand, x, y, z, target); } - static bool MoveFish(Level lvl, int baseIndex, int index, byte target) { - if (index >= 0 && lvl.blocks[index] == target - && lvl.AddUpdate(index, lvl.blocks[baseIndex])) { + static bool MoveTo(Level lvl, int baseIndex, int index, byte target) { + if (index >= 0 && lvl.blocks[index] == target && lvl.AddUpdate(index, lvl.blocks[baseIndex])) { lvl.AddUpdate(baseIndex, target); return true; } @@ -129,30 +128,30 @@ namespace MCGalaxy.Blocks.Physics { static void RandomlyMove(Level lvl, ref Check C, Random rand, ushort x, ushort y, ushort z, byte target ) { switch (rand.Next(1, 15)) { case 1: - if (MoveFish(lvl, C.b, lvl.PosToInt(x, (ushort)(y - 1), z), target)) return; + if (MoveTo(lvl, C.b, lvl.PosToInt(x, (ushort)(y - 1), z), target)) return; goto case 3; case 2: - if (MoveFish(lvl, C.b, lvl.PosToInt(x, (ushort)(y + 1), z), target)) return; + if (MoveTo(lvl, C.b, lvl.PosToInt(x, (ushort)(y + 1), z), target)) return; goto case 6; case 3: case 4: case 5: - if (MoveFish(lvl, C.b, lvl.PosToInt((ushort)(x - 1), y, z), target)) return; + if (MoveTo(lvl, C.b, lvl.PosToInt((ushort)(x - 1), y, z), target)) return; goto case 9; case 6: case 7: case 8: - if (MoveFish(lvl, C.b, lvl.PosToInt((ushort)(x + 1), y, z), target)) return; + if (MoveTo(lvl, C.b, lvl.PosToInt((ushort)(x + 1), y, z), target)) return; goto case 12; case 9: case 10: case 11: - MoveFish(lvl, C.b, lvl.PosToInt(x, y, (ushort)(z - 1)), target); + MoveTo(lvl, C.b, lvl.PosToInt(x, y, (ushort)(z - 1)), target); break; case 12: case 13: case 14: - MoveFish(lvl, C.b, lvl.PosToInt(x, y, (ushort)(z + 1)), target); + MoveTo(lvl, C.b, lvl.PosToInt(x, y, (ushort)(z + 1)), target); break; } } diff --git a/MCGalaxy/Levels/Level.Physics.cs b/MCGalaxy/Levels/Level.Physics.cs index 30197850a..6dacbbc1f 100644 --- a/MCGalaxy/Levels/Level.Physics.cs +++ b/MCGalaxy/Levels/Level.Physics.cs @@ -227,6 +227,12 @@ namespace MCGalaxy { //ListCheck.Add(new Check(b)); //Lousy back up plan } } + + internal bool AddUpdate(int b, ExtBlock block, bool overRide = false) { + PhysicsArgs args = default(PhysicsArgs); + args.ExtBlock = block.BlockID == Block.custom_block; + return AddUpdate(b, block.RawID, overRide, args); + } internal bool AddUpdate(int b, byte type, bool overRide = false) { return AddUpdate(b, type, overRide, default(PhysicsArgs));