From 8e98a0a89d5a835a2dcfc14d08d0b25a9dc51dce Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 4 Apr 2016 19:27:22 +1000 Subject: [PATCH] More modularising physics. (broken odoors) --- Blocks/Behaviour/Block.Behaviour.cs | 64 +++++++++++++++++ Levels/Level.Physics.cs | 105 +--------------------------- Levels/Physics/DoorPhysics.cs | 34 +-------- Levels/Physics/OtherPhysics.cs | 3 +- 4 files changed, 71 insertions(+), 135 deletions(-) diff --git a/Blocks/Behaviour/Block.Behaviour.cs b/Blocks/Behaviour/Block.Behaviour.cs index ca60e58b8..995e7d844 100644 --- a/Blocks/Behaviour/Block.Behaviour.cs +++ b/Blocks/Behaviour/Block.Behaviour.cs @@ -42,6 +42,7 @@ namespace MCGalaxy { /// If this returns true, the usual 'death check' behaviour is skipped. 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; + } + } } } } diff --git a/Levels/Level.Physics.cs b/Levels/Level.Physics.cs index 4ffd698c2..4fc566435 100644 --- a/Levels/Level.Physics.cs +++ b/Levels/Level.Physics.cs @@ -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) { diff --git a/Levels/Physics/DoorPhysics.cs b/Levels/Physics/DoorPhysics.cs index 0b587f629..80f767790 100644 --- a/Levels/Physics/DoorPhysics.cs +++ b/Levels/Physics/DoorPhysics.cs @@ -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)); diff --git a/Levels/Physics/OtherPhysics.cs b/Levels/Physics/OtherPhysics.cs index c41462a80..acb6ec063 100644 --- a/Levels/Physics/OtherPhysics.cs +++ b/Levels/Physics/OtherPhysics.cs @@ -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