mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-25 14:17:29 -04:00
More modularising physics. (broken odoors)
This commit is contained in:
parent
2ee1158f43
commit
8e98a0a89d
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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));
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user