diff --git a/MCGalaxy/Blocks/Physics/ActivateablePhysics.cs b/MCGalaxy/Blocks/Physics/ActivateablePhysics.cs index 8b313c9de..568f7f871 100644 --- a/MCGalaxy/Blocks/Physics/ActivateablePhysics.cs +++ b/MCGalaxy/Blocks/Physics/ActivateablePhysics.cs @@ -85,6 +85,7 @@ namespace MCGalaxy.Blocks.Physics { } } + internal static PhysicsArgs GetDoorArgs(byte raw, bool isExt, out byte physForm) { PhysicsArgs args = default(PhysicsArgs); args.Type1 = PhysicsArgs.Wait; args.Value1 = 16 - 1; @@ -112,5 +113,46 @@ namespace MCGalaxy.Blocks.Physics { args.ExtBlock = isExt; return args; } + + + internal static void CheckNeighbours(Level lvl, ushort x, ushort y, ushort z) { + CheckAt(lvl, lvl.PosToInt((ushort)(x + 1), y, z)); + CheckAt(lvl, lvl.PosToInt((ushort)(x - 1), y, z)); + CheckAt(lvl, lvl.PosToInt(x, y, (ushort)(z + 1))); + CheckAt(lvl, lvl.PosToInt(x, y, (ushort)(z - 1))); + CheckAt(lvl, lvl.PosToInt(x, (ushort)(y + 1), z)); + // ommision of y-1 to match original behaviour + } + + internal static void CheckAt(Level lvl, int index) { + if (index == -1) return; + byte block = lvl.blocks[index]; + byte convBlock = Block.Convert(block); + if (convBlock == Block.water || convBlock == Block.lava || + (block >= Block.red && block <= Block.white)) { + lvl.AddCheck(index); return; + } + + switch (block) { + //case Block.water: + //case Block.lava: + case Block.shrub: + case Block.sand: + case Block.gravel: + case Block.leaf: + case Block.wood_float: + /*case Block.lava_fast: + case Block.WaterDown: + case Block.LavaDown: + case Block.deathlava: + case Block.deathwater: + case Block.geyser: + case Block.magma:*/ + lvl.AddCheck(index); + break; + default: + break; + } + } } } \ No newline at end of file diff --git a/MCGalaxy/Blocks/Physics/AirPhysics.cs b/MCGalaxy/Blocks/Physics/AirPhysics.cs index 6046dfe37..532c0691d 100644 --- a/MCGalaxy/Blocks/Physics/AirPhysics.cs +++ b/MCGalaxy/Blocks/Physics/AirPhysics.cs @@ -26,12 +26,8 @@ namespace MCGalaxy.Blocks.Physics { ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); - PhysAir(lvl, lvl.PosToInt((ushort)(x + 1), y, z)); - PhysAir(lvl, lvl.PosToInt((ushort)(x - 1), y, z)); - PhysAir(lvl, lvl.PosToInt(x, y, (ushort)(z + 1))); - PhysAir(lvl, lvl.PosToInt(x, y, (ushort)(z - 1))); - PhysAir(lvl, lvl.PosToInt(x, (ushort)(y + 1), z)); - PhysAir(lvl, lvl.PosToInt(x, (ushort)(y - 1), z)); + ActivateablePhysics.CheckNeighbours(lvl, x, y, z); + ActivateablePhysics.CheckAt(lvl, lvl.PosToInt(x, (ushort)(y - 1), z)); //Edge of map water if (lvl.edgeWater && (y < lvl.Height / 2 && y >= (lvl.Height / 2) - 2)) { @@ -77,36 +73,5 @@ namespace MCGalaxy.Blocks.Physics { if (curBlock == Block.water || curBlock == Block.lava) lvl.AddUpdate(index, block); } - - internal static void PhysAir(Level lvl, int index) { - if (index == -1) return; - byte block = lvl.blocks[index]; - byte convBlock = Block.Convert(block); - if (convBlock == Block.water || convBlock == Block.lava || - (block >= Block.red && block <= Block.white)) { - lvl.AddCheck(index); return; - } - - switch (block) { - //case Block.water: - //case Block.lava: - case Block.shrub: - case Block.sand: - case Block.gravel: - case Block.leaf: - case Block.wood_float: - /*case Block.lava_fast: - case Block.WaterDown: - case Block.LavaDown: - case Block.deathlava: - case Block.deathwater: - case Block.geyser: - case Block.magma:*/ - lvl.AddCheck(index); - break; - default: - break; - } - } } } diff --git a/MCGalaxy/Blocks/Physics/LeafPhysics.cs b/MCGalaxy/Blocks/Physics/LeafPhysics.cs index 5305d30b2..6febf5809 100644 --- a/MCGalaxy/Blocks/Physics/LeafPhysics.cs +++ b/MCGalaxy/Blocks/Physics/LeafPhysics.cs @@ -24,13 +24,8 @@ namespace MCGalaxy.Blocks.Physics { public static void DoLeaf(Level lvl, ref Check C) { if (lvl.physics > 1) { //Adv physics kills flowers and mushroos in water/lava ushort x, y, z; - lvl.IntToPos(C.b, out x, out y, out z); - - AirPhysics.PhysAir(lvl, lvl.PosToInt((ushort)(x + 1), y, z)); - AirPhysics.PhysAir(lvl, lvl.PosToInt((ushort)(x - 1), y, z)); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, y, (ushort)(z + 1))); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, y, (ushort)(z - 1))); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, (ushort)(y + 1), z)); + lvl.IntToPos(C.b, out x, out y, out z); + ActivateablePhysics.CheckNeighbours(lvl, x, y, z); } // Just immediately remove from physics list diff --git a/MCGalaxy/Blocks/Physics/OtherPhysics.cs b/MCGalaxy/Blocks/Physics/OtherPhysics.cs index 99fab68f1..a645fa6bb 100644 --- a/MCGalaxy/Blocks/Physics/OtherPhysics.cs +++ b/MCGalaxy/Blocks/Physics/OtherPhysics.cs @@ -62,11 +62,7 @@ namespace MCGalaxy.Blocks.Physics { else lvl.AddUpdate(lvl.IntOffset(index, 0, 1, 0), block); - AirPhysics.PhysAir(lvl, lvl.PosToInt((ushort)(x + 1), y, z)); - AirPhysics.PhysAir(lvl, lvl.PosToInt((ushort)(x - 1), y, z)); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, y, (ushort)(z + 1))); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, y, (ushort)(z - 1))); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, (ushort)(y + 1), z)); + ActivateablePhysics.CheckNeighbours(lvl, x, y, z); } C.data.Data = PhysicsArgs.RemoveFromChecks; } @@ -107,11 +103,7 @@ namespace MCGalaxy.Blocks.Physics { ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); if (lvl.physics > 1) { //Adv physics kills flowers and mushroos in water/lava - AirPhysics.PhysAir(lvl, lvl.PosToInt((ushort)(x + 1), y, z)); - AirPhysics.PhysAir(lvl, lvl.PosToInt((ushort)(x - 1), y, z)); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, y, (ushort)(z + 1))); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, y, (ushort)(z - 1))); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, (ushort)(y + 1), z)); + ActivateablePhysics.CheckNeighbours(lvl, x, y, z); } if (!lvl.growTrees) { C.data.Data = PhysicsArgs.RemoveFromChecks; return; } @@ -190,11 +182,7 @@ namespace MCGalaxy.Blocks.Physics { lvl.IntToPos(C.b, out x, out y, out z); //Adv physics kills flowers and mushroos in water/lava - AirPhysics.PhysAir(lvl, lvl.PosToInt((ushort)(x + 1), y, z)); - AirPhysics.PhysAir(lvl, lvl.PosToInt((ushort)(x - 1), y, z)); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, y, (ushort)(z + 1))); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, y, (ushort)(z - 1))); - AirPhysics.PhysAir(lvl, lvl.PosToInt(x, (ushort)(y + 1), z)); + ActivateablePhysics.CheckNeighbours(lvl, x, y, z); C.data.Data = PhysicsArgs.RemoveFromChecks; } }