Added SetDoDaylightCycle() and IsDaylightCycleEnabled() to cWorld.
I need this for a GameRule plugin.
This commit is contained in:
parent
eae42d91f9
commit
4271d719b6
@ -342,7 +342,16 @@ void cClientHandle::Authenticate(const AString & a_Name, const AString & a_UUID,
|
||||
}
|
||||
|
||||
// Send time
|
||||
m_Protocol->SendTimeUpdate(World->GetWorldAge(), World->GetTimeOfDay());
|
||||
Int64 TimeOfDay = World->GetTimeOfDay();
|
||||
if (!World->IsDaylightCycleEnabled())
|
||||
{
|
||||
TimeOfDay *= -1;
|
||||
if (TimeOfDay == 0)
|
||||
{
|
||||
TimeOfDay = -1;
|
||||
}
|
||||
}
|
||||
m_Protocol->SendTimeUpdate(World->GetWorldAge(), TimeOfDay);
|
||||
|
||||
// Send contents of the inventory window
|
||||
m_Protocol->SendWholeInventory(*m_Player->GetWindow());
|
||||
|
@ -179,7 +179,7 @@ public:
|
||||
void SendTabCompletionResults(const AStringVector & a_Results);
|
||||
void SendTeleportEntity (const cEntity & a_Entity);
|
||||
void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay);
|
||||
void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay); // tolua_export
|
||||
void SendUnloadChunk (int a_ChunkX, int a_ChunkZ);
|
||||
void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity);
|
||||
void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);
|
||||
|
@ -243,6 +243,7 @@ cWorld::cWorld(const AString & a_WorldName, eDimension a_Dimension, const AStrin
|
||||
#endif
|
||||
m_Dimension(a_Dimension),
|
||||
m_IsSpawnExplicitlySet(false),
|
||||
m_DoDaylightCycle(true),
|
||||
m_WorldAgeSecs(0),
|
||||
m_TimeOfDaySecs(0),
|
||||
m_WorldAge(0),
|
||||
@ -827,28 +828,32 @@ void cWorld::Tick(float a_Dt, int a_LastTickDurationMSec)
|
||||
{
|
||||
SetChunkData(**itr);
|
||||
} // for itr - SetChunkDataQueue[]
|
||||
|
||||
// We need sub-tick precision here, that's why we store the time in seconds and calculate ticks off of it
|
||||
|
||||
m_WorldAgeSecs += (double)a_Dt / 1000.0;
|
||||
m_TimeOfDaySecs += (double)a_Dt / 1000.0;
|
||||
|
||||
// Wrap time of day each 20 minutes (1200 seconds)
|
||||
if (m_TimeOfDaySecs > 1200.0)
|
||||
{
|
||||
m_TimeOfDaySecs -= 1200.0;
|
||||
}
|
||||
|
||||
m_WorldAge = (Int64)(m_WorldAgeSecs * 20.0);
|
||||
m_TimeOfDay = (Int64)(m_TimeOfDaySecs * 20.0);
|
||||
|
||||
// Updates the sky darkness based on current time of day
|
||||
UpdateSkyDarkness();
|
||||
|
||||
// Broadcast time update every 40 ticks (2 seconds)
|
||||
if (m_LastTimeUpdate < m_WorldAge - 40)
|
||||
if (m_DoDaylightCycle)
|
||||
{
|
||||
BroadcastTimeUpdate();
|
||||
m_LastTimeUpdate = m_WorldAge;
|
||||
// We need sub-tick precision here, that's why we store the time in seconds and calculate ticks off of it
|
||||
m_TimeOfDaySecs += (double)a_Dt / 1000.0;
|
||||
|
||||
// Wrap time of day each 20 minutes (1200 seconds)
|
||||
if (m_TimeOfDaySecs > 1200.0)
|
||||
{
|
||||
m_TimeOfDaySecs -= 1200.0;
|
||||
}
|
||||
|
||||
m_TimeOfDay = (Int64)(m_TimeOfDaySecs * 20.0);
|
||||
|
||||
// Updates the sky darkness based on current time of day
|
||||
UpdateSkyDarkness();
|
||||
|
||||
// Broadcast time update every 40 ticks (2 seconds)
|
||||
if (m_LastTimeUpdate < m_WorldAge - 40)
|
||||
{
|
||||
BroadcastTimeUpdate();
|
||||
m_LastTimeUpdate = m_WorldAge;
|
||||
}
|
||||
}
|
||||
|
||||
// Add entities waiting in the queue to be added:
|
||||
@ -2243,6 +2248,16 @@ void cWorld::BroadcastThunderbolt(int a_BlockX, int a_BlockY, int a_BlockZ, cons
|
||||
|
||||
void cWorld::BroadcastTimeUpdate(const cClientHandle * a_Exclude)
|
||||
{
|
||||
int TimeOfDay = m_TimeOfDay;
|
||||
if (!m_DoDaylightCycle)
|
||||
{
|
||||
TimeOfDay *= -1;
|
||||
if (TimeOfDay == 0)
|
||||
{
|
||||
TimeOfDay = -1;
|
||||
}
|
||||
}
|
||||
|
||||
cCSLock Lock(m_CSPlayers);
|
||||
for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
|
||||
{
|
||||
@ -2251,7 +2266,7 @@ void cWorld::BroadcastTimeUpdate(const cClientHandle * a_Exclude)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
ch->SendTimeUpdate(m_WorldAge, m_TimeOfDay);
|
||||
ch->SendTimeUpdate(m_WorldAge, TimeOfDay);
|
||||
}
|
||||
}
|
||||
|
||||
|
14
src/World.h
14
src/World.h
@ -145,7 +145,17 @@ public:
|
||||
// tolua_begin
|
||||
|
||||
int GetTicksUntilWeatherChange(void) const { return m_WeatherInterval; }
|
||||
|
||||
|
||||
/** Is the daylight cyclus enabled? */
|
||||
virtual bool IsDaylightCycleEnabled(void) const { return m_DoDaylightCycle; }
|
||||
|
||||
/** Sets the daylight cyclus to true/false. */
|
||||
virtual void SetDoDaylightCycle(bool a_DoDaylightCycle)
|
||||
{
|
||||
m_DoDaylightCycle = a_DoDaylightCycle;
|
||||
BroadcastTimeUpdate();
|
||||
}
|
||||
|
||||
virtual Int64 GetWorldAge (void) const override { return m_WorldAge; }
|
||||
virtual Int64 GetTimeOfDay(void) const override { return m_TimeOfDay; }
|
||||
|
||||
@ -158,6 +168,7 @@ public:
|
||||
{
|
||||
m_TimeOfDay = a_TimeOfDay;
|
||||
m_TimeOfDaySecs = (double)a_TimeOfDay / 20.0;
|
||||
UpdateSkyDarkness();
|
||||
BroadcastTimeUpdate();
|
||||
}
|
||||
|
||||
@ -868,6 +879,7 @@ private:
|
||||
bool m_BroadcastDeathMessages;
|
||||
bool m_BroadcastAchievementMessages;
|
||||
|
||||
bool m_DoDaylightCycle; // Is the daylight cyclus enabled?
|
||||
double m_WorldAgeSecs; // World age, in seconds. Is only incremented, cannot be set by plugins.
|
||||
double m_TimeOfDaySecs; // Time of day in seconds. Can be adjusted. Is wrapped to zero each day.
|
||||
Int64 m_WorldAge; // World age in ticks, calculated off of m_WorldAgeSecs
|
||||
|
Loading…
Reference in New Issue
Block a user