Fix door_green blocks removed when they activate a neighbouring fireworks/rocket/tnt block and the physics level is doors-only.

This commit is contained in:
UnknownShadow200 2016-03-25 09:53:20 +11:00
parent 6f06dff408
commit 16b13ff70a

View File

@ -123,8 +123,7 @@ namespace MCGalaxy.BlockPhysics {
static void AnyDoor(Level lvl, Check C, ushort x, ushort y, ushort z, int timer, bool instaUpdate = false) { static void AnyDoor(Level lvl, Check C, ushort x, ushort y, ushort z, int timer, bool instaUpdate = false) {
if (C.time != 0) { if (C.time != 0) {
CheckDoorRevert(lvl, C, timer); CheckDoorRevert(lvl, C, timer); return;
return;
} }
PhysDoor(lvl, (ushort)(x + 1), y, z, instaUpdate); PhysDoor(lvl, (ushort)(x + 1), y, z, instaUpdate);
PhysDoor(lvl, (ushort)(x - 1), y, z, instaUpdate); PhysDoor(lvl, (ushort)(x - 1), y, z, instaUpdate);
@ -134,20 +133,21 @@ namespace MCGalaxy.BlockPhysics {
PhysDoor(lvl, x, (ushort)(y + 1), z, instaUpdate); PhysDoor(lvl, x, (ushort)(y + 1), z, instaUpdate);
if (lvl.blocks[C.b] != Block.door_green_air) { if (lvl.blocks[C.b] != Block.door_green_air) {
CheckDoorRevert(lvl, C, timer); CheckDoorRevert(lvl, C, timer); return;
return;
} }
if (lvl.physics != 5)
ActivateNeighbours(lvl, C, x, y, z);
CheckDoorRevert(lvl, C, timer);
}
static void ActivateNeighbours(Level lvl, Check C, ushort x, ushort y, ushort z) {
for (int xx = -1; xx <= 1; xx++) for (int xx = -1; xx <= 1; xx++)
for (int yy = -1; yy <= 1; yy++) for (int yy = -1; yy <= 1; yy++)
for (int zz = -1; zz <= 1; zz++) for (int zz = -1; zz <= 1; zz++)
{ {
byte b = lvl.GetTile(lvl.IntOffset(C.b, xx, yy, zz)); byte b = lvl.GetTile(lvl.IntOffset(C.b, xx, yy, zz));
if (b == Block.rocketstart) { if (b == Block.rocketstart) {
if (lvl.physics == 5) {
lvl.Blockchange(x, y, z, Block.air);
return;
}
int b1 = lvl.IntOffset(C.b, xx * 3, yy * 3, zz * 3); int b1 = lvl.IntOffset(C.b, xx * 3, yy * 3, zz * 3);
int b2 = lvl.IntOffset(C.b, xx * 2, yy * 2, zz * 2); int b2 = lvl.IntOffset(C.b, xx * 2, yy * 2, zz * 2);
bool unblocked = lvl.GetTile(b1) == Block.air && lvl.GetTile(b2) == Block.air && bool unblocked = lvl.GetTile(b1) == Block.air && lvl.GetTile(b2) == Block.air &&
@ -159,10 +159,6 @@ namespace MCGalaxy.BlockPhysics {
lvl.AddUpdate(b2, Block.fire); lvl.AddUpdate(b2, Block.fire);
} }
} else if (b == Block.firework) { } else if (b == Block.firework) {
if (lvl.physics == 5) {
lvl.Blockchange(x, y, z, Block.air);
return;
}
int b1 = lvl.IntOffset(C.b, xx, yy + 1, zz); int b1 = lvl.IntOffset(C.b, xx, yy + 1, zz);
int b2 = lvl.IntOffset(C.b, xx, yy + 2, zz); int b2 = lvl.IntOffset(C.b, xx, yy + 2, zz);
bool unblocked = lvl.GetTile(b1) == Block.air && lvl.GetTile(b2) == Block.air && bool unblocked = lvl.GetTile(b1) == Block.air && lvl.GetTile(b2) == Block.air &&
@ -174,14 +170,9 @@ namespace MCGalaxy.BlockPhysics {
lvl.AddUpdate(b1, Block.lavastill, false, "dissipate 100"); lvl.AddUpdate(b1, Block.lavastill, false, "dissipate 100");
} }
} else if (b == Block.tnt) { } else if (b == Block.tnt) {
if (lvl.physics == 5) {
lvl.Blockchange(x, y, z, Block.air);
return;
}
lvl.MakeExplosion((ushort)(x + xx), (ushort)(y + yy), (ushort)(z + zz), 0); lvl.MakeExplosion((ushort)(x + xx), (ushort)(y + yy), (ushort)(z + zz), 0);
} }
} }
CheckDoorRevert(lvl, C, timer);
} }
static void CheckDoorRevert(Level lvl, Check C, int timer) { static void CheckDoorRevert(Level lvl, Check C, int timer) {