Merge pull request #746 from Howaner/Slabs
Add Trapdoor Functions to cWorld and fix Trapdoor Redstone Bugs
This commit is contained in:
commit
71ae689eb7
@ -36,8 +36,10 @@ public:
|
||||
{
|
||||
// Flip the ON bit on/off using the XOR bitwise operation
|
||||
NIBBLETYPE Meta = (a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ) ^ 0x04);
|
||||
|
||||
a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, Meta);
|
||||
|
||||
cWorld * World = (cWorld *) &a_WorldInterface;
|
||||
World->BroadcastSoundParticleEffect(1003, a_BlockX, a_BlockY, a_BlockZ, 0, a_Player->GetClientHandle());
|
||||
}
|
||||
|
||||
virtual bool GetPlacementBlockTypeMeta(
|
||||
|
@ -937,17 +937,15 @@ void cIncrementalRedstoneSimulator::HandleTrapdoor(int a_BlockX, int a_BlockY, i
|
||||
{
|
||||
if (!AreCoordsSimulated(a_BlockX, a_BlockY, a_BlockZ, true))
|
||||
{
|
||||
m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ) | 0x4);
|
||||
m_World.BroadcastSoundParticleEffect(1003, a_BlockX, a_BlockY, a_BlockZ, 0);
|
||||
m_World.SetTrapdoorOpen(a_BlockX, a_BlockY, a_BlockZ, true);
|
||||
SetPlayerToggleableBlockAsSimulated(a_BlockX, a_BlockY, a_BlockZ, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!AreCoordsSimulated(a_BlockX, a_BlockY, a_BlockZ, false))
|
||||
{
|
||||
m_World.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, m_World.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ) & 0xB); // Take into account that the fourth bit is needed for trapdoors too
|
||||
m_World.BroadcastSoundParticleEffect(1003, a_BlockX, a_BlockY, a_BlockZ, 0);
|
||||
m_World.SetTrapdoorOpen(a_BlockX, a_BlockY, a_BlockZ, false);
|
||||
SetPlayerToggleableBlockAsSimulated(a_BlockX, a_BlockY, a_BlockZ, false);
|
||||
}
|
||||
}
|
||||
|
@ -307,25 +307,52 @@ void cWorld::CastThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
|
||||
|
||||
|
||||
int cWorld::GetDefaultWeatherInterval(eWeather a_Weather)
|
||||
{
|
||||
switch (a_Weather)
|
||||
{
|
||||
case eWeather_Sunny:
|
||||
{
|
||||
return 14400 + (m_TickRand.randInt() % 4800); // 12 - 16 minutes
|
||||
}
|
||||
case eWeather_Rain:
|
||||
{
|
||||
return 9600 + (m_TickRand.randInt() % 7200); // 8 - 14 minutes
|
||||
}
|
||||
case eWeather_ThunderStorm:
|
||||
{
|
||||
return 2400 + (m_TickRand.randInt() % 4800); // 2 - 6 minutes
|
||||
}
|
||||
default:
|
||||
{
|
||||
LOGWARNING("Missing default weather interval for weather %d.", a_Weather);
|
||||
return 1200;
|
||||
}
|
||||
} // switch (Weather)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cWorld::SetWeather(eWeather a_NewWeather)
|
||||
{
|
||||
// Do the plugins agree? Do they want a different weather?
|
||||
cRoot::Get()->GetPluginManager()->CallHookWeatherChanging(*this, a_NewWeather);
|
||||
if (cRoot::Get()->GetPluginManager()->CallHookWeatherChanging(*this, a_NewWeather))
|
||||
{
|
||||
m_WeatherInterval = GetDefaultWeatherInterval(m_Weather);
|
||||
return;
|
||||
}
|
||||
|
||||
// Set new period for the selected weather:
|
||||
switch (a_NewWeather)
|
||||
m_WeatherInterval = GetDefaultWeatherInterval(a_NewWeather);
|
||||
|
||||
// The weather can't be found:
|
||||
if (m_WeatherInterval == 1200)
|
||||
{
|
||||
case eWeather_Sunny: m_WeatherInterval = 14400 + (m_TickRand.randInt() % 4800); break; // 12 - 16 minutes
|
||||
case eWeather_Rain: m_WeatherInterval = 9600 + (m_TickRand.randInt() % 7200); break; // 8 - 14 minutes
|
||||
case eWeather_ThunderStorm: m_WeatherInterval = 2400 + (m_TickRand.randInt() % 4800); break; // 2 - 6 minutes
|
||||
default:
|
||||
{
|
||||
LOGWARNING("Requested unknown weather %d, setting sunny for a minute instead.", a_NewWeather);
|
||||
a_NewWeather = eWeather_Sunny;
|
||||
m_WeatherInterval = 1200;
|
||||
break;
|
||||
}
|
||||
} // switch (NewWeather)
|
||||
return;
|
||||
}
|
||||
|
||||
m_Weather = a_NewWeather;
|
||||
BroadcastWeather(m_Weather);
|
||||
|
||||
@ -2647,6 +2674,47 @@ bool cWorld::SetCommandBlockCommand(int a_BlockX, int a_BlockY, int a_BlockZ, co
|
||||
|
||||
|
||||
|
||||
bool cWorld::IsTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
BLOCKTYPE Block;
|
||||
NIBBLETYPE Meta;
|
||||
GetBlockTypeMeta(a_BlockX, a_BlockY, a_BlockZ, Block, Meta);
|
||||
if (Block != E_BLOCK_TRAPDOOR)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return (Meta & 0x4) > 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bool cWorld::SetTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_Open)
|
||||
{
|
||||
BLOCKTYPE Block;
|
||||
NIBBLETYPE Meta;
|
||||
GetBlockTypeMeta(a_BlockX, a_BlockY, a_BlockZ, Block, Meta);
|
||||
if (Block != E_BLOCK_TRAPDOOR)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsOpen = (Meta & 0x4) > 0;
|
||||
if (a_Open != IsOpen)
|
||||
{
|
||||
SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, Meta ^ 0x4);
|
||||
BroadcastSoundParticleEffect(1003, a_BlockX, a_BlockY, a_BlockZ, 0);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ)
|
||||
{
|
||||
m_ChunkMap->MarkChunkRegenerating(a_ChunkX, a_ChunkZ);
|
||||
|
@ -139,6 +139,9 @@ public:
|
||||
BroadcastTimeUpdate();
|
||||
}
|
||||
|
||||
/** Returns the default weather interval for the specific weather type */
|
||||
int GetDefaultWeatherInterval(eWeather a_Weather);
|
||||
|
||||
/** Returns the current game mode. Partly OBSOLETE, you should use IsGameModeXXX() functions wherever applicable */
|
||||
eGameMode GetGameMode(void) const { return m_GameMode; }
|
||||
|
||||
@ -342,6 +345,12 @@ public:
|
||||
/** Sets the command block command. Returns true if command changed. */
|
||||
bool SetCommandBlockCommand(int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Command); // tolua_export
|
||||
|
||||
/** Is the trapdoor open? Returns false if there is no trapdoor at the specified coords. */
|
||||
bool IsTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ); // tolua_export
|
||||
|
||||
/** Set the state of a trapdoor. Returns true if the trapdoor was update, false if there was no trapdoor at those coords. */
|
||||
bool SetTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_Open); // tolua_export
|
||||
|
||||
/** Regenerate the given chunk: */
|
||||
void RegenerateChunk(int a_ChunkX, int a_ChunkZ); // tolua_export
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user