1
0

Moved MaxPlayers and Description from cWorld to cServer.

Also started creating a new cWorld::cTickThread class, but not used yet.
This commit is contained in:
madmaxoft 2013-08-11 19:18:06 +02:00
parent b58ca60815
commit eb9d45e906
8 changed files with 274 additions and 186 deletions

View File

@ -1,6 +1,6 @@
/* /*
** Lua binding: AllToLua ** Lua binding: AllToLua
** Generated automatically by tolua++-1.0.92 on 08/11/13 14:53:45. ** Generated automatically by tolua++-1.0.92 on 08/11/13 19:12:37.
*/ */
#ifndef __cplusplus #ifndef __cplusplus
@ -11306,6 +11306,135 @@ static int tolua_get_cPlugin_NewLua___cWebPlugin__(lua_State* tolua_S)
} }
#endif //#ifndef TOLUA_DISABLE #endif //#ifndef TOLUA_DISABLE
/* method: GetDescription of class cServer */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cServer_GetDescription00
static int tolua_AllToLua_cServer_GetDescription00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"const cServer",0,&tolua_err) ||
!tolua_isnoobj(tolua_S,2,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
const cServer* self = (const cServer*) tolua_tousertype(tolua_S,1,0);
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetDescription'", NULL);
#endif
{
const AString tolua_ret = (const AString) self->GetDescription();
tolua_pushcppstring(tolua_S,(const char*)tolua_ret);
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'GetDescription'.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
/* method: GetMaxPlayers of class cServer */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cServer_GetMaxPlayers00
static int tolua_AllToLua_cServer_GetMaxPlayers00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"const cServer",0,&tolua_err) ||
!tolua_isnoobj(tolua_S,2,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
const cServer* self = (const cServer*) tolua_tousertype(tolua_S,1,0);
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetMaxPlayers'", NULL);
#endif
{
int tolua_ret = (int) self->GetMaxPlayers();
tolua_pushnumber(tolua_S,(lua_Number)tolua_ret);
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'GetMaxPlayers'.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
/* method: GetNumPlayers of class cServer */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cServer_GetNumPlayers00
static int tolua_AllToLua_cServer_GetNumPlayers00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"const cServer",0,&tolua_err) ||
!tolua_isnoobj(tolua_S,2,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
const cServer* self = (const cServer*) tolua_tousertype(tolua_S,1,0);
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetNumPlayers'", NULL);
#endif
{
int tolua_ret = (int) self->GetNumPlayers();
tolua_pushnumber(tolua_S,(lua_Number)tolua_ret);
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'GetNumPlayers'.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
/* method: SetMaxPlayers of class cServer */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cServer_SetMaxPlayers00
static int tolua_AllToLua_cServer_SetMaxPlayers00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"cServer",0,&tolua_err) ||
!tolua_isnumber(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
cServer* self = (cServer*) tolua_tousertype(tolua_S,1,0);
int a_MaxPlayers = ((int) tolua_tonumber(tolua_S,2,0));
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'SetMaxPlayers'", NULL);
#endif
{
self->SetMaxPlayers(a_MaxPlayers);
}
}
return 0;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'SetMaxPlayers'.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
/* method: BroadcastChat of class cServer */ /* method: BroadcastChat of class cServer */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cServer_BroadcastChat00 #ifndef TOLUA_DISABLE_tolua_AllToLua_cServer_BroadcastChat00
static int tolua_AllToLua_cServer_BroadcastChat00(lua_State* tolua_S) static int tolua_AllToLua_cServer_BroadcastChat00(lua_State* tolua_S)
@ -11954,103 +12083,6 @@ static int tolua_AllToLua_cWorld_UnloadUnusedChunks00(lua_State* tolua_S)
} }
#endif //#ifndef TOLUA_DISABLE #endif //#ifndef TOLUA_DISABLE
/* method: GetMaxPlayers of class cWorld */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_GetMaxPlayers00
static int tolua_AllToLua_cWorld_GetMaxPlayers00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"const cWorld",0,&tolua_err) ||
!tolua_isnoobj(tolua_S,2,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
const cWorld* self = (const cWorld*) tolua_tousertype(tolua_S,1,0);
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetMaxPlayers'", NULL);
#endif
{
unsigned int tolua_ret = (unsigned int) self->GetMaxPlayers();
tolua_pushnumber(tolua_S,(lua_Number)tolua_ret);
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'GetMaxPlayers'.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
/* method: SetMaxPlayers of class cWorld */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_SetMaxPlayers00
static int tolua_AllToLua_cWorld_SetMaxPlayers00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"cWorld",0,&tolua_err) ||
!tolua_isnumber(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
cWorld* self = (cWorld*) tolua_tousertype(tolua_S,1,0);
int iMax = ((int) tolua_tonumber(tolua_S,2,0));
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'SetMaxPlayers'", NULL);
#endif
{
self->SetMaxPlayers(iMax);
}
}
return 0;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'SetMaxPlayers'.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
/* method: GetNumPlayers of class cWorld */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_GetNumPlayers00
static int tolua_AllToLua_cWorld_GetNumPlayers00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"cWorld",0,&tolua_err) ||
!tolua_isnoobj(tolua_S,2,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
cWorld* self = (cWorld*) tolua_tousertype(tolua_S,1,0);
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'GetNumPlayers'", NULL);
#endif
{
unsigned int tolua_ret = (unsigned int) self->GetNumPlayers();
tolua_pushnumber(tolua_S,(lua_Number)tolua_ret);
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'GetNumPlayers'.",&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
/* method: RegenerateChunk of class cWorld */ /* method: RegenerateChunk of class cWorld */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_RegenerateChunk00 #ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_RegenerateChunk00
static int tolua_AllToLua_cWorld_RegenerateChunk00(lua_State* tolua_S) static int tolua_AllToLua_cWorld_RegenerateChunk00(lua_State* tolua_S)
@ -29783,6 +29815,10 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
tolua_cclass(tolua_S,"cServer","cServer","",NULL); tolua_cclass(tolua_S,"cServer","cServer","",NULL);
tolua_beginmodule(tolua_S,"cServer"); tolua_beginmodule(tolua_S,"cServer");
tolua_function(tolua_S,"GetDescription",tolua_AllToLua_cServer_GetDescription00);
tolua_function(tolua_S,"GetMaxPlayers",tolua_AllToLua_cServer_GetMaxPlayers00);
tolua_function(tolua_S,"GetNumPlayers",tolua_AllToLua_cServer_GetNumPlayers00);
tolua_function(tolua_S,"SetMaxPlayers",tolua_AllToLua_cServer_SetMaxPlayers00);
tolua_function(tolua_S,"BroadcastChat",tolua_AllToLua_cServer_BroadcastChat00); tolua_function(tolua_S,"BroadcastChat",tolua_AllToLua_cServer_BroadcastChat00);
tolua_function(tolua_S,"SendMessage",tolua_AllToLua_cServer_SendMessage00); tolua_function(tolua_S,"SendMessage",tolua_AllToLua_cServer_SendMessage00);
tolua_function(tolua_S,"GetServerID",tolua_AllToLua_cServer_GetServerID00); tolua_function(tolua_S,"GetServerID",tolua_AllToLua_cServer_GetServerID00);
@ -29806,9 +29842,6 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_function(tolua_S,"GetDimension",tolua_AllToLua_cWorld_GetDimension00); tolua_function(tolua_S,"GetDimension",tolua_AllToLua_cWorld_GetDimension00);
tolua_function(tolua_S,"GetHeight",tolua_AllToLua_cWorld_GetHeight00); tolua_function(tolua_S,"GetHeight",tolua_AllToLua_cWorld_GetHeight00);
tolua_function(tolua_S,"UnloadUnusedChunks",tolua_AllToLua_cWorld_UnloadUnusedChunks00); tolua_function(tolua_S,"UnloadUnusedChunks",tolua_AllToLua_cWorld_UnloadUnusedChunks00);
tolua_function(tolua_S,"GetMaxPlayers",tolua_AllToLua_cWorld_GetMaxPlayers00);
tolua_function(tolua_S,"SetMaxPlayers",tolua_AllToLua_cWorld_SetMaxPlayers00);
tolua_function(tolua_S,"GetNumPlayers",tolua_AllToLua_cWorld_GetNumPlayers00);
tolua_function(tolua_S,"RegenerateChunk",tolua_AllToLua_cWorld_RegenerateChunk00); tolua_function(tolua_S,"RegenerateChunk",tolua_AllToLua_cWorld_RegenerateChunk00);
tolua_function(tolua_S,"GenerateChunk",tolua_AllToLua_cWorld_GenerateChunk00); tolua_function(tolua_S,"GenerateChunk",tolua_AllToLua_cWorld_GenerateChunk00);
tolua_function(tolua_S,"SetBlock",tolua_AllToLua_cWorld_SetBlock00); tolua_function(tolua_S,"SetBlock",tolua_AllToLua_cWorld_SetBlock00);

View File

@ -1,6 +1,6 @@
/* /*
** Lua binding: AllToLua ** Lua binding: AllToLua
** Generated automatically by tolua++-1.0.92 on 08/11/13 14:53:46. ** Generated automatically by tolua++-1.0.92 on 08/11/13 19:12:37.
*/ */
/* Exported function */ /* Exported function */

View File

@ -421,11 +421,11 @@ void cClientHandle::HandlePing(void)
// Somebody tries to retrieve information about the server // Somebody tries to retrieve information about the server
AString Reply; AString Reply;
Printf(Reply, "%s%s%i%s%i", Printf(Reply, "%s%s%i%s%i",
cRoot::Get()->GetDefaultWorld()->GetDescription().c_str(), cRoot::Get()->GetServer()->GetDescription().c_str(),
cChatColor::Delimiter.c_str(), cChatColor::Delimiter.c_str(),
cRoot::Get()->GetDefaultWorld()->GetNumPlayers(), cRoot::Get()->GetServer()->GetNumPlayers(),
cChatColor::Delimiter.c_str(), cChatColor::Delimiter.c_str(),
cRoot::Get()->GetDefaultWorld()->GetMaxPlayers() cRoot::Get()->GetServer()->GetMaxPlayers()
); );
Kick(Reply.c_str()); Kick(Reply.c_str());
} }
@ -1176,7 +1176,7 @@ bool cClientHandle::HandleHandshake(const AString & a_Username)
{ {
if (!cRoot::Get()->GetPluginManager()->CallHookHandshake(this, a_Username)) if (!cRoot::Get()->GetPluginManager()->CallHookHandshake(this, a_Username))
{ {
if (cRoot::Get()->GetDefaultWorld()->GetNumPlayers() >= cRoot::Get()->GetDefaultWorld()->GetMaxPlayers()) if (cRoot::Get()->GetServer()->GetNumPlayers() >= cRoot::Get()->GetServer()->GetMaxPlayers())
{ {
Kick("The server is currently full :(-- Try again later"); Kick("The server is currently full :(-- Try again later");
return false; return false;
@ -1191,7 +1191,7 @@ bool cClientHandle::HandleHandshake(const AString & a_Username)
void cClientHandle::HandleEntityAction(int a_EntityID, char a_ActionID) void cClientHandle::HandleEntityAction(int a_EntityID, char a_ActionID)
{ {
if( a_EntityID != m_Player->GetUniqueID() ) if (a_EntityID != m_Player->GetUniqueID())
{ {
// We should only receive entity actions from the entity that is performing the action // We should only receive entity actions from the entity that is performing the action
return; return;

View File

@ -14,6 +14,7 @@
#include "Protocol16x.h" #include "Protocol16x.h"
#include "../ClientHandle.h" #include "../ClientHandle.h"
#include "../Root.h" #include "../Root.h"
#include "../Server.h"
#include "../World.h" #include "../World.h"
#include "../ChatColor.h" #include "../ChatColor.h"
@ -729,11 +730,11 @@ void cProtocolRecognizer::HandleServerPing(void)
{ {
// http://wiki.vg/wiki/index.php?title=Protocol&oldid=3099#Server_List_Ping_.280xFE.29 // http://wiki.vg/wiki/index.php?title=Protocol&oldid=3099#Server_List_Ping_.280xFE.29
Printf(Reply, "%s%s%i%s%i", Printf(Reply, "%s%s%i%s%i",
cRoot::Get()->GetDefaultWorld()->GetDescription().c_str(), cRoot::Get()->GetServer()->GetDescription().c_str(),
cChatColor::Delimiter.c_str(), cChatColor::Delimiter.c_str(),
cRoot::Get()->GetDefaultWorld()->GetNumPlayers(), cRoot::Get()->GetServer()->GetNumPlayers(),
cChatColor::Delimiter.c_str(), cChatColor::Delimiter.c_str(),
cRoot::Get()->GetDefaultWorld()->GetMaxPlayers() cRoot::Get()->GetServer()->GetMaxPlayers()
); );
break; break;
} }
@ -759,9 +760,9 @@ void cProtocolRecognizer::HandleServerPing(void)
// http://wiki.vg/wiki/index.php?title=Server_List_Ping&oldid=3100 // http://wiki.vg/wiki/index.php?title=Server_List_Ping&oldid=3100
AString NumPlayers; AString NumPlayers;
Printf(NumPlayers, "%d", cRoot::Get()->GetDefaultWorld()->GetNumPlayers()); Printf(NumPlayers, "%d", cRoot::Get()->GetServer()->GetNumPlayers());
AString MaxPlayers; AString MaxPlayers;
Printf(MaxPlayers, "%d", cRoot::Get()->GetDefaultWorld()->GetMaxPlayers()); Printf(MaxPlayers, "%d", cRoot::Get()->GetServer()->GetMaxPlayers());
AString ProtocolVersionNum; AString ProtocolVersionNum;
Printf(ProtocolVersionNum, "%d", cRoot::Get()->m_PrimaryServerVersion); Printf(ProtocolVersionNum, "%d", cRoot::Get()->m_PrimaryServerVersion);
@ -775,7 +776,7 @@ void cProtocolRecognizer::HandleServerPing(void)
Reply.push_back(0); Reply.push_back(0);
Reply.append(ProtocolVersionTxt); Reply.append(ProtocolVersionTxt);
Reply.push_back(0); Reply.push_back(0);
Reply.append(cRoot::Get()->GetDefaultWorld()->GetDescription()); Reply.append(cRoot::Get()->GetServer()->GetDescription());
Reply.push_back(0); Reply.push_back(0);
Reply.append(NumPlayers); Reply.append(NumPlayers);
Reply.push_back(0); Reply.push_back(0);

View File

@ -76,6 +76,38 @@ struct cServer::sServerState
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cServer:
cServer::cServer(void) :
m_pState(new sServerState),
m_ListenThreadIPv4(*this, cSocket::IPv4, "Client"),
m_ListenThreadIPv6(*this, cSocket::IPv6, "Client"),
m_Millisecondsf(0),
m_Milliseconds(0),
m_bIsConnected(false),
m_bRestarting(false),
m_RCONServer(*this)
{
}
cServer::~cServer()
{
// TODO: Shut down the server gracefully
m_pState->bStopTickThread = true;
delete m_pState->pTickThread; m_pState->pTickThread = NULL;
delete m_pState;
}
void cServer::ClientDestroying(const cClientHandle * a_Client) void cServer::ClientDestroying(const cClientHandle * a_Client)
{ {
m_SocketThreads.StopReading(a_Client); m_SocketThreads.StopReading(a_Client);
@ -123,6 +155,9 @@ void cServer::RemoveClient(const cClientHandle * a_Client)
bool cServer::InitServer(cIniFile & a_SettingsIni) bool cServer::InitServer(cIniFile & a_SettingsIni)
{ {
m_Description = a_SettingsIni.GetValue ("Server", "Description", "MCServer! - In C++!").c_str();
m_MaxPlayers = a_SettingsIni.GetValueI("Server", "MaxPlayers", 100);
if (m_bIsConnected) if (m_bIsConnected)
{ {
LOGERROR("ERROR: Trying to initialize server while server is already running!"); LOGERROR("ERROR: Trying to initialize server while server is already running!");
@ -201,35 +236,6 @@ bool cServer::InitServer(cIniFile & a_SettingsIni)
cServer::cServer(void)
: m_pState(new sServerState)
, m_ListenThreadIPv4(*this, cSocket::IPv4, "Client")
, m_ListenThreadIPv6(*this, cSocket::IPv6, "Client")
, m_Millisecondsf(0)
, m_Milliseconds(0)
, m_bIsConnected(false)
, m_bRestarting(false)
, m_RCONServer(*this)
{
}
cServer::~cServer()
{
// TODO: Shut down the server gracefully
m_pState->bStopTickThread = true;
delete m_pState->pTickThread; m_pState->pTickThread = NULL;
delete m_pState;
}
void cServer::PrepareKeys(void) void cServer::PrepareKeys(void)
{ {
// TODO: Save and load key for persistence across sessions // TODO: Save and load key for persistence across sessions

View File

@ -37,7 +37,18 @@ class cServer // tolua_export
public: // tolua_export public: // tolua_export
bool InitServer(cIniFile & a_SettingsIni); bool InitServer(cIniFile & a_SettingsIni);
bool IsConnected(void) const { return m_bIsConnected;} // returns connection status // tolua_begin
const AString & GetDescription(void) const {return m_Description; }
// Player counts:
int GetMaxPlayers(void) const {return m_MaxPlayers; }
int GetNumPlayers(void) const { return m_NumPlayers; }
void SetMaxPlayers(int a_MaxPlayers) { m_MaxPlayers = a_MaxPlayers; }
// tolua_end
// bool IsConnected(void) const { return m_bIsConnected;} // returns connection status
void BroadcastChat(const AString & a_Message, const cClientHandle * a_Exclude = NULL); // tolua_export void BroadcastChat(const AString & a_Message, const cClientHandle * a_Exclude = NULL); // tolua_export
@ -131,6 +142,10 @@ private:
cRCONServer m_RCONServer; cRCONServer m_RCONServer;
AString m_Description;
int m_MaxPlayers;
int m_NumPlayers;
cServer(void); cServer(void);
~cServer(); ~cServer();

View File

@ -128,6 +128,9 @@ protected:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cWorldLightingProgress:
/// A simple thread that displays the progress of world lighting in cWorld::InitializeSpawn() /// A simple thread that displays the progress of world lighting in cWorld::InitializeSpawn()
class cWorldLightingProgress : class cWorldLightingProgress :
public cIsThread public cIsThread
@ -187,10 +190,46 @@ cWorld::cLock::cLock(cWorld & a_World) :
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cWorld::cTickThread:
cWorld::cTickThread::cTickThread(cWorld & a_World) :
super(Printf("WorldTickThread: %s", a_World.GetName().c_str())),
m_World(a_World)
{
}
void cWorld::cTickThread::Execute(void)
{
const int ClocksPerTick = CLOCKS_PER_SEC / 20;
clock_t LastTime = clock();
while (!m_ShouldTerminate)
{
clock_t Start = clock();
m_World.Tick((float)(LastTime - Start) / CLOCKS_PER_SEC);
clock_t Now = clock();
if (Now - Start < ClocksPerTick)
{
cSleep::MilliSleep(1000 * (ClocksPerTick - (Now - Start)) / CLOCKS_PER_SEC);
}
LastTime = Start;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// cWorld: // cWorld:
cWorld::cWorld(const AString & a_WorldName) : cWorld::cWorld(const AString & a_WorldName) :
m_WorldName(a_WorldName),
m_IniFileName(m_WorldName + "/world.ini"),
m_WorldAgeSecs(0), m_WorldAgeSecs(0),
m_TimeOfDaySecs(0), m_TimeOfDaySecs(0),
m_WorldAge(0), m_WorldAge(0),
@ -199,24 +238,26 @@ cWorld::cWorld(const AString & a_WorldName) :
m_LastSpawnMonster(0), m_LastSpawnMonster(0),
m_RSList(0), m_RSList(0),
m_Weather(eWeather_Sunny), m_Weather(eWeather_Sunny),
m_WeatherInterval(24000) // Guaranteed 1 day of sunshine at server start :) m_WeatherInterval(24000), // Guaranteed 1 day of sunshine at server start :)
m_TickThread(*this)
{ {
LOGD("cWorld::cWorld(%s)", a_WorldName.c_str()); LOGD("cWorld::cWorld(%s)", a_WorldName.c_str());
m_WorldName = a_WorldName;
m_IniFileName = m_WorldName + "/world.ini";
cMakeDir::MakeDir(m_WorldName.c_str()); cMakeDir::MakeDir(m_WorldName.c_str());
MTRand r1; // TODO: Find a proper spawn location, based on the biomes (not in ocean)
m_SpawnX = (double)((r1.randInt() % 1000) - 500); m_SpawnX = (double)((m_TickRand.randInt() % 1000) - 500);
m_SpawnY = cChunkDef::Height; m_SpawnY = cChunkDef::Height;
m_SpawnZ = (double)((r1.randInt() % 1000) - 500); m_SpawnZ = (double)((m_TickRand.randInt() % 1000) - 500);
m_GameMode = eGameMode_Creative; m_GameMode = eGameMode_Creative;
AString StorageSchema("Default"); AString StorageSchema("Default");
cIniFile IniFile(m_IniFileName); cIniFile IniFile(m_IniFileName);
IniFile.ReadFile(); if (!IniFile.ReadFile())
{
LOGWARNING("Cannot read world settings from \"%s\", defaults will be used.", m_IniFileName.c_str());
}
AString Dimension = IniFile.GetValueSet("General", "Dimension", "Overworld"); AString Dimension = IniFile.GetValueSet("General", "Dimension", "Overworld");
m_Dimension = StringToDimension(Dimension); m_Dimension = StringToDimension(Dimension);
switch (m_Dimension) switch (m_Dimension)
@ -268,9 +309,6 @@ cWorld::cWorld(const AString & a_WorldName) :
m_bAnimals = IniFile2.GetValueB("Monsters", "AnimalsOn", true); m_bAnimals = IniFile2.GetValueB("Monsters", "AnimalsOn", true);
m_SpawnMonsterRate = (Int64)(IniFile2.GetValueF("Monsters", "AnimalSpawnInterval", 10) * 20); // Convert from secs to ticks m_SpawnMonsterRate = (Int64)(IniFile2.GetValueF("Monsters", "AnimalSpawnInterval", 10) * 20); // Convert from secs to ticks
// TODO: Move this into cServer instead:
SetMaxPlayers(IniFile2.GetValueI("Server", "MaxPlayers", 100));
m_Description = IniFile2.GetValue("Server", "Description", "MCServer! - In C++!").c_str();
} }
m_ChunkMap = new cChunkMap(this); m_ChunkMap = new cChunkMap(this);
@ -1893,19 +1931,6 @@ void cWorld::CollectPickupsByPlayer(cPlayer * a_Player)
void cWorld::SetMaxPlayers(int iMax)
{
m_MaxPlayers = MAX_PLAYERS;
if (iMax > 0 && iMax < MAX_PLAYERS)
{
m_MaxPlayers = iMax;
}
}
void cWorld::AddPlayer(cPlayer * a_Player) void cWorld::AddPlayer(cPlayer * a_Player)
{ {
cCSLock Lock(m_CSPlayers); cCSLock Lock(m_CSPlayers);
@ -2299,11 +2324,13 @@ void cWorld::RemoveEntity(cEntity * a_Entity)
/*
unsigned int cWorld::GetNumPlayers(void) unsigned int cWorld::GetNumPlayers(void)
{ {
cCSLock Lock(m_CSPlayers); cCSLock Lock(m_CSPlayers);
return m_Players.size(); return m_Players.size();
} }
*/

View File

@ -204,13 +204,6 @@ public:
void CollectPickupsByPlayer(cPlayer * a_Player); void CollectPickupsByPlayer(cPlayer * a_Player);
// MOTD
const AString & GetDescription(void) const {return m_Description; } // FIXME: This should not be in cWorld
// Max Players
unsigned int GetMaxPlayers(void) const {return m_MaxPlayers; } // tolua_export
void SetMaxPlayers(int iMax); // tolua_export
void AddPlayer( cPlayer* a_Player ); void AddPlayer( cPlayer* a_Player );
void RemovePlayer( cPlayer* a_Player ); void RemovePlayer( cPlayer* a_Player );
@ -223,8 +216,6 @@ public:
/// Finds a player from a partial or complete player name and calls the callback - case-insensitive /// Finds a player from a partial or complete player name and calls the callback - case-insensitive
bool FindAndDoWithPlayer(const AString & a_PlayerNameHint, cPlayerListCallback & a_Callback); // >> EXPORTED IN MANUALBINDINGS << bool FindAndDoWithPlayer(const AString & a_PlayerNameHint, cPlayerListCallback & a_Callback); // >> EXPORTED IN MANUALBINDINGS <<
unsigned int GetNumPlayers(); // tolua_export
// TODO: This interface is dangerous - rewrite to DoWithClosestPlayer(pos, sight, action) // TODO: This interface is dangerous - rewrite to DoWithClosestPlayer(pos, sight, action)
cPlayer * FindClosestPlayer(const Vector3f & a_Pos, float a_SightLimit); cPlayer * FindClosestPlayer(const Vector3f & a_Pos, float a_SightLimit);
@ -484,8 +475,6 @@ public:
inline int GetStorageLoadQueueLength(void) { return m_Storage.GetLoadQueueLength(); } // tolua_export inline int GetStorageLoadQueueLength(void) { return m_Storage.GetLoadQueueLength(); } // tolua_export
inline int GetStorageSaveQueueLength(void) { return m_Storage.GetSaveQueueLength(); } // tolua_export inline int GetStorageSaveQueueLength(void) { return m_Storage.GetSaveQueueLength(); } // tolua_export
void Tick(float a_Dt);
void InitializeSpawn(void); void InitializeSpawn(void);
/// Stops threads that belong to this world (part of deinit) /// Stops threads that belong to this world (part of deinit)
@ -541,6 +530,24 @@ private:
friend class cRoot; friend class cRoot;
class cTickThread :
public cIsThread
{
typedef cIsThread super;
public:
cTickThread(cWorld & a_World);
protected:
cWorld & m_World;
// cIsThread overrides:
virtual void Execute(void) override;
} ;
AString m_WorldName;
AString m_IniFileName;
/// The dimension of the world, used by the client to provide correct lighting scheme /// The dimension of the world, used by the client to provide correct lighting scheme
eDimension m_Dimension; eDimension m_Dimension;
@ -583,8 +590,6 @@ private:
cWorldStorage m_Storage; cWorldStorage m_Storage;
AString m_Description;
unsigned int m_MaxPlayers; unsigned int m_MaxPlayers;
cChunkMap * m_ChunkMap; cChunkMap * m_ChunkMap;
@ -616,13 +621,14 @@ private:
cChunkSender m_ChunkSender; cChunkSender m_ChunkSender;
cLightingThread m_Lighting; cLightingThread m_Lighting;
cTickThread m_TickThread;
AString m_WorldName;
AString m_IniFileName;
cWorld(const AString & a_WorldName); cWorld(const AString & a_WorldName);
~cWorld(); ~cWorld();
void Tick(float a_Dt);
void TickWeather(float a_Dt); // Handles weather each tick void TickWeather(float a_Dt); // Handles weather each tick
void TickSpawnMobs(float a_Dt); // Handles mob spawning each tick void TickSpawnMobs(float a_Dt); // Handles mob spawning each tick