mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-22 12:05:51 -04:00
Tidy up SimpleLiquidPhysics
This commit is contained in:
parent
2f2ac17758
commit
116680cd03
@ -57,57 +57,66 @@ namespace MCGalaxy.Blocks.Physics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const int flowed_xMax = (1 << 0);
|
||||||
|
const int flowed_xMin = (1 << 1);
|
||||||
|
const int flowed_zMax = (1 << 2);
|
||||||
|
const int flowed_zMin = (1 << 3);
|
||||||
|
const int flowed_yMin = (1 << 4);
|
||||||
|
const int flowed_maskAll = 0x1F;
|
||||||
|
|
||||||
|
|
||||||
static void DoWaterRandowFlow(Level lvl, ref Check C) {
|
static void DoWaterRandowFlow(Level lvl, ref Check C) {
|
||||||
Random rand = lvl.physRandom;
|
Random rand = lvl.physRandom;
|
||||||
ushort x, y, z;
|
ushort x, y, z;
|
||||||
lvl.IntToPos(C.b, out x, out y, out z);
|
lvl.IntToPos(C.b, out x, out y, out z);
|
||||||
|
|
||||||
if (!lvl.CheckSpongeWater(x, y, z)) {
|
if (!lvl.CheckSpongeWater(x, y, z)) {
|
||||||
byte flowed = C.data.Data;
|
byte data = C.data.Data;
|
||||||
byte block = lvl.blocks[C.b];
|
byte block = lvl.blocks[C.b];
|
||||||
if (y < lvl.Height - 1)
|
if (y < lvl.Height - 1)
|
||||||
CheckFallingBlocks(lvl, C.b + lvl.Width * lvl.Length);
|
CheckFallingBlocks(lvl, C.b + lvl.Width * lvl.Length);
|
||||||
|
|
||||||
if ((flowed & (1 << 0)) == 0 && rand.Next(4) == 0) {
|
if ((data & flowed_xMax) == 0 && rand.Next(4) == 0) {
|
||||||
LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block);
|
LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block);
|
||||||
flowed |= (1 << 0);
|
data |= flowed_xMax;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 1)) == 0 && rand.Next(4) == 0) {
|
if ((data & flowed_xMin) == 0 && rand.Next(4) == 0) {
|
||||||
LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block);
|
LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block);
|
||||||
flowed |= (1 << 1);
|
data |= flowed_xMin;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 2)) == 0 && rand.Next(4) == 0) {
|
if ((data & flowed_zMax) == 0 && rand.Next(4) == 0) {
|
||||||
LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block);
|
LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block);
|
||||||
flowed |= (1 << 2);
|
data |= flowed_zMax;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 3)) == 0 && rand.Next(4) == 0) {
|
if ((data & flowed_zMin) == 0 && rand.Next(4) == 0) {
|
||||||
LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block);
|
LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block);
|
||||||
flowed |= (1 << 3);
|
data |= flowed_zMin;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 4)) == 0 && rand.Next(4) == 0) {
|
if ((data & flowed_yMin) == 0 && rand.Next(4) == 0) {
|
||||||
LiquidPhysics.PhysWater(lvl, x, (ushort)(y - 1), z, block);
|
LiquidPhysics.PhysWater(lvl, x, (ushort)(y - 1), z, block);
|
||||||
flowed |= (1 << 4);
|
data |= flowed_yMin;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flowed & (1 << 0)) == 0 && WaterBlocked(lvl, (ushort)(x + 1), y, z)) {
|
if ((data & flowed_xMax) == 0 && WaterBlocked(lvl, (ushort)(x + 1), y, z)) {
|
||||||
flowed |= (1 << 0);
|
data |= flowed_xMax;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 1)) == 0 && WaterBlocked(lvl, (ushort)(x - 1), y, z)) {
|
if ((data & flowed_xMin) == 0 && WaterBlocked(lvl, (ushort)(x - 1), y, z)) {
|
||||||
flowed |= (1 << 1);
|
data |= flowed_xMin;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 2)) == 0 && WaterBlocked(lvl, x, y, (ushort)(z + 1))) {
|
if ((data & flowed_zMax) == 0 && WaterBlocked(lvl, x, y, (ushort)(z + 1))) {
|
||||||
flowed |= (1 << 2);
|
data |= flowed_zMax;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 3)) == 0 && WaterBlocked(lvl, x, y, (ushort)(z - 1))) {
|
if ((data & flowed_zMin) == 0 && WaterBlocked(lvl, x, y, (ushort)(z - 1))) {
|
||||||
flowed |= (1 << 3);
|
data |= flowed_zMin;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 4)) == 0 && WaterBlocked(lvl, x, (ushort)(y - 1), z)) {
|
if ((data & flowed_yMin) == 0 && WaterBlocked(lvl, x, (ushort)(y - 1), z)) {
|
||||||
flowed |= (1 << 4);
|
data |= flowed_yMin;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Have we spread now (or been blocked from spreading) in all directions?
|
// Have we spread now (or been blocked from spreading) in all directions?
|
||||||
C.data.Data = flowed;
|
C.data.Data = data;
|
||||||
if (!C.data.HasWait && (flowed & 0x1F) == 0x1F) {
|
if (!C.data.HasWait && (data & 0x1F) == 0x1F) {
|
||||||
C.data.Data = PhysicsArgs.RemoveFromChecks;
|
C.data.Data = PhysicsArgs.RemoveFromChecks;
|
||||||
}
|
}
|
||||||
} else { //was placed near sponge
|
} else { //was placed near sponge
|
||||||
@ -167,58 +176,59 @@ namespace MCGalaxy.Blocks.Physics {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void DoLavaRandowFlow(Level lvl, ref Check C, bool checkWait) {
|
static void DoLavaRandowFlow(Level lvl, ref Check C, bool checkWait) {
|
||||||
Random rand = lvl.physRandom;
|
Random rand = lvl.physRandom;
|
||||||
ushort x, y, z;
|
ushort x, y, z;
|
||||||
lvl.IntToPos(C.b, out x, out y, out z);
|
lvl.IntToPos(C.b, out x, out y, out z);
|
||||||
|
|
||||||
if (!lvl.CheckSpongeLava(x, y, z)) {
|
if (!lvl.CheckSpongeLava(x, y, z)) {
|
||||||
byte flowed = C.data.Data;
|
byte data = C.data.Data;
|
||||||
// Upper 3 bits are time flags - reset random delay
|
// Upper 3 bits are time flags - reset random delay
|
||||||
flowed &= 0x1F;
|
data &= flowed_maskAll;
|
||||||
flowed |= (byte)(rand.Next(3) << 5);
|
data |= (byte)(rand.Next(3) << 5);
|
||||||
byte block = lvl.blocks[C.b];
|
byte block = lvl.blocks[C.b];
|
||||||
|
|
||||||
if ((flowed & (1 << 0)) == 0 && rand.Next(4) == 0) {
|
if ((data & flowed_xMax) == 0 && rand.Next(4) == 0) {
|
||||||
LiquidPhysics.PhysLava(lvl, (ushort)(x + 1), y, z, block);
|
LiquidPhysics.PhysLava(lvl, (ushort)(x + 1), y, z, block);
|
||||||
flowed |= (1 << 0);
|
data |= flowed_xMax;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 1)) == 0 && rand.Next(4) == 0) {
|
if ((data & flowed_xMin) == 0 && rand.Next(4) == 0) {
|
||||||
LiquidPhysics.PhysLava(lvl, (ushort)(x - 1), y, z, block);
|
LiquidPhysics.PhysLava(lvl, (ushort)(x - 1), y, z, block);
|
||||||
flowed |= (1 << 1);
|
data |= flowed_xMin;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 2)) == 0 && rand.Next(4) == 0) {
|
if ((data & flowed_zMax) == 0 && rand.Next(4) == 0) {
|
||||||
LiquidPhysics.PhysLava(lvl, x, y, (ushort)(z + 1), block);
|
LiquidPhysics.PhysLava(lvl, x, y, (ushort)(z + 1), block);
|
||||||
flowed |= (1 << 2);
|
data |= flowed_zMax;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 3)) == 0 && rand.Next(4) == 0) {
|
if ((data & flowed_zMin) == 0 && rand.Next(4) == 0) {
|
||||||
LiquidPhysics.PhysLava(lvl, x, y, (ushort)(z - 1), block);
|
LiquidPhysics.PhysLava(lvl, x, y, (ushort)(z - 1), block);
|
||||||
flowed |= (1 << 3);
|
data |= flowed_zMin;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 4)) == 0 && rand.Next(4) == 0) {
|
if ((data & flowed_yMin) == 0 && rand.Next(4) == 0) {
|
||||||
LiquidPhysics.PhysLava(lvl, x, (ushort)(y - 1), z, block);
|
LiquidPhysics.PhysLava(lvl, x, (ushort)(y - 1), z, block);
|
||||||
flowed |= (1 << 4);
|
data |= flowed_yMin;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flowed & (1 << 0)) == 0 && LavaBlocked(lvl, (ushort)(x + 1), y, z)) {
|
if ((data & flowed_xMax) == 0 && LavaBlocked(lvl, (ushort)(x + 1), y, z)) {
|
||||||
flowed |= (1 << 0);
|
data |= flowed_xMax;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 1)) == 0 && LavaBlocked(lvl, (ushort)(x - 1), y, z)) {
|
if ((data & flowed_xMin) == 0 && LavaBlocked(lvl, (ushort)(x - 1), y, z)) {
|
||||||
flowed |= (1 << 1);
|
data |= flowed_xMin;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 2)) == 0 && LavaBlocked(lvl, x, y, (ushort)(z + 1))) {
|
if ((data & flowed_zMax) == 0 && LavaBlocked(lvl, x, y, (ushort)(z + 1))) {
|
||||||
flowed |= (1 << 2);
|
data |= flowed_zMax;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 3)) == 0 && LavaBlocked(lvl, x, y, (ushort)(z - 1))) {
|
if ((data & flowed_zMin) == 0 && LavaBlocked(lvl, x, y, (ushort)(z - 1))) {
|
||||||
flowed |= (1 << 3);
|
data |= flowed_zMin;
|
||||||
}
|
}
|
||||||
if ((flowed & (1 << 4)) == 0 && LavaBlocked(lvl, x, (ushort)(y - 1), z)) {
|
if ((data & flowed_yMin) == 0 && LavaBlocked(lvl, x, (ushort)(y - 1), z)) {
|
||||||
flowed |= (1 << 4);
|
data |= flowed_yMin;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Have we spread now (or been blocked from spreading) in all directions?
|
// Have we spread now (or been blocked from spreading) in all directions?
|
||||||
C.data.Data = flowed;
|
C.data.Data = data;
|
||||||
if ((!checkWait || !C.data.HasWait) && (flowed & 0x1F) == 0x1F) {
|
if ((!checkWait || !C.data.HasWait) && (data & flowed_maskAll) == flowed_maskAll) {
|
||||||
C.data.Data = PhysicsArgs.RemoveFromChecks;
|
C.data.Data = PhysicsArgs.RemoveFromChecks;
|
||||||
}
|
}
|
||||||
} else { //was placed near sponge
|
} else { //was placed near sponge
|
||||||
|
Loading…
x
Reference in New Issue
Block a user