More modularising physics. (broken odoors)

This commit is contained in:
UnknownShadow200 2016-04-04 19:27:22 +10:00
parent 2ee1158f43
commit 8e98a0a89d
4 changed files with 71 additions and 135 deletions

View File

@ -42,6 +42,7 @@ namespace MCGalaxy {
/// <remarks>If this returns true, the usual 'death check' behaviour is skipped. </remarks>
public delegate void HandlePhysics(Level lvl, Check C);
internal static HandlePhysics[] physicsHandlers = new Block.HandlePhysics[256];
internal static HandlePhysics[] physicsDoorsHandlers = new Block.HandlePhysics[256];
static void SetupCoreHandlers() {
deleteHandlers[Block.rocketstart] = DeleteBehaviour.RocketStart;
@ -98,6 +99,69 @@ namespace MCGalaxy {
physicsHandlers[Block.fishgold] = (lvl, C) => HunterPhysics.DoFlee(lvl, C, Block.water);
physicsHandlers[Block.fishsalmon] = (lvl, C) => HunterPhysics.DoFlee(lvl, C, Block.water);
physicsHandlers[Block.fishsponge] = (lvl, C) => HunterPhysics.DoFlee(lvl, C, Block.water);
physicsHandlers[Block.water] = SimpleLiquidPhysics.DoWater;
physicsHandlers[Block.activedeathwater] = SimpleLiquidPhysics.DoWater;
physicsHandlers[Block.lava] = SimpleLiquidPhysics.DoLava;
physicsHandlers[Block.activedeathlava] = SimpleLiquidPhysics.DoLava;
physicsHandlers[Block.WaterDown] = ExtLiquidPhysics.DoWaterfall;
physicsHandlers[Block.LavaDown] = ExtLiquidPhysics.DoLavafall;
physicsHandlers[Block.WaterFaucet] = (lvl, C) =>
ExtLiquidPhysics.DoFaucet(lvl, C, Block.WaterDown);
physicsHandlers[Block.LavaFaucet] = (lvl, C) =>
ExtLiquidPhysics.DoFaucet(lvl, C, Block.LavaDown);
physicsHandlers[Block.finiteWater] = FinitePhysics.DoWaterOrLava;
physicsHandlers[Block.finiteLava] = FinitePhysics.DoWaterOrLava;
physicsHandlers[Block.finiteFaucet] = FinitePhysics.DoFaucet;
physicsHandlers[Block.magma] = ExtLiquidPhysics.DoMagma;
physicsHandlers[Block.geyser] = ExtLiquidPhysics.DoGeyser;
physicsHandlers[Block.lava_fast] = SimpleLiquidPhysics.DoFastLava;
physicsHandlers[Block.fastdeathlava] = SimpleLiquidPhysics.DoFastLava;
physicsHandlers[Block.air] = AirPhysics.DoAir;
physicsHandlers[Block.dirt] = OtherPhysics.DoDirt;
physicsHandlers[Block.leaf] = LeafPhysics.DoLeaf;
physicsHandlers[Block.shrub] = OtherPhysics.DoShrub;
physicsHandlers[Block.fire] = FirePhysics.Do;
physicsHandlers[Block.sand] = OtherPhysics.DoFalling;
physicsHandlers[Block.gravel] = OtherPhysics.DoFalling;
physicsHandlers[Block.cobblestoneslab] = OtherPhysics.DoStairs;
physicsHandlers[Block.staircasestep] = OtherPhysics.DoStairs;
physicsHandlers[Block.wood_float] = OtherPhysics.DoFloatwood;
physicsHandlers[Block.sponge] = (lvl, C) => OtherPhysics.DoSponge(lvl, C, false);
physicsHandlers[Block.lava_sponge] = (lvl, C) => OtherPhysics.DoSponge(lvl, C, true);
//Special blocks that are not saved
physicsHandlers[Block.air_flood] = (lvl, C) =>
AirPhysics.DoFlood(lvl, C, AirFlood.Full, Block.air_flood);
physicsHandlers[Block.air_flood_layer] = (lvl, C) =>
AirPhysics.DoFlood(lvl, C, AirFlood.Layer, Block.air_flood_layer);
physicsHandlers[Block.air_flood_down] = (lvl, C) =>
AirPhysics.DoFlood(lvl, C, AirFlood.Down, Block.air_flood_down);
physicsHandlers[Block.air_flood_up] = (lvl, C) =>
AirPhysics.DoFlood(lvl, C, AirFlood.Up, Block.air_flood_up);
physicsHandlers[Block.smalltnt] = TntPhysics.DoSmallTnt;
physicsHandlers[Block.bigtnt] = (lvl, C) => TntPhysics.DoLargeTnt(lvl, C, 1);
physicsHandlers[Block.nuketnt] = (lvl, C) => TntPhysics.DoLargeTnt(lvl, C, 4);
physicsHandlers[Block.tntexplosion] = TntPhysics.DoTntExplosion;
physicsHandlers[Block.train] = TrainPhysics.Do;
for (int i = 0; i < 256; i++) {
//Adv physics updating anything placed next to water or lava
if ((i >= Block.red && i <= Block.redmushroom) || i == Block.wood ||
i == Block.trunk || i == Block.bookcase) {
physicsHandlers[i] = OtherPhysics.DoOther;
continue;
}
byte odoor = Block.odoor((byte)i);
if (odoor != Block.Zero) {
physicsHandlers[i] = DoorPhysics.odoorPhysics;
physicsDoorsHandlers[i] = DoorPhysics.odoorPhysics;
}
}
}
}
}

