diff options
52 files changed, 436 insertions, 5337 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fe367ba22d0..6620f48f933 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,6 @@ +add_subdirectory(bindings) add_subdirectory(framework) -add_subdirectory(shared) -add_subdirectory(realmd) add_subdirectory(game) -add_subdirectory(bindings) -add_subdirectory(mangosd) +add_subdirectory(shared) +add_subdirectory(trinitycore) +add_subdirectory(trinityrealm) diff --git a/src/mangosd/CMakeLists.txt b/src/mangosd/CMakeLists.txt deleted file mode 100644 index dc5941ef4e2..00000000000 --- a/src/mangosd/CMakeLists.txt +++ /dev/null @@ -1,53 +0,0 @@ - -########### next target ############### - -SET(trinity-core_SRCS -CliRunnable.cpp -CliRunnable.h -Main.cpp -Master.cpp -Master.h -RASocket.cpp -RASocket.h -WorldRunnable.cpp -WorldRunnable.h -) - -add_executable(trinity-core ${trinity-core_SRCS}) -add_definitions( --D_TRINITY_CORE_CONFIG='"${CONF_DIR}/trinitycore.conf"' -) -IF (DO_MYSQL) - SET_TARGET_PROPERTIES(trinity-core PROPERTIES LINK_FLAGS "-pthread") -ENDIF(DO_MYSQL) - - - -target_link_libraries( -trinity-core -game -shared -zlib -trinityframework -trinitysockets -trinitydatabase -trinityauth -trinityconfig -vmaps -ZThread -g3dlite -${SCRIPT_LIB} -${MYSQL_LIBRARIES} -${POSTGRE_LIBS} -${SSLLIB} -${ACE_LIBRARY} -${ZLIB} -) - -install(TARGETS trinity-core DESTINATION bin) - - -########### install files ############### - -install(FILES mangosd.conf.dist.in DESTINATION etc) - diff --git a/src/mangosd/CliRunnable.cpp b/src/mangosd/CliRunnable.cpp deleted file mode 100644 index 4a681e0ed03..00000000000 --- a/src/mangosd/CliRunnable.cpp +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/// \addtogroup Trinityd -/// @{ -/// \file - -#include "Common.h" -#include "Language.h" -#include "Log.h" -#include "World.h" -#include "ScriptCalls.h" -#include "ObjectMgr.h" -#include "WorldSession.h" -#include "Config/ConfigEnv.h" -#include "Util.h" -#include "AccountMgr.h" -#include "CliRunnable.h" -#include "MapManager.h" -#include "Player.h" -#include "Chat.h" - -void utf8print(const char* str) -{ -#if PLATFORM == PLATFORM_WINDOWS - wchar_t wtemp_buf[6000]; - size_t wtemp_len = 6000-1; - if(!Utf8toWStr(str,strlen(str),wtemp_buf,wtemp_len)) - return; - - char temp_buf[6000]; - CharToOemBuffW(&wtemp_buf[0],&temp_buf[0],wtemp_len+1); - printf(temp_buf); -#else - printf(str); -#endif -} - -/// Delete a user account and all associated characters in this realm -/// \todo This function has to be enhanced to respect the login/realm split (delete char, delete account chars in realm, delete account chars in realm then delete account -bool ChatHandler::HandleAccountDeleteCommand(const char* args) -{ - if(!*args) - return false; - - ///- Get the account name from the command line - char *account_name_str=strtok ((char*)args," "); - if (!account_name_str) - return false; - - std::string account_name = account_name_str; - if(!AccountMgr::normilizeString(account_name)) - { - PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); - SetSentErrorMessage(true); - return false; - } - - uint32 account_id = accmgr.GetId(account_name); - if(!account_id) - { - PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); - SetSentErrorMessage(true); - return false; - } - - /// Commands not recommended call from chat, but support anyway - /// can delete only for account with less security - /// This is also reject self apply in fact - if(HasLowerSecurityAccount (NULL,account_id,true)) - return false; - - AccountOpResult result = accmgr.DeleteAccount(account_id); - switch(result) - { - case AOR_OK: - PSendSysMessage(LANG_ACCOUNT_DELETED,account_name.c_str()); - break; - case AOR_NAME_NOT_EXIST: - PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); - SetSentErrorMessage(true); - return false; - case AOR_DB_INTERNAL_ERROR: - PSendSysMessage(LANG_ACCOUNT_NOT_DELETED_SQL_ERROR,account_name.c_str()); - SetSentErrorMessage(true); - return false; - default: - PSendSysMessage(LANG_ACCOUNT_NOT_DELETED,account_name.c_str()); - SetSentErrorMessage(true); - return false; - } - - return true; -} - -bool ChatHandler::HandleCharacterDeleteCommand(const char* args) -{ - if(!*args) - return false; - - char *character_name_str = strtok((char*)args," "); - if(!character_name_str) - return false; - - std::string character_name = character_name_str; - if(!normalizePlayerName(character_name)) - return false; - - uint64 character_guid; - uint32 account_id; - - Player *player = objmgr.GetPlayer(character_name.c_str()); - if(player) - { - character_guid = player->GetGUID(); - account_id = player->GetSession()->GetAccountId(); - player->GetSession()->KickPlayer(); - } - else - { - character_guid = objmgr.GetPlayerGUIDByName(character_name); - if(!character_guid) - { - PSendSysMessage(LANG_NO_PLAYER,character_name.c_str()); - SetSentErrorMessage(true); - return false; - } - - account_id = objmgr.GetPlayerAccountIdByGUID(character_guid); - } - - std::string account_name; - accmgr.GetName (account_id,account_name); - - Player::DeleteFromDB(character_guid, account_id, true); - PSendSysMessage(LANG_CHARACTER_DELETED,character_name.c_str(),GUID_LOPART(character_guid),account_name.c_str(), account_id); - return true; -} - -/// Exit the realm -bool ChatHandler::HandleServerExitCommand(const char* args) -{ - SendSysMessage(LANG_COMMAND_EXIT); - World::StopNow(SHUTDOWN_EXIT_CODE); - return true; -} - -/// Display info on users currently in the realm -bool ChatHandler::HandleAccountOnlineListCommand(const char* args) -{ - ///- Get the list of accounts ID logged to the realm - QueryResult *resultDB = CharacterDatabase.Query("SELECT name,account FROM characters WHERE online > 0"); - if (!resultDB) - return true; - - ///- Display the list of account/characters online - SendSysMessage("====================================================================="); - SendSysMessage(LANG_ACCOUNT_LIST_HEADER); - SendSysMessage("====================================================================="); - - ///- Circle through accounts - do - { - Field *fieldsDB = resultDB->Fetch(); - std::string name = fieldsDB[0].GetCppString(); - uint32 account = fieldsDB[1].GetUInt32(); - - ///- Get the username, last IP and GM level of each account - // No SQL injection. account is uint32. - // 0 1 2 3 - QueryResult *resultLogin = LoginDatabase.PQuery("SELECT username, last_ip, gmlevel, expansion FROM account WHERE id = '%u'",account); - - if(resultLogin) - { - Field *fieldsLogin = resultLogin->Fetch(); - PSendSysMessage("|%15s| %20s | %15s |%4d|%5d|", - fieldsLogin[0].GetString(),name.c_str(),fieldsLogin[1].GetString(),fieldsLogin[2].GetUInt32(),fieldsLogin[3].GetUInt32()); - - delete resultLogin; - } - else - PSendSysMessage(LANG_ACCOUNT_LIST_ERROR,name.c_str()); - - }while(resultDB->NextRow()); - - delete resultDB; - - SendSysMessage("====================================================================="); - return true; -} - -/// Create an account -bool ChatHandler::HandleAccountCreateCommand(const char* args) -{ - if(!*args) - return false; - - ///- %Parse the command line arguments - char *szAcc = strtok((char*)args, " "); - char *szPassword = strtok(NULL, " "); - if(!szAcc || !szPassword) - return false; - - // normilized in accmgr.CreateAccount - std::string account_name = szAcc; - std::string password = szPassword; - - AccountOpResult result = accmgr.CreateAccount(account_name, password); - switch(result) - { - case AOR_OK: - PSendSysMessage(LANG_ACCOUNT_CREATED,account_name.c_str()); - break; - case AOR_NAME_TOO_LONG: - SendSysMessage(LANG_ACCOUNT_TOO_LONG); - SetSentErrorMessage(true); - return false; - case AOR_NAME_ALREDY_EXIST: - SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST); - SetSentErrorMessage(true); - return false; - case AOR_DB_INTERNAL_ERROR: - PSendSysMessage(LANG_ACCOUNT_NOT_CREATED_SQL_ERROR,account_name.c_str()); - SetSentErrorMessage(true); - return false; - default: - PSendSysMessage(LANG_ACCOUNT_NOT_CREATED,account_name.c_str()); - SetSentErrorMessage(true); - return false; - } - - return true; -} - -/// Set the level of logging -bool ChatHandler::HandleServerSetLogLevelCommand(const char *args) -{ - if(!*args) - return false; - - char *NewLevel = strtok((char*)args, " "); - if (!NewLevel) - return false; - - sLog.SetLogLevel(NewLevel); - return true; -} - -/// set diff time record interval -bool ChatHandler::HandleServerSetDiffTimeCommand(const char *args) -{ - if(!*args) - return false; - - char *NewTimeStr = strtok((char*)args, " "); - if(!NewTimeStr) - return false; - - int32 NewTime =atoi(NewTimeStr); - if(NewTime < 0) - return false; - - sWorld.SetRecordDiffInterval(NewTime); - printf( "Record diff every %u ms\n", NewTime); - return true; -} - - -/// @} - -#ifdef linux -// Non-blocking keypress detector, when return pressed, return 1, else always return 0 -int kb_hit_return() -{ - struct timeval tv; - fd_set fds; - tv.tv_sec = 0; - tv.tv_usec = 0; - FD_ZERO(&fds); - FD_SET(STDIN_FILENO, &fds); - select(STDIN_FILENO+1, &fds, NULL, NULL, &tv); - return FD_ISSET(STDIN_FILENO, &fds); -} -#endif - -/// %Thread start -void CliRunnable::run() -{ - ///- Init new SQL thread for the world database (one connection call enough) - WorldDatabase.ThreadStart(); // let thread do safe mySQL requests - - char commandbuf[256]; - - ///- Display the list of available CLI functions then beep - sLog.outString(""); - - if(sConfig.GetBoolDefault("BeepAtStart", true)) - printf("\a"); // \a = Alert - - // print this here the first time - // later it will be printed after command queue updates - printf("TC>"); - - ///- As long as the World is running (no World::m_stopEvent), get the command line and handle it - while (!World::IsStopped()) - { - fflush(stdout); - #ifdef linux - while (!kb_hit_return() && !World::IsStopped()) - // With this, we limit CLI to 10commands/second - usleep(100); - if (World::IsStopped()) - break; - #endif - char *command_str = fgets(commandbuf,sizeof(commandbuf),stdin); - if (command_str != NULL) - { - for(int x=0;command_str[x];x++) - if(command_str[x]=='\r'||command_str[x]=='\n') - { - command_str[x]=0; - break; - } - - - if(!*command_str) - { - printf("TC>"); - continue; - } - - std::string command; - if(!consoleToUtf8(command_str,command)) // convert from console encoding to utf8 - { - printf("TC>"); - continue; - } - - sWorld.QueueCliCommand(&utf8print,command.c_str()); - } - else if (feof(stdin)) - { - World::StopNow(SHUTDOWN_EXIT_CODE); - } - } - - ///- End the database thread - WorldDatabase.ThreadEnd(); // free mySQL thread resources -} diff --git a/src/mangosd/CliRunnable.h b/src/mangosd/CliRunnable.h deleted file mode 100644 index e5f78bb5259..00000000000 --- a/src/mangosd/CliRunnable.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/// \addtogroup Trinityd -/// @{ -/// \file - -#ifndef __CLIRUNNABLE_H -#define __CLIRUNNABLE_H - -/// Command Line Interface handling thread -class CliRunnable : public ZThread::Runnable -{ - public: - void run(); -}; -#endif -/// @} diff --git a/src/mangosd/Main.cpp b/src/mangosd/Main.cpp deleted file mode 100644 index 68c467d6265..00000000000 --- a/src/mangosd/Main.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/// \addtogroup Trinityd Trinity Daemon -/// @{ -/// \file - -#include "Common.h" -#include "Database/DatabaseEnv.h" -#include "Config/ConfigEnv.h" -#include "Log.h" -#include "Master.h" - -#ifndef _TRINITY_CORE_CONFIG -# define _TRINITY_CORE_CONFIG "TrinityCore.conf" -#endif //_TRINITY_CORE_CONFIG - -// Format is YYYYMMDDRR where RR is the change in the conf file -// for that day. -#ifndef _TRINITY_CORE_CONFVER -# define _TRINITY_CORE_CONFVER 2008022901 -#endif //_TRINITY_CORE_CONFVER - -#ifdef WIN32 -#include "ServiceWin32.h" -char serviceName[] = "TrinityCore"; -char serviceLongName[] = "Trinity core service"; -char serviceDescription[] = "Massive Network Game Object Server"; -/* - * -1 - not in service mode - * 0 - stopped - * 1 - running - * 2 - paused - */ -int m_ServiceStatus = -1; -#endif - -DatabaseType WorldDatabase; ///< Accessor to the world database -DatabaseType CharacterDatabase; ///< Accessor to the character database -DatabaseType LoginDatabase; ///< Accessor to the realm/login database - -uint32 realmID; ///< Id of the realm - -/// Print out the usage string for this program on the console. -void usage(const char *prog) -{ - sLog.outString("Usage: \n %s [<options>]\n" - " -c config_file use config_file as configuration file\n\r" - #ifdef WIN32 - " Running as service functions:\n\r" - " --service run as service\n\r" - " -s install install service\n\r" - " -s uninstall uninstall service\n\r" - #endif - ,prog); -} - -/// Launch the Trinity server -extern int main(int argc, char **argv) -{ - ///- Command line parsing to get the configuration file name - char const* cfg_file = _TRINITY_CORE_CONFIG; - int c=1; - while( c < argc ) - { - if( strcmp(argv[c],"-c") == 0) - { - if( ++c >= argc ) - { - sLog.outError("Runtime-Error: -c option requires an input argument"); - usage(argv[0]); - return 1; - } - else - cfg_file = argv[c]; - } - - #ifdef WIN32 - //////////// - //Services// - //////////// - if( strcmp(argv[c],"-s") == 0) - { - if( ++c >= argc ) - { - sLog.outError("Runtime-Error: -s option requires an input argument"); - usage(argv[0]); - return 1; - } - if( strcmp(argv[c],"install") == 0) - { - if (WinServiceInstall()) - sLog.outString("Installing service"); - return 1; - } - else if( strcmp(argv[c],"uninstall") == 0) - { - if(WinServiceUninstall()) - sLog.outString("Uninstalling service"); - return 1; - } - else - { - sLog.outError("Runtime-Error: unsupported option %s",argv[c]); - usage(argv[0]); - return 1; - } - } - if( strcmp(argv[c],"--service") == 0) - { - WinServiceRun(); - } - //// - #endif - ++c; - } - - if (!sConfig.SetSource(cfg_file)) - { - sLog.outError("Could not find configuration file %s.", cfg_file); - return 1; - } - sLog.outString("Using configuration file %s.", cfg_file); - - uint32 confVersion = sConfig.GetIntDefault("ConfVersion", 0); - if (confVersion < _TRINITY_CORE_CONFVER) - { - sLog.outError("*****************************************************************************"); - sLog.outError(" WARNING: Your trinitycore.conf version indicates your conf file is out of date!"); - sLog.outError(" Please check for updates, as your current default values may cause"); - sLog.outError(" strange behavior."); - sLog.outError("*****************************************************************************"); - clock_t pause = 3000 + clock(); - - while (pause > clock()) {} - } - - ///- and run the 'Master' - /// \todo Why do we need this 'Master'? Can't all of this be in the Main as for Realmd? - return sMaster.Run(); - - // at sMaster return function exist with codes - // 0 - normal shutdown - // 1 - shutdown at error - // 2 - restart command used, this code can be used by restarter for restart Trinityd -} - -/// @} diff --git a/src/mangosd/Master.cpp b/src/mangosd/Master.cpp deleted file mode 100644 index cf1ac0f2c27..00000000000 --- a/src/mangosd/Master.cpp +++ /dev/null @@ -1,531 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** \file - \ingroup Trinityd -*/ - -#include <ace/OS_NS_signal.h> - -#include "WorldSocketMgr.h" -#include "Common.h" -#include "Master.h" -#include "WorldSocket.h" -#include "WorldRunnable.h" -#include "World.h" -#include "Log.h" -#include "Timer.h" -#include "Policies/SingletonImp.h" -#include "SystemConfig.h" -#include "Config/ConfigEnv.h" -#include "Database/DatabaseEnv.h" -#include "CliRunnable.h" -#include "RASocket.h" -#include "ScriptCalls.h" -#include "Util.h" - -#include "sockets/TcpSocket.h" -#include "sockets/Utility.h" -#include "sockets/Parse.h" -#include "sockets/Socket.h" -#include "sockets/SocketHandler.h" -#include "sockets/ListenSocket.h" - -#ifdef WIN32 -#include "ServiceWin32.h" -extern int m_ServiceStatus; -#endif - -/// \todo Warning disabling not useful under VC++2005. Can somebody say on which compiler it is useful? -#pragma warning(disable:4305) - -INSTANTIATE_SINGLETON_1( Master ); - -volatile uint32 Master::m_masterLoopCounter = 0; - -class FreezeDetectorRunnable : public ZThread::Runnable -{ -public: - FreezeDetectorRunnable() { _delaytime = 0; } - uint32 m_loops, m_lastchange; - uint32 w_loops, w_lastchange; - uint32 _delaytime; - void SetDelayTime(uint32 t) { _delaytime = t; } - void run(void) - { - if(!_delaytime) - return; - sLog.outString("Starting up anti-freeze thread (%u seconds max stuck time)...",_delaytime/1000); - m_loops = 0; - w_loops = 0; - m_lastchange = 0; - w_lastchange = 0; - while(!World::IsStopped()) - { - ZThread::Thread::sleep(1000); - uint32 curtime = getMSTime(); - //DEBUG_LOG("anti-freeze: time=%u, counters=[%u; %u]",curtime,Master::m_masterLoopCounter,World::m_worldLoopCounter); - - // There is no Master anymore - // TODO: clear the rest of the code -// // normal work -// if(m_loops != Master::m_masterLoopCounter) -// { -// m_lastchange = curtime; -// m_loops = Master::m_masterLoopCounter; -// } -// // possible freeze -// else if(getMSTimeDiff(m_lastchange,curtime) > _delaytime) -// { -// sLog.outError("Main/Sockets Thread hangs, kicking out server!"); -// *((uint32 volatile*)NULL) = 0; // bang crash -// } - - // normal work - if(w_loops != World::m_worldLoopCounter) - { - w_lastchange = curtime; - w_loops = World::m_worldLoopCounter; - } - // possible freeze - else if(getMSTimeDiff(w_lastchange,curtime) > _delaytime) - { - sLog.outError("World Thread hangs, kicking out server!"); - *((uint32 volatile*)NULL) = 0; // bang crash - } - } - sLog.outString("Anti-freeze thread exiting without problems."); - } -}; - -class RARunnable : public ZThread::Runnable -{ -public: - uint32 numLoops, loopCounter; - - RARunnable () - { - uint32 socketSelecttime = sWorld.getConfig (CONFIG_SOCKET_SELECTTIME); - numLoops = (sConfig.GetIntDefault ("MaxPingTime", 30) * (MINUTE * 1000000 / socketSelecttime)); - loopCounter = 0; - } - - void checkping () - { - // ping if need - if ((++loopCounter) == numLoops) - { - loopCounter = 0; - sLog.outDetail ("Ping MySQL to keep connection alive"); - delete WorldDatabase.Query ("SELECT 1 FROM command LIMIT 1"); - delete LoginDatabase.Query ("SELECT 1 FROM realmlist LIMIT 1"); - delete CharacterDatabase.Query ("SELECT 1 FROM bugreport LIMIT 1"); - } - } - - void run () - { - SocketHandler h; - - // Launch the RA listener socket - ListenSocket<RASocket> RAListenSocket (h); - bool usera = sConfig.GetBoolDefault ("Ra.Enable", false); - - if (usera) - { - port_t raport = sConfig.GetIntDefault ("Ra.Port", 3443); - std::string stringip = sConfig.GetStringDefault ("Ra.IP", "0.0.0.0"); - ipaddr_t raip; - if (!Utility::u2ip (stringip, raip)) - sLog.outError ("MaNGOS RA can not bind to ip %s", stringip.c_str ()); - else if (RAListenSocket.Bind (raip, raport)) - sLog.outError ("MaNGOS RA can not bind to port %d on %s", raport, stringip.c_str ()); - else - { - h.Add (&RAListenSocket); - - sLog.outString ("Starting Remote access listner on port %d on %s", raport, stringip.c_str ()); - } - } - - // Socket Selet time is in microseconds , not miliseconds!! - uint32 socketSelecttime = sWorld.getConfig (CONFIG_SOCKET_SELECTTIME); - - // if use ra spend time waiting for io, if not use ra ,just sleep - if (usera) - { - while (!World::IsStopped()) - { - h.Select (0, socketSelecttime); - checkping (); - } - } - else - { - while (!World::IsStopped()) - { - ZThread::Thread::sleep (static_cast<unsigned long> (socketSelecttime / 1000)); - checkping (); - } - } - } -}; - -Master::Master() -{ -} - -Master::~Master() -{ -} - -/// Main function -int Master::Run() -{ - sLog.outString( "%s (core-daemon)", _FULLVERSION ); - sLog.outString( "<Ctrl-C> to stop.\n" ); - - sLog.outString( " ______ __"); - sLog.outString( "/\\__ _\\ __ __/\\ \\__"); - sLog.outString( "\\/_/\\ \\/ _ __ /\\_\\ ___ /\\_\\ \\ ,_\\ __ __"); - sLog.outString( " \\ \\ \\/\\`'__\\/\\ \\ /' _ `\\/\\ \\ \\ \\/ /\\ \\/\\ \\"); - sLog.outString( " \\ \\ \\ \\ \\/ \\ \\ \\/\\ \\/\\ \\ \\ \\ \\ \\_\\ \\ \\_\\ \\"); - sLog.outString( " \\ \\_\\ \\_\\ \\ \\_\\ \\_\\ \\_\\ \\_\\ \\__\\\\/`____ \\"); - sLog.outString( " \\/_/\\/_/ \\/_/\\/_/\\/_/\\/_/\\/__/ `/___/> \\"); - sLog.outString( " C O R E /\\___/"); - sLog.outString( "http://TrinityCore.org \\/__/\n"); - - /// worldd PID file creation - std::string pidfile = sConfig.GetStringDefault("PidFile", ""); - if(!pidfile.empty()) - { - uint32 pid = CreatePIDFile(pidfile); - if( !pid ) - { - sLog.outError( "Cannot create PID file %s.\n", pidfile.c_str() ); - return 1; - } - - sLog.outString( "Daemon PID: %u\n", pid ); - } - - ///- Start the databases - if (!_StartDB()) - return 1; - - ///- Initialize the World - sWorld.SetInitialWorldSettings(); - - ///- Catch termination signals - _HookSignals(); - - ///- Launch WorldRunnable thread - ZThread::Thread t(new WorldRunnable); - t.setPriority ((ZThread::Priority )2); - - // set server online - LoginDatabase.PExecute("UPDATE realmlist SET color = 0, population = 0 WHERE id = '%d'",realmID); - -#ifdef WIN32 - if (sConfig.GetBoolDefault("Console.Enable", true) && (m_ServiceStatus == -1)/* need disable console in service mode*/) -#else - if (sConfig.GetBoolDefault("Console.Enable", true)) -#endif - { - ///- Launch CliRunnable thread - ZThread::Thread td1(new CliRunnable); - } - - ZThread::Thread td2(new RARunnable); - - ///- Handle affinity for multiple processors and process priority on Windows - #ifdef WIN32 - { - HANDLE hProcess = GetCurrentProcess(); - - uint32 Aff = sConfig.GetIntDefault("UseProcessors", 0); - if(Aff > 0) - { - ULONG_PTR appAff; - ULONG_PTR sysAff; - - if(GetProcessAffinityMask(hProcess,&appAff,&sysAff)) - { - ULONG_PTR curAff = Aff & appAff; // remove non accessible processors - - if(!curAff ) - { - sLog.outError("Processors marked in UseProcessors bitmask (hex) %x not accessible for Trinityd. Accessible processors bitmask (hex): %x",Aff,appAff); - } - else - { - if(SetProcessAffinityMask(hProcess,curAff)) - sLog.outString("Using processors (bitmask, hex): %x", curAff); - else - sLog.outError("Can't set used processors (hex): %x",curAff); - } - } - sLog.outString(""); - } - - bool Prio = sConfig.GetBoolDefault("ProcessPriority", false); - -// if(Prio && (m_ServiceStatus == -1)/* need set to default process priority class in service mode*/) - if(Prio) - { - if(SetPriorityClass(hProcess,HIGH_PRIORITY_CLASS)) - sLog.outString("TrinityCore process priority class set to HIGH"); - else - sLog.outError("ERROR: Can't set Trinityd process priority class."); - sLog.outString(""); - } - } - #endif - - uint32 realCurrTime, realPrevTime; - realCurrTime = realPrevTime = getMSTime(); - - uint32 socketSelecttime = sWorld.getConfig(CONFIG_SOCKET_SELECTTIME); - - // maximum counter for next ping - uint32 numLoops = (sConfig.GetIntDefault( "MaxPingTime", 30 ) * (MINUTE * 1000000 / socketSelecttime)); - uint32 loopCounter = 0; - - ///- Start up freeze catcher thread - uint32 freeze_delay = sConfig.GetIntDefault("MaxCoreStuckTime", 0); - if(freeze_delay) - { - FreezeDetectorRunnable *fdr = new FreezeDetectorRunnable(); - fdr->SetDelayTime(freeze_delay*1000); - ZThread::Thread t(fdr); - t.setPriority(ZThread::High); - } - - ///- Launch the world listener socket - port_t wsport = sWorld.getConfig (CONFIG_PORT_WORLD); - std::string bind_ip = sConfig.GetStringDefault ("BindIP", "0.0.0.0"); - - if (sWorldSocketMgr->StartNetwork (wsport, bind_ip.c_str ()) == -1) - { - sLog.outError ("Failed to start network"); - World::StopNow(ERROR_EXIT_CODE); - // go down and shutdown the server - } - - sWorldSocketMgr->Wait (); - - // set server offline - LoginDatabase.PExecute("UPDATE realmlist SET color = 2 WHERE id = '%d'",realmID); - - ///- Remove signal handling before leaving - _UnhookSignals(); - - // when the main thread closes the singletons get unloaded - // since worldrunnable uses them, it will crash if unloaded after master - t.wait(); - td2.wait (); - - ///- Clean database before leaving - clearOnlineAccounts(); - - ///- Wait for delay threads to end - CharacterDatabase.HaltDelayThread(); - WorldDatabase.HaltDelayThread(); - LoginDatabase.HaltDelayThread(); - - sLog.outString( "Halting process..." ); - - #ifdef WIN32 - if (sConfig.GetBoolDefault("Console.Enable", true)) - { - // this only way to terminate CLI thread exist at Win32 (alt. way exist only in Windows Vista API) - //_exit(1); - // send keyboard input to safely unblock the CLI thread - INPUT_RECORD b[5]; - HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE); - b[0].EventType = KEY_EVENT; - b[0].Event.KeyEvent.bKeyDown = TRUE; - b[0].Event.KeyEvent.uChar.AsciiChar = 'X'; - b[0].Event.KeyEvent.wVirtualKeyCode = 'X'; - b[0].Event.KeyEvent.wRepeatCount = 1; - - b[1].EventType = KEY_EVENT; - b[1].Event.KeyEvent.bKeyDown = FALSE; - b[1].Event.KeyEvent.uChar.AsciiChar = 'X'; - b[1].Event.KeyEvent.wVirtualKeyCode = 'X'; - b[1].Event.KeyEvent.wRepeatCount = 1; - - b[2].EventType = KEY_EVENT; - b[2].Event.KeyEvent.bKeyDown = TRUE; - b[2].Event.KeyEvent.dwControlKeyState = 0; - b[2].Event.KeyEvent.uChar.AsciiChar = '\r'; - b[2].Event.KeyEvent.wVirtualKeyCode = VK_RETURN; - b[2].Event.KeyEvent.wRepeatCount = 1; - b[2].Event.KeyEvent.wVirtualScanCode = 0x1c; - - b[3].EventType = KEY_EVENT; - b[3].Event.KeyEvent.bKeyDown = FALSE; - b[3].Event.KeyEvent.dwControlKeyState = 0; - b[3].Event.KeyEvent.uChar.AsciiChar = '\r'; - b[3].Event.KeyEvent.wVirtualKeyCode = VK_RETURN; - b[3].Event.KeyEvent.wVirtualScanCode = 0x1c; - b[3].Event.KeyEvent.wRepeatCount = 1; - DWORD numb; - BOOL ret = WriteConsoleInput(hStdIn, b, 4, &numb); - } - #endif - - // for some unknown reason, unloading scripts here and not in worldrunnable - // fixes a memory leak related to detaching threads from the module - UnloadScriptingModule(); - - // Exit the process with specified return value - return World::GetExitCode(); -} - -/// Initialize connection to the databases -bool Master::_StartDB() -{ - std::string dbstring; - - ///- Get world database info from configuration file - dbstring = sConfig.GetStringDefault("WorldDatabaseInfo", ""); - if(dbstring.empty()) - { - sLog.outError("Database not specified in configuration file"); - return false; - } - - ///- Initialise the world database - if(!WorldDatabase.Initialize(dbstring.c_str())) - { - sLog.outError("Cannot connect to world database %s",dbstring.c_str()); - return false; - } - - ///- Get character database info from configuration file - dbstring = sConfig.GetStringDefault("CharacterDatabaseInfo", ""); - if(dbstring.empty()) - { - sLog.outError("Character Database not specified in configuration file"); - return false; - } - - ///- Initialise the Character database - if(!CharacterDatabase.Initialize(dbstring.c_str())) - { - sLog.outError("Cannot connect to Character database %s",dbstring.c_str()); - return false; - } - - ///- Get login database info from configuration file - dbstring = sConfig.GetStringDefault("LoginDatabaseInfo", ""); - if(dbstring.empty()) - { - sLog.outError("Login database not specified in configuration file"); - return false; - } - - ///- Initialise the login database - if(!LoginDatabase.Initialize(dbstring.c_str())) - { - sLog.outError("Cannot connect to login database %s",dbstring.c_str()); - return false; - } - - ///- Get the realm Id from the configuration file - realmID = sConfig.GetIntDefault("RealmID", 0); - if(!realmID) - { - sLog.outError("Realm ID not defined in configuration file"); - return false; - } - sLog.outString("Realm running as realm ID %d", realmID); - - ///- Initialize the DB logging system - if(sConfig.GetBoolDefault("EnableLogDB", false)) - { - // everything successful - set var to enable DB logging once startup finished. - sLog.SetLogDBLater(true); - sLog.SetRealmID(realmID); - } - - ///- Clean the database before starting - clearOnlineAccounts(); - - sWorld.LoadDBVersion(); - - sLog.outString("Using %s", sWorld.GetDBVersion()); - return true; -} - -/// Clear 'online' status for all accounts with characters in this realm -void Master::clearOnlineAccounts() -{ - // Cleanup online status for characters hosted at current realm - /// \todo Only accounts with characters logged on *this* realm should have online status reset. Move the online column from 'account' to 'realmcharacters'? - LoginDatabase.PExecute( - "UPDATE account SET online = 0 WHERE online > 0 " - "AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = '%d')",realmID); - - CharacterDatabase.Execute("UPDATE characters SET online = 0 WHERE online<>0"); - - // Battleground instance ids reset at server restart - CharacterDatabase.Execute("UPDATE characters SET bgid = 0 WHERE bgid<>0"); -} - -/// Handle termination signals -void Master::_OnSignal(int s) -{ - switch (s) - { - case SIGINT: - World::StopNow(RESTART_EXIT_CODE); - break; - case SIGTERM: - #ifdef _WIN32 - case SIGBREAK: - #endif - World::StopNow(SHUTDOWN_EXIT_CODE); - break; - } - - signal(s, _OnSignal); -} - -/// Define hook '_OnSignal' for all termination signals -void Master::_HookSignals() -{ - signal(SIGINT, _OnSignal); - signal(SIGTERM, _OnSignal); - #ifdef _WIN32 - signal(SIGBREAK, _OnSignal); - #endif -} - -/// Unhook the signals before leaving -void Master::_UnhookSignals() -{ - signal(SIGINT, 0); - signal(SIGTERM, 0); - #ifdef _WIN32 - signal(SIGBREAK, 0); - #endif -} diff --git a/src/mangosd/Master.h b/src/mangosd/Master.h deleted file mode 100644 index 3b2b38f32f4..00000000000 --- a/src/mangosd/Master.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/// \addtogroup Trinityd -/// @{ -/// \file - -#ifndef _MASTER_H -#define _MASTER_H - -#include "Common.h" -#include "Policies/Singleton.h" - -/// Start the server -class Master -{ - public: - Master(); - ~Master(); - int Run(); - static volatile uint32 m_masterLoopCounter; - - private: - bool _StartDB(); - - void _HookSignals(); - void _UnhookSignals(); - static void _OnSignal(int s); - - void clearOnlineAccounts(); -}; - -#define sMaster Trinity::Singleton<Master>::Instance() -#endif -/// @} diff --git a/src/mangosd/RASocket.cpp b/src/mangosd/RASocket.cpp deleted file mode 100644 index 370340859d3..00000000000 --- a/src/mangosd/RASocket.cpp +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** \file - \ingroup Trinityd -*/ - -#include "Common.h" -#include "Database/DatabaseEnv.h" -#include "Log.h" -#include "RASocket.h" -#include "World.h" -#include "Config/ConfigEnv.h" -#include "Util.h" -#include "AccountMgr.h" - -/// \todo Make this thread safe if in the future 2 admins should be able to log at the same time. -SOCKET r; - -#define dropclient {Sendf("I'm busy right now, come back later."); \ - SetCloseAndDelete(); \ - return; \ - } - -uint32 iSession=0; ///< Session number (incremented each time a new connection is made) -unsigned int iUsers=0; ///< Number of active administrators - -typedef int(* pPrintf)(const char*,...); - -void ParseCommand(CliCommandHolder::Print*, char*command); - -/// RASocket constructor -RASocket::RASocket(ISocketHandler &h): TcpSocket(h) -{ - - ///- Increment the session number - iSess =iSession++ ; - - ///- Get the config parameters - bSecure = sConfig.GetBoolDefault( "RA.Secure", true ); - iMinLevel = sConfig.GetIntDefault( "RA.MinLevel", 3 ); - - ///- Initialize buffer and data - iInputLength=0; - buff=new char[RA_BUFF_SIZE]; - stage=NONE; -} - -/// RASocket destructor -RASocket::~RASocket() -{ - ///- Delete buffer and decrease active admins count - delete [] buff; - - sLog.outRemote("Connection was closed.\n"); - - if(stage==OK) - iUsers--; -} - -/// Accept an incoming connection -void RASocket::OnAccept() -{ - std::string ss=GetRemoteAddress(); - sLog.outRemote("Incoming connection from %s.\n",ss.c_str()); - ///- If there is already an active admin, drop the connection - if(iUsers) - dropclient - - ///- Else print Motd - Sendf("%s\r\n",sWorld.GetMotd()); -} - -/// Read data from the network -void RASocket::OnRead() -{ - ///- Read data and check input length - TcpSocket::OnRead(); - - unsigned int sz=ibuf.GetLength(); - if(iInputLength+sz>=RA_BUFF_SIZE) - { - sLog.outRemote("Input buffer overflow, possible DOS attack.\n"); - SetCloseAndDelete(); - return; - } - - ///- If there is already an active admin (other than you), drop the connection - if(stage!=OK && iUsers) - dropclient - - char *inp = new char [sz+1]; - ibuf.Read(inp,sz); - - /// \todo Can somebody explain this 'Linux bugfix'? - if(stage==NONE) - if(sz>4) //linux remote telnet - if(memcmp(inp ,"USER ",5)) - { - delete [] inp;return; - printf("lin bugfix"); - } //linux bugfix - - ///- Discard data after line break or line feed - bool gotenter=false; - unsigned int y=0; - for(;y<sz;y++) - if(inp[y]=='\r'||inp[y]=='\n') - { - gotenter=true; - break; - } - - //No buffer overflow (checked above) - memcpy(&buff[iInputLength],inp,y); - iInputLength+=y; - delete [] inp; - if(gotenter) - { - - buff[iInputLength]=0; - iInputLength=0; - switch(stage) - { - /// <ul> <li> If the input is 'USER <username>' - case NONE: - if(!memcmp(buff,"USER ",5)) //got "USER" cmd - { - szLogin=&buff[5]; - - ///- Get the gmlevel and password from the account table - std::string login = szLogin; - - ///- Convert Account name to Upper Format - AccountMgr::normilizeString(login); - - ///- Escape the Login to allow quotes in names - LoginDatabase.escape_string(login); - - QueryResult* result = LoginDatabase.PQuery("SELECT gmlevel FROM account WHERE username = '%s'",login.c_str()); - - ///- If the user is not found, deny access - if(!result) - { - Sendf("-No such user.\r\n"); - sLog.outRemote("User %s does not exist.\n",szLogin.c_str()); - if(bSecure)SetCloseAndDelete(); - } - else - { - Field *fields = result->Fetch(); - - //szPass=fields[0].GetString(); - - ///- if gmlevel is too low, deny access - if(fields[0].GetUInt32()<iMinLevel) - { - Sendf("-Not enough privileges.\r\n"); - sLog.outRemote("User %s has no privilege.\n",szLogin.c_str()); - if(bSecure)SetCloseAndDelete(); - } else - { - stage=LG; - } - delete result; - } - } - break; - ///<li> If the input is 'PASS <password>' (and the user already gave his username) - case LG: - if(!memcmp(buff,"PASS ",5)) //got "PASS" cmd - { //login+pass ok - ///- If password is correct, increment the number of active administrators - std::string login = szLogin; - std::string pw = &buff[5]; - - AccountMgr::normilizeString(login); - AccountMgr::normilizeString(pw); - LoginDatabase.escape_string(login); - LoginDatabase.escape_string(pw); - - QueryResult *check = LoginDatabase.PQuery( - "SELECT 1 FROM account WHERE username = '%s' AND sha_pass_hash=SHA1(CONCAT(username,':','%s'))", - login.c_str(), pw.c_str()); - - if(check) - { - delete check; - r=GetSocket(); - stage=OK; - ++iUsers; - - Sendf("+Logged in.\r\n"); - sLog.outRemote("User %s has logged in.\n",szLogin.c_str()); - Sendf("TC>"); - } - else - { - ///- Else deny access - Sendf("-Wrong pass.\r\n"); - sLog.outRemote("User %s has failed to log in.\n",szLogin.c_str()); - if(bSecure)SetCloseAndDelete(); - } - } - break; - ///<li> If user is logged, parse and execute the command - case OK: - if(strlen(buff)) - { - sLog.outRemote("Got '%s' cmd.\n",buff); - sWorld.QueueCliCommand(&RASocket::zprint , buff); - } - else - Sendf("TC>"); - break; - ///</ul> - }; - - } -} - -/// Output function -void RASocket::zprint( const char * szText ) -{ - if( !szText ) - return; - - #ifdef RA_CRYPT - - char *megabuffer=strdup(szText); - unsigned int sz=strlen(megabuffer); - Encrypt(megabuffer,sz); - send(r,megabuffer,sz,0); - delete [] megabuffer; - - #else - - unsigned int sz=strlen(szText); - send(r,szText,sz,0); - - #endif -} diff --git a/src/mangosd/RASocket.h b/src/mangosd/RASocket.h deleted file mode 100644 index 8900e689b2c..00000000000 --- a/src/mangosd/RASocket.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/// \addtogroup Trinityd -/// @{ -/// \file - -#ifndef _RASOCKET_H -#define _RASOCKET_H - -#include "Common.h" -#include "sockets/TcpSocket.h" - -#define RA_BUFF_SIZE 1024 - -class ISocketHandler; - -/// Remote Administration socket -class RASocket: public TcpSocket -{ - public: - - RASocket(ISocketHandler& h); - ~RASocket(); - - void OnAccept(); - void OnRead(); - - private: - - char * buff; - std::string szLogin; - uint32 iSess; - unsigned int iInputLength; - bool bLog; - bool bSecure; //kick on wrong pass, non exist. user, user with no priv - //will protect from DOS, bruteforce attacks - //some 'smart' protection must be added for more security - uint8 iMinLevel; - enum - { - NONE, //initial value - LG, //only login was entered - OK, //both login and pass were given, and they are correct and user have enough priv. - }stage; - - static void zprint( const char * szText ); -}; -#endif -/// @} diff --git a/src/mangosd/WorldRunnable.cpp b/src/mangosd/WorldRunnable.cpp deleted file mode 100644 index 607b60684a9..00000000000 --- a/src/mangosd/WorldRunnable.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** \file - \ingroup Trinityd -*/ - -#include "WorldSocketMgr.h" -#include "Common.h" -#include "World.h" -#include "WorldRunnable.h" -#include "Timer.h" -#include "ObjectAccessor.h" -#include "MapManager.h" -#include "BattleGroundMgr.h" - -#include "Database/DatabaseEnv.h" - -#ifdef WIN32 -#define WORLD_SLEEP_CONST 50 -#else -#define WORLD_SLEEP_CONST 100 //Is this still needed?? [On linux some time ago not working 50ms] -#endif - -#ifdef WIN32 -#include "ServiceWin32.h" -extern int m_ServiceStatus; -#endif - -/// Heartbeat for the World -void WorldRunnable::run() -{ - ///- Init new SQL thread for the world database - WorldDatabase.ThreadStart(); // let thread do safe mySQL requests (one connection call enough) - CharacterDatabase.ThreadStart(); - LoginDatabase.ThreadStart(); - sWorld.InitResultQueue(); - - uint32 realCurrTime = 0; - uint32 realPrevTime = getMSTime(); - - uint32 prevSleepTime = 0; // used for balanced full tick time length near WORLD_SLEEP_CONST - - ///- While we have not World::m_stopEvent, update the world - while (!World::IsStopped()) - { - ++World::m_worldLoopCounter; - realCurrTime = getMSTime(); - - uint32 diff = getMSTimeDiff(realPrevTime,realCurrTime); - - sWorld.Update( diff ); - realPrevTime = realCurrTime; - - // diff (D0) include time of previous sleep (d0) + tick time (t0) - // we want that next d1 + t1 == WORLD_SLEEP_CONST - // we can't know next t1 and then can use (t0 + d1) == WORLD_SLEEP_CONST requirement - // d1 = WORLD_SLEEP_CONST - t0 = WORLD_SLEEP_CONST - (D0 - d0) = WORLD_SLEEP_CONST + d0 - D0 - if (diff <= WORLD_SLEEP_CONST+prevSleepTime) - { - prevSleepTime = WORLD_SLEEP_CONST+prevSleepTime-diff; - ZThread::Thread::sleep(prevSleepTime); - } - else - prevSleepTime = 0; - - #ifdef WIN32 - if (m_ServiceStatus == 0) World::StopNow(SHUTDOWN_EXIT_CODE); - while (m_ServiceStatus == 2) Sleep(1000); - #endif - } - - sWorld.KickAll(); // save and kick all players - sWorld.UpdateSessions( 1 ); // real players unload required UpdateSessions call - - // unload battleground templates before different singletons destroyed - sBattleGroundMgr.DeleteAllBattleGrounds(); - - sWorldSocketMgr->StopNetwork(); - - MapManager::Instance().UnloadAll(); // unload all grids (including locked in memory) - - ///- End the database thread - WorldDatabase.ThreadEnd(); // free mySQL thread resources - CharacterDatabase.ThreadStart(); - LoginDatabase.ThreadEnd(); -} diff --git a/src/mangosd/WorldRunnable.h b/src/mangosd/WorldRunnable.h deleted file mode 100644 index b967d0dac0b..00000000000 --- a/src/mangosd/WorldRunnable.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/// \addtogroup Trinityd -/// @{ -/// \file - -#ifndef __WORLDRUNNABLE_H -#define __WORLDRUNNABLE_H - -/// Heartbeat thread for the World -class WorldRunnable : public ZThread::Runnable -{ - public: - void run(); -}; -#endif -/// @} diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in deleted file mode 100644 index 7ec8265d87a..00000000000 --- a/src/mangosd/mangosd.conf.dist.in +++ /dev/null @@ -1,1509 +0,0 @@ -########################################## -# Trinity Core worldd configuration file # -########################################## -ConfVersion=2008080101 - -################################################################################################################### -# CONNECTIONS AND DIRECTORIES -# -# RealmID -# RealmID must match the realmlist inside the realmd database -# -# DataDir -# Data directory setting. -# Important: DataDir needs to be quoted, as it is a string which may contain space characters. -# Example: "@prefix@/share/trinitycore" -# -# LogsDir -# Logs directory setting. -# Important: Logs dir must exists, or all logs need to be disabled -# Default: "" - no log directory prefix, if used log names isn't absolute path -# then logs will be stored in current directory for run program. -# -# -# LoginDatabaseInfo -# WorldDatabaseInfo -# CharacterDatabaseInfo -# Database connection settings for the world server. -# Default: -# ---MYSQL--- -# hostname;port;username;password;database -# .;somenumber;username;password;database - use named pipes at Windows -# Named pipes: mySQL required adding "enable-named-pipe" to [mysqld] section my.ini -# .;/path/to/unix_socket;username;password;database - use Unix sockets at Unix/Linux -# ---PGSQL--- -# hostname;port;username;password;database -# .;/path/to/unix_socket/DIRECTORY or . for default path;username;password;database - use Unix sockets at Unix/Linux -# -# MaxPingTime -# Settings for maximum database-ping interval (minutes between pings) -# -# WorldServerPort -# Default WorldServerPort -# -# BindIP -# Bind World Server to IP/hostname -# -################################################################################################################### - -RealmID = 1 -DataDir = "." -LogsDir = "" -LoginDatabaseInfo = "127.0.0.1;3306;trinity;trinity;realmd" -WorldDatabaseInfo = "127.0.0.1;3306;trinity;trinity;world" -CharacterDatabaseInfo = "127.0.0.1;3306;trinity;trinity;characters" -MaxPingTime = 30 -WorldServerPort = 8085 -BindIP = "0.0.0.0" - -################################################################################################################### -# SCRIPTING SETTINGS -# -# Locale -# Setting for current (DBC) locale to use -# -# EventAI Error reporting -# 0 - Only startup (Default) -# 1 - Startup errors and Runtime event errors -# 2 - Startup errors, Runtime event errors, and Creation errors -################################################################################################################### - -Locale = 0 -EAIErrorLevel = 2 - -################################################################################################################### -# PERFORMANCE SETINGS -# -# UseProcessors -# Used processors mask for multi-processors system (Used only at Windows) -# Default: 0 (selected by OS) -# number (bitmask value of selected processors) -# -# ProcessPriority -# Process priority setting (Used only at Windows) -# Default: 1 (HIGH) -# 0 (Normal) -# -# Compression -# Compression level for update packages sent to client (1..9) -# Default: 1 (speed) -# 9 (best compression) -# -# PlayerLimit -# Maximum number of players in the world. Excluding Mods, GM's and Admins -# Default: 100 -# 0 (for infinite players) -# -1 (for Mods, GM's and Admins only) -# -2 (for GM's and Admins only) -# -3 (for Admins only) -# -# SaveRespawnTimeImmediately -# Save respawn time for creatures at death and for gameobjects at use/open -# Default: 1 (save creature/gameobject respawn time without waiting grid unload) -# 0 (save creature/gameobject respawn time at grid unload) -# -# MaxOverspeedPings -# Maximum overspeed ping count before player kick (minimum is 2, 0 used for disable check) -# Default: 2 -# -# GridUnload -# Unload grids (if you have lot memory you can disable it to speed up player move to new grids second time) -# Default: 1 (unload grids) -# 0 (do not unload grids) -# -# SocketSelectTime -# Socket select time (in milliseconds) -# Default: 10000 (10 secs) -# -# GridCleanUpDelay -# Grid clean up delay (in milliseconds) -# Default: 300000 (5 min) -# -# MapUpdateInterval -# Map update interval (in milliseconds) -# Default: 100 -# -# ChangeWeatherInterval -# Weather update interval (in milliseconds) -# Default: 600000 (10 min) -# -# PlayerSaveInterval -# Player save interval (in milliseconds) -# Default: 900000 (15 min) -# -# vmap.enableLOS -# vmap.enableHeight -# Enable/Disable VMmap support for line of sight and height calculation -# Default: 0 (disable) -# 1 (enable) -# -# vmap.ignoreMapIds -# Map id that will be ignored by VMaps -# List of ids with delimiter ',' -# If more then one id is defined and spaces are included, the string has to be enclosed by " -# Example: "369,0,1,530" -# -# vmap.ignoreSpellIds -# These spells are ignored for LoS calculation -# List of ids with delimiter ',' -# -# DetectPosCollision -# Check final move position, summon position, etc for visible collision with other objects or -# wall (wall only if vmaps are enabled) -# Default: 1 (enable, required more CPU power usage) -# 0 (disable, less nice position selection but will less CPU power usage) -# -# TargetPosRecalculateRange -# Max distance from movement target point (+moving unit size) and targeted object (+size) -# after that new target movmeent point calculated. Max: melee attack range (5), min: contact range (0.5) -# More distance let have better performence, less distance let have more sensitive reaction at target move. -# Default: 1.5 -# -# UpdateUptimeInterval -# Update realm uptime period in minutes (for save data in 'uptime' table). Must be > 0 -# Default: 10 (minutes) -# -# MaxCoreStuckTime -# Periodically check if the process got freezed, if this is the case force crash after the specified -# amount of seconds. Must be > 0. Recommended > 10 secs if you use this. -# Default: 0 (Disabled) -# -# AddonChannel -# Permit/disable the use of the addon channel through the server -# (some client side addons can stop work correctly with disabled addon channel) -# Default: 1 (permit addon channel) -# 0 (do not permit addon channel) -# -################################################################################################################### - -UseProcessors = 0 -ProcessPriority = 1 -Compression = 1 -PlayerLimit = 100 -SaveRespawnTimeImmediately = 1 -MaxOverspeedPings = 2 -GridUnload = 1 -SocketSelectTime = 10000 -GridCleanUpDelay = 300000 -MapUpdateInterval = 100 -ChangeWeatherInterval = 600000 -PlayerSaveInterval = 900000 -vmap.enableLOS = 0 -vmap.enableHeight = 0 -vmap.ignoreMapIds = "369" -vmap.ignoreSpellIds = "7720" -DetectPosCollision = 1 -TargetPosRecalculateRange = 1.5 -UpdateUptimeInterval = 10 -MaxCoreStuckTime = 0 -AddonChannel = 1 - -################################################################################################################### -# SERVER LOGGING -# -# LogSQL -# Enable logging of GM commands - all SQL code will be written to a log file -# All commands are written to a file: YYYY-MM-DD_logSQL.sql -# If a new day starts (00:00:00) then a new file is created - the old file will not be deleted. -# Default: 1 - Write SQL code to logfile -# 0 - Do not log -# -# PidFile -# World daemon PID file -# Default: "" - do not create PID file -# "./worldd.pid" - create PID file (recommended name) -# -# LogLevel -# Server console level of logging -# 0 = Minimum; 1 = Basic; 2 = Detail; 3 = Full/Debug -# Default: 3 -# -# LogFile -# Logfile name -# Default: "Server.log" -# "" - Empty name disable creating log file -# -# LogTimestamp -# Logfile with timestamp of server start in name -# Default: 0 - no timestamp in name -# 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext -# -# LogFileLevel -# Server file level of logging -# 0 = Minimum; 1 = Basic; 2 = Detail; 3 = Full/Debug -# Default: 0 -# -# LogFilter_AchievementUpdates -# LogFilter_CreatureMoves -# LogFilter_TransportMoves -# LogFilter_VisibilityChanges -# Log filters -# Default: 1 - not include with any log level -# 0 - include in log if log level permit -# -# WorldLogFile -# Packet logging file for the worldserver -# Default: "world.log" -# -# DBErrorLogFile -# Log file of DB errors detected at server run -# Default: "DBErrors.log" -# -# CharLogFile -# Character operations logfile name -# Default: "Char.log" -# "" - Empty name disable creating log file -# -# CharLogTimestamp -# Logfile with timestamp of server start in name -# Default: 0 - no timestamp in name -# 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext -# -# CharLogDump -# Write character dump before deleting in Char.log -# For restoration, cut character data from log starting from -# line == START DUMP == to line == END DUMP == (without its) in file and load it using loadpdump command -# Default: 0 - don't include dumping chars to log -# 1 - include dumping chars to log -# -# GmLogFile -# Log file of gm commands -# Default: "gm_commands.log" -# "" - Empty name for disable -# -# GmLogTimestamp -# GM Logfile with timestamp of server start in name -# Default: 0 - no timestamp in name -# 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext -# -# GmLogPerAccount -# GM Logfiles with GM account id (Note: logs not created if GmLogFile not set) -# Default: 0 - add gm log data to single log file -# 1 - add gm log data to account specific log files with name -# in form Logname_#ID_YYYY-MM-DD_HH-MM-SS.Ext -# or form Logname_#ID.Ext -# -# RaLogFile -# Log file of RA commands -# Default: "Ra.log" -# "" - Empty name for disable -# -# LogColors -# Color for messages (format "normal error basic detail debug") -# Colors: 0 - BLACK, 1 - RED, 2 - GREEN, 3 - BROWN, 4 - BLUE, 5 - MAGENTA, 6 - CYAN, 7 - GREY, -# 8 - YELLOW, 9 - LRED, 10 - LGREEN, 11 - LBLUE, 12 - LMAGENTA, 13 - LCYAN, 14 - WHITE -# Default: "" - none colors -# Example: "13 7 11 9 5" -# -# EnableLogDB -# Enable/disable logging to database (LogDatabaseInfo). -# Default: 0 - disabled -# 1 - enabled -# -# DBLogLevel -# Log level of DB logging. -# 0 = Minimum; 1 = Basic; 2 = Detail; 3 = Full/Debug -# Default: 3 -# -# LogDB.Char -# Enable/disable logging character outputs to DB. -# Default: 0 - off -# 1 - on -# -# LogDB.GM -# Enable/disable logging GM commands to DB. -# Default: 0 - off -# 1 - on -# -# LogDB.RA -# Enable/disable logging remote access events to DB. -# Default: 0 - off -# 1 - on -# -# LogDB.World -# Enable/disable logging world packets to DB. -# Default: 0 - off -# 1 - on (very heavy) -# -################################################################################################################### - -LogSQL = 1 -PidFile = "" -LogLevel = 1 -LogFile = "Server.log" -LogTimestamp = 0 -LogFileLevel = 0 -LogFilter_AchievementUpdates = 1 -LogFilter_CreatureMoves = 1 -LogFilter_TransportMoves = 1 -LogFilter_VisibilityChanges = 1 -WorldLogFile = "" -DBErrorLogFile = "db_errors.log" -CharLogFile = "characters.log" -CharLogTimestamp = 0 -CharLogDump = 0 -GmLogFile = "gm_commands.log" -GmLogTimestamp = 0 -GmLogPerAccount = 0 -RaLogFile = "ra_commands.log" -LogColors = "" -EnableLogDB = 0 -DBLogLevel = 1 -LogDB.Char = 0 -LogDB.GM = 0 -LogDB.RA = 0 -LogDB.World = 0 - -################################################################################################################### -# SERVER SETTINGS -# -# GameType -# Server realm style -# 0 = NORMAL;1 = PVP; 4 = NORMAL; 6 = RP; 8 = RPPVP -# also custom type: 16 FFA_PVP (free for all pvp mode like arena PvP in all zones except rest -# activated places and sanctuaries) -# -# RealmZone -# Server realm zone (set allowed alphabet in character names/etc). See also Strict*Names options. -# -# 1 Development - any language (Default) -# 2 United States - extended-Latin -# 3 Oceanic - extended-Latin -# 4 Latin America - extended-Latin -# 5 Tournament - basic-Latin at create, any at login -# 6 Korea - East-Asian -# 7 Tournament - basic-Latin at create, any at login -# 8 English - extended-Latin -# 9 German - extended-Latin -# 10 French - extended-Latin -# 11 Spanish - extended-Latin -# 12 Russian - Cyrillic -# 13 Tournament - basic-Latin at create, any at login -# 14 Taiwan - East-Asian -# 15 Tournament - basic-Latin at create, any at login -# 16 China - East-Asian -# 17 CN1 - basic-Latin at create, any at login -# 18 CN2 - basic-Latin at create, any at login -# 19 CN3 - basic-Latin at create, any at login -# 20 CN4 - basic-Latin at create, any at login -# 21 CN5 - basic-Latin at create, any at login -# 22 CN6 - basic-Latin at create, any at login -# 23 CN7 - basic-Latin at create, any at login -# 24 CN8 - basic-Latin at create, any at login -# 25 Tournament - basic-Latin at create, any at login -# 26 Test Server - any language -# 27 Tournament - basic-Latin at create, any at login -# 28 QA Server - any language -# 29 CN9 - basic-Latin at create, any at login -# -# Expansion -# Allow server use content from expansion -# Default: 2 - check expansion 2 maps existence, and if client support expansion 2 and account have -# expansion 2 setting then allow visit expansion 2 maps, allow create new class character) -# 1 - check expansion 1 maps existence, and if client support expansion 1 and account have -# expansion 1 setting then allow visit expansion 1 maps, allow create new races character) -# 0 - not check expansion maps existence, not allow wisit its, not allow create new race or new class -# characters, ignore account expansion setting) -# -# DBC.Locale -# DBC Language Settings -# 0 = English; 1 = Korean; 2 = French; 3 = German; 4 = Chinese; 5 = Taiwanese; 6 = Spanish; 7 = Spanish Mexico -# 8 = Russian; 255 = Auto Detect (Default) -# -# DeclinedNames -# Allow russian clients to set and use declined names -# Default: 0 - do not use declined names, except when the Russian RealmZone is set -# 1 - use declined names -# -# StrictPlayerNames -# Limit player name to language specific symbols set, not allow create characters, and set rename request and disconnect at not allowed symbols name -# Default: 0 disable (but limited server timezone dependent client check) -# 1 basic latin characters (strict) -# 2 realm zone specific (strict). See RealmZone setting. -# Note: In any case if you want correctly see character name at client this client must have apporopriate fonts -# (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts). -# 3 basic latin characters + server timezone specific -# -# StrictCharterNames -# Limit guild/arena team charter names to language specific symbols set, not allow create charters with allowed symbols in name -# Default: 0 disable -# 1 basic latin characters (strict) -# 2 realm zone specific (strict). See RealmZone setting. -# Note: In any case if you want correctly see character name at client this client must have apporopriate fonts -# (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts). -# 3 basic latin characters + server timezone specific -# -# StrictPetNames -# Limit pet names to language specific symbols set -# Default: 0 disable -# 1 basic latin characters (strict) -# 2 realm zone specific (strict). See RealmZone setting. -# Note: In any case if you want correctly see character name at client this client must have apporopriate fonts -# (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts). -# 3 basic latin characters + server timezone specific -# -# CharactersCreatingDisabled -# Disable characters creating for specific team or any (non-player accounts not affected) -# Default: 0 - enabled -# 1 - disabled only for Alliance -# 2 - disabled only for Horde -# 3 - disabled for both teams -# -# MaxWhoListReturns -# Set the maximum number of players returned in the /who list and interface. -# Default: 49 (stable) -# -# CharactersPerAccount -# Limit numbers of characters per account (at all realms). -# Note: this setting limit character creating at _current_ realm base at characters amount at all realms -# Default: 50 -# The number must be >= CharactersPerRealm -# -# CharactersPerRealm -# Limit numbers of characters for account at realm -# Default: 10 (client limitation) -# The number must be between 1 and 10 -# -# HeroicCharactersPerRealm -# Limit numbers of heroic class characters for account at realm -# Default: 1 -# The number must be between 0 (not allowed) and 10 -# -# MinLevelForHeroicCharacterCreating -# Limit creating heroic characters only for account with another character of specific level (ignored for GM accounts) -# 0 - not require any existed chaarcter -# 1 - require at least any character existed -# Default: 55 - default requirement -# -# -# SkipCinematics -# Disable in-game script movie at first character's login(allows to prevent buggy intro in case of custom start location coordinates) -# Default: 0 - show intro for each new characrer -# 1 - show intro only for first character of selected race -# 2 - disable intro show in all cases -# -# MaxPlayerLevel -# Max level that can be reached by player for experience (in range from 1 to 100). -# Change not recommended -# Default: 80 -# -# StartPlayerLevel -# Staring level that have character at creating (in range 1 to MaxPlayerLevel) -# Default: 1 -# -# StartHeroicPlayerLevel -# Staring level that have character of heroic class at creating (in range 1 to MaxPlayerLevel) -# Default: 55 -# -# StartPlayerMoney -# Amount of money that new players will start with. -# If you want to start with silver, use for example 100 (100 copper = 1 silver) -# Default: 0 -# -# MaxHonorPoints -# Max honor points that player can have. -# Default: 75000 -# -# StartHonorPoints -# Amount of honor that new players will start with -# Default: 0 -# -# MaxArenaPoints -# Max arena points that player can have. -# Default: 5000 -# -# StartArenaPoints -# Amount of arena points that new players will start with -# Default: 0 -# -# InstantLogout -# Enable or disable instant logout for security level (0..4) or high (NOT in combat/while dueling/while falling) -# Default: 1 (Mods/GMs/Admins) -# -# DisableWaterBreath -# Disable/enable waterbreathing for security level (0..4) or high -# Default: 4 (None) -# -# AllFlightPaths -# Players will start with all flight paths (Note: ALL flight paths, not only player's team) -# Default: 0 (true) -# 1 (false) -# -# AlwaysMaxSkillForLevel -# Players will automatically gain max level dependent (weapon/defense) skill when logging in, leveling up etc. -# Default: 0 (false) -# 1 (true) -# -# ActivateWeather -# Activate weather system -# Default: 1 (true) -# 0 (false) -# -# CastUnstuck -# Allow cast or not Unstuck spell at .start or client Help option use -# Default: 1 (true) -# 0 (false) -# -# Instance.IgnoreLevel -# Ignore level requirement to enter instance -# Default: 0 (false) -# 1 (true) -# -# Instance.IgnoreRaid -# Ignore raid requirement to enter instance -# Default: 0 (false) -# 1 (true) -# -# Instance.ResetTimeHour -# The hour of the day (0-23) when the global instance resets occur. -# Default: 4 -# -# Instance.UnloadDelay -# Unload the instance map from memory after some time if no players are inside. -# Default: 1800000 (miliseconds 30 minutes) -# 0 (instance maps are kept in memory until they are reset) -# -# Quests.LowLevelHideDiff -# Quest level difference to hide for player low level quests: -# if player_level > quest_level + LowLevelQuestsHideDiff then quest "!" mark not show for quest giver -# Default: 4 -# -1 (show all available quests marks) -# -# Quests.HighLevelHideDiff -# Quest level difference to hide for player high level quests: -# if player_level < quest_min_level - HighLevelQuestsHideDiff then quest "!" mark not show for quest giver -# Default: 7 -# -1 (show all available quests marks) -# -# MaxPrimaryTradeSkill -# Max count that player can learn the primary trade skill. -# Default: 2 -# Max : 10 -# -# MinPetitionSigns -# Min signatures count to creating guild (0..9). -# Default: 9 -# -# MaxGroupXPDistance -# Max distance to creature for group memeber to get XP at creature death. -# Default: 74 -# -# MailDeliveryDelay -# Mail delivery delay time for item sending -# Default: 3600 sec (1 hour) -# -# SkillChance.Prospecting -# For prospecting skillup impossible by default, but can be allowed as custom setting -# Default: 0 - no skilups -# 1 - skilups possible -# -# SkillChance.Milling -# For milling skillup impossible by default, but can be allowed as custom setting -# Default: 0 - no skilups -# 1 - skilups possible -# -# OffhandCheckAtTalentsReset -# Talent reset can change offhand weapon restrictions for equip slots. -# Default: 0 - recheck offhand slot weapon only at zone update -# 1 - recheck offhand slot weapon at talent reset also -# -# Event.Announce -# Default: 0 (false) -# 1 (true) -# -# BeepAtStart -# Beep at core start finished (mostly work only at Unix/Linux systems) -# Default: 1 (true) -# 0 (false) -# -# Motd -# Message of the Day. Displayed at worldlogin for every user ('@' for a newline). -# -# Server.LoginInfo -# Enable/disable sending server info (core version) on login. -# Default: 0 - disable -# 1 - enable -# -################################################################################################################### - -GameType = 1 -RealmZone = 1 -Expansion = 2 -DBC.Locale = 255 -DeclinedNames = 0 -StrictPlayerNames = 0 -StrictCharterNames = 0 -StrictPetNames = 0 -MaxWhoListReturns = 49 -CharactersCreatingDisabled = 0 -CharactersPerAccount = 50 -CharactersPerRealm = 10 -HeroicCharactersPerRealm = 1 -MinLevelForHeroicCharacterCreating = 55 -SkipCinematics = 0 -MaxPlayerLevel = 80 -StartPlayerLevel = 1 -StartHeroicPlayerLevel = 55 -StartPlayerMoney = 0 -MaxHonorPoints = 75000 -StartHonorPoints = 0 -MaxArenaPoints = 5000 -StartArenaPoints = 0 -InstantLogout = 1 -DisableWaterBreath = 4 -AllFlightPaths = 0 -AlwaysMaxSkillForLevel = 0 -ActivateWeather = 1 -CastUnstuck = 1 -Instance.IgnoreLevel = 0 -Instance.IgnoreRaid = 0 -Instance.ResetTimeHour = 4 -Instance.UnloadDelay = 1800000 -Quests.LowLevelHideDiff = 4 -Quests.HighLevelHideDiff = 7 -MaxPrimaryTradeSkill = 2 -MinPetitionSigns = 9 -MaxGroupXPDistance = 74 -MailDeliveryDelay = 3600 -SkillChance.Prospecting = 0 -SkillChance.Milling = 0 -OffhandCheckAtTalentsReset = 0 -Event.Announce = 0 -BeepAtStart = 1 -Motd = "Welcome to a Trinity Core server." -Server.LoginInfo = 0 - -################################################################################################################### -# PLAYER INTERACTION -# -# AllowTwoSide.Accounts -# Allow or not accounts to create characters in the 2 teams in any game type. -# Default: 0 (Not allowed) -# 1 (Allowed) -# -# AllowTwoSide.Interaction.Chat -# AllowTwoSide.Interaction.Channel -# AllowTwoSide.Interaction.Group -# AllowTwoSide.Interaction.Guild -# AllowTwoSide.Interaction.Auction -# AllowTwoSide.Interaction.Mail -# Allow or not common :chat(say,yell);channel(chat)group(join)guild(join);merge all auction houses for players from -# different teams, send mail to different team. -# Default: 0 (Not allowed) -# 1 (Allowed) -# -# AllowTwoSide.WhoList -# Allow or not show player from both team in who list. -# Default: 0 (Not allowed) -# 1 (Allowed) -# -# AllowTwoSide.AddFriend -# Allow or not adding friends from other team in friend list. -# Default: 0 (Not allowed) -# 1 (Allowed) -# -# AllowTwoSide.Trade -# Allow or not trading with other team in party. -# Default: 0 (Not allowed) -# 1 (Allowed) -# -# TalentsInspecting -# Allow other players see character talents in inspect dialog (Characters in Gamemaster mode can -# inspect talents always) -# Default: 1 (allow) -# 0 (not allow) -# -################################################################################################################### - -AllowTwoSide.Accounts = 0 -AllowTwoSide.Interaction.Chat = 0 -AllowTwoSide.Interaction.Channel = 0 -AllowTwoSide.Interaction.Group = 0 -AllowTwoSide.Interaction.Guild = 0 -AllowTwoSide.Interaction.Auction = 0 -AllowTwoSide.Interaction.Mail = 0 -AllowTwoSide.WhoList = 0 -AllowTwoSide.AddFriend = 0 -AllowTwoSide.Trade = 0 -TalentsInspecting = 1 - -################################################################################################################### -# CREATURE SETTINGS -# -# ThreatRadius -# Radius for creature to evade after being pulled away from combat start point -# If ThreatRadius is less than creature aggro radius then aggro radius will be used -# Default: 60 yards -# -# Rate.Creature.Aggro -# Aggro radius percent or off. -# Default: 1 - 100% -# 1.5 - 150% -# 0 - off (0%) -# -# CreatureFamilyAssistanceRadius -# Creature family assistance radius -# Default: 10 -# 0 - off -# -# CreatureFamilyAssistanceDelay -# Reaction time for creature assistance call -# Default: 1500 (1.5s) -# -# WorldBossLevelDiff -# Difference for boss dynamic level with target -# Default: 3 -# -# Corpse.Decay.NORMAL -# Corpse.Decay.RARE -# Corpse.Decay.ELITE -# Corpse.Decay.RAREELITE -# Corpse.Decay.WORLDBOSS -# Seconds until creature corpse will decay without being looted or skinned. -# Default: 60, 300, 300, 300, 3600 -# -# Rate.Corpse.Decay.Looted -# Controls how long the creature corpse stays after it had been looted, as a multiplier of its Corpse.Decay.* config. -# Default: 0.5 -# -# Rate.Creature.Normal.Damage -# Rate.Creature.Elite.Elite.Damage -# Rate.Creature.Elite.RAREELITE.Damage -# Rate.Creature.Elite.WORLDBOSS.Damage -# Rate.Creature.Elite.RARE.Damage -# Creature Damage Rates. -# Examples: 2 - creatures will damage 2x, 1.7 - 1.7x. -# -# Rate.Creature.Normal.SpellDamage -# Rate.Creature.Elite.Elite.SpellDamage -# Rate.Creature.Elite.RAREELITE.SpellDamage -# Rate.Creature.Elite.WORLDBOSS.SpellDamag -# Rate.Creature.Elite.RARE.SpellDamage -# Creature Spell Damage Rates. -# Examples: 2 - creatures will damage with spells 2x, 1.7 - 1.7x. -# -# Rate.Creature.Normal.HP -# Rate.Creature.Elite.Elite.HP -# Rate.Creature.Elite.RAREELITE.HP -# Rate.Creature.Elite.WORLDBOSS.HP -# Rate.Creature.Elite.RARE.HP -# Creature Health Ammount Modifier. -# Examples: 2 - creatures have 2x health, 1.7 - 1.7x. -# -# ListenRange.Say -# Distance from player to listen text that creature (or other world object) say -# Default: 25 -# -# ListenRange.TextEmote -# Distance from player to listen textemote that creature (or other world object) say -# Default: 25 -# -# ListenRange.Yell -# Distance from player to listen text that creature (or other world object) yell -# Default: 300 -# -################################################################################################################### - -ThreatRadius = 60 -Rate.Creature.Aggro = 1 -CreatureFamilyAssistanceRadius = 10 -CreatureFamilyAssistanceDelay = 1500 -WorldBossLevelDiff = 3 -Corpse.Decay.NORMAL = 60 -Corpse.Decay.RARE = 300 -Corpse.Decay.ELITE = 300 -Corpse.Decay.RAREELITE = 300 -Corpse.Decay.WORLDBOSS = 3600 -Rate.Corpse.Decay.Looted = 0.5 -Rate.Creature.Normal.Damage = 1 -Rate.Creature.Elite.Elite.Damage = 1 -Rate.Creature.Elite.RAREELITE.Damage = 1 -Rate.Creature.Elite.WORLDBOSS.Damage = 1 -Rate.Creature.Elite.RARE.Damage = 1 -Rate.Creature.Normal.SpellDamage = 1 -Rate.Creature.Elite.Elite.SpellDamage = 1 -Rate.Creature.Elite.RAREELITE.SpellDamage = 1 -Rate.Creature.Elite.WORLDBOSS.SpellDamage = 1 -Rate.Creature.Elite.RARE.SpellDamage = 1 -Rate.Creature.Normal.HP = 1 -Rate.Creature.Elite.Elite.HP = 1 -Rate.Creature.Elite.RAREELITE.HP = 1 -Rate.Creature.Elite.WORLDBOSS.HP = 1 -Rate.Creature.Elite.RARE.HP = 1 -ListenRange.Say = 40 -ListenRange.TextEmote = 40 -ListenRange.Yell = 300 - -################################################################################################################### -# CHAT SETTINGS -# -# ChatFakeMessagePreventing -# Chat protection from creating fake messages using a lot spaces (other invisible symbols), -# not applied to addon language messages, but can prevent working old addons -# that use normal languages for sending data to another clients. -# Default: 0 (disible fake messages preventing) -# 1 (enabled fake messages preventing) -# -# ChatFlood.MessageCount -# Chat anti-flood protection, haste message count to activate protection -# Default: 10 -# 0 (disible anti-flood protection) -# -# ChatFlood.MessageDelay -# Chat anti-flood protection, minimum message delay to count message -# Default: 1 (in secs) -# -# ChatFlood.MuteTime -# Chat anti-flood protection, mute time at activation flood protection (not saved) -# Default: 10 (in secs) -# -# Channel.RestrictedLfg -# Restrict use LookupForGroup channel only registered in LFG tool players -# Default: 1 (allow join to channel only if active in LFG) -# 0 (allow join to channel in any time) -# -# Channel.SilentlyGMJoin -# Silently join GM characters (security level > 1) to channels -# Default: 0 (join announcement in normal way) -# 1 (GM join without announcement) -# -################################################################################################################### - -ChatFakeMessagePreventing = 0 -ChatFlood.MessageCount = 10 -ChatFlood.MessageDelay = 1 -ChatFlood.MuteTime = 10 -Channel.RestrictedLfg = 1 -Channel.SilentlyGMJoin = 0 - -################################################################################################################### -# GAME MASTER SETTINGS -# -# GM.LoginState -# GM mode at login -# Default: 2 (last save state) -# 0 (disable) -# 1 (enable) -# -# GM.Visible -# GM visibility at login -# Default: 2 (last save state) -# 0 (invisible) -# 1 (visible) -# -# GM.AcceptTickets -# Is GM accepting tickets from player by default or not. -# Default: 2 (last save state) -# 0 (disable) -# 1 (enable) -# -# GM.Chat -# GM chat mode at login -# Default: 2 (last save state) -# 0 (disable) -# 1 (enable) -# -# GM.WhisperingTo -# Is GM accepting whispers from player by default or not. -# Default: 2 (last save state) -# 0 (disable) -# 1 (enable) -# -# GM.InGMList -# Is GM showed in GM list (if visible) in non-GM state (.gm off) -# Default: 0 (false) -# 1 (true) -# -# GM.InWhoList -# Is GM showed in who list (if visible). -# Default: 0 (false) -# 1 (true) -# -# GM.LogTrade -# Include GM trade and trade slot enchanting operations in GM log if it enable -# Default: 1 (include) -# 0 (not include) -# -# GM.StartLevel -# GM starting level (1-100) -# Default: 1 -# -# GM.LowerSecurity -# Disallow a lower security member to interact with a higher one using commands -# Default: 0 (disable) -# 1 (enable) -# -# GM.AllowAchievementGain -# If enabled it allows gaining achievements for GM characters -# Default: 1 (enable) -# 0 (disable) -# -################################################################################################################### - -GM.LoginState = 2 -GM.Visible = 2 -GM.AcceptTickets = 2 -GM.Chat = 2 -GM.WhisperingTo = 2 -GM.InGMList = 0 -GM.InWhoList = 0 -GM.LogTrade = 1 -GM.StartLevel = 80 -GM.LowerSecurity = 0 -GM.AllowAchievementGain = 1 - -################################################################################################################### -# VISIBILITY AND RADIUSES -# -# Visibility.GroupMode -# Group visibility modes -# Default: 0 (standard setting: only members from same group can 100% auto detect invisible player) -# 1 (raid members 100% auto detect invisible player from same raid) -# 2 (players from same team can 100% auto detect invisible player) -# -# Visibility.Distance.Creature -# Visibility.Distance.Player -# Visibility distance for different in game object -# Max limited by active player zone: ~ 166 -# Min limit dependent from objects -# Default: 66 (cell size) -# Min limit is max aggro radius (45) * Rate.Creature.Aggro -# -# Visibility.Distance.Object -# Visible distance for gameobject, dynobject, bodies, corpses, bones -# Min limit is iteraction distance (5) -# -# Visibility.Distance.InFlight -# Visible distance for player in flight -# Min limit is 0 (not show any objects) -# -# Visibility.Distance.Grey.Unit -# Visibility grey distance for creatures/players (fast changing objects) -# addition to appropriate object type Visibility.Distance.* use in case visibility removing to -# object (except corpse around distences) If D is distance and G is grey distance then object -# make visible if distance to it <= D but make non visible if distance > D+G -# Default: 1 (yard) -# -# Visibility.Distance.Grey.Object -# Visibility grey distance for dynobjects/gameobjects/corpses/creature bodies -# Default: 10 (yards) -# -# -################################################################################################################### - -Visibility.GroupMode = 0 -Visibility.Distance.Creature = 66 -Visibility.Distance.Player = 66 -Visibility.Distance.Object = 66 -Visibility.Distance.InFlight = 66 -Visibility.Distance.Grey.Unit = 1 -Visibility.Distance.Grey.Object = 10 - -################################################################################################################### -# SERVER RATES -# -# Rate.Health -# Rate.Mana -# Rate.Rage.Income -# Rate.Rage.Loss -# Rate.RunicPower.Income -# Rate.RunicPower.Loss -# Rate.Focus -# Rate.Loyalty -# Health and power regeneration and rage income from damage. -# Default: 1 -# -# Rate.Skill.Discovery -# Skill Discovery Rates -# Default: 1 -# -# Rate.Drop.Item.Poor -# Rate.Drop.Item.Normal -# Rate.Drop.Item.Uncommon -# Rate.Drop.Item.Rare -# Rate.Drop.Item.Epic -# Rate.Drop.Item.Legendary -# Rate.Drop.Item.Artifact -# Rate.Drop.Item.Referenced -# Rate.Drop.Money -# Drop rates (items by quality and money) -# Default: 1 -# -# Rate.Drop.Money -# Drop rates -# Default: 1 -# -# Rate.XP.Kill -# Rate.XP.Quest -# Rate.XP.Explore -# XP rates -# Default: 1 -# -# Rate.XP.PastLevel70 -# XP needed per level past 70 (Rates below 1 not recommended) -# Default: 1 -# -# Rate.Rest.InGame -# Rate.Rest.Offline.InTavernOrCity -# Rate.Rest.Offline.InWilderness -# Resting points grow rates (1 - normal, 2 - double rate, 0.5 - half rate, etc) from standard values -# -# Rate.Damage.Fall -# Damage after fall rate. (1 - standard, 2 - double damage, 0.5 - half damage, etc) -# -# Rate.Auction.Time -# Rate.Auction.Deposit -# Rate.Auction.Cut -# Auction rates (auction time, deposit get at auction start, auction cut from price at auction end) -# -# Rate.Honor -# Honor gain rate -# -# Rate.Mining.Amount -# Rate.Mining.Next -# Mining Rates (Mining.Amount changes minimum/maximum usetimes of a deposit, -# Mining.Next changes chance to have next use of a deposit) -# -# Rate.Talent -# Talent Point rates -# Default: 1 -# -# Rate.Reputation.Gain -# Reputation Gain rate -# Default: 1 -# -# Rate.InstanceResetTime -# Multiplier for the number of days in between global raid/heroic instance resets. -# Default: 1 -# -# SkillGain.Crafting -# SkillGain.Defense -# SkillGain.Gathering -# SkillGain.Weapon -# crafting/defense/gathering/weapon skills gain at skill grow (1,2,...) -# Default: 1 -# -# SkillChance.Orange -# SkillChance.Yellow -# SkillChance.Green -# SkillChance.Grey -# Skill chance values (0..100) -# Default: 100-75-25-0 -# -# SkillChance.MiningSteps -# SkillChance.SkinningSteps -# For skinning and Mining chance decrease with skill level. -# Default: 0 - no decrease -# 75 - in 2 times each 75 skill points -# -# DurabilityLossChance.Damage -# Chance lost one from equiped items durability point at damage apply or receive. -# Default: 0.5 (100/0.5 = 200) Each 200 damage apply one from 19 possible equipped items -# -# DurabilityLossChance.Absorb -# Chance lost one from armor items durability point at damage absorb. -# Default: 0.5 (100/0.5 = 200) Each 200 absorbs apply one from 15 possible armor equipped items -# -# DurabilityLossChance.Parry -# Chance lost weapon durability point at parry. -# Default: 0.05 (100/0.05 = 2000) Each 2000 parry attacks main weapon lost point -# -# DurabilityLossChance.Block -# Chance lost sheild durability point at damage block. -# Default: 0.05 (100/0.05 = 2000) Each 2000 partly or full blocked attacks shield lost point -# -# Death.SicknessLevel -# Starting Character start gain sickness at spirit resurrection (1 min) -# Default: 11 -# -10 - character will have full time (10min) sickness at 1 level -# maxplayerlevel+1 - chaarcter will not have sickess at any level -# -# Death.CorpseReclaimDelay.PvP -# Death.CorpseReclaimDelay.PvE -# Enabled/disabled increase corpse reclaim delay at often PvP/PvE deaths -# Default: 1 (enabled) -# 0 (disabled) -# -# Death.Bones.World -# Death.Bones.BattlegroundOrArena -# Enable/disable creating bones instead corpse at resurrection (in normal zones/instacnes, or battleground/arenas) -# Default: 1 (enabled) -# 0 (disabled) -# -################################################################################################################### - -Rate.Health = 1 -Rate.Mana = 1 -Rate.Rage.Income = 1 -Rate.Rage.Loss = 1 -Rate.RunicPower.Income = 1 -Rate.RunicPower.Loss = 1 -Rate.Focus = 1 -Rate.Loyalty = 1 -Rate.Skill.Discovery = 1 -Rate.Drop.Item.Poor = 1 -Rate.Drop.Item.Normal = 1 -Rate.Drop.Item.Uncommon = 1 -Rate.Drop.Item.Rare = 1 -Rate.Drop.Item.Epic = 1 -Rate.Drop.Item.Legendary = 1 -Rate.Drop.Item.Artifact = 1 -Rate.Drop.Item.Referenced = 1 -Rate.Drop.Money = 1 -Rate.XP.Kill = 1 -Rate.XP.Quest = 1 -Rate.XP.Explore = 1 -Rate.XP.PastLevel70 = 1 -Rate.Rest.InGame = 1 -Rate.Rest.Offline.InTavernOrCity = 1 -Rate.Rest.Offline.InWilderness = 1 -Rate.Damage.Fall = 1 -Rate.Auction.Time = 1 -Rate.Auction.Deposit = 1 -Rate.Auction.Cut = 1 -Rate.Honor = 1 -Rate.Mining.Amount = 1 -Rate.Mining.Next = 1 -Rate.Talent = 1 -Rate.Reputation.Gain = 1 -Rate.InstanceResetTime = 1 -SkillGain.Crafting = 1 -SkillGain.Defense = 1 -SkillGain.Gathering = 1 -SkillGain.Weapon = 1 -SkillChance.Orange = 100 -SkillChance.Yellow = 75 -SkillChance.Green = 25 -SkillChance.Grey = 0 -SkillChance.MiningSteps = 0 -SkillChance.SkinningSteps = 0 -DurabilityLossChance.Damage = 0.5 -DurabilityLossChance.Absorb = 0.5 -DurabilityLossChance.Parry = 0.05 -DurabilityLossChance.Block = 0.05 -Death.SicknessLevel = 11 -Death.CorpseReclaimDelay.PvP = 1 -Death.CorpseReclaimDelay.PvE = 0 -Death.Bones.World = 1 -Death.Bones.BattlegroundOrArena = 1 - - -################################################################################################################### -# BATTLEGROUND CONFIG -# -# Battleground.CastDeserter -# Cast Deserter spell at player who leave battleground in progress -# Default: 1 (enable) -# 0 (disable) -# -# Battleground.QueueAnnouncer.Enable -# Enable queue announcer posting to chat -# Default: 0 (disable) -# 1 (enable) -# -# Battleground.QueueAnnouncer.PlayerOnly -# Enable queue announcer posting to chat -# Default: 0 (disable) -# 1 (enable) -# -# Battleground.InvitationType -# Set Battleground invitation type -# Default: 0 (normal - invite as much players to bg as possible, don't bother with ballance) -# 1 (Experimental - don't allow to invite much more players of one faction) -# -# Battleground.PrematureFinishTimer -# The time to end the bg if there are less than MinPlayersPerTeam on one side in milliseconds -# Default: 300000 (5 minutes) -# 0 - disable (not recommended) -# -# BattleGround.PremadeGroupWaitForMatch -# The time in which premade group of 1 faction waits in BG Queue for premade group of other faction -# Default: 1800000 (30 minutes) -# 0 - disable (not recommended) -# -################################################################################################################### - -Battleground.CastDeserter = 1 -Battleground.QueueAnnouncer.Enable = 0 -Battleground.QueueAnnouncer.PlayerOnly = 0 -Battleground.InvitationType = 0 -BattleGround.PrematureFinishTimer = 300000 -BattleGround.PremadeGroupWaitForMatch = 1800000 - - -################################################################################################################### -# ARENA CONFIG -# -# Arena.MaxRatingDifference -# The maximum rating difference between two groups in rated matches -# Default: 150 (enable, recommended) -# 0 (disable, rating difference is discarded) -# -# Arena.RatingDiscardTimer -# After the specified milliseconds has passed, -# rating information will be discarded when selecting teams for matches -# also initiates an update by this timer -# Default: 600000 (10 minutes, recommended) -# 0 (disable) -# -# Arena.AutoDistributePoints -# Set if arena points should be distributed automatically, or by GM command -# Default: 0 (disable) (recommended): use gm command or sql query to distribute the points -# 1 (enable) arena points are distributed automatically -# -# Arena.AutoDistributeInterval -# How often should the distribution take place -# If automatic distribution is enabled in days -# Default: 7 (weekly) -# -# Arena.QueueAnnouncer.Enable -# Enable bg queue announcer posting to chat -# Default: 0 (disable) -# 1 (enable) -# -# Arena.ArenaSeason.ID -# Current area season id show in client -# Default: 1 -# -# Arena.ArenaSeason.InProgress -# Current area season state -# Default: 1 (active) -# 0 (finished) -# -################################################################################################################### - -Arena.MaxRatingDifference = 150 -Arena.RatingDiscardTimer = 600000 -Arena.AutoDistributePoints = 0 -Arena.AutoDistributeInterval = 7 -Arena.QueueAnnouncer.Enable = 0 -Arena.ArenaSeason.ID = 1 -Arena.ArenaSeason.InProgress = 1 - - -################################################################################################################### -# NETWORK CONFIG -# -# Network.Threads -# Number of threads for network, recommend 1 thread per 1000 connections. -# Default: 1 -# -# Network.OutKBuff -# The size of the output kernel buffer used ( SO_SNDBUF socket option, tcp manual ). -# Default: -1 (Use system default setting) -# -# Network.OutUBuff -# Userspace buffer for output. This is amount of memory reserved per each connection. -# Default: 65536 -# -# Network.TcpNoDelay: -# TCP Nagle algorithm setting -# Default: 0 (enable Nagle algorithm, less traffic, more latency) -# 1 (TCP_NO_DELAY, disable Nagle algorithm, more traffic but less latency) -# -################################################################################################################### - -Network.Threads = 1 -Network.OutKBuff = -1 -Network.OutUBuff = 65536 -Network.TcpNodelay = 1 - -################################################################################################################### -# AUCTION HOUSE BOT SETTINGS -# -# AuctionHouseBot.EnableSeller -# Enable/Disable the part of AHBot that puts items up for auction -# Default 0 (disabled) -# -# AuctionHouseBot.EnableBuyer -# Enable/Disable the part of AHBot that buys items from players -# Default 0 (disabled) -# -# Auction House Bot character data -# AuctionHouseBot.Account is the account number (in realmd->account table) of the player you want to run as the auction bot. -# AuctionHouseBot.GUID is the GUID (in characters->characters table) of the player you want to run as the auction bot. -# Default: 0 (Auction House Bot disabled) -# -# AuctionHouseBot.VendorItems -# Include items that can be bought from vendors. -# Default 0 -# -# AuctionHouseBot.LootItems -# Include items that can be looted or fished for. -# Default 1 -# -# AuctionHouseBot.OtherItems -# Include misc. items. -# Default 0 -# -# AuctionHouseBot.Bonding_types -# Indicates which bonding types to allow seller to put up for auction -# No_Bind -# Default 1 -# Bind_When_Picked_Up -# Default 0 -# Bind_When_Equipped -# Default 1 -# Bind_When_Use -# Default 1 -# Bind_Quest_Item -# Default 0 -# -# AuctionHouseBot.ItemsPerCycle -# Number of Items to Add/Remove from the AH during mass operations -# Default 200 -# -# AuctionHouseBot.UseBuyPriceForSeller -# Should the Seller use BuyPrice or SellPrice to determine Bid Prices -# Default 0 (use SellPrice) -# -# AuctionHouseBot.UseBuyPriceForBuyer -# Should the Buyer use BuyPrice or SellPrice to determine Bid Prices -# Default 0 (use SellPrice) -# -# All other settings have been moved to sql -# -################################################################################################################### - -AuctionHouseBot.EnableSeller = 0 -AuctionHouseBot.EnableBuyer = 0 -AuctionHouseBot.Account = 0 -AuctionHouseBot.GUID = 0 -AuctionHouseBot.VendorItems = 0 -AuctionHouseBot.LootItems = 1 -AuctionHouseBot.OtherItems = 0 -AuctionHouseBot.No_Bind = 1 -AuctionHouseBot.Bind_When_Picked_Up = 0 -AuctionHouseBot.Bind_When_Equipped = 1 -AuctionHouseBot.Bind_When_Use = 1 -AuctionHouseBot.Bind_Quest_Item = 0 -AuctionHouseBot.ItemsPerCycle = 200 -AuctionHouseBot.UseBuyPriceForSeller = 0 -AuctionHouseBot.UseBuyPriceForBuyer = 0 - -################################################################################################################### -# CONSOLE AND REMOTE ACCESS -# -# Console.Enable -# Enable console -# Default: 1 - on -# 0 - off -# -# Ra.Enable -# Enable remote console -# Default: 0 - off -# 1 - on -# -# Ra.IP -# Default remote console ip address, use 0.0.0.0 for every address -# -# Ra.Port -# Default remote console port -# -# Ra.MinLevel -# Minimum level that's required to login,3 by default -# -# Ra.Secure -# Kick client on wrong pass -# -################################################################################################################### - -Console.Enable = 1 -Ra.Enable = 0 -Ra.IP = 0.0.0.0 -Ra.Port = 3443 -Ra.MinLevel = 3 -Ra.Secure = 1 - -################################################################################################################### -# CUSTOM SERVER OPTIONS -# -# PlayerStart.AllReputation -# Players will start with most of the high level reputations that are needed for items, mounts etc. -# If there are any reputation faction you want to be added, just tell me. -# -# PlayerStart.AllSpells -# If enabled, players will start with all their class spells (not talents). Useful for instant 70 servers. -# You must import playercreateinfo_spell_custom.sql, it's included in the SQL folder. -# Default: 0 - off -# 1 - on -# -# PlayerStart.MapsExplored -# Players will start with all maps explored if enabled -# -# MusicInBattleground -# If enabled, "L70ETC - Power of the horde" will be played when BG starts ;) -# -# HonorPointsAfterDuel -# The amount of honor points the duel winner will get after a duel. -# Default: 0 - disable -# -# AlwaysMaxWeaponSkill -# Players will automatically gain max weapon/defense skill when logging in, leveling up etc. -# -# PvPToken.Enable -# Enable/disable PvP Token System. Players will get a token after slaying another player that gives honor. -# -# PvPToken.MapAllowType -# Where players can receive the pvp token -# 4 - In all maps -# 3 - In battlegrounds only -# 2 - In FFA areas only (gurubashi arena etc) -# 1 - In battlegrounds AND FFA areas only -# -# PvPToken.ItemID -# The item players will get after killing someone if PvP Token system is enabled. -# Default: 29434 - Badge of justice -# -# PvPToken.ItemCount -# Modify the item ID count - Default: 1 -# -# NoResetTalentsCost -# Enable or disable no cost when reseting talents -# -# ForbiddenMaps -# map ids that users below SEC_GAMEMASTER cannot enter, with delimiter ',' -# Default: "" -# example: "538,90" -# Note that it's HIGHLY DISCOURAGED to forbid starting maps (0, 1, 530)! -# -# ShowKickInWorld -# determines wether a message is broadcasted to the entire server when a player gets kicked -# Default: 0 -# 1 = Enable -# 0 = Disable -# -# RecordUpdateTimeDiffInterval -# record update time diff to the log file -# update diff can be used as a criterion of performance -# diff < 300: good performance -# diff > 600: bad performance, may be caused by high cpu usage -# Default: 60000 (diff is written into log every 60000 ms or 1 minute. -# >0 = Interval -# 0 = Disable -# -# MinRecordUpdateTimeDiff -# only record update time diff which is greater than this value -# -# PlayerStart.String -# If set to anything else than "", this string will be displayed to players when they login -# to a newly created character. -# Default: "" - send no text -# -################################################################################################################### - -PlayerStart.AllReputation = 0 -PlayerStart.AllSpells = 0 -PlayerStart.MapsExplored = 0 -MusicInBattleground = 0 -HonorPointsAfterDuel = 0 -AlwaysMaxWeaponSkill = 0 -PvPToken.Enable = 0 -PvPToken.MapAllowType = 4 -PvPToken.ItemID = 29434 -PvPToken.ItemCount = 1 -NoResetTalentsCost = 0 -ShowKickInWorld = 0 -RecordUpdateTimeDiffInterval = 60000 -MinRecordUpdateTimeDiff = 10 -PlayerStart.String = "" diff --git a/src/mangosd/resource.h b/src/mangosd/resource.h deleted file mode 100644 index 7e7d8e4b76f..00000000000 --- a/src/mangosd/resource.h +++ /dev/null @@ -1,15 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by TrinityCore.rc -// - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/realmd/AuthCodes.h b/src/realmd/AuthCodes.h deleted file mode 100644 index 9a38712af83..00000000000 --- a/src/realmd/AuthCodes.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** \file - \ingroup realmd -*/ - -#ifndef _AUTHCODES_H -#define _AUTHCODES_H - -enum eAuthResults -{ - REALM_AUTH_SUCCESS = 0x00, - REALM_AUTH_FAILURE = 0x01, ///< Unable to connect - REALM_AUTH_UNKNOWN1 = 0x02, ///< Unable to connect - REALM_AUTH_ACCOUNT_BANNED = 0x03, ///< This <game> account has been closed and is no longer available for use. Please go to <site>/banned.html for further information. - REALM_AUTH_NO_MATCH = 0x04, ///< The information you have entered is not valid. Please check the spelling of the account name and password. If you need help in retrieving a lost or stolen password, see <site> for more information - REALM_AUTH_UNKNOWN2 = 0x05, ///< The information you have entered is not valid. Please check the spelling of the account name and password. If you need help in retrieving a lost or stolen password, see <site> for more information - REALM_AUTH_ACCOUNT_IN_USE = 0x06, ///< This account is already logged into <game>. Please check the spelling and try again. - REALM_AUTH_PREPAID_TIME_LIMIT = 0x07, ///< You have used up your prepaid time for this account. Please purchase more to continue playing - REALM_AUTH_SERVER_FULL = 0x08, ///< Could not log in to <game> at this time. Please try again later. - REALM_AUTH_WRONG_BUILD_NUMBER = 0x09, ///< Unable to validate game version. This may be caused by file corruption or interference of another program. Please visit <site> for more information and possible solutions to this issue. - REALM_AUTH_UPDATE_CLIENT = 0x0a, ///< Downloading - REALM_AUTH_UNKNOWN3 = 0x0b, ///< Unable to connect - REALM_AUTH_ACCOUNT_FREEZED = 0x0c, ///< This <game> account has been temporarily suspended. Please go to <site>/banned.html for further information - REALM_AUTH_UNKNOWN4 = 0x0d, ///< Unable to connect - REALM_AUTH_UNKNOWN5 = 0x0e, ///< Connected. - REALM_AUTH_PARENTAL_CONTROL = 0x0f ///< Access to this account has been blocked by parental controls. Your settings may be changed in your account preferences at <site> -}; - -enum LoginResult -{ - LOGIN_OK = 0x00, - LOGIN_FAILED = 0x01, - LOGIN_FAILED2 = 0x02, - LOGIN_BANNED = 0x03, - LOGIN_UNKNOWN_ACCOUNT = 0x04, - LOGIN_UNKNOWN_ACCOUNT3 = 0x05, - LOGIN_ALREADYONLINE = 0x06, - LOGIN_NOTIME = 0x07, - LOGIN_DBBUSY = 0x08, - LOGIN_BADVERSION = 0x09, - LOGIN_DOWNLOAD_FILE = 0x0A, - LOGIN_FAILED3 = 0x0B, - LOGIN_SUSPENDED = 0x0C, - LOGIN_FAILED4 = 0x0D, - LOGIN_CONNECTED = 0x0E, - LOGIN_PARENTALCONTROL = 0x0F, - LOGIN_LOCKED_ENFORCED = 0x10, -}; - -// we need to stick to 1 version or half of the stuff will work for someone -// others will not and opposite -// will only support WoW, WoW:TBC and WoW:WotLK 3.0.9 client build 9551... - -#define EXPECTED_TRINITY_CLIENT_BUILD {9551, 0} - -#endif diff --git a/src/realmd/AuthSocket.cpp b/src/realmd/AuthSocket.cpp deleted file mode 100644 index c5c81593737..00000000000 --- a/src/realmd/AuthSocket.cpp +++ /dev/null @@ -1,1094 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** \file - \ingroup realmd -*/ - -#include "Common.h" -#include "Database/DatabaseEnv.h" -#include "ByteBuffer.h" -#include "Config/ConfigEnv.h" -#include "Log.h" -#include "RealmList.h" -#include "AuthSocket.h" -#include "AuthCodes.h" -#include <openssl/md5.h> -#include "Auth/Sha1.h" -//#include "Util.h" -- for commented utf8ToUpperOnlyLatin - -extern RealmList m_realmList; - -extern DatabaseType LoginDatabase; - -#define ChunkSize 2048 - -enum eAuthCmd -{ - //AUTH_NO_CMD = 0xFF, - AUTH_LOGON_CHALLENGE = 0x00, - AUTH_LOGON_PROOF = 0x01, - AUTH_RECONNECT_CHALLENGE = 0x02, - AUTH_RECONNECT_PROOF = 0x03, - //update srv =4 - REALM_LIST = 0x10, - XFER_INITIATE = 0x30, - XFER_DATA = 0x31, - XFER_ACCEPT = 0x32, - XFER_RESUME = 0x33, - XFER_CANCEL = 0x34 -}; - -enum eStatus -{ - STATUS_CONNECTED = 0, - STATUS_AUTHED -}; - -// GCC have alternative #pragma pack(N) syntax and old gcc version not support pack(push,N), also any gcc version not support it at some paltform -#if defined( __GNUC__ ) -#pragma pack(1) -#else -#pragma pack(push,1) -#endif - -typedef struct AUTH_LOGON_CHALLENGE_C -{ - uint8 cmd; - uint8 error; - uint16 size; - uint8 gamename[4]; - uint8 version1; - uint8 version2; - uint8 version3; - uint16 build; - uint8 platform[4]; - uint8 os[4]; - uint8 country[4]; - uint32 timezone_bias; - uint32 ip; - uint8 I_len; - uint8 I[1]; -} sAuthLogonChallenge_C; - -//typedef sAuthLogonChallenge_C sAuthReconnectChallenge_C; -/* -typedef struct -{ - uint8 cmd; - uint8 error; - uint8 unk2; - uint8 B[32]; - uint8 g_len; - uint8 g[1]; - uint8 N_len; - uint8 N[32]; - uint8 s[32]; - uint8 unk3[16]; -} sAuthLogonChallenge_S; -*/ - -typedef struct AUTH_LOGON_PROOF_C -{ - uint8 cmd; - uint8 A[32]; - uint8 M1[20]; - uint8 crc_hash[20]; - uint8 number_of_keys; - uint8 unk; // Added in 1.12.x client branch -} sAuthLogonProof_C; -/* -typedef struct -{ - uint16 unk1; - uint32 unk2; - uint8 unk3[4]; - uint16 unk4[20]; -} sAuthLogonProofKey_C; -*/ -typedef struct AUTH_LOGON_PROOF_S -{ - uint8 cmd; - uint8 error; - uint8 M2[20]; - uint32 unk1; - uint32 unk2; - uint16 unk3; -} sAuthLogonProof_S; - -typedef struct AUTH_RECONNECT_PROOF_C -{ - uint8 cmd; - uint8 R1[16]; - uint8 R2[20]; - uint8 R3[20]; - uint8 number_of_keys; -} sAuthReconnectProof_C; - -typedef struct XFER_INIT -{ - uint8 cmd; // XFER_INITIATE - uint8 fileNameLen; // strlen(fileName); - uint8 fileName[5]; // fileName[fileNameLen] - uint64 file_size; // file size (bytes) - uint8 md5[MD5_DIGEST_LENGTH]; // MD5 -}XFER_INIT; - -typedef struct XFER_DATA -{ - uint8 opcode; - uint16 data_size; - uint8 data[ChunkSize]; -}XFER_DATA_STRUCT; - -typedef struct AuthHandler -{ - eAuthCmd cmd; - uint32 status; - bool (AuthSocket::*handler)(void); -}AuthHandler; - -// GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some paltform -#if defined( __GNUC__ ) -#pragma pack() -#else -#pragma pack(pop) -#endif - -/// Launch a thread to transfer a patch to the client -class PatcherRunnable: public ZThread::Runnable -{ - public: - PatcherRunnable(class AuthSocket *); - void run(); - - private: - AuthSocket * mySocket; -}; - -typedef struct PATCH_INFO -{ - uint8 md5[MD5_DIGEST_LENGTH]; -}PATCH_INFO; - -/// Caches MD5 hash of client patches present on the server -class Patcher -{ - public: - typedef std::map<std::string, PATCH_INFO*> Patches; - ~Patcher(); - Patcher(); - Patches::const_iterator begin() const { return _patches.begin(); } - Patches::const_iterator end() const { return _patches.end(); } - void LoadPatchMD5(char*); - bool GetHash(char * pat,uint8 mymd5[16]); - - private: - void LoadPatchesInfo(); - Patches _patches; -}; - -const AuthHandler table[] = -{ - { AUTH_LOGON_CHALLENGE, STATUS_CONNECTED, &AuthSocket::_HandleLogonChallenge }, - { AUTH_LOGON_PROOF, STATUS_CONNECTED, &AuthSocket::_HandleLogonProof }, - { AUTH_RECONNECT_CHALLENGE, STATUS_CONNECTED, &AuthSocket::_HandleReconnectChallenge}, - { AUTH_RECONNECT_PROOF, STATUS_CONNECTED, &AuthSocket::_HandleReconnectProof }, - { REALM_LIST, STATUS_AUTHED, &AuthSocket::_HandleRealmList }, - { XFER_ACCEPT, STATUS_CONNECTED, &AuthSocket::_HandleXferAccept }, - { XFER_RESUME, STATUS_CONNECTED, &AuthSocket::_HandleXferResume }, - { XFER_CANCEL, STATUS_CONNECTED, &AuthSocket::_HandleXferCancel } -}; - -#define AUTH_TOTAL_COMMANDS sizeof(table)/sizeof(AuthHandler) - -///Holds the MD5 hash of client patches present on the server -Patcher PatchesCache; - -/// Constructor - set the N and g values for SRP6 -AuthSocket::AuthSocket(ISocketHandler &h) : TcpSocket(h) -{ - N.SetHexStr("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7"); - g.SetDword(7); - _authed = false; - pPatch = NULL; - - _accountSecurityLevel = SEC_PLAYER; -} - -/// Close patch file descriptor before leaving -AuthSocket::~AuthSocket() -{ - ZThread::Guard<ZThread::Mutex> g(patcherLock); - if(pPatch) - fclose(pPatch); -} - -/// Accept the connection and set the s random value for SRP6 -void AuthSocket::OnAccept() -{ - sLog.outBasic("Accepting connection from '%s:%d'", - GetRemoteAddress().c_str(), GetRemotePort()); - - s.SetRand(s_BYTE_SIZE * 8); -} - -/// Read the packet from the client -void AuthSocket::OnRead() -{ - ///- Read the packet - TcpSocket::OnRead(); - uint8 _cmd; - while (1) - { - if (!ibuf.GetLength()) - return; - - ///- Get the command out of it - ibuf.SoftRead((char *)&_cmd, 1); // UQ1: No longer exists in new net code ??? - //ibuf.Read((char *)&_cmd, 1); - /*char *command = (char *)malloc(1); - - ibuf.Read(command, 1); - - _cmd = (uint8)command;*/ - // assert(0); - size_t i; - - ///- Circle through known commands and call the correct command handler - for (i=0;i<AUTH_TOTAL_COMMANDS; i++) - { - if ((uint8)table[i].cmd == _cmd && - (table[i].status == STATUS_CONNECTED || - (_authed && table[i].status == STATUS_AUTHED))) - { - DEBUG_LOG("[Auth] got data for cmd %u ibuf length %u", (uint32)_cmd, ibuf.GetLength()); - - if (!(*this.*table[i].handler)()) - { - DEBUG_LOG("Command handler failed for cmd %u ibuf length %u", (uint32)_cmd, ibuf.GetLength()); - return; - } - break; - } - } - - ///- Report unknown commands in the debug log - if (i==AUTH_TOTAL_COMMANDS) - { - DEBUG_LOG("[Auth] got unknown packet %u", (uint32)_cmd); - return; - } - } -} - -/// Make the SRP6 calculation from hash in dB -void AuthSocket::_SetVSFields(const std::string& rI) -{ - BigNumber I; - I.SetHexStr(rI.c_str()); - - //In case of leading zeroes in the rI hash, restore them - uint8 mDigest[SHA_DIGEST_LENGTH]; - memset(mDigest,0,SHA_DIGEST_LENGTH); - if (I.GetNumBytes() <= SHA_DIGEST_LENGTH) - memcpy(mDigest,I.AsByteArray(),I.GetNumBytes()); - - std::reverse(mDigest,mDigest+SHA_DIGEST_LENGTH); - - Sha1Hash sha; - sha.UpdateData(s.AsByteArray(), s.GetNumBytes()); - sha.UpdateData(mDigest, SHA_DIGEST_LENGTH); - sha.Finalize(); - BigNumber x; - x.SetBinary(sha.GetDigest(), sha.GetLength()); - v = g.ModExp(x, N); - // No SQL injection (username escaped) - const char *v_hex, *s_hex; - v_hex = v.AsHexStr(); - s_hex = s.AsHexStr(); - LoginDatabase.PExecute("UPDATE account SET v = '%s', s = '%s' WHERE username = '%s'",v_hex,s_hex, _safelogin.c_str() ); - OPENSSL_free((void*)v_hex); - OPENSSL_free((void*)s_hex); -} - -/// Logon Challenge command handler -bool AuthSocket::_HandleLogonChallenge() -{ - DEBUG_LOG("Entering _HandleLogonChallenge"); - if (ibuf.GetLength() < sizeof(sAuthLogonChallenge_C)) - return false; - - ///- Read the first 4 bytes (header) to get the length of the remaining of the packet - std::vector<uint8> buf; - buf.resize(4); - - ibuf.Read((char *)&buf[0], 4); - - EndianConvert(*((uint16*)(buf[0]))); - uint16 remaining = ((sAuthLogonChallenge_C *)&buf[0])->size; - DEBUG_LOG("[AuthChallenge] got header, body is %#04x bytes", remaining); - - if ((remaining < sizeof(sAuthLogonChallenge_C) - buf.size()) || (ibuf.GetLength() < remaining)) - return false; - - //No big fear of memory outage (size is int16, i.e. < 65536) - buf.resize(remaining + buf.size() + 1); - buf[buf.size() - 1] = 0; - sAuthLogonChallenge_C *ch = (sAuthLogonChallenge_C*)&buf[0]; - - // BigEndian code, nop in little endian case - // size already converted - EndianConvert(*((uint32*)(&ch->gamename[0]))); - EndianConvert(ch->build); - EndianConvert(*((uint32*)(&ch->platform[0]))); - EndianConvert(*((uint32*)(&ch->os[0]))); - EndianConvert(*((uint32*)(&ch->country[0]))); - EndianConvert(ch->timezone_bias); - EndianConvert(ch->ip); - - ///- Read the remaining of the packet - ibuf.Read((char *)&buf[4], remaining); - DEBUG_LOG("[AuthChallenge] got full packet, %#04x bytes", ch->size); - DEBUG_LOG("[AuthChallenge] name(%d): '%s'", ch->I_len, ch->I); - - ByteBuffer pkt; - - _login = (const char*)ch->I; - _build = ch->build; - - ///- Normalize account name - //utf8ToUpperOnlyLatin(_login); -- client already send account in expected form - - //Escape the user login to avoid further SQL injection - //Memory will be freed on AuthSocket object destruction - _safelogin=_login; - LoginDatabase.escape_string(_safelogin); - - pkt << (uint8) AUTH_LOGON_CHALLENGE; - pkt << (uint8) 0x00; - - ///- Verify that this IP is not in the ip_banned table - // No SQL injection possible (paste the IP address as passed by the socket) - LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate"); - - std::string address = GetRemoteAddress(); - LoginDatabase.escape_string(address); - QueryResult *result = LoginDatabase.PQuery( "SELECT * FROM ip_banned WHERE ip = '%s'",address.c_str()); - if(result) - { - pkt << (uint8)REALM_AUTH_ACCOUNT_BANNED; - sLog.outBasic("[AuthChallenge] Banned ip %s tries to login!",GetRemoteAddress().c_str ()); - delete result; - } - else - { - ///- Get the account details from the account table - // No SQL injection (escaped user name) - - result = LoginDatabase.PQuery("SELECT sha_pass_hash,id,locked,last_ip,gmlevel FROM account WHERE username = '%s'",_safelogin.c_str ()); - if( result ) - { - ///- If the IP is 'locked', check that the player comes indeed from the correct IP address - bool locked = false; - if((*result)[2].GetUInt8() == 1) // if ip is locked - { - DEBUG_LOG("[AuthChallenge] Account '%s' is locked to IP - '%s'", _login.c_str(), (*result)[3].GetString()); - DEBUG_LOG("[AuthChallenge] Player address is '%s'", GetRemoteAddress().c_str()); - if ( strcmp((*result)[3].GetString(),GetRemoteAddress().c_str()) ) - { - DEBUG_LOG("[AuthChallenge] Account IP differs"); - pkt << (uint8) REALM_AUTH_ACCOUNT_FREEZED; - locked=true; - } - else - { - DEBUG_LOG("[AuthChallenge] Account IP matches"); - } - } - else - { - DEBUG_LOG("[AuthChallenge] Account '%s' is not locked to ip", _login.c_str()); - } - - if (!locked) - { - //set expired bans to inactive - LoginDatabase.Execute("UPDATE account_banned SET active = 0 WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate"); - ///- If the account is banned, reject the logon attempt - QueryResult *banresult = LoginDatabase.PQuery("SELECT bandate,unbandate FROM account_banned WHERE id = %u AND active = 1", (*result)[1].GetUInt32()); - if(banresult) - { - if((*banresult)[0].GetUInt64() == (*banresult)[1].GetUInt64()) - { - pkt << (uint8) REALM_AUTH_ACCOUNT_BANNED; - sLog.outBasic("[AuthChallenge] Banned account %s tries to login!",_login.c_str ()); - } - else - { - pkt << (uint8) REALM_AUTH_ACCOUNT_FREEZED; - sLog.outBasic("[AuthChallenge] Temporarily banned account %s tries to login!",_login.c_str ()); - } - - delete banresult; - } - else - { - ///- Get the password from the account table, upper it, and make the SRP6 calculation - std::string rI = (*result)[0].GetCppString(); - _SetVSFields(rI); - - b.SetRand(19 * 8); - BigNumber gmod=g.ModExp(b, N); - B = ((v * 3) + gmod) % N; - - ASSERT(gmod.GetNumBytes() <= 32); - - BigNumber unk3; - unk3.SetRand(16*8); - - ///- Fill the response packet with the result - pkt << (uint8)REALM_AUTH_SUCCESS; - - // B may be calculated < 32B so we force minnimal length to 32B - pkt.append(B.AsByteArray(32), 32); // 32 bytes - pkt << (uint8)1; - pkt.append(g.AsByteArray(), 1); - pkt << (uint8)32; - pkt.append(N.AsByteArray(), 32); - pkt.append(s.AsByteArray(), s.GetNumBytes()); // 32 bytes - pkt.append(unk3.AsByteArray(), 16); - pkt << (uint8)0; // Added in 1.12.x client branch - - uint8 secLevel = (*result)[4].GetUInt8(); - _accountSecurityLevel = secLevel <= SEC_ADMINISTRATOR ? AccountTypes(secLevel) : SEC_ADMINISTRATOR; - - _localizationName.resize(4); - for(int i = 0; i <4; ++i) - _localizationName[i] = ch->country[4-i-1]; - - sLog.outBasic("[AuthChallenge] account %s is using '%c%c%c%c' locale (%u)", _login.c_str (), ch->country[3],ch->country[2],ch->country[1],ch->country[0], GetLocaleByName(_localizationName)); - } - } - delete result; - } - else //no account - { - pkt<< (uint8) REALM_AUTH_NO_MATCH; - } - } - SendBuf((char const*)pkt.contents(), pkt.size()); - return true; -} - -/// Logon Proof command handler -bool AuthSocket::_HandleLogonProof() -{ - DEBUG_LOG("Entering _HandleLogonProof"); - ///- Read the packet - if (ibuf.GetLength() < sizeof(sAuthLogonProof_C)) - return false; - sAuthLogonProof_C lp; - ibuf.Read((char *)&lp, sizeof(sAuthLogonProof_C)); - - ///- Check if the client has one of the expected version numbers - bool valid_version=false; - int accepted_versions[]=EXPECTED_TRINITY_CLIENT_BUILD; - for(int i=0;accepted_versions[i];i++) - { - if(_build==accepted_versions[i]) - { - valid_version=true; - break; - } - } - - /// <ul><li> If the client has no valid version - if(!valid_version) - { - ///- Check if we have the apropriate patch on the disk - - // 24 = len("./patches/65535enGB.mpq")+1 - char tmp[24]; - // No buffer overflow (fixed length of arguments) - sprintf(tmp,"./patches/%d%s.mpq",_build, _localizationName.c_str()); - // This will be closed at the destruction of the AuthSocket (client deconnection) - FILE *pFile=fopen(tmp,"rb"); - - if(!pFile) - { - ByteBuffer pkt; - pkt << (uint8) AUTH_LOGON_CHALLENGE; - pkt << (uint8) 0x00; - pkt << (uint8) REALM_AUTH_WRONG_BUILD_NUMBER; - DEBUG_LOG("[AuthChallenge] %u is not a valid client version!", _build); - DEBUG_LOG("[AuthChallenge] Patch %s not found",tmp); - SendBuf((char const*)pkt.contents(), pkt.size()); - return true; - } - else // have patch - { - pPatch=pFile; - XFER_INIT xferh; - - ///- Get the MD5 hash of the patch file (get it from preloaded Patcher cache or calculate it) - if(PatchesCache.GetHash(tmp,(uint8*)&xferh.md5)) - { - DEBUG_LOG("\n[AuthChallenge] Found precached patch info for patch %s",tmp); - } - else - { //calculate patch md5 - printf("\n[AuthChallenge] Patch info for %s was not cached.",tmp); - PatchesCache.LoadPatchMD5(tmp); - PatchesCache.GetHash(tmp,(uint8*)&xferh.md5); - } - - ///- Send a packet to the client with the file length and MD5 hash - uint8 data[2]={AUTH_LOGON_PROOF,REALM_AUTH_UPDATE_CLIENT}; - SendBuf((const char*)data,sizeof(data)); - - memcpy(&xferh,"0\x05Patch",7); - xferh.cmd=XFER_INITIATE; - fseek(pPatch,0,SEEK_END); - xferh.file_size=ftell(pPatch); - - SendBuf((const char*)&xferh,sizeof(xferh)); - return true; - } - } - /// </ul> - - ///- Continue the SRP6 calculation based on data received from the client - BigNumber A; - A.SetBinary(lp.A, 32); - - Sha1Hash sha; - sha.UpdateBigNumbers(&A, &B, NULL); - sha.Finalize(); - BigNumber u; - u.SetBinary(sha.GetDigest(), 20); - BigNumber S = (A * (v.ModExp(u, N))).ModExp(b, N); - - uint8 t[32]; - uint8 t1[16]; - uint8 vK[40]; - memcpy(t, S.AsByteArray(), 32); - for (int i = 0; i < 16; i++) - { - t1[i] = t[i*2]; - } - sha.Initialize(); - sha.UpdateData(t1, 16); - sha.Finalize(); - for (int i = 0; i < 20; i++) - { - vK[i*2] = sha.GetDigest()[i]; - } - for (int i = 0; i < 16; i++) - { - t1[i] = t[i*2+1]; - } - sha.Initialize(); - sha.UpdateData(t1, 16); - sha.Finalize(); - for (int i = 0; i < 20; i++) - { - vK[i*2+1] = sha.GetDigest()[i]; - } - K.SetBinary(vK, 40); - - uint8 hash[20]; - - sha.Initialize(); - sha.UpdateBigNumbers(&N, NULL); - sha.Finalize(); - memcpy(hash, sha.GetDigest(), 20); - sha.Initialize(); - sha.UpdateBigNumbers(&g, NULL); - sha.Finalize(); - for (int i = 0; i < 20; i++) - { - hash[i] ^= sha.GetDigest()[i]; - } - BigNumber t3; - t3.SetBinary(hash, 20); - - sha.Initialize(); - sha.UpdateData(_login); - sha.Finalize(); - uint8 t4[SHA_DIGEST_LENGTH]; - memcpy(t4, sha.GetDigest(), SHA_DIGEST_LENGTH); - - sha.Initialize(); - sha.UpdateBigNumbers(&t3, NULL); - sha.UpdateData(t4, SHA_DIGEST_LENGTH); - sha.UpdateBigNumbers(&s, &A, &B, &K, NULL); - sha.Finalize(); - BigNumber M; - M.SetBinary(sha.GetDigest(), 20); - - ///- Check if SRP6 results match (password is correct), else send an error - if (!memcmp(M.AsByteArray(), lp.M1, 20)) - { - sLog.outBasic("User '%s' successfully authenticated", _login.c_str()); - - ///- Update the sessionkey, last_ip, last login time and reset number of failed logins in the account table for this account - // No SQL injection (escaped user name) and IP address as received by socket - const char* K_hex = K.AsHexStr(); - LoginDatabase.PExecute("UPDATE account SET sessionkey = '%s', last_ip = '%s', last_login = NOW(), locale = '%u', failed_logins = 0 WHERE username = '%s'", K_hex, GetRemoteAddress().c_str(), GetLocaleByName(_localizationName), _safelogin.c_str() ); - OPENSSL_free((void*)K_hex); - - ///- Finish SRP6 and send the final result to the client - sha.Initialize(); - sha.UpdateBigNumbers(&A, &M, &K, NULL); - sha.Finalize(); - - sAuthLogonProof_S proof; - memcpy(proof.M2, sha.GetDigest(), 20); - proof.cmd = AUTH_LOGON_PROOF; - proof.error = 0; - proof.unk1 = 0x00800000; - proof.unk2 = 0x00; - proof.unk3 = 0x00; - - SendBuf((char *)&proof, sizeof(proof)); - - ///- Set _authed to true! - _authed = true; - } - else - { - char data[4]={AUTH_LOGON_PROOF,REALM_AUTH_NO_MATCH,3,0}; - SendBuf(data,sizeof(data)); - sLog.outBasic("[AuthChallenge] account %s tried to login with wrong password!",_login.c_str ()); - - uint32 MaxWrongPassCount = sConfig.GetIntDefault("WrongPass.MaxCount", 0); - if(MaxWrongPassCount > 0) - { - //Increment number of failed logins by one and if it reaches the limit temporarily ban that account or IP - LoginDatabase.PExecute("UPDATE account SET failed_logins = failed_logins + 1 WHERE username = '%s'",_safelogin.c_str()); - - if(QueryResult *loginfail = LoginDatabase.PQuery("SELECT id, failed_logins FROM account WHERE username = '%s'", _safelogin.c_str())) - { - Field* fields = loginfail->Fetch(); - uint32 failed_logins = fields[1].GetUInt32(); - - if( failed_logins >= MaxWrongPassCount ) - { - uint32 WrongPassBanTime = sConfig.GetIntDefault("WrongPass.BanTime", 600); - bool WrongPassBanType = sConfig.GetBoolDefault("WrongPass.BanType", false); - - if(WrongPassBanType) - { - uint32 acc_id = fields[0].GetUInt32(); - LoginDatabase.PExecute("INSERT INTO account_banned VALUES ('%u',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','Trinity realmd','Failed login autoban',1)", - acc_id, WrongPassBanTime); - sLog.outBasic("[AuthChallenge] account %s got banned for '%u' seconds because it failed to authenticate '%u' times", - _login.c_str(), WrongPassBanTime, failed_logins); - } - else - { - std::string current_ip = GetRemoteAddress(); - LoginDatabase.escape_string(current_ip); - LoginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','Trinity realmd','Failed login autoban')", - current_ip.c_str(), WrongPassBanTime); - sLog.outBasic("[AuthChallenge] IP %s got banned for '%u' seconds because account %s failed to authenticate '%u' times", - current_ip.c_str(), WrongPassBanTime, _login.c_str(), failed_logins); - } - } - delete loginfail; - } - } - } - return true; -} - -/// Reconnect Challenge command handler -bool AuthSocket::_HandleReconnectChallenge() -{ - DEBUG_LOG("Entering _HandleReconnectChallenge"); - if (ibuf.GetLength() < sizeof(sAuthLogonChallenge_C)) - return false; - - ///- Read the first 4 bytes (header) to get the length of the remaining of the packet - std::vector<uint8> buf; - buf.resize(4); - - ibuf.Read((char *)&buf[0], 4); - - EndianConvert(*((uint16*)(buf[0]))); - uint16 remaining = ((sAuthLogonChallenge_C *)&buf[0])->size; - DEBUG_LOG("[ReconnectChallenge] got header, body is %#04x bytes", remaining); - - if ((remaining < sizeof(sAuthLogonChallenge_C) - buf.size()) || (ibuf.GetLength() < remaining)) - return false; - - //No big fear of memory outage (size is int16, i.e. < 65536) - buf.resize(remaining + buf.size() + 1); - buf[buf.size() - 1] = 0; - sAuthLogonChallenge_C *ch = (sAuthLogonChallenge_C*)&buf[0]; - - ///- Read the remaining of the packet - ibuf.Read((char *)&buf[4], remaining); - DEBUG_LOG("[ReconnectChallenge] got full packet, %#04x bytes", ch->size); - DEBUG_LOG("[ReconnectChallenge] name(%d): '%s'", ch->I_len, ch->I); - - _login = (const char*)ch->I; - _safelogin = _login; - - QueryResult *result = LoginDatabase.PQuery ("SELECT sessionkey FROM account WHERE username = '%s'", _safelogin.c_str ()); - - // Stop if the account is not found - if (!result) - { - sLog.outError("[ERROR] user %s tried to login and we cannot find his session key in the database.", _login.c_str()); - SetCloseAndDelete(); - return false; - } - - Field* fields = result->Fetch (); - K.SetHexStr (fields[0].GetString ()); - delete result; - - ///- Sending response - ByteBuffer pkt; - pkt << (uint8) AUTH_RECONNECT_CHALLENGE; - pkt << (uint8) 0x00; - _reconnectProof.SetRand(16*8); - pkt.append(_reconnectProof.AsByteBuffer()); // 16 bytes random - pkt << (uint64) 0x00 << (uint64) 0x00; // 16 bytes zeros - SendBuf((char const*)pkt.contents(), pkt.size()); - return true; -} - -/// Reconnect Proof command handler -bool AuthSocket::_HandleReconnectProof() -{ - DEBUG_LOG("Entering _HandleReconnectProof"); - ///- Read the packet - if (ibuf.GetLength() < sizeof(sAuthReconnectProof_C)) - return false; - if (_login.empty() || !_reconnectProof.GetNumBytes() || !K.GetNumBytes()) - return false; - sAuthReconnectProof_C lp; - ibuf.Read((char *)&lp, sizeof(sAuthReconnectProof_C)); - - BigNumber t1; - t1.SetBinary(lp.R1, 16); - - Sha1Hash sha; - sha.Initialize(); - sha.UpdateData(_login); - sha.UpdateBigNumbers(&t1, &_reconnectProof, &K, NULL); - sha.Finalize(); - - if (!memcmp(sha.GetDigest(), lp.R2, SHA_DIGEST_LENGTH)) - { - ///- Sending response - ByteBuffer pkt; - pkt << (uint8) AUTH_RECONNECT_PROOF; - pkt << (uint8) 0x00; - pkt << (uint16) 0x00; // 2 bytes zeros - SendBuf((char const*)pkt.contents(), pkt.size()); - - ///- Set _authed to true! - _authed = true; - - return true; - } - else - { - sLog.outError("[ERROR] user %s tried to login, but session invalid.", _login.c_str()); - SetCloseAndDelete(); - return false; - } -} - -/// %Realm List command handler -bool AuthSocket::_HandleRealmList() -{ - DEBUG_LOG("Entering _HandleRealmList"); - if (ibuf.GetLength() < 5) - return false; - - ibuf.Remove(5); - - ///- Get the user id (else close the connection) - // No SQL injection (escaped user name) - - QueryResult *result = LoginDatabase.PQuery("SELECT id,sha_pass_hash FROM account WHERE username = '%s'",_safelogin.c_str()); - if(!result) - { - sLog.outError("[ERROR] user %s tried to login and we cannot find him in the database.",_login.c_str()); - SetCloseAndDelete(); - return false; - } - - uint32 id = (*result)[0].GetUInt32(); - std::string rI = (*result)[1].GetCppString(); - delete result; - - ///- Update realm list if need - m_realmList.UpdateIfNeed(); - - ///- Circle through realms in the RealmList and construct the return packet (including # of user characters in each realm) - ByteBuffer pkt; - pkt << (uint32) 0; - pkt << (uint16) m_realmList.size(); - RealmList::RealmMap::const_iterator i; - for( i = m_realmList.begin(); i != m_realmList.end(); i++ ) - { - uint8 AmountOfCharacters; - - // No SQL injection. id of realm is controlled by the database. - result = LoginDatabase.PQuery( "SELECT numchars FROM realmcharacters WHERE realmid = '%d' AND acctid='%u'",i->second.m_ID,id); - if( result ) - { - Field *fields = result->Fetch(); - AmountOfCharacters = fields[0].GetUInt8(); - delete result; - } - else - AmountOfCharacters = 0; - - uint8 lock = (i->second.allowedSecurityLevel > _accountSecurityLevel) ? 1 : 0; - - pkt << i->second.icon; // realm type - pkt << lock; // if 1, then realm locked - pkt << i->second.color; // if 2, then realm is offline - pkt << i->first; - pkt << i->second.address; - pkt << i->second.populationLevel; - pkt << AmountOfCharacters; - pkt << i->second.timezone; // realm category - pkt << (uint8) 0x2C; // unk, may be realm number/id? - } - pkt << (uint8) 0x10; - pkt << (uint8) 0x00; - - ByteBuffer hdr; - hdr << (uint8) REALM_LIST; - hdr << (uint16)pkt.size(); - hdr.append(pkt); - - SendBuf((char const*)hdr.contents(), hdr.size()); - - // Set check field before possible relogin to realm - _SetVSFields(rI); - return true; -} - -/// Resume patch transfer -bool AuthSocket::_HandleXferResume() -{ - DEBUG_LOG("Entering _HandleXferResume"); - ///- Check packet length and patch existence - if (ibuf.GetLength()<9 || !pPatch) - { - sLog.outError("Error while resuming patch transfer (wrong packet)"); - return false; - } - - ///- Launch a PatcherRunnable thread starting at given patch file offset - uint64 start; - ibuf.Remove(1); - ibuf.Read((char*)&start,sizeof(start)); - fseek(pPatch,start,0); - - ZThread::Thread u(new PatcherRunnable(this)); - return true; -} - -/// Cancel patch transfer -bool AuthSocket::_HandleXferCancel() -{ - DEBUG_LOG("Entering _HandleXferCancel"); - - ///- Close and delete the socket - ibuf.Remove(1); //clear input buffer - - //ZThread::Thread::sleep(15); - SetCloseAndDelete(); - - return true; -} - -/// Accept patch transfer -bool AuthSocket::_HandleXferAccept() -{ - DEBUG_LOG("Entering _HandleXferAccept"); - - ///- Check packet length and patch existence - if (!pPatch) - { - sLog.outError("Error while accepting patch transfer (wrong packet)"); - return false; - } - - ///- Launch a PatcherRunnable thread, starting at the begining of the patch file - ibuf.Remove(1); //clear input buffer - fseek(pPatch,0,0); - - ZThread::Thread u(new PatcherRunnable(this)); - - return true; -} - -/// Check if there is lag on the connection to the client -bool AuthSocket::IsLag() -{ - return (TCP_BUFSIZE_READ-GetOutputLength()< 2*ChunkSize); -} - -PatcherRunnable::PatcherRunnable(class AuthSocket * as) -{ - mySocket=as; -} - -/// Send content of patch file to the client -void PatcherRunnable::run() -{ - ZThread::Guard<ZThread::Mutex> g(mySocket->patcherLock); - XFER_DATA_STRUCT xfdata; - xfdata.opcode = XFER_DATA; - - while(!feof(mySocket->pPatch) && mySocket->Ready()) - { - ///- Wait until output buffer is reasonably empty - while(mySocket->Ready() && mySocket->IsLag()) - { - ZThread::Thread::sleep(1); - } - ///- And send content of the patch file to the client - xfdata.data_size=fread(&xfdata.data,1,ChunkSize,mySocket->pPatch); - mySocket->SendBuf((const char*)&xfdata,xfdata.data_size +(sizeof(XFER_DATA_STRUCT)-ChunkSize)); - } -} - -/// Preload MD5 hashes of existing patch files on server -#ifndef _WIN32 -#include <dirent.h> -#include <errno.h> -void Patcher::LoadPatchesInfo() -{ - DIR * dirp; - //int errno; - struct dirent * dp; - dirp = opendir("./patches/"); - if(!dirp) - return; - while (dirp) - { - errno = 0; - if ((dp = readdir(dirp)) != NULL) - { - int l=strlen(dp->d_name); - if(l<8)continue; - if(!memcmp(&dp->d_name[l-4],".mpq",4)) - LoadPatchMD5(dp->d_name); - } - else - { - if(errno != 0) - { - closedir(dirp); - return; - } - break; - } - } - - if(dirp) - closedir(dirp); -} - -#else -void Patcher::LoadPatchesInfo() -{ - WIN32_FIND_DATA fil; - HANDLE hFil=FindFirstFile("./patches/*.mpq",&fil); - if(hFil==INVALID_HANDLE_VALUE) - return; //no patches were found - - do - { - LoadPatchMD5(fil.cFileName); - } - while(FindNextFile(hFil,&fil)); -} -#endif - -/// Calculate and store MD5 hash for a given patch file -void Patcher::LoadPatchMD5(char * szFileName) -{ - ///- Try to open the patch file - std::string path = "./patches/"; - path += szFileName; - FILE * pPatch=fopen(path.c_str(),"rb"); - sLog.outDebug("Loading patch info from %s\n",path.c_str()); - if(!pPatch) - { - sLog.outError("Error loading patch %s\n",path.c_str()); - return; - } - - ///- Calculate the MD5 hash - MD5_CTX ctx; - MD5_Init(&ctx); - uint8* buf = new uint8[512*1024]; - - while (!feof(pPatch)) - { - size_t read = fread(buf, 1, 512*1024, pPatch); - MD5_Update(&ctx, buf, read); - } - delete [] buf; - fclose(pPatch); - - ///- Store the result in the internal patch hash map - _patches[path] = new PATCH_INFO; - MD5_Final((uint8 *)&_patches[path]->md5 , &ctx); -} - -/// Get cached MD5 hash for a given patch file -bool Patcher::GetHash(char * pat,uint8 mymd5[16]) -{ - for( Patches::iterator i = _patches.begin(); i != _patches.end(); i++ ) - if(!stricmp(pat,i->first.c_str () )) - { - memcpy(mymd5,i->second->md5,16); - return true; - } - - return false; -} - -/// Launch the patch hashing mechanism on object creation -Patcher::Patcher() -{ - LoadPatchesInfo(); -} - -/// Empty and delete the patch map on termination -Patcher::~Patcher() -{ - for(Patches::iterator i = _patches.begin(); i != _patches.end(); i++ ) - delete i->second; -} diff --git a/src/realmd/AuthSocket.h b/src/realmd/AuthSocket.h deleted file mode 100644 index 3cae54c7789..00000000000 --- a/src/realmd/AuthSocket.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/// \addtogroup realmd -/// @{ -/// \file - -#ifndef _AUTHSOCKET_H -#define _AUTHSOCKET_H - -#include "Common.h" -#include "Auth/BigNumber.h" -#include "sockets/TcpSocket.h" -#include "sockets/SocketHandler.h" -#include "sockets/ListenSocket.h" -#include "sockets/Utility.h" -#include "sockets/Parse.h" -#include "sockets/Socket.h" -#include "zthread/Mutex.h" - -/// Handle login commands -class AuthSocket: public TcpSocket -{ - public: - const static int s_BYTE_SIZE = 32; - - AuthSocket(ISocketHandler& h); - ~AuthSocket(); - - void OnAccept(); - void OnRead(); - - bool _HandleLogonChallenge(); - bool _HandleLogonProof(); - bool _HandleReconnectChallenge(); - bool _HandleReconnectProof(); - bool _HandleRealmList(); - //data transfer handle for patch - - bool _HandleXferResume(); - bool _HandleXferCancel(); - bool _HandleXferAccept(); - - void _SetVSFields(const std::string& rI); - - FILE *pPatch; - ZThread::Mutex patcherLock; - bool IsLag(); - - private: - - BigNumber N, s, g, v; - BigNumber b, B; - BigNumber K; - BigNumber _reconnectProof; - - bool _authed; - - std::string _login; - std::string _safelogin; - - // Since GetLocaleByName() is _NOT_ bijective, we have to store the locale as a string. Otherwise we can't differ - // between enUS and enGB, which is important for the patch system - std::string _localizationName; - uint16 _build; - AccountTypes _accountSecurityLevel; -}; -#endif -/// @} diff --git a/src/realmd/CMakeLists.txt b/src/realmd/CMakeLists.txt deleted file mode 100644 index ab03c3143a5..00000000000 --- a/src/realmd/CMakeLists.txt +++ /dev/null @@ -1,45 +0,0 @@ -########### next target ############### - -SET(trinity-realm_SRCS -AuthCodes.h -AuthSocket.cpp -AuthSocket.h -Main.cpp -RealmList.cpp -RealmList.h -) - -add_executable(trinity-realm ${trinity-realm_SRCS}) -add_definitions( --D_TRINITY_REALM_CONFIG='"${CONF_DIR}/trinityrealm.conf"' -) -IF (DO_MYSQL) - #SET_TARGET_PROPERTIES(mangos-realmd PROPERTIES LINK_FLAGS ${MYSQL_LIBS}) - SET_TARGET_PROPERTIES(trinity-realm PROPERTIES LINK_FLAGS "-pthread") -ENDIF(DO_MYSQL) -IF (DO_POSTGRE) - SET_TARGET_PROPERTIES(trinity-realmd PROPERTIES LINK_FLAGS ${POSTGRE_LIBS}) -ENDIF(DO_POSTGRE) - - -target_link_libraries( -trinity-realm -shared -trinityframework -trinitysockets -trinitydatabase -trinityauth -trinityconfig -ZThread -zlib -${SSLLIB} -${MYSQL_LIBRARIES} -) - -install(TARGETS trinity-realm DESTINATION bin) - - -########### install files ############### - -install(FILES realmd.conf.dist.in DESTINATION etc) - diff --git a/src/realmd/Main.cpp b/src/realmd/Main.cpp deleted file mode 100644 index bd318779f83..00000000000 --- a/src/realmd/Main.cpp +++ /dev/null @@ -1,364 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/// \addtogroup realmd Realm Daemon -/// @{ -/// \file - -#include "Common.h" -#include "Database/DatabaseEnv.h" -#include "RealmList.h" - -#include "Config/ConfigEnv.h" -#include "Log.h" -#include "sockets/ListenSocket.h" -#include "AuthSocket.h" -#include "SystemConfig.h" -#include "Util.h" - -// Format is YYYYMMDDRR where RR is the change in the conf file -// for that day. -#ifndef _REALMDCONFVERSION -# define _REALMDCONFVERSION 2007062001 -#endif - -#ifndef _TRINITY_REALM_CONFIG -# define _TRINITY_REALM_CONFIG "TrinityRealm.conf" -#endif //_TRINITY_REALM_CONFIG - -#ifdef WIN32 -#include "ServiceWin32.h" -char serviceName[] = "TrinityRealm"; -char serviceLongName[] = "Trinity realm service"; -char serviceDescription[] = "Massive Network Game Object Server"; -/* - * -1 - not in service mode - * 0 - stopped - * 1 - running - * 2 - paused - */ -int m_ServiceStatus = -1; -#endif - -bool StartDB(); -void UnhookSignals(); -void HookSignals(); - -bool stopEvent = false; ///< Setting it to true stops the server -RealmList m_realmList; ///< Holds the list of realms for this server - -DatabaseType LoginDatabase; ///< Accessor to the realm server database - -/// Print out the usage string for this program on the console. -void usage(const char *prog) -{ - sLog.outString("Usage: \n %s [<options>]\n" - " -c config_file use config_file as configuration file\n\r" - #ifdef WIN32 - " Running as service functions:\n\r" - " --service run as service\n\r" - " -s install install service\n\r" - " -s uninstall uninstall service\n\r" - #endif - ,prog); -} - -/// Launch the realm server -extern int main(int argc, char **argv) -{ - ///- Command line parsing to get the configuration file name - char const* cfg_file = _TRINITY_REALM_CONFIG; - int c=1; - while( c < argc ) - { - if( strcmp(argv[c],"-c") == 0) - { - if( ++c >= argc ) - { - sLog.outError("Runtime-Error: -c option requires an input argument"); - usage(argv[0]); - return 1; - } - else - cfg_file = argv[c]; - } - - #ifdef WIN32 - //////////// - //Services// - //////////// - if( strcmp(argv[c],"-s") == 0) - { - if( ++c >= argc ) - { - sLog.outError("Runtime-Error: -s option requires an input argument"); - usage(argv[0]); - return 1; - } - if( strcmp(argv[c],"install") == 0) - { - if (WinServiceInstall()) - sLog.outString("Installing service"); - return 1; - } - else if( strcmp(argv[c],"uninstall") == 0) - { - if(WinServiceUninstall()) - sLog.outString("Uninstalling service"); - return 1; - } - else - { - sLog.outError("Runtime-Error: unsupported option %s",argv[c]); - usage(argv[0]); - return 1; - } - } - if( strcmp(argv[c],"--service") == 0) - { - WinServiceRun(); - } - //// - #endif - ++c; - } - - if (!sConfig.SetSource(cfg_file)) - { - sLog.outError("Could not find configuration file %s.", cfg_file); - return 1; - } - sLog.outString("Using configuration file %s.", cfg_file); - - ///- Check the version of the configuration file - uint32 confVersion = sConfig.GetIntDefault("ConfVersion", 0); - if (confVersion < _REALMDCONFVERSION) - { - sLog.outError("*****************************************************************************"); - sLog.outError(" WARNING: Your trinityrealm.conf version indicates your conf file is out of date!"); - sLog.outError(" Please check for updates, as your current default values may cause"); - sLog.outError(" strange behavior."); - sLog.outError("*****************************************************************************"); - clock_t pause = 3000 + clock(); - - while (pause > clock()) {} - } - - sLog.outString( "%s (realm-daemon)", _FULLVERSION ); - sLog.outString( "<Ctrl-C> to stop.\n" ); - - /// realmd PID file creation - std::string pidfile = sConfig.GetStringDefault("PidFile", ""); - if(!pidfile.empty()) - { - uint32 pid = CreatePIDFile(pidfile); - if( !pid ) - { - sLog.outError( "Cannot create PID file %s.\n", pidfile.c_str() ); - return 1; - } - - sLog.outString( "Daemon PID: %u\n", pid ); - } - - ///- Initialize the database connection - if(!StartDB()) - return 1; - - ///- Initialize the log database - if(sConfig.GetBoolDefault("EnableLogDB", false)) - { - // everything successful - set var to enable DB logging once startup finished. - sLog.SetLogDBLater(true); - // ensure we've set realm to 0 (realmd realmid) - sLog.SetRealmID(0); - } - - ///- Get the list of realms for the server - m_realmList.Initialize(sConfig.GetIntDefault("RealmsStateUpdateDelay", 20)); - if (m_realmList.size() == 0) - { - sLog.outError("No valid realms specified."); - return 1; - } - - ///- Launch the listening network socket - port_t rmport = sConfig.GetIntDefault( "RealmServerPort", DEFAULT_REALMSERVER_PORT ); - std::string bind_ip = sConfig.GetStringDefault("BindIP", "0.0.0.0"); - - SocketHandler h; - ListenSocket<AuthSocket> authListenSocket(h); - if ( authListenSocket.Bind(bind_ip.c_str(),rmport)) - { - sLog.outError( "Trinity realm can not bind to %s:%d",bind_ip.c_str(), rmport ); - return 1; - } - - h.Add(&authListenSocket); - - ///- Catch termination signals - HookSignals(); - - ///- Handle affinity for multiple processors and process priority on Windows - #ifdef WIN32 - { - HANDLE hProcess = GetCurrentProcess(); - - uint32 Aff = sConfig.GetIntDefault("UseProcessors", 0); - if(Aff > 0) - { - ULONG_PTR appAff; - ULONG_PTR sysAff; - - if(GetProcessAffinityMask(hProcess,&appAff,&sysAff)) - { - ULONG_PTR curAff = Aff & appAff; // remove non accessible processors - - if(!curAff ) - { - sLog.outError("Processors marked in UseProcessors bitmask (hex) %x not accessible for realmd. Accessible processors bitmask (hex): %x",Aff,appAff); - } - else - { - if(SetProcessAffinityMask(hProcess,curAff)) - sLog.outString("Using processors (bitmask, hex): %x", curAff); - else - sLog.outError("Can't set used processors (hex): %x", curAff); - } - } - sLog.outString(""); - } - - bool Prio = sConfig.GetBoolDefault("ProcessPriority", false); - - if(Prio) - { - if(SetPriorityClass(hProcess,HIGH_PRIORITY_CLASS)) - sLog.outString("TrinityRealm process priority class set to HIGH"); - else - sLog.outError("ERROR: Can't set realmd process priority class."); - sLog.outString(""); - } - } - #endif - - // maximum counter for next ping - uint32 numLoops = (sConfig.GetIntDefault( "MaxPingTime", 30 ) * (MINUTE * 1000000 / 100000)); - uint32 loopCounter = 0; - - // possibly enable db logging; avoid massive startup spam by doing it here. - if (sLog.GetLogDBLater()) - { - sLog.outString("Enabling database logging..."); - sLog.SetLogDBLater(false); - // login db needs thread for logging - sLog.SetLogDB(true); - } - - ///- Wait for termination signal - while (!stopEvent) - { - - h.Select(0, 100000); - - if( (++loopCounter) == numLoops ) - { - loopCounter = 0; - sLog.outDetail("Ping MySQL to keep connection alive"); - delete LoginDatabase.Query("SELECT 1 FROM realmlist LIMIT 1"); - } -#ifdef WIN32 - if (m_ServiceStatus == 0) stopEvent = true; - while (m_ServiceStatus == 2) Sleep(1000); -#endif - } - - ///- Wait for the delay thread to exit - LoginDatabase.ThreadEnd(); - LoginDatabase.HaltDelayThread(); - - ///- Remove signal handling before leaving - UnhookSignals(); - - sLog.outString( "Halting process..." ); - return 0; -} - -/// Handle termination signals -/** Put the global variable stopEvent to 'true' if a termination signal is caught **/ -void OnSignal(int s) -{ - switch (s) - { - case SIGINT: - case SIGTERM: - stopEvent = true; - break; - #ifdef _WIN32 - case SIGBREAK: - stopEvent = true; - break; - #endif - } - - signal(s, OnSignal); -} - -/// Initialize connection to the database -bool StartDB() -{ - std::string dbstring = sConfig.GetStringDefault("LoginDatabaseInfo", ""); - if(dbstring.empty()) - { - sLog.outError("Database not specified"); - return false; - } - - if(!LoginDatabase.Initialize(dbstring.c_str())) - { - sLog.outError("Cannot connect to database"); - return false; - } - LoginDatabase.ThreadStart(); - - return true; -} - -/// Define hook 'OnSignal' for all termination signals -void HookSignals() -{ - signal(SIGINT, OnSignal); - signal(SIGTERM, OnSignal); - #ifdef _WIN32 - signal(SIGBREAK, OnSignal); - #endif -} - -/// Unhook the signals before leaving -void UnhookSignals() -{ - signal(SIGINT, 0); - signal(SIGTERM, 0); - #ifdef _WIN32 - signal(SIGBREAK, 0); - #endif -} - -/// @} diff --git a/src/realmd/RealmList.cpp b/src/realmd/RealmList.cpp deleted file mode 100644 index 936f7bcd703..00000000000 --- a/src/realmd/RealmList.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/** \file - \ingroup realmd -*/ - -#include "Common.h" -#include "RealmList.h" -#include "Policies/SingletonImp.h" -#include "Database/DatabaseEnv.h" - -INSTANTIATE_SINGLETON_1( RealmList ); - -extern DatabaseType LoginDatabase; - -RealmList::RealmList( ) : m_UpdateInterval(0), m_NextUpdateTime(time(NULL)) -{ -} - -/// Load the realm list from the database -void RealmList::Initialize(uint32 updateInterval) -{ - m_UpdateInterval = updateInterval; - - ///- Get the content of the realmlist table in the database - UpdateRealms(true); -} - -void RealmList::UpdateRealm( uint32 ID, const std::string& name, const std::string& address, uint32 port, uint8 icon, uint8 color, uint8 timezone, AccountTypes allowedSecurityLevel, float popu) -{ - ///- Create new if not exist or update existed - Realm& realm = m_realms[name]; - - realm.m_ID = ID; - realm.icon = icon; - realm.color = color; - realm.timezone = timezone; - realm.allowedSecurityLevel = allowedSecurityLevel; - realm.populationLevel = popu; - - ///- Append port to IP address. - std::ostringstream ss; - ss << address << ":" << port; - realm.address = ss.str(); -} - -void RealmList::UpdateIfNeed() -{ - // maybe disabled or updated recently - if(!m_UpdateInterval || m_NextUpdateTime > time(NULL)) - return; - - m_NextUpdateTime = time(NULL) + m_UpdateInterval; - - // Clears Realm list - m_realms.clear(); - - // Get the content of the realmlist table in the database - UpdateRealms(false); -} - -void RealmList::UpdateRealms(bool init) -{ - sLog.outDetail("Updating Realm List..."); - - QueryResult *result = LoginDatabase.Query( "SELECT id, name, address, port, icon, color, timezone, allowedSecurityLevel, population FROM realmlist WHERE color <> 3 ORDER BY name" ); - - ///- Circle through results and add them to the realm map - if(result) - { - do - { - Field *fields = result->Fetch(); - - uint8 allowedSecurityLevel = fields[7].GetUInt8(); - - UpdateRealm(fields[0].GetUInt32(), fields[1].GetCppString(),fields[2].GetCppString(),fields[3].GetUInt32(),fields[4].GetUInt8(), fields[5].GetUInt8(), fields[6].GetUInt8(), (allowedSecurityLevel <= SEC_ADMINISTRATOR ? AccountTypes(allowedSecurityLevel) : SEC_ADMINISTRATOR), fields[8].GetFloat() ); - if(init) - sLog.outString("Added realm \"%s\".", fields[1].GetString()); - } while( result->NextRow() ); - delete result; - } -} diff --git a/src/realmd/RealmList.h b/src/realmd/RealmList.h deleted file mode 100644 index b830a0827a7..00000000000 --- a/src/realmd/RealmList.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/// \addtogroup realmd -/// @{ -/// \file - -#ifndef _REALMLIST_H -#define _REALMLIST_H - -#include "Common.h" - -/// Storage object for a realm -struct Realm -{ - std::string address; - uint8 icon; - uint8 color; - uint8 timezone; - uint32 m_ID; - AccountTypes allowedSecurityLevel; - float populationLevel; -}; - -/// Storage object for the list of realms on the server -class RealmList -{ - public: - typedef std::map<std::string, Realm> RealmMap; - - RealmList(); - ~RealmList() {} - - void Initialize(uint32 updateInterval); - - void UpdateIfNeed(); - - RealmMap::const_iterator begin() const { return m_realms.begin(); } - RealmMap::const_iterator end() const { return m_realms.end(); } - uint32 size() const { return m_realms.size(); } - private: - void UpdateRealms(bool init); - void UpdateRealm( uint32 ID, const std::string& name, const std::string& address, uint32 port, uint8 icon, uint8 color, uint8 timezone, AccountTypes allowedSecurityLevel, float popu); - private: - RealmMap m_realms; ///< Internal map of realms - uint32 m_UpdateInterval; - time_t m_NextUpdateTime; -}; -#endif -/// @} diff --git a/src/realmd/resource.h b/src/realmd/resource.h deleted file mode 100644 index 7e7d8e4b76f..00000000000 --- a/src/realmd/resource.h +++ /dev/null @@ -1,15 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by TrinityCore.rc -// - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/shared/revision.h b/src/shared/revision.h new file mode 100644 index 00000000000..a669ec642ea --- /dev/null +++ b/src/shared/revision.h @@ -0,0 +1,7 @@ +#ifndef __REVISION_H__ +#define __REVISION_H__ + #define _REVISION "2040" + #define _HASH "4fae080e5446" + #define _REVISION_DATE "*" + #define _REVISION_TIME "*" +#endif // __REVISION_H__ diff --git a/src/trinitycore/CliRunnable.cpp b/src/trinitycore/CliRunnable.cpp index e256128ed90..4a681e0ed03 100644 --- a/src/trinitycore/CliRunnable.cpp +++ b/src/trinitycore/CliRunnable.cpp @@ -82,19 +82,10 @@ bool ChatHandler::HandleAccountDeleteCommand(const char* args) } /// Commands not recommended call from chat, but support anyway - if(m_session) - { - uint32 targetSecurity = accmgr.GetSecurity(account_id); - - /// can delete only for account with less security - /// This is also reject self apply in fact - if (targetSecurity >= m_session->GetSecurity()) - { - SendSysMessage (LANG_YOURS_SECURITY_IS_LOW); - SetSentErrorMessage (true); - return false; - } - } + /// can delete only for account with less security + /// This is also reject self apply in fact + if(HasLowerSecurityAccount (NULL,account_id,true)) + return false; AccountOpResult result = accmgr.DeleteAccount(account_id); switch(result) @@ -318,7 +309,7 @@ void CliRunnable::run() char commandbuf[256]; ///- Display the list of available CLI functions then beep - sLog.outString(); + sLog.outString(""); if(sConfig.GetBoolDefault("BeepAtStart", true)) printf("\a"); // \a = Alert @@ -373,4 +364,3 @@ void CliRunnable::run() ///- End the database thread WorldDatabase.ThreadEnd(); // free mySQL thread resources } - diff --git a/src/trinitycore/CliRunnable.h b/src/trinitycore/CliRunnable.h index ea60ef695bc..e5f78bb5259 100644 --- a/src/trinitycore/CliRunnable.h +++ b/src/trinitycore/CliRunnable.h @@ -1,7 +1,7 @@ -/* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> +/* + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,4 +33,3 @@ class CliRunnable : public ZThread::Runnable }; #endif /// @} - diff --git a/src/trinitycore/Main.cpp b/src/trinitycore/Main.cpp index 43783dc24ee..2225961aedb 100644 --- a/src/trinitycore/Main.cpp +++ b/src/trinitycore/Main.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> @@ -21,8 +21,6 @@ /// \addtogroup Trinityd Trinity Daemon /// @{ /// \file -#include "SystemConfig.h" -#include "revision.h" #include "Common.h" #include "Database/DatabaseEnv.h" @@ -31,18 +29,18 @@ #include "Master.h" #ifndef _TRINITY_CORE_CONFIG -# define _TRINITY_CORE_CONFIG "trinitycore.conf" +# define _TRINITY_CORE_CONFIG "TrinityCore.conf" #endif //_TRINITY_CORE_CONFIG // Format is YYYYMMDDRR where RR is the change in the conf file // for that day. #ifndef _TRINITY_CORE_CONFVER -# define _TRINITY_CORE_CONFVER 2008022901 +# define _TRINITY_CORE_CONFVER 2009010301 #endif //_TRINITY_CORE_CONFVER #ifdef WIN32 #include "ServiceWin32.h" -char serviceName[] = "Trinityd"; +char serviceName[] = "TrinityCore"; char serviceLongName[] = "Trinity core service"; char serviceDescription[] = "Massive Network Game Object Server"; /* @@ -64,7 +62,6 @@ uint32 realmID; ///< Id of the realm void usage(const char *prog) { sLog.outString("Usage: \n %s [<options>]\n" - " --version print version and exit\n\r" " -c config_file use config_file as configuration file\n\r" #ifdef WIN32 " Running as service functions:\n\r" @@ -95,12 +92,6 @@ extern int main(int argc, char **argv) cfg_file = argv[c]; } - if( strcmp(argv[c],"--version") == 0) - { - printf("%s\n", _FULLVERSION); - return 0; - } - #ifdef WIN32 //////////// //Services// @@ -147,7 +138,7 @@ extern int main(int argc, char **argv) return 1; } sLog.outString("Using configuration file %s.", cfg_file); - + uint32 confVersion = sConfig.GetIntDefault("ConfVersion", 0); if (confVersion < _TRINITY_CORE_CONFVER) { @@ -172,4 +163,3 @@ extern int main(int argc, char **argv) } /// @} - diff --git a/src/mangosd/Makefile.am b/src/trinitycore/Makefile.am index 7e1cd086d3c..7e1cd086d3c 100644 --- a/src/mangosd/Makefile.am +++ b/src/trinitycore/Makefile.am diff --git a/src/trinitycore/Master.cpp b/src/trinitycore/Master.cpp index 557124ca5e0..cf1ac0f2c27 100644 --- a/src/trinitycore/Master.cpp +++ b/src/trinitycore/Master.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> @@ -118,72 +118,74 @@ public: class RARunnable : public ZThread::Runnable { public: - uint32 numLoops, loopCounter; - - RARunnable () - { - uint32 socketSelecttime = sWorld.getConfig (CONFIG_SOCKET_SELECTTIME); - numLoops = (sConfig.GetIntDefault ("MaxPingTime", 30) * (MINUTE * 1000000 / socketSelecttime)); - loopCounter = 0; - } - - void - checkping () - { - // ping if need - if ((++loopCounter) == numLoops) - { + uint32 numLoops, loopCounter; + + RARunnable () + { + uint32 socketSelecttime = sWorld.getConfig (CONFIG_SOCKET_SELECTTIME); + numLoops = (sConfig.GetIntDefault ("MaxPingTime", 30) * (MINUTE * 1000000 / socketSelecttime)); loopCounter = 0; - sLog.outDetail ("Ping MySQL to keep connection alive"); - delete WorldDatabase.Query ("SELECT 1 FROM command LIMIT 1"); - delete LoginDatabase.Query ("SELECT 1 FROM realmlist LIMIT 1"); - delete CharacterDatabase.Query ("SELECT 1 FROM bugreport LIMIT 1"); - } - } - - void - run (void) - { - SocketHandler h; - - // Launch the RA listener socket - ListenSocket<RASocket> RAListenSocket (h); - bool usera = sConfig.GetBoolDefault ("Ra.Enable", false); - - if (usera) - { - port_t raport = sConfig.GetIntDefault ("Ra.Port", 3443); - std::string stringip = sConfig.GetStringDefault ("Ra.IP", "0.0.0.0"); - ipaddr_t raip; - if (!Utility::u2ip (stringip, raip)) - sLog.outError ("Trinity RA can not bind to ip %s", stringip.c_str ()); - else if (RAListenSocket.Bind (raip, raport)) - sLog.outError ("Trinity RA can not bind to port %d on %s", raport, stringip.c_str ()); - else - { - h.Add (&RAListenSocket); + } + + void checkping () + { + // ping if need + if ((++loopCounter) == numLoops) + { + loopCounter = 0; + sLog.outDetail ("Ping MySQL to keep connection alive"); + delete WorldDatabase.Query ("SELECT 1 FROM command LIMIT 1"); + delete LoginDatabase.Query ("SELECT 1 FROM realmlist LIMIT 1"); + delete CharacterDatabase.Query ("SELECT 1 FROM bugreport LIMIT 1"); + } + } - sLog.outString ("Starting Remote access listner on port %d on %s", raport, stringip.c_str ()); - } - } + void run () + { + SocketHandler h; + + // Launch the RA listener socket + ListenSocket<RASocket> RAListenSocket (h); + bool usera = sConfig.GetBoolDefault ("Ra.Enable", false); + + if (usera) + { + port_t raport = sConfig.GetIntDefault ("Ra.Port", 3443); + std::string stringip = sConfig.GetStringDefault ("Ra.IP", "0.0.0.0"); + ipaddr_t raip; + if (!Utility::u2ip (stringip, raip)) + sLog.outError ("MaNGOS RA can not bind to ip %s", stringip.c_str ()); + else if (RAListenSocket.Bind (raip, raport)) + sLog.outError ("MaNGOS RA can not bind to port %d on %s", raport, stringip.c_str ()); + else + { + h.Add (&RAListenSocket); + + sLog.outString ("Starting Remote access listner on port %d on %s", raport, stringip.c_str ()); + } + } - // Socket Selet time is in microseconds , not miliseconds!! - uint32 socketSelecttime = sWorld.getConfig (CONFIG_SOCKET_SELECTTIME); + // Socket Selet time is in microseconds , not miliseconds!! + uint32 socketSelecttime = sWorld.getConfig (CONFIG_SOCKET_SELECTTIME); - // if use ra spend time waiting for io, if not use ra ,just sleep - if (usera) - while (!World::IsStopped()) + // if use ra spend time waiting for io, if not use ra ,just sleep + if (usera) { - h.Select (0, socketSelecttime); - checkping (); + while (!World::IsStopped()) + { + h.Select (0, socketSelecttime); + checkping (); + } } - else - while (!World::IsStopped()) + else { - ZThread::Thread::sleep (static_cast<unsigned long> (socketSelecttime / 1000)); - checkping (); + while (!World::IsStopped()) + { + ZThread::Thread::sleep (static_cast<unsigned long> (socketSelecttime / 1000)); + checkping (); + } } - } + } }; Master::Master() @@ -200,15 +202,15 @@ int Master::Run() sLog.outString( "%s (core-daemon)", _FULLVERSION ); sLog.outString( "<Ctrl-C> to stop.\n" ); - sLog.outTitle( " ______ __"); - sLog.outTitle( "/\\__ _\\ __ __/\\ \\__"); - sLog.outTitle( "\\/_/\\ \\/ _ __ /\\_\\ ___ /\\_\\ \\ ,_\\ __ __"); - sLog.outTitle( " \\ \\ \\/\\`'__\\/\\ \\ /' _ `\\/\\ \\ \\ \\/ /\\ \\/\\ \\"); - sLog.outTitle( " \\ \\ \\ \\ \\/ \\ \\ \\/\\ \\/\\ \\ \\ \\ \\ \\_\\ \\ \\_\\ \\"); - sLog.outTitle( " \\ \\_\\ \\_\\ \\ \\_\\ \\_\\ \\_\\ \\_\\ \\__\\\\/`____ \\"); - sLog.outTitle( " \\/_/\\/_/ \\/_/\\/_/\\/_/\\/_/\\/__/ `/___/> \\"); - sLog.outTitle( " C O R E /\\___/"); - sLog.outTitle( "http://TrinityCore.org \\/__/\n"); + sLog.outString( " ______ __"); + sLog.outString( "/\\__ _\\ __ __/\\ \\__"); + sLog.outString( "\\/_/\\ \\/ _ __ /\\_\\ ___ /\\_\\ \\ ,_\\ __ __"); + sLog.outString( " \\ \\ \\/\\`'__\\/\\ \\ /' _ `\\/\\ \\ \\ \\/ /\\ \\/\\ \\"); + sLog.outString( " \\ \\ \\ \\ \\/ \\ \\ \\/\\ \\/\\ \\ \\ \\ \\ \\_\\ \\ \\_\\ \\"); + sLog.outString( " \\ \\_\\ \\_\\ \\ \\_\\ \\_\\ \\_\\ \\_\\ \\__\\\\/`____ \\"); + sLog.outString( " \\/_/\\/_/ \\/_/\\/_/\\/_/\\/_/\\/__/ `/___/> \\"); + sLog.outString( " C O R E /\\___/"); + sLog.outString( "http://TrinityCore.org \\/__/\n"); /// worldd PID file creation std::string pidfile = sConfig.GetStringDefault("PidFile", ""); @@ -280,7 +282,7 @@ int Master::Run() sLog.outError("Can't set used processors (hex): %x",curAff); } } - sLog.outString(); + sLog.outString(""); } bool Prio = sConfig.GetBoolDefault("ProcessPriority", false); @@ -292,7 +294,7 @@ int Master::Run() sLog.outString("TrinityCore process priority class set to HIGH"); else sLog.outError("ERROR: Can't set Trinityd process priority class."); - sLog.outString(); + sLog.outString(""); } } #endif @@ -317,14 +319,14 @@ int Master::Run() } ///- Launch the world listener socket - port_t wsport = sWorld.getConfig (CONFIG_PORT_WORLD); - std::string bind_ip = sConfig.GetStringDefault ("BindIP", "0.0.0.0"); + port_t wsport = sWorld.getConfig (CONFIG_PORT_WORLD); + std::string bind_ip = sConfig.GetStringDefault ("BindIP", "0.0.0.0"); - if (sWorldSocketMgr->StartNetwork (wsport, bind_ip.c_str ()) == -1) + if (sWorldSocketMgr->StartNetwork (wsport, bind_ip.c_str ()) == -1) { - sLog.outError ("Failed to start network"); - World::StopNow(ERROR_EXIT_CODE); - // go down and shutdown the server + sLog.outError ("Failed to start network"); + World::StopNow(ERROR_EXIT_CODE); + // go down and shutdown the server } sWorldSocketMgr->Wait (); @@ -401,14 +403,15 @@ int Master::Run() /// Initialize connection to the databases bool Master::_StartDB() { - ///- Get world database info from configuration file std::string dbstring; - if(!sConfig.GetString("WorldDatabaseInfo", &dbstring)) + + ///- Get world database info from configuration file + dbstring = sConfig.GetStringDefault("WorldDatabaseInfo", ""); + if(dbstring.empty()) { sLog.outError("Database not specified in configuration file"); return false; } - sLog.outDetail("World Database: %s", dbstring.c_str()); ///- Initialise the world database if(!WorldDatabase.Initialize(dbstring.c_str())) @@ -417,12 +420,13 @@ bool Master::_StartDB() return false; } - if(!sConfig.GetString("CharacterDatabaseInfo", &dbstring)) + ///- Get character database info from configuration file + dbstring = sConfig.GetStringDefault("CharacterDatabaseInfo", ""); + if(dbstring.empty()) { sLog.outError("Character Database not specified in configuration file"); return false; } - sLog.outDetail("Character Database: %s", dbstring.c_str()); ///- Initialise the Character database if(!CharacterDatabase.Initialize(dbstring.c_str())) @@ -432,14 +436,14 @@ bool Master::_StartDB() } ///- Get login database info from configuration file - if(!sConfig.GetString("LoginDatabaseInfo", &dbstring)) + dbstring = sConfig.GetStringDefault("LoginDatabaseInfo", ""); + if(dbstring.empty()) { sLog.outError("Login database not specified in configuration file"); return false; } ///- Initialise the login database - sLog.outDetail("Login Database: %s", dbstring.c_str() ); if(!LoginDatabase.Initialize(dbstring.c_str())) { sLog.outError("Cannot connect to login database %s",dbstring.c_str()); @@ -455,12 +459,17 @@ bool Master::_StartDB() } sLog.outString("Realm running as realm ID %d", realmID); + ///- Initialize the DB logging system + if(sConfig.GetBoolDefault("EnableLogDB", false)) + { + // everything successful - set var to enable DB logging once startup finished. + sLog.SetLogDBLater(true); + sLog.SetRealmID(realmID); + } + ///- Clean the database before starting clearOnlineAccounts(); - ///- Insert version info into DB - WorldDatabase.PExecute("UPDATE `version` SET `core_version` = '%s', `core_revision` = '%s'", _FULLVERSION, _REVISION); - sWorld.LoadDBVersion(); sLog.outString("Using %s", sWorld.GetDBVersion()); @@ -476,8 +485,10 @@ void Master::clearOnlineAccounts() "UPDATE account SET online = 0 WHERE online > 0 " "AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = '%d')",realmID); - CharacterDatabase.Execute("UPDATE characters SET online = 0 WHERE online<>0"); + + // Battleground instance ids reset at server restart + CharacterDatabase.Execute("UPDATE characters SET bgid = 0 WHERE bgid<>0"); } /// Handle termination signals @@ -518,4 +529,3 @@ void Master::_UnhookSignals() signal(SIGBREAK, 0); #endif } - diff --git a/src/trinitycore/Master.h b/src/trinitycore/Master.h index 456202594f6..3b2b38f32f4 100644 --- a/src/trinitycore/Master.h +++ b/src/trinitycore/Master.h @@ -1,7 +1,7 @@ -/* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> +/* + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,4 +50,3 @@ class Master #define sMaster Trinity::Singleton<Master>::Instance() #endif /// @} - diff --git a/src/trinitycore/RASocket.cpp b/src/trinitycore/RASocket.cpp index 48749b09ceb..370340859d3 100644 --- a/src/trinitycore/RASocket.cpp +++ b/src/trinitycore/RASocket.cpp @@ -69,7 +69,7 @@ RASocket::~RASocket() ///- Delete buffer and decrease active admins count delete [] buff; - sLog.outRALog("Connection was closed.\n"); + sLog.outRemote("Connection was closed.\n"); if(stage==OK) iUsers--; @@ -79,7 +79,7 @@ RASocket::~RASocket() void RASocket::OnAccept() { std::string ss=GetRemoteAddress(); - sLog.outRALog("Incoming connection from %s.\n",ss.c_str()); + sLog.outRemote("Incoming connection from %s.\n",ss.c_str()); ///- If there is already an active admin, drop the connection if(iUsers) dropclient @@ -97,7 +97,7 @@ void RASocket::OnRead() unsigned int sz=ibuf.GetLength(); if(iInputLength+sz>=RA_BUFF_SIZE) { - sLog.outRALog("Input buffer overflow, possible DOS attack.\n"); + sLog.outRemote("Input buffer overflow, possible DOS attack.\n"); SetCloseAndDelete(); return; } @@ -160,7 +160,7 @@ void RASocket::OnRead() if(!result) { Sendf("-No such user.\r\n"); - sLog.outRALog("User %s does not exist.\n",szLogin.c_str()); + sLog.outRemote("User %s does not exist.\n",szLogin.c_str()); if(bSecure)SetCloseAndDelete(); } else @@ -173,7 +173,7 @@ void RASocket::OnRead() if(fields[0].GetUInt32()<iMinLevel) { Sendf("-Not enough privileges.\r\n"); - sLog.outRALog("User %s has no privilege.\n",szLogin.c_str()); + sLog.outRemote("User %s has no privilege.\n",szLogin.c_str()); if(bSecure)SetCloseAndDelete(); } else { @@ -208,14 +208,14 @@ void RASocket::OnRead() ++iUsers; Sendf("+Logged in.\r\n"); - sLog.outRALog("User %s has logged in.\n",szLogin.c_str()); + sLog.outRemote("User %s has logged in.\n",szLogin.c_str()); Sendf("TC>"); } else { ///- Else deny access Sendf("-Wrong pass.\r\n"); - sLog.outRALog("User %s has failed to log in.\n",szLogin.c_str()); + sLog.outRemote("User %s has failed to log in.\n",szLogin.c_str()); if(bSecure)SetCloseAndDelete(); } } @@ -224,7 +224,7 @@ void RASocket::OnRead() case OK: if(strlen(buff)) { - sLog.outRALog("Got '%s' cmd.\n",buff); + sLog.outRemote("Got '%s' cmd.\n",buff); sWorld.QueueCliCommand(&RASocket::zprint , buff); } else @@ -257,4 +257,3 @@ void RASocket::zprint( const char * szText ) #endif } - diff --git a/src/trinitycore/RASocket.h b/src/trinitycore/RASocket.h index 145afd52c60..8900e689b2c 100644 --- a/src/trinitycore/RASocket.h +++ b/src/trinitycore/RASocket.h @@ -1,7 +1,7 @@ /* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -65,4 +65,3 @@ class RASocket: public TcpSocket }; #endif /// @} - diff --git a/src/mangosd/TrinityCore.ico b/src/trinitycore/TrinityCore.ico Binary files differindex 6f0a5721957..6f0a5721957 100644 --- a/src/mangosd/TrinityCore.ico +++ b/src/trinitycore/TrinityCore.ico diff --git a/src/trinitycore/WorldRunnable.cpp b/src/trinitycore/WorldRunnable.cpp index b29e1434a64..607b60684a9 100644 --- a/src/trinitycore/WorldRunnable.cpp +++ b/src/trinitycore/WorldRunnable.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> @@ -29,13 +29,19 @@ #include "Timer.h" #include "ObjectAccessor.h" #include "MapManager.h" +#include "BattleGroundMgr.h" #include "Database/DatabaseEnv.h" -#if (defined(SHORT_SLEEP) || defined(WIN32)) +#ifdef WIN32 #define WORLD_SLEEP_CONST 50 #else -#define WORLD_SLEEP_CONST 100 //Is this still needed?? [On linux some time ago not working 50ms] +#define WORLD_SLEEP_CONST 100 //Is this still needed?? [On linux some time ago not working 50ms] +#endif + +#ifdef WIN32 +#include "ServiceWin32.h" +extern int m_ServiceStatus; #endif /// Heartbeat for the World @@ -43,6 +49,8 @@ void WorldRunnable::run() { ///- Init new SQL thread for the world database WorldDatabase.ThreadStart(); // let thread do safe mySQL requests (one connection call enough) + CharacterDatabase.ThreadStart(); + LoginDatabase.ThreadStart(); sWorld.InitResultQueue(); uint32 realCurrTime = 0; @@ -72,16 +80,25 @@ void WorldRunnable::run() } else prevSleepTime = 0; + + #ifdef WIN32 + if (m_ServiceStatus == 0) World::StopNow(SHUTDOWN_EXIT_CODE); + while (m_ServiceStatus == 2) Sleep(1000); + #endif } sWorld.KickAll(); // save and kick all players sWorld.UpdateSessions( 1 ); // real players unload required UpdateSessions call + // unload battleground templates before different singletons destroyed + sBattleGroundMgr.DeleteAllBattleGrounds(); + sWorldSocketMgr->StopNetwork(); MapManager::Instance().UnloadAll(); // unload all grids (including locked in memory) ///- End the database thread WorldDatabase.ThreadEnd(); // free mySQL thread resources + CharacterDatabase.ThreadStart(); + LoginDatabase.ThreadEnd(); } - diff --git a/src/trinitycore/WorldRunnable.h b/src/trinitycore/WorldRunnable.h index b84e5b6a04c..b967d0dac0b 100644 --- a/src/trinitycore/WorldRunnable.h +++ b/src/trinitycore/WorldRunnable.h @@ -1,7 +1,7 @@ -/* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> +/* + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,4 +33,3 @@ class WorldRunnable : public ZThread::Runnable }; #endif /// @} - diff --git a/src/mangosd/mangosd.rc b/src/trinitycore/mangosd.rc index 0acad1e4ba2..0acad1e4ba2 100644 --- a/src/mangosd/mangosd.rc +++ b/src/trinitycore/mangosd.rc diff --git a/src/mangosd/monitor-mangosd b/src/trinitycore/monitor-mangosd index a740ae5e8fa..a740ae5e8fa 100644 --- a/src/mangosd/monitor-mangosd +++ b/src/trinitycore/monitor-mangosd diff --git a/src/trinitycore/resource.h b/src/trinitycore/resource.h index fbc730320b4..7e7d8e4b76f 100644 --- a/src/trinitycore/resource.h +++ b/src/trinitycore/resource.h @@ -4,7 +4,7 @@ // // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 @@ -13,4 +13,3 @@ #define _APS_NEXT_SYMED_VALUE 101 #endif #endif - diff --git a/src/mangosd/run-mangosd b/src/trinitycore/run-mangosd index f307bd9e1ad..f307bd9e1ad 100644 --- a/src/mangosd/run-mangosd +++ b/src/trinitycore/run-mangosd diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist index 552e87f34bf..7ec8265d87a 100644 --- a/src/trinitycore/trinitycore.conf.dist +++ b/src/trinitycore/trinitycore.conf.dist @@ -1,7 +1,7 @@ ########################################## # Trinity Core worldd configuration file # ########################################## -ConfVersion=2009010301 +ConfVersion=2008080101 ################################################################################################################### # CONNECTIONS AND DIRECTORIES @@ -25,11 +25,15 @@ ConfVersion=2009010301 # WorldDatabaseInfo # CharacterDatabaseInfo # Database connection settings for the world server. -# Default: hostname;port;username;password;database -# .;somenumber;username;password;database - use named pipes at Windows -# Named pipes: mySQL required adding "enable-named-pipe" to [mysqld] section my.ini -# .;/path/to/unix_socket;username;password;database - use Unix sockets at Unix/Linux -# Unix sockets: experimental, not tested +# Default: +# ---MYSQL--- +# hostname;port;username;password;database +# .;somenumber;username;password;database - use named pipes at Windows +# Named pipes: mySQL required adding "enable-named-pipe" to [mysqld] section my.ini +# .;/path/to/unix_socket;username;password;database - use Unix sockets at Unix/Linux +# ---PGSQL--- +# hostname;port;username;password;database +# .;/path/to/unix_socket/DIRECTORY or . for default path;username;password;database - use Unix sockets at Unix/Linux # # MaxPingTime # Settings for maximum database-ping interval (minutes between pings) @@ -109,7 +113,7 @@ EAIErrorLevel = 2 # # SocketSelectTime # Socket select time (in milliseconds) -# Default: 10000 +# Default: 10000 (10 secs) # # GridCleanUpDelay # Grid clean up delay (in milliseconds) @@ -127,15 +131,11 @@ EAIErrorLevel = 2 # Player save interval (in milliseconds) # Default: 900000 (15 min) # -# DisconnectToleranceInterval -# Tolerance for disconnected players before putting in the queue. (in seconds) -# Default: 0 (disabled) -# # vmap.enableLOS # vmap.enableHeight # Enable/Disable VMmap support for line of sight and height calculation -# Default: 1 (true) -# 0 (false) +# Default: 0 (disable) +# 1 (enable) # # vmap.ignoreMapIds # Map id that will be ignored by VMaps @@ -188,7 +188,6 @@ GridCleanUpDelay = 300000 MapUpdateInterval = 100 ChangeWeatherInterval = 600000 PlayerSaveInterval = 900000 -DisconnectToleranceInterval = 0 vmap.enableLOS = 0 vmap.enableHeight = 0 vmap.ignoreMapIds = "369" @@ -216,14 +215,9 @@ AddonChannel = 1 # # LogLevel # Server console level of logging -# 0 = Minimum; 1 = Basic&Error; 2 = Detail; 3 = Full/Debug +# 0 = Minimum; 1 = Basic; 2 = Detail; 3 = Full/Debug # Default: 3 # -# LogTime -# Include time in server console output [hh:mm:ss] -# Default: 0 (no time) -# 1 (print time) -# # LogFile # Logfile name # Default: "Server.log" @@ -236,11 +230,12 @@ AddonChannel = 1 # # LogFileLevel # Server file level of logging -# 0 = Minimum; 1 = Error; 2 = Detail; 3 = Full/Debug +# 0 = Minimum; 1 = Basic; 2 = Detail; 3 = Full/Debug # Default: 0 # -# LogFilter_TransportMoves +# LogFilter_AchievementUpdates # LogFilter_CreatureMoves +# LogFilter_TransportMoves # LogFilter_VisibilityChanges # Log filters # Default: 1 - not include with any log level @@ -294,23 +289,53 @@ AddonChannel = 1 # "" - Empty name for disable # # LogColors -# Color for messages (format "normal_color details_color debug_color error_color") +# Color for messages (format "normal error basic detail debug") # Colors: 0 - BLACK, 1 - RED, 2 - GREEN, 3 - BROWN, 4 - BLUE, 5 - MAGENTA, 6 - CYAN, 7 - GREY, # 8 - YELLOW, 9 - LRED, 10 - LGREEN, 11 - LBLUE, 12 - LMAGENTA, 13 - LCYAN, 14 - WHITE # Default: "" - none colors -# Example: "13 7 11 9" +# Example: "13 7 11 9 5" +# +# EnableLogDB +# Enable/disable logging to database (LogDatabaseInfo). +# Default: 0 - disabled +# 1 - enabled +# +# DBLogLevel +# Log level of DB logging. +# 0 = Minimum; 1 = Basic; 2 = Detail; 3 = Full/Debug +# Default: 3 +# +# LogDB.Char +# Enable/disable logging character outputs to DB. +# Default: 0 - off +# 1 - on +# +# LogDB.GM +# Enable/disable logging GM commands to DB. +# Default: 0 - off +# 1 - on +# +# LogDB.RA +# Enable/disable logging remote access events to DB. +# Default: 0 - off +# 1 - on +# +# LogDB.World +# Enable/disable logging world packets to DB. +# Default: 0 - off +# 1 - on (very heavy) # ################################################################################################################### LogSQL = 1 PidFile = "" LogLevel = 1 -LogTime = 0 LogFile = "Server.log" LogTimestamp = 0 LogFileLevel = 0 -LogFilter_TransportMoves = 1 +LogFilter_AchievementUpdates = 1 LogFilter_CreatureMoves = 1 +LogFilter_TransportMoves = 1 LogFilter_VisibilityChanges = 1 WorldLogFile = "" DBErrorLogFile = "db_errors.log" @@ -322,6 +347,12 @@ GmLogTimestamp = 0 GmLogPerAccount = 0 RaLogFile = "ra_commands.log" LogColors = "" +EnableLogDB = 0 +DBLogLevel = 1 +LogDB.Char = 0 +LogDB.GM = 0 +LogDB.RA = 0 +LogDB.World = 0 ################################################################################################################### # SERVER SETTINGS @@ -367,9 +398,9 @@ LogColors = "" # # Expansion # Allow server use content from expansion -# 2 - check expansion 2 maps existence, and if client support expansion 2 and account have +# Default: 2 - check expansion 2 maps existence, and if client support expansion 2 and account have # expansion 2 setting then allow visit expansion 2 maps, allow create new class character) -# Default: 1 - check expansion 1 maps existence, and if client support expansion 1 and account have +# 1 - check expansion 1 maps existence, and if client support expansion 1 and account have # expansion 1 setting then allow visit expansion 1 maps, allow create new races character) # 0 - not check expansion maps existence, not allow wisit its, not allow create new race or new class # characters, ignore account expansion setting) @@ -433,6 +464,18 @@ LogColors = "" # Default: 10 (client limitation) # The number must be between 1 and 10 # +# HeroicCharactersPerRealm +# Limit numbers of heroic class characters for account at realm +# Default: 1 +# The number must be between 0 (not allowed) and 10 +# +# MinLevelForHeroicCharacterCreating +# Limit creating heroic characters only for account with another character of specific level (ignored for GM accounts) +# 0 - not require any existed chaarcter +# 1 - require at least any character existed +# Default: 55 - default requirement +# +# # SkipCinematics # Disable in-game script movie at first character's login(allows to prevent buggy intro in case of custom start location coordinates) # Default: 0 - show intro for each new characrer @@ -440,14 +483,18 @@ LogColors = "" # 2 - disable intro show in all cases # # MaxPlayerLevel -# Max level that can be reached by player for experience (in range from 1 to 255). +# Max level that can be reached by player for experience (in range from 1 to 100). # Change not recommended -# Default: 70 +# Default: 80 # # StartPlayerLevel # Staring level that have character at creating (in range 1 to MaxPlayerLevel) # Default: 1 # +# StartHeroicPlayerLevel +# Staring level that have character of heroic class at creating (in range 1 to MaxPlayerLevel) +# Default: 55 +# # StartPlayerMoney # Amount of money that new players will start with. # If you want to start with silver, use for example 100 (100 copper = 1 silver) @@ -484,29 +531,14 @@ LogColors = "" # # AlwaysMaxSkillForLevel # Players will automatically gain max level dependent (weapon/defense) skill when logging in, leveling up etc. -# Default: 0 (true) -# 1 (false) +# Default: 0 (false) +# 1 (true) # # ActivateWeather # Activate weather system # Default: 1 (true) # 0 (false) # -# Battleground.CastDeserter -# Cast or not Deserter spell at player who leave battleground in progress -# Default: 1 (true) -# 0 (false) -# -# Battleground.QueueAnnouncer.Enable -# Enable queue announcer posting to chat -# Default: 1 (true) -# 0 (false) -# -# Battleground.QueueAnnouncer.PlayerOnly -# Enable queue announcer posting to chat -# Default: 0 (false) -# 1 (true) -# # CastUnstuck # Allow cast or not Unstuck spell at .start or client Help option use # Default: 1 (true) @@ -528,7 +560,7 @@ LogColors = "" # # Instance.UnloadDelay # Unload the instance map from memory after some time if no players are inside. -# Default: 1800000 (miliseconds, i.e 30 minutes) +# Default: 1800000 (miliseconds 30 minutes) # 0 (instance maps are kept in memory until they are reset) # # Quests.LowLevelHideDiff @@ -561,10 +593,20 @@ LogColors = "" # Default: 3600 sec (1 hour) # # SkillChance.Prospecting -# For prospecting skillup not possible by default, but can be allowed as custom setting +# For prospecting skillup impossible by default, but can be allowed as custom setting # Default: 0 - no skilups # 1 - skilups possible # +# SkillChance.Milling +# For milling skillup impossible by default, but can be allowed as custom setting +# Default: 0 - no skilups +# 1 - skilups possible +# +# OffhandCheckAtTalentsReset +# Talent reset can change offhand weapon restrictions for equip slots. +# Default: 0 - recheck offhand slot weapon only at zone update +# 1 - recheck offhand slot weapon at talent reset also +# # Event.Announce # Default: 0 (false) # 1 (true) @@ -586,7 +628,7 @@ LogColors = "" GameType = 1 RealmZone = 1 -Expansion = 1 +Expansion = 2 DBC.Locale = 255 DeclinedNames = 0 StrictPlayerNames = 0 @@ -596,9 +638,12 @@ MaxWhoListReturns = 49 CharactersCreatingDisabled = 0 CharactersPerAccount = 50 CharactersPerRealm = 10 +HeroicCharactersPerRealm = 1 +MinLevelForHeroicCharacterCreating = 55 SkipCinematics = 0 -MaxPlayerLevel = 70 +MaxPlayerLevel = 80 StartPlayerLevel = 1 +StartHeroicPlayerLevel = 55 StartPlayerMoney = 0 MaxHonorPoints = 75000 StartHonorPoints = 0 @@ -609,9 +654,6 @@ DisableWaterBreath = 4 AllFlightPaths = 0 AlwaysMaxSkillForLevel = 0 ActivateWeather = 1 -Battleground.CastDeserter = 1 -Battleground.QueueAnnouncer.Enable = 1 -Battleground.QueueAnnouncer.PlayerOnly = 0 CastUnstuck = 1 Instance.IgnoreLevel = 0 Instance.IgnoreRaid = 0 @@ -624,6 +666,8 @@ MinPetitionSigns = 9 MaxGroupXPDistance = 74 MailDeliveryDelay = 3600 SkillChance.Prospecting = 0 +SkillChance.Milling = 0 +OffhandCheckAtTalentsReset = 0 Event.Announce = 0 BeepAtStart = 1 Motd = "Welcome to a Trinity Core server." @@ -841,6 +885,18 @@ Channel.SilentlyGMJoin = 0 # 0 (disable) # 1 (enable) # +# GM.Visible +# GM visibility at login +# Default: 2 (last save state) +# 0 (invisible) +# 1 (visible) +# +# GM.AcceptTickets +# Is GM accepting tickets from player by default or not. +# Default: 2 (last save state) +# 0 (disable) +# 1 (enable) +# # GM.Chat # GM chat mode at login # Default: 2 (last save state) @@ -854,7 +910,7 @@ Channel.SilentlyGMJoin = 0 # 1 (enable) # # GM.InGMList -# Is GM showed in GM list (if visible) in non-GM state (.gmoff) +# Is GM showed in GM list (if visible) in non-GM state (.gm off) # Default: 0 (false) # 1 (true) # @@ -869,18 +925,32 @@ Channel.SilentlyGMJoin = 0 # 0 (not include) # # GM.StartLevel -# GM starting level (1-255) +# GM starting level (1-100) # Default: 1 # +# GM.LowerSecurity +# Disallow a lower security member to interact with a higher one using commands +# Default: 0 (disable) +# 1 (enable) +# +# GM.AllowAchievementGain +# If enabled it allows gaining achievements for GM characters +# Default: 1 (enable) +# 0 (disable) +# ################################################################################################################### -GM.LoginState = 2 -GM.Chat = 2 -GM.WhisperingTo = 2 -GM.InGMList = 0 -GM.InWhoList = 0 -GM.LogTrade = 1 -GM.StartLevel = 70 +GM.LoginState = 2 +GM.Visible = 2 +GM.AcceptTickets = 2 +GM.Chat = 2 +GM.WhisperingTo = 2 +GM.InGMList = 0 +GM.InWhoList = 0 +GM.LogTrade = 1 +GM.StartLevel = 80 +GM.LowerSecurity = 0 +GM.AllowAchievementGain = 1 ################################################################################################################### # VISIBILITY AND RADIUSES @@ -894,9 +964,9 @@ GM.StartLevel = 70 # Visibility.Distance.Creature # Visibility.Distance.Player # Visibility distance for different in game object -# Max limited by active player zone: ~ 333 +# Max limited by active player zone: ~ 166 # Min limit dependent from objects -# Default: 132 (cell size) +# Default: 66 (cell size) # Min limit is max aggro radius (45) * Rate.Creature.Aggro # # Visibility.Distance.Object @@ -922,10 +992,10 @@ GM.StartLevel = 70 ################################################################################################################### Visibility.GroupMode = 0 -Visibility.Distance.Creature = 132 -Visibility.Distance.Player = 132 -Visibility.Distance.Object = 132 -Visibility.Distance.InFlight = 132 +Visibility.Distance.Creature = 66 +Visibility.Distance.Player = 66 +Visibility.Distance.Object = 66 +Visibility.Distance.InFlight = 66 Visibility.Distance.Grey.Unit = 1 Visibility.Distance.Grey.Object = 10 @@ -936,6 +1006,8 @@ Visibility.Distance.Grey.Object = 10 # Rate.Mana # Rate.Rage.Income # Rate.Rage.Loss +# Rate.RunicPower.Income +# Rate.RunicPower.Loss # Rate.Focus # Rate.Loyalty # Health and power regeneration and rage income from damage. @@ -1052,12 +1124,20 @@ Visibility.Distance.Grey.Object = 10 # Default: 1 (enabled) # 0 (disabled) # +# Death.Bones.World +# Death.Bones.BattlegroundOrArena +# Enable/disable creating bones instead corpse at resurrection (in normal zones/instacnes, or battleground/arenas) +# Default: 1 (enabled) +# 0 (disabled) +# ################################################################################################################### Rate.Health = 1 Rate.Mana = 1 Rate.Rage.Income = 1 Rate.Rage.Loss = 1 +Rate.RunicPower.Income = 1 +Rate.RunicPower.Loss = 1 Rate.Focus = 1 Rate.Loyalty = 1 Rate.Skill.Discovery = 1 @@ -1104,51 +1184,104 @@ DurabilityLossChance.Block = 0.05 Death.SicknessLevel = 11 Death.CorpseReclaimDelay.PvP = 1 Death.CorpseReclaimDelay.PvE = 0 +Death.Bones.World = 1 +Death.Bones.BattlegroundOrArena = 1 + ################################################################################################################### +# BATTLEGROUND CONFIG # -# Rated arena matches config +# Battleground.CastDeserter +# Cast Deserter spell at player who leave battleground in progress +# Default: 1 (enable) +# 0 (disable) # -# MaxRatingDifference: the maximum rating difference between two groups in rated matches -# Default: 0 (disable, rating difference is discarded) +# Battleground.QueueAnnouncer.Enable +# Enable queue announcer posting to chat +# Default: 0 (disable) +# 1 (enable) +# +# Battleground.QueueAnnouncer.PlayerOnly +# Enable queue announcer posting to chat +# Default: 0 (disable) +# 1 (enable) # -# RatingDiscardTimer: after the specified milliseconds has passed, -# rating information will be discarded when selecting teams for matches -# also initiates an update by this timer -# Default: 60000 +# Battleground.InvitationType +# Set Battleground invitation type +# Default: 0 (normal - invite as much players to bg as possible, don't bother with ballance) +# 1 (Experimental - don't allow to invite much more players of one faction) # -# AutoDistributePoints: set if arena points should be distributed automatically, or by GM command -# Default: 0 (disable) (recommended): use gm command or sql query to distribute the points -# 1 (enable): arena points are distributed automatically +# Battleground.PrematureFinishTimer +# The time to end the bg if there are less than MinPlayersPerTeam on one side in milliseconds +# Default: 300000 (5 minutes) +# 0 - disable (not recommended) # -# AutoDistributeInterval: how often should the distribution take place -# if automatic distribution is enabled -# in days -# Default: 7 (weekly) +# BattleGround.PremadeGroupWaitForMatch +# The time in which premade group of 1 faction waits in BG Queue for premade group of other faction +# Default: 1800000 (30 minutes) +# 0 - disable (not recommended) # ################################################################################################################### -Arena.MaxRatingDifference = 0 -Arena.RatingDiscardTimer = 60000 -Arena.AutoDistributePoints = 0 -Arena.AutoDistributeInterval = 7 +Battleground.CastDeserter = 1 +Battleground.QueueAnnouncer.Enable = 0 +Battleground.QueueAnnouncer.PlayerOnly = 0 +Battleground.InvitationType = 0 +BattleGround.PrematureFinishTimer = 300000 +BattleGround.PremadeGroupWaitForMatch = 1800000 + ################################################################################################################### +# ARENA CONFIG +# +# Arena.MaxRatingDifference +# The maximum rating difference between two groups in rated matches +# Default: 150 (enable, recommended) +# 0 (disable, rating difference is discarded) +# +# Arena.RatingDiscardTimer +# After the specified milliseconds has passed, +# rating information will be discarded when selecting teams for matches +# also initiates an update by this timer +# Default: 600000 (10 minutes, recommended) +# 0 (disable) +# +# Arena.AutoDistributePoints +# Set if arena points should be distributed automatically, or by GM command +# Default: 0 (disable) (recommended): use gm command or sql query to distribute the points +# 1 (enable) arena points are distributed automatically # -# Battleground config +# Arena.AutoDistributeInterval +# How often should the distribution take place +# If automatic distribution is enabled in days +# Default: 7 (weekly) # -# PrematureFinishTimer: the time to end the bg if there are less than minplayersperteam on one side -# in milliseconds -# Default: 300000 -# 0 - disable +# Arena.QueueAnnouncer.Enable +# Enable bg queue announcer posting to chat +# Default: 0 (disable) +# 1 (enable) +# +# Arena.ArenaSeason.ID +# Current area season id show in client +# Default: 1 +# +# Arena.ArenaSeason.InProgress +# Current area season state +# Default: 1 (active) +# 0 (finished) # ################################################################################################################### -BattleGround.PrematureFinishTimer = 300000 +Arena.MaxRatingDifference = 150 +Arena.RatingDiscardTimer = 600000 +Arena.AutoDistributePoints = 0 +Arena.AutoDistributeInterval = 7 +Arena.QueueAnnouncer.Enable = 0 +Arena.ArenaSeason.ID = 1 +Arena.ArenaSeason.InProgress = 1 ################################################################################################################### -# # NETWORK CONFIG # # Network.Threads diff --git a/src/trinityrealm/AuthCodes.h b/src/trinityrealm/AuthCodes.h index defa513dede..9a38712af83 100644 --- a/src/trinityrealm/AuthCodes.h +++ b/src/trinityrealm/AuthCodes.h @@ -1,7 +1,7 @@ -/* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> +/* + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -68,9 +68,8 @@ enum LoginResult // we need to stick to 1 version or half of the stuff will work for someone // others will not and opposite -// will only support WoW and WoW:TBC 2.4.3 client build 8606... +// will only support WoW, WoW:TBC and WoW:WotLK 3.0.9 client build 9551... -#define EXPECTED_TRINITY_CLIENT_BUILD {8606, 0} +#define EXPECTED_TRINITY_CLIENT_BUILD {9551, 0} #endif - diff --git a/src/trinityrealm/AuthSocket.cpp b/src/trinityrealm/AuthSocket.cpp index dd7bc31e45b..c5c81593737 100644 --- a/src/trinityrealm/AuthSocket.cpp +++ b/src/trinityrealm/AuthSocket.cpp @@ -1092,4 +1092,3 @@ Patcher::~Patcher() for(Patches::iterator i = _patches.begin(); i != _patches.end(); i++ ) delete i->second; } - diff --git a/src/trinityrealm/AuthSocket.h b/src/trinityrealm/AuthSocket.h index 73aa1b280e2..3cae54c7789 100644 --- a/src/trinityrealm/AuthSocket.h +++ b/src/trinityrealm/AuthSocket.h @@ -1,7 +1,7 @@ /* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -84,4 +84,3 @@ class AuthSocket: public TcpSocket }; #endif /// @} - diff --git a/src/trinityrealm/CMakeLists.txt b/src/trinityrealm/CMakeLists.txt index f883259bbf5..cddea04ea47 100644 --- a/src/trinityrealm/CMakeLists.txt +++ b/src/trinityrealm/CMakeLists.txt @@ -9,24 +9,18 @@ RealmList.cpp RealmList.h ) -SET(trinity-realm_LINK_FLAGS "") - add_executable(trinity-realm ${trinity-realm_SRCS}) add_definitions( -D_TRINITY_REALM_CONFIG='"${CONF_DIR}/trinityrealm.conf"' ) IF (DO_MYSQL) - SET(trinity-realm_LINK_FLAGS "-pthread ${trinity-realm_LINK_FLAGS}") + #SET_TARGET_PROPERTIES(mangos-realmd PROPERTIES LINK_FLAGS ${MYSQL_LIBS}) + SET_TARGET_PROPERTIES(trinity-realm PROPERTIES LINK_FLAGS "-pthread") ENDIF(DO_MYSQL) IF (DO_POSTGRE) - SET(trinity-realm_LINK_FLAGS "${POSTGRE_LIBS} ${trinity-realm_LINK_FLAGS}") + SET_TARGET_PROPERTIES(trinity-realmd PROPERTIES LINK_FLAGS ${POSTGRE_LIBS}) ENDIF(DO_POSTGRE) -IF (CMAKE_SYSTEM_NAME MATCHES "Darwin") - SET(trinity-realm_LINK_FLAGS "-framework Carbon ${trinity-realm_LINK_FLAGS}") -ENDIF (CMAKE_SYSTEM_NAME MATCHES "Darwin") - -SET_TARGET_PROPERTIES(trinity-realm PROPERTIES LINK_FLAGS "${trinity-realm_LINK_FLAGS}") target_link_libraries( trinity-realm @@ -40,11 +34,11 @@ ZThread zlib ${SSLLIB} ${MYSQL_LIBRARIES} -${OSX_LIBS} ) install(TARGETS trinity-realm DESTINATION bin) + ########### install files ############### install(FILES trinityrealm.conf.dist DESTINATION etc) diff --git a/src/trinityrealm/Main.cpp b/src/trinityrealm/Main.cpp index 8c2c199b2f4..bd318779f83 100644 --- a/src/trinityrealm/Main.cpp +++ b/src/trinityrealm/Main.cpp @@ -31,7 +31,6 @@ #include "sockets/ListenSocket.h" #include "AuthSocket.h" #include "SystemConfig.h" -#include "revision.h" #include "Util.h" // Format is YYYYMMDDRR where RR is the change in the conf file @@ -41,12 +40,12 @@ #endif #ifndef _TRINITY_REALM_CONFIG -# define _TRINITY_REALM_CONFIG "trinityrealm.conf" +# define _TRINITY_REALM_CONFIG "TrinityRealm.conf" #endif //_TRINITY_REALM_CONFIG #ifdef WIN32 #include "ServiceWin32.h" -char serviceName[] = "realmd"; +char serviceName[] = "TrinityRealm"; char serviceLongName[] = "Trinity realm service"; char serviceDescription[] = "Massive Network Game Object Server"; /* @@ -58,7 +57,7 @@ char serviceDescription[] = "Massive Network Game Object Server"; int m_ServiceStatus = -1; #endif -bool StartDB(std::string &dbstring); +bool StartDB(); void UnhookSignals(); void HookSignals(); @@ -71,7 +70,6 @@ DatabaseType LoginDatabase; ///< Accessor to the void usage(const char *prog) { sLog.outString("Usage: \n %s [<options>]\n" - " --version print version and exit\n\r" " -c config_file use config_file as configuration file\n\r" #ifdef WIN32 " Running as service functions:\n\r" @@ -102,12 +100,6 @@ extern int main(int argc, char **argv) cfg_file = argv[c]; } - if( strcmp(argv[c],"--version") == 0) - { - printf("%s\n", _FULLVERSION); - return 0; - } - #ifdef WIN32 //////////// //Services// @@ -187,10 +179,18 @@ extern int main(int argc, char **argv) } ///- Initialize the database connection - std::string dbstring; - if(!StartDB(dbstring)) + if(!StartDB()) return 1; + ///- Initialize the log database + if(sConfig.GetBoolDefault("EnableLogDB", false)) + { + // everything successful - set var to enable DB logging once startup finished. + sLog.SetLogDBLater(true); + // ensure we've set realm to 0 (realmd realmid) + sLog.SetRealmID(0); + } + ///- Get the list of realms for the server m_realmList.Initialize(sConfig.GetIntDefault("RealmsStateUpdateDelay", 20)); if (m_realmList.size() == 0) @@ -243,7 +243,7 @@ extern int main(int argc, char **argv) sLog.outError("Can't set used processors (hex): %x", curAff); } } - sLog.outString(); + sLog.outString(""); } bool Prio = sConfig.GetBoolDefault("ProcessPriority", false); @@ -254,7 +254,7 @@ extern int main(int argc, char **argv) sLog.outString("TrinityRealm process priority class set to HIGH"); else sLog.outError("ERROR: Can't set realmd process priority class."); - sLog.outString(); + sLog.outString(""); } } #endif @@ -263,6 +263,15 @@ extern int main(int argc, char **argv) uint32 numLoops = (sConfig.GetIntDefault( "MaxPingTime", 30 ) * (MINUTE * 1000000 / 100000)); uint32 loopCounter = 0; + // possibly enable db logging; avoid massive startup spam by doing it here. + if (sLog.GetLogDBLater()) + { + sLog.outString("Enabling database logging..."); + sLog.SetLogDBLater(false); + // login db needs thread for logging + sLog.SetLogDB(true); + } + ///- Wait for termination signal while (!stopEvent) { @@ -282,6 +291,7 @@ extern int main(int argc, char **argv) } ///- Wait for the delay thread to exit + LoginDatabase.ThreadEnd(); LoginDatabase.HaltDelayThread(); ///- Remove signal handling before leaving @@ -312,20 +322,21 @@ void OnSignal(int s) } /// Initialize connection to the database -bool StartDB(std::string &dbstring) +bool StartDB() { - if(!sConfig.GetString("LoginDatabaseInfo", &dbstring)) + std::string dbstring = sConfig.GetStringDefault("LoginDatabaseInfo", ""); + if(dbstring.empty()) { sLog.outError("Database not specified"); return false; } - sLog.outString("Database: %s", dbstring.c_str() ); if(!LoginDatabase.Initialize(dbstring.c_str())) { sLog.outError("Cannot connect to database"); return false; } + LoginDatabase.ThreadStart(); return true; } @@ -351,4 +362,3 @@ void UnhookSignals() } /// @} - diff --git a/src/realmd/Makefile.am b/src/trinityrealm/Makefile.am index a14b50c847a..a14b50c847a 100644 --- a/src/realmd/Makefile.am +++ b/src/trinityrealm/Makefile.am diff --git a/src/trinityrealm/RealmList.cpp b/src/trinityrealm/RealmList.cpp index 692f457b1a8..936f7bcd703 100644 --- a/src/trinityrealm/RealmList.cpp +++ b/src/trinityrealm/RealmList.cpp @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> @@ -50,7 +50,6 @@ void RealmList::UpdateRealm( uint32 ID, const std::string& name, const std::stri Realm& realm = m_realms[name]; realm.m_ID = ID; - realm.name = name; realm.icon = icon; realm.color = color; realm.timezone = timezone; @@ -100,4 +99,3 @@ void RealmList::UpdateRealms(bool init) delete result; } } - diff --git a/src/trinityrealm/RealmList.h b/src/trinityrealm/RealmList.h index 31690a19eb3..b830a0827a7 100644 --- a/src/trinityrealm/RealmList.h +++ b/src/trinityrealm/RealmList.h @@ -1,7 +1,7 @@ -/* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> +/* + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,7 +30,6 @@ /// Storage object for a realm struct Realm { - std::string name; std::string address; uint8 icon; uint8 color; @@ -66,4 +65,3 @@ class RealmList }; #endif /// @} - diff --git a/src/realmd/TrinityRealm.ico b/src/trinityrealm/TrinityRealm.ico Binary files differindex da318f48a8c..da318f48a8c 100644 --- a/src/realmd/TrinityRealm.ico +++ b/src/trinityrealm/TrinityRealm.ico diff --git a/src/realmd/realmd.rc b/src/trinityrealm/realmd.rc index bcd37f240c5..bcd37f240c5 100644 --- a/src/realmd/realmd.rc +++ b/src/trinityrealm/realmd.rc diff --git a/src/trinityrealm/resource.h b/src/trinityrealm/resource.h index fbc730320b4..7e7d8e4b76f 100644 --- a/src/trinityrealm/resource.h +++ b/src/trinityrealm/resource.h @@ -4,7 +4,7 @@ // // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 @@ -13,4 +13,3 @@ #define _APS_NEXT_SYMED_VALUE 101 #endif #endif - diff --git a/src/realmd/realmd.conf.dist.in b/src/trinityrealm/trinityrealm.conf.dist index 439f7f21200..439f7f21200 100644 --- a/src/realmd/realmd.conf.dist.in +++ b/src/trinityrealm/trinityrealm.conf.dist diff --git a/win/TrinityCore&Script VC80.sln b/win/TrinityCore&Script VC80.sln index 7727cc9db42..8a8b94fcc24 100644 --- a/win/TrinityCore&Script VC80.sln +++ b/win/TrinityCore&Script VC80.sln @@ -25,7 +25,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g3dlite", "VC80\g3dlite.vcp EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sockets", "VC80\sockets.vcproj", "{04BAF755-0D67-46F8-B1C6-77AE5368F3CB}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC80\mangosd.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC80\TrinityCore.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}" ProjectSection(ProjectDependencies) = postProject {563E9905-3657-460C-AE63-0AC39D162E23} = {563E9905-3657-460C-AE63-0AC39D162E23} {90297C34-F231-4DF4-848E-A74BCC0E40ED} = {90297C34-F231-4DF4-848E-A74BCC0E40ED} @@ -33,7 +33,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC80\mangosd {1DC6C4DA-A028-41F3-877D-D5400C594F88} = {1DC6C4DA-A028-41F3-877D-D5400C594F88} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC80\realmd.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC80\TrinityRealm.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}" ProjectSection(ProjectDependencies) = postProject {90297C34-F231-4DF4-848E-A74BCC0E40ED} = {90297C34-F231-4DF4-848E-A74BCC0E40ED} {04BAF755-0D67-46F8-B1C6-77AE5368F3CB} = {04BAF755-0D67-46F8-B1C6-77AE5368F3CB} diff --git a/win/TrinityCore&Script VC90.sln b/win/TrinityCore&Script VC90.sln index 0353ef3c8f6..74259aaff8b 100644 --- a/win/TrinityCore&Script VC90.sln +++ b/win/TrinityCore&Script VC90.sln @@ -25,7 +25,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g3dlite", "VC90\g3dlite.vcp EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sockets", "VC90\sockets.vcproj", "{04BAF755-0D67-46F8-B1C6-77AE5368F3CB}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC90\mangosd.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC90\TrinityCore.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}" ProjectSection(ProjectDependencies) = postProject {563E9905-3657-460C-AE63-0AC39D162E23} = {563E9905-3657-460C-AE63-0AC39D162E23} {90297C34-F231-4DF4-848E-A74BCC0E40ED} = {90297C34-F231-4DF4-848E-A74BCC0E40ED} @@ -33,7 +33,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC90\mangosd {1DC6C4DA-A028-41F3-877D-D5400C594F88} = {1DC6C4DA-A028-41F3-877D-D5400C594F88} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC90\realmd.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC90\TrinityRealm.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}" ProjectSection(ProjectDependencies) = postProject {90297C34-F231-4DF4-848E-A74BCC0E40ED} = {90297C34-F231-4DF4-848E-A74BCC0E40ED} {04BAF755-0D67-46F8-B1C6-77AE5368F3CB} = {04BAF755-0D67-46F8-B1C6-77AE5368F3CB} |