aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/CMakeLists.txt8
-rw-r--r--src/mangosd/CMakeLists.txt53
-rw-r--r--src/mangosd/CliRunnable.cpp366
-rw-r--r--src/mangosd/CliRunnable.h35
-rw-r--r--src/mangosd/Main.cpp165
-rw-r--r--src/mangosd/Master.cpp531
-rw-r--r--src/mangosd/Master.h52
-rw-r--r--src/mangosd/RASocket.cpp259
-rw-r--r--src/mangosd/RASocket.h67
-rw-r--r--src/mangosd/WorldRunnable.cpp104
-rw-r--r--src/mangosd/WorldRunnable.h35
-rw-r--r--src/mangosd/mangosd.conf.dist.in1509
-rw-r--r--src/mangosd/resource.h15
-rw-r--r--src/realmd/AuthCodes.h75
-rw-r--r--src/realmd/AuthSocket.cpp1094
-rw-r--r--src/realmd/AuthSocket.h86
-rw-r--r--src/realmd/CMakeLists.txt45
-rw-r--r--src/realmd/Main.cpp364
-rw-r--r--src/realmd/RealmList.cpp101
-rw-r--r--src/realmd/RealmList.h67
-rw-r--r--src/realmd/resource.h15
-rw-r--r--src/shared/revision.h7
-rw-r--r--src/trinitycore/CliRunnable.cpp20
-rw-r--r--src/trinitycore/CliRunnable.h7
-rw-r--r--src/trinitycore/Main.cpp20
-rw-r--r--src/trinitycore/Makefile.am (renamed from src/mangosd/Makefile.am)0
-rw-r--r--src/trinitycore/Master.cpp186
-rw-r--r--src/trinitycore/Master.h7
-rw-r--r--src/trinitycore/RASocket.cpp17
-rw-r--r--src/trinitycore/RASocket.h5
-rw-r--r--src/trinitycore/TrinityCore.ico (renamed from src/mangosd/TrinityCore.ico)bin136606 -> 136606 bytes
-rw-r--r--src/trinitycore/WorldRunnable.cpp25
-rw-r--r--src/trinitycore/WorldRunnable.h7
-rw-r--r--src/trinitycore/mangosd.rc (renamed from src/mangosd/mangosd.rc)0
-rw-r--r--src/trinitycore/monitor-mangosd (renamed from src/mangosd/monitor-mangosd)0
-rw-r--r--src/trinitycore/resource.h3
-rw-r--r--src/trinitycore/run-mangosd (renamed from src/mangosd/run-mangosd)0
-rw-r--r--src/trinitycore/trinitycore.conf.dist321
-rw-r--r--src/trinityrealm/AuthCodes.h11
-rw-r--r--src/trinityrealm/AuthSocket.cpp1
-rw-r--r--src/trinityrealm/AuthSocket.h5
-rw-r--r--src/trinityrealm/CMakeLists.txt14
-rw-r--r--src/trinityrealm/Main.cpp48
-rw-r--r--src/trinityrealm/Makefile.am (renamed from src/realmd/Makefile.am)0
-rw-r--r--src/trinityrealm/RealmList.cpp4
-rw-r--r--src/trinityrealm/RealmList.h8
-rw-r--r--src/trinityrealm/TrinityRealm.ico (renamed from src/realmd/TrinityRealm.ico)bin136606 -> 136606 bytes
-rw-r--r--src/trinityrealm/realmd.rc (renamed from src/realmd/realmd.rc)0
-rw-r--r--src/trinityrealm/resource.h3
-rw-r--r--src/trinityrealm/trinityrealm.conf.dist (renamed from src/realmd/realmd.conf.dist.in)0
-rw-r--r--win/TrinityCore&Script VC80.sln4
-rw-r--r--win/TrinityCore&Script VC90.sln4
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
index 6f0a5721957..6f0a5721957 100644
--- a/src/mangosd/TrinityCore.ico
+++ b/src/trinitycore/TrinityCore.ico
Binary files differ
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
index da318f48a8c..da318f48a8c 100644
--- a/src/realmd/TrinityRealm.ico
+++ b/src/trinityrealm/TrinityRealm.ico
Binary files differ
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}