View File

@ -136,7 +136,7 @@ namespace MCGalaxy {
if (PhysicsUpdate != null)
PhysicsUpdate(x, y, z, C.time, info, this);
if (info == "" || ExtraInfoPhysics.DoDoorsOnly(this, C, null))
if (info.Length == 0 || ExtraInfoPhysics.DoDoorsOnly(this, C, null))
DoorPhysics.Do(this, C, true);
} catch {
listCheckExists.Set(x, y, z, false);
@ -155,8 +155,8 @@ namespace MCGalaxy {
PhysicsUpdate(x, y, z, C.time, info, this);
if (OnPhysicsUpdateEvent.events.Count > 0)
OnPhysicsUpdateEvent.Call(x, y, z, C.time, info, this);
if (info == "" || ExtraInfoPhysics.DoComplex(this, C))
DoNormalPhysics(x, y, z, C);
if (info.Length == 0 || ExtraInfoPhysics.DoComplex(this, C))
DoorPhysics.Do(this, C, false);
} catch {
listCheckExists.Set(x, y, z, false);
ListCheck.Remove(C);
@ -190,105 +190,6 @@ namespace MCGalaxy {
}
}
void DoNormalPhysics(ushort x, ushort y, ushort z, Check C) {
switch (blocks[C.b]) {
case Block.air:
AirPhysics.DoAir(this, C); break;
case Block.dirt:
OtherPhysics.DoDirt(this, C); break;
case Block.leaf:
LeafPhysics.DoLeaf(this, C); break;
case Block.shrub:
OtherPhysics.DoShrub(this, C); break;
case Block.water:
case Block.activedeathwater:
SimpleLiquidPhysics.DoWater(this, C); break;
case Block.WaterDown:
ExtLiquidPhysics.DoWaterfall(this, C); break;
case Block.LavaDown:
ExtLiquidPhysics.DoLavafall(this, C); break;
case Block.WaterFaucet:
ExtLiquidPhysics.DoFaucet(this, C, Block.WaterDown); break;
case Block.LavaFaucet:
ExtLiquidPhysics.DoFaucet(this, C, Block.LavaDown); break;
case Block.lava:
case Block.activedeathlava:
SimpleLiquidPhysics.DoLava(this, C); break;
case Block.fire:
FirePhysics.Do(this, C); break;
case Block.finiteWater:
case Block.finiteLava:
FinitePhysics.DoWaterOrLava(this, C); break;
case Block.finiteFaucet:
FinitePhysics.DoFaucet(this, C); break;
case Block.sand:
case Block.gravel:
OtherPhysics.DoFalling(this, C, blocks[C.b]); break;
case Block.sponge:
OtherPhysics.DoSponge(this, C, false); break;
case Block.lava_sponge:
OtherPhysics.DoSponge(this, C, true); break;
//Adv physics updating anything placed next to water or lava
case Block.wood: //Wood to die in lava
case Block.trunk: //Wood to die in lava
case Block.yellowflower:
case Block.redflower:
case Block.mushroom:
case Block.redmushroom:
case Block.bookcase:
case Block.red:
case Block.orange:
case Block.yellow:
case Block.lightgreen:
case Block.green:
case Block.aquagreen:
case Block.cyan:
case Block.lightblue:
case Block.blue:
case Block.purple:
case Block.lightpurple:
case Block.pink:
case Block.darkpink:
case Block.darkgrey:
case Block.lightgrey:
case Block.white:
OtherPhysics.DoOther(this, C); break;
case Block.staircasestep:
case Block.cobblestoneslab:
OtherPhysics.DoStairs(this, C); break;
case Block.wood_float:
OtherPhysics.DoFloatwood(this, C); break;
case Block.lava_fast:
case Block.fastdeathlava:
SimpleLiquidPhysics.DoFastLava(this, C); break;
//Special blocks that are not saved
case Block.air_flood:
AirPhysics.DoFlood(this, C, AirFlood.Full, Block.air_flood); break;
case Block.air_flood_layer:
AirPhysics.DoFlood(this, C, AirFlood.Layer, Block.air_flood_layer); break;
case Block.air_flood_down:
AirPhysics.DoFlood(this, C, AirFlood.Down, Block.air_flood_down); break;
case Block.air_flood_up:
AirPhysics.DoFlood(this, C, AirFlood.Up, Block.air_flood_up); break;
case Block.smalltnt:
TntPhysics.DoSmallTnt(this, C); break;
case Block.bigtnt:
TntPhysics.DoLargeTnt(this, C, 1); break;
case Block.nuketnt:
TntPhysics.DoLargeTnt(this, C, 4); break;
case Block.tntexplosion:
TntPhysics.DoTntExplosion(this, C); break;
case Block.train:
TrainPhysics.Do(this, C); break;
case Block.magma:
ExtLiquidPhysics.DoMagma(this, C); break;
case Block.geyser:
ExtLiquidPhysics.DoGeyser(this, C); break;
default:
DoorPhysics.Do(this, C, false); break;
}
}
public void AddCheck(int b, bool overRide = false) { AddCheck(b, overRide, ""); }
public void AddCheck(int b, bool overRide, object data) {

View File

@ -55,35 +55,8 @@ namespace MCGalaxy.BlockPhysics {
AnyDoor(lvl, C, 4, true); break;
case Block.door_tnt_air:
AnyDoor(lvl, C, 4); break;
case Block.odoor1_air:
case Block.odoor2_air:
case Block.odoor3_air:
case Block.odoor4_air:
case Block.odoor5_air:
case Block.odoor6_air:
case Block.odoor7_air:
case Block.odoor8_air:
case Block.odoor9_air:
case Block.odoor10_air:
case Block.odoor11_air:
case Block.odoor12_air:
case Block.odoor1:
case Block.odoor2:
case Block.odoor3:
case Block.odoor4:
case Block.odoor5:
case Block.odoor6:
case Block.odoor7:
case Block.odoor8:
case Block.odoor9:
case Block.odoor10:
case Block.odoor11:
case Block.odoor12:
odoorPhysics(lvl, C);
break;
default:
// TODO: door only selector
Block.HandlePhysics handler = Block.physicsHandlers[lvl.blocks[C.b]];
if (!doorsOnly && handler != null) { handler(lvl, C); return; }
//non special blocks are then ignored, maybe it would be better to avoid getting here and cutting down the list
@ -94,10 +67,7 @@ namespace MCGalaxy.BlockPhysics {
}
public static void odoorPhysics(Level lvl, Check C) {
if (C.time != 0) {
C.time = 0;
return;
}
if (C.time != 0) { C.time = 0; return; }
odoorNeighbour(lvl, C, lvl.IntOffset(C.b, -1, 0, 0));
odoorNeighbour(lvl, C, lvl.IntOffset(C.b, +1, 0, 0));

View File

@ -23,12 +23,13 @@ namespace MCGalaxy.BlockPhysics {
public static class OtherPhysics {
public static void DoFalling(Level lvl, Check C, byte type) {
public static void DoFalling(Level lvl, Check C) {
if (lvl.physics == 0 || lvl.physics == 5) { C.time = 255; return; }
ushort x, y, z;
lvl.IntToPos(C.b, out x, out y, out z);
int index = C.b;
bool movedDown = false;
byte type = lvl.blocks[C.b];
do {
index = lvl.IntOffset(index, 0, -1, 0); //Get block below each loop