Merge pull request #454 from mc-server/repeaters
Fixed repeaters delay, maybe
This commit is contained in:
commit
8c02f2c8e1
@ -662,6 +662,7 @@ public:
|
|||||||
g_BlockTransparent[E_BLOCK_CROPS] = true;
|
g_BlockTransparent[E_BLOCK_CROPS] = true;
|
||||||
g_BlockTransparent[E_BLOCK_DANDELION] = true;
|
g_BlockTransparent[E_BLOCK_DANDELION] = true;
|
||||||
g_BlockTransparent[E_BLOCK_DETECTOR_RAIL] = true;
|
g_BlockTransparent[E_BLOCK_DETECTOR_RAIL] = true;
|
||||||
|
g_BlockTransparent[E_BLOCK_ENDER_CHEST] = true;
|
||||||
g_BlockTransparent[E_BLOCK_FENCE] = true;
|
g_BlockTransparent[E_BLOCK_FENCE] = true;
|
||||||
g_BlockTransparent[E_BLOCK_FENCE_GATE] = true;
|
g_BlockTransparent[E_BLOCK_FENCE_GATE] = true;
|
||||||
g_BlockTransparent[E_BLOCK_FIRE] = true;
|
g_BlockTransparent[E_BLOCK_FIRE] = true;
|
||||||
@ -691,12 +692,14 @@ public:
|
|||||||
g_BlockTransparent[E_BLOCK_STAINED_GLASS_PANE] = true;
|
g_BlockTransparent[E_BLOCK_STAINED_GLASS_PANE] = true;
|
||||||
g_BlockTransparent[E_BLOCK_STATIONARY_LAVA] = true;
|
g_BlockTransparent[E_BLOCK_STATIONARY_LAVA] = true;
|
||||||
g_BlockTransparent[E_BLOCK_STATIONARY_WATER] = true;
|
g_BlockTransparent[E_BLOCK_STATIONARY_WATER] = true;
|
||||||
|
g_BlockTransparent[E_BLOCK_STONE_BUTTON] = true;
|
||||||
g_BlockTransparent[E_BLOCK_STONE_PRESSURE_PLATE] = true;
|
g_BlockTransparent[E_BLOCK_STONE_PRESSURE_PLATE] = true;
|
||||||
g_BlockTransparent[E_BLOCK_TALL_GRASS] = true;
|
g_BlockTransparent[E_BLOCK_TALL_GRASS] = true;
|
||||||
g_BlockTransparent[E_BLOCK_TORCH] = true;
|
g_BlockTransparent[E_BLOCK_TORCH] = true;
|
||||||
g_BlockTransparent[E_BLOCK_VINES] = true;
|
g_BlockTransparent[E_BLOCK_VINES] = true;
|
||||||
g_BlockTransparent[E_BLOCK_WALLSIGN] = true;
|
g_BlockTransparent[E_BLOCK_WALLSIGN] = true;
|
||||||
g_BlockTransparent[E_BLOCK_WATER] = true;
|
g_BlockTransparent[E_BLOCK_WATER] = true;
|
||||||
|
g_BlockTransparent[E_BLOCK_WOODEN_BUTTON] = true;
|
||||||
g_BlockTransparent[E_BLOCK_WOODEN_DOOR] = true;
|
g_BlockTransparent[E_BLOCK_WOODEN_DOOR] = true;
|
||||||
g_BlockTransparent[E_BLOCK_WOODEN_PRESSURE_PLATE] = true;
|
g_BlockTransparent[E_BLOCK_WOODEN_PRESSURE_PLATE] = true;
|
||||||
|
|
||||||
|
@ -228,12 +228,13 @@ void cRedstoneSimulator::SimulateChunk(float a_Dt, int a_ChunkX, int a_ChunkZ, c
|
|||||||
int a_Z = BaseZ + dataitr->z;
|
int a_Z = BaseZ + dataitr->z;
|
||||||
switch (BlockType)
|
switch (BlockType)
|
||||||
{
|
{
|
||||||
case E_BLOCK_BLOCK_OF_REDSTONE: HandleRedstoneBlock(a_X, dataitr->y, a_Z); break;
|
case E_BLOCK_BLOCK_OF_REDSTONE: HandleRedstoneBlock(a_X, dataitr->y, a_Z); break;
|
||||||
case E_BLOCK_LEVER: HandleRedstoneLever(a_X, dataitr->y, a_Z); break;
|
case E_BLOCK_LEVER: HandleRedstoneLever(a_X, dataitr->y, a_Z); break;
|
||||||
case E_BLOCK_TNT: HandleTNT(a_X, dataitr->y, a_Z); break;
|
case E_BLOCK_TNT: HandleTNT(a_X, dataitr->y, a_Z); break;
|
||||||
case E_BLOCK_TRAPDOOR: HandleTrapdoor(a_X, dataitr->y, a_Z); break;
|
case E_BLOCK_TRAPDOOR: HandleTrapdoor(a_X, dataitr->y, a_Z); break;
|
||||||
case E_BLOCK_REDSTONE_WIRE: HandleRedstoneWire(a_X, dataitr->y, a_Z); break;
|
case E_BLOCK_REDSTONE_WIRE: HandleRedstoneWire(a_X, dataitr->y, a_Z); break;
|
||||||
case E_BLOCK_NOTE_BLOCK: HandleNoteBlock(a_X, dataitr->y, a_Z); break;
|
case E_BLOCK_NOTE_BLOCK: HandleNoteBlock(a_X, dataitr->y, a_Z); break;
|
||||||
|
case E_BLOCK_DAYLIGHT_SENSOR: HandleDaylightSensor(a_X, dataitr->y, a_Z); break;
|
||||||
|
|
||||||
case E_BLOCK_REDSTONE_TORCH_OFF:
|
case E_BLOCK_REDSTONE_TORCH_OFF:
|
||||||
case E_BLOCK_REDSTONE_TORCH_ON:
|
case E_BLOCK_REDSTONE_TORCH_ON:
|
||||||
@ -611,7 +612,10 @@ void cRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_BlockY, int
|
|||||||
{
|
{
|
||||||
if (itr->ShouldPowerOn)
|
if (itr->ShouldPowerOn)
|
||||||
{
|
{
|
||||||
m_World.SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_REPEATER_ON, a_Meta);
|
if (!IsOn)
|
||||||
|
{
|
||||||
|
m_World.SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_REPEATER_ON, a_Meta); // For performance
|
||||||
|
}
|
||||||
|
|
||||||
switch (a_Meta & 0x3) // We only want the direction (bottom) bits
|
switch (a_Meta & 0x3) // We only want the direction (bottom) bits
|
||||||
{
|
{
|
||||||
@ -647,7 +651,10 @@ void cRedstoneSimulator::HandleRedstoneRepeater(int a_BlockX, int a_BlockY, int
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_World.SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_REPEATER_OFF, a_Meta);
|
if (IsOn)
|
||||||
|
{
|
||||||
|
m_World.SetBlock(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_REDSTONE_REPEATER_OFF, a_Meta);
|
||||||
|
}
|
||||||
m_RepeatersDelayList.erase(itr); // We can remove off repeaters which don't need further updating
|
m_RepeatersDelayList.erase(itr); // We can remove off repeaters which don't need further updating
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -814,6 +821,7 @@ void cRedstoneSimulator::HandleRail(int a_BlockX, int a_BlockY, int a_BlockZ, BL
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
default: LOGD("Unhandled type of rail in %s", __FUNCTION__);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -887,6 +895,18 @@ void cRedstoneSimulator::HandleNoteBlock(int a_BlockX, int a_BlockY, int a_Block
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cRedstoneSimulator::HandleDaylightSensor(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||||
|
{
|
||||||
|
if (m_World.GetBlockSkyLight(a_BlockX, a_BlockY + 1, a_BlockZ) > 10)
|
||||||
|
{
|
||||||
|
SetAllDirsAsPowered(a_BlockX, a_BlockY, a_BlockZ, E_BLOCK_DAYLIGHT_SENSOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cRedstoneSimulator::AreCoordsDirectlyPowered(int a_BlockX, int a_BlockY, int a_BlockZ)
|
bool cRedstoneSimulator::AreCoordsDirectlyPowered(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||||
{
|
{
|
||||||
for (PoweredBlocksList::const_iterator itr = m_PoweredBlocks.begin(); itr != m_PoweredBlocks.end(); ++itr) // Check powered list
|
for (PoweredBlocksList::const_iterator itr = m_PoweredBlocks.begin(); itr != m_PoweredBlocks.end(); ++itr) // Check powered list
|
||||||
@ -1298,7 +1318,7 @@ void cRedstoneSimulator::QueueRepeaterPowerChange(int a_BlockX, int a_BlockY, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Already in here (normal to allow repeater to continue on powering and updating blocks in front) - just update info and quit
|
// Already in here (normal to allow repeater to continue on powering and updating blocks in front) - just update info and quit
|
||||||
itr->a_DelayTicks = ((a_Meta & 0xC) >> 0x2) + 1;
|
itr->a_DelayTicks = (((a_Meta & 0xC) >> 0x2) + 1) * 2; // See below for description
|
||||||
itr->a_ElapsedTicks = 0;
|
itr->a_ElapsedTicks = 0;
|
||||||
itr->ShouldPowerOn = ShouldPowerOn;
|
itr->ShouldPowerOn = ShouldPowerOn;
|
||||||
return;
|
return;
|
||||||
@ -1308,7 +1328,12 @@ void cRedstoneSimulator::QueueRepeaterPowerChange(int a_BlockX, int a_BlockY, in
|
|||||||
// Self not in list, add self to list
|
// Self not in list, add self to list
|
||||||
sRepeatersDelayList RC;
|
sRepeatersDelayList RC;
|
||||||
RC.a_BlockPos = Vector3i(a_BlockX, a_BlockY, a_BlockZ);
|
RC.a_BlockPos = Vector3i(a_BlockX, a_BlockY, a_BlockZ);
|
||||||
RC.a_DelayTicks = ((a_Meta & 0xC) >> 0x2) + 1; // Gets the top two bits (delay time), shifts them into the lower two bits, and adds one (meta 0 = 1 tick; 1 = 2 etc.)
|
|
||||||
|
// Gets the top two bits (delay time), shifts them into the lower two bits, and adds one (meta 0 = 1 tick; 1 = 2 etc.)
|
||||||
|
// * 2 because apparently, MCS ticks are way faster than vanilla ticks, so repeater aren't noticeably delayed
|
||||||
|
RC.a_DelayTicks = (((a_Meta & 0xC) >> 0x2) + 1) * 2;
|
||||||
|
|
||||||
|
|
||||||
RC.a_ElapsedTicks = 0;
|
RC.a_ElapsedTicks = 0;
|
||||||
RC.ShouldPowerOn = ShouldPowerOn;
|
RC.ShouldPowerOn = ShouldPowerOn;
|
||||||
m_RepeatersDelayList.push_back(RC);
|
m_RepeatersDelayList.push_back(RC);
|
||||||
|
@ -115,6 +115,8 @@ private:
|
|||||||
void HandleTrapdoor(int a_BlockX, int a_BlockY, int a_BlockZ);
|
void HandleTrapdoor(int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||||
/// <summary>Handles noteblocks</summary>
|
/// <summary>Handles noteblocks</summary>
|
||||||
void HandleNoteBlock(int a_BlockX, int a_BlockY, int a_BlockZ);
|
void HandleNoteBlock(int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||||
|
/// <summary>Handles noteblocks</summary>
|
||||||
|
void HandleDaylightSensor(int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||||
/* ===================== */
|
/* ===================== */
|
||||||
|
|
||||||
/* ====== Helper functions ====== */
|
/* ====== Helper functions ====== */
|
||||||
@ -164,13 +166,11 @@ private:
|
|||||||
case E_BLOCK_STICKY_PISTON:
|
case E_BLOCK_STICKY_PISTON:
|
||||||
case E_BLOCK_REDSTONE_REPEATER_ON:
|
case E_BLOCK_REDSTONE_REPEATER_ON:
|
||||||
case E_BLOCK_REDSTONE_REPEATER_OFF:
|
case E_BLOCK_REDSTONE_REPEATER_OFF:
|
||||||
|
case E_BLOCK_DAYLIGHT_SENSOR:
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
default:
|
default: return true;
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,6 +208,7 @@ private:
|
|||||||
{
|
{
|
||||||
switch (Block)
|
switch (Block)
|
||||||
{
|
{
|
||||||
|
case E_BLOCK_DAYLIGHT_SENSOR:
|
||||||
case E_BLOCK_WOODEN_BUTTON:
|
case E_BLOCK_WOODEN_BUTTON:
|
||||||
case E_BLOCK_STONE_BUTTON:
|
case E_BLOCK_STONE_BUTTON:
|
||||||
case E_BLOCK_REDSTONE_WIRE:
|
case E_BLOCK_REDSTONE_WIRE:
|
||||||
|
Loading…
Reference in New Issue
Block a user