aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/CreatureAI.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp68
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp38
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h13
-rw-r--r--src/server/game/Accounts/AccountMgr.cpp85
-rw-r--r--src/server/game/Accounts/AccountMgr.h17
-rw-r--r--src/server/game/Accounts/RBAC.h210
-rw-r--r--src/server/game/Entities/Object/Object.cpp15
-rw-r--r--src/server/game/Entities/Object/Object.h4
-rw-r--r--src/server/game/Maps/Map.cpp7
-rw-r--r--src/server/game/Miscellaneous/Language.h13
-rw-r--r--src/server/game/Server/WorldSession.cpp11
-rw-r--r--src/server/game/Server/WorldSocket.cpp8
-rw-r--r--src/server/game/World/World.cpp5
-rw-r--r--src/server/game/World/World.h3
-rw-r--r--src/server/scripts/Commands/cs_account.cpp359
-rw-r--r--src/server/scripts/Commands/cs_cast.cpp18
-rw-r--r--src/server/scripts/Commands/cs_character.cpp44
-rw-r--r--src/server/scripts/Commands/cs_cheat.cpp22
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp90
-rw-r--r--src/server/scripts/Commands/cs_deserter.cpp22
-rw-r--r--src/server/scripts/Commands/cs_disable.cpp46
-rw-r--r--src/server/scripts/Commands/cs_event.cpp14
-rw-r--r--src/server/scripts/Commands/cs_gm.cpp18
-rw-r--r--src/server/scripts/Commands/cs_go.cpp26
-rw-r--r--src/server/scripts/Commands/cs_gobject.cpp36
-rw-r--r--src/server/scripts/Commands/cs_guild.cpp18
-rw-r--r--src/server/scripts/Commands/cs_honor.cpp16
-rw-r--r--src/server/scripts/Commands/cs_instance.cpp14
-rw-r--r--src/server/scripts/Commands/cs_learn.cpp44
-rw-r--r--src/server/scripts/Commands/cs_lfg.cpp16
-rw-r--r--src/server/scripts/Commands/cs_list.cpp16
-rw-r--r--src/server/scripts/Commands/cs_lookup.cpp50
-rw-r--r--src/server/scripts/Commands/cs_message.cpp26
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp60
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp2
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp9
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp2
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp3
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp15
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp22
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp401
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp26
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h88
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp429
-rw-r--r--src/server/scripts/Outland/zone_netherstorm.cpp1
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp2
-rw-r--r--src/server/shared/Database/Implementation/LoginDatabase.cpp7
-rw-r--r--src/server/shared/Database/Implementation/LoginDatabase.h3
-rw-r--r--src/server/worldserver/Master.cpp5
-rw-r--r--src/server/worldserver/worldserver.conf.dist23
-rw-r--r--src/tools/map_extractor/System.cpp10
-rw-r--r--src/tools/map_extractor/loadlib.cpp12
-rw-r--r--src/tools/mmaps_generator/MapBuilder.cpp21
-rw-r--r--src/tools/mmaps_generator/PathGenerator.cpp2
57 files changed, 1593 insertions, 952 deletions
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp
index cbb79b47958..75a1488ed45 100644
--- a/src/server/game/AI/CreatureAI.cpp
+++ b/src/server/game/AI/CreatureAI.cpp
@@ -75,6 +75,8 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= NULL*/, float maxRangeToN
}
}
+ // Intended duplicated check, the code above this should select a victim
+ // If it can't find a suitable attack target then we should error out.
if (!creature->HasReactState(REACT_PASSIVE) && !creature->GetVictim())
{
TC_LOG_ERROR(LOG_FILTER_GENERAL, "DoZoneInCombat called for creature that has empty threat list (creature entry = %u)", creature->GetEntry());
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 2d6046cbddf..f94a3e79066 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -731,7 +731,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
me->AI()->EnterEvadeMode();
TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_EVADE: Creature %u EnterEvadeMode", me->GetGUIDLow());
- return;
+ break;
}
case SMART_ACTION_FLEE_FOR_ASSIST:
{
@@ -854,7 +854,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
case SMART_ACTION_CALL_KILLEDMONSTER:
{
- if (e.target.type == SMART_TARGET_NONE) // Loot recipient and his group members
+ if (e.target.type == SMART_TARGET_NONE || e.target.type == SMART_TARGET_SELF) // Loot recipient and his group members
{
if (!me)
break;
@@ -1340,15 +1340,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (!me)
break;
- ObjectList* targets = GetTargets(e, unit);
if (e.GetTargetType() == SMART_TARGET_SELF)
me->SetFacingTo(me->GetHomePosition().GetOrientation());
else if (e.GetTargetType() == SMART_TARGET_POSITION)
me->SetFacingTo(e.target.o);
- else if (targets && !targets->empty())
- me->SetFacingToObject(*targets->begin());
+ else if (ObjectList* targets = GetTargets(e, unit))
+ {
+ if (!targets->empty())
+ me->SetFacingToObject(*targets->begin());
+
+ delete targets;
+ }
- delete targets;
break;
}
case SMART_ACTION_PLAYMOVIE:
@@ -1445,7 +1448,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript: SMART_ACTION_EQUIP uses non-existent equipment info id %u for creature %u", equipId, npc->GetEntry());
delete targets;
- return;
+ break;
}
npc->SetCurrentEquipmentId(equipId);
@@ -1879,11 +1882,13 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
+ {
if (Creature* creature = (*itr)->ToCreature())
{
creature->GetMotionMaster()->Clear();
creature->GetMotionMaster()->MoveJump(e.target.x, e.target.y, e.target.z, (float)e.action.jump.speedxy, (float)e.action.jump.speedz);
}
+ }
/// @todo Resume path when reached jump location
delete targets;
@@ -1913,7 +1918,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (!storedTargets)
{
delete targets;
- return;
+ break;
}
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
@@ -1950,6 +1955,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
+ {
if (Player* player = (*itr)->ToPlayer())
{
if (e.action.sendGossipMenu.gossipMenuId)
@@ -1959,6 +1965,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
player->SEND_GOSSIP_MENU(e.action.sendGossipMenu.gossipNpcTextId, GetBaseObject()->GetGUID());
}
+ }
delete targets;
break;
@@ -1970,15 +1977,32 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break;
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
+ {
if (IsCreature(*itr))
{
if (e.GetTargetType() == SMART_TARGET_SELF)
(*itr)->ToCreature()->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
else if (e.GetTargetType() == SMART_TARGET_POSITION)
(*itr)->ToCreature()->SetHomePosition(e.target.x, e.target.y, e.target.z, e.target.o);
+ else if (e.GetTargetType() == SMART_TARGET_CREATURE_RANGE || e.GetTargetType() == SMART_TARGET_CREATURE_GUID ||
+ e.GetTargetType() == SMART_TARGET_CREATURE_DISTANCE || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_RANGE ||
+ e.GetTargetType() == SMART_TARGET_GAMEOBJECT_GUID || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_DISTANCE ||
+ e.GetTargetType() == SMART_TARGET_CLOSEST_CREATURE || e.GetTargetType() == SMART_TARGET_CLOSEST_GAMEOBJECT ||
+ e.GetTargetType() == SMART_TARGET_OWNER_OR_SUMMONER || e.GetTargetType() == SMART_TARGET_ACTION_INVOKER ||
+ e.GetTargetType() == SMART_TARGET_CLOSEST_ENEMY || e.GetTargetType() == SMART_TARGET_CLOSEST_FRIENDLY)
+ {
+ if (ObjectList* targets = GetTargets(e, unit))
+ {
+ if (WorldObject* target = targets->front())
+ (*itr)->ToCreature()->SetHomePosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation());
+
+ delete targets;
+ }
+ }
else
- TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript: Action target for SMART_ACTION_SET_HOME_POS is not using SMART_TARGET_SELF or SMART_TARGET_POSITION, skipping");
+ TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript: Action target for SMART_ACTION_SET_HOME_POS is invalid, skipping");
}
+ }
delete targets;
break;
@@ -2101,7 +2125,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (!sGameEventMgr->IsActiveEvent(eventId))
{
TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript::ProcessAction: At case SMART_ACTION_GAME_EVENT_STOP, inactive event (id: %u)", eventId);
- return;
+ break;
}
sGameEventMgr->StopEvent(eventId, true);
break;
@@ -2112,7 +2136,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (sGameEventMgr->IsActiveEvent(eventId))
{
TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript::ProcessAction: At case SMART_ACTION_GAME_EVENT_START, already activated event (id: %u)", eventId);
- return;
+ break;
}
sGameEventMgr->StartEvent(eventId, true);
break;
@@ -2621,10 +2645,20 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
}
case SMART_EVENT_TARGET_CASTING:
{
- if (!me || !me->IsInCombat() || !me->GetVictim() || !me->GetVictim()->IsNonMeleeSpellCasted(false, false, true))
+ if (!me || !me->IsInCombat())
return;
- ProcessTimedAction(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax, me->GetVictim());
+ Unit* victim = me->GetVictim();
+
+ if (!victim || !victim->IsNonMeleeSpellCasted(false, false, true))
+ return;
+
+ if (e.event.targetCasting.spellId > 0)
+ if (Spell* currSpell = victim->GetCurrentSpell(CURRENT_GENERIC_SPELL))
+ if (currSpell->m_spellInfo->Id != e.event.targetCasting.spellId)
+ return;
+
+ ProcessTimedAction(e, e.event.targetCasting.repeatMin, e.event.targetCasting.repeatMax, me->GetVictim());
break;
}
case SMART_EVENT_FRIENDLY_HEALTH:
@@ -2632,10 +2666,10 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
if (!me || !me->IsInCombat())
return;
- Unit* target = DoSelectLowestHpFriendly((float)e.event.friendlyHealt.radius, e.event.friendlyHealt.hpDeficit);
+ Unit* target = DoSelectLowestHpFriendly((float)e.event.friendlyHealth.radius, e.event.friendlyHealth.hpDeficit);
if (!target || !target->IsInCombat())
return;
- ProcessTimedAction(e, e.event.friendlyHealt.repeatMin, e.event.friendlyHealt.repeatMax, target);
+ ProcessTimedAction(e, e.event.friendlyHealth.repeatMin, e.event.friendlyHealth.repeatMax, target);
break;
}
case SMART_EVENT_FRIENDLY_IS_CC:
@@ -2983,7 +3017,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
{
uint32 healthPct = uint32((*itr)->ToUnit()->GetHealthPct());
- if (healthPct > e.event.friendlyHealtPct.maxHpPct || healthPct < e.event.friendlyHealtPct.minHpPct)
+ if (healthPct > e.event.friendlyHealthPct.maxHpPct || healthPct < e.event.friendlyHealthPct.minHpPct)
continue;
target = (*itr)->ToUnit();
@@ -2996,7 +3030,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
if (!target)
return;
- ProcessTimedAction(e, e.event.friendlyHealtPct.repeatMin, e.event.friendlyHealtPct.repeatMax, target);
+ ProcessTimedAction(e, e.event.friendlyHealthPct.repeatMin, e.event.friendlyHealthPct.repeatMax, target);
break;
}
default:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 081599c322e..01f9080fba1 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -28,6 +28,8 @@
#include "ScriptedCreature.h"
#include "GameEventMgr.h"
#include "CreatureTextMgr.h"
+#include "SpellMgr.h"
+#include "SpellInfo.h"
#include "SmartScriptMgr.h"
@@ -407,10 +409,10 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
}
break;
case SMART_EVENT_FRIENDLY_HEALTH:
- if (!NotNULL(e, e.event.friendlyHealt.radius))
+ if (!NotNULL(e, e.event.friendlyHealth.radius))
return false;
- if (!IsMinMaxValid(e, e.event.friendlyHealt.repeatMin, e.event.friendlyHealt.repeatMax))
+ if (!IsMinMaxValid(e, e.event.friendlyHealth.repeatMin, e.event.friendlyHealth.repeatMax))
return false;
break;
case SMART_EVENT_FRIENDLY_IS_CC:
@@ -437,6 +439,15 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false;
break;
case SMART_EVENT_TARGET_CASTING:
+ if (e.event.targetCasting.spellId > 0 && !sSpellMgr->GetSpellInfo(e.event.targetCasting.spellId))
+ {
+ sLog->outError(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent Spell entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.spellHit.spell);
+ return false;
+ }
+
+ if (!IsMinMaxValid(e, e.event.targetCasting.repeatMin, e.event.targetCasting.repeatMax))
+ return false;
+ break;
case SMART_EVENT_PASSENGER_BOARDED:
case SMART_EVENT_PASSENGER_REMOVED:
if (!IsMinMaxValid(e, e.event.minMax.repeatMin, e.event.minMax.repeatMax))
@@ -546,10 +557,10 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
break;
}
case SMART_EVENT_FRIENDLY_HEALTH_PCT:
- if (!IsMinMaxValid(e, e.event.friendlyHealtPct.repeatMin, e.event.friendlyHealtPct.repeatMax))
+ if (!IsMinMaxValid(e, e.event.friendlyHealthPct.repeatMin, e.event.friendlyHealthPct.repeatMax))
return false;
- if (e.event.friendlyHealtPct.maxHpPct > 100 || e.event.friendlyHealtPct.minHpPct > 100)
+ if (e.event.friendlyHealthPct.maxHpPct > 100 || e.event.friendlyHealthPct.minHpPct > 100)
{
TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u has pct value above 100, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
return false;
@@ -769,6 +780,25 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_CALL_KILLEDMONSTER:
if (!IsCreatureValid(e, e.action.killedMonster.creature))
return false;
+
+ for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
+ {
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
+ if (!spellInfo)
+ continue;
+
+ for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
+ {
+ if (spellInfo->Effects[j].Effect == SPELL_EFFECT_KILL_CREDIT || spellInfo->Effects[j].Effect == SPELL_EFFECT_KILL_CREDIT2)
+ {
+ uint32 killCredit = spellInfo->Effects[j].MiscValue;
+
+ if (e.action.killedMonster.creature == killCredit)
+ TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u Kill Credit: %u has already spell kill credit (SpellId: %u effect: %u)", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.killedMonster.creature, spellInfo->Id, j);
+ }
+ }
+ }
+
if (e.GetTargetType() == SMART_TARGET_POSITION)
{
TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses incorrect TargetType %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.GetTargetType());
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 8337f9e15ee..0bb559dfe3c 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -94,7 +94,7 @@ enum SMART_EVENT
SMART_EVENT_OOC_LOS = 10, // NoHostile, MaxRnage, CooldownMin, CooldownMax
SMART_EVENT_RESPAWN = 11, // type, MapId, ZoneId
SMART_EVENT_TARGET_HEALTH_PCT = 12, // HPMin%, HPMax%, RepeatMin, RepeatMax
- SMART_EVENT_TARGET_CASTING = 13, // RepeatMin, RepeatMax
+ SMART_EVENT_TARGET_CASTING = 13, // RepeatMin, RepeatMax, spellid
SMART_EVENT_FRIENDLY_HEALTH = 14, // HPDeficit, Radius, RepeatMin, RepeatMax
SMART_EVENT_FRIENDLY_IS_CC = 15, // Radius, RepeatMin, RepeatMax
SMART_EVENT_FRIENDLY_MISSING_BUFF = 16, // SpellId, Radius, RepeatMin, RepeatMax
@@ -215,11 +215,18 @@ struct SmartEvent
struct
{
+ uint32 repeatMin;
+ uint32 repeatMax;
+ uint32 spellId;
+ } targetCasting;
+
+ struct
+ {
uint32 hpDeficit;
uint32 radius;
uint32 repeatMin;
uint32 repeatMax;
- } friendlyHealt;
+ } friendlyHealth;
struct
{
@@ -368,7 +375,7 @@ struct SmartEvent
uint32 maxHpPct;
uint32 repeatMin;
uint32 repeatMax;
- } friendlyHealtPct;
+ } friendlyHealthPct;
struct
{
diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp
index a9f178685d9..819a3b85fe6 100644
--- a/src/server/game/Accounts/AccountMgr.cpp
+++ b/src/server/game/Accounts/AccountMgr.cpp
@@ -34,21 +34,24 @@ AccountMgr::~AccountMgr()
ClearRBAC();
}
-AccountOpResult AccountMgr::CreateAccount(std::string username, std::string password)
+AccountOpResult AccountMgr::CreateAccount(std::string username, std::string password, std::string email = "")
{
if (utf8length(username) > MAX_ACCOUNT_STR)
return AOR_NAME_TOO_LONG; // username's too long
normalizeString(username);
normalizeString(password);
+ normalizeString(email);
if (GetId(username))
- return AOR_NAME_ALREDY_EXIST; // username does already exist
+ return AOR_NAME_ALREADY_EXIST; // username does already exist
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT);
stmt->setString(0, username);
stmt->setString(1, CalculateShaPassHash(username, password));
+ stmt->setString(2, email);
+ stmt->setString(3, email);
LoginDatabase.DirectExecute(stmt); // Enforce saving, otherwise AddGroup can fail
@@ -202,6 +205,52 @@ AccountOpResult AccountMgr::ChangePassword(uint32 accountId, std::string newPass
return AOR_OK;
}
+AccountOpResult AccountMgr::ChangeEmail(uint32 accountId, std::string newEmail)
+{
+ std::string username;
+
+ if (!GetName(accountId, username))
+ return AOR_NAME_NOT_EXIST; // account doesn't exist
+
+ if (utf8length(newEmail) > MAX_EMAIL_STR)
+ return AOR_EMAIL_TOO_LONG;
+
+ normalizeString(username);
+ normalizeString(newEmail);
+
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_EMAIL);
+
+ stmt->setString(0, newEmail);
+ stmt->setUInt32(1, accountId);
+
+ LoginDatabase.Execute(stmt);
+
+ return AOR_OK;
+}
+
+AccountOpResult AccountMgr::ChangeRegEmail(uint32 accountId, std::string newEmail)
+{
+ std::string username;
+
+ if (!GetName(accountId, username))
+ return AOR_NAME_NOT_EXIST; // account doesn't exist
+
+ if (utf8length(newEmail) > MAX_EMAIL_STR)
+ return AOR_EMAIL_TOO_LONG;
+
+ normalizeString(username);
+ normalizeString(newEmail);
+
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_REG_EMAIL);
+
+ stmt->setString(0, newEmail);
+ stmt->setUInt32(1, accountId);
+
+ LoginDatabase.Execute(stmt);
+
+ return AOR_OK;
+}
+
uint32 AccountMgr::GetId(std::string const& username)
{
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_ACCOUNT_ID_BY_USERNAME);
@@ -245,6 +294,21 @@ bool AccountMgr::GetName(uint32 accountId, std::string& name)
return false;
}
+bool AccountMgr::GetEmail(uint32 accountId, std::string& email)
+{
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_EMAIL_BY_ID);
+ stmt->setUInt32(0, accountId);
+ PreparedQueryResult result = LoginDatabase.Query(stmt);
+
+ if (result)
+ {
+ email = (*result)[0].GetString();
+ return true;
+ }
+
+ return false;
+}
+
bool AccountMgr::CheckPassword(uint32 accountId, std::string password)
{
std::string username;
@@ -263,6 +327,23 @@ bool AccountMgr::CheckPassword(uint32 accountId, std::string password)
return (result) ? true : false;
}
+bool AccountMgr::CheckEmail(uint32 accountId, std::string newEmail)
+{
+ std::string oldEmail;
+
+ // We simply return false for a non-existing email
+ if (!GetEmail(accountId, oldEmail))
+ return false;
+
+ normalizeString(oldEmail);
+ normalizeString(newEmail);
+
+ if (strcmp(oldEmail.c_str(), newEmail.c_str()) == 0)
+ return true;
+
+ return false;
+}
+
uint32 AccountMgr::GetCharactersCount(uint32 accountId)
{
// check character count
diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h
index 878ecde24f9..92c1e2292d0 100644
--- a/src/server/game/Accounts/AccountMgr.h
+++ b/src/server/game/Accounts/AccountMgr.h
@@ -27,12 +27,21 @@ enum AccountOpResult
AOR_OK,
AOR_NAME_TOO_LONG,
AOR_PASS_TOO_LONG,
- AOR_NAME_ALREDY_EXIST,
+ AOR_EMAIL_TOO_LONG,
+ AOR_NAME_ALREADY_EXIST,
AOR_NAME_NOT_EXIST,
AOR_DB_INTERNAL_ERROR
};
+enum PasswordChangeSecurity
+{
+ PW_NONE,
+ PW_EMAIL,
+ PW_RBAC
+};
+
#define MAX_ACCOUNT_STR 16
+#define MAX_EMAIL_STR 64
typedef std::map<uint32, RBACPermission*> RBACPermissionsContainer;
typedef std::map<uint32, RBACRole*> RBACRolesContainer;
@@ -48,16 +57,20 @@ class AccountMgr
~AccountMgr();
public:
- AccountOpResult CreateAccount(std::string username, std::string password);
+ AccountOpResult CreateAccount(std::string username, std::string password, std::string email);
static AccountOpResult DeleteAccount(uint32 accountId);
static AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword);
static AccountOpResult ChangePassword(uint32 accountId, std::string newPassword);
+ static AccountOpResult ChangeEmail(uint32 accountId, std::string newEmail);
+ static AccountOpResult ChangeRegEmail(uint32 accountId, std::string newEmail);
static bool CheckPassword(uint32 accountId, std::string password);
+ static bool CheckEmail(uint32 accountId, std::string newEmail);
static uint32 GetId(std::string const& username);
static uint32 GetSecurity(uint32 accountId);
static uint32 GetSecurity(uint32 accountId, int32 realmId);
static bool GetName(uint32 accountId, std::string& name);
+ static bool GetEmail(uint32 accountId, std::string& email);
static uint32 GetCharactersCount(uint32 accountId);
static std::string CalculateShaPassHash(std::string const& name, std::string const& password);
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index be4356f6b54..492a7197cfe 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -96,6 +96,8 @@ enum RBACPermissions
RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR = 46,
RBAC_PERM_CHECK_FOR_LOWER_SECURITY = 47,
RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA = 48,
+ RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE = 49,
+ RBAC_PERM_MAY_CHECK_OWN_EMAIL = 50,
// Leave some space for core permissions
RBAC_PERM_COMMAND_RBAC = 200,
RBAC_PERM_COMMAND_RBAC_ACC = 201,
@@ -160,6 +162,214 @@ enum RBACPermissions
RBAC_PERM_COMMAND_BF_SWITCH = 260,
RBAC_PERM_COMMAND_BF_TIMER = 261,
RBAC_PERM_COMMAND_BF_ENABLE = 262,
+ RBAC_PERM_COMMAND_ACCOUNT_EMAIL = 263,
+ RBAC_PERM_COMMAND_ACCOUNT_SET_SEC = 264,
+ RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_EMAIL = 265,
+ RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_REGMAIL = 266,
+ RBAC_PERM_COMMAND_CAST = 267,
+ RBAC_PERM_COMMAND_CAST_BACK = 268,
+ RBAC_PERM_COMMAND_CAST_DIST = 269,
+ RBAC_PERM_COMMAND_CAST_SELF = 270,
+ RBAC_PERM_COMMAND_CAST_TARGET = 271,
+ RBAC_PERM_COMMAND_CAST_DEST = 272,
+ RBAC_PERM_COMMAND_CHARACTER = 273,
+ RBAC_PERM_COMMAND_CHARACTER_CUSTOMIZE = 274,
+ RBAC_PERM_COMMAND_CHARACTER_CHANGEFACTION = 275,
+ RBAC_PERM_COMMAND_CHARACTER_CHANGERACE = 276,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED = 277,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_DELETE = 278, // Not in DB - console
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_LIST = 279,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_RESTORE = 280,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_OLD = 281, // Not in DB - console
+ RBAC_PERM_COMMAND_CHARACTER_ERASE = 282, // Not in DB - console
+ RBAC_PERM_COMMAND_CHARACTER_LEVEL = 283,
+ RBAC_PERM_COMMAND_CHARACTER_RENAME = 284,
+ RBAC_PERM_COMMAND_CHARACTER_REPUTATION = 285,
+ RBAC_PERM_COMMAND_CHARACTER_TITLES = 286,
+ RBAC_PERM_COMMAND_LEVELUP = 287,
+ RBAC_PERM_COMMAND_PDUMP = 288,
+ RBAC_PERM_COMMAND_PDUMP_LOAD = 289,
+ RBAC_PERM_COMMAND_PDUMP_WRITE = 290,
+ RBAC_PERM_COMMAND_CHEAT = 291,
+ RBAC_PERM_COMMAND_CHEAT_CASTTIME = 292,
+ RBAC_PERM_COMMAND_CHEAT_COOLDOWN = 293,
+ RBAC_PERM_COMMAND_CHEAT_EXPLORE = 294,
+ RBAC_PERM_COMMAND_CHEAT_GOD = 295,
+ RBAC_PERM_COMMAND_CHEAT_POWER = 296,
+ RBAC_PERM_COMMAND_CHEAT_STATUS = 297,
+ RBAC_PERM_COMMAND_CHEAT_TAXI = 298,
+ RBAC_PERM_COMMAND_CHEAT_WATERWALK = 299,
+ RBAC_PERM_COMMAND_DEBUG = 300,
+ RBAC_PERM_COMMAND_DEBUG_ANIM = 301,
+ RBAC_PERM_COMMAND_DEBUG_AREATRIGGERS = 302,
+ RBAC_PERM_COMMAND_DEBUG_ARENA = 303,
+ RBAC_PERM_COMMAND_DEBUG_BG = 304,
+ RBAC_PERM_COMMAND_DEBUG_ENTERVEHICLE = 305,
+ RBAC_PERM_COMMAND_DEBUG_GETITEMSTATE = 306,
+ RBAC_PERM_COMMAND_DEBUG_GETITEMVALUE = 307,
+ RBAC_PERM_COMMAND_DEBUG_GETVALUE = 308,
+ RBAC_PERM_COMMAND_DEBUG_HOSTIL = 309,
+ RBAC_PERM_COMMAND_DEBUG_ITEMEXPIRE = 310,
+ RBAC_PERM_COMMAND_DEBUG_LOOTRECIPIENT = 311,
+ RBAC_PERM_COMMAND_DEBUG_LOS = 312,
+ RBAC_PERM_COMMAND_DEBUG_MOD32VALUE = 313,
+ RBAC_PERM_COMMAND_DEBUG_MOVEFLAGS = 314,
+ RBAC_PERM_COMMAND_DEBUG_PLAY = 315,
+ RBAC_PERM_COMMAND_DEBUG_PLAY_CINEMATIC = 316,
+ RBAC_PERM_COMMAND_DEBUG_PLAY_MOVIE = 317,
+ RBAC_PERM_COMMAND_DEBUG_PLAY_SOUND = 318,
+ RBAC_PERM_COMMAND_DEBUG_SEND = 319,
+ RBAC_PERM_COMMAND_DEBUG_SEND_BUYERROR = 320,
+ RBAC_PERM_COMMAND_DEBUG_SEND_CHANNELNOTIFY = 321,
+ RBAC_PERM_COMMAND_DEBUG_SEND_CHATMESSAGE = 322,
+ RBAC_PERM_COMMAND_DEBUG_SEND_EQUIPERROR = 323,
+ RBAC_PERM_COMMAND_DEBUG_SEND_LARGEPACKET = 324,
+ RBAC_PERM_COMMAND_DEBUG_SEND_OPCODE = 325,
+ RBAC_PERM_COMMAND_DEBUG_SEND_QINVALIDMSG = 326,
+ RBAC_PERM_COMMAND_DEBUG_SEND_QPARTYMSG = 327,
+ RBAC_PERM_COMMAND_DEBUG_SEND_SELLERROR = 328,
+ RBAC_PERM_COMMAND_DEBUG_SEND_SETPHASESHIFT = 329,
+ RBAC_PERM_COMMAND_DEBUG_SEND_SPELLFAIL = 330,
+ RBAC_PERM_COMMAND_DEBUG_SETAURASTATE = 331,
+ RBAC_PERM_COMMAND_DEBUG_SETBIT = 332,
+ RBAC_PERM_COMMAND_DEBUG_SETITEMVALUE = 333,
+ RBAC_PERM_COMMAND_DEBUG_SETVALUE = 334,
+ RBAC_PERM_COMMAND_DEBUG_SETVID = 335,
+ RBAC_PERM_COMMAND_DEBUG_SPAWNVEHICLE = 336,
+ RBAC_PERM_COMMAND_DEBUG_THREAT = 337,
+ RBAC_PERM_COMMAND_DEBUG_UPDATE = 338,
+ RBAC_PERM_COMMAND_DEBUG_UWS = 339,
+ RBAC_PERM_COMMAND_WPGPS = 340,
+ RBAC_PERM_COMMAND_DESERTER = 341,
+ RBAC_PERM_COMMAND_DESERTER_BG = 342,
+ RBAC_PERM_COMMAND_DESERTER_BG_ADD = 343,
+ RBAC_PERM_COMMAND_DESERTER_BG_REMOVE = 344,
+ RBAC_PERM_COMMAND_DESERTER_INSTANCE = 345,
+ RBAC_PERM_COMMAND_DESERTER_INSTANCE_ADD = 346,
+ RBAC_PERM_COMMAND_DESERTER_INSTANCE_REMOVE = 347,
+ RBAC_PERM_COMMAND_DISABLE = 348,
+ RBAC_PERM_COMMAND_DISABLE_ADD = 349,
+ RBAC_PERM_COMMAND_DISABLE_ADD_ACHIEVEMENT_CRITERIA = 350,
+ RBAC_PERM_COMMAND_DISABLE_ADD_BATTLEGROUND = 351,
+ RBAC_PERM_COMMAND_DISABLE_ADD_MAP = 352,
+ RBAC_PERM_COMMAND_DISABLE_ADD_MMAP = 353,
+ RBAC_PERM_COMMAND_DISABLE_ADD_OUTDOORPVP = 354,
+ RBAC_PERM_COMMAND_DISABLE_ADD_QUEST = 355,
+ RBAC_PERM_COMMAND_DISABLE_ADD_SPELL = 356,
+ RBAC_PERM_COMMAND_DISABLE_ADD_VMAP = 357,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE = 358,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_ACHIEVEMENT_CRITERIA = 359,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_BATTLEGROUND = 360,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_MAP = 361,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_MMAP = 362,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_OUTDOORPVP = 363,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_QUEST = 364,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_SPELL = 365,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_VMAP = 366,
+ RBAC_PERM_COMMAND_EVENT = 367,
+ RBAC_PERM_COMMAND_EVENT_ACTIVELIST = 368,
+ RBAC_PERM_COMMAND_EVENT_START = 369,
+ RBAC_PERM_COMMAND_EVENT_STOP = 370,
+ RBAC_PERM_COMMAND_GM = 371,
+ RBAC_PERM_COMMAND_GM_CHAT = 372,
+ RBAC_PERM_COMMAND_GM_FLY = 373,
+ RBAC_PERM_COMMAND_GM_INGAME = 374,
+ RBAC_PERM_COMMAND_GM_LIST = 375,
+ RBAC_PERM_COMMAND_GM_VISIBLE = 376,
+ RBAC_PERM_COMMAND_GO = 377,
+ RBAC_PERM_COMMAND_GO_CREATURE = 378,
+ RBAC_PERM_COMMAND_GO_GRAVEYARD = 379,
+ RBAC_PERM_COMMAND_GO_GRID = 380,
+ RBAC_PERM_COMMAND_GO_OBJECT = 381,
+ RBAC_PERM_COMMAND_GO_TAXINODE = 382,
+ RBAC_PERM_COMMAND_GO_TICKET = 383,
+ RBAC_PERM_COMMAND_GO_TRIGGER = 384,
+ RBAC_PERM_COMMAND_GO_XYZ = 385,
+ RBAC_PERM_COMMAND_GO_ZONEXY = 386,
+ RBAC_PERM_COMMAND_GOBJECT = 387,
+ RBAC_PERM_COMMAND_GOBJECT_ACTIVATE = 388,
+ RBAC_PERM_COMMAND_GOBJECT_ADD = 389,
+ RBAC_PERM_COMMAND_GOBJECT_ADD_TEMP = 390,
+ RBAC_PERM_COMMAND_GOBJECT_DELETE = 391,
+ RBAC_PERM_COMMAND_GOBJECT_INFO = 392,
+ RBAC_PERM_COMMAND_GOBJECT_MOVE = 393,
+ RBAC_PERM_COMMAND_GOBJECT_NEAR = 394,
+ RBAC_PERM_COMMAND_GOBJECT_SET = 395,
+ RBAC_PERM_COMMAND_GOBJECT_SET_PHASE = 396,
+ RBAC_PERM_COMMAND_GOBJECT_SET_STATE = 397,
+ RBAC_PERM_COMMAND_GOBJECT_TARGET = 398,
+ RBAC_PERM_COMMAND_GOBJECT_TURN = 399,
+ RBAC_PERM_COMMAND_GUILD = 401,
+ RBAC_PERM_COMMAND_GUILD_CREATE = 402,
+ RBAC_PERM_COMMAND_GUILD_DELETE = 403,
+ RBAC_PERM_COMMAND_GUILD_INVITE = 404,
+ RBAC_PERM_COMMAND_GUILD_UNINVITE = 405,
+ RBAC_PERM_COMMAND_GUILD_RANK = 406,
+ RBAC_PERM_COMMAND_GUILD_RENAME = 407,
+ RBAC_PERM_COMMAND_HONOR = 408,
+ RBAC_PERM_COMMAND_HONOR_ADD = 409,
+ RBAC_PERM_COMMAND_HONOR_ADD_KILL = 410,
+ RBAC_PERM_COMMAND_HONOR_UPDATE = 411,
+ RBAC_PERM_COMMAND_INSTANCE = 412,
+ RBAC_PERM_COMMAND_INSTANCE_LISTBINDS = 413,
+ RBAC_PERM_COMMAND_INSTANCE_UNBIND = 414,
+ RBAC_PERM_COMMAND_INSTANCE_STATS = 415,
+ RBAC_PERM_COMMAND_INSTANCE_SAVEDATA = 416,
+ RBAC_PERM_COMMAND_LEARN = 417,
+ RBAC_PERM_COMMAND_LEARN_ALL = 418,
+ RBAC_PERM_COMMAND_LEARN_ALL_MY = 419,
+ RBAC_PERM_COMMAND_LEARN_ALL_MY_CLASS = 420,
+ RBAC_PERM_COMMAND_LEARN_ALL_MY_PETTALENTS = 421,
+ RBAC_PERM_COMMAND_LEARN_ALL_MY_SPELLS = 422,
+ RBAC_PERM_COMMAND_LEARN_ALL_MY_TALENTS = 423,
+ RBAC_PERM_COMMAND_LEARN_ALL_GM = 424,
+ RBAC_PERM_COMMAND_LEARN_ALL_CRAFTS = 425,
+ RBAC_PERM_COMMAND_LEARN_ALL_DEFAULT = 426,
+ RBAC_PERM_COMMAND_LEARN_ALL_LANG = 427,
+ RBAC_PERM_COMMAND_LEARN_ALL_RECIPES = 428,
+ RBAC_PERM_COMMAND_UNLEARN = 429,
+ RBAC_PERM_COMMAND_LFG = 430,
+ RBAC_PERM_COMMAND_LFG_PLAYER = 431,
+ RBAC_PERM_COMMAND_LFG_GROUP = 432,
+ RBAC_PERM_COMMAND_LFG_QUEUE = 433,
+ RBAC_PERM_COMMAND_LFG_CLEAN = 434,
+ RBAC_PERM_COMMAND_LFG_OPTIONS = 435,
+ RBAC_PERM_COMMAND_LIST = 436,
+ RBAC_PERM_COMMAND_LIST_CREATURE = 437,
+ RBAC_PERM_COMMAND_LIST_ITEM = 438,
+ RBAC_PERM_COMMAND_LIST_OBJECT = 439,
+ RBAC_PERM_COMMAND_LIST_AURAS = 440,
+ RBAC_PERM_COMMAND_LIST_MAIL = 441,
+ RBAC_PERM_COMMAND_LOOKUP = 442,
+ RBAC_PERM_COMMAND_LOOKUP_AREA = 443,
+ RBAC_PERM_COMMAND_LOOKUP_CREATURE = 444,
+ RBAC_PERM_COMMAND_LOOKUP_EVENT = 445,
+ RBAC_PERM_COMMAND_LOOKUP_FACTION = 446,
+ RBAC_PERM_COMMAND_LOOKUP_ITEM = 447,
+ RBAC_PERM_COMMAND_LOOKUP_ITEMSET = 448,
+ RBAC_PERM_COMMAND_LOOKUP_OBJECT = 449,
+ RBAC_PERM_COMMAND_LOOKUP_QUEST = 450,
+ RBAC_PERM_COMMAND_LOOKUP_PLAYER = 451,
+ RBAC_PERM_COMMAND_LOOKUP_PLAYER_IP = 452,
+ RBAC_PERM_COMMAND_LOOKUP_PLAYER_ACCOUNT = 453,
+ RBAC_PERM_COMMAND_LOOKUP_PLAYER_EMAIL = 454,
+ RBAC_PERM_COMMAND_LOOKUP_SKILL = 455,
+ RBAC_PERM_COMMAND_LOOKUP_SPELL = 456,
+ RBAC_PERM_COMMAND_LOOKUP_SPELL_ID = 457,
+ RBAC_PERM_COMMAND_LOOKUP_TAXINODE = 458,
+ RBAC_PERM_COMMAND_LOOKUP_TELE = 459,
+ RBAC_PERM_COMMAND_LOOKUP_TITLE = 460,
+ RBAC_PERM_COMMAND_LOOKUP_MAP = 461,
+ RBAC_PERM_COMMAND_ANNOUNCE = 462,
+ RBAC_PERM_COMMAND_CHANNEL = 463,
+ RBAC_PERM_COMMAND_CHANNEL_SET = 464,
+ RBAC_PERM_COMMAND_CHANNEL_SET_OWNERSHIP = 465,
+ RBAC_PERM_COMMAND_GMANNOUNCE = 466,
+ RBAC_PERM_COMMAND_GMNAMEANNOUNCE = 467,
+ RBAC_PERM_COMMAND_GMNOTIFY = 468,
+ RBAC_PERM_COMMAND_NAMEANNOUNCE = 469,
+ RBAC_PERM_COMMAND_NOTIFY = 470,
+ RBAC_PERM_COMMAND_WHISPERS = 471,
// custom permissions 1000+
RBAC_PERM_MAX
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 6cd61dc043c..5a787f910b8 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -137,20 +137,7 @@ void Object::_Create(uint32 guidlow, uint32 entry, HighGuid guidhigh)
uint64 guid = MAKE_NEW_GUID(guidlow, entry, guidhigh);
SetUInt64Value(OBJECT_FIELD_GUID, guid);
- uint32 type = 0;
- switch (m_objectType)
- {
- //case TYPEID_ITEM: type = 3; break;
- //case TYPEID_CONTAINER: type = 7; break; //+4
- //case TYPEID_UNIT: type = 9; break; //+2
- //case TYPEID_PLAYER: type = 25; break; //+16
- //case TYPEID_GAMEOBJECT: type = 33; break; //+8
- case TYPEID_DYNAMICOBJECT: type = 65; break; //+32
- //case TYPEID_CORPSE: type = 129; break; //+64
- default: type = m_objectType; break;
- }
- SetUInt32Value(OBJECT_FIELD_TYPE, type);
- //SetUInt32Value(OBJECT_FIELD_TYPE, m_objectType);
+ SetUInt32Value(OBJECT_FIELD_TYPE, m_objectType);
m_PackGUID.wpos(0);
m_PackGUID.appendPackGUID(GetGUID());
}
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 4c48d80762d..66b3a737e0c 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -54,7 +54,7 @@ enum TypeMask
TYPEMASK_GAMEOBJECT = 0x0020,
TYPEMASK_DYNAMICOBJECT = 0x0040,
TYPEMASK_CORPSE = 0x0080,
- TYPEMASK_SEER = TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT
+ TYPEMASK_SEER = TYPEMASK_PLAYER | TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT
};
enum TypeID
@@ -450,7 +450,7 @@ struct MovementInfo
float splineElevation;
MovementInfo() :
- guid(0), flags(0), flags2(0), time(0), pitch(0.0f)
+ guid(0), flags(0), flags2(0), time(0), pitch(0.0f), fallTime(0), splineElevation(0.0f)
{
pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f);
transport.Reset();
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 27f97ba93d4..04c2c22c595 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2407,6 +2407,8 @@ bool InstanceMap::AddPlayerToMap(Player* player)
mapSave = sInstanceSaveMgr->AddInstanceSave(GetId(), GetInstanceId(), Difficulty(GetSpawnMode()), 0, true);
}
+ ASSERT(mapSave);
+
// check for existing instance binds
InstancePlayerBind* playerBind = player->GetBoundInstance(GetId(), Difficulty(GetSpawnMode()));
if (playerBind && playerBind->perm)
@@ -2441,10 +2443,7 @@ bool InstanceMap::AddPlayerToMap(Player* player)
if (groupBind->save != mapSave)
{
TC_LOG_ERROR(LOG_FILTER_MAPS, "InstanceMap::Add: player %s(%d) is being put into instance %d, %d, %d but he is in group %d which is bound to instance %d, %d, %d!", player->GetName().c_str(), player->GetGUIDLow(), mapSave->GetMapId(), mapSave->GetInstanceId(), mapSave->GetDifficulty(), GUID_LOPART(group->GetLeaderGUID()), groupBind->save->GetMapId(), groupBind->save->GetInstanceId(), groupBind->save->GetDifficulty());
- if (mapSave)
- TC_LOG_ERROR(LOG_FILTER_MAPS, "MapSave players: %d, group count: %d", mapSave->GetPlayerCount(), mapSave->GetGroupCount());
- else
- TC_LOG_ERROR(LOG_FILTER_MAPS, "MapSave NULL");
+ TC_LOG_ERROR(LOG_FILTER_MAPS, "MapSave players: %d, group count: %d", mapSave->GetPlayerCount(), mapSave->GetGroupCount());
if (groupBind->save)
TC_LOG_ERROR(LOG_FILTER_MAPS, "GroupBind save players: %d, group count: %d", groupBind->save->GetPlayerCount(), groupBind->save->GetGroupCount());
else
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 772d5bcfb75..ce280a11fc3 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -811,6 +811,7 @@ enum TrinityStrings
LANG_PINFO_ACC_ACCOUNT = 714,
LANG_PINFO_ACC_LASTLOGIN = 716,
LANG_PINFO_ACC_OS = 749,
+ LANG_PINFO_ACC_REGMAILS = 879,
LANG_PINFO_ACC_IP = 752,
LANG_PINFO_CHR_LEVEL_LOW = 843,
LANG_PINFO_CHR_RACE = 844,
@@ -844,7 +845,17 @@ enum TrinityStrings
LANG_ARENA_INFO_MEMBERS = 869,
LANG_ARENA_LOOKUP = 870,
// = 871, see LANG_PINFO_CHR_LEVEL_HIGH
- // Room for in-game strings 872-999 not used
+ LANG_COMMAND_WRONGEMAIL = 872,
+ LANG_NEW_EMAILS_NOT_MATCH = 873,
+ LANG_COMMAND_EMAIL = 874,
+ LANG_EMAIL_TOO_LONG = 875,
+ LANG_COMMAND_NOTCHANGEEMAIL = 876,
+ LANG_OLD_EMAIL_IS_NEW_EMAIL = 877,
+ LANG_COMMAND_EMAIL_OUTPUT = 878,
+ // = 879, see LANG_PINFO_CHR_REGMAILS
+ LANG_ACCOUNT_SEC_TYPE = 880,
+ LANG_RBAC_EMAIL_REQUIRED = 881,
+ // Room for in-game strings 882-999 not used
// Level 4 (CLI only commands)
LANG_COMMAND_EXIT = 1000,
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index ffd8805901a..0e85815a054 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -277,18 +277,15 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
{
if (!AntiDOS.EvaluateOpcode(*packet))
{
- delete packet;
- packet = NULL;
KickPlayer();
}
-
- if (packet && packet->GetOpcode() >= NUM_MSG_TYPES)
+ else if (packet->GetOpcode() >= NUM_MSG_TYPES)
{
TC_LOG_ERROR(LOG_FILTER_OPCODES, "Received non-existed opcode %s from %s", GetOpcodeNameForLogging(packet->GetOpcode()).c_str()
, GetPlayerInfo().c_str());
sScriptMgr->OnUnknownPacketReceive(m_Socket, WorldPacket(*packet));
}
- else if (packet)
+ else
{
OpcodeHandler &opHandle = opcodeTable[packet->GetOpcode()];
try
@@ -373,7 +370,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
break;
}
}
- catch(ByteBufferException &)
+ catch (ByteBufferException const&)
{
TC_LOG_ERROR(LOG_FILTER_GENERAL, "WorldSession::Update ByteBufferException occured while parsing a packet (opcode: %u) from client %s, accountid=%i. Skipped packet.",
packet->GetOpcode(), GetRemoteAddress().c_str(), GetAccountId());
@@ -383,6 +380,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
if (deletePacket)
delete packet;
+
+ deletePacket = true;
}
if (m_Socket && !m_Socket->IsClosed() && _warden)
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 625ebff8471..508fc0351a9 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -445,9 +445,15 @@ int WorldSocket::Update (void)
if (closing_)
return -1;
- if (m_OutActive || (m_OutBuffer->length() == 0 && msg_queue()->is_empty()))
+ if (m_OutActive)
return 0;
+ {
+ ACE_GUARD_RETURN (LockType, Guard, m_OutBufferLock, 0);
+ if (m_OutBuffer->length() == 0 && msg_queue()->is_empty())
+ return 0;
+ }
+
int ret;
do
ret = handle_output(get_handle());
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 2bc4f3a0258..cf6ad3f9886 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -83,7 +83,7 @@
ACE_Atomic_Op<ACE_Thread_Mutex, bool> World::m_stopEvent = false;
uint8 World::m_ExitCode = SHUTDOWN_EXIT_CODE;
-volatile uint32 World::m_worldLoopCounter = 0;
+ACE_Atomic_Op<ACE_Thread_Mutex, uint32> World::m_worldLoopCounter = 0;
float World::m_MaxVisibleDistanceOnContinents = DEFAULT_VISIBILITY_DISTANCE;
float World::m_MaxVisibleDistanceInInstances = DEFAULT_VISIBILITY_INSTANCE;
@@ -1192,6 +1192,9 @@ void World::LoadConfigSettings(bool reload)
// DBC_ItemAttributes
m_bool_configs[CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES] = sConfigMgr->GetBoolDefault("DBC.EnforceItemAttributes", true);
+ // Accountpassword Secruity
+ m_int_configs[CONFIG_ACC_PASSCHANGESEC] = sConfigMgr->GetIntDefault("Account.PasswordChangeSecurity", 0);
+
// Max instances per hour
m_int_configs[CONFIG_MAX_INSTANCES_PER_HOUR] = sConfigMgr->GetIntDefault("AccountInstancesPerHour", 5);
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index bf90b5ac01a..907491437c4 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -329,6 +329,7 @@ enum WorldIntConfigs
CONFIG_PACKET_SPOOF_POLICY,
CONFIG_PACKET_SPOOF_BANMODE,
CONFIG_PACKET_SPOOF_BANDURATION,
+ CONFIG_ACC_PASSCHANGESEC,
INT_CONFIG_VALUE_COUNT
};
@@ -514,7 +515,7 @@ struct CharacterNameData
class World
{
public:
- static volatile uint32 m_worldLoopCounter;
+ static ACE_Atomic_Op<ACE_Thread_Mutex, uint32> m_worldLoopCounter;
World();
~World();
diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp
index 42e33faee1c..40bfd46e19f 100644
--- a/src/server/scripts/Commands/cs_account.cpp
+++ b/src/server/scripts/Commands/cs_account.cpp
@@ -35,35 +35,43 @@ public:
ChatCommand* GetCommands() const OVERRIDE
{
+ static ChatCommand accountSetSecTable[] =
+ {
+ { "regmail", RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_REGMAIL, true, &HandleAccountSetRegEmailCommand, "", NULL },
+ { "email", RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_EMAIL, true, &HandleAccountSetEmailCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
static ChatCommand accountSetCommandTable[] =
{
- { "addon", RBAC_PERM_COMMAND_ACCOUNT_SET_ADDON, true, &HandleAccountSetAddonCommand, "", NULL },
- { "gmlevel", RBAC_PERM_COMMAND_ACCOUNT_SET_GMLEVEL, true, &HandleAccountSetGmLevelCommand, "", NULL },
- { "password", RBAC_PERM_COMMAND_ACCOUNT_SET_PASSWORD, true, &HandleAccountSetPasswordCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "addon", RBAC_PERM_COMMAND_ACCOUNT_SET_ADDON, true, &HandleAccountSetAddonCommand, "", NULL },
+ { "sec", RBAC_PERM_COMMAND_ACCOUNT_SET_SEC, true, NULL, "", accountSetSecTable },
+ { "gmlevel", RBAC_PERM_COMMAND_ACCOUNT_SET_GMLEVEL, true, &HandleAccountSetGmLevelCommand, "", NULL },
+ { "password", RBAC_PERM_COMMAND_ACCOUNT_SET_PASSWORD, true, &HandleAccountSetPasswordCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand accountLockCommandTable[] =
{
- { "country", RBAC_PERM_COMMAND_ACCOUNT_LOCK_COUNTRY, true, &HandleAccountLockCountryCommand, "", NULL },
- { "ip", RBAC_PERM_COMMAND_ACCOUNT_LOCK_IP, true, &HandleAccountLockIpCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "country", RBAC_PERM_COMMAND_ACCOUNT_LOCK_COUNTRY, true, &HandleAccountLockCountryCommand, "", NULL },
+ { "ip", RBAC_PERM_COMMAND_ACCOUNT_LOCK_IP, true, &HandleAccountLockIpCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand accountCommandTable[] =
{
- { "addon", RBAC_PERM_COMMAND_ACCOUNT_ADDON, false, &HandleAccountAddonCommand, "", NULL },
- { "create", RBAC_PERM_COMMAND_ACCOUNT_CREATE, true, &HandleAccountCreateCommand, "", NULL },
- { "delete", RBAC_PERM_COMMAND_ACCOUNT_DELETE, true, &HandleAccountDeleteCommand, "", NULL },
- { "onlinelist", RBAC_PERM_COMMAND_ACCOUNT_ONLINE_LIST, true, &HandleAccountOnlineListCommand, "", NULL },
- { "lock", RBAC_PERM_COMMAND_ACCOUNT_LOCK, false, NULL, "", accountLockCommandTable },
- { "set", RBAC_PERM_COMMAND_ACCOUNT_SET, true, NULL, "", accountSetCommandTable },
- { "password", RBAC_PERM_COMMAND_ACCOUNT_PASSWORD, false, &HandleAccountPasswordCommand, "", NULL },
- { "", RBAC_PERM_COMMAND_ACCOUNT, false, &HandleAccountCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "addon", RBAC_PERM_COMMAND_ACCOUNT_ADDON, false, &HandleAccountAddonCommand, "", NULL },
+ { "create", RBAC_PERM_COMMAND_ACCOUNT_CREATE, true, &HandleAccountCreateCommand, "", NULL },
+ { "delete", RBAC_PERM_COMMAND_ACCOUNT_DELETE, true, &HandleAccountDeleteCommand, "", NULL },
+ { "email", RBAC_PERM_COMMAND_ACCOUNT_EMAIL, false, &HandleAccountEmailCommand, "", NULL },
+ { "onlinelist", RBAC_PERM_COMMAND_ACCOUNT_ONLINE_LIST, true, &HandleAccountOnlineListCommand, "", NULL },
+ { "lock", RBAC_PERM_COMMAND_ACCOUNT_LOCK, false, NULL, "", accountLockCommandTable },
+ { "set", RBAC_PERM_COMMAND_ACCOUNT_SET, true, NULL, "", accountSetCommandTable },
+ { "password", RBAC_PERM_COMMAND_ACCOUNT_PASSWORD, false, &HandleAccountPasswordCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_ACCOUNT, false, &HandleAccountCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "account", RBAC_PERM_COMMAND_ACCOUNT, true, NULL, "", accountCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "account", RBAC_PERM_COMMAND_ACCOUNT, true, NULL, "", accountCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
@@ -106,29 +114,36 @@ public:
if (!*args)
return false;
+ std::string email;
+
///- %Parse the command line arguments
char* accountName = strtok((char*)args, " ");
char* password = strtok(NULL, " ");
+ char* possibleEmail = strtok(NULL, " ' ");
+ if (possibleEmail)
+ email = possibleEmail;
+
if (!accountName || !password)
return false;
- AccountOpResult result = sAccountMgr->CreateAccount(std::string(accountName), std::string(password));
+ AccountOpResult result = sAccountMgr->CreateAccount(std::string(accountName), std::string(password), email);
switch (result)
{
case AOR_OK:
handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName);
if (handler->GetSession())
{
- TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %d (IP: %s) Character:[%s] (GUID: %u) Change Password.",
+ TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %d (IP: %s) Character:[%s] (GUID: %u) created Account %s (Email: '%s')",
handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
- handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow());
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),
+ accountName, email.c_str());
}
break;
case AOR_NAME_TOO_LONG:
handler->SendSysMessage(LANG_ACCOUNT_TOO_LONG);
handler->SetSentErrorMessage(true);
return false;
- case AOR_NAME_ALREDY_EXIST:
+ case AOR_NAME_ALREADY_EXIST:
handler->SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST);
handler->SetSentErrorMessage(true);
return false;
@@ -338,6 +353,89 @@ public:
return false;
}
+ static bool HandleAccountEmailCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ char* oldEmail = strtok(NULL, " ");
+ char* password = strtok(NULL, " ");
+ char* email = strtok((char*)args, " ");
+ char* emailConfirmation = strtok(NULL, " ");
+
+ if (!oldEmail || !password || !email || !emailConfirmation)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!AccountMgr::CheckEmail(handler->GetSession()->GetAccountId(), std::string(oldEmail)))
+ {
+ handler->SendSysMessage(LANG_COMMAND_WRONGEMAIL);
+ handler->SetSentErrorMessage(true);
+ TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change email, but the provided email [%s] is not equal to registration email [%s].",
+ handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),
+ email, oldEmail);
+ return false;
+ }
+
+ if (!AccountMgr::CheckPassword(handler->GetSession()->GetAccountId(), std::string(password)))
+ {
+ handler->SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD);
+ handler->SetSentErrorMessage(true);
+ TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change email, but the provided password is wrong.",
+ handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow());
+ return false;
+ }
+
+ if (strcmp(email, oldEmail) == 0)
+ {
+ handler->SendSysMessage(LANG_OLD_EMAIL_IS_NEW_EMAIL);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (strcmp(email, emailConfirmation) != 0)
+ {
+ handler->SendSysMessage(LANG_NEW_EMAILS_NOT_MATCH);
+ handler->SetSentErrorMessage(true);
+ TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change email, but the provided password is wrong.",
+ handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow());
+ return false;
+ }
+
+
+ AccountOpResult result = AccountMgr::ChangeEmail(handler->GetSession()->GetAccountId(), std::string(email));
+ switch (result)
+ {
+ case AOR_OK:
+ handler->SendSysMessage(LANG_COMMAND_EMAIL);
+ TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Changed Email from [%s] to [%s].",
+ handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),
+ oldEmail, email);
+ break;
+ case AOR_EMAIL_TOO_LONG:
+ handler->SendSysMessage(LANG_EMAIL_TOO_LONG);
+ handler->SetSentErrorMessage(true);
+ return false;
+ default:
+ handler->SendSysMessage(LANG_COMMAND_NOTCHANGEEMAIL);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ return true;
+ }
+
static bool HandleAccountPasswordCommand(ChatHandler* handler, char const* args)
{
if (!*args)
@@ -347,9 +445,12 @@ public:
return false;
}
+ uint32 pwConfig = sWorld->getIntConfig(CONFIG_ACC_PASSCHANGESEC); // 0 - PW_NONE, 1 - PW_EMAIL, 2 - PW_RBAC
+
char* oldPassword = strtok((char*)args, " ");
char* newPassword = strtok(NULL, " ");
char* passwordConfirmation = strtok(NULL, " ");
+ char* emailConfirmation = strtok(NULL, " ");
if (!oldPassword || !newPassword || !passwordConfirmation)
{
@@ -358,16 +459,37 @@ public:
return false;
}
+ if ((pwConfig == PW_EMAIL || pwConfig == PW_RBAC && handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE)) && !emailConfirmation)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
+ TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change password, but entered no email at all. Has Perm: [%s]",
+ handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),
+ handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE) ? "Yes" : "No");
+ }
+
if (!AccountMgr::CheckPassword(handler->GetSession()->GetAccountId(), std::string(oldPassword)))
{
handler->SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD);
handler->SetSentErrorMessage(true);
- TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change password.",
+ TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change password, but the provided old password is wrong.",
handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow());
return false;
}
+ if ((pwConfig == PW_EMAIL || pwConfig == PW_RBAC && handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE)) // Either PW_EMAIL or PW_RBAC with the Permission
+ && !AccountMgr::CheckEmail(handler->GetSession()->GetAccountId(), std::string(emailConfirmation)))
+ {
+ handler->SendSysMessage(LANG_COMMAND_WRONGEMAIL);
+ handler->SetSentErrorMessage(true);
+ TC_LOG_INFO(LOG_FILTER_CHARACTER, "Account: %u (IP: %s) Character:[%s] (GUID: %u) Tried to change password, but the entered email [%s] is wrong.",
+ handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),
+ emailConfirmation);
+ }
+
if (strcmp(newPassword, passwordConfirmation) != 0)
{
handler->SendSysMessage(LANG_NEW_PASSWORDS_NOT_MATCH);
@@ -399,8 +521,40 @@ public:
static bool HandleAccountCommand(ChatHandler* handler, char const* /*args*/)
{
+ // GM Level
AccountTypes gmLevel = handler->GetSession()->GetSecurity();
handler->PSendSysMessage(LANG_ACCOUNT_LEVEL, uint32(gmLevel));
+
+ // Security level required
+ bool hasRBAC = (handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE) ? true : false);
+ uint32 pwConfig = sWorld->getIntConfig(CONFIG_ACC_PASSCHANGESEC); // 0 - PW_NONE, 1 - PW_EMAIL, 2 - PW_RBAC
+
+ handler->PSendSysMessage(LANG_ACCOUNT_SEC_TYPE, (pwConfig == PW_NONE ? "Lowest level: No Email input required." :
+ pwConfig == PW_EMAIL ? "Highest level: Email input required." :
+ pwConfig == PW_RBAC ? "Special level: Your account may require email input depending on settings. That is the case if another lien is printed." :
+ "Unknown security level: Notify technician for details."));
+
+ // RBAC required display - is not displayed for console
+ if (pwConfig == PW_RBAC && handler->GetSession() && hasRBAC)
+ handler->PSendSysMessage(LANG_RBAC_EMAIL_REQUIRED);
+
+ // Email display if sufficient rights
+ if (handler->HasPermission(RBAC_PERM_MAY_CHECK_OWN_EMAIL))
+ {
+ std::string emailoutput;
+ uint32 accountId = handler->GetSession()->GetAccountId();
+
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_EMAIL_BY_ID);
+ stmt->setUInt32(0, accountId);
+ PreparedQueryResult result = LoginDatabase.Query(stmt);
+
+ if (result)
+ {
+ emailoutput = (*result)[0].GetString();
+ handler->PSendSysMessage(LANG_COMMAND_EMAIL_OUTPUT, emailoutput.c_str());
+ }
+ }
+
return true;
}
@@ -471,7 +625,11 @@ public:
static bool HandleAccountSetGmLevelCommand(ChatHandler* handler, char const* args)
{
if (!*args)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
return false;
+ }
std::string targetAccountName;
uint32 targetAccountId = 0;
@@ -524,7 +682,7 @@ public:
playerSecurity = SEC_CONSOLE;
// can set security level only for target with less security and to less security that we have
- // This is also reject self apply in fact
+ // This also restricts setting handler's own security.
targetSecurity = AccountMgr::GetSecurity(targetAccountId, gmRealmID);
if (targetSecurity >= playerSecurity || gm >= playerSecurity)
{
@@ -570,7 +728,11 @@ public:
static bool HandleAccountSetPasswordCommand(ChatHandler* handler, char const* args)
{
if (!*args)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
return false;
+ }
///- Get the command line arguments
char* account = strtok((char*)args, " ");
@@ -597,7 +759,7 @@ public:
}
/// can set password only for target with less security
- /// This is also reject self apply in fact
+ /// This also restricts setting handler's own password
if (handler->HasLowerSecurityAccount(NULL, targetAccountId, true))
return false;
@@ -630,6 +792,153 @@ public:
}
return true;
}
+
+ /// Set normal email for account
+ static bool HandleAccountSetEmailCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ ///- Get the command line arguments
+ char* account = strtok((char*)args, " ");
+ char* email = strtok(NULL, " ");
+ char* emailConfirmation = strtok(NULL, " ");
+
+ if (!account || !email || !emailConfirmation)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ std::string accountName = account;
+ if (!AccountMgr::normalizeString(accountName))
+ {
+ handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 targetAccountId = AccountMgr::GetId(accountName);
+ if (!targetAccountId)
+ {
+ handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ /// can set email only for target with less security
+ /// This also restricts setting handler's own email.
+ if (handler->HasLowerSecurityAccount(NULL, targetAccountId, true))
+ return false;
+
+ if (strcmp(email, emailConfirmation) != 0)
+ {
+ handler->SendSysMessage(LANG_NEW_EMAILS_NOT_MATCH);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ AccountOpResult result = AccountMgr::ChangeEmail(targetAccountId, email);
+ switch (result)
+ {
+ case AOR_OK:
+ handler->SendSysMessage(LANG_COMMAND_EMAIL);
+ TC_LOG_INFO(LOG_FILTER_CHARACTER, "ChangeEmail: Account %s [Id: %u] had it's email changed to %s.",
+ accountName.c_str(), targetAccountId, email);
+ break;
+ case AOR_NAME_NOT_EXIST:
+ handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ case AOR_EMAIL_TOO_LONG:
+ handler->SendSysMessage(LANG_EMAIL_TOO_LONG);
+ handler->SetSentErrorMessage(true);
+ return false;
+ default:
+ handler->SendSysMessage(LANG_COMMAND_NOTCHANGEEMAIL);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ return true;
+ }
+
+ /// Change registration email for account
+ static bool HandleAccountSetRegEmailCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ //- We do not want anything short of console to use this by default.
+ //- So we force that.
+ if (handler->GetSession())
+ return false;
+
+ ///- Get the command line arguments
+ char* account = strtok((char*)args, " ");
+ char* email = strtok(NULL, " ");
+ char* emailConfirmation = strtok(NULL, " ");
+
+ if (!account || !email || !emailConfirmation)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ std::string accountName = account;
+ if (!AccountMgr::normalizeString(accountName))
+ {
+ handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 targetAccountId = AccountMgr::GetId(accountName);
+ if (!targetAccountId)
+ {
+ handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ /// can set email only for target with less security
+ /// This also restricts setting handler's own email.
+ if (handler->HasLowerSecurityAccount(NULL, targetAccountId, true))
+ return false;
+
+ if (strcmp(email, emailConfirmation) != 0)
+ {
+ handler->SendSysMessage(LANG_NEW_EMAILS_NOT_MATCH);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ AccountOpResult result = AccountMgr::ChangeRegEmail(targetAccountId, email);
+ switch (result)
+ {
+ case AOR_OK:
+ handler->SendSysMessage(LANG_COMMAND_EMAIL);
+ TC_LOG_INFO(LOG_FILTER_CHARACTER, "ChangeRegEmail: Account %s [Id: %u] had it's Registration Email changed to %s.",
+ accountName.c_str(), targetAccountId, email);
+ break;
+ case AOR_NAME_NOT_EXIST:
+ handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ case AOR_EMAIL_TOO_LONG:
+ handler->SendSysMessage(LANG_EMAIL_TOO_LONG);
+ handler->SetSentErrorMessage(true);
+ return false;
+ default:
+ handler->SendSysMessage(LANG_COMMAND_NOTCHANGEEMAIL);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ return true;
+ }
};
void AddSC_account_commandscript()
diff --git a/src/server/scripts/Commands/cs_cast.cpp b/src/server/scripts/Commands/cs_cast.cpp
index 02a3aec9e82..cbcbbd214b3 100644
--- a/src/server/scripts/Commands/cs_cast.cpp
+++ b/src/server/scripts/Commands/cs_cast.cpp
@@ -37,18 +37,18 @@ public:
{
static ChatCommand castCommandTable[] =
{
- { "back", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastBackCommand, "", NULL },
- { "dist", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastDistCommand, "", NULL },
- { "self", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastSelfCommand, "", NULL },
- { "target", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastTargetCommad, "", NULL },
- { "dest", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastDestCommand, "", NULL },
- { "", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCastCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "back", RBAC_PERM_COMMAND_CAST_BACK, false, &HandleCastBackCommand, "", NULL },
+ { "dist", RBAC_PERM_COMMAND_CAST_DIST, false, &HandleCastDistCommand, "", NULL },
+ { "self", RBAC_PERM_COMMAND_CAST_SELF, false, &HandleCastSelfCommand, "", NULL },
+ { "target", RBAC_PERM_COMMAND_CAST_TARGET, false, &HandleCastTargetCommad, "", NULL },
+ { "dest", RBAC_PERM_COMMAND_CAST_DEST, false, &HandleCastDestCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_CAST, false, &HandleCastCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "cast", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", castCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "cast", RBAC_PERM_COMMAND_CAST, false, NULL, "", castCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp
index d9baa5d56c3..185ce458b61 100644
--- a/src/server/scripts/Commands/cs_character.cpp
+++ b/src/server/scripts/Commands/cs_character.cpp
@@ -39,39 +39,39 @@ public:
{
static ChatCommand pdumpCommandTable[] =
{
- { "load", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandlePDumpLoadCommand, "", NULL },
- { "write", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandlePDumpWriteCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "load", RBAC_PERM_COMMAND_PDUMP_LOAD, true, &HandlePDumpLoadCommand, "", NULL },
+ { "write", RBAC_PERM_COMMAND_PDUMP_WRITE, true, &HandlePDumpWriteCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand characterDeletedCommandTable[] =
{
- { "delete", RBAC_PERM_CONSOLE_COMMANDS, true, &HandleCharacterDeletedDeleteCommand, "", NULL },
- { "list", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleCharacterDeletedListCommand, "", NULL },
- { "restore", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleCharacterDeletedRestoreCommand, "", NULL },
- { "old", RBAC_PERM_CONSOLE_COMMANDS, true, &HandleCharacterDeletedOldCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "delete", RBAC_PERM_COMMAND_CHARACTER_DELETED_DELETE, true, &HandleCharacterDeletedDeleteCommand, "", NULL },
+ { "list", RBAC_PERM_COMMAND_CHARACTER_DELETED_LIST, true, &HandleCharacterDeletedListCommand, "", NULL },
+ { "restore", RBAC_PERM_COMMAND_CHARACTER_DELETED_RESTORE, true, &HandleCharacterDeletedRestoreCommand, "", NULL },
+ { "old", RBAC_PERM_COMMAND_CHARACTER_DELETED_OLD, true, &HandleCharacterDeletedOldCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand characterCommandTable[] =
{
- { "customize", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterCustomizeCommand, "", NULL },
- { "changefaction", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterChangeFactionCommand, "", NULL },
- { "changerace", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterChangeRaceCommand, "", NULL },
- { "deleted", RBAC_PERM_GAMEMASTER_COMMANDS, true, NULL, "", characterDeletedCommandTable },
- { "erase", RBAC_PERM_CONSOLE_COMMANDS, true, &HandleCharacterEraseCommand, "", NULL },
- { "level", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleCharacterLevelCommand, "", NULL },
- { "rename", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterRenameCommand, "", NULL },
- { "reputation", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterReputationCommand, "", NULL },
- { "titles", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCharacterTitlesCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "customize", RBAC_PERM_COMMAND_CHARACTER_CUSTOMIZE, true, &HandleCharacterCustomizeCommand, "", NULL },
+ { "changefaction", RBAC_PERM_COMMAND_CHARACTER_CHANGEFACTION, true, &HandleCharacterChangeFactionCommand, "", NULL },
+ { "changerace", RBAC_PERM_COMMAND_CHARACTER_CHANGERACE, true, &HandleCharacterChangeRaceCommand, "", NULL },
+ { "deleted", RBAC_PERM_COMMAND_CHARACTER_DELETED, true, NULL, "", characterDeletedCommandTable },
+ { "erase", RBAC_PERM_COMMAND_CHARACTER_ERASE, true, &HandleCharacterEraseCommand, "", NULL },
+ { "level", RBAC_PERM_COMMAND_CHARACTER_LEVEL, true, &HandleCharacterLevelCommand, "", NULL },
+ { "rename", RBAC_PERM_COMMAND_CHARACTER_RENAME, true, &HandleCharacterRenameCommand, "", NULL },
+ { "reputation", RBAC_PERM_COMMAND_CHARACTER_REPUTATION, true, &HandleCharacterReputationCommand, "", NULL },
+ { "titles", RBAC_PERM_COMMAND_CHARACTER_TITLES, true, &HandleCharacterTitlesCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "character", RBAC_PERM_GAMEMASTER_COMMANDS, true, NULL, "", characterCommandTable },
- { "levelup", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLevelUpCommand, "", NULL },
- { "pdump", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", pdumpCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "character", RBAC_PERM_COMMAND_CHARACTER, true, NULL, "", characterCommandTable },
+ { "levelup", RBAC_PERM_COMMAND_LEVELUP, false, &HandleLevelUpCommand, "", NULL },
+ { "pdump", RBAC_PERM_COMMAND_PDUMP, true, NULL, "", pdumpCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_cheat.cpp b/src/server/scripts/Commands/cs_cheat.cpp
index 874e79f64e4..4610b12808e 100644
--- a/src/server/scripts/Commands/cs_cheat.cpp
+++ b/src/server/scripts/Commands/cs_cheat.cpp
@@ -38,22 +38,22 @@ public:
static ChatCommand cheatCommandTable[] =
{
- { "god", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGodModeCheatCommand, "", NULL },
- { "casttime", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleCasttimeCheatCommand, "", NULL },
- { "cooldown", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleCoolDownCheatCommand, "", NULL },
- { "power", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandlePowerCheatCommand, "", NULL },
- { "waterwalk", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleWaterWalkCheatCommand, "", NULL },
- { "status", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleCheatStatusCommand, "", NULL },
- { "taxi", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleTaxiCheatCommand, "", NULL },
- { "explore", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleExploreCheatCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "god", RBAC_PERM_COMMAND_CHEAT_GOD, false, &HandleGodModeCheatCommand, "", NULL },
+ { "casttime", RBAC_PERM_COMMAND_CHEAT_CASTTIME, false, &HandleCasttimeCheatCommand, "", NULL },
+ { "cooldown", RBAC_PERM_COMMAND_CHEAT_COOLDOWN, false, &HandleCoolDownCheatCommand, "", NULL },
+ { "power", RBAC_PERM_COMMAND_CHEAT_POWER, false, &HandlePowerCheatCommand, "", NULL },
+ { "waterwalk", RBAC_PERM_COMMAND_CHEAT_WATERWALK, false, &HandleWaterWalkCheatCommand, "", NULL },
+ { "status", RBAC_PERM_COMMAND_CHEAT_STATUS, false, &HandleCheatStatusCommand, "", NULL },
+ { "taxi", RBAC_PERM_COMMAND_CHEAT_TAXI, false, &HandleTaxiCheatCommand, "", NULL },
+ { "explore", RBAC_PERM_COMMAND_CHEAT_EXPLORE, false, &HandleExploreCheatCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "cheat", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", cheatCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "cheat", RBAC_PERM_COMMAND_CHEAT, false, NULL, "", cheatCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 4c099d49773..df80ba3c797 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -44,60 +44,60 @@ public:
{
static ChatCommand debugPlayCommandTable[] =
{
- { "cinematic", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleDebugPlayCinematicCommand, "", NULL },
- { "movie", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleDebugPlayMovieCommand, "", NULL },
- { "sound", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleDebugPlaySoundCommand, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "cinematic", RBAC_PERM_COMMAND_DEBUG_PLAY_CINEMATIC, false, &HandleDebugPlayCinematicCommand, "", NULL },
+ { "movie", RBAC_PERM_COMMAND_DEBUG_PLAY_MOVIE, false, &HandleDebugPlayMovieCommand, "", NULL },
+ { "sound", RBAC_PERM_COMMAND_DEBUG_PLAY_SOUND, false, &HandleDebugPlaySoundCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand debugSendCommandTable[] =
{
- { "buyerror", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendBuyErrorCommand, "", NULL },
- { "channelnotify", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendChannelNotifyCommand, "", NULL },
- { "chatmmessage", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendChatMsgCommand, "", NULL },
- { "equiperror", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendEquipErrorCommand, "", NULL },
- { "largepacket", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendLargePacketCommand, "", NULL },
- { "opcode", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendOpcodeCommand, "", NULL },
- { "qpartymsg", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendQuestPartyMsgCommand, "", NULL },
- { "qinvalidmsg", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendQuestInvalidMsgCommand, "", NULL },
- { "sellerror", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendSellErrorCommand, "", NULL },
- { "setphaseshift", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendSetPhaseShiftCommand, "", NULL },
- { "spellfail", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSendSpellFailCommand, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "buyerror", RBAC_PERM_COMMAND_DEBUG_SEND_BUYERROR, false, &HandleDebugSendBuyErrorCommand, "", NULL },
+ { "channelnotify", RBAC_PERM_COMMAND_DEBUG_SEND_CHANNELNOTIFY, false, &HandleDebugSendChannelNotifyCommand, "", NULL },
+ { "chatmessage", RBAC_PERM_COMMAND_DEBUG_SEND_CHATMESSAGE, false, &HandleDebugSendChatMsgCommand, "", NULL },
+ { "equiperror", RBAC_PERM_COMMAND_DEBUG_SEND_EQUIPERROR, false, &HandleDebugSendEquipErrorCommand, "", NULL },
+ { "largepacket", RBAC_PERM_COMMAND_DEBUG_SEND_LARGEPACKET, false, &HandleDebugSendLargePacketCommand, "", NULL },
+ { "opcode", RBAC_PERM_COMMAND_DEBUG_SEND_OPCODE, false, &HandleDebugSendOpcodeCommand, "", NULL },
+ { "qpartymsg", RBAC_PERM_COMMAND_DEBUG_SEND_QPARTYMSG, false, &HandleDebugSendQuestPartyMsgCommand, "", NULL },
+ { "qinvalidmsg", RBAC_PERM_COMMAND_DEBUG_SEND_QINVALIDMSG, false, &HandleDebugSendQuestInvalidMsgCommand, "", NULL },
+ { "sellerror", RBAC_PERM_COMMAND_DEBUG_SEND_SELLERROR, false, &HandleDebugSendSellErrorCommand, "", NULL },
+ { "setphaseshift", RBAC_PERM_COMMAND_DEBUG_SEND_SETPHASESHIFT, false, &HandleDebugSendSetPhaseShiftCommand, "", NULL },
+ { "spellfail", RBAC_PERM_COMMAND_DEBUG_SEND_SPELLFAIL, false, &HandleDebugSendSpellFailCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand debugCommandTable[] =
{
- { "setbit", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSet32BitCommand, "", NULL },
- { "threat", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugThreatListCommand, "", NULL },
- { "hostil", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugHostileRefListCommand, "", NULL },
- { "anim", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleDebugAnimCommand, "", NULL },
- { "arena", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugArenaCommand, "", NULL },
- { "bg", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugBattlegroundCommand, "", NULL },
- { "getitemstate", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugGetItemStateCommand, "", NULL },
- { "lootrecipient", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleDebugGetLootRecipientCommand, "", NULL },
- { "getvalue", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugGetValueCommand, "", NULL },
- { "getitemvalue", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugGetItemValueCommand, "", NULL },
- { "Mod32Value", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugMod32ValueCommand, "", NULL },
- { "play", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", debugPlayCommandTable },
- { "send", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", debugSendCommandTable },
- { "setaurastate", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSetAuraStateCommand, "", NULL },
- { "setitemvalue", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSetItemValueCommand, "", NULL },
- { "setvalue", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSetValueCommand, "", NULL },
- { "spawnvehicle", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSpawnVehicleCommand, "", NULL },
- { "setvid", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugSetVehicleIdCommand, "", NULL },
- { "entervehicle", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugEnterVehicleCommand, "", NULL },
- { "uws", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugUpdateWorldStateCommand, "", NULL },
- { "update", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugUpdateCommand, "", NULL },
- { "itemexpire", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugItemExpireCommand, "", NULL },
- { "areatriggers", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugAreaTriggersCommand, "", NULL },
- { "los", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleDebugLoSCommand, "", NULL },
- { "moveflags", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDebugMoveflagsCommand, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "setbit", RBAC_PERM_COMMAND_DEBUG_SETBIT, false, &HandleDebugSet32BitCommand, "", NULL },
+ { "threat", RBAC_PERM_COMMAND_DEBUG_THREAT, false, &HandleDebugThreatListCommand, "", NULL },
+ { "hostil", RBAC_PERM_COMMAND_DEBUG_HOSTIL, false, &HandleDebugHostileRefListCommand, "", NULL },
+ { "anim", RBAC_PERM_COMMAND_DEBUG_ANIM, false, &HandleDebugAnimCommand, "", NULL },
+ { "arena", RBAC_PERM_COMMAND_DEBUG_ARENA, false, &HandleDebugArenaCommand, "", NULL },
+ { "bg", RBAC_PERM_COMMAND_DEBUG_BG, false, &HandleDebugBattlegroundCommand, "", NULL },
+ { "getitemstate", RBAC_PERM_COMMAND_DEBUG_GETITEMSTATE, false, &HandleDebugGetItemStateCommand, "", NULL },
+ { "lootrecipient", RBAC_PERM_COMMAND_DEBUG_LOOTRECIPIENT, false, &HandleDebugGetLootRecipientCommand, "", NULL },
+ { "getvalue", RBAC_PERM_COMMAND_DEBUG_GETVALUE, false, &HandleDebugGetValueCommand, "", NULL },
+ { "getitemvalue", RBAC_PERM_COMMAND_DEBUG_GETITEMVALUE, false, &HandleDebugGetItemValueCommand, "", NULL },
+ { "Mod32Value", RBAC_PERM_COMMAND_DEBUG_MOD32VALUE, false, &HandleDebugMod32ValueCommand, "", NULL },
+ { "play", RBAC_PERM_COMMAND_DEBUG_PLAY, false, NULL, "", debugPlayCommandTable },
+ { "send", RBAC_PERM_COMMAND_DEBUG_SEND, false, NULL, "", debugSendCommandTable },
+ { "setaurastate", RBAC_PERM_COMMAND_DEBUG_SETAURASTATE, false, &HandleDebugSetAuraStateCommand, "", NULL },
+ { "setitemvalue", RBAC_PERM_COMMAND_DEBUG_SETITEMVALUE, false, &HandleDebugSetItemValueCommand, "", NULL },
+ { "setvalue", RBAC_PERM_COMMAND_DEBUG_SETVALUE, false, &HandleDebugSetValueCommand, "", NULL },
+ { "spawnvehicle", RBAC_PERM_COMMAND_DEBUG_SPAWNVEHICLE, false, &HandleDebugSpawnVehicleCommand, "", NULL },
+ { "setvid", RBAC_PERM_COMMAND_DEBUG_SETVID, false, &HandleDebugSetVehicleIdCommand, "", NULL },
+ { "entervehicle", RBAC_PERM_COMMAND_DEBUG_ENTERVEHICLE, false, &HandleDebugEnterVehicleCommand, "", NULL },
+ { "uws", RBAC_PERM_COMMAND_DEBUG_UWS, false, &HandleDebugUpdateWorldStateCommand, "", NULL },
+ { "update", RBAC_PERM_COMMAND_DEBUG_UPDATE, false, &HandleDebugUpdateCommand, "", NULL },
+ { "itemexpire", RBAC_PERM_COMMAND_DEBUG_ITEMEXPIRE, false, &HandleDebugItemExpireCommand, "", NULL },
+ { "areatriggers", RBAC_PERM_COMMAND_DEBUG_AREATRIGGERS, false, &HandleDebugAreaTriggersCommand, "", NULL },
+ { "los", RBAC_PERM_COMMAND_DEBUG_LOS, false, &HandleDebugLoSCommand, "", NULL },
+ { "moveflags", RBAC_PERM_COMMAND_DEBUG_MOVEFLAGS, false, &HandleDebugMoveflagsCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "debug", RBAC_PERM_MODERATOR_COMMANDS, true, NULL, "", debugCommandTable },
- { "wpgps", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleWPGPSCommand, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "debug", RBAC_PERM_COMMAND_DEBUG, true, NULL, "", debugCommandTable },
+ { "wpgps", RBAC_PERM_COMMAND_WPGPS, false, &HandleWPGPSCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_deserter.cpp b/src/server/scripts/Commands/cs_deserter.cpp
index 583b6b741bd..aa0d34e3638 100644
--- a/src/server/scripts/Commands/cs_deserter.cpp
+++ b/src/server/scripts/Commands/cs_deserter.cpp
@@ -47,27 +47,27 @@ public:
{
static ChatCommand deserterInstanceCommandTable[] =
{
- { "add", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDeserterInstanceAdd, "", NULL },
- { "remove", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDeserterInstanceRemove, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "add", RBAC_PERM_COMMAND_DESERTER_INSTANCE_ADD, false, &HandleDeserterInstanceAdd, "", NULL },
+ { "remove", RBAC_PERM_COMMAND_DESERTER_INSTANCE_REMOVE, false, &HandleDeserterInstanceRemove, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand deserterBGCommandTable[] =
{
- { "add", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDeserterBGAdd, "", NULL },
- { "remove", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDeserterBGRemove, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "add", RBAC_PERM_COMMAND_DESERTER_BG_ADD, false, &HandleDeserterBGAdd, "", NULL },
+ { "remove", RBAC_PERM_COMMAND_DESERTER_BG_REMOVE, false, &HandleDeserterBGRemove, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand deserterCommandTable[] =
{
- { "instance", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", deserterInstanceCommandTable },
- { "bg", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", deserterBGCommandTable },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "instance", RBAC_PERM_COMMAND_DESERTER_INSTANCE, false, NULL, "", deserterInstanceCommandTable },
+ { "bg", RBAC_PERM_COMMAND_DESERTER_BG, false, NULL, "", deserterBGCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "deserter", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", deserterCommandTable },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "deserter", RBAC_PERM_COMMAND_DESERTER, false, NULL, "", deserterCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp
index 038727a6207..23e7fa8eb98 100644
--- a/src/server/scripts/Commands/cs_disable.cpp
+++ b/src/server/scripts/Commands/cs_disable.cpp
@@ -41,38 +41,38 @@ public:
{
static ChatCommand removeDisableCommandTable[] =
{
- { "spell", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableSpellCommand, "", NULL },
- { "quest", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableQuestCommand, "", NULL },
- { "map", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableMapCommand, "", NULL },
- { "battleground", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableBattlegroundCommand, "", NULL },
- { "achievement_criteria", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableAchievementCriteriaCommand, "", NULL },
- { "outdoorpvp", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableOutdoorPvPCommand, "", NULL },
- { "vmap", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableVmapCommand, "", NULL },
- { "mmap", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleRemoveDisableMMapCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "spell", RBAC_PERM_COMMAND_DISABLE_REMOVE_SPELL, true, &HandleRemoveDisableSpellCommand, "", NULL },
+ { "quest", RBAC_PERM_COMMAND_DISABLE_REMOVE_QUEST, true, &HandleRemoveDisableQuestCommand, "", NULL },
+ { "map", RBAC_PERM_COMMAND_DISABLE_REMOVE_MAP, true, &HandleRemoveDisableMapCommand, "", NULL },
+ { "battleground", RBAC_PERM_COMMAND_DISABLE_REMOVE_BATTLEGROUND, true, &HandleRemoveDisableBattlegroundCommand, "", NULL },
+ { "achievement_criteria", RBAC_PERM_COMMAND_DISABLE_REMOVE_ACHIEVEMENT_CRITERIA, true, &HandleRemoveDisableAchievementCriteriaCommand, "", NULL },
+ { "outdoorpvp", RBAC_PERM_COMMAND_DISABLE_REMOVE_OUTDOORPVP, true, &HandleRemoveDisableOutdoorPvPCommand, "", NULL },
+ { "vmap", RBAC_PERM_COMMAND_DISABLE_REMOVE_VMAP, true, &HandleRemoveDisableVmapCommand, "", NULL },
+ { "mmap", RBAC_PERM_COMMAND_DISABLE_REMOVE_MMAP, true, &HandleRemoveDisableMMapCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand addDisableCommandTable[] =
{
- { "spell", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableSpellCommand, "", NULL },
- { "quest", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableQuestCommand, "", NULL },
- { "map", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableMapCommand, "", NULL },
- { "battleground", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableBattlegroundCommand, "", NULL },
- { "achievement_criteria", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableAchievementCriteriaCommand, "", NULL },
- { "outdoorpvp", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableOutdoorPvPCommand, "", NULL },
- { "vmap", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableVmapCommand, "", NULL },
- { "mmap", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleAddDisableMMapCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "spell", RBAC_PERM_COMMAND_DISABLE_ADD_SPELL, true, &HandleAddDisableSpellCommand, "", NULL },
+ { "quest", RBAC_PERM_COMMAND_DISABLE_ADD_QUEST, true, &HandleAddDisableQuestCommand, "", NULL },
+ { "map", RBAC_PERM_COMMAND_DISABLE_ADD_MAP, true, &HandleAddDisableMapCommand, "", NULL },
+ { "battleground", RBAC_PERM_COMMAND_DISABLE_ADD_BATTLEGROUND, true, &HandleAddDisableBattlegroundCommand, "", NULL },
+ { "achievement_criteria", RBAC_PERM_COMMAND_DISABLE_ADD_ACHIEVEMENT_CRITERIA, true, &HandleAddDisableAchievementCriteriaCommand, "", NULL },
+ { "outdoorpvp", RBAC_PERM_COMMAND_DISABLE_ADD_OUTDOORPVP, true, &HandleAddDisableOutdoorPvPCommand, "", NULL },
+ { "vmap", RBAC_PERM_COMMAND_DISABLE_ADD_VMAP, true, &HandleAddDisableVmapCommand, "", NULL },
+ { "mmap", RBAC_PERM_COMMAND_DISABLE_ADD_MMAP, true, &HandleAddDisableMMapCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand disableCommandTable[] =
{
- { "add", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", addDisableCommandTable },
- { "remove", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", removeDisableCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "add", RBAC_PERM_COMMAND_DISABLE_ADD, true, NULL, "", addDisableCommandTable },
+ { "remove", RBAC_PERM_COMMAND_DISABLE_REMOVE, true, NULL, "", removeDisableCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "disable", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", disableCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "disable", RBAC_PERM_COMMAND_DISABLE, false, NULL, "", disableCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_event.cpp b/src/server/scripts/Commands/cs_event.cpp
index 0deb0c95fcc..491ae65e0ca 100644
--- a/src/server/scripts/Commands/cs_event.cpp
+++ b/src/server/scripts/Commands/cs_event.cpp
@@ -37,16 +37,16 @@ public:
{
static ChatCommand eventCommandTable[] =
{
- { "activelist", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleEventActiveListCommand, "", NULL },
- { "start", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleEventStartCommand, "", NULL },
- { "stop", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleEventStopCommand, "", NULL },
- { "", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleEventInfoCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "activelist", RBAC_PERM_COMMAND_EVENT_ACTIVELIST, true, &HandleEventActiveListCommand, "", NULL },
+ { "start", RBAC_PERM_COMMAND_EVENT_START, true, &HandleEventStartCommand, "", NULL },
+ { "stop", RBAC_PERM_COMMAND_EVENT_STOP, true, &HandleEventStopCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_EVENT, true, &HandleEventInfoCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "event", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", eventCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "event", RBAC_PERM_COMMAND_EVENT, false, NULL, "", eventCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp
index 0eb5bc1ef69..24eff29e271 100644
--- a/src/server/scripts/Commands/cs_gm.cpp
+++ b/src/server/scripts/Commands/cs_gm.cpp
@@ -40,18 +40,18 @@ public:
{
static ChatCommand gmCommandTable[] =
{
- { "chat", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGMChatCommand, "", NULL },
- { "fly", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGMFlyCommand, "", NULL },
- { "ingame", RBAC_PERM_PLAYER_COMMANDS, true, &HandleGMListIngameCommand, "", NULL },
- { "list", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleGMListFullCommand, "", NULL },
- { "visible", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGMVisibleCommand, "", NULL },
- { "", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGMCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "chat", RBAC_PERM_COMMAND_GM_CHAT, false, &HandleGMChatCommand, "", NULL },
+ { "fly", RBAC_PERM_COMMAND_GM_FLY, false, &HandleGMFlyCommand, "", NULL },
+ { "ingame", RBAC_PERM_COMMAND_GM_INGAME, true, &HandleGMListIngameCommand, "", NULL },
+ { "list", RBAC_PERM_COMMAND_GM_LIST, true, &HandleGMListFullCommand, "", NULL },
+ { "visible", RBAC_PERM_COMMAND_GM_VISIBLE, false, &HandleGMVisibleCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_GM, false, &HandleGMCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "gm", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", gmCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "gm", RBAC_PERM_COMMAND_GM, false, NULL, "", gmCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp
index 21a545ae3f9..caa7979f866 100644
--- a/src/server/scripts/Commands/cs_go.cpp
+++ b/src/server/scripts/Commands/cs_go.cpp
@@ -39,23 +39,23 @@ public:
{
static ChatCommand goCommandTable[] =
{
- { "creature", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoCreatureCommand, "", NULL },
- { "graveyard", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoGraveyardCommand, "", NULL },
- { "grid", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoGridCommand, "", NULL },
- { "object", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoObjectCommand, "", NULL },
- { "taxinode", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoTaxinodeCommand, "", NULL },
- { "trigger", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoTriggerCommand, "", NULL },
- { "zonexy", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoZoneXYCommand, "", NULL },
- { "xyz", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoXYZCommand, "", NULL },
- { "ticket", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoTicketCommand, "", NULL },
- { "", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGoXYZCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "creature", RBAC_PERM_COMMAND_GO_CREATURE, false, &HandleGoCreatureCommand, "", NULL },
+ { "graveyard", RBAC_PERM_COMMAND_GO_GRAVEYARD, false, &HandleGoGraveyardCommand, "", NULL },
+ { "grid", RBAC_PERM_COMMAND_GO_GRID, false, &HandleGoGridCommand, "", NULL },
+ { "object", RBAC_PERM_COMMAND_GO_OBJECT, false, &HandleGoObjectCommand, "", NULL },
+ { "taxinode", RBAC_PERM_COMMAND_GO_TAXINODE, false, &HandleGoTaxinodeCommand, "", NULL },
+ { "trigger", RBAC_PERM_COMMAND_GO_TRIGGER, false, &HandleGoTriggerCommand, "", NULL },
+ { "zonexy", RBAC_PERM_COMMAND_GO_ZONEXY, false, &HandleGoZoneXYCommand, "", NULL },
+ { "xyz", RBAC_PERM_COMMAND_GO_XYZ, false, &HandleGoXYZCommand, "", NULL },
+ { "ticket", RBAC_PERM_COMMAND_GO_TICKET, false, &HandleGoTicketCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_GO, false, &HandleGoXYZCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "go", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", goCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "go", RBAC_PERM_COMMAND_GO, false, NULL, "", goCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp
index 140219cdf3c..2c5e9923f6e 100644
--- a/src/server/scripts/Commands/cs_gobject.cpp
+++ b/src/server/scripts/Commands/cs_gobject.cpp
@@ -41,33 +41,33 @@ public:
{
static ChatCommand gobjectAddCommandTable[] =
{
- { "temp", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectAddTempCommand, "", NULL },
- { "", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectAddCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "temp", RBAC_PERM_COMMAND_GOBJECT_ADD_TEMP, false, &HandleGameObjectAddTempCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_GOBJECT_ADD, false, &HandleGameObjectAddCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand gobjectSetCommandTable[] =
{
- { "phase", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectSetPhaseCommand, "", NULL },
- { "state", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectSetStateCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "phase", RBAC_PERM_COMMAND_GOBJECT_SET_PHASE, false, &HandleGameObjectSetPhaseCommand, "", NULL },
+ { "state", RBAC_PERM_COMMAND_GOBJECT_SET_STATE, false, &HandleGameObjectSetStateCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand gobjectCommandTable[] =
{
- { "activate", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectActivateCommand, "", NULL },
- { "delete", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectDeleteCommand, "", NULL },
- { "info", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectInfoCommand, "", NULL },
- { "move", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectMoveCommand, "", NULL },
- { "near", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectNearCommand, "", NULL },
- { "target", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectTargetCommand, "", NULL },
- { "turn", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGameObjectTurnCommand, "", NULL },
- { "add", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", gobjectAddCommandTable },
- { "set", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", gobjectSetCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "activate", RBAC_PERM_COMMAND_GOBJECT_ACTIVATE, false, &HandleGameObjectActivateCommand, "", NULL },
+ { "delete", RBAC_PERM_COMMAND_GOBJECT_DELETE, false, &HandleGameObjectDeleteCommand, "", NULL },
+ { "info", RBAC_PERM_COMMAND_GOBJECT_INFO, false, &HandleGameObjectInfoCommand, "", NULL },
+ { "move", RBAC_PERM_COMMAND_GOBJECT_MOVE, false, &HandleGameObjectMoveCommand, "", NULL },
+ { "near", RBAC_PERM_COMMAND_GOBJECT_NEAR, false, &HandleGameObjectNearCommand, "", NULL },
+ { "target", RBAC_PERM_COMMAND_GOBJECT_TARGET, false, &HandleGameObjectTargetCommand, "", NULL },
+ { "turn", RBAC_PERM_COMMAND_GOBJECT_TURN, false, &HandleGameObjectTurnCommand, "", NULL },
+ { "add", RBAC_PERM_COMMAND_GOBJECT_ADD, false, NULL, "", gobjectAddCommandTable },
+ { "set", RBAC_PERM_COMMAND_GOBJECT_SET, false, NULL, "", gobjectSetCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "gobject", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", gobjectCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "gobject", RBAC_PERM_COMMAND_GOBJECT, false, NULL, "", gobjectCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp
index f1251cb2932..0af0da10846 100644
--- a/src/server/scripts/Commands/cs_guild.cpp
+++ b/src/server/scripts/Commands/cs_guild.cpp
@@ -38,18 +38,18 @@ public:
{
static ChatCommand guildCommandTable[] =
{
- { "create", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildCreateCommand, "", NULL },
- { "delete", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildDeleteCommand, "", NULL },
- { "invite", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildInviteCommand, "", NULL },
- { "uninvite", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildUninviteCommand, "", NULL },
- { "rank", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildRankCommand, "", NULL },
- { "rename", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGuildRenameCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "create", RBAC_PERM_COMMAND_GUILD_CREATE, true, &HandleGuildCreateCommand, "", NULL },
+ { "delete", RBAC_PERM_COMMAND_GUILD_DELETE, true, &HandleGuildDeleteCommand, "", NULL },
+ { "invite", RBAC_PERM_COMMAND_GUILD_INVITE, true, &HandleGuildInviteCommand, "", NULL },
+ { "uninvite", RBAC_PERM_COMMAND_GUILD_UNINVITE, true, &HandleGuildUninviteCommand, "", NULL },
+ { "rank", RBAC_PERM_COMMAND_GUILD_RANK, true, &HandleGuildRankCommand, "", NULL },
+ { "rename", RBAC_PERM_COMMAND_GUILD_RENAME, true, &HandleGuildRenameCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "guild", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", guildCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "guild", RBAC_PERM_COMMAND_GUILD, true, NULL, "", guildCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_honor.cpp b/src/server/scripts/Commands/cs_honor.cpp
index 4707e3d65c3..cd8e2630a67 100644
--- a/src/server/scripts/Commands/cs_honor.cpp
+++ b/src/server/scripts/Commands/cs_honor.cpp
@@ -37,22 +37,22 @@ public:
{
static ChatCommand honorAddCommandTable[] =
{
- { "kill", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleHonorAddKillCommand, "", NULL },
- { "", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleHonorAddCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "kill", RBAC_PERM_COMMAND_HONOR_ADD_KILL, false, &HandleHonorAddKillCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_HONOR_ADD, false, &HandleHonorAddCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand honorCommandTable[] =
{
- { "add", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", honorAddCommandTable },
- { "update", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleHonorUpdateCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "add", RBAC_PERM_COMMAND_HONOR_ADD, false, NULL, "", honorAddCommandTable },
+ { "update", RBAC_PERM_COMMAND_HONOR_UPDATE, false, &HandleHonorUpdateCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "honor", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", honorCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "honor", RBAC_PERM_COMMAND_HONOR, false, NULL, "", honorCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_instance.cpp b/src/server/scripts/Commands/cs_instance.cpp
index 65dfa46ebd7..b597caf0ae0 100644
--- a/src/server/scripts/Commands/cs_instance.cpp
+++ b/src/server/scripts/Commands/cs_instance.cpp
@@ -39,17 +39,17 @@ public:
{
static ChatCommand instanceCommandTable[] =
{
- { "listbinds", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleInstanceListBindsCommand, "", NULL },
- { "unbind", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleInstanceUnbindCommand, "", NULL },
- { "stats", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleInstanceStatsCommand, "", NULL },
- { "savedata", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleInstanceSaveDataCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "listbinds", RBAC_PERM_COMMAND_INSTANCE_LISTBINDS, false, &HandleInstanceListBindsCommand, "", NULL },
+ { "unbind", RBAC_PERM_COMMAND_INSTANCE_UNBIND, false, &HandleInstanceUnbindCommand, "", NULL },
+ { "stats", RBAC_PERM_COMMAND_INSTANCE_STATS, true, &HandleInstanceStatsCommand, "", NULL },
+ { "savedata", RBAC_PERM_COMMAND_INSTANCE_SAVEDATA, false, &HandleInstanceSaveDataCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "instance", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", instanceCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "instance", RBAC_PERM_COMMAND_INSTANCE, true, NULL, "", instanceCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp
index f2ff911fdf9..5c97e80aede 100644
--- a/src/server/scripts/Commands/cs_learn.cpp
+++ b/src/server/scripts/Commands/cs_learn.cpp
@@ -40,36 +40,36 @@ public:
{
static ChatCommand learnAllMyCommandTable[] =
{
- { "class", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLearnAllMyClassCommand, "", NULL },
- { "pettalents", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLearnAllMyPetTalentsCommand, "", NULL },
- { "spells", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLearnAllMySpellsCommand, "", NULL },
- { "talents", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLearnAllMyTalentsCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "class", RBAC_PERM_COMMAND_LEARN_ALL_MY_CLASS, false, &HandleLearnAllMyClassCommand, "", NULL },
+ { "pettalents", RBAC_PERM_COMMAND_LEARN_ALL_MY_PETTALENTS, false, &HandleLearnAllMyPetTalentsCommand, "", NULL },
+ { "spells", RBAC_PERM_COMMAND_LEARN_ALL_MY_SPELLS, false, &HandleLearnAllMySpellsCommand, "", NULL },
+ { "talents", RBAC_PERM_COMMAND_LEARN_ALL_MY_TALENTS, false, &HandleLearnAllMyTalentsCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand learnAllCommandTable[] =
{
- { "my", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", learnAllMyCommandTable },
- { "gm", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLearnAllGMCommand, "", NULL },
- { "crafts", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLearnAllCraftsCommand, "", NULL },
- { "default", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleLearnAllDefaultCommand, "", NULL },
- { "lang", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleLearnAllLangCommand, "", NULL },
- { "recipes", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLearnAllRecipesCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "my", RBAC_PERM_COMMAND_LEARN_ALL_MY, false, NULL, "", learnAllMyCommandTable },
+ { "gm", RBAC_PERM_COMMAND_LEARN_ALL_GM, false, &HandleLearnAllGMCommand, "", NULL },
+ { "crafts", RBAC_PERM_COMMAND_LEARN_ALL_CRAFTS, false, &HandleLearnAllCraftsCommand, "", NULL },
+ { "default", RBAC_PERM_COMMAND_LEARN_ALL_DEFAULT, false, &HandleLearnAllDefaultCommand, "", NULL },
+ { "lang", RBAC_PERM_COMMAND_LEARN_ALL_LANG, false, &HandleLearnAllLangCommand, "", NULL },
+ { "recipes", RBAC_PERM_COMMAND_LEARN_ALL_RECIPES, false, &HandleLearnAllRecipesCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand learnCommandTable[] =
{
- { "all", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", learnAllCommandTable },
- { "", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLearnCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "all", RBAC_PERM_COMMAND_LEARN_ALL, false, NULL, "", learnAllCommandTable },
+ { "", RBAC_PERM_COMMAND_LEARN, false, &HandleLearnCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "learn", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", learnCommandTable },
- { "unlearn", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleUnLearnCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "learn", RBAC_PERM_COMMAND_LEARN, false, NULL, "", learnCommandTable },
+ { "unlearn", RBAC_PERM_COMMAND_UNLEARN, false, &HandleUnLearnCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
@@ -339,8 +339,12 @@ public:
return true;
}
- static bool HandleLearnAllCraftsCommand(ChatHandler* handler, char const* /*args*/)
+ static bool HandleLearnAllCraftsCommand(ChatHandler* handler, char const* args)
{
+ Player* target;
+ if (!handler->extractPlayerTarget((char*)args, &target))
+ return false;
+
for (uint32 i = 0; i < sSkillLineStore.GetNumRows(); ++i)
{
SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(i);
@@ -350,7 +354,7 @@ public:
if ((skillInfo->categoryId == SKILL_CATEGORY_PROFESSION || skillInfo->categoryId == SKILL_CATEGORY_SECONDARY) &&
skillInfo->canLink) // only prof. with recipes have
{
- HandleLearnSkillRecipesHelper(handler->GetSession()->GetPlayer(), skillInfo->id);
+ HandleLearnSkillRecipesHelper(target, skillInfo->id);
}
}
diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp
index c11a00c7bba..76d9fe50de1 100644
--- a/src/server/scripts/Commands/cs_lfg.cpp
+++ b/src/server/scripts/Commands/cs_lfg.cpp
@@ -45,18 +45,18 @@ public:
{
static ChatCommand lfgCommandTable[] =
{
- { "player", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLfgPlayerInfoCommand, "", NULL },
- { "group", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLfgGroupInfoCommand, "", NULL },
- { "queue", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleLfgQueueInfoCommand, "", NULL },
- { "clean", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLfgCleanCommand, "", NULL },
- { "options", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLfgOptionsCommand, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "player", RBAC_PERM_COMMAND_LFG_PLAYER, false, &HandleLfgPlayerInfoCommand, "", NULL },
+ { "group", RBAC_PERM_COMMAND_LFG_GROUP, false, &HandleLfgGroupInfoCommand, "", NULL },
+ { "queue", RBAC_PERM_COMMAND_LFG_QUEUE, false, &HandleLfgQueueInfoCommand, "", NULL },
+ { "clean", RBAC_PERM_COMMAND_LFG_CLEAN, false, &HandleLfgCleanCommand, "", NULL },
+ { "options", RBAC_PERM_COMMAND_LFG_OPTIONS, false, &HandleLfgOptionsCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "lfg", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", lfgCommandTable },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "lfg", RBAC_PERM_COMMAND_LFG, false, NULL, "", lfgCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp
index 228eb1afb80..83e4fc01769 100644
--- a/src/server/scripts/Commands/cs_list.cpp
+++ b/src/server/scripts/Commands/cs_list.cpp
@@ -40,17 +40,17 @@ public:
{
static ChatCommand listCommandTable[] =
{
- { "creature", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleListCreatureCommand, "", NULL },
- { "item", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleListItemCommand, "", NULL },
- { "object", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleListObjectCommand, "", NULL },
- { "auras", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleListAurasCommand, "", NULL },
- { "mail", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleListMailCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "creature", RBAC_PERM_COMMAND_LIST_CREATURE, true, &HandleListCreatureCommand, "", NULL },
+ { "item", RBAC_PERM_COMMAND_LIST_ITEM, true, &HandleListItemCommand, "", NULL },
+ { "object", RBAC_PERM_COMMAND_LIST_OBJECT, true, &HandleListObjectCommand, "", NULL },
+ { "auras", RBAC_PERM_COMMAND_LIST_AURAS, false, &HandleListAurasCommand, "", NULL },
+ { "mail", RBAC_PERM_COMMAND_LIST_MAIL, true, &HandleListMailCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "list", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", listCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "list", RBAC_PERM_COMMAND_LIST,true, NULL, "", listCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp
index 990c82df568..56b492a8081 100644
--- a/src/server/scripts/Commands/cs_lookup.cpp
+++ b/src/server/scripts/Commands/cs_lookup.cpp
@@ -41,43 +41,43 @@ public:
{
static ChatCommand lookupPlayerCommandTable[] =
{
- { "ip", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleLookupPlayerIpCommand, "", NULL },
- { "account", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleLookupPlayerAccountCommand, "", NULL },
- { "email", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleLookupPlayerEmailCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "ip", RBAC_PERM_COMMAND_LOOKUP_PLAYER_IP, true, &HandleLookupPlayerIpCommand, "", NULL },
+ { "account", RBAC_PERM_COMMAND_LOOKUP_PLAYER_ACCOUNT, true, &HandleLookupPlayerAccountCommand, "", NULL },
+ { "email", RBAC_PERM_COMMAND_LOOKUP_PLAYER_EMAIL, true, &HandleLookupPlayerEmailCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand lookupSpellCommandTable[] =
{
- { "id", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupSpellIdCommand, "", NULL },
- { "", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupSpellCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "id", RBAC_PERM_COMMAND_LOOKUP_SPELL_ID, true, &HandleLookupSpellIdCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_LOOKUP_SPELL, true, &HandleLookupSpellCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand lookupCommandTable[] =
{
- { "area", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleLookupAreaCommand, "", NULL },
- { "creature", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupCreatureCommand, "", NULL },
- { "event", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleLookupEventCommand, "", NULL },
- { "faction", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupFactionCommand, "", NULL },
- { "item", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupItemCommand, "", NULL },
- { "itemset", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupItemSetCommand, "", NULL },
- { "object", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupObjectCommand, "", NULL },
- { "quest", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupQuestCommand, "", NULL },
- { "player", RBAC_PERM_GAMEMASTER_COMMANDS, true, NULL, "", lookupPlayerCommandTable },
- { "skill", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupSkillCommand, "", NULL },
- { "spell", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", lookupSpellCommandTable },
- { "taxinode", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupTaxiNodeCommand, "", NULL },
- { "tele", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleLookupTeleCommand, "", NULL },
- { "title", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleLookupTitleCommand, "", NULL },
- { "map", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleLookupMapCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "area", RBAC_PERM_COMMAND_LOOKUP_AREA, true, &HandleLookupAreaCommand, "", NULL },
+ { "creature", RBAC_PERM_COMMAND_LOOKUP_CREATURE, true, &HandleLookupCreatureCommand, "", NULL },
+ { "event", RBAC_PERM_COMMAND_LOOKUP_EVENT, true, &HandleLookupEventCommand, "", NULL },
+ { "faction", RBAC_PERM_COMMAND_LOOKUP_FACTION, true, &HandleLookupFactionCommand, "", NULL },
+ { "item", RBAC_PERM_COMMAND_LOOKUP_ITEM, true, &HandleLookupItemCommand, "", NULL },
+ { "itemset", RBAC_PERM_COMMAND_LOOKUP_ITEMSET, true, &HandleLookupItemSetCommand, "", NULL },
+ { "object", RBAC_PERM_COMMAND_LOOKUP_OBJECT, true, &HandleLookupObjectCommand, "", NULL },
+ { "quest", RBAC_PERM_COMMAND_LOOKUP_QUEST, true, &HandleLookupQuestCommand, "", NULL },
+ { "player", RBAC_PERM_COMMAND_LOOKUP_PLAYER, true, NULL, "", lookupPlayerCommandTable },
+ { "skill", RBAC_PERM_COMMAND_LOOKUP_SKILL, true, &HandleLookupSkillCommand, "", NULL },
+ { "spell", RBAC_PERM_COMMAND_LOOKUP_SPELL, true, NULL, "", lookupSpellCommandTable },
+ { "taxinode", RBAC_PERM_COMMAND_LOOKUP_TAXINODE, true, &HandleLookupTaxiNodeCommand, "", NULL },
+ { "tele", RBAC_PERM_COMMAND_LOOKUP_TELE, true, &HandleLookupTeleCommand, "", NULL },
+ { "title", RBAC_PERM_COMMAND_LOOKUP_TITLE, true, &HandleLookupTitleCommand, "", NULL },
+ { "map", RBAC_PERM_COMMAND_LOOKUP_MAP, true, &HandleLookupMapCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "lookup", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", lookupCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "lookup", RBAC_PERM_COMMAND_LOOKUP, true, NULL, "", lookupCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp
index 334968037c3..8c06d87bd7c 100644
--- a/src/server/scripts/Commands/cs_message.cpp
+++ b/src/server/scripts/Commands/cs_message.cpp
@@ -38,25 +38,25 @@ public:
{
static ChatCommand channelSetCommandTable[] =
{
- { "ownership", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleChannelSetOwnership, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "ownership", RBAC_PERM_COMMAND_CHANNEL_SET_OWNERSHIP, false, &HandleChannelSetOwnership, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand channelCommandTable[] =
{
- { "set", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", channelSetCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "set", RBAC_PERM_COMMAND_CHANNEL_SET, true, NULL, "", channelSetCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "channel", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", channelCommandTable },
- { "nameannounce", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleNameAnnounceCommand, "", NULL },
- { "gmnameannounce", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMNameAnnounceCommand, "", NULL },
- { "announce", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleAnnounceCommand, "", NULL },
- { "gmannounce", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMAnnounceCommand, "", NULL },
- { "notify", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleNotifyCommand, "", NULL },
- { "gmnotify", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMNotifyCommand, "", NULL },
- { "whispers", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleWhispersCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "channel", RBAC_PERM_COMMAND_CHANNEL, true, NULL, "", channelCommandTable },
+ { "nameannounce", RBAC_PERM_COMMAND_NAMEANNOUNCE, true, &HandleNameAnnounceCommand, "", NULL },
+ { "gmnameannounce", RBAC_PERM_COMMAND_GMNAMEANNOUNCE, true, &HandleGMNameAnnounceCommand, "", NULL },
+ { "announce", RBAC_PERM_COMMAND_ANNOUNCE, true, &HandleAnnounceCommand, "", NULL },
+ { "gmannounce", RBAC_PERM_COMMAND_GMANNOUNCE, true, &HandleGMAnnounceCommand, "", NULL },
+ { "notify", RBAC_PERM_COMMAND_NOTIFY, true, &HandleNotifyCommand, "", NULL },
+ { "gmnotify", RBAC_PERM_COMMAND_GMNOTIFY, true, &HandleGMNotifyCommand, "", NULL },
+ { "whispers", RBAC_PERM_COMMAND_WHISPERS, false, &HandleWhispersCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index ee31542c53a..9c29e31af96 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1520,20 +1520,21 @@ public:
* ** Muted: (Time, Reason, By) - IV. LANG_PINFO_MUTED (if muted)
* * Account: %s (id: %u), GM Level: %u - V. LANG_PINFO_ACC_ACCOUNT
* * Last Login: %u (Failed Logins: %u) - VI. LANG_PINFO_ACC_LASTLOGIN
- * * Uses OS: %s - Latency: %u ms - Email %s - VII. LANG_PINFO_ACC_OS
- * * Last IP: %u (Locked: %s) - VIII. LANG_PINFO_ACC_IP
- * * Level: %u (%u/%u XP (%u XP left) - IX. LANG_PINFO_CHR_LEVEL
- * * Race: %s %s, Class %s - X. LANG_PINFO_CHR_RACE
- * * Alive ?: %s - XI. LANG_PINFO_CHR_ALIVE
- * * Phase: %s - XII. LANG_PINFO_CHR_PHASE (if not GM)
- * * Money: %ug%us%uc - XIII. LANG_PINFO_CHR_MONEY
- * * Map: %s, Area: %s - XIV. LANG_PINFO_CHR_MAP
- * * Guild: %s (Id: %u) - XV. LANG_PINFO_CHR_GUILD (if in guild)
- * ** Rank: %s - XVI. LANG_PINFO_CHR_GUILD_RANK (if in guild)
- * ** Note: %s - XVII. LANG_PINFO_CHR_GUILD_NOTE (if in guild and has note)
- * ** O. Note: %s - XVIII.LANG_PINFO_CHR_GUILD_ONOTE (if in guild and has officer note)
- * * Played time: %s - XIX. LANG_PINFO_CHR_PLAYEDTIME
- * * Mails: %u Read/%u Total - XX. LANG_PINFO_CHR_MAILS (if has mails)
+ * * Uses OS: %s - Latency: %u ms - VII. LANG_PINFO_ACC_OS
+ * * Registration Email: %s - Email: %s - VIII. LANG_PINFO_ACC_REGMAILS
+ * * Last IP: %u (Locked: %s) - IX. LANG_PINFO_ACC_IP
+ * * Level: %u (%u/%u XP (%u XP left) - X. LANG_PINFO_CHR_LEVEL
+ * * Race: %s %s, Class %s - XI. LANG_PINFO_CHR_RACE
+ * * Alive ?: %s - XII. LANG_PINFO_CHR_ALIVE
+ * * Phase: %s - XIII. LANG_PINFO_CHR_PHASE (if not GM)
+ * * Money: %ug%us%uc - XIV. LANG_PINFO_CHR_MONEY
+ * * Map: %s, Area: %s - XV. LANG_PINFO_CHR_MAP
+ * * Guild: %s (Id: %u) - XVI. LANG_PINFO_CHR_GUILD (if in guild)
+ * ** Rank: %s - XVII. LANG_PINFO_CHR_GUILD_RANK (if in guild)
+ * ** Note: %s - XVIII.LANG_PINFO_CHR_GUILD_NOTE (if in guild and has note)
+ * ** O. Note: %s - XVIX. LANG_PINFO_CHR_GUILD_ONOTE (if in guild and has officer note)
+ * * Played time: %s - XX. LANG_PINFO_CHR_PLAYEDTIME
+ * * Mails: %u Read/%u Total - XXI. LANG_PINFO_CHR_MAILS (if has mails)
*
* Not all of them can be moved to the top. These should
* place the most important ones to the head, though.
@@ -1546,6 +1547,7 @@ public:
uint32 accId = 0;
uint32 lowguid = GUID_LOPART(targetGuid);
std::string eMail = handler->GetTrinityString(LANG_ERROR);
+ std::string regMail = handler->GetTrinityString(LANG_ERROR);
uint32 security = 0;
std::string lastIp = handler->GetTrinityString(LANG_ERROR);
uint8 locked = 0;
@@ -1666,8 +1668,9 @@ public:
(!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security)))
{
eMail = fields[2].GetString();
- lastIp = fields[3].GetString();
- lastLogin = fields[4].GetString();
+ regMail = fields[3].GetString();
+ lastIp = fields[4].GetString();
+ lastLogin = fields[5].GetString();
uint32 ip = inet_addr(lastIp.c_str());
EndianConvertReverse(ip);
@@ -1689,12 +1692,12 @@ public:
lastIp = "Unauthorized";
lastLogin = "Unauthorized";
}
- muteTime = fields[5].GetUInt64();
- muteReason = fields[6].GetString();
- muteBy = fields[7].GetString();
- failedLogins = fields[8].GetUInt32();
- locked = fields[9].GetUInt8();
- OS = fields[10].GetString();
+ muteTime = fields[6].GetUInt64();
+ muteReason = fields[7].GetString();
+ muteBy = fields[8].GetString();
+ failedLogins = fields[9].GetUInt32();
+ locked = fields[10].GetUInt8();
+ OS = fields[11].GetString();
}
// Creates a chat link to the character. Returns nameLink
@@ -1783,8 +1786,11 @@ public:
// Output VI. LANG_PINFO_ACC_LASTLOGIN
handler->PSendSysMessage(LANG_PINFO_ACC_LASTLOGIN, lastLogin.c_str(), failedLogins);
- // Output VIII. LANG_PINFO_ACC_OS
- handler->PSendSysMessage(LANG_PINFO_ACC_OS, OS.c_str(), latency, eMail.c_str());
+ // Output VII. LANG_PINFO_ACC_OS
+ handler->PSendSysMessage(LANG_PINFO_ACC_OS, OS.c_str(), latency);
+
+ // Output VIII. LANG_PINFO_ACC_REGMAILS
+ handler->PSendSysMessage(LANG_PINFO_ACC_REGMAILS, regMail.c_str(), eMail.c_str());
// Output IX. LANG_PINFO_ACC_IP
handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? "Yes" : "No");
@@ -1828,7 +1834,7 @@ public:
if (target)
handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name[locale], (!zoneName.empty() ? zoneName.c_str() : "<Unknown>"), (!areaName.empty() ? areaName.c_str() : "<Unknown>"));
- // Output XVII. - XX. if they are not empty
+ // Output XVII. - XVIX. if they are not empty
if (!guildName.empty())
{
handler->PSendSysMessage(LANG_PINFO_CHR_GUILD, guildName.c_str(), guildId);
@@ -1839,7 +1845,7 @@ public:
handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_ONOTE, officeNote.c_str());
}
- // Output XXI. LANG_PINFO_CHR_PLAYEDTIME
+ // Output XX. LANG_PINFO_CHR_PLAYEDTIME
handler->PSendSysMessage(LANG_PINFO_CHR_PLAYEDTIME, (secsToTimeString(totalPlayerTime, true, true)).c_str());
// Mail Data - an own query, because it may or may not be useful.
@@ -1861,7 +1867,7 @@ public:
// ... we have to convert it from Char to int. We can use totalmail as it is
rmailint = atol(readmail.c_str());
- // Output XXII. LANG_INFO_CHR_MAILS if at least one mail is given
+ // Output XXI. LANG_INFO_CHR_MAILS if at least one mail is given
if (totalmail >= 1)
handler->PSendSysMessage(LANG_PINFO_CHR_MAILS, rmailint, totalmail);
}
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
index a1f33e57907..1b5a42a83ef 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
@@ -79,7 +79,7 @@ public:
if (Creature* pBalinda = Unit::GetCreature(*me, balindaGUID))
if (me->GetDistance2d(pBalinda->GetHomePosition().GetPositionX(), pBalinda->GetHomePosition().GetPositionY()) > 50)
EnterEvadeMode();
- resetTimer = 5 * IN_MILLISECONDS;
+ resetTimer = 5 * IN_MILLISECONDS;
} else resetTimer -= diff;
DoMeleeAttackIfReady();
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
index f438a117a5f..1c1cdbdac53 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
@@ -1407,9 +1407,7 @@ public:
{
uiDespawnTimer = 28000;
if (instance)
- {
me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me);
- }
DoCast(me, SPELL_TWILIGHT_TORMENT_VESP_ACO);
}
@@ -1504,9 +1502,7 @@ public:
void Reset() OVERRIDE
{
if (instance)
- {
me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me);
- }
m_uiFadeArmorTimer = 1000;
m_uiHatchEggTimer = 20000;
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
index b1ecdc5904e..7d923e7686f 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
@@ -403,21 +403,19 @@ class spell_devourer_of_souls_mirrored_soul_proc : public SpellScriptLoader
bool Load() OVERRIDE
{
- _procTarget = NULL;
return true;
}
bool CheckProc(ProcEventInfo& /*eventInfo*/)
{
- _procTarget = GetCaster();
- return _procTarget && _procTarget->IsAlive();
+ return GetCaster() && GetCaster()->IsAlive();
}
void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
int32 damage = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), 45));
- GetTarget()->CastCustomSpell(SPELL_MIRRORED_SOUL_DAMAGE, SPELLVALUE_BASE_POINT0, damage, _procTarget, true);
+ GetTarget()->CastCustomSpell(SPELL_MIRRORED_SOUL_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetCaster(), true);
}
void Register() OVERRIDE
@@ -425,9 +423,6 @@ class spell_devourer_of_souls_mirrored_soul_proc : public SpellScriptLoader
DoCheckProc += AuraCheckProcFn(spell_devourer_of_souls_mirrored_soul_proc_AuraScript::CheckProc);
OnEffectProc += AuraEffectProcFn(spell_devourer_of_souls_mirrored_soul_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
}
-
- private:
- Unit* _procTarget;
};
AuraScript* GetAuraScript() const OVERRIDE
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index 3f81b517721..84da194aa2d 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -1016,7 +1016,7 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
else if (_icewall == 3)
me->AI()->Talk(SAY_JAINA_ESCAPE_5);
}
- else if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ else if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
{
if (_icewall == 1)
me->AI()->Talk(SAY_SYLVANAS_ESCAPE_3);
diff --git a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
index afd0e8a4342..0097fe8c4d7 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
@@ -256,8 +256,6 @@ public:
}
} else uiGripOfSladRanTimer -= diff;
}
-
- InstanceScript* instance;
};
};
@@ -278,8 +276,6 @@ public:
uint32 uiVenomousBiteTimer;
- InstanceScript* instance;
-
void Reset() OVERRIDE
{
uiVenomousBiteTimer = 2*IN_MILLISECONDS;
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
index 6baf5dc6d93..c45d3704d5d 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
@@ -21,7 +21,6 @@
DoorData const doorData[] =
{
- { GO_BJARNGRIM_DOOR, DATA_BJARNGRIM, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_VOLKHAN_DOOR, DATA_VOLKHAN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_IONAR_DOOR, DATA_IONAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_LOKEN_DOOR, DATA_LOKEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
@@ -73,7 +72,6 @@ class instance_halls_of_lightning : public InstanceMapScript
{
switch (go->GetEntry())
{
- case GO_BJARNGRIM_DOOR:
case GO_VOLKHAN_DOOR:
case GO_IONAR_DOOR:
case GO_LOKEN_DOOR:
@@ -91,7 +89,6 @@ class instance_halls_of_lightning : public InstanceMapScript
{
switch (go->GetEntry())
{
- case GO_BJARNGRIM_DOOR:
case GO_VOLKHAN_DOOR:
case GO_IONAR_DOOR:
case GO_LOKEN_DOOR:
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
index e1c9dec8540..b6a4375d0eb 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
@@ -56,11 +56,6 @@ class boss_krystallus : public CreatureScript
public:
boss_krystallus() : CreatureScript("boss_krystallus") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_krystallusAI(creature);
- }
-
struct boss_krystallusAI : public ScriptedAI
{
boss_krystallusAI(Creature* creature) : ScriptedAI(creature)
@@ -89,14 +84,14 @@ public:
uiShatterTimer = 0;
if (instance)
- instance->SetData(DATA_KRYSTALLUS_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_KRYSTALLUS, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
Talk(SAY_AGGRO);
if (instance)
- instance->SetData(DATA_KRYSTALLUS_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_KRYSTALLUS, IN_PROGRESS);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -149,7 +144,7 @@ public:
Talk(SAY_DEATH);
if (instance)
- instance->SetData(DATA_KRYSTALLUS_EVENT, DONE);
+ instance->SetBossState(DATA_KRYSTALLUS, DONE);
}
void KilledUnit(Unit* victim) OVERRIDE
@@ -182,6 +177,10 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetHallsOfStoneAI<boss_krystallusAI>(creature);
+ }
};
class spell_krystallus_shatter : public SpellScriptLoader
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
index 5b34db663d5..f4ea3ff556c 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
@@ -56,11 +56,6 @@ class boss_maiden_of_grief : public CreatureScript
public:
boss_maiden_of_grief() : CreatureScript("boss_maiden_of_grief") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_maiden_of_griefAI(creature);
- }
-
struct boss_maiden_of_griefAI : public ScriptedAI
{
boss_maiden_of_griefAI(Creature* creature) : ScriptedAI(creature)
@@ -84,7 +79,7 @@ public:
if (instance)
{
- instance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MAIDEN_OF_GRIEF, NOT_STARTED);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT);
}
}
@@ -95,14 +90,7 @@ public:
if (instance)
{
- if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_MAIDEN_DOOR)))
- if (pDoor->GetGoState() == GO_STATE_READY)
- {
- EnterEvadeMode();
- return;
- }
-
- instance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_MAIDEN_OF_GRIEF, IN_PROGRESS);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT);
}
}
@@ -158,7 +146,7 @@ public:
Talk(SAY_DEATH);
if (instance)
- instance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, DONE);
+ instance->SetBossState(DATA_MAIDEN_OF_GRIEF, DONE);
}
void KilledUnit(Unit* victim) OVERRIDE
@@ -170,6 +158,10 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetHallsOfStoneAI<boss_maiden_of_griefAI>(creature);
+ }
};
void AddSC_boss_maiden_of_grief()
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
index 185d8e5fd0c..618628adf88 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
@@ -15,310 +15,265 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* Script Data Start
-SDName: Boss sjonnir
-SDAuthor: LordVanMartin
-SD%Complete:
-SDComment:
-SDCategory:
-Script Data End */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "halls_of_stone.h"
enum Spells
{
- SPELL_LIGHTING_RING = 51849, //Periodic Trigger (interval 2s) spell = 50841
- H_SPELL_LIGHTING_RING = 59861, //Periodic Trigger (interval 2s) spell = 59849
- SPELL_LIGHTING_RING_1 = 50840, //Periodic Trigger (interval 2s) spell = 50841
- H_SPELL_LIGHTING_RING_1 = 59848, //Periodic Trigger (interval 2s) spell = 59849
- SPELL_STATIC_CHARGE = 50834, //Periodic Trigger 2s interval, spell =50835
- H_SPELL_STATIC_CHARGE = 59846, //Periodic Trigger 2s interval, spell =50847
- SPELL_CHAIN_LIGHTING = 50830,
- H_SPELL_CHAIN_LIGHTING = 59844,
- SPELL_LIGHTING_SHIELD = 50831,
- H_SPELL_LIGHTING_SHIELD = 59845,
- SPELL_FRENZY = 28747
+ SPELL_LIGHTING_RING = 51849, // Periodic Trigger (interval 2s) spell = 50841
+ SPELL_LIGHTING_RING_1 = 50840, // Periodic Trigger (interval 2s) spell = 50841
+ SPELL_STATIC_CHARGE = 50834, // Periodic Trigger 2s interval, spell =50835
+ SPELL_CHAIN_LIGHTING = 50830,
+ SPELL_LIGHTING_SHIELD = 50831,
+ SPELL_FRENZY = 28747
};
enum Yells
{
- SAY_AGGRO = 0,
- SAY_SLAY = 1,
- SAY_DEATH = 2
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_DEATH = 2
};
-#define EMOTE_GENERIC_FRENZY -1000002
-
enum SjonnirCreatures
{
- CREATURE_FORGED_IRON_TROGG = 27979,
- CREATURE_MALFORMED_OOZE = 27981,
- CREATURE_FORGED_IRON_DWARF = 27982,
- CREATURE_IRON_SLUDGE = 28165
+ NPC_FORGED_IRON_TROGG = 27979,
+ NPC_MALFORMED_OOZE = 27981,
+ NPC_FORGED_IRON_DWARF = 27982,
+ NPC_IRON_SLUDGE = 28165,
+ NPC_EARTHEN_DWARF = 27980
};
enum Misc
{
- DATA_TIME_BEFORE_OOZE = 150000, // 2min 30 secs
- ACTION_OOZE_DEAD = 1,
- DATA_ABUSE_THE_OOZE = 2
+ ACTION_OOZE_DEAD = 1,
+ DATA_ABUSE_THE_OOZE = 2
};
-struct Locations
+enum Events
{
- float x, y, z;
+ EVENT_CHAIN_LIGHTNING = 1,
+ EVENT_LIGHTNING_SHIELD,
+ EVENT_STATIC_CHARGE,
+ EVENT_LIGHTNING_RING,
+ EVENT_SUMMON,
+ EVENT_FRENZY,
};
-static Locations PipeLocations[] =
+Position const PipeLocations[] =
{
- {1295.44f, 734.07f, 200.3f}, //left
- {1297.7f, 595.6f, 199.9f} //right
+ { 1295.44f, 734.07f, 200.3f, 0.0f }, // left
+ { 1297.7f, 595.6f, 199.9f, 0.0f } // right
};
-static Locations CenterPoint = {1295.21f, 667.157f, 189.691f};
+Position const CenterPoint = { 1295.21f, 667.157f, 189.691f, 0.0f };
class boss_sjonnir : public CreatureScript
{
-public:
- boss_sjonnir() : CreatureScript("boss_sjonnir") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_sjonnirAI(creature);
- }
-
- struct boss_sjonnirAI : public ScriptedAI
- {
- boss_sjonnirAI(Creature* creature) : ScriptedAI(creature), lSummons(me)
- {
- instance = creature->GetInstanceScript();
- }
-
- bool bIsFrenzy;
-
- uint32 uiChainLightningTimer;
- uint32 uiLightningShieldTimer;
- uint32 uiStaticChargeTimer;
- uint32 uiLightningRingTimer;
- uint32 uiSummonTimer;
- uint32 uiFrenzyTimer;
- uint32 uiEncounterTimer;
- uint8 abuseTheOoze;
-
- SummonList lSummons;
-
- InstanceScript* instance;
+ public:
+ boss_sjonnir() : CreatureScript("boss_sjonnir") { }
- void Reset() OVERRIDE
+ struct boss_sjonnirAI : public BossAI
{
- bIsFrenzy = false;
-
- uiEncounterTimer = 0;
- uiChainLightningTimer = urand(3000, 8000);
- uiLightningShieldTimer = urand(20000, 25000);
- uiStaticChargeTimer = urand(20000, 25000);
- uiLightningRingTimer = urand(30000, 35000);
- uiSummonTimer = 5000;
- uiFrenzyTimer = 300000; //5 minutes
- abuseTheOoze = 0;
+ boss_sjonnirAI(Creature* creature) : BossAI(creature, DATA_SJONNIR) { }
- lSummons.DespawnAll();
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ abuseTheOoze = 0;
+ }
- if (instance)
- instance->SetData(DATA_SJONNIR_EVENT, NOT_STARTED);
- }
+ void EnterCombat(Unit* who) OVERRIDE
+ {
+ if (!instance->CheckRequiredBosses(DATA_SJONNIR, who->ToPlayer()))
+ {
+ EnterEvadeMode();
+ return;
+ }
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- Talk(SAY_AGGRO);
+ _EnterCombat();
+ Talk(SAY_AGGRO);
- uiEncounterTimer = 0;
+ events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(3000, 8000));
+ events.ScheduleEvent(EVENT_LIGHTNING_SHIELD, urand(20000, 25000));
+ events.ScheduleEvent(EVENT_STATIC_CHARGE, urand(20000, 25000));
+ events.ScheduleEvent(EVENT_LIGHTNING_RING, urand(30000, 35000));
+ events.ScheduleEvent(EVENT_SUMMON, 5000);
+ events.ScheduleEvent(EVENT_FRENZY, 300000);
+ }
- if (instance)
+ void JustSummoned(Creature* summon) OVERRIDE
{
- if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_SJONNIR_DOOR)))
- if (pDoor->GetGoState() == GO_STATE_READY)
- {
- EnterEvadeMode();
- return;
- }
-
- instance->SetData(DATA_SJONNIR_EVENT, IN_PROGRESS);
+ summon->GetMotionMaster()->MovePoint(0, CenterPoint);
+ /*if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ summon->AI()->AttackStart(target);*/
+ summons.Summon(summon);
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- if (uiChainLightningTimer <= diff)
+ void JustDied(Unit* /*killer*/) OVERRIDE
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_CHAIN_LIGHTING);
- uiChainLightningTimer = urand(10000, 15000);
- } else uiChainLightningTimer -= diff;
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
- if (uiLightningShieldTimer <= diff)
+ void KilledUnit(Unit* who) OVERRIDE
{
- DoCast(me, SPELL_LIGHTING_SHIELD);
- uiLightningShieldTimer -= diff;
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
}
- if (uiStaticChargeTimer <= diff)
+ void DoAction(int32 action) OVERRIDE
{
- DoCastVictim(SPELL_STATIC_CHARGE);
- uiStaticChargeTimer = urand(20000, 25000);
- } uiStaticChargeTimer -= diff;
+ if (action == ACTION_OOZE_DEAD)
+ ++abuseTheOoze;
+ }
- if (uiLightningRingTimer <= diff)
+ uint32 GetData(uint32 type) const OVERRIDE
{
- if (me->IsNonMeleeSpellCasted(false))
- me->InterruptNonMeleeSpells(false);
- DoCast(me, SPELL_LIGHTING_RING);
- uiLightningRingTimer = urand(30000, 35000);
- } else uiLightningRingTimer -= diff;
+ if (type == DATA_ABUSE_THE_OOZE)
+ return abuseTheOoze;
- if (uiSummonTimer <= diff)
- {
- uint32 uiSummonPipe = rand()%2;
- me->SummonCreature(uiEncounterTimer > DATA_TIME_BEFORE_OOZE ? CREATURE_MALFORMED_OOZE :
- RAND(CREATURE_FORGED_IRON_DWARF, CREATURE_FORGED_IRON_TROGG),
- PipeLocations[uiSummonPipe].x, PipeLocations[uiSummonPipe].y, PipeLocations[uiSummonPipe].z, 0.0f,
- TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
- uiSummonTimer = 20000;
- } else uiSummonTimer -= diff;
-
- if (!bIsFrenzy)
- {
- if (uiFrenzyTimer <= diff)
- {
- DoCast(me, SPELL_FRENZY);
- bIsFrenzy = true;
- }
- else uiFrenzyTimer -= diff;
+ return 0;
}
- uiEncounterTimer +=diff;
-
- DoMeleeAttackIfReady();
- }
-
- void JustSummoned(Creature* summon) OVERRIDE
- {
- summon->GetMotionMaster()->MovePoint(0, CenterPoint.x, CenterPoint.y, CenterPoint.z);
- /*if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- summon->AI()->AttackStart(target);*/
- lSummons.Summon(summon);
- }
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- Talk(SAY_DEATH);
- lSummons.DespawnAll();
+ events.Update(diff);
- if (instance)
- instance->SetData(DATA_SJONNIR_EVENT, DONE);
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void KilledUnit(Unit* victim) OVERRIDE
- {
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CHAIN_LIGHTNING:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ DoCast(target, SPELL_CHAIN_LIGHTING);
+ events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(10000, 15000));
+ break;
+ case EVENT_LIGHTNING_SHIELD:
+ DoCast(me, SPELL_LIGHTING_SHIELD);
+ break;
+ case EVENT_STATIC_CHARGE:
+ DoCastVictim(SPELL_STATIC_CHARGE);
+ events.ScheduleEvent(EVENT_STATIC_CHARGE, urand(20000, 25000));
+ break;
+ case EVENT_LIGHTNING_RING:
+ DoCast(me, SPELL_LIGHTING_RING);
+ events.ScheduleEvent(EVENT_LIGHTNING_RING, urand(30000, 35000));
+ break;
+ case EVENT_SUMMON:
+ {
+ uint8 summonPipe = urand(0, 1);
+ if (HealthAbovePct(75))
+ me->SummonCreature(NPC_FORGED_IRON_DWARF, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
+ else if (HealthAbovePct(50))
+ me->SummonCreature(NPC_FORGED_IRON_TROGG, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
+ else if (HealthAbovePct(25))
+ me->SummonCreature(NPC_MALFORMED_OOZE, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
+ else
+ me->SummonCreature(NPC_EARTHEN_DWARF, PipeLocations[summonPipe], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
+
+ events.ScheduleEvent(EVENT_SUMMON, 20000);
+ break;
+ }
+ case EVENT_FRENZY:
+ /// @todo: add emote
+ DoCast(me, SPELL_FRENZY, true);
+ break;
+ default:
+ break;
+ }
+ }
- Talk(SAY_SLAY);
- }
+ DoMeleeAttackIfReady();
+ }
- void DoAction(int32 action) OVERRIDE
- {
- if (action == ACTION_OOZE_DEAD)
- ++abuseTheOoze;
- }
+ private:
+ uint8 abuseTheOoze;
+ };
- uint32 GetData(uint32 type) const OVERRIDE
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- if (type == DATA_ABUSE_THE_OOZE)
- return abuseTheOoze;
-
- return 0;
+ return GetHallsOfStoneAI<boss_sjonnirAI>(creature);
}
- };
-
};
class npc_malformed_ooze : public CreatureScript
{
-public:
- npc_malformed_ooze() : CreatureScript("npc_malformed_ooze") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_malformed_oozeAI(creature);
- }
-
- struct npc_malformed_oozeAI : public ScriptedAI
- {
- npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 uiMergeTimer;
+ public:
+ npc_malformed_ooze() : CreatureScript("npc_malformed_ooze") { }
- void Reset() OVERRIDE
+ struct npc_malformed_oozeAI : public ScriptedAI
{
- uiMergeTimer = 10000;
- }
+ npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) { }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (uiMergeTimer <= diff)
+ void Reset() OVERRIDE
{
- if (Creature* temp = me->FindNearestCreature(CREATURE_MALFORMED_OOZE, 3.0f, true))
+ _mergeTimer = 10000;
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (_mergeTimer <= diff)
{
- DoSpawnCreature(CREATURE_IRON_SLUDGE, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000);
- temp->DisappearAndDie();
- me->DisappearAndDie();
+ if (Creature* temp = me->FindNearestCreature(NPC_MALFORMED_OOZE, 3.0f, true))
+ {
+ DoSpawnCreature(NPC_IRON_SLUDGE, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000);
+ temp->DisappearAndDie();
+ me->DisappearAndDie();
+ }
+ _mergeTimer = 3000;
}
- uiMergeTimer = 3000;
- } else uiMergeTimer -= diff;
+ else
+ _mergeTimer -= diff;
- if (!UpdateVictim())
- return;
+ if (!UpdateVictim())
+ return;
- DoMeleeAttackIfReady();
- }
- };
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ uint32 _mergeTimer;
+ };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetHallsOfStoneAI<npc_malformed_oozeAI>(creature);
+ }
};
class npc_iron_sludge : public CreatureScript
{
-public:
- npc_iron_sludge() : CreatureScript("npc_iron_sludge") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_iron_sludgeAI(creature);
- }
+ public:
+ npc_iron_sludge() : CreatureScript("npc_iron_sludge") { }
- struct npc_iron_sludgeAI : public ScriptedAI
- {
- npc_iron_sludgeAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_iron_sludgeAI : public ScriptedAI
{
- instance = creature->GetInstanceScript();
- }
+ npc_iron_sludgeAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = creature->GetInstanceScript();
+ }
- InstanceScript* instance;
+ InstanceScript* instance;
- void JustDied(Unit* /*killer*/) OVERRIDE
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (Creature* sjonnir = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SJONNIR)))
+ sjonnir->AI()->DoAction(ACTION_OOZE_DEAD);
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- if (instance)
- if (Creature* Sjonnir = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SJONNIR)))
- Sjonnir->AI()->DoAction(ACTION_OOZE_DEAD);
+ return GetHallsOfStoneAI<npc_iron_sludgeAI>(creature);
}
- };
-
};
class achievement_abuse_the_ooze : public AchievementCriteriaScript
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
index 7b5c7f2e061..ff4a5d1b43a 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
@@ -137,11 +137,6 @@ class npc_tribuna_controller : public CreatureScript
public:
npc_tribuna_controller() : CreatureScript("npc_tribuna_controller") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_tribuna_controllerAI(creature);
- }
-
struct npc_tribuna_controllerAI : public ScriptedAI
{
npc_tribuna_controllerAI(Creature* creature) : ScriptedAI(creature)
@@ -263,6 +258,10 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetHallsOfStoneAI<npc_tribuna_controllerAI>(creature);
+ }
};
class npc_brann_hos : public CreatureScript
@@ -293,11 +292,6 @@ public:
return true;
}
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_brann_hosAI(creature);
- }
-
struct npc_brann_hosAI : public npc_escortAI
{
npc_brann_hosAI(Creature* creature) : npc_escortAI(creature)
@@ -331,7 +325,7 @@ public:
DespawnDwarf();
if (instance)
- instance->SetData(DATA_BRANN_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_BRANN_EVENT, NOT_STARTED);
}
}
@@ -446,9 +440,9 @@ public:
case 1:
if (instance)
{
- if (instance->GetData(DATA_BRANN_EVENT) != NOT_STARTED)
+ if (instance->GetBossState(DATA_BRANN_EVENT) != NOT_STARTED)
return;
- instance->SetData(DATA_BRANN_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_BRANN_EVENT, IN_PROGRESS);
}
bIsBattle = false;
Talk(SAY_ESCORT_START);
@@ -598,7 +592,7 @@ public:
case 29:
Talk(SAY_EVENT_END_02);
if (instance)
- instance->SetData(DATA_BRANN_EVENT, DONE);
+ instance->SetBossState(DATA_BRANN_EVENT, DONE);
me->CastSpell(me, SPELL_REWARD_ACHIEVEMENT, true);
JumpToNextStep(5500);
break;
@@ -735,6 +729,10 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetHallsOfStoneAI<npc_brann_hosAI>(creature);
+ }
};
class achievement_brann_spankin_new : public AchievementCriteriaScript
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
index d00649e409b..b8af76bba20 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
@@ -15,55 +15,61 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_HALLS_OF_STONE_H
-#define DEF_HALLS_OF_STONE_H
-enum Data
-{
- DATA_KRYSTALLUS_EVENT,
- DATA_MAIDEN_OF_GRIEF_EVENT,
- DATA_SJONNIR_EVENT,
- DATA_BRANN_EVENT
-};
+#ifndef HALLS_OF_STONE_H_
+#define HALLS_OF_STONE_H_
+
+#define HoSScriptName "instance_halls_of_stone"
+
+uint32 const EncounterCount = 4;
-enum Data64
+enum DataTypes
{
- DATA_KRYSTALLUS,
- DATA_MAIDEN_OF_GRIEF,
- DATA_SJONNIR,
- DATA_KADDRAK,
- DATA_MARNAK,
- DATA_ABEDNEUM,
- DATA_GO_TRIBUNAL_CONSOLE,
- DATA_GO_KADDRAK,
- DATA_GO_MARNAK,
- DATA_GO_ABEDNEUM,
- DATA_GO_SKY_FLOOR,
- DATA_SJONNIR_DOOR,
- DATA_MAIDEN_DOOR
+ // Encounter States/Boss GUIDs
+ DATA_KRYSTALLUS = 0,
+ DATA_MAIDEN_OF_GRIEF = 1,
+ DATA_BRANN_EVENT = 2,
+ DATA_SJONNIR = 3,
+
+ // Additional data
+ DATA_KADDRAK = 4,
+ DATA_MARNAK = 5,
+ DATA_ABEDNEUM = 6,
+ DATA_GO_TRIBUNAL_CONSOLE = 7,
+ DATA_GO_KADDRAK = 8,
+ DATA_GO_MARNAK = 9,
+ DATA_GO_ABEDNEUM = 10,
+ DATA_GO_SKY_FLOOR = 11
};
-enum CreaturesIds
+enum CreatureIds
{
- CREATURE_MAIDEN = 27975,
- CREATURE_KRYSTALLUS = 27977,
- CREATURE_SJONNIR = 27978,
- CREATURE_MARNAK = 30897,
- CREATURE_KADDRAK = 30898,
- CREATURE_ABEDNEUM = 30899,
- CREATURE_BRANN = 28070
+ NPC_MAIDEN = 27975,
+ NPC_KRYSTALLUS = 27977,
+ NPC_SJONNIR = 27978,
+ NPC_MARNAK = 30897,
+ NPC_KADDRAK = 30898,
+ NPC_ABEDNEUM = 30899,
+ NPC_BRANN = 28070
};
enum GameObjectIds
{
- GO_ABEDNEUM = 191669,
- GO_MARNAK = 192170,
- GO_KADDRAK = 192171,
- GO_MAIDEN_DOOR = 191292,
- GO_BRANN_DOOR = 191295,
- GO_SJONNIR_DOOR = 191296,
- GO_TRIBUNAL_CONSOLE = 193907,
- GO_TRIBUNAL_CHEST = 190586,
- GO_TRIBUNAL_CHEST_HERO = 193996
+ GO_ABEDNEUM = 191669,
+ GO_MARNAK = 191670,
+ GO_KADDRAK = 191671,
+ GO_MAIDEN_DOOR = 191292,
+ GO_BRANN_DOOR = 191295,
+ GO_SJONNIR_DOOR = 191296,
+ GO_TRIBUNAL_CONSOLE = 193907,
+ GO_TRIBUNAL_CHEST = 190586,
+ GO_TRIBUNAL_CHEST_HERO = 193996,
+ GO_TRIBUNAL_SKY_FLOOR = 191527
};
-#endif
+template<class AI>
+AI* GetHallsOfStoneAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, HoSScriptName);
+}
+
+#endif // HALLS_OF_STONE_H_
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
index d4b8750dbba..2a899d26d5a 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
@@ -17,256 +17,257 @@
#include "ScriptMgr.h"
#include "InstanceScript.h"
+#include "WorldSession.h"
#include "halls_of_stone.h"
+#include <Player.h>
-#define MAX_ENCOUNTER 4
-
-/* Halls of Stone encounters:
-0- Krystallus
-1- Maiden of Grief
-2- Escort Event
-3- Sjonnir The Ironshaper
-*/
+DoorData const doorData[] =
+{
+ { GO_SJONNIR_DOOR, DATA_BRANN_EVENT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
class instance_halls_of_stone : public InstanceMapScript
{
-public:
- instance_halls_of_stone() : InstanceMapScript("instance_halls_of_stone", 599) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_halls_of_stone_InstanceMapScript(map);
- }
-
- struct instance_halls_of_stone_InstanceMapScript : public InstanceScript
- {
- instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- uint64 uiMaidenOfGrief;
- uint64 uiKrystallus;
- uint64 uiSjonnir;
-
- uint64 uiKaddrak;
- uint64 uiAbedneum;
- uint64 uiMarnak;
- uint64 uiBrann;
-
- uint64 uiMaidenOfGriefDoor;
- uint64 uiSjonnirDoor;
- uint64 uiBrannDoor;
- uint64 uiTribunalConsole;
- uint64 uiTribunalChest;
- uint64 uiTribunalSkyFloor;
- uint64 uiKaddrakGo;
- uint64 uiAbedneumGo;
- uint64 uiMarnakGo;
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
-
- std::string str_data;
-
- void Initialize() OVERRIDE
- {
- uiMaidenOfGrief = 0;
- uiKrystallus = 0;
- uiSjonnir = 0;
-
- uiKaddrak = 0;
- uiMarnak = 0;
- uiAbedneum = 0;
- uiBrann = 0;
-
- uiMaidenOfGriefDoor = 0;
- uiSjonnirDoor = 0;
- uiBrannDoor = 0;
- uiKaddrakGo = 0;
- uiMarnakGo = 0;
- uiAbedneumGo = 0;
- uiTribunalConsole = 0;
- uiTribunalChest = 0;
- uiTribunalSkyFloor = 0;
-
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- m_auiEncounter[i] = NOT_STARTED;
- }
+ public:
+ instance_halls_of_stone() : InstanceMapScript(HoSScriptName, 599) { }
- void OnCreatureCreate(Creature* creature) OVERRIDE
+ struct instance_halls_of_stone_InstanceMapScript : public InstanceScript
{
- switch (creature->GetEntry())
+ instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map)
{
- case CREATURE_MAIDEN: uiMaidenOfGrief = creature->GetGUID(); break;
- case CREATURE_KRYSTALLUS: uiKrystallus = creature->GetGUID(); break;
- case CREATURE_SJONNIR: uiSjonnir = creature->GetGUID(); break;
- case CREATURE_MARNAK: uiMarnak = creature->GetGUID(); break;
- case CREATURE_KADDRAK: uiKaddrak = creature->GetGUID(); break;
- case CREATURE_ABEDNEUM: uiAbedneum = creature->GetGUID(); break;
- case CREATURE_BRANN: uiBrann = creature->GetGUID(); break;
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
+
+ KrystallusGUID = 0;
+ MaidenOfGriefGUID = 0;
+ SjonnirGUID = 0;
+
+ KaddrakGUID = 0;
+ AbedneumGUID = 0;
+ MarnakGUID = 0;
+ BrannGUID = 0;
+
+ TribunalConsoleGUID = 0;
+ TribunalChestGUID = 0;
+ TribunalSkyFloorGUID = 0;
+ KaddrakGoGUID = 0;
+ AbedneumGoGUID = 0;
+ MarnakGoGUID = 0;
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- case GO_ABEDNEUM:
- uiAbedneumGo = go->GetGUID();
- break;
- case GO_MARNAK:
- uiMarnakGo = go->GetGUID();
- break;
- case GO_KADDRAK:
- uiKaddrakGo = go->GetGUID();
- break;
- case GO_MAIDEN_DOOR:
- uiMaidenOfGriefDoor = go->GetGUID();
- if (m_auiEncounter[0] == DONE)
- go->SetGoState(GO_STATE_ACTIVE);
- else
- go->SetGoState(GO_STATE_READY);
- break;
- case GO_BRANN_DOOR:
- uiBrannDoor = go->GetGUID();
- if (m_auiEncounter[1] == DONE)
- go->SetGoState(GO_STATE_ACTIVE);
- else
- go->SetGoState(GO_STATE_READY);
- break;
- case GO_SJONNIR_DOOR:
- uiSjonnirDoor = go->GetGUID();
- if (m_auiEncounter[2] == DONE)
- go->SetGoState(GO_STATE_ACTIVE);
- else
- go->SetGoState(GO_STATE_READY);
- break;
- case GO_TRIBUNAL_CONSOLE:
- uiTribunalConsole = go->GetGUID();
- break;
- case GO_TRIBUNAL_CHEST:
- case GO_TRIBUNAL_CHEST_HERO:
- uiTribunalChest = go->GetGUID();
- if (m_auiEncounter[2] == DONE)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- break;
- case 191527:
- uiTribunalSkyFloor = go->GetGUID();
- break;
+ switch (creature->GetEntry())
+ {
+ case NPC_KRYSTALLUS:
+ KrystallusGUID = creature->GetGUID();
+ break;
+ case NPC_MAIDEN:
+ MaidenOfGriefGUID = creature->GetGUID();
+ break;
+ case NPC_SJONNIR:
+ SjonnirGUID = creature->GetGUID();
+ break;
+ case NPC_MARNAK:
+ MarnakGUID = creature->GetGUID();
+ break;
+ case NPC_KADDRAK:
+ KaddrakGUID = creature->GetGUID();
+ break;
+ case NPC_ABEDNEUM:
+ AbedneumGUID = creature->GetGUID();
+ break;
+ case NPC_BRANN:
+ BrannGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- switch (type)
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- case DATA_MAIDEN_OF_GRIEF_EVENT:
- m_auiEncounter[1] = data;
- if (m_auiEncounter[1] == DONE)
- HandleGameObject(uiBrannDoor, true);
- break;
- case DATA_KRYSTALLUS_EVENT:
- m_auiEncounter[0] = data;
- if (m_auiEncounter[0] == DONE)
- HandleGameObject(uiMaidenOfGriefDoor, true);
- break;
- case DATA_SJONNIR_EVENT:
- m_auiEncounter[3] = data;
- break;
- case DATA_BRANN_EVENT:
- m_auiEncounter[2] = data;
- if (m_auiEncounter[2] == DONE)
- {
- HandleGameObject(uiSjonnirDoor, true);
- GameObject* go = instance->GetGameObject(uiTribunalChest);
- if (go)
+ switch (go->GetEntry())
+ {
+ case GO_ABEDNEUM:
+ AbedneumGoGUID = go->GetGUID();
+ break;
+ case GO_MARNAK:
+ MarnakGoGUID = go->GetGUID();
+ break;
+ case GO_KADDRAK:
+ KaddrakGoGUID = go->GetGUID();
+ break;
+ case GO_TRIBUNAL_CONSOLE:
+ TribunalConsoleGUID = go->GetGUID();
+ break;
+ case GO_TRIBUNAL_CHEST:
+ case GO_TRIBUNAL_CHEST_HERO:
+ TribunalChestGUID = go->GetGUID();
+ if (GetBossState(DATA_BRANN_EVENT) == DONE)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- }
- break;
+ break;
+ case GO_TRIBUNAL_SKY_FLOOR:
+ TribunalSkyFloorGUID = go->GetGUID();
+ break;
+ case GO_SJONNIR_DOOR:
+ AddDoor(go, true);
+ break;
+ default:
+ break;
+ }
}
- if (data == DONE)
- SaveToDB();
- }
-
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- case DATA_KRYSTALLUS_EVENT: return m_auiEncounter[0];
- case DATA_MAIDEN_OF_GRIEF_EVENT: return m_auiEncounter[1];
- case DATA_SJONNIR_EVENT: return m_auiEncounter[2];
- case DATA_BRANN_EVENT: return m_auiEncounter[3];
+ switch (go->GetEntry())
+ {
+ case GO_SJONNIR_DOOR:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
- return 0;
- }
-
- uint64 GetData64(uint32 identifier) const OVERRIDE
- {
- switch (identifier)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- case DATA_MAIDEN_OF_GRIEF: return uiMaidenOfGrief;
- case DATA_KRYSTALLUS: return uiKrystallus;
- case DATA_SJONNIR: return uiSjonnir;
- case DATA_KADDRAK: return uiKaddrak;
- case DATA_MARNAK: return uiMarnak;
- case DATA_ABEDNEUM: return uiAbedneum;
- case DATA_GO_TRIBUNAL_CONSOLE: return uiTribunalConsole;
- case DATA_GO_KADDRAK: return uiKaddrakGo;
- case DATA_GO_ABEDNEUM: return uiAbedneumGo;
- case DATA_GO_MARNAK: return uiMarnakGo;
- case DATA_GO_SKY_FLOOR: return uiTribunalSkyFloor;
- case DATA_SJONNIR_DOOR: return uiSjonnirDoor;
- case DATA_MAIDEN_DOOR: return uiMaidenOfGriefDoor;
+ switch (type)
+ {
+ case DATA_MAIDEN_OF_GRIEF:
+ return MaidenOfGriefGUID;
+ case DATA_KRYSTALLUS:
+ return KrystallusGUID;
+ case DATA_SJONNIR:
+ return SjonnirGUID;
+ case DATA_KADDRAK:
+ return KaddrakGUID;
+ case DATA_MARNAK:
+ return MarnakGUID;
+ case DATA_ABEDNEUM:
+ return AbedneumGUID;
+ case DATA_GO_TRIBUNAL_CONSOLE:
+ return TribunalConsoleGUID;
+ case DATA_GO_KADDRAK:
+ return KaddrakGoGUID;
+ case DATA_GO_ABEDNEUM:
+ return AbedneumGoGUID;
+ case DATA_GO_MARNAK:
+ return MarnakGoGUID;
+ case DATA_GO_SKY_FLOOR:
+ return TribunalSkyFloorGUID;
+ default:
+ break;
+ }
+
+ return 0;
}
- return 0;
- }
-
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
+ bool SetBossState(uint32 type, EncounterState state) OVERRIDE
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_BRANN_EVENT:
+ if (state == DONE)
+ {
+ if (GameObject* go = instance->GetGameObject(TribunalChestGUID))
+ go->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_INTERACT_COND);
+ }
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
- std::ostringstream saveStream;
- saveStream << "H S " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << m_auiEncounter[3];
+ bool CheckRequiredBosses(uint32 bossId, Player const* player /*= NULL*/) const OVERRIDE
+ {
+ if (player && player->GetSession()->HasPermission(RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES))
+ return true;
+
+ switch (bossId)
+ {
+ case DATA_SJONNIR:
+ if (GetBossState(DATA_BRANN_EVENT) != DONE)
+ return false;
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
- str_data = saveStream.str();
+ std::string GetSaveData() OVERRIDE
+ {
+ OUT_SAVE_INST_DATA;
- OUT_SAVE_INST_DATA_COMPLETE;
- return str_data;
- }
+ std::ostringstream saveStream;
+ saveStream << "H S " << GetBossSaveData();
- void Load(const char* in) OVERRIDE
- {
- if (!in)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
}
- OUT_LOAD_INST_DATA(in);
+ void Load(char const* str) OVERRIDE
+ {
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
- char dataHead1, dataHead2;
- uint16 data0, data1, data2, data3;
+ OUT_LOAD_INST_DATA(str);
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
+ char dataHead1, dataHead2;
- if (dataHead1 == 'H' && dataHead2 == 'S')
- {
- m_auiEncounter[0] = data0;
- m_auiEncounter[1] = data1;
- m_auiEncounter[2] = data2;
- m_auiEncounter[3] = data3;
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
+ if (dataHead1 == 'H' && dataHead2 == 'S')
+ {
+ 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;
- } else OUT_LOAD_INST_DATA_FAIL;
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
- OUT_LOAD_INST_DATA_COMPLETE;
+ protected:
+ uint64 KrystallusGUID;
+ uint64 MaidenOfGriefGUID;
+ uint64 SjonnirGUID;
+
+ uint64 KaddrakGUID;
+ uint64 AbedneumGUID;
+ uint64 MarnakGUID;
+ uint64 BrannGUID;
+
+ uint64 TribunalConsoleGUID;
+ uint64 TribunalChestGUID;
+ uint64 TribunalSkyFloorGUID;
+ uint64 KaddrakGoGUID;
+ uint64 AbedneumGoGUID;
+ uint64 MarnakGoGUID;
+ };
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_halls_of_stone_InstanceMapScript(map);
}
- };
-
};
void AddSC_instance_halls_of_stone()
diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp
index 74257c95cf3..7c328f57e78 100644
--- a/src/server/scripts/Outland/zone_netherstorm.cpp
+++ b/src/server/scripts/Outland/zone_netherstorm.cpp
@@ -753,7 +753,6 @@ public:
bool Drained;
uint8 WeakPercent;
- Player* player;
uint64 PlayerGUID;
uint32 ManaBurnTimer;
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index 7021f6251a2..8804410d814 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -2072,7 +2072,7 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader
{
uint32 spellId = 0;
- TC_LOG_ERROR(LOG_FILTER_SPELLS_AURAS, "spell_q12641_death_comes_from_on_high:: Caster: %s (GUID: %u) On Hit Target: Creature: %s (Entry: %u GUID: %u)",
+ TC_LOG_DEBUG(LOG_FILTER_SPELLS_AURAS, "spell_q12641_death_comes_from_on_high:: Caster: %s (GUID: %u) On Hit Target: Creature: %s (Entry: %u GUID: %u)",
GetOriginalCaster()->GetName().c_str(), GetOriginalCaster()->GetGUIDLow(), GetHitCreature()->GetName().c_str(), GetHitCreature()->GetEntry(), GetHitCreature()->GetGUIDLow());
switch (GetHitCreature()->GetEntry())
{
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp
index 26940c8a599..6e01e8f515a 100644
--- a/src/server/shared/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp
@@ -56,7 +56,7 @@ void LoginDatabaseConnection::DoPrepareStatements()
PrepareStatement(LOGIN_DEL_REALM_CHARACTERS, "DELETE FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_INS_REALM_CHARACTERS, "INSERT INTO realmcharacters (numchars, acctid, realmid) VALUES (?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(LOGIN_SEL_SUM_REALM_CHARACTERS, "SELECT SUM(numchars) FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC);
- PrepareStatement(LOGIN_INS_ACCOUNT, "INSERT INTO account(username, sha_pass_hash, joindate) VALUES(?, ?, NOW())", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_INS_ACCOUNT, "INSERT INTO account(username, sha_pass_hash, reg_mail, email, joindate) VALUES(?, ?, ?, ?, NOW())", CONNECTION_SYNCH);
PrepareStatement(LOGIN_INS_REALM_CHARACTERS_INIT, "INSERT INTO realmcharacters (realmid, acctid, numchars) SELECT realmlist.id, account.id, 0 FROM realmlist, account LEFT JOIN realmcharacters ON acctid=account.id WHERE acctid IS NULL", CONNECTION_ASYNC);
PrepareStatement(LOGIN_UPD_EXPANSION, "UPDATE account SET expansion = ? WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_UPD_ACCOUNT_LOCK, "UPDATE account SET locked = ? WHERE id = ?", CONNECTION_ASYNC);
@@ -64,6 +64,8 @@ void LoginDatabaseConnection::DoPrepareStatements()
PrepareStatement(LOGIN_INS_LOG, "INSERT INTO logs (time, realm, type, level, string) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(LOGIN_UPD_USERNAME, "UPDATE account SET v = 0, s = 0, username = ?, sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_UPD_PASSWORD, "UPDATE account SET v = 0, s = 0, sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_EMAIL, "UPDATE account SET email = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_REG_EMAIL, "UPDATE account SET reg_mail = ? WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_UPD_MUTE_TIME, "UPDATE account SET mutetime = ? , mutereason = ? , muteby = ? WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_UPD_MUTE_TIME_LOGIN, "UPDATE account SET mutetime = ? WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_UPD_LAST_IP, "UPDATE account SET last_ip = ? WHERE username = ?", CONNECTION_ASYNC);
@@ -79,7 +81,7 @@ void LoginDatabaseConnection::DoPrepareStatements()
PrepareStatement(LOGIN_GET_USERNAME_BY_ID, "SELECT username FROM account WHERE id = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_CHECK_PASSWORD, "SELECT 1 FROM account WHERE id = ? AND sha_pass_hash = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_CHECK_PASSWORD_BY_NAME, "SELECT 1 FROM account WHERE username = ? AND sha_pass_hash = ?", CONNECTION_SYNCH);
- PrepareStatement(LOGIN_SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime, a.mutereason, a.muteby, a.failed_logins, a.locked, a.OS FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.reg_mail, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime, a.mutereason, a.muteby, a.failed_logins, a.locked, a.OS FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM account_banned WHERE id = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_GM_ACCOUNTS, "SELECT a.username, aa.gmlevel FROM account a, account_access aa WHERE a.id=aa.id AND aa.gmlevel >= ? AND (aa.realmid = -1 OR aa.realmid = ?)", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_ACCOUNT_INFO, "SELECT a.username, a.last_ip, aa.gmlevel, a.expansion FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.id = ?", CONNECTION_SYNCH);
@@ -92,6 +94,7 @@ void LoginDatabaseConnection::DoPrepareStatements()
PrepareStatement(LOGIN_DEL_ACCOUNT, "DELETE FROM account WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(LOGIN_SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_GET_EMAIL_BY_ID, "SELECT email FROM account WHERE id = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS_BY_ID, "SELECT gmlevel, RealmID FROM account_access WHERE id = ? and (RealmID = ? OR RealmID = -1) ORDER BY gmlevel desc", CONNECTION_SYNCH);
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/shared/Database/Implementation/LoginDatabase.h
index 97cf91fc178..47fa48c6ada 100644
--- a/src/server/shared/Database/Implementation/LoginDatabase.h
+++ b/src/server/shared/Database/Implementation/LoginDatabase.h
@@ -84,6 +84,8 @@ enum LoginDatabaseStatements
LOGIN_INS_LOG,
LOGIN_UPD_USERNAME,
LOGIN_UPD_PASSWORD,
+ LOGIN_UPD_EMAIL,
+ LOGIN_UPD_REG_EMAIL,
LOGIN_UPD_MUTE_TIME,
LOGIN_UPD_MUTE_TIME_LOGIN,
LOGIN_UPD_LAST_IP,
@@ -112,6 +114,7 @@ enum LoginDatabaseStatements
LOGIN_DEL_ACCOUNT,
LOGIN_SEL_IP2NATION_COUNTRY,
LOGIN_SEL_AUTOBROADCAST,
+ LOGIN_GET_EMAIL_BY_ID,
LOGIN_SEL_ACCOUNT_ACCESS_BY_ID,
LOGIN_SEL_RBAC_ACCOUNT_GROUPS,
diff --git a/src/server/worldserver/Master.cpp b/src/server/worldserver/Master.cpp
index b2a6b60ac4f..d9b97cfd3f5 100644
--- a/src/server/worldserver/Master.cpp
+++ b/src/server/worldserver/Master.cpp
@@ -103,10 +103,11 @@ public:
ACE_Based::Thread::Sleep(1000);
uint32 curtime = getMSTime();
// normal work
- if (_loops != World::m_worldLoopCounter)
+ uint32 worldLoopCounter = World::m_worldLoopCounter.value();
+ if (_loops != worldLoopCounter)
{
_lastChange = curtime;
- _loops = World::m_worldLoopCounter;
+ _loops = worldLoopCounter;
}
// possible freeze
else if (getMSTimeDiff(_lastChange, curtime) > _delaytime)
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index a98a4e61448..dbf2a808230 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -28,6 +28,7 @@
# CHARACTER DELETE OPTIONS
# CUSTOM SERVER OPTIONS
# LOGGING SYSTEM SETTINGS
+# PACKET SPOOF PROTECTION SETTINGS
#
###################################################################################################
@@ -1106,7 +1107,6 @@ AllowTickets = 1
DungeonFinder.OptionsMask = 1
-
#
# DBC.EnforceItemAttributes
# Description: Disallow overriding item attributes stored in DBC files with values from the
@@ -1132,6 +1132,15 @@ AccountInstancesPerHour = 5
RBAC.DefaultGroups = ""
#
+# Account.PasswordChangeSecurity
+# Description: Controls how secure the password changes are.
+# Default: 0 - None (Old and new password)
+# 1 - Email (Email confirmation necessary)
+# 2 - RBAC (RBAC enable or disables email confirmation per group)
+
+Account.PasswordChangeSecurity = 0
+
+#
###################################################################################################
###################################################################################################
@@ -2797,14 +2806,14 @@ Log.Async.Enable = 0
###################################################################################################
#
-# Packet Spoof Protection Settings
+# PACKET SPOOF PROTECTION SETTINGS
#
# These settings determine which action to take when harmful packet spoofing is detected.
#
# PacketSpoof.Policy
# Description: Determines the course of action when packet spoofing is detected.
-# Values: 0 - Log only (LOG_FILTER_NETWORKIO)
-# 1 - Log + kick
+# Default: 1 - Log + kick
+# 0 - Log only (LOG_FILTER_NETWORKIO)
# 2 - Log + kick + ban
PacketSpoof.Policy = 1
@@ -2812,9 +2821,9 @@ PacketSpoof.Policy = 1
#
# PacketSpoof.BanMode
# Description: If PacketSpoof.Policy equals 2, this will determine the ban mode.
-# Values: 0 - Ban Account
-# 2 - Ban IP
# Note: Banning by character not supported for logical reasons.
+# Default: 0 - Ban Account
+# 2 - Ban IP
#
PacketSpoof.BanMode = 0
@@ -2829,4 +2838,4 @@ PacketSpoof.BanMode = 0
PacketSpoof.BanDuration = 86400
#
-################################################################################################### \ No newline at end of file
+###################################################################################################
diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp
index bf88a92c32a..2173dab4e1c 100644
--- a/src/tools/map_extractor/System.cpp
+++ b/src/tools/map_extractor/System.cpp
@@ -89,11 +89,17 @@ static const char* const langs[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koK
void CreateDir( const std::string& Path )
{
+ int ret;
#ifdef _WIN32
- _mkdir( Path.c_str());
+ ret = _mkdir( Path.c_str());
#else
- mkdir( Path.c_str(), 0777 );
+ ret = mkdir( Path.c_str(), 0777 );
#endif
+ if (ret != 0)
+ {
+ printf("Fatal Error: Could not create directory %s check your permissions", Path.c_str());
+ exit(1);
+ }
}
bool FileExists( const char* FileName )
diff --git a/src/tools/map_extractor/loadlib.cpp b/src/tools/map_extractor/loadlib.cpp
index 5dcb479a11c..f5b0ac40875 100644
--- a/src/tools/map_extractor/loadlib.cpp
+++ b/src/tools/map_extractor/loadlib.cpp
@@ -34,13 +34,11 @@ bool FileLoader::loadFile(char *filename, bool log)
data_size = mf.getSize();
data = new uint8 [data_size];
- if (data)
- {
- mf.read(data, data_size);
- mf.close();
- if (prepareLoadedData())
- return true;
- }
+ mf.read(data, data_size);
+ mf.close();
+ if (prepareLoadedData())
+ return true;
+
printf("Error loading %s", filename);
mf.close();
free();
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp
index ab584e27e03..9c2dda51621 100644
--- a/src/tools/mmaps_generator/MapBuilder.cpp
+++ b/src/tools/mmaps_generator/MapBuilder.cpp
@@ -571,19 +571,7 @@ namespace MMAP
// merge per tile poly and detail meshes
rcPolyMesh** pmmerge = new rcPolyMesh*[TILES_PER_MAP * TILES_PER_MAP];
- if (!pmmerge)
- {
- printf("%s alloc pmmerge FIALED!\n", tileString);
- return;
- }
-
rcPolyMeshDetail** dmmerge = new rcPolyMeshDetail*[TILES_PER_MAP * TILES_PER_MAP];
- if (!dmmerge)
- {
- printf("%s alloc dmmerge FIALED!\n", tileString);
- return;
- }
-
int nmerge = 0;
// build all tiles
for (int y = 0; y < TILES_PER_MAP; ++y)
@@ -678,12 +666,9 @@ namespace MMAP
rcFreeContourSet(tile.cset);
tile.cset = NULL;
- if (tile.pmesh)
- {
- pmmerge[nmerge] = tile.pmesh;
- dmmerge[nmerge] = tile.dmesh;
- nmerge++;
- }
+ pmmerge[nmerge] = tile.pmesh;
+ dmmerge[nmerge] = tile.dmesh;
+ nmerge++;
}
}
diff --git a/src/tools/mmaps_generator/PathGenerator.cpp b/src/tools/mmaps_generator/PathGenerator.cpp
index ed114491b27..882ec7ffb66 100644
--- a/src/tools/mmaps_generator/PathGenerator.cpp
+++ b/src/tools/mmaps_generator/PathGenerator.cpp
@@ -235,7 +235,7 @@ bool handleArgs(int argc, char** argv,
int finish(const char* message, int returnValue)
{
printf("%s", message);
- getchar();
+ getchar(); // Wait for user input
return returnValue;
}