aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README80
-rw-r--r--README.md80
-rw-r--r--sql/updates/world/2013_07_29_00_world_drak_tharon_keep.sql2
-rw-r--r--sql/updates/world/2013_07_29_01_world_spelldifficulty_dbc.sql3
-rw-r--r--src/server/authserver/Main.cpp111
-rw-r--r--src/server/authserver/authserver.conf.dist7
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp8
-rw-r--r--src/server/scripts/Northrend/CMakeLists.txt2
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp (renamed from src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp)205
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp18
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp11
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp12
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h71
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp388
-rw-r--r--src/server/scripts/Spells/spell_item.cpp4
-rw-r--r--src/server/worldserver/CommandLine/CliRunnable.cpp17
-rw-r--r--src/server/worldserver/CommandLine/CliRunnable.h4
-rw-r--r--src/server/worldserver/Main.cpp20
-rw-r--r--src/server/worldserver/Master.cpp231
-rw-r--r--src/server/worldserver/Master.h4
-rw-r--r--src/server/worldserver/RemoteAccess/RARunnable.cpp14
-rw-r--r--src/server/worldserver/RemoteAccess/RARunnable.h3
-rw-r--r--src/server/worldserver/RemoteAccess/RASocket.cpp18
-rw-r--r--src/server/worldserver/RemoteAccess/RASocket.h21
-rw-r--r--src/server/worldserver/TCSoap/TCSoap.cpp8
-rw-r--r--src/server/worldserver/TCSoap/TCSoap.h19
-rw-r--r--src/server/worldserver/WorldThread/WorldRunnable.h4
-rw-r--r--src/server/worldserver/worldserver.conf.dist7
-rw-r--r--src/tools/mmaps_generator/MapBuilder.cpp4
29 files changed, 675 insertions, 701 deletions
diff --git a/README b/README
deleted file mode 100644
index 294f3149451..00000000000
--- a/README
+++ /dev/null
@@ -1,80 +0,0 @@
-= TrinityCore -- General information =
-
-Copyright (C) TrinityCore (http://www.trinitycore.org)
-
- Trinity Core 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
-
- In addition, as a special exception, the Trinity Core project
- gives permission to link the code of its release of Trinity Core with
- the OpenSSL project's "OpenSSL" library (or with modified versions of
- it that use the same license as the "OpenSSL" library), and distribute
- the linked executables. You must obey the GNU General Public License
- in all respects for all of the code used other than "OpenSSL". If you
- modify this file, you may extend this exception to your version of the
- file, but you are not obligated to do so. If you do not wish to do
- so, delete this exception statement from your version.
-
-TrinityCore is a MMORPG Framework based mostly on C++. It is completely
-open source, and is community supported. It is derived
-from MaNGOS, the Massive Network Game Object Server, and is based on the
-code of that project with extensive changes over time to optimize, improve
-and cleanup the codebase at the same time as improving the ingame mechanics
-and functionality. If you wish to contribute ideas or code please visit
-our site linked below or make pull requests to our github repo at
-https://github.com/TrinityCore/TrinityCore
-
-For further information on the TrinityCore project, please visit our
-project website at http://www.TrinityCore.org
-
-Documentation including installation instructions can be found inside
-the doc directory.
-
-SQL files to create the databases can be found in the sql/create and
-sql/base directories.
-You need to run sql/create/create_mysql.sql 1st and then
-sql/base/auth_database.sql and sql/base/characters_database.sql
-You need to download world database from http://www.trinitycore.org/f/files/
-be sure you get the higher numbered database.
-When installing a core the 1st time you need to import also all the files at
-sql/updates/world directory.
-sql/updates/auth and sql/updates/characters databases only needs to be run
-when updating one existing server.
-To save time importing multiple files, you can use copy *.sql world_updates.sql
-under Windows or cat *.sql > world_updates under Linux.
-
-You need to update your core (recompile and overwrite binaries) when updating
-your database, usually you can't use one older core with a newer database or a
-newer core with an older database.
-When updating your core you also need to import the files at sql/updates/auth
-and sql/updates/characters along with the sql/updates/world files.
-You can't merge all the sql files on sql/updates into a single file, because
-they belong to 3 different databases and they don't use database name.
-
-TrinityCore Requirements
-Platform: Linux, Windows or Mac
-Processor with SSE2 support
-ACE ≥ 5.8.3
-MySQL ≥ 5.1.0
-CMake ≥ 2.8.0
-OpenSSL ≥ 0.9.8o
-GCC ≥ 4.3 (Linux only)
-MS Visual Studio ≥ 9 (2008) (Windows only)
-A bit of brain, wiki can become outdated with the release of new TDB versions
-if wiki refers to TDB 50 and you see TDB 52 get the higher number.
-Some reading skills, search forum, read http://www.trinitycore.org/f/topic/1518-
-and http://www.trinitycore.org/f/topic/37- before posting a bug report or ask for
-help on forum.
-Search for existing bug reports before posting your own bug reports; don't post multiple
-bugs on a single ticket.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000000..0bb14f928e1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,80 @@
+# ![logo](http://www.trinitycore.org/f/public/style_images/1_trinitycore.png) TrinityCore
+
+
+## Introduction
+
+TrinityCore is a *MMORPG* Framework based mostly in C++.
+
+It is derived from *MaNGOS*, the *Massive Network Game Object Server*, and is
+based on the code of that project with extensive changes over time to optimize,
+improve and cleanup the codebase at the same time as improving the in-game
+mechanics and functionality.
+
+It is completely open source; community involvement is highly encouraged.
+
+If you wish to contribute ideas or code please visit our site linked below or
+make pull requests to our [Github repository](https://github.com/TrinityCore/TrinityCore).
+
+For further information on the TrinityCore project, please visit our project
+website at [TrinityCore.org](http://www.trinitycore.org).
+
+
+## Requirements
+
++ Platform: Linux, Windows or Mac
++ Processor with SSE2 support
++ ACE ≥ 5.8.3 (included for Windows)
++ MySQL ≥ 5.1.0 (included for Windows)
++ CMake ≥ 2.8.0
++ OpenSSL ≥ 0.9.8o
++ GCC ≥ 4.3 (Linux only)
++ MS Visual Studio ≥ 9 (2008) (Windows only)
+
+
+## Install
+
+Detailed installation guides are available in the wiki for
+[Windows](http://collab.kpsn.org/display/tc/How-to_Win),
+[Linux](http://collab.kpsn.org/display/tc/How-to_Linux) and
+[Mac OSX](http://collab.kpsn.org/display/tc/How-to_Mac).
+
+
+## Reporting issues
+
+Issues can be reported via the [Github issue tracker](https://github.com/TrinityCore/TrinityCore/issues?labels=Branch-3.3.5a).
+
+Please take the time to review existing issues before submitting your own to
+prevent duplicates.
+
+In addition, thoroughly read through the [issue tracker guide](http://www.trinitycore.org/f/topic/37-the-trinitycore-issuetracker-and-you/) to ensure
+your report contains the required information. Incorrect or poorly formed
+reports are wasteful and are subject to deletion.
+
+
+## Submitting fixes
+
+Fixes are submitted as pull requests via Github. For more information on how to
+properly submit a pull request, read the [how-to: maintain a remote fork](http://www.trinitycore.org/f/topic/6037-howto-maintain-a-remote-fork-for-pull-requests-tortoisegit/).
+
+
+## Copyright
+
+License: GPL 2.0
+
+Read file [COPYING](COPYING)
+
+
+## Authors & Contributors
+
+Read file [THANKS](THANKS)
+
+
+## Links
+
+[Site](http://www.trinitycore.org)
+
+[Wiki](http://trinitycore.info)
+
+[Documentation](http://www.trinitycore.net) (powered by Doxygen)
+
+[Forums](http://www.trinitycore.org/f/)
diff --git a/sql/updates/world/2013_07_29_00_world_drak_tharon_keep.sql b/sql/updates/world/2013_07_29_00_world_drak_tharon_keep.sql
new file mode 100644
index 00000000000..bfcc29c1080
--- /dev/null
+++ b/sql/updates/world/2013_07_29_00_world_drak_tharon_keep.sql
@@ -0,0 +1,2 @@
+UPDATE `instance_template` SET `script`="instance_drak_tharon_keep" WHERE `map`=600;
+UPDATE `creature_template` SET `ScriptName`="boss_king_dred" WHERE `entry`=27483;
diff --git a/sql/updates/world/2013_07_29_01_world_spelldifficulty_dbc.sql b/sql/updates/world/2013_07_29_01_world_spelldifficulty_dbc.sql
new file mode 100644
index 00000000000..56764385765
--- /dev/null
+++ b/sql/updates/world/2013_07_29_01_world_spelldifficulty_dbc.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spelldifficulty_dbc` WHERE `id` = 48849;
+INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`) VALUES
+(48849, 48849, 59422);
diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp
index 9a80abe55e9..9a6cc89fdd4 100644
--- a/src/server/authserver/Main.cpp
+++ b/src/server/authserver/Main.cpp
@@ -15,6 +15,7 @@
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+
/**
* @file main.cpp
* @brief Authentication Server main program
@@ -22,6 +23,7 @@
* This file contains the main program for the
* authentication server
*/
+
#include <ace/Dev_Poll_Reactor.h>
#include <ace/TP_Reactor.h>
#include <ace/ACE.h>
@@ -39,6 +41,12 @@
#include "RealmList.h"
#include "RealmAcceptor.h"
+#ifdef __linux__
+#include <sched.h>
+#include <sys/resource.h>
+#define PROCESS_HIGH_PRIORITY -15 // [-20, 19], default is 0
+#endif
+
#ifndef _TRINITY_REALM_CONFIG
# define _TRINITY_REALM_CONFIG "authserver.conf"
#endif
@@ -48,15 +56,15 @@ void StopDB();
bool stopEvent = false; // Setting it to true stops the server
-LoginDatabaseWorkerPool LoginDatabase; // Accessor to the auth server database
+LoginDatabaseWorkerPool LoginDatabase; // Accessor to the authserver database
/// Handle authserver's termination signals
class AuthServerSignalHandler : public Trinity::SignalHandler
{
public:
- virtual void HandleSignal(int SigNum)
+ virtual void HandleSignal(int sigNum)
{
- switch (SigNum)
+ switch (sigNum)
{
case SIGINT:
case SIGTERM:
@@ -67,7 +75,7 @@ public:
};
/// Print out the usage string for this program on the console.
-void usage(const char *prog)
+void usage(const char* prog)
{
TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "Usage: \n %s [<options>]\n"
" -c config_file use config_file as configuration file\n\r",
@@ -75,37 +83,37 @@ void usage(const char *prog)
}
/// Launch the auth server
-extern int main(int argc, char **argv)
+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)
+ char const* configFile = _TRINITY_REALM_CONFIG;
+ int count = 1;
+ while (count < argc)
{
- if (strcmp(argv[c], "-c") == 0)
+ if (strcmp(argv[count], "-c") == 0)
{
- if (++c >= argc)
+ if (++count >= argc)
{
printf("Runtime-Error: -c option requires an input argument\n");
usage(argv[0]);
return 1;
}
else
- cfg_file = argv[c];
+ configFile = argv[count];
}
- ++c;
+ ++count;
}
- if (!sConfigMgr->LoadInitial(cfg_file))
+ if (!sConfigMgr->LoadInitial(configFile))
{
- printf("Invalid or missing configuration file : %s\n", cfg_file);
+ printf("Invalid or missing configuration file : %s\n", configFile);
printf("Verify that the file exists and has \'[authserver]\' written in the top of the file!\n");
return 1;
}
TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "%s (authserver)", _FULLVERSION);
TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "<Ctrl-C> to stop.\n");
- TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "Using configuration file %s.", cfg_file);
+ TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "Using configuration file %s.", configFile);
TC_LOG_WARN(LOG_FILTER_AUTHSERVER, "%s (Library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION));
@@ -118,16 +126,16 @@ extern int main(int argc, char **argv)
TC_LOG_DEBUG(LOG_FILTER_AUTHSERVER, "Max allowed open files is %d", ACE::max_handles());
// authserver PID file creation
- std::string pidfile = sConfigMgr->GetStringDefault("PidFile", "");
- if (!pidfile.empty())
+ std::string pidFile = sConfigMgr->GetStringDefault("PidFile", "");
+ if (!pidFile.empty())
{
- uint32 pid = CreatePIDFile(pidfile);
- if (!pid)
+ if (uint32 pid = CreatePIDFile(pidFile))
+ TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "Daemon PID: %u\n", pid);
+ else
{
- TC_LOG_ERROR(LOG_FILTER_AUTHSERVER, "Cannot create PID file %s.\n", pidfile.c_str());
+ TC_LOG_ERROR(LOG_FILTER_AUTHSERVER, "Cannot create PID file %s.\n", pidFile.c_str());
return 1;
}
- TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "Daemon PID: %u\n", pid);
}
// Initialize the database connection
@@ -162,7 +170,7 @@ extern int main(int argc, char **argv)
return 1;
}
- // Initialise the signal handlers
+ // Initialize the signal handlers
AuthServerSignalHandler SignalINT, SignalTERM;
// Register authservers's signal handlers
@@ -170,42 +178,69 @@ extern int main(int argc, char **argv)
Handler.register_handler(SIGINT, &SignalINT);
Handler.register_handler(SIGTERM, &SignalTERM);
- ///- Handle affinity for multiple processors and process priority on Windows
-#ifdef _WIN32
+ ///- Handle affinity for multiple processors and process priority
+ uint32 affinity = sConfigMgr->GetIntDefault("UseProcessors", 0);
+ bool highPriority = sConfigMgr->GetBoolDefault("ProcessPriority", false);
+
+#ifdef _WIN32 // Windows
{
HANDLE hProcess = GetCurrentProcess();
- uint32 Aff = sConfigMgr->GetIntDefault("UseProcessors", 0);
- if (Aff > 0)
+ if (affinity > 0)
{
ULONG_PTR appAff;
ULONG_PTR sysAff;
if (GetProcessAffinityMask(hProcess, &appAff, &sysAff))
{
- ULONG_PTR curAff = Aff & appAff; // remove non accessible processors
+ ULONG_PTR currentAffinity = affinity & appAff; // remove non accessible processors
- if (!curAff)
- TC_LOG_ERROR(LOG_FILTER_AUTHSERVER, "Processors marked in UseProcessors bitmask (hex) %x not accessible for authserver. Accessible processors bitmask (hex): %x", Aff, appAff);
- else if (SetProcessAffinityMask(hProcess, curAff))
- TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "Using processors (bitmask, hex): %x", curAff);
+ if (!currentAffinity)
+ TC_LOG_ERROR(LOG_FILTER_AUTHSERVER, "Processors marked in UseProcessors bitmask (hex) %x are not accessible for the authserver. Accessible processors bitmask (hex): %x", affinity, appAff);
+ else if (SetProcessAffinityMask(hProcess, currentAffinity))
+ TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "Using processors (bitmask, hex): %x", currentAffinity);
else
- TC_LOG_ERROR(LOG_FILTER_AUTHSERVER, "Can't set used processors (hex): %x", curAff);
+ TC_LOG_ERROR(LOG_FILTER_AUTHSERVER, "Can't set used processors (hex): %x", currentAffinity);
}
-
}
- bool Prio = sConfigMgr->GetBoolDefault("ProcessPriority", false);
-
- if (Prio)
+ if (highPriority)
{
if (SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS))
- TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "The auth server process priority class has been set to HIGH");
+ TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "authserver process priority class set to HIGH");
else
- TC_LOG_ERROR(LOG_FILTER_AUTHSERVER, "Can't set auth server process priority class.");
+ TC_LOG_ERROR(LOG_FILTER_AUTHSERVER, "Can't set authserver process priority class.");
+ }
+ }
+#elif __linux__ // Linux
+ if (affinity > 0)
+ {
+ cpu_set_t mask;
+ CPU_ZERO(&mask);
+
+ for (unsigned int i = 0; i < sizeof(affinity) * 8; ++i)
+ if (affinity & (1 << i))
+ CPU_SET(i, &mask);
+
+ if (sched_setaffinity(0, sizeof(mask), &mask))
+ TC_LOG_ERROR(LOG_FILTER_AUTHSERVER, "Can't set used processors (hex): %x, error: %s", affinity, strerror(errno));
+ else
+ {
+ CPU_ZERO(&mask);
+ sched_getaffinity(0, sizeof(mask), &mask);
+ TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "Using processors (bitmask, hex): %x", *(uint32*)(&mask));
}
}
+
+ if (highPriority)
+ {
+ if (setpriority(PRIO_PROCESS, 0, PROCESS_HIGH_PRIORITY))
+ TC_LOG_ERROR(LOG_FILTER_AUTHSERVER, "Can't set authserver process priority class, error: %s", strerror(errno));
+ else
+ TC_LOG_INFO(LOG_FILTER_AUTHSERVER, "authserver process priority class set to %i", getpriority(PRIO_PROCESS, 0));
+ }
+
#endif
// maximum counter for next ping
diff --git a/src/server/authserver/authserver.conf.dist b/src/server/authserver/authserver.conf.dist
index dda19c3b849..0a50601f86d 100644
--- a/src/server/authserver/authserver.conf.dist
+++ b/src/server/authserver/authserver.conf.dist
@@ -71,7 +71,9 @@ PidFile = ""
#
# UseProcessors
-# Description: Processors mask for Windows based multi-processor systems.
+# Description: Processors mask for Windows and Linux based multi-processor systems.
+# Example: A computer with 2 CPUs:
+# 1 - 1st CPU only, 2 - 2nd CPU only, 3 - 1st and 2nd CPU, because 1 | 2 is 3
# Default: 0 - (Selected by OS)
# 1+ - (Bit mask value of selected processors)
@@ -79,7 +81,8 @@ UseProcessors = 0
#
# ProcessPriority
-# Description: Process priority setting for Windows based systems.
+# Description: Process priority setting for Windows and Linux based systems.
+# Details: On Linux, a nice value of -15 is used. On Windows, process is set to HIGH class.
# Default: 1 - (High)
# 0 - (Normal)
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 5ffc7053ddb..5b535fc99a2 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -469,9 +469,9 @@ void AddSC_boss_toravon();
void AddSC_instance_archavon();
void AddSC_boss_trollgore(); //Drak'Tharon Keep
void AddSC_boss_novos();
-void AddSC_boss_dred();
+void AddSC_boss_king_dred();
void AddSC_boss_tharon_ja();
-void AddSC_instance_drak_tharon();
+void AddSC_instance_drak_tharon_keep();
void AddSC_boss_cyanigosa(); //Violet Hold
void AddSC_boss_erekem();
void AddSC_boss_ichoron();
@@ -1215,9 +1215,9 @@ void AddNorthrendScripts()
AddSC_instance_archavon();
AddSC_boss_trollgore(); //Drak'Tharon Keep
AddSC_boss_novos();
- AddSC_boss_dred();
+ AddSC_boss_king_dred();
AddSC_boss_tharon_ja();
- AddSC_instance_drak_tharon();
+ AddSC_instance_drak_tharon_keep();
AddSC_boss_cyanigosa(); //Violet Hold
AddSC_boss_erekem();
AddSC_boss_ichoron();
diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt
index 674c35836a2..e04a4c43479 100644
--- a/src/server/scripts/Northrend/CMakeLists.txt
+++ b/src/server/scripts/Northrend/CMakeLists.txt
@@ -193,7 +193,7 @@ set(scripts_STAT_SRCS
Northrend/DraktharonKeep/boss_novos.cpp
Northrend/DraktharonKeep/drak_tharon_keep.h
Northrend/DraktharonKeep/boss_tharon_ja.cpp
- Northrend/DraktharonKeep/boss_dred.cpp
+ Northrend/DraktharonKeep/boss_king_dred.cpp
)
message(" -> Prepared: Northrend")
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp
index 34ced66c8be..f8f0752184e 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp
@@ -27,128 +27,54 @@ enum Spells
{
SPELL_BELLOWING_ROAR = 22686, // fears the group, can be resisted/dispelled
SPELL_GRIEVOUS_BITE = 48920,
- SPELL_MANGLING_SLASH = 48873, //casted on the current tank, adds debuf
+ SPELL_MANGLING_SLASH = 48873, // casted on the current tank, adds debuf
SPELL_FEARSOME_ROAR = 48849,
- H_SPELL_FEARSOME_ROAR = 59422, //Not stacking, debuff
- SPELL_PIERCING_SLASH = 48878, //debuff -->Armor reduced by 75%
- SPELL_RAPTOR_CALL = 59416, //dummy
+ SPELL_PIERCING_SLASH = 48878, // debuff --> Armor reduced by 75%
+ SPELL_RAPTOR_CALL = 59416, // dummy
SPELL_GUT_RIP = 49710,
SPELL_REND = 13738
};
-enum Creatures
+enum Misc
{
- NPC_RAPTOR_1 = 26641,
- NPC_RAPTOR_2 = 26628
+ ACTION_RAPTOR_KILLED = 1,
+ DATA_RAPTORS_KILLED = 2
};
-enum Misc
+enum Events
{
- ACTION_RAPTOR_KILLED = 1,
- DATA_KING_DRED = 2
+ EVENT_BELLOWING_ROAR = 1,
+ EVENT_GRIEVOUS_BITE,
+ EVENT_MANGLING_SLASH,
+ EVENT_FEARSOME_ROAR,
+ EVENT_PIERCING_SLASH,
+ EVENT_RAPTOR_CALL
};
-class boss_dred : public CreatureScript
+class boss_king_dred : public CreatureScript
{
public:
- boss_dred() : CreatureScript("boss_dred") { }
+ boss_king_dred() : CreatureScript("boss_king_dred") { }
- struct boss_dredAI : public ScriptedAI
+ struct boss_king_dredAI : public BossAI
{
- boss_dredAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = me->GetInstanceScript();
- }
-
- uint32 uiBellowingRoarTimer;
- uint32 uiGrievousBiteTimer;
- uint32 uiManglingSlashTimer;
- uint32 uiFearsomeRoarTimer;
- uint32 uiPiercingSlashTimer;
- uint32 uiRaptorCallTimer;
- uint8 raptorsKilled;
-
- InstanceScript* instance;
+ boss_king_dredAI(Creature* creature) : BossAI(creature, DATA_KING_DRED) { }
void Reset() OVERRIDE
{
- if (instance)
- instance->SetData(DATA_DRED_EVENT, NOT_STARTED);
-
- uiBellowingRoarTimer = 33000;
- uiGrievousBiteTimer = 20000;
- uiManglingSlashTimer = 18500;
- uiFearsomeRoarTimer = urand(10000, 20000);
- uiPiercingSlashTimer = 17000;
- uiRaptorCallTimer = urand(20000, 25000);
+ _Reset();
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
- if (instance)
- instance->SetData(DATA_DRED_EVENT, IN_PROGRESS);
- }
-
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
-
- if (uiBellowingRoarTimer <= diff)
- {
- DoCastAOE(SPELL_BELLOWING_ROAR, false);
- uiBellowingRoarTimer = 40000;
- }
- else
- uiBellowingRoarTimer -=diff;
-
- if (uiGrievousBiteTimer <= diff)
- {
- DoCastVictim(SPELL_GRIEVOUS_BITE, false);
- uiGrievousBiteTimer = 20000;
- }
- else
- uiGrievousBiteTimer -= diff;
-
- if (uiManglingSlashTimer <= diff)
- {
- DoCastVictim(SPELL_MANGLING_SLASH, false);
- uiManglingSlashTimer = 20000;
- }
- else
- uiManglingSlashTimer -= diff;
-
- if (uiFearsomeRoarTimer <= diff)
- {
- DoCastAOE(SPELL_FEARSOME_ROAR, false);
- uiFearsomeRoarTimer = urand(16000, 18000);
- }
- else
- uiFearsomeRoarTimer -= diff;
-
- if (uiPiercingSlashTimer <= diff)
- {
- DoCastVictim(SPELL_PIERCING_SLASH, false);
- uiPiercingSlashTimer = 20000;
- }
- else
- uiPiercingSlashTimer -= diff;
-
- if (uiRaptorCallTimer <= diff)
- {
- DoCastVictim(SPELL_RAPTOR_CALL, false);
-
- float x, y, z;
-
- me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, 10.0f);
- me->SummonCreature(RAND(NPC_RAPTOR_1, NPC_RAPTOR_2), x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1000);
-
- uiRaptorCallTimer = urand(20000, 25000);
- }
- else
- uiRaptorCallTimer -= diff;
-
- DoMeleeAttackIfReady();
+ _EnterCombat();
+
+ events.ScheduleEvent(EVENT_BELLOWING_ROAR, 33000);
+ events.ScheduleEvent(EVENT_GRIEVOUS_BITE, 20000);
+ events.ScheduleEvent(EVENT_MANGLING_SLASH, 18500);
+ events.ScheduleEvent(EVENT_FEARSOME_ROAR, urand(10000, 20000));
+ events.ScheduleEvent(EVENT_PIERCING_SLASH, 17000);
+ events.ScheduleEvent(EVENT_RAPTOR_CALL, urand(20000, 25000));
}
void DoAction(int32 action) OVERRIDE
@@ -159,7 +85,7 @@ class boss_dred : public CreatureScript
uint32 GetData(uint32 type) const OVERRIDE
{
- if (type == DATA_KING_DRED)
+ if (type == DATA_RAPTORS_KILLED)
return raptorsKilled;
return 0;
@@ -167,14 +93,67 @@ class boss_dred : public CreatureScript
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (instance)
- instance->SetData(DATA_DRED_EVENT, DONE);
+ _JustDied();
}
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_BELLOWING_ROAR:
+ DoCastAOE(SPELL_BELLOWING_ROAR);
+ events.ScheduleEvent(EVENT_BELLOWING_ROAR, 33000);
+ break;
+ case EVENT_GRIEVOUS_BITE:
+ DoCastVictim(SPELL_GRIEVOUS_BITE);
+ events.ScheduleEvent(EVENT_GRIEVOUS_BITE, 20000);
+ break;
+ case EVENT_MANGLING_SLASH:
+ DoCastVictim(SPELL_MANGLING_SLASH);
+ events.ScheduleEvent(EVENT_MANGLING_SLASH, 18500);
+ break;
+ case EVENT_FEARSOME_ROAR:
+ DoCastAOE(SPELL_FEARSOME_ROAR);
+ events.ScheduleEvent(EVENT_FEARSOME_ROAR, urand(10000, 20000));
+ break;
+ case EVENT_PIERCING_SLASH:
+ DoCastVictim(SPELL_PIERCING_SLASH);
+ events.ScheduleEvent(EVENT_PIERCING_SLASH, 17000);
+ break;
+ case EVENT_RAPTOR_CALL:
+ DoCastVictim(SPELL_RAPTOR_CALL);
+
+ float x, y, z;
+
+ me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, 10.0f);
+ me->SummonCreature(RAND(NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1000);
+ events.ScheduleEvent(EVENT_RAPTOR_CALL, urand(20000, 25000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ uint8 raptorsKilled;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_dredAI(creature);
+ return GetDrakTharonKeepAI<boss_king_dredAI>(creature);
}
};
@@ -217,14 +196,14 @@ class npc_drakkari_gutripper : public CreatureScript
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (Creature* Dred = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DRED)))
+ if (Creature* Dred = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KING_DRED)))
Dred->AI()->DoAction(ACTION_RAPTOR_KILLED);
}
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new npc_drakkari_gutripperAI(creature);
+ return GetDrakTharonKeepAI<npc_drakkari_gutripperAI>(creature);
}
};
@@ -267,14 +246,14 @@ class npc_drakkari_scytheclaw : public CreatureScript
void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (Creature* Dred = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DRED)))
+ if (Creature* Dred = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KING_DRED)))
Dred->AI()->DoAction(ACTION_RAPTOR_KILLED);
}
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new npc_drakkari_scytheclawAI(creature);
+ return GetDrakTharonKeepAI<npc_drakkari_scytheclawAI>(creature);
}
};
@@ -291,17 +270,17 @@ class achievement_king_dred : public AchievementCriteriaScript
return false;
if (Creature* Dred = target->ToCreature())
- if (Dred->AI()->GetData(DATA_KING_DRED) >= 6)
+ if (Dred->AI()->GetData(DATA_RAPTORS_KILLED) >= 6)
return true;
return false;
}
};
-void AddSC_boss_dred()
+void AddSC_boss_king_dred()
{
- new boss_dred;
- new npc_drakkari_gutripper;
- new npc_drakkari_scytheclaw;
+ new boss_king_dred();
+ new npc_drakkari_gutripper();
+ new npc_drakkari_scytheclaw();
new achievement_king_dred();
}
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
index 120d52a3050..785038137d9 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
@@ -32,8 +32,7 @@ enum Misc
enum Creatures
{
- NPC_CRYSTAL_CHANNEL_TARGET = 26712,
- NPC_FETID_TROLL_CORPSE = 27597,
+ NPC_FETID_TROLL_CORPSE = 27598,
NPC_RISEN_SHADOWCASTER = 27600,
NPC_HULKING_CORPSE = 27597
};
@@ -77,13 +76,11 @@ public:
struct boss_novosAI : public BossAI
{
- boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS_EVENT) {}
+ boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS) { }
void Reset() OVERRIDE
{
- events.Reset();
- summons.DespawnAll();
- instance->SetData(DATA_NOVOS_EVENT, NOT_STARTED);
+ _Reset();
_ohNovos = true;
_crystalHandlerCount = 0;
@@ -94,9 +91,7 @@ public:
void EnterCombat(Unit* /* victim */) OVERRIDE
{
- me->setActive(true);
- DoZoneInCombat();
- instance->SetData(DATA_NOVOS_EVENT, IN_PROGRESS);
+ _EnterCombat();
SetCrystalsStatus(true);
SetSummonerStatus(true);
@@ -148,7 +143,6 @@ public:
}
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
BossAI::MoveInLineOfSight(who);
@@ -260,7 +254,7 @@ public:
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_novosAI(creature);
+ return GetDrakTharonKeepAI<boss_novosAI>(creature);
}
};
@@ -323,7 +317,7 @@ public:
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new npc_crystal_channel_targetAI(creature);
+ return GetDrakTharonKeepAI<npc_crystal_channel_targetAI>(creature);
}
};
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
index 63b23eb594e..e090f3db7c0 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
@@ -95,16 +95,13 @@ public:
uiShadowVolleyTimer = urand(8*IN_MILLISECONDS, 10*IN_MILLISECONDS);
Phase = SKELETAL;
me->SetDisplayId(me->GetNativeDisplayId());
- if (instance)
- instance->SetData(DATA_THARON_JA_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_THARON_JA, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
Talk(SAY_AGGRO);
-
- if (instance)
- instance->SetData(DATA_THARON_JA_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_THARON_JA, IN_PROGRESS);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -239,14 +236,14 @@ public:
DoCast(me, SPELL_ACHIEVEMENT_CHECK);
- instance->SetData(DATA_THARON_JA_EVENT, DONE);
+ instance->SetBossState(DATA_THARON_JA, DONE);
}
}
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_tharon_jaAI(creature);
+ return GetDrakTharonKeepAI<boss_tharon_jaAI>(creature);
}
};
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
index f0e72d16f58..d126340ef51 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
@@ -99,16 +99,13 @@ public:
me->RemoveAura(DUNGEON_MODE(SPELL_CONSUME_AURA, H_SPELL_CONSUME_AURA));
- if (instance)
- instance->SetData(DATA_TROLLGORE_EVENT, NOT_STARTED);
+ instance->SetData(DATA_TROLLGORE, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
Talk(SAY_AGGRO);
-
- if (instance)
- instance->SetData(DATA_TROLLGORE_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_TROLLGORE, IN_PROGRESS);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -167,8 +164,7 @@ public:
lSummons.DespawnAll();
- if (instance)
- instance->SetData(DATA_TROLLGORE_EVENT, DONE);
+ instance->SetBossState(DATA_TROLLGORE, DONE);
}
uint32 GetData(uint32 type) const OVERRIDE
@@ -197,7 +193,7 @@ public:
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_trollgoreAI(creature);
+ return GetDrakTharonKeepAI<boss_trollgoreAI>(creature);
}
};
diff --git a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
index e17cba4bccd..cc0fb9a0090 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
+++ b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
@@ -15,22 +15,26 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_DRAK_THARON_H
-#define DEF_DRAK_THARON_H
-enum Data
-{
- DATA_TROLLGORE_EVENT,
- DATA_NOVOS_EVENT,
- DATA_DRED_EVENT,
- DATA_THARON_JA_EVENT,
- DATA_KING_DRED_ACHIEV
-};
-enum Data64
+#ifndef DRAK_THARON_KEEP_H_
+#define DRAK_THARON_KEEP_H_
+
+#include "Map.h"
+#include "Creature.h"
+
+#define DrakTharonKeepScriptName "instance_drak_tharon_keep"
+
+uint32 const EncounterCount = 4;
+
+enum DataTypes
{
- DATA_TROLLGORE,
- DATA_NOVOS,
- DATA_DRED,
- DATA_THARON_JA,
+ // Encounter States/Boss GUIDs
+ DATA_TROLLGORE = 0,
+ DATA_NOVOS = 1,
+ DATA_KING_DRED = 2,
+ DATA_THARON_JA = 3,
+
+ // Additional data
+ //DATA_KING_DRED_ACHIEV,
DATA_NOVOS_CRYSTAL_1,
DATA_NOVOS_CRYSTAL_2,
@@ -43,4 +47,39 @@ enum Data64
ACTION_CRYSTAL_HANDLER_DIED
};
-#endif
+
+enum CreatureIds
+{
+ NPC_TROLLGORE = 26630,
+ NPC_NOVOS = 26631,
+ NPC_KING_DRED = 27483,
+ NPC_THARON_JA = 26632,
+
+ // Novos
+ NPC_CRYSTAL_CHANNEL_TARGET = 26712,
+ NPC_CRYSTAL_HANDLER = 26627,
+
+ // King Dred
+ NPC_DRAKKARI_GUTRIPPER = 26641,
+ NPC_DRAKKARI_SCYTHECLAW = 26628
+};
+
+enum GameObjectIds
+{
+ GO_NOVOS_CRYSTAL_1 = 189299,
+ GO_NOVOS_CRYSTAL_2 = 189300,
+ GO_NOVOS_CRYSTAL_3 = 189301,
+ GO_NOVOS_CRYSTAL_4 = 189302
+};
+
+template<class AI>
+AI* GetDrakTharonKeepAI(Creature* creature)
+{
+ if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
+ if (instance->GetInstanceScript())
+ if (instance->GetScriptId() == sObjectMgr->GetScriptId(DrakTharonKeepScriptName))
+ return new AI(creature);
+ return NULL;
+}
+
+#endif // DRAK_THARON_KEEP_H_
diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
index 61dfced65ed..ed7647be89c 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
@@ -20,279 +20,185 @@
#include "InstanceScript.h"
#include "drak_tharon_keep.h"
-#define MAX_ENCOUNTER 4
-
-/* Drak'Tharon Keep encounters:
-0 - Trollgore
-1 - Novos
-2 - King Dred
-3 - Tharon Ja
-*/
-
-enum Creatures
-{
- NPC_TROLLGORE = 26630,
- NPC_NOVOS = 26631,
- NPC_KING_DRED = 27483,
- NPC_THARON_JA = 26632,
- NPC_CRYSTAL_CHANNEL_TARGET = 26712,
- NPC_CRYSTAL_HANDLER = 26627
-};
-enum GameObjects
+class instance_drak_tharon_keep : public InstanceMapScript
{
- GO_NOVOS_CRYSTAL_1 = 189299,
- GO_NOVOS_CRYSTAL_2 = 189300,
- GO_NOVOS_CRYSTAL_3 = 189301,
- GO_NOVOS_CRYSTAL_4 = 189302
-};
-enum Achievements
-{
- ACM_CRITERIA_OH_NOVOS = 7361
-};
-
-class instance_drak_tharon : public InstanceMapScript
-{
-public:
- instance_drak_tharon() : InstanceMapScript("instance_drak_tharon", 600) { }
-
- struct instance_drak_tharon_InstanceScript : public InstanceScript
- {
- instance_drak_tharon_InstanceScript(Map* map) : InstanceScript(map) {}
-
- uint8 dredAchievCounter;
-
- uint64 trollgoreGUID;
- uint64 novosGUID;
- uint64 dredGUID;
- uint64 tharonJaGUID;
-
- uint64 novosCrystalGUID1;
- uint64 novosCrystalGUID2;
- uint64 novosCrystalGUID3;
- uint64 novosCrystalGUID4;
-
- uint64 novosSummonerGUID1;
- uint64 novosSummonerGUID2;
- uint64 novosSummonerGUID3;
- uint64 novosSummonerGUID4;
-
- uint16 m_auiEncounter[MAX_ENCOUNTER];
+ public:
+ instance_drak_tharon_keep() : InstanceMapScript(DrakTharonKeepScriptName, 600) { }
- std::string str_data;
-
- void Initialize()
- {
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
-
- dredAchievCounter = 0;
-
- trollgoreGUID = 0;
- novosGUID = 0;
- dredGUID = 0;
- tharonJaGUID = 0;
-
- novosCrystalGUID1 = 0;
- novosCrystalGUID2 = 0;
- novosCrystalGUID3 = 0;
- novosCrystalGUID4 = 0;
-
- novosSummonerGUID1 = 0;
- novosSummonerGUID2 = 0;
- novosSummonerGUID3 = 0;
- novosSummonerGUID4 = 0;
- }
-
- bool IsEncounterInProgress() const
+ struct instance_drak_tharon_keep_InstanceScript : public InstanceScript
{
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
+ instance_drak_tharon_keep_InstanceScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
- return false;
- }
+ TrollgoreGUID = 0;
+ NovosGUID = 0;
+ KingDredGUID = 0;
+ TharonJaGUID = 0;
- void OnGameObjectCreate(GameObject* go)
- {
- switch (go->GetEntry())
- {
- case GO_NOVOS_CRYSTAL_1:
- novosCrystalGUID1 = go->GetGUID();
- go->SetGoState(GO_STATE_READY);
- break;
- case GO_NOVOS_CRYSTAL_2:
- novosCrystalGUID2 = go->GetGUID();
- go->SetGoState(GO_STATE_READY);
- break;
- case GO_NOVOS_CRYSTAL_3:
- novosCrystalGUID3 = go->GetGUID();
- go->SetGoState(GO_STATE_READY);
- break;
- case GO_NOVOS_CRYSTAL_4:
- novosCrystalGUID4 = go->GetGUID();
- go->SetGoState(GO_STATE_READY);
- break;
+ memset(NovosCrystalGUIDs, 0, 4 * sizeof(uint64));
+ memset(NovosSummonerGUIDs, 0, 4 * sizeof(uint64));
}
- }
- void OnCreatureCreate(Creature* creature)
- {
- switch (creature->GetEntry())
+ void OnCreatureCreate(Creature* creature)
{
- case NPC_TROLLGORE:
- trollgoreGUID = creature->GetGUID();
- break;
- case NPC_NOVOS:
- novosGUID = creature->GetGUID();
- break;
- case NPC_KING_DRED:
- dredGUID = creature->GetGUID();
- break;
- case NPC_THARON_JA:
- tharonJaGUID = creature->GetGUID();
- break;
- case NPC_CRYSTAL_CHANNEL_TARGET:
- InitializeNovosSummoner(creature);
- break;
+ switch (creature->GetEntry())
+ {
+ case NPC_TROLLGORE:
+ TrollgoreGUID = creature->GetGUID();
+ break;
+ case NPC_NOVOS:
+ NovosGUID = creature->GetGUID();
+ break;
+ case NPC_KING_DRED:
+ KingDredGUID = creature->GetGUID();
+ break;
+ case NPC_THARON_JA:
+ TharonJaGUID = creature->GetGUID();
+ break;
+ case NPC_CRYSTAL_CHANNEL_TARGET:
+ InitializeNovosSummoner(creature);
+ break;
+ default:
+ break;
+ }
}
- }
-
- void InitializeNovosSummoner(Creature* creature)
- {
- float x = creature->GetPositionX();
- float y = creature->GetPositionY();
- float z = creature->GetPositionZ();
-
- if (x < -374.0f && x > -379.0f && y > -820.0f && y < -815.0f && z < 60.0f && z > 58.0f)
- novosSummonerGUID1 = creature->GetGUID();
- else if (x < -379.0f && x > -385.0f && y > -820.0f && y < -815.0f && z < 60.0f && z > 58.0f)
- novosSummonerGUID2 = creature->GetGUID();
- else if (x < -374.0f && x > -385.0f && y > -827.0f && y < -820.0f && z < 60.0f && z > 58.0f)
- novosSummonerGUID3 = creature->GetGUID();
- else if (x < -338.0f && x > -344.0f && y > -727.0f && y < 721.0f && z < 30.0f && z > 26.0f)
- novosSummonerGUID4 = creature->GetGUID();
- }
- uint64 GetData64(uint32 identifier) const OVERRIDE
- {
- switch (identifier)
+ void OnGameObjectCreate(GameObject* go)
{
- case DATA_TROLLGORE: return trollgoreGUID;
- case DATA_NOVOS: return novosGUID;
- case DATA_DRED: return dredGUID;
- case DATA_THARON_JA: return tharonJaGUID;
- case DATA_NOVOS_CRYSTAL_1: return novosCrystalGUID1;
- case DATA_NOVOS_CRYSTAL_2: return novosCrystalGUID2;
- case DATA_NOVOS_CRYSTAL_3: return novosCrystalGUID3;
- case DATA_NOVOS_CRYSTAL_4: return novosCrystalGUID4;
- case DATA_NOVOS_SUMMONER_1: return novosSummonerGUID1;
- case DATA_NOVOS_SUMMONER_2: return novosSummonerGUID2;
- case DATA_NOVOS_SUMMONER_3: return novosSummonerGUID3;
- case DATA_NOVOS_SUMMONER_4: return novosSummonerGUID4;
+ switch (go->GetEntry())
+ {
+ case GO_NOVOS_CRYSTAL_1:
+ NovosCrystalGUIDs[0] = go->GetGUID();
+ go->SetGoState(GO_STATE_READY);
+ break;
+ case GO_NOVOS_CRYSTAL_2:
+ NovosCrystalGUIDs[1] = go->GetGUID();
+ go->SetGoState(GO_STATE_READY);
+ break;
+ case GO_NOVOS_CRYSTAL_3:
+ NovosCrystalGUIDs[2] = go->GetGUID();
+ go->SetGoState(GO_STATE_READY);
+ break;
+ case GO_NOVOS_CRYSTAL_4:
+ NovosCrystalGUIDs[3] = go->GetGUID();
+ go->SetGoState(GO_STATE_READY);
+ break;
+ default:
+ break;
+ }
}
- return 0;
- }
-
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- switch (type)
+ void InitializeNovosSummoner(Creature* creature)
{
- case DATA_TROLLGORE_EVENT:
- m_auiEncounter[0] = data;
- break;
- case DATA_NOVOS_EVENT:
- m_auiEncounter[1] = data;
- break;
- case DATA_DRED_EVENT:
- m_auiEncounter[2] = data;
- break;
- case DATA_THARON_JA_EVENT:
- m_auiEncounter[3] = data;
- break;
-
- case DATA_KING_DRED_ACHIEV:
- dredAchievCounter = data;
- break;
+ float x = creature->GetPositionX();
+ float y = creature->GetPositionY();
+ float z = creature->GetPositionZ();
+
+ if (x < -374.0f && x > -379.0f && y > -820.0f && y < -815.0f && z < 60.0f && z > 58.0f)
+ NovosCrystalGUIDs[0] = creature->GetGUID();
+ else if (x < -379.0f && x > -385.0f && y > -820.0f && y < -815.0f && z < 60.0f && z > 58.0f)
+ NovosCrystalGUIDs[1] = creature->GetGUID();
+ else if (x < -374.0f && x > -385.0f && y > -827.0f && y < -820.0f && z < 60.0f && z > 58.0f)
+ NovosCrystalGUIDs[2] = creature->GetGUID();
+ else if (x < -338.0f && x > -344.0f && y > -727.0f && y < 721.0f && z < 30.0f && z > 26.0f)
+ NovosCrystalGUIDs[3] = creature->GetGUID();
}
- if (data == DONE)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- SaveToDB();
+ switch (type)
+ {
+ case DATA_TROLLGORE:
+ return TrollgoreGUID;
+ case DATA_NOVOS:
+ return NovosGUID;
+ case DATA_KING_DRED:
+ return KingDredGUID;
+ case DATA_THARON_JA:
+ return TharonJaGUID;
+ case DATA_NOVOS_CRYSTAL_1:
+ case DATA_NOVOS_CRYSTAL_2:
+ case DATA_NOVOS_CRYSTAL_3:
+ case DATA_NOVOS_CRYSTAL_4:
+ return NovosCrystalGUIDs[type - DATA_NOVOS_CRYSTAL_1];
+ case DATA_NOVOS_SUMMONER_1:
+ case DATA_NOVOS_SUMMONER_2:
+ case DATA_NOVOS_SUMMONER_3:
+ case DATA_NOVOS_SUMMONER_4:
+ return NovosSummonerGUIDs[type - DATA_NOVOS_SUMMONER_1];
+ }
+
+ return 0;
}
- }
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
+ void OnUnitDeath(Unit* unit)
{
- case DATA_TROLLGORE_EVENT: return m_auiEncounter[0];
- case DATA_NOVOS_EVENT: return m_auiEncounter[1];
- case DATA_DRED_EVENT: return m_auiEncounter[2];
- case DATA_THARON_JA_EVENT: return m_auiEncounter[3];
- case DATA_KING_DRED_ACHIEV: return dredAchievCounter;
+ if (unit->GetEntry() == NPC_CRYSTAL_HANDLER)
+ if (Creature* novos = instance->GetCreature(NovosGUID))
+ novos->AI()->DoAction(ACTION_CRYSTAL_HANDLER_DIED);
}
- return 0;
- }
- std::string GetSaveData()
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "D K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
- << m_auiEncounter[2] << ' ' << m_auiEncounter[3];
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
+ std::ostringstream saveStream;
+ saveStream << "D K " << GetBossSaveData();
- void OnUnitDeath(Unit* unit)
- {
- if (unit->GetEntry() == NPC_CRYSTAL_HANDLER)
- if (novosGUID)
- if (Creature* novos = instance->GetCreature(novosGUID))
- novos->AI()->DoAction(ACTION_CRYSTAL_HANDLER_DIED);
- }
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
- void Load(const char* in)
- {
- if (!in)
+ void Load(char const* str)
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'D' && dataHead2 == 'K')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
}
- OUT_LOAD_INST_DATA(in);
-
- char dataHead1, dataHead2;
- uint16 data0, data1, data2, data3;
+ protected:
+ uint64 TrollgoreGUID;
+ uint64 NovosGUID;
+ uint64 KingDredGUID;
+ uint64 TharonJaGUID;
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
-
- if (dataHead1 == 'D' && dataHead2 == 'K')
- {
- m_auiEncounter[0] = data0;
- m_auiEncounter[1] = data1;
- m_auiEncounter[2] = data2;
- m_auiEncounter[3] = data3;
+ uint64 NovosCrystalGUIDs[4];
+ uint64 NovosSummonerGUIDs[4];
+ };
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
- } else OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_drak_tharon_keep_InstanceScript(map);
}
- };
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_drak_tharon_InstanceScript(map);
- }
};
-void AddSC_instance_drak_tharon()
+void AddSC_instance_drak_tharon_keep()
{
- new instance_drak_tharon;
+ new instance_drak_tharon_keep();
}
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index 478473bf89e..0e011d6c99f 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -95,7 +95,7 @@ class spell_item_aegis_of_preservation : public SpellScriptLoader
return true;
}
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
{
PreventDefaultAction();
GetTarget()->CastSpell(GetTarget(), SPELL_AEGIS_HEAL, true, NULL, aurEff);
@@ -279,7 +279,7 @@ class spell_item_desperate_defense : public SpellScriptLoader
return true;
}
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
{
PreventDefaultAction();
GetTarget()->CastSpell(GetTarget(), SPELL_DESPERATE_RAGE, true, NULL, aurEff);
diff --git a/src/server/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp
index 361af453712..e136269e2a0 100644
--- a/src/server/worldserver/CommandLine/CliRunnable.cpp
+++ b/src/server/worldserver/CommandLine/CliRunnable.cpp
@@ -39,7 +39,7 @@
#include <readline/readline.h>
#include <readline/history.h>
-char * command_finder(const char* text, int state)
+char* command_finder(const char* text, int state)
{
static int idx, len;
const char* ret;
@@ -70,19 +70,18 @@ char * command_finder(const char* text, int state)
return ((char*)NULL);
}
-char ** cli_completion(const char * text, int start, int /*end*/)
+char** cli_completion(const char* text, int start, int /*end*/)
{
- char ** matches;
- matches = (char**)NULL;
+ char** matches = NULL;
- if (start == 0)
- matches = rl_completion_matches((char*)text, &command_finder);
- else
+ if (start)
rl_bind_key('\t', rl_abort);
- return (matches);
+ else
+ matches = rl_completion_matches((char*)text, &command_finder);
+ return matches;
}
-int cli_hook_func(void)
+int cli_hook_func()
{
if (World::IsStopped())
rl_done = 1;
diff --git a/src/server/worldserver/CommandLine/CliRunnable.h b/src/server/worldserver/CommandLine/CliRunnable.h
index bd14413ef2e..6e608f60881 100644
--- a/src/server/worldserver/CommandLine/CliRunnable.h
+++ b/src/server/worldserver/CommandLine/CliRunnable.h
@@ -27,7 +27,9 @@
class CliRunnable : public ACE_Based::Runnable
{
public:
- void run();
+ void run() OVERRIDE;
};
+
#endif
+
/// @}
diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp
index 33ece8197f8..61aaf5f2ee9 100644
--- a/src/server/worldserver/Main.cpp
+++ b/src/server/worldserver/Main.cpp
@@ -33,7 +33,7 @@
#ifndef _TRINITY_CORE_CONFIG
# define _TRINITY_CORE_CONFIG "worldserver.conf"
-#endif //_TRINITY_CORE_CONFIG
+#endif
#ifdef _WIN32
#include "ServiceWin32.h"
@@ -56,7 +56,7 @@ LoginDatabaseWorkerPool LoginDatabase; ///< Accessor to the
uint32 realmID; ///< Id of the realm
/// Print out the usage string for this program on the console.
-void usage(const char *prog)
+void usage(const char* prog)
{
printf("Usage:\n");
printf(" %s [<options>]\n", prog);
@@ -70,14 +70,14 @@ void usage(const char *prog)
}
/// Launch the Trinity server
-extern int main(int argc, char **argv)
+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 )
+ while (c < argc)
{
- if (strcmp(argv[c], "-c") == 0)
+ if (!strcmp(argv[c], "-c"))
{
if (++c >= argc)
{
@@ -90,10 +90,7 @@ extern int main(int argc, char **argv)
}
#ifdef _WIN32
- ////////////
- //Services//
- ////////////
- if (strcmp(argv[c], "-s") == 0)
+ if (strcmp(argv[c], "-s") == 0) // Services
{
if (++c >= argc)
{
@@ -101,6 +98,7 @@ extern int main(int argc, char **argv)
usage(argv[0]);
return 1;
}
+
if (strcmp(argv[c], "install") == 0)
{
if (WinServiceInstall())
@@ -120,11 +118,9 @@ extern int main(int argc, char **argv)
return 1;
}
}
+
if (strcmp(argv[c], "--service") == 0)
- {
WinServiceRun();
- }
- ////
#endif
++c;
}
diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp
index 69b163b4a4b..6fd57179140 100644
--- a/src/server/worldserver/Master.cpp
+++ b/src/server/worldserver/Master.cpp
@@ -50,22 +50,28 @@
extern int m_ServiceStatus;
#endif
+#ifdef __linux__
+#include <sched.h>
+#include <sys/resource.h>
+#define PROCESS_HIGH_PRIORITY -15 // [-20, 19], default is 0
+#endif
+
/// Handle worldservers's termination signals
class WorldServerSignalHandler : public Trinity::SignalHandler
{
public:
- virtual void HandleSignal(int SigNum)
+ virtual void HandleSignal(int sigNum)
{
- switch (SigNum)
+ switch (sigNum)
{
case SIGINT:
World::StopNow(RESTART_EXIT_CODE);
break;
case SIGTERM:
- #ifdef _WIN32
+#ifdef _WIN32
case SIGBREAK:
if (m_ServiceStatus != 1)
- #endif /* _WIN32 */
+#endif
World::StopNow(SHUTDOWN_EXIT_CODE);
break;
}
@@ -74,33 +80,35 @@ class WorldServerSignalHandler : public Trinity::SignalHandler
class FreezeDetectorRunnable : public ACE_Based::Runnable
{
+private:
+ uint32 _loops;
+ uint32 _lastChange;
+ uint32 _delaytime;
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)
+
+ void run() OVERRIDE
{
if (!_delaytime)
return;
+
TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "Starting up anti-freeze thread (%u seconds max stuck time)...", _delaytime/1000);
- m_loops = 0;
- w_loops = 0;
- m_lastchange = 0;
- w_lastchange = 0;
+ _loops = 0;
+ _lastChange = 0;
while (!World::IsStopped())
{
ACE_Based::Thread::Sleep(1000);
uint32 curtime = getMSTime();
// normal work
- if (w_loops != World::m_worldLoopCounter)
+ if (_loops != World::m_worldLoopCounter)
{
- w_lastchange = curtime;
- w_loops = World::m_worldLoopCounter;
+ _lastChange = curtime;
+ _loops = World::m_worldLoopCounter;
}
// possible freeze
- else if (getMSTimeDiff(w_lastchange, curtime) > _delaytime)
+ else if (getMSTimeDiff(_lastChange, curtime) > _delaytime)
{
TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "World Thread hangs, kicking out server!");
ASSERT(false);
@@ -110,14 +118,6 @@ public:
}
};
-Master::Master()
-{
-}
-
-Master::~Master()
-{
-}
-
/// Main function
int Master::Run()
{
@@ -138,17 +138,16 @@ int Master::Run()
TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "http://TrinityCore.org \\/__/\n");
/// worldserver PID file creation
- std::string pidfile = sConfigMgr->GetStringDefault("PidFile", "");
- if (!pidfile.empty())
+ std::string pidFile = sConfigMgr->GetStringDefault("PidFile", "");
+ if (!pidFile.empty())
{
- uint32 pid = CreatePIDFile(pidfile);
- if (!pid)
+ if (uint32 pid = CreatePIDFile(pidFile))
+ TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "Daemon PID: %u\n", pid);
+ else
{
- TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Cannot create PID file %s.\n", pidfile.c_str());
+ TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Cannot create PID file %s.\n", pidFile.c_str());
return 1;
}
-
- TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "Daemon PID: %u\n", pid);
}
///- Start the databases
@@ -162,22 +161,22 @@ int Master::Run()
sWorld->SetInitialWorldSettings();
///- Initialize the signal handlers
- WorldServerSignalHandler SignalINT, SignalTERM;
+ WorldServerSignalHandler signalINT, signalTERM;
#ifdef _WIN32
- WorldServerSignalHandler SignalBREAK;
+ WorldServerSignalHandler signalBREAK;
#endif /* _WIN32 */
///- Register worldserver's signal handlers
- ACE_Sig_Handler Handler;
- Handler.register_handler(SIGINT, &SignalINT);
- Handler.register_handler(SIGTERM, &SignalTERM);
- #ifdef _WIN32
- Handler.register_handler(SIGBREAK, &SignalBREAK);
- #endif /* _WIN32 */
+ ACE_Sig_Handler handle;
+ handle.register_handler(SIGINT, &signalINT);
+ handle.register_handler(SIGTERM, &signalTERM);
+#ifdef _WIN32
+ handle.register_handler(SIGBREAK, &signalBREAK);
+#endif
///- Launch WorldRunnable thread
- ACE_Based::Thread world_thread(new WorldRunnable);
- world_thread.setPriority(ACE_Based::Highest);
+ ACE_Based::Thread worldThread(new WorldRunnable);
+ worldThread.setPriority(ACE_Based::Highest);
ACE_Based::Thread* cliThread = NULL;
@@ -191,41 +190,35 @@ int Master::Run()
cliThread = new ACE_Based::Thread(new CliRunnable);
}
- ACE_Based::Thread rar_thread(new RARunnable);
+ ACE_Based::Thread rarThread(new RARunnable);
- ///- Handle affinity for multiple processors and process priority on Windows
- #ifdef _WIN32
+ ///- Handle affinity for multiple processors and process priority
+ uint32 affinity = sConfigMgr->GetIntDefault("UseProcessors", 0);
+ bool highPriority = sConfigMgr->GetBoolDefault("ProcessPriority", false);
+
+#ifdef _WIN32 // Windows
{
HANDLE hProcess = GetCurrentProcess();
- uint32 Aff = sConfigMgr->GetIntDefault("UseProcessors", 0);
- if (Aff > 0)
+ if (affinity > 0)
{
ULONG_PTR appAff;
ULONG_PTR sysAff;
if (GetProcessAffinityMask(hProcess, &appAff, &sysAff))
{
- ULONG_PTR curAff = Aff & appAff; // remove non accessible processors
+ ULONG_PTR currentAffinity = affinity & appAff; // remove non accessible processors
- if (!curAff)
- {
- TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Processors marked in UseProcessors bitmask (hex) %x are not accessible for the worldserver. Accessible processors bitmask (hex): %x", Aff, appAff);
- }
+ if (!currentAffinity)
+ TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Processors marked in UseProcessors bitmask (hex) %x are not accessible for the worldserver. Accessible processors bitmask (hex): %x", affinity, appAff);
+ else if (SetProcessAffinityMask(hProcess, currentAffinity))
+ TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "Using processors (bitmask, hex): %x", currentAffinity);
else
- {
- if (SetProcessAffinityMask(hProcess, curAff))
- TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "Using processors (bitmask, hex): %x", curAff);
- else
- TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Can't set used processors (hex): %x", curAff);
- }
+ TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Can't set used processors (hex): %x", currentAffinity);
}
}
- bool Prio = sConfigMgr->GetBoolDefault("ProcessPriority", false);
-
- //if (Prio && (m_ServiceStatus == -1) /* need set to default process priority class in service mode*/)
- if (Prio)
+ if (highPriority)
{
if (SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS))
TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "worldserver process priority class set to HIGH");
@@ -233,31 +226,61 @@ int Master::Run()
TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Can't set worldserver process priority class.");
}
}
- #endif
+#elif __linux__ // Linux
+
+ if (affinity > 0)
+ {
+ cpu_set_t mask;
+ CPU_ZERO(&mask);
+
+ for (unsigned int i = 0; i < sizeof(affinity) * 8; ++i)
+ if (affinity & (1 << i))
+ CPU_SET(i, &mask);
+
+ if (sched_setaffinity(0, sizeof(mask), &mask))
+ TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Can't set used processors (hex): %x, error: %s", affinity, strerror(errno));
+ else
+ {
+ CPU_ZERO(&mask);
+ sched_getaffinity(0, sizeof(mask), &mask);
+ TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "Using processors (bitmask, hex): %x", *(uint32*)(&mask));
+ }
+ }
+
+ if (highPriority)
+ {
+ if (setpriority(PRIO_PROCESS, 0, PROCESS_HIGH_PRIORITY))
+ TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Can't set worldserver process priority class, error: %s", strerror(errno));
+ else
+ TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "worldserver process priority class set to %i", getpriority(PRIO_PROCESS, 0));
+ }
+
+#endif
+
//Start soap serving thread
- ACE_Based::Thread* soap_thread = NULL;
+ ACE_Based::Thread* soapThread = NULL;
if (sConfigMgr->GetBoolDefault("SOAP.Enabled", false))
{
TCSoapRunnable* runnable = new TCSoapRunnable();
- runnable->setListenArguments(sConfigMgr->GetStringDefault("SOAP.IP", "127.0.0.1"), uint16(sConfigMgr->GetIntDefault("SOAP.Port", 7878)));
- soap_thread = new ACE_Based::Thread(runnable);
+ runnable->SetListenArguments(sConfigMgr->GetStringDefault("SOAP.IP", "127.0.0.1"), uint16(sConfigMgr->GetIntDefault("SOAP.Port", 7878)));
+ soapThread = new ACE_Based::Thread(runnable);
}
///- Start up freeze catcher thread
- if (uint32 freeze_delay = sConfigMgr->GetIntDefault("MaxCoreStuckTime", 0))
+ if (uint32 freezeDelay = sConfigMgr->GetIntDefault("MaxCoreStuckTime", 0))
{
FreezeDetectorRunnable* fdr = new FreezeDetectorRunnable();
- fdr->SetDelayTime(freeze_delay * 1000);
- ACE_Based::Thread freeze_thread(fdr);
- freeze_thread.setPriority(ACE_Based::Highest);
+ fdr->SetDelayTime(freezeDelay * 1000);
+ ACE_Based::Thread freezeThread(fdr);
+ freezeThread.setPriority(ACE_Based::Highest);
}
///- Launch the world listener socket
- uint16 wsport = uint16(sWorld->getIntConfig(CONFIG_PORT_WORLD));
- std::string bind_ip = sConfigMgr->GetStringDefault("BindIP", "0.0.0.0");
+ uint16 worldPort = uint16(sWorld->getIntConfig(CONFIG_PORT_WORLD));
+ std::string bindIp = sConfigMgr->GetStringDefault("BindIP", "0.0.0.0");
- if (sWorldSocketMgr->StartNetwork(wsport, bind_ip.c_str()) == -1)
+ if (sWorldSocketMgr->StartNetwork(worldPort, bindIp.c_str()) == -1)
{
TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Failed to start network");
World::StopNow(ERROR_EXIT_CODE);
@@ -271,14 +294,14 @@ int Master::Run()
// when the main thread closes the singletons get unloaded
// since worldrunnable uses them, it will crash if unloaded after master
- world_thread.wait();
- rar_thread.wait();
+ worldThread.wait();
+ rarThread.wait();
- if (soap_thread)
+ if (soapThread)
{
- soap_thread->wait();
- soap_thread->destroy();
- delete soap_thread;
+ soapThread->wait();
+ soapThread->destroy();
+ delete soapThread;
}
// set server offline
@@ -298,7 +321,7 @@ int Master::Run()
// 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];
+ INPUT_RECORD b[4];
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
b[0].EventType = KEY_EVENT;
b[0].Event.KeyEvent.bKeyDown = TRUE;
@@ -354,78 +377,78 @@ bool Master::_StartDB()
{
MySQL::Library_Init();
- std::string dbstring;
- uint8 async_threads, synch_threads;
+ std::string dbString;
+ uint8 asyncThreads, synchThreads;
- dbstring = sConfigMgr->GetStringDefault("WorldDatabaseInfo", "");
- if (dbstring.empty())
+ dbString = sConfigMgr->GetStringDefault("WorldDatabaseInfo", "");
+ if (dbString.empty())
{
TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "World database not specified in configuration file");
return false;
}
- async_threads = uint8(sConfigMgr->GetIntDefault("WorldDatabase.WorkerThreads", 1));
- if (async_threads < 1 || async_threads > 32)
+ asyncThreads = uint8(sConfigMgr->GetIntDefault("WorldDatabase.WorkerThreads", 1));
+ if (asyncThreads < 1 || asyncThreads > 32)
{
TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "World database: invalid number of worker threads specified. "
"Please pick a value between 1 and 32.");
return false;
}
- synch_threads = uint8(sConfigMgr->GetIntDefault("WorldDatabase.SynchThreads", 1));
- ///- Initialise the world database
- if (!WorldDatabase.Open(dbstring, async_threads, synch_threads))
+ synchThreads = uint8(sConfigMgr->GetIntDefault("WorldDatabase.SynchThreads", 1));
+ ///- Initialize the world database
+ if (!WorldDatabase.Open(dbString, asyncThreads, synchThreads))
{
- TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Cannot connect to world database %s", dbstring.c_str());
+ TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Cannot connect to world database %s", dbString.c_str());
return false;
}
///- Get character database info from configuration file
- dbstring = sConfigMgr->GetStringDefault("CharacterDatabaseInfo", "");
- if (dbstring.empty())
+ dbString = sConfigMgr->GetStringDefault("CharacterDatabaseInfo", "");
+ if (dbString.empty())
{
TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Character database not specified in configuration file");
return false;
}
- async_threads = uint8(sConfigMgr->GetIntDefault("CharacterDatabase.WorkerThreads", 1));
- if (async_threads < 1 || async_threads > 32)
+ asyncThreads = uint8(sConfigMgr->GetIntDefault("CharacterDatabase.WorkerThreads", 1));
+ if (asyncThreads < 1 || asyncThreads > 32)
{
TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Character database: invalid number of worker threads specified. "
"Please pick a value between 1 and 32.");
return false;
}
- synch_threads = uint8(sConfigMgr->GetIntDefault("CharacterDatabase.SynchThreads", 2));
+ synchThreads = uint8(sConfigMgr->GetIntDefault("CharacterDatabase.SynchThreads", 2));
- ///- Initialise the Character database
- if (!CharacterDatabase.Open(dbstring, async_threads, synch_threads))
+ ///- Initialize the Character database
+ if (!CharacterDatabase.Open(dbString, asyncThreads, synchThreads))
{
- TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Cannot connect to Character database %s", dbstring.c_str());
+ TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Cannot connect to Character database %s", dbString.c_str());
return false;
}
///- Get login database info from configuration file
- dbstring = sConfigMgr->GetStringDefault("LoginDatabaseInfo", "");
- if (dbstring.empty())
+ dbString = sConfigMgr->GetStringDefault("LoginDatabaseInfo", "");
+ if (dbString.empty())
{
TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Login database not specified in configuration file");
return false;
}
- async_threads = uint8(sConfigMgr->GetIntDefault("LoginDatabase.WorkerThreads", 1));
- if (async_threads < 1 || async_threads > 32)
+ asyncThreads = uint8(sConfigMgr->GetIntDefault("LoginDatabase.WorkerThreads", 1));
+ if (asyncThreads < 1 || asyncThreads > 32)
{
TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Login database: invalid number of worker threads specified. "
"Please pick a value between 1 and 32.");
return false;
}
- synch_threads = uint8(sConfigMgr->GetIntDefault("LoginDatabase.SynchThreads", 1));
+ synchThreads = uint8(sConfigMgr->GetIntDefault("LoginDatabase.SynchThreads", 1));
///- Initialise the login database
- if (!LoginDatabase.Open(dbstring, async_threads, synch_threads))
+ if (!LoginDatabase.Open(dbString, asyncThreads, synchThreads))
{
- TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Cannot connect to login database %s", dbstring.c_str());
+ TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Cannot connect to login database %s", dbString.c_str());
return false;
}
diff --git a/src/server/worldserver/Master.h b/src/server/worldserver/Master.h
index 4f07c24e8f8..93b2387feec 100644
--- a/src/server/worldserver/Master.h
+++ b/src/server/worldserver/Master.h
@@ -29,8 +29,6 @@
class Master
{
public:
- Master();
- ~Master();
int Run();
private:
@@ -41,5 +39,7 @@ class Master
};
#define sMaster ACE_Singleton<Master, ACE_Null_Mutex>::instance()
+
#endif
+
/// @}
diff --git a/src/server/worldserver/RemoteAccess/RARunnable.cpp b/src/server/worldserver/RemoteAccess/RARunnable.cpp
index 465e605beac..1493df7aa2f 100644
--- a/src/server/worldserver/RemoteAccess/RARunnable.cpp
+++ b/src/server/worldserver/RemoteAccess/RARunnable.cpp
@@ -61,22 +61,20 @@ void RARunnable::run()
ACE_Acceptor<RASocket, ACE_SOCK_ACCEPTOR> acceptor;
- uint16 raport = uint16(sConfigMgr->GetIntDefault("Ra.Port", 3443));
- std::string stringip = sConfigMgr->GetStringDefault("Ra.IP", "0.0.0.0");
- ACE_INET_Addr listen_addr(raport, stringip.c_str());
+ uint16 raPort = uint16(sConfigMgr->GetIntDefault("Ra.Port", 3443));
+ std::string stringIp = sConfigMgr->GetStringDefault("Ra.IP", "0.0.0.0");
+ ACE_INET_Addr listenAddress(raPort, stringIp.c_str());
- if (acceptor.open(listen_addr, m_Reactor) == -1)
+ if (acceptor.open(listenAddress, m_Reactor) == -1)
{
- TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Trinity RA can not bind to port %d on %s", raport, stringip.c_str());
+ TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "Trinity RA can not bind to port %d on %s", raPort, stringIp.c_str());
return;
}
- TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "Starting Trinity RA on port %d on %s", raport, stringip.c_str());
+ TC_LOG_INFO(LOG_FILTER_WORLDSERVER, "Starting Trinity RA on port %d on %s", raPort, stringIp.c_str());
while (!World::IsStopped())
{
- // don't be too smart to move this outside the loop
- // the run_reactor_event_loop will modify interval
ACE_Time_Value interval(0, 100000);
if (m_Reactor->run_reactor_event_loop(interval) == -1)
break;
diff --git a/src/server/worldserver/RemoteAccess/RARunnable.h b/src/server/worldserver/RemoteAccess/RARunnable.h
index 6597e7c742f..a03e16e2154 100644
--- a/src/server/worldserver/RemoteAccess/RARunnable.h
+++ b/src/server/worldserver/RemoteAccess/RARunnable.h
@@ -31,7 +31,7 @@ class RARunnable : public ACE_Based::Runnable
public:
RARunnable();
virtual ~RARunnable();
- void run();
+ void run() OVERRIDE;
private:
ACE_Reactor* m_Reactor;
@@ -39,4 +39,5 @@ private:
};
#endif /* _TRINITY_RARUNNABLE_H_ */
+
/// @}
diff --git a/src/server/worldserver/RemoteAccess/RASocket.cpp b/src/server/worldserver/RemoteAccess/RASocket.cpp
index 3fd4e34e89e..a4d402286ed 100644
--- a/src/server/worldserver/RemoteAccess/RASocket.cpp
+++ b/src/server/worldserver/RemoteAccess/RASocket.cpp
@@ -36,26 +36,22 @@ RASocket::RASocket()
_commandExecuting = false;
}
-RASocket::~RASocket()
-{
-}
-
int RASocket::open(void *)
{
- ACE_INET_Addr remote_addr;
+ ACE_INET_Addr remoteAddress;
- if (peer().get_remote_addr(remote_addr) == -1)
+ if (peer().get_remote_addr(remoteAddress) == -1)
{
TC_LOG_ERROR(LOG_FILTER_WORLDSERVER, "RASocket::open: peer().get_remote_addr error is %s", ACE_OS::strerror(errno));
return -1;
}
- TC_LOG_INFO(LOG_FILTER_REMOTECOMMAND, "Incoming connection from %s", remote_addr.get_host_addr());
+ TC_LOG_INFO(LOG_FILTER_REMOTECOMMAND, "Incoming connection from %s", remoteAddress.get_host_addr());
return activate();
}
-int RASocket::handle_close(ACE_HANDLE, ACE_Reactor_Mask)
+int RASocket::handle_close(ACE_HANDLE /*handle*/, ACE_Reactor_Mask /*mask*/)
{
TC_LOG_INFO(LOG_FILTER_REMOTECOMMAND, "Closing connection");
peer().close_reader();
@@ -89,9 +85,7 @@ int RASocket::recv_line(ACE_Message_Block& buffer)
ssize_t n = peer().recv(&byte, sizeof(byte));
if (n < 0)
- {
return -1;
- }
if (n == 0)
{
@@ -110,8 +104,8 @@ int RASocket::recv_line(ACE_Message_Block& buffer)
return -1;
}
- const char null_term = '\0';
- if (buffer.copy(&null_term, sizeof(null_term)) == -1)
+ const char nullTerm = '\0';
+ if (buffer.copy(&nullTerm, sizeof(nullTerm)) == -1)
return -1;
return 0;
diff --git a/src/server/worldserver/RemoteAccess/RASocket.h b/src/server/worldserver/RemoteAccess/RASocket.h
index e92cb35eaf0..add23198bde 100644
--- a/src/server/worldserver/RemoteAccess/RASocket.h
+++ b/src/server/worldserver/RemoteAccess/RASocket.h
@@ -31,33 +31,34 @@
#include <ace/SOCK_Acceptor.h>
/// Remote Administration socket
-class RASocket: public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>
+class RASocket : public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_MT_SYNCH>
{
public:
RASocket();
- virtual ~RASocket();
+ virtual ~RASocket() { }
- virtual int svc(void);
- virtual int open(void * = 0);
- virtual int handle_close(ACE_HANDLE = ACE_INVALID_HANDLE, ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK);
+ virtual int svc() OVERRIDE;
+ virtual int open(void* = 0) OVERRIDE;
+ virtual int handle_close(ACE_HANDLE = ACE_INVALID_HANDLE, ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK) OVERRIDE;
private:
- int recv_line(std::string& out_line);
+ int recv_line(std::string& outLine);
int recv_line(ACE_Message_Block& buffer);
int process_command(const std::string& command);
int authenticate();
- int subnegotiate(); //! Used by telnet protocol RFC 854 / 855
+ int subnegotiate(); ///< Used by telnet protocol RFC 854 / 855
int check_access_level(const std::string& user);
int check_password(const std::string& user, const std::string& pass);
int send(const std::string& line);
- static void zprint(void* callbackArg, const char * szText );
+ static void zprint(void* callbackArg, const char* szText);
static void commandFinished(void* callbackArg, bool success);
private:
- /// Minimum security level required to connect
- uint8 _minLevel;
+ uint8 _minLevel; ///< Minimum security level required to connect
ACE_Atomic_Op<ACE_Thread_Mutex, bool> _commandExecuting;
};
+
#endif
+
/// @}
diff --git a/src/server/worldserver/TCSoap/TCSoap.cpp b/src/server/worldserver/TCSoap/TCSoap.cpp
index 3ccc3bccac9..e10968bcbee 100644
--- a/src/server/worldserver/TCSoap/TCSoap.cpp
+++ b/src/server/worldserver/TCSoap/TCSoap.cpp
@@ -33,13 +33,13 @@ void TCSoapRunnable::run()
soap.accept_timeout = 3;
soap.recv_timeout = 5;
soap.send_timeout = 5;
- if (!soap_valid_socket(soap_bind(&soap, m_host.c_str(), m_port, 100)))
+ if (!soap_valid_socket(soap_bind(&soap, _host.c_str(), _port, 100)))
{
- TC_LOG_ERROR(LOG_FILTER_SOAP, "Couldn't bind to %s:%d", m_host.c_str(), m_port);
+ TC_LOG_ERROR(LOG_FILTER_SOAP, "Couldn't bind to %s:%d", _host.c_str(), _port);
exit(-1);
}
- TC_LOG_INFO(LOG_FILTER_SOAP, "Bound to http://%s:%d", m_host.c_str(), m_port);
+ TC_LOG_INFO(LOG_FILTER_SOAP, "Bound to http://%s:%d", _host.c_str(), _port);
while (!World::IsStopped())
{
@@ -121,9 +121,7 @@ int ns1__executeCommand(soap* soap, char* command, char** result)
int acc = connection.pendingCommands.acquire();
if (acc)
- {
TC_LOG_ERROR(LOG_FILTER_SOAP, "Error while acquiring lock, acc = %i, errno = %u", acc, errno);
- }
// alright, command finished
diff --git a/src/server/worldserver/TCSoap/TCSoap.h b/src/server/worldserver/TCSoap/TCSoap.h
index 63ccb6b304e..ff2a49a4d7e 100644
--- a/src/server/worldserver/TCSoap/TCSoap.h
+++ b/src/server/worldserver/TCSoap/TCSoap.h
@@ -24,21 +24,24 @@
#include <ace/Task.h>
#include <Threading.h>
-class TCSoapRunnable: public ACE_Based::Runnable
+class TCSoapRunnable : public ACE_Based::Runnable
{
public:
- TCSoapRunnable() : m_host(""), m_port(0) { }
- void run();
- void setListenArguments(std::string host, uint16 port)
+ TCSoapRunnable() : _port(0) { }
+
+ void run() OVERRIDE;
+
+ void SetListenArguments(const std::string& host, uint16 port)
{
- m_host = host;
- m_port = port;
+ _host = host;
+ _port = port;
}
+
private:
void process_message(ACE_Message_Block* mb);
- std::string m_host;
- uint16 m_port;
+ std::string _host;
+ uint16 _port;
};
class SOAPCommand
diff --git a/src/server/worldserver/WorldThread/WorldRunnable.h b/src/server/worldserver/WorldThread/WorldRunnable.h
index 38fc96a9f9f..56a3b41eae7 100644
--- a/src/server/worldserver/WorldThread/WorldRunnable.h
+++ b/src/server/worldserver/WorldThread/WorldRunnable.h
@@ -27,7 +27,9 @@
class WorldRunnable : public ACE_Based::Runnable
{
public:
- void run();
+ void run() OVERRIDE;
};
+
#endif
+
/// @}
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index ac52c95202e..0a27a7b2106 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -150,7 +150,9 @@ BindIP = "0.0.0.0"
# PERFORMANCE SETTINGS
#
# UseProcessors
-# Description: Processors mask for Windows based multi-processor systems.
+# Description: Processors mask for Windows and Linux based multi-processor systems.
+# Example: A computer with 2 CPUs:
+# 1 - 1st CPU only, 2 - 2nd CPU only, 3 - 1st and 2nd CPU, because 1 | 2 is 3
# Default: 0 - (Selected by OS)
# 1+ - (Bit mask value of selected processors)
@@ -158,7 +160,8 @@ UseProcessors = 0
#
# ProcessPriority
-# Description: Process priority setting for Windows based systems.
+# Description: Process priority setting for Windows and Linux based systems.
+# Details: On Linux, a nice value of -15 is used. On Windows, process is set to HIGH class.
# Default: 1 - (High)
# 0 - (Normal)
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp
index 9dfdf95643d..06a764690ca 100644
--- a/src/tools/mmaps_generator/MapBuilder.cpp
+++ b/src/tools/mmaps_generator/MapBuilder.cpp
@@ -716,8 +716,8 @@ namespace MMAP
params.cs = config.cs;
params.ch = config.ch;
params.tileLayer = 0;
- params.buildBvTree = true;
-
+ params.buildBvTree = true;
+
// will hold final navmesh
unsigned char* navData = NULL;
int navDataSize = 0;