Fixed a repeater issue
* Repeaters now properly continuously update their powering * Minor cosmetic improvements
This commit is contained in:
parent
4b28a24514
commit
c1deda5d8f
@ -788,12 +788,12 @@ void cIncrementalRedstoneSimulator::HandleRedstoneRepeater(int a_RelBlockX, int
|
|||||||
{
|
{
|
||||||
WereItrsChanged = QueueRepeaterPowerChange(a_RelBlockX, a_RelBlockY, a_RelBlockZ, a_Meta, false);
|
WereItrsChanged = QueueRepeaterPowerChange(a_RelBlockX, a_RelBlockY, a_RelBlockZ, a_Meta, false);
|
||||||
}
|
}
|
||||||
else
|
else if (a_Itr != m_RepeatersDelayList->end())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (a_Itr != m_RepeatersDelayList->end())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1429,8 +1429,7 @@ bool cIncrementalRedstoneSimulator::AreCoordsLinkedPowered(int a_RelBlockX, int
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// IsRepeaterPowered tests if a repeater should be powered by testing for power sources behind the repeater.
|
|
||||||
// It takes the coordinates of the repeater the the meta value.
|
|
||||||
bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, NIBBLETYPE a_Meta)
|
bool cIncrementalRedstoneSimulator::IsRepeaterPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, NIBBLETYPE a_Meta)
|
||||||
{
|
{
|
||||||
// Repeaters cannot be powered by any face except their back; verify that this is true for a source
|
// Repeaters cannot be powered by any face except their back; verify that this is true for a source
|
||||||
@ -1510,19 +1509,19 @@ bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_RelBlockX, int a_RelB
|
|||||||
case 0x0:
|
case 0x0:
|
||||||
case 0x2:
|
case 0x2:
|
||||||
{
|
{
|
||||||
// Check if eastern(right) neighbor is a powered on repeater who is facing us.
|
// Check if eastern(right) neighbor is a powered on repeater who is facing us
|
||||||
BLOCKTYPE Block = 0;
|
BLOCKTYPE Block = 0;
|
||||||
if (m_Chunk->UnboundedRelGetBlockType(a_RelBlockX + 1, a_RelBlockY, a_RelBlockZ, Block) && (Block == E_BLOCK_REDSTONE_REPEATER_ON)) // Is right neighbor a powered repeater?
|
if (m_Chunk->UnboundedRelGetBlockType(a_RelBlockX + 1, a_RelBlockY, a_RelBlockZ, Block) && (Block == E_BLOCK_REDSTONE_REPEATER_ON)) // Is right neighbor a powered repeater?
|
||||||
{
|
{
|
||||||
NIBBLETYPE OtherRepeaterDir = m_Chunk->GetMeta(a_RelBlockX + 1, a_RelBlockY, a_RelBlockZ) & 0x3;
|
NIBBLETYPE OtherRepeaterDir = m_Chunk->GetMeta(a_RelBlockX + 1, a_RelBlockY, a_RelBlockZ) & 0x3;
|
||||||
if (OtherRepeaterDir == 0x3) { return true; } // If so, I am latched/locked.
|
if (OtherRepeaterDir == 0x3) { return true; } // If so, I am latched/locked
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if western(left) neighbor is a powered on repeater who is facing us.
|
// Check if western(left) neighbor is a powered on repeater who is facing us
|
||||||
if (m_Chunk->UnboundedRelGetBlockType(a_RelBlockX - 1, a_RelBlockY, a_RelBlockZ, Block) && (Block == E_BLOCK_REDSTONE_REPEATER_ON))
|
if (m_Chunk->UnboundedRelGetBlockType(a_RelBlockX - 1, a_RelBlockY, a_RelBlockZ, Block) && (Block == E_BLOCK_REDSTONE_REPEATER_ON))
|
||||||
{
|
{
|
||||||
NIBBLETYPE OtherRepeaterDir = m_Chunk->GetMeta(a_RelBlockX -1, a_RelBlockY, a_RelBlockZ) & 0x3;
|
NIBBLETYPE OtherRepeaterDir = m_Chunk->GetMeta(a_RelBlockX -1, a_RelBlockY, a_RelBlockZ) & 0x3;
|
||||||
if (OtherRepeaterDir == 0x1) { return true; } // If so, I am latched/locked.
|
if (OtherRepeaterDir == 0x1) { return true; } // If so, I am latched/locked
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -1532,26 +1531,26 @@ bool cIncrementalRedstoneSimulator::IsRepeaterLocked(int a_RelBlockX, int a_RelB
|
|||||||
case 0x1:
|
case 0x1:
|
||||||
case 0x3:
|
case 0x3:
|
||||||
{
|
{
|
||||||
// Check if southern(down) neighbor is a powered on repeater who is facing us.
|
// Check if southern(down) neighbor is a powered on repeater who is facing us
|
||||||
BLOCKTYPE Block = 0;
|
BLOCKTYPE Block = 0;
|
||||||
if (m_Chunk->UnboundedRelGetBlockType(a_RelBlockX, a_RelBlockY, a_RelBlockZ + 1, Block) && (Block == E_BLOCK_REDSTONE_REPEATER_ON))
|
if (m_Chunk->UnboundedRelGetBlockType(a_RelBlockX, a_RelBlockY, a_RelBlockZ + 1, Block) && (Block == E_BLOCK_REDSTONE_REPEATER_ON))
|
||||||
{
|
{
|
||||||
NIBBLETYPE OtherRepeaterDir = m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ + 1) & 0x3;
|
NIBBLETYPE OtherRepeaterDir = m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ + 1) & 0x3;
|
||||||
if (OtherRepeaterDir == 0x0) { return true; } // If so, am latched/locked.
|
if (OtherRepeaterDir == 0x0) { return true; } // If so, am latched/locked
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if northern(up) neighbor is a powered on repeater who is facing us.
|
// Check if northern(up) neighbor is a powered on repeater who is facing us
|
||||||
if (m_Chunk->UnboundedRelGetBlockType(a_RelBlockX, a_RelBlockY, a_RelBlockZ - 1, Block) && (Block == E_BLOCK_REDSTONE_REPEATER_ON))
|
if (m_Chunk->UnboundedRelGetBlockType(a_RelBlockX, a_RelBlockY, a_RelBlockZ - 1, Block) && (Block == E_BLOCK_REDSTONE_REPEATER_ON))
|
||||||
{
|
{
|
||||||
NIBBLETYPE OtherRepeaterDir = m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ - 1) & 0x3;
|
NIBBLETYPE OtherRepeaterDir = m_Chunk->GetMeta(a_RelBlockX, a_RelBlockY, a_RelBlockZ - 1) & 0x3;
|
||||||
if (OtherRepeaterDir == 0x2) { return true; } // If so, I am latched/locked.
|
if (OtherRepeaterDir == 0x2) { return true; } // If so, I am latched/locked
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false; // None of the checks succeeded, I am not a locked repeater.
|
return false; // None of the checks succeeded, I am not a locked repeater
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1610,7 +1609,7 @@ bool cIncrementalRedstoneSimulator::IsWirePowered(int a_RelBlockX, int a_RelBloc
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
a_PowerLevel = std::max(a_PowerLevel, itr->a_PowerLevel);
|
a_PowerLevel = itr->a_PowerLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (LinkedBlocksList::const_iterator itr = m_LinkedPoweredBlocks->begin(); itr != m_LinkedPoweredBlocks->end(); ++itr) // Check linked powered list
|
for (LinkedBlocksList::const_iterator itr = m_LinkedPoweredBlocks->begin(); itr != m_LinkedPoweredBlocks->end(); ++itr) // Check linked powered list
|
||||||
@ -1619,10 +1618,10 @@ bool cIncrementalRedstoneSimulator::IsWirePowered(int a_RelBlockX, int a_RelBloc
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
a_PowerLevel = std::max(a_PowerLevel, itr->a_PowerLevel);
|
a_PowerLevel = itr->a_PowerLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (a_PowerLevel != 0); // Source was in front of the piston's front face
|
return (a_PowerLevel != 0); // Answer the inital question: is the wire powered?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ private:
|
|||||||
bool AreCoordsLinkedPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
bool AreCoordsLinkedPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
||||||
/** Returns if a coordinate was marked as simulated (for blocks toggleable by players) */
|
/** Returns if a coordinate was marked as simulated (for blocks toggleable by players) */
|
||||||
bool AreCoordsSimulated(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, bool IsCurrentStatePowered);
|
bool AreCoordsSimulated(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, bool IsCurrentStatePowered);
|
||||||
/** Returns if a repeater is powered */
|
/** Returns if a repeater is powered by testing for power sources behind the repeater */
|
||||||
bool IsRepeaterPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, NIBBLETYPE a_Meta);
|
bool IsRepeaterPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, NIBBLETYPE a_Meta);
|
||||||
/** Returns if a repeater is locked */
|
/** Returns if a repeater is locked */
|
||||||
bool IsRepeaterLocked(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, NIBBLETYPE a_Meta);
|
bool IsRepeaterLocked(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, NIBBLETYPE a_Meta);
|
||||||
|
Loading…
Reference in New Issue
Block a user