summaryrefslogtreecommitdiffstats
path: root/src/Simulator/IncrementalRedstoneSimulator/DoorHandler.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Simulator/IncrementalRedstoneSimulator/DoorHandler.h')
-rw-r--r--src/Simulator/IncrementalRedstoneSimulator/DoorHandler.h160
1 files changed, 90 insertions, 70 deletions
diff --git a/src/Simulator/IncrementalRedstoneSimulator/DoorHandler.h b/src/Simulator/IncrementalRedstoneSimulator/DoorHandler.h
index cb772bb5b..9e3a2b6d4 100644
--- a/src/Simulator/IncrementalRedstoneSimulator/DoorHandler.h
+++ b/src/Simulator/IncrementalRedstoneSimulator/DoorHandler.h
@@ -9,90 +9,110 @@
namespace DoorHandler
{
- // "Doormammu, I've come to bargain"
+// "Doormammu, I've come to bargain"
+
+static PowerLevel GetPowerDeliveredToPosition(
+ const cChunk & a_Chunk,
+ Vector3i a_Position,
+ BLOCKTYPE a_BlockType,
+ Vector3i a_QueryPosition,
+ BLOCKTYPE a_QueryBlockType,
+ bool IsLinked
+)
+{
+ UNUSED(a_Chunk);
+ UNUSED(a_Position);
+ UNUSED(a_BlockType);
+ UNUSED(a_QueryPosition);
+ UNUSED(a_QueryBlockType);
+ UNUSED(IsLinked);
+ return 0;
+}
+
+static void ForValidSourcePositions(
+ const cChunk & a_Chunk,
+ Vector3i a_Position,
+ BLOCKTYPE a_BlockType,
+ NIBBLETYPE a_Meta,
+ ForEachSourceCallback & Callback
+)
+{
+ UNUSED(a_Chunk);
+ UNUSED(a_BlockType);
+ UNUSED(a_Meta);
+ InvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);
+}
+
+static void Update(
+ cChunk & a_Chunk,
+ cChunk &,
+ Vector3i a_Position,
+ BLOCKTYPE a_BlockType,
+ NIBBLETYPE a_Meta,
+ PowerLevel Power
+)
+{
+ // LOGD("Evaluating dori the door (%d %d %d)", a_Position.x, a_Position.y, a_Position.z);
- static PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked)
- {
- UNUSED(a_Chunk);
- UNUSED(a_Position);
- UNUSED(a_BlockType);
- UNUSED(a_QueryPosition);
- UNUSED(a_QueryBlockType);
- UNUSED(IsLinked);
- return 0;
- }
+ NIBBLETYPE TopMeta;
+ const bool IsTop = (a_Meta & 0x8) == 0x8;
+ const auto TopPosition = IsTop ? a_Position : a_Position.addedY(1);
- static void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, ForEachSourceCallback & Callback)
+ // Figure out the metadata of the top half, which stores the previous redstone power state:
+ if (IsTop)
{
- UNUSED(a_Chunk);
- UNUSED(a_BlockType);
- UNUSED(a_Meta);
- InvokeForAdjustedRelatives(Callback, a_Position, RelativeAdjacents);
+ TopMeta = a_Meta;
}
-
- static void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, PowerLevel Power)
+ else
{
- // LOGD("Evaluating dori the door (%d %d %d)", a_Position.x, a_Position.y, a_Position.z);
-
- NIBBLETYPE TopMeta;
- const bool IsTop = (a_Meta & 0x8) == 0x8;
- const auto TopPosition = IsTop ? a_Position : a_Position.addedY(1);
-
- // Figure out the metadata of the top half, which stores the previous redstone power state:
- if (IsTop)
+ if (TopPosition.y == cChunkDef::Height)
{
- TopMeta = a_Meta;
+ return;
}
- else
+
+ BLOCKTYPE AboveType;
+ a_Chunk.GetBlockTypeMeta(TopPosition, AboveType, TopMeta);
+ if (!cBlockDoorHandler::IsDoorBlockType(AboveType))
{
- if (TopPosition.y == cChunkDef::Height)
- {
- return;
- }
-
- BLOCKTYPE AboveType;
- a_Chunk.GetBlockTypeMeta(TopPosition, AboveType, TopMeta);
- if (!cBlockDoorHandler::IsDoorBlockType(AboveType))
- {
- return;
- }
+ return;
}
+ }
- const auto OppositeHalfPosition = a_Position + (IsTop ? OffsetYM : OffsetYP);
- ForEachSourceCallback Callback(a_Chunk, OppositeHalfPosition, a_BlockType);
- ForValidSourcePositions(a_Chunk, OppositeHalfPosition, a_BlockType, a_Meta, Callback);
+ const auto OppositeHalfPosition = a_Position + (IsTop ? OffsetYM : OffsetYP);
+ ForEachSourceCallback Callback(a_Chunk, OppositeHalfPosition, a_BlockType);
+ ForValidSourcePositions(a_Chunk, OppositeHalfPosition, a_BlockType, a_Meta, Callback);
- // Factor in what the other half is getting:
- Power = std::max(Power, Callback.Power);
+ // Factor in what the other half is getting:
+ Power = std::max(Power, Callback.Power);
- const bool ShouldBeOpen = Power != 0;
- const bool PreviouslyPowered = (TopMeta & 0x2) == 0x2;
+ const bool ShouldBeOpen = Power != 0;
+ const bool PreviouslyPowered = (TopMeta & 0x2) == 0x2;
- // Allow players to override redstone control
- // don't update if redstone power hasn't changed since we last saw it:
- if (ShouldBeOpen == PreviouslyPowered)
- {
- return;
- }
+ // Allow players to override redstone control
+ // don't update if redstone power hasn't changed since we last saw it:
+ if (ShouldBeOpen == PreviouslyPowered)
+ {
+ return;
+ }
- // Update the previous redstone power:
- if (ShouldBeOpen)
- {
- a_Chunk.SetMeta(TopPosition, TopMeta | 0x2);
- }
- else
- {
- a_Chunk.SetMeta(TopPosition, TopMeta & ~0x2);
- }
+ // Update the previous redstone power:
+ if (ShouldBeOpen)
+ {
+ a_Chunk.SetMeta(TopPosition, TopMeta | 0x2);
+ }
+ else
+ {
+ a_Chunk.SetMeta(TopPosition, TopMeta & ~0x2);
+ }
- cChunkInterface ChunkInterface(a_Chunk.GetWorld()->GetChunkMap());
- const auto AbsolutePosition = cChunkDef::RelativeToAbsolute(a_Position, a_Chunk.GetPos());
+ cChunkInterface ChunkInterface(a_Chunk.GetWorld()->GetChunkMap());
+ const auto AbsolutePosition = cChunkDef::RelativeToAbsolute(a_Position, a_Chunk.GetPos());
- // Toggle the door, if it needs to be changed:
- if (ShouldBeOpen != cBlockDoorHandler::IsOpen(ChunkInterface, AbsolutePosition))
- {
- cBlockDoorHandler::SetOpen(ChunkInterface, AbsolutePosition, ShouldBeOpen);
- a_Chunk.GetWorld()->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_WOODEN_DOOR_OPEN, AbsolutePosition, 0);
- }
+ // Toggle the door, if it needs to be changed:
+ if (ShouldBeOpen != cBlockDoorHandler::IsOpen(ChunkInterface, AbsolutePosition))
+ {
+ cBlockDoorHandler::SetOpen(ChunkInterface, AbsolutePosition, ShouldBeOpen);
+ a_Chunk.GetWorld()->BroadcastSoundParticleEffect(EffectID::SFX_RANDOM_WOODEN_DOOR_OPEN, AbsolutePosition, 0);
}
-};
+}
+}; // namespace DoorHandler