aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDiscover- <amort11@hotmail.com>2013-09-23 16:47:47 +0200
committerDiscover- <amort11@hotmail.com>2013-09-23 16:47:47 +0200
commita0db0728f2f48e7ca4156115b03e63d7ff2164c1 (patch)
treec17b6d0bdc34f0a8297216f21dd7deb5df4eddcc /src
parent9653576cb4cc9449898d6af691c045d68e9361c5 (diff)
parent4498ac0062d56aa0a0f2b9a21358f12f83c4b1f7 (diff)
Merge branch 'master' of https://github.com/TrinityCore/TrinityCore
Diffstat (limited to 'src')
-rw-r--r--src/server/collision/Maps/TileAssembler.cpp3
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp4
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp35
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp39
-rw-r--r--src/server/game/Accounts/RBAC.h1759
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp123
-rw-r--r--src/server/game/Achievements/AchievementMgr.h3
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.cpp10
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp6
-rw-r--r--src/server/game/Battlegrounds/Battleground.h10
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp8
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp13
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.h2
-rw-r--r--src/server/game/Chat/Channels/ChannelMgr.cpp12
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp7
-rw-r--r--src/server/game/Conditions/ConditionMgr.h34
-rw-r--r--src/server/game/DataStores/DBCStructure.h4
-rw-r--r--src/server/game/Entities/Player/Player.cpp11
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp5
-rw-r--r--src/server/game/Groups/Group.cpp18
-rw-r--r--src/server/game/Guilds/Guild.cpp16
-rw-r--r--src/server/game/Guilds/Guild.h2
-rw-r--r--src/server/game/Guilds/GuildMgr.cpp13
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp2
-rw-r--r--src/server/game/Handlers/PetHandler.cpp4
-rw-r--r--src/server/game/Movement/PathGenerator.cpp4
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp6
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp14
-rw-r--r--src/server/game/Spells/SpellEffects.cpp62
-rw-r--r--src/server/game/Spells/SpellInfo.cpp23
-rw-r--r--src/server/game/Spells/SpellInfo.h3
-rw-r--r--src/server/game/Spells/SpellMgr.cpp10
-rw-r--r--src/server/game/Weather/Weather.cpp5
-rw-r--r--src/server/game/World/World.cpp27
-rw-r--r--src/server/game/World/World.h7
-rw-r--r--src/server/scripts/Commands/CMakeLists.txt104
-rw-r--r--src/server/scripts/Commands/cs_account.cpp37
-rw-r--r--src/server/scripts/Commands/cs_ban.cpp36
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp2
-rw-r--r--src/server/scripts/Commands/cs_group.cpp338
-rw-r--r--src/server/scripts/Commands/cs_guild.cpp3
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp762
-rw-r--r--src/server/scripts/Commands/cs_mmaps.cpp16
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp64
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp272
-rw-r--r--src/server/scripts/Commands/cs_pet.cpp190
-rw-r--r--src/server/scripts/Commands/cs_quest.cpp14
-rw-r--r--src/server/scripts/Commands/cs_rbac.cpp4
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp216
-rw-r--r--src/server/scripts/Commands/cs_reset.cpp20
-rw-r--r--src/server/scripts/Commands/cs_send.cpp289
-rw-r--r--src/server/scripts/Commands/cs_server.cpp60
-rw-r--r--src/server/scripts/Commands/cs_tele.cpp16
-rw-r--r--src/server/scripts/Commands/cs_ticket.cpp44
-rw-r--r--src/server/scripts/Commands/cs_titles.cpp18
-rw-r--r--src/server/scripts/Commands/cs_wp.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp17
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp15
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp13
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp98
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp38
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h22
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp32
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp1
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp53
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp1
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp4
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp64
-rw-r--r--src/server/scripts/World/achievement_scripts.cpp12
-rw-r--r--src/server/shared/Common.h1
-rw-r--r--src/server/shared/CompilerDefs.h5
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.h5
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp3
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.h3
-rw-r--r--src/server/shared/Logging/Appender.cpp5
-rw-r--r--src/server/shared/Logging/AppenderFile.cpp4
-rw-r--r--src/server/shared/Logging/AppenderFile.h3
-rw-r--r--src/server/shared/Logging/Log.cpp5
-rw-r--r--src/server/shared/Packets/ByteBuffer.h6
-rw-r--r--src/server/shared/Utilities/Timer.h2
-rw-r--r--src/server/shared/Utilities/Util.cpp5
-rw-r--r--src/server/shared/Utilities/Util.h33
-rw-r--r--src/server/worldserver/CommandLine/CliRunnable.cpp5
-rw-r--r--src/server/worldserver/worldserver.conf.dist33
87 files changed, 2953 insertions, 2380 deletions
diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/server/collision/Maps/TileAssembler.cpp
index ddaa8cb9c67..5b38d9f4e18 100644
--- a/src/server/collision/Maps/TileAssembler.cpp
+++ b/src/server/collision/Maps/TileAssembler.cpp
@@ -508,7 +508,8 @@ namespace VMAP
return false;
}
- char ident[8];
+ char ident[9];
+ ident[8] = '\0';
int readOperation = 0;
READ_OR_RETURN(&ident, 8);
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index a1862c07d14..a56d0f94f2d 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -699,6 +699,10 @@ void SmartAI::InitializeAI()
void SmartAI::OnCharmed(bool apply)
{
GetScript()->ProcessEventsFor(SMART_EVENT_CHARMED, NULL, 0, 0, apply);
+
+ if (!apply && !me->IsInEvadeMode() && me->GetUInt64Value(UNIT_FIELD_CHARMEDBY))
+ if (Unit* charmer = ObjectAccessor::GetUnit(*me, me->GetUInt64Value(UNIT_FIELD_CHARMEDBY)))
+ AttackStart(charmer);
}
void SmartAI::DoAction(int32 param)
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 8b12b2a2cc5..70dd9e9d1ee 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -1447,7 +1447,6 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (!einfo)
{
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;
break;
}
@@ -1771,10 +1770,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (!targets)
break;
+ bool foundTarget = false;
+
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
{
if (IsCreature((*itr)))
{
+ foundTarget = true;
+
if (e.action.moveRandom.distance)
(*itr)->ToCreature()->GetMotionMaster()->MoveRandom((float)e.action.moveRandom.distance);
else
@@ -1782,6 +1785,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
}
+ if (!foundTarget && me && IsCreature(me))
+ {
+ if (e.action.moveRandom.distance)
+ me->GetMotionMaster()->MoveRandom((float)e.action.moveRandom.distance);
+ else
+ me->GetMotionMaster()->MoveIdle();
+ }
+
delete targets;
break;
}
@@ -1991,13 +2002,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
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;
- }
+ (*itr)->ToCreature()->SetHomePosition((*itr)->GetPositionX(), (*itr)->GetPositionY(), (*itr)->GetPositionZ(), (*itr)->GetOrientation());
}
else
TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript: Action target for SMART_ACTION_SET_HOME_POS is invalid, skipping");
@@ -2294,8 +2299,9 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /*
l->push_back(baseObject);
break;
case SMART_TARGET_VICTIM:
- if (me && me->GetVictim())
- l->push_back(me->GetVictim());
+ if (me)
+ if (Unit* victim = me->GetVictim())
+ l->push_back(victim);
break;
case SMART_TARGET_HOSTILE_SECOND_AGGRO:
if (me)
@@ -2508,8 +2514,15 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /*
case SMART_TARGET_OWNER_OR_SUMMONER:
{
if (me)
- if (Unit* owner = ObjectAccessor::GetUnit(*me, me->GetCharmerOrOwnerGUID()))
+ {
+ uint64 charmerOrOwnerGuid = me->GetCharmerOrOwnerGUID();
+
+ if (!charmerOrOwnerGuid)
+ charmerOrOwnerGuid = me->GetCreatorGUID();
+
+ if (Unit* owner = ObjectAccessor::GetUnit(*me, charmerOrOwnerGuid))
l->push_back(owner);
+ }
break;
}
case SMART_TARGET_THREAT_LIST:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 01f9080fba1..361cf025647 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -771,6 +771,26 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_SUMMON_CREATURE:
if (!IsCreatureValid(e, e.action.summonCreature.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_SUMMON)
+ {
+ uint32 creatureSummonEntry = spellInfo->Effects[j].MiscValue;
+
+ if (e.action.summonCreature.creature == creatureSummonEntry)
+ TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u creature summon: %u has already summon spell (SpellId: %u effect: %u)",
+ e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.summonCreature.creature, spellInfo->Id, j);
+ }
+ }
+ }
+
if (e.action.summonCreature.type < TEMPSUMMON_TIMED_OR_DEAD_DESPAWN || e.action.summonCreature.type > TEMPSUMMON_MANUAL_DESPAWN)
{
TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses incorrect TempSummonType %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.summonCreature.type);
@@ -828,6 +848,25 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_SUMMON_GO:
if (!IsGameObjectValid(e, e.action.summonGO.entry))
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_SUMMON_OBJECT_WILD)
+ {
+ uint32 goSummonEntry = spellInfo->Effects[j].MiscValue;
+
+ if (e.action.summonGO.entry == goSummonEntry)
+ TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u gameobject summon: %u has already summon spell (SpellId: %u effect: %u)",
+ e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.summonGO.entry, spellInfo->Id, j);
+ }
+ }
+ }
break;
case SMART_ACTION_ADD_ITEM:
case SMART_ACTION_REMOVE_ITEM:
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index 492a7197cfe..2be501e6aaf 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -1,726 +1,1033 @@
-/*
- * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/**
-* @file RBAC.h
-* @brief Role Based Access Control related classes definition
-*
-* This file contains all the classes and enums used to implement
-* Role Based Access Control
-*
-* RBAC Rules:
-* - Pemission: Defines an autorization to perform certain operation.
-* - Role: Set of permissions.
-* - Group: Set of roles.
-* - An Account can have multiple groups, roles and permissions.
-* - Account Groups can only be granted or revoked
-* - Account Roles and Permissions can be granted, denied or revoked
-* - Grant: Assignment of the object (role/permission) and allow it
-* - Deny: Assignment of the object (role/permission) and deny it
-* - Revoke: Removal of the object (role/permission) no matter if it was granted or denied
-* - Global Permissions are computed as:
-* Group Grants + Role Grants + User Grans - Role Grants - User Grants
-* - Groups, Roles and Permissions can be assigned by realm
-*/
-
-#ifndef _RBAC_H
-#define _RBAC_H
-
-#include "Define.h"
-#include <string>
-#include <bitset>
-#include <set>
-#include <map>
-
-enum RBACPermissions
-{
- RBAC_PERM_INSTANT_LOGOUT = 1,
- RBAC_PERM_SKIP_QUEUE = 2,
- RBAC_PERM_JOIN_NORMAL_BG = 3,
- RBAC_PERM_JOIN_RANDOM_BG = 4,
- RBAC_PERM_JOIN_ARENAS = 5,
- RBAC_PERM_JOIN_DUNGEON_FINDER = 6,
- RBAC_PERM_PLAYER_COMMANDS = 7,
- RBAC_PERM_MODERATOR_COMMANDS = 8,
- RBAC_PERM_GAMEMASTER_COMMANDS = 9,
- RBAC_PERM_ADMINISTRATOR_COMMANDS = 10,
- RBAC_PERM_LOG_GM_TRADE = 11,
- RBAC_PERM_CONSOLE_COMMANDS = 12, // Not pressent in DB
- RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES = 13,
- RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_TEAMMASK = 14,
- RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_CLASSMASK = 15,
- RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RACEMASK = 16,
- RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME = 17,
- RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_HEROIC_CHARACTER = 18,
- RBAC_PERM_SKIP_CHECK_CHAT_CHANNEL_REQ = 19,
- RBAC_PERM_SKIP_CHECK_DISABLE_MAP = 20,
- RBAC_PERM_SKIP_CHECK_MORE_TALENTS_THAN_ALLOWED = 21,
- RBAC_PERM_SKIP_CHECK_CHAT_SPAM = 22,
- RBAC_PERM_SKIP_CHECK_OVERSPEED_PING = 23,
- RBAC_PERM_TWO_SIDE_CHARACTER_CREATION = 24,
- RBAC_PERM_TWO_SIDE_INTERACTION_CHAT = 25,
- RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL = 26,
- RBAC_PERM_TWO_SIDE_INTERACTION_MAIL = 27,
- RBAC_PERM_TWO_SIDE_WHO_LIST = 28,
- RBAC_PERM_TWO_SIDE_ADD_FRIEND = 29,
- RBAC_PERM_COMMANDS_SAVE_WITHOUT_DELAY = 30,
- RBAC_PERM_COMMANDS_USE_UNSTUCK_WITH_ARGS = 31,
- RBAC_PERM_COMMANDS_BE_ASSIGNED_TICKET = 32,
- RBAC_PERM_COMMANDS_NOTIFY_COMMAND_NOT_FOUND_ERROR = 33,
- RBAC_PERM_COMMANDS_APPEAR_IN_GM_LIST = 34,
- RBAC_PERM_WHO_SEE_ALL_SEC_LEVELS = 35,
- RBAC_PERM_CAN_FILTER_WHISPERS = 36,
- RBAC_PERM_CHAT_USE_STAFF_BADGE = 37,
- RBAC_PERM_RESURRECT_WITH_FULL_HPS = 38,
- RBAC_PERM_RESTORE_SAVED_GM_STATE = 39,
- RBAC_PERM_ALLOW_GM_FRIEND = 40,
- RBAC_PERM_USE_START_GM_LEVEL = 41,
- RBAC_PERM_OPCODE_WORLD_TELEPORT = 42,
- RBAC_PERM_OPCODE_WHOIS = 43,
- RBAC_PERM_RECEIVE_GLOBAL_GM_TEXTMESSAGE = 44,
- RBAC_PERM_SILENTLY_JOIN_CHANNEL = 45,
- 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,
- RBAC_PERM_COMMAND_RBAC_ACC_GROUP = 202,
- RBAC_PERM_COMMAND_RBAC_ACC_GROUP_ADD = 203,
- RBAC_PERM_COMMAND_RBAC_ACC_GROUP_DEL = 204,
- RBAC_PERM_COMMAND_RBAC_ACC_ROLE = 205,
- RBAC_PERM_COMMAND_RBAC_ACC_ROLE_GRANT = 206,
- RBAC_PERM_COMMAND_RBAC_ACC_ROLE_DENY = 207,
- RBAC_PERM_COMMAND_RBAC_ACC_ROLE_REVOKE = 208,
- RBAC_PERM_COMMAND_RBAC_ACC_PERM = 209,
- RBAC_PERM_COMMAND_RBAC_ACC_PERM_GRANT = 210,
- RBAC_PERM_COMMAND_RBAC_ACC_PERM_DENY = 211,
- RBAC_PERM_COMMAND_RBAC_ACC_PERM_REVOKE = 212,
- RBAC_PERM_COMMAND_RBAC_LIST = 213,
- RBAC_PERM_COMMAND_RBAC_LIST_GROUPS = 214,
- RBAC_PERM_COMMAND_RBAC_LIST_ROLES = 215,
- RBAC_PERM_COMMAND_RBAC_LIST_PERMS = 216,
- RBAC_PERM_COMMAND_ACCOUNT = 217,
- RBAC_PERM_COMMAND_ACCOUNT_ADDON = 218,
- RBAC_PERM_COMMAND_ACCOUNT_CREATE = 219,
- RBAC_PERM_COMMAND_ACCOUNT_DELETE = 220,
- RBAC_PERM_COMMAND_ACCOUNT_LOCK = 221,
- RBAC_PERM_COMMAND_ACCOUNT_LOCK_COUNTRY = 222,
- RBAC_PERM_COMMAND_ACCOUNT_LOCK_IP = 223,
- RBAC_PERM_COMMAND_ACCOUNT_ONLINE_LIST = 224,
- RBAC_PERM_COMMAND_ACCOUNT_PASSWORD = 225,
- RBAC_PERM_COMMAND_ACCOUNT_SET = 226,
- RBAC_PERM_COMMAND_ACCOUNT_SET_ADDON = 227,
- RBAC_PERM_COMMAND_ACCOUNT_SET_GMLEVEL = 228,
- RBAC_PERM_COMMAND_ACCOUNT_SET_PASSWORD = 229,
- RBAC_PERM_COMMAND_ACHIEVEMENT = 230,
- RBAC_PERM_COMMAND_ACHIEVEMENT_ADD = 231,
- RBAC_PERM_COMMAND_ARENA = 232,
- RBAC_PERM_COMMAND_ARENA_CAPTAIN = 233,
- RBAC_PERM_COMMAND_ARENA_CREATE = 234,
- RBAC_PERM_COMMAND_ARENA_DISBAND = 235,
- RBAC_PERM_COMMAND_ARENA_INFO = 236,
- RBAC_PERM_COMMAND_ARENA_LOOKUP = 237,
- RBAC_PERM_COMMAND_ARENA_RENAME = 238,
- RBAC_PERM_COMMAND_BAN = 239,
- RBAC_PERM_COMMAND_BAN_ACCOUNT = 240,
- RBAC_PERM_COMMAND_BAN_CHARACTER = 241,
- RBAC_PERM_COMMAND_BAN_IP = 242,
- RBAC_PERM_COMMAND_BAN_PLAYERACCOUNT = 243,
- RBAC_PERM_COMMAND_BANINFO = 244,
- RBAC_PERM_COMMAND_BANINFO_ACCOUNT = 245,
- RBAC_PERM_COMMAND_BANINFO_CHARACTER = 246,
- RBAC_PERM_COMMAND_BANINFO_IP = 247,
- RBAC_PERM_COMMAND_BANLIST = 248,
- RBAC_PERM_COMMAND_BANLIST_ACCOUNT = 249,
- RBAC_PERM_COMMAND_BANLIST_CHARACTER = 250,
- RBAC_PERM_COMMAND_BANLIST_IP = 251,
- RBAC_PERM_COMMAND_UNBAN = 252,
- RBAC_PERM_COMMAND_UNBAN_ACCOUNT = 253,
- RBAC_PERM_COMMAND_UNBAN_CHARACTER = 254,
- RBAC_PERM_COMMAND_UNBAN_IP = 255,
- RBAC_PERM_COMMAND_UNBAN_PLAYERACCOUNT = 256,
- RBAC_PERM_COMMAND_BF = 257,
- RBAC_PERM_COMMAND_BF_START = 258,
- RBAC_PERM_COMMAND_BF_STOP = 259,
- 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
-};
-
-enum RBACCommandResult
-{
- RBAC_OK,
- RBAC_CANT_ADD_ALREADY_ADDED,
- RBAC_CANT_REVOKE_NOT_IN_LIST,
- RBAC_IN_GRANTED_LIST,
- RBAC_IN_DENIED_LIST,
- RBAC_ID_DOES_NOT_EXISTS
-};
-
-typedef std::bitset<RBAC_PERM_MAX> RBACPermissionContainer;
-typedef std::set<uint32> RBACRoleContainer;
-typedef std::set<uint32> RBACGroupContainer;
-
-class RBACObject
-{
- public:
- RBACObject(uint32 id = 0, std::string const& name = ""):
- _id(id), _name(name) { }
-
- virtual ~RBACObject() { }
-
- /// Gets the Name of the Object
- std::string const& GetName() const { return _name; }
- /// Gets the Id of the Object
- uint32 GetId() const { return _id; }
-
- private:
- uint32 _id; ///> id of the object
- std::string _name; ///> name of the object
-};
-
-/// Permission: Defines an autorization to perform certain operation
-class RBACPermission: public RBACObject
-{
- public:
- RBACPermission(uint32 id = 0, std::string const& name = ""):
- RBACObject(id, name) { }
-};
-
-/// Set of Permissions
-class RBACRole: public RBACObject
-{
- public:
- RBACRole(uint32 id = 0, std::string const& name = ""):
- RBACObject(id, name) { }
-
- /// Gets the Permissions assigned to this role
- RBACPermissionContainer const& GetPermissions() const { return _perms; }
- /// Grants a Permission (Adds)
- void GrantPermission(uint32 id);
- /// Revokes a Permission (Removes)
- void RevokePermission(uint32 id);
-
- private:
- RBACPermissionContainer _perms; ///> Set of permissions
-};
-
-/// Set of Roles
-class RBACGroup: public RBACObject
-{
- public:
- RBACGroup(uint32 id = 0, std::string const& name = ""):
- RBACObject(id, name) { }
-
- /// Gets the Roles assigned to this group
- RBACRoleContainer const& GetRoles() const { return _roles; }
- /// Grants a Role (Adds)
- void GrantRole(uint32 role);
- /// Revokes a Role (Removes)
- void RevokeRole(uint32 role);
-
- private:
- RBACRoleContainer _roles; ///> Set of Roles
-};
-
-/**
- * @name RBACData
- * @brief Contains all needed information about the acccount
- *
- * This class contains all the data needed to calculate the account permissions.
- * RBACDAta is formed by group permissions and user permissions through:
- * - Granted Groups, which contains roles, which contains permissions: Set of granted permissions
- * - Granted Roles, which contains permissions: Set of granted permissions
- * - Denied Roles, which contains permissions: Set of denied permissions
- * - Granted Permissions
- * - Denied Permissions
- *
- * Calculation of current Permissions: Granted permissions - Denied permissions
- * - Granted permissions: through groups, through roles and directly assigned
- * - Denied permissions: through roles and directly assigned
- */
-class RBACData: public RBACObject
-{
- public:
- RBACData(uint32 id, std::string const& name, int32 realmId):
- RBACObject(id, name), _realmId(realmId) { }
-
- /**
- * @name HasPermission
- * @brief Checks if certain action is allowed
- *
- * Checks if certain action can be performed.
- *
- * @return grant or deny action
- *
- * Example Usage:
- * @code
- * bool Player::CanJoinArena(Battleground* bg)
- * {
- * return bg->isArena() && HasPermission(RBAC_PERM_JOIN_ARENA);
- * }
- * @endcode
- */
- bool HasPermission(uint32 permission) const { return _globalPerms.test(permission); }
-
- // Functions enabled to be used by command system
- /// Returns all the granted permissions (after computation)
- RBACPermissionContainer const& GetPermissions() const { return _globalPerms; }
- /// Returns all the granted permissions
- RBACPermissionContainer const& GetGrantedPermissions() const { return _grantedPerms; }
- /// Returns all the denied permissions
- RBACPermissionContainer const& GetDeniedPermissions() const { return _deniedPerms; }
- /// Returns all the granted roles
- RBACRoleContainer const& GetGrantedRoles() const { return _grantedRoles; }
- /// Returns all the denied roles
- RBACRoleContainer const& GetDeniedRoles() const { return _deniedRoles; }
- /// Returns all the granted groups
- RBACGroupContainer const& GetGroups() const { return _groups; }
-
- /**
- * @name AddGroup
- * @brief Adds new group
- *
- * Add a new group to the account. If realm is 0 or the group can not be added
- * No save to db action will be performed.
- *
- * Fails if group Id does not exists or group already present
- *
- * @param groupId group to be added
- * @param realmId realm affected
- *
- * @return Success or failure (with reason) to add the group
- *
- * Example Usage:
- * @code
- * // previously defined "RBACData* rbac" with proper initialization
- * uint32 groupId = 2;
- * if (rbac->AddGroup(groupId) == RBAC_OK)
- * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Group %u succesfully added", groupId);
- * @endcode
- */
- RBACCommandResult AddGroup(uint32 groupId, int32 realmId = 0);
-
- /**
- * @name RemoveGroup
- * @brief Removes a group
- *
- * Removes a group from the account. If realm is 0 or the group can not be removed
- * No save to db action will be performed. Any delete operation will always affect
- * "all realms (-1)" in addition to the realm specified
- *
- * Fails if group not present
- *
- * @param groupId group to be removed
- * @param realmId realm affected
- *
- * @return Success or failure (with reason) to remove the group
- *
- * Example Usage:
- * // previously defined "RBACData* rbac" with proper initialization
- * uint32 groupId = 2;
- * if (rbac->RemoveGroup(groupId) == RBAC_OK)
- * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Group %u succesfully removed", groupId);
- * @endcode
- */
- RBACCommandResult RemoveGroup(uint32 groupId, int32 realmId = 0);
-
- /**
- * @name GrantRole
- * @brief Grants a role
- *
- * Grants a role to the account. If realm is 0 or the role can not be added
- * No save to db action will be performed.
- *
- * Fails if role Id does not exists or role already granted or denied
- *
- * @param roleId role to be granted
- * @param realmId realm affected
- *
- * @return Success or failure (with reason) to grant the role
- *
- * Example Usage:
- * // previously defined "RBACData* rbac" with proper initialization
- * uint32 roleId = 2;
- * if (rbac->GrantRole(roleId) == RBAC_IN_DENIED_LIST)
- * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Failed to grant role %u, already denied", roleId);
- * @endcode
- */
- RBACCommandResult GrantRole(uint32 roleId, int32 realmId = 0);
-
- /**
- * @name DenyRole
- * @brief Denies a role
- *
- * Denied a role to the account. If realm is 0 or the role can not be added
- * No save to db action will be performed.
- *
- * Fails if role Id does not exists or role already granted or denied
- *
- * @param roleId role to be denied
- * @param realmId realm affected
- *
- * @return Success or failure (with reason) to deny the role
- *
- * Example Usage:
- * // previously defined "RBACData* rbac" with proper initialization
- * uint32 roleId = 2;
- * if (rbac->DenyRole(roleId) == RBAC_ID_DOES_NOT_EXISTS)
- * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Role Id %u does not exists", roleId);
- * @endcode
- */
- RBACCommandResult DenyRole(uint32 roleId, int32 realmId = 0);
-
- /**
- * @name RevokeRole
- * @brief Removes a role
- *
- * Removes a role from the account. If realm is 0 or the role can not be removed
- * No save to db action will be performed. Any delete operation will always affect
- * "all realms (-1)" in addition to the realm specified
- *
- * Fails if role not present
- *
- * @param roleId role to be removed
- * @param realmId realm affected
- *
- * @return Success or failure (with reason) to remove the role
- *
- * Example Usage:
- * // previously defined "RBACData* rbac" with proper initialization
- * uint32 roleId = 2;
- * if (rbac->RevokeRole(roleId) == RBAC_OK)
- * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Role %u succesfully removed", roleId);
- * @endcode
- */
- RBACCommandResult RevokeRole(uint32 roleId, int32 realmId = 0);
-
- /**
- * @name GrantRole
- * @brief Grants a permission
- *
- * Grants a permission to the account. If realm is 0 or the permission can not be added
- * No save to db action will be performed.
- *
- * Fails if permission Id does not exists or permission already granted or denied
- *
- * @param permissionId permission to be granted
- * @param realmId realm affected
- *
- * @return Success or failure (with reason) to grant the permission
- *
- * Example Usage:
- * // previously defined "RBACData* rbac" with proper initialization
- * uint32 permissionId = 2;
- * if (rbac->GrantRole(permissionId) == RBAC_IN_DENIED_LIST)
- * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Failed to grant permission %u, already denied", permissionId);
- * @endcode
- */
- RBACCommandResult GrantPermission(uint32 permissionId, int32 realmId = 0);
-
- /**
- * @name DenyPermission
- * @brief Denies a permission
- *
- * Denied a permission to the account. If realm is 0 or the permission can not be added
- * No save to db action will be performed.
- *
- * Fails if permission Id does not exists or permission already granted or denied
- *
- * @param permissionId permission to be denied
- * @param realmId realm affected
- *
- * @return Success or failure (with reason) to deny the permission
- *
- * Example Usage:
- * // previously defined "RBACData* rbac" with proper initialization
- * uint32 permissionId = 2;
- * if (rbac->DenyRole(permissionId) == RBAC_ID_DOES_NOT_EXISTS)
- * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Role Id %u does not exists", permissionId);
- * @endcode
- */
- RBACCommandResult DenyPermission(uint32 permissionId, int32 realmId = 0);
-
- /**
- * @name RevokePermission
- * @brief Removes a permission
- *
- * Removes a permission from the account. If realm is 0 or the permission can not be removed
- * No save to db action will be performed. Any delete operation will always affect
- * "all realms (-1)" in addition to the realm specified
- *
- * Fails if permission not present
- *
- * @param permissionId permission to be removed
- * @param realmId realm affected
- *
- * @return Success or failure (with reason) to remove the permission
- *
- * Example Usage:
- * // previously defined "RBACData* rbac" with proper initialization
- * uint32 permissionId = 2;
- * if (rbac->RevokeRole(permissionId) == RBAC_OK)
- * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Permission %u succesfully removed", permissionId);
- * @endcode
- */
- RBACCommandResult RevokePermission(uint32 permissionId, int32 realmId = 0);
-
- /// Loads all permissions, groups and roles assigned to current account
- void LoadFromDB();
- private:
- /// Saves a role to DB, Granted or Denied
- void SaveRole(uint32 role, bool granted, int32 realm);
- /// Saves a permission to DB, Granted or Denied
- void SavePermission(uint32 role, bool granted, int32 realm);
-
- /**
- * @name CalculateNewPermissions
- * @brief Calculates new permissions
- *
- * Calculates new permissions after some change in groups, roles or permissions.
- * The calculation is done Granted - Denied:
- * - Granted permissions: through groups, through roles and directly assigned
- * - Denied permissions: through roles and directly assigned
- */
- void CalculateNewPermissions();
-
- int32 GetRealmId() { return _realmId; }
-
- int32 _realmId; ///> RealmId Affected
- RBACGroupContainer _groups; ///> Granted groups
- RBACRoleContainer _grantedRoles; ///> Granted roles
- RBACRoleContainer _deniedRoles; ///> Denied roles
- RBACPermissionContainer _grantedPerms; ///> Granted permissions
- RBACPermissionContainer _deniedPerms; ///> Denied permissions
- RBACPermissionContainer _globalPerms; ///> Calculated permissions
-};
-
-#endif
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+* @file RBAC.h
+* @brief Role Based Access Control related classes definition
+*
+* This file contains all the classes and enums used to implement
+* Role Based Access Control
+*
+* RBAC Rules:
+* - Pemission: Defines an autorization to perform certain operation.
+* - Role: Set of permissions.
+* - Group: Set of roles.
+* - An Account can have multiple groups, roles and permissions.
+* - Account Groups can only be granted or revoked
+* - Account Roles and Permissions can be granted, denied or revoked
+* - Grant: Assignment of the object (role/permission) and allow it
+* - Deny: Assignment of the object (role/permission) and deny it
+* - Revoke: Removal of the object (role/permission) no matter if it was granted or denied
+* - Global Permissions are computed as:
+* Group Grants + Role Grants + User Grans - Role Grants - User Grants
+* - Groups, Roles and Permissions can be assigned by realm
+*/
+
+#ifndef _RBAC_H
+#define _RBAC_H
+
+#include "Define.h"
+#include <string>
+#include <bitset>
+#include <set>
+#include <map>
+
+enum RBACPermissions
+{
+ RBAC_PERM_INSTANT_LOGOUT = 1,
+ RBAC_PERM_SKIP_QUEUE = 2,
+ RBAC_PERM_JOIN_NORMAL_BG = 3,
+ RBAC_PERM_JOIN_RANDOM_BG = 4,
+ RBAC_PERM_JOIN_ARENAS = 5,
+ RBAC_PERM_JOIN_DUNGEON_FINDER = 6,
+ // 7 - reuse
+ // 8 - reuse
+ // 9 - reuse
+ // 10 - reuse
+ RBAC_PERM_LOG_GM_TRADE = 11,
+ // 12 - reuse
+ RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES = 13,
+ RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_TEAMMASK = 14,
+ RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_CLASSMASK = 15,
+ RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RACEMASK = 16,
+ RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME = 17,
+ RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_HEROIC_CHARACTER = 18,
+ RBAC_PERM_SKIP_CHECK_CHAT_CHANNEL_REQ = 19,
+ RBAC_PERM_SKIP_CHECK_DISABLE_MAP = 20,
+ RBAC_PERM_SKIP_CHECK_MORE_TALENTS_THAN_ALLOWED = 21,
+ RBAC_PERM_SKIP_CHECK_CHAT_SPAM = 22,
+ RBAC_PERM_SKIP_CHECK_OVERSPEED_PING = 23,
+ RBAC_PERM_TWO_SIDE_CHARACTER_CREATION = 24,
+ RBAC_PERM_TWO_SIDE_INTERACTION_CHAT = 25,
+ RBAC_PERM_TWO_SIDE_INTERACTION_CHANNEL = 26,
+ RBAC_PERM_TWO_SIDE_INTERACTION_MAIL = 27,
+ RBAC_PERM_TWO_SIDE_WHO_LIST = 28,
+ RBAC_PERM_TWO_SIDE_ADD_FRIEND = 29,
+ RBAC_PERM_COMMANDS_SAVE_WITHOUT_DELAY = 30,
+ RBAC_PERM_COMMANDS_USE_UNSTUCK_WITH_ARGS = 31,
+ RBAC_PERM_COMMANDS_BE_ASSIGNED_TICKET = 32,
+ RBAC_PERM_COMMANDS_NOTIFY_COMMAND_NOT_FOUND_ERROR = 33,
+ RBAC_PERM_COMMANDS_APPEAR_IN_GM_LIST = 34,
+ RBAC_PERM_WHO_SEE_ALL_SEC_LEVELS = 35,
+ RBAC_PERM_CAN_FILTER_WHISPERS = 36,
+ RBAC_PERM_CHAT_USE_STAFF_BADGE = 37,
+ RBAC_PERM_RESURRECT_WITH_FULL_HPS = 38,
+ RBAC_PERM_RESTORE_SAVED_GM_STATE = 39,
+ RBAC_PERM_ALLOW_GM_FRIEND = 40,
+ RBAC_PERM_USE_START_GM_LEVEL = 41,
+ RBAC_PERM_OPCODE_WORLD_TELEPORT = 42,
+ RBAC_PERM_OPCODE_WHOIS = 43,
+ RBAC_PERM_RECEIVE_GLOBAL_GM_TEXTMESSAGE = 44,
+ RBAC_PERM_SILENTLY_JOIN_CHANNEL = 45,
+ 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,
+ RBAC_PERM_COMMAND_RBAC_ACC_GROUP = 202,
+ RBAC_PERM_COMMAND_RBAC_ACC_GROUP_ADD = 203,
+ RBAC_PERM_COMMAND_RBAC_ACC_GROUP_DEL = 204,
+ RBAC_PERM_COMMAND_RBAC_ACC_ROLE = 205,
+ RBAC_PERM_COMMAND_RBAC_ACC_ROLE_GRANT = 206,
+ RBAC_PERM_COMMAND_RBAC_ACC_ROLE_DENY = 207,
+ RBAC_PERM_COMMAND_RBAC_ACC_ROLE_REVOKE = 208,
+ RBAC_PERM_COMMAND_RBAC_ACC_PERM = 209,
+ RBAC_PERM_COMMAND_RBAC_ACC_PERM_GRANT = 210,
+ RBAC_PERM_COMMAND_RBAC_ACC_PERM_DENY = 211,
+ RBAC_PERM_COMMAND_RBAC_ACC_PERM_REVOKE = 212,
+ RBAC_PERM_COMMAND_RBAC_LIST = 213,
+ RBAC_PERM_COMMAND_RBAC_LIST_GROUPS = 214,
+ RBAC_PERM_COMMAND_RBAC_LIST_ROLES = 215,
+ RBAC_PERM_COMMAND_RBAC_LIST_PERMS = 216,
+ RBAC_PERM_COMMAND_ACCOUNT = 217,
+ RBAC_PERM_COMMAND_ACCOUNT_ADDON = 218,
+ RBAC_PERM_COMMAND_ACCOUNT_CREATE = 219,
+ RBAC_PERM_COMMAND_ACCOUNT_DELETE = 220,
+ RBAC_PERM_COMMAND_ACCOUNT_LOCK = 221,
+ RBAC_PERM_COMMAND_ACCOUNT_LOCK_COUNTRY = 222,
+ RBAC_PERM_COMMAND_ACCOUNT_LOCK_IP = 223,
+ RBAC_PERM_COMMAND_ACCOUNT_ONLINE_LIST = 224,
+ RBAC_PERM_COMMAND_ACCOUNT_PASSWORD = 225,
+ RBAC_PERM_COMMAND_ACCOUNT_SET = 226,
+ RBAC_PERM_COMMAND_ACCOUNT_SET_ADDON = 227,
+ RBAC_PERM_COMMAND_ACCOUNT_SET_GMLEVEL = 228,
+ RBAC_PERM_COMMAND_ACCOUNT_SET_PASSWORD = 229,
+ RBAC_PERM_COMMAND_ACHIEVEMENT = 230,
+ RBAC_PERM_COMMAND_ACHIEVEMENT_ADD = 231,
+ RBAC_PERM_COMMAND_ARENA = 232,
+ RBAC_PERM_COMMAND_ARENA_CAPTAIN = 233,
+ RBAC_PERM_COMMAND_ARENA_CREATE = 234,
+ RBAC_PERM_COMMAND_ARENA_DISBAND = 235,
+ RBAC_PERM_COMMAND_ARENA_INFO = 236,
+ RBAC_PERM_COMMAND_ARENA_LOOKUP = 237,
+ RBAC_PERM_COMMAND_ARENA_RENAME = 238,
+ RBAC_PERM_COMMAND_BAN = 239,
+ RBAC_PERM_COMMAND_BAN_ACCOUNT = 240,
+ RBAC_PERM_COMMAND_BAN_CHARACTER = 241,
+ RBAC_PERM_COMMAND_BAN_IP = 242,
+ RBAC_PERM_COMMAND_BAN_PLAYERACCOUNT = 243,
+ RBAC_PERM_COMMAND_BANINFO = 244,
+ RBAC_PERM_COMMAND_BANINFO_ACCOUNT = 245,
+ RBAC_PERM_COMMAND_BANINFO_CHARACTER = 246,
+ RBAC_PERM_COMMAND_BANINFO_IP = 247,
+ RBAC_PERM_COMMAND_BANLIST = 248,
+ RBAC_PERM_COMMAND_BANLIST_ACCOUNT = 249,
+ RBAC_PERM_COMMAND_BANLIST_CHARACTER = 250,
+ RBAC_PERM_COMMAND_BANLIST_IP = 251,
+ RBAC_PERM_COMMAND_UNBAN = 252,
+ RBAC_PERM_COMMAND_UNBAN_ACCOUNT = 253,
+ RBAC_PERM_COMMAND_UNBAN_CHARACTER = 254,
+ RBAC_PERM_COMMAND_UNBAN_IP = 255,
+ RBAC_PERM_COMMAND_UNBAN_PLAYERACCOUNT = 256,
+ RBAC_PERM_COMMAND_BF = 257,
+ RBAC_PERM_COMMAND_BF_START = 258,
+ RBAC_PERM_COMMAND_BF_STOP = 259,
+ 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,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_LIST = 279,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_RESTORE = 280,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_OLD = 281,
+ RBAC_PERM_COMMAND_CHARACTER_ERASE = 282,
+ 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,
+ // 400 - reuse
+ 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,
+ RBAC_PERM_COMMAND_GROUP = 472,
+ RBAC_PERM_COMMAND_GROUP_LEADER = 473,
+ RBAC_PERM_COMMAND_GROUP_DISBAND = 474,
+ RBAC_PERM_COMMAND_GROUP_REMOVE = 475,
+ RBAC_PERM_COMMAND_GROUP_JOIN = 476,
+ RBAC_PERM_COMMAND_GROUP_LIST = 477,
+ RBAC_PERM_COMMAND_GROUP_SUMMON = 478,
+ RBAC_PERM_COMMAND_PET = 479,
+ RBAC_PERM_COMMAND_PET_CREATE = 480,
+ RBAC_PERM_COMMAND_PET_LEARN = 481,
+ RBAC_PERM_COMMAND_PET_UNLEARN = 482,
+ RBAC_PERM_COMMAND_SEND = 483,
+ RBAC_PERM_COMMAND_SEND_ITEMS = 484,
+ RBAC_PERM_COMMAND_SEND_MAIL = 485,
+ RBAC_PERM_COMMAND_SEND_MESSAGE = 486,
+ RBAC_PERM_COMMAND_SEND_MONEY = 487,
+ RBAC_PERM_COMMAND_ADDITEM = 488,
+ RBAC_PERM_COMMAND_ADDITEMSET = 489,
+ RBAC_PERM_COMMAND_APPEAR = 490,
+ RBAC_PERM_COMMAND_AURA = 491,
+ RBAC_PERM_COMMAND_BANK = 492,
+ RBAC_PERM_COMMAND_BINDSIGHT = 493,
+ RBAC_PERM_COMMAND_COMBATSTOP = 494,
+ RBAC_PERM_COMMAND_COMETOME = 495,
+ RBAC_PERM_COMMAND_COMMANDS = 496,
+ RBAC_PERM_COMMAND_COOLDOWN = 497,
+ RBAC_PERM_COMMAND_DAMAGE = 498,
+ RBAC_PERM_COMMAND_DEV = 499,
+ RBAC_PERM_COMMAND_DIE = 500,
+ RBAC_PERM_COMMAND_DISMOUNT = 501,
+ RBAC_PERM_COMMAND_DISTANCE = 502,
+ RBAC_PERM_COMMAND_FLUSHARENAPOINTS = 503,
+ RBAC_PERM_COMMAND_FREEZE = 504,
+ RBAC_PERM_COMMAND_GPS = 505,
+ RBAC_PERM_COMMAND_GUID = 506,
+ RBAC_PERM_COMMAND_HELP = 507,
+ RBAC_PERM_COMMAND_HIDEAREA = 508,
+ RBAC_PERM_COMMAND_ITEMMOVE = 509,
+ RBAC_PERM_COMMAND_KICK = 510,
+ RBAC_PERM_COMMAND_LINKGRAVE = 511,
+ RBAC_PERM_COMMAND_LISTFREEZE = 512,
+ RBAC_PERM_COMMAND_MAXSKILL = 513,
+ RBAC_PERM_COMMAND_MOVEGENS = 514,
+ RBAC_PERM_COMMAND_MUTE = 515,
+ RBAC_PERM_COMMAND_NEARGRAVE = 516,
+ RBAC_PERM_COMMAND_PINFO = 517,
+ RBAC_PERM_COMMAND_PLAYALL = 518,
+ RBAC_PERM_COMMAND_POSSESS = 519,
+ RBAC_PERM_COMMAND_RECALL = 520,
+ RBAC_PERM_COMMAND_REPAIRITEMS = 521,
+ RBAC_PERM_COMMAND_RESPAWN = 522,
+ RBAC_PERM_COMMAND_REVIVE = 523,
+ RBAC_PERM_COMMAND_SAVE = 524,
+ RBAC_PERM_COMMAND_SAVEALL = 525,
+ RBAC_PERM_COMMAND_SETSKILL = 526,
+ RBAC_PERM_COMMAND_SHOWAREA = 527,
+ RBAC_PERM_COMMAND_SUMMON = 528,
+ RBAC_PERM_COMMAND_UNAURA = 529,
+ RBAC_PERM_COMMAND_UNBINDSIGHT = 530,
+ RBAC_PERM_COMMAND_UNFREEZE = 531,
+ RBAC_PERM_COMMAND_UNMUTE = 532,
+ RBAC_PERM_COMMAND_UNPOSSESS = 533,
+ RBAC_PERM_COMMAND_UNSTUCK = 534,
+ RBAC_PERM_COMMAND_WCHANGE = 535,
+ RBAC_PERM_COMMAND_MMAP = 536,
+ RBAC_PERM_COMMAND_MMAP_LOADEDTILES = 537,
+ RBAC_PERM_COMMAND_MMAP_LOC = 538,
+ RBAC_PERM_COMMAND_MMAP_PATH = 539,
+ RBAC_PERM_COMMAND_MMAP_STATS = 540,
+ RBAC_PERM_COMMAND_MMAP_TESTAREA = 541,
+ RBAC_PERM_COMMAND_MORPH = 542,
+ RBAC_PERM_COMMAND_DEMORPH = 543,
+ RBAC_PERM_COMMAND_MODIFY = 544,
+ RBAC_PERM_COMMAND_MODIFY_ARENAPOINTS = 545,
+ RBAC_PERM_COMMAND_MODIFY_BIT = 546,
+ RBAC_PERM_COMMAND_MODIFY_DRUNK = 547,
+ RBAC_PERM_COMMAND_MODIFY_ENERGY = 548,
+ RBAC_PERM_COMMAND_MODIFY_FACTION = 549,
+ RBAC_PERM_COMMAND_MODIFY_GENDER = 550,
+ RBAC_PERM_COMMAND_MODIFY_HONOR = 551,
+ RBAC_PERM_COMMAND_MODIFY_HP = 552,
+ RBAC_PERM_COMMAND_MODIFY_MANA = 553,
+ RBAC_PERM_COMMAND_MODIFY_MONEY = 554,
+ RBAC_PERM_COMMAND_MODIFY_MOUNT = 555,
+ RBAC_PERM_COMMAND_MODIFY_PHASE = 556,
+ RBAC_PERM_COMMAND_MODIFY_RAGE = 557,
+ RBAC_PERM_COMMAND_MODIFY_REPUTATION = 558,
+ RBAC_PERM_COMMAND_MODIFY_RUNICPOWER = 559,
+ RBAC_PERM_COMMAND_MODIFY_SCALE = 560,
+ RBAC_PERM_COMMAND_MODIFY_SPEED = 561,
+ RBAC_PERM_COMMAND_MODIFY_SPEED_ALL = 562,
+ RBAC_PERM_COMMAND_MODIFY_SPEED_BACKWALK = 563,
+ RBAC_PERM_COMMAND_MODIFY_SPEED_FLY = 564,
+ RBAC_PERM_COMMAND_MODIFY_SPEED_WALK = 565,
+ RBAC_PERM_COMMAND_MODIFY_SPEED_SWIM = 566,
+ RBAC_PERM_COMMAND_MODIFY_SPELL = 567,
+ RBAC_PERM_COMMAND_MODIFY_STANDSTATE = 568,
+ RBAC_PERM_COMMAND_MODIFY_TALENTPOINTS = 569,
+ RBAC_PERM_COMMAND_NPC = 570,
+ RBAC_PERM_COMMAND_NPC_ADD = 571,
+ RBAC_PERM_COMMAND_NPC_ADD_FORMATION = 572,
+ RBAC_PERM_COMMAND_NPC_ADD_ITEM = 573,
+ RBAC_PERM_COMMAND_NPC_ADD_MOVE = 574,
+ RBAC_PERM_COMMAND_NPC_ADD_TEMP = 575,
+ RBAC_PERM_COMMAND_NPC_DELETE = 576,
+ RBAC_PERM_COMMAND_NPC_DELETE_ITEM = 577,
+ RBAC_PERM_COMMAND_NPC_FOLLOW = 578,
+ RBAC_PERM_COMMAND_NPC_FOLLOW_STOP = 579,
+ RBAC_PERM_COMMAND_NPC_SET = 580,
+ RBAC_PERM_COMMAND_NPC_SET_ALLOWMOVE = 581,
+ RBAC_PERM_COMMAND_NPC_SET_ENTRY = 582,
+ RBAC_PERM_COMMAND_NPC_SET_FACTIONID = 583,
+ RBAC_PERM_COMMAND_NPC_SET_FLAG = 584,
+ RBAC_PERM_COMMAND_NPC_SET_LEVEL = 585,
+ RBAC_PERM_COMMAND_NPC_SET_LINK = 586,
+ RBAC_PERM_COMMAND_NPC_SET_MODEL = 587,
+ RBAC_PERM_COMMAND_NPC_SET_MOVETYPE = 588,
+ RBAC_PERM_COMMAND_NPC_SET_PHASE = 589,
+ RBAC_PERM_COMMAND_NPC_SET_SPAWNDIST = 590,
+ RBAC_PERM_COMMAND_NPC_SET_SPAWNTIME = 591,
+ RBAC_PERM_COMMAND_NPC_SET_DATA = 592,
+ RBAC_PERM_COMMAND_NPC_INFO = 593,
+ RBAC_PERM_COMMAND_NPC_NEAR = 594,
+ RBAC_PERM_COMMAND_NPC_MOVE = 595,
+ RBAC_PERM_COMMAND_NPC_PLAYEMOTE = 596,
+ RBAC_PERM_COMMAND_NPC_SAY = 597,
+ RBAC_PERM_COMMAND_NPC_TEXTEMOTE = 598,
+ RBAC_PERM_COMMAND_NPC_WHISPER = 599,
+ RBAC_PERM_COMMAND_NPC_YELL = 600,
+ RBAC_PERM_COMMAND_NPC_TAME = 601,
+ RBAC_PERM_COMMAND_QUEST = 602,
+ RBAC_PERM_COMMAND_QUEST_ADD = 603,
+ RBAC_PERM_COMMAND_QUEST_COMPLETE = 604,
+ RBAC_PERM_COMMAND_QUEST_REMOVE = 605,
+ RBAC_PERM_COMMAND_QUEST_REWARD = 606,
+ RBAC_PERM_COMMANDS_RELOAD = 607,
+ RBAC_PERM_COMMANDS_RELOAD_ACCESS_REQUIREMENT = 608,
+ RBAC_PERM_COMMANDS_RELOAD_ACHIEVEMENT_CRITERIA_DATA = 609,
+ RBAC_PERM_COMMANDS_RELOAD_ACHIEVEMENT_REWARD = 610,
+ RBAC_PERM_COMMANDS_RELOAD_ALL = 611,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_ACHIEVEMENT = 612,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_AREA = 613,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_EVENTAI = 614,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_GOSSIP = 615,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_ITEM = 616,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_LOCALES = 617,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_LOOT = 618,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_NPC = 619,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_QUEST = 620,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_SCRIPTS = 621,
+ RBAC_PERM_COMMANDS_RELOAD_ALL_SPELL = 622,
+ RBAC_PERM_COMMANDS_RELOAD_AREATRIGGER_INVOLVEDRELATION = 623,
+ RBAC_PERM_COMMANDS_RELOAD_AREATRIGGER_TAVERN = 624,
+ RBAC_PERM_COMMANDS_RELOAD_AREATRIGGER_TELEPORT = 625,
+ RBAC_PERM_COMMANDS_RELOAD_AUCTIONS = 626,
+ RBAC_PERM_COMMANDS_RELOAD_AUTOBROADCAST = 627,
+ RBAC_PERM_COMMANDS_RELOAD_COMMAND = 628,
+ RBAC_PERM_COMMANDS_RELOAD_CONDITIONS = 629,
+ RBAC_PERM_COMMANDS_RELOAD_CONFIG = 630,
+ RBAC_PERM_COMMANDS_RELOAD_CREATURE_AI_SCRIPTS = 631,
+ RBAC_PERM_COMMANDS_RELOAD_CREATURE_AI_TEXTS = 632,
+ RBAC_PERM_COMMANDS_RELOAD_CREATURE_LINKED_RESPAWN = 633,
+ RBAC_PERM_COMMANDS_RELOAD_CREATURE_LOOT_TEMPLATE = 634,
+ RBAC_PERM_COMMANDS_RELOAD_CREATURE_ONKILL_REPUTATION = 635,
+ RBAC_PERM_COMMANDS_RELOAD_CREATURE_QUESTENDER = 636,
+ RBAC_PERM_COMMANDS_RELOAD_CREATURE_QUESTSTARTER = 637,
+ RBAC_PERM_COMMANDS_RELOAD_CREATURE_SUMMON_GROUPS = 638,
+ RBAC_PERM_COMMANDS_RELOAD_CREATURE_TEMPLATE = 639,
+ RBAC_PERM_COMMANDS_RELOAD_CREATURE_TEXT = 640,
+ RBAC_PERM_COMMANDS_RELOAD_DISABLES = 641,
+ RBAC_PERM_COMMANDS_RELOAD_DISENCHANT_LOOT_TEMPLATE = 642,
+ RBAC_PERM_COMMANDS_RELOAD_EVENT_SCRIPTS = 643,
+ RBAC_PERM_COMMANDS_RELOAD_FISHING_LOOT_TEMPLATE = 644,
+ RBAC_PERM_COMMANDS_RELOAD_GAME_GRAVEYARD_ZONE = 645,
+ RBAC_PERM_COMMANDS_RELOAD_GAMEOBJECT_QUESTENDER = 646,
+ RBAC_PERM_COMMANDS_RELOAD_GAMEOBJECT_QUEST_LOOT_TEMPLATE = 647,
+ RBAC_PERM_COMMANDS_RELOAD_GAMEOBJECT_QUESTSTARTER = 648,
+ RBAC_PERM_COMMANDS_RELOAD_GAME_TELE = 649,
+ RBAC_PERM_COMMANDS_RELOAD_GM_TICKETS = 650,
+ RBAC_PERM_COMMANDS_RELOAD_GOSSIP_MENU = 651,
+ RBAC_PERM_COMMANDS_RELOAD_GOSSIP_MENU_OPTION = 652,
+ RBAC_PERM_COMMANDS_RELOAD_ITEM_ENCHANTMENT_TEMPLATE = 653,
+ RBAC_PERM_COMMANDS_RELOAD_ITEM_LOOT_TEMPLATE = 654,
+ RBAC_PERM_COMMANDS_RELOAD_ITEM_SET_NAMES = 655,
+ RBAC_PERM_COMMANDS_RELOAD_LFG_DUNGEON_REWARDS = 656,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_ACHIEVEMENT_REWARD = 657,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_CRETURE = 658,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_CRETURE_TEXT = 659,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_GAMEOBJECT = 660,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_GOSSIP_MENU_OPTION = 661,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_ITEM = 662,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_ITEM_SET_NAME = 663,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_NPC_TEXT = 664,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_PAGE_TEXT = 665,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_POINTS_OF_INTEREST = 666,
+ RBAC_PERM_COMMANDS_RELOAD_LOCALES_QUEST = 667,
+ RBAC_PERM_COMMANDS_RELOAD_MAIL_LEVEL_REWARD = 668,
+ RBAC_PERM_COMMANDS_RELOAD_MAIL_LOOT_TEMPLATE = 669,
+ RBAC_PERM_COMMANDS_RELOAD_MILLING_LOOT_TEMPLATE = 670,
+ RBAC_PERM_COMMANDS_RELOAD_NPC_SPELLCLICK_SPELLS = 671,
+ RBAC_PERM_COMMANDS_RELOAD_NPC_TRAINER = 672,
+ RBAC_PERM_COMMANDS_RELOAD_NPC_VENDOR = 673,
+ RBAC_PERM_COMMANDS_RELOAD_PAGE_TEXT = 674,
+ RBAC_PERM_COMMANDS_RELOAD_PICKPOCKETING_LOOT_TEMPLATE = 675,
+ RBAC_PERM_COMMANDS_RELOAD_POINTS_OF_INTEREST = 676,
+ RBAC_PERM_COMMANDS_RELOAD_PROSPECTING_LOOT_TEMPLATE = 677,
+ RBAC_PERM_COMMANDS_RELOAD_QUEST_POI = 678,
+ RBAC_PERM_COMMANDS_RELOAD_QUEST_TEMPLATE = 679,
+ RBAC_PERM_COMMANDS_RELOAD_RBAC = 680,
+ RBAC_PERM_COMMANDS_RELOAD_REFERENCE_LOOT_TEMPLATE = 681,
+ RBAC_PERM_COMMANDS_RELOAD_REPUTATION_REWARD_RATE = 682,
+ RBAC_PERM_COMMANDS_RELOAD_RESERVED_NAME = 683,
+ RBAC_PERM_COMMANDS_RELOAD_SKILL_DISCOVERY_TEMPLATE = 684,
+ RBAC_PERM_COMMANDS_RELOAD_SKILL_EXTRA_ITEM_TEMPLATE = 685,
+ RBAC_PERM_COMMANDS_RELOAD_SKILL_FISHING_BASE_LEVEL = 686,
+ RBAC_PERM_COMMANDS_RELOAD_SKINNING_LOOT_TEMPLATE = 687,
+ RBAC_PERM_COMMANDS_RELOAD_SMART_SCRIPTS = 688,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_AREA = 689,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_BONUS_DATA = 690,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_GROUP = 691,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_GROUP_STACK_RULES = 692,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_LEARN_SPELL = 693,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_LINKED_SPELL = 694,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_LOOT_TEMPLATE = 695,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_PET_AURAS = 696,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_PROC = 697,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_PROC_EVENT = 698,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_REQUIRED = 699,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_SCRIPTS = 700,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_TARGET_POSITION = 701,
+ RBAC_PERM_COMMANDS_RELOAD_SPELL_THREATS = 702,
+ RBAC_PERM_COMMANDS_RELOAD_SPILLOVER_TEMPLATE = 703,
+ RBAC_PERM_COMMANDS_RELOAD_TRINITY_STRING = 704,
+ RBAC_PERM_COMMANDS_RELOAD_VEHICLE_ACCESORY = 705,
+ RBAC_PERM_COMMANDS_RELOAD_VEHICLE_TEMPLATE_ACCESSORY = 706,
+ RBAC_PERM_COMMANDS_RELOAD_WARDEN_ACTION = 707,
+ RBAC_PERM_COMMANDS_RELOAD_WAYPOINT_DATA = 708,
+ RBAC_PERM_COMMANDS_RELOAD_WAYPOINT_SCRIPTS = 709,
+ RBAC_PERM_COMMAND_RESET = 710,
+ RBAC_PERM_COMMAND_RESET_ACHIEVEMENTS = 711,
+ RBAC_PERM_COMMAND_RESET_HONOR = 712,
+ RBAC_PERM_COMMAND_RESET_LEVEL = 713,
+ RBAC_PERM_COMMAND_RESET_SPELLS = 714,
+ RBAC_PERM_COMMAND_RESET_STATS = 715,
+ RBAC_PERM_COMMAND_RESET_TALENTS = 716,
+ RBAC_PERM_COMMAND_RESET_ALL = 717,
+ RBAC_PERM_COMMAND_SERVER = 718,
+ RBAC_PERM_COMMAND_SERVER_CORPSES = 719,
+ RBAC_PERM_COMMAND_SERVER_EXIT = 720,
+ RBAC_PERM_COMMAND_SERVER_IDLERESTART = 721,
+ RBAC_PERM_COMMAND_SERVER_IDLERESTART_CANCEL = 722,
+ RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN = 723,
+ RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN_CANCEL = 724,
+ RBAC_PERM_COMMAND_SERVER_INFO = 725,
+ RBAC_PERM_COMMAND_SERVER_PLIMIT = 726,
+ RBAC_PERM_COMMAND_SERVER_RESTART = 727,
+ RBAC_PERM_COMMAND_SERVER_RESTART_CANCEL = 728,
+ RBAC_PERM_COMMAND_SERVER_SET = 729,
+ RBAC_PERM_COMMAND_SERVER_SET_CLOSED = 730,
+ RBAC_PERM_COMMAND_SERVER_SET_DIFFTIME = 731,
+ RBAC_PERM_COMMAND_SERVER_SET_LOGLEVEL = 732,
+ RBAC_PERM_COMMAND_SERVER_SET_MOTD = 733,
+ RBAC_PERM_COMMAND_SERVER_SHUTDOWN = 734,
+ RBAC_PERM_COMMAND_SERVER_SHUTDOWN_CANCEL = 735,
+ RBAC_PERM_COMMAND_SERVER_MOTD = 736,
+ RBAC_PERM_COMMAND_TELE = 737,
+ RBAC_PERM_COMMAND_TELE_ADD = 738,
+ RBAC_PERM_COMMAND_TELE_DEL = 739,
+ RBAC_PERM_COMMAND_TELE_NAME = 740,
+ RBAC_PERM_COMMAND_TELE_GROUP = 741,
+ RBAC_PERM_COMMAND_TICKET = 742,
+ RBAC_PERM_COMMAND_TICKET_ASSIGN = 743,
+ RBAC_PERM_COMMAND_TICKET_CLOSE = 744,
+ RBAC_PERM_COMMAND_TICKET_CLOSEDLIST = 745,
+ RBAC_PERM_COMMAND_TICKET_COMMENT = 746,
+ RBAC_PERM_COMMAND_TICKET_COMPLETE = 747,
+ RBAC_PERM_COMMAND_TICKET_DELETE = 748,
+ RBAC_PERM_COMMAND_TICKET_ESCALATE = 749,
+ RBAC_PERM_COMMAND_TICKET_ESCALATEDLIST = 750,
+ RBAC_PERM_COMMAND_TICKET_LIST = 751,
+ RBAC_PERM_COMMAND_TICKET_ONLINELIST = 752,
+ RBAC_PERM_COMMAND_TICKET_RESET = 753,
+ RBAC_PERM_COMMAND_TICKET_RESPONSE = 754,
+ RBAC_PERM_COMMAND_TICKET_RESPONSE_APPEND = 755,
+ RBAC_PERM_COMMAND_TICKET_RESPONSE_APPENDLN = 756,
+ RBAC_PERM_COMMAND_TICKET_TOGGLESYSTEM = 757,
+ RBAC_PERM_COMMAND_TICKET_UNASSIGN = 758,
+ RBAC_PERM_COMMAND_TICKET_VIEWID = 759,
+ RBAC_PERM_COMMAND_TICKET_VIEWNAME = 760,
+ RBAC_PERM_COMMAND_TITLES = 761,
+ RBAC_PERM_COMMAND_TITLES_ADD = 762,
+ RBAC_PERM_COMMAND_TITLES_CURRENT = 763,
+ RBAC_PERM_COMMAND_TITLES_REMOVE = 764,
+ RBAC_PERM_COMMAND_TITLES_SET = 765,
+ RBAC_PERM_COMMAND_TITLES_SET_MASK = 766,
+ RBAC_PERM_COMMAND_WP = 767,
+ RBAC_PERM_COMMAND_WP_ADD = 768,
+ RBAC_PERM_COMMAND_WP_EVENT = 769,
+ RBAC_PERM_COMMAND_WP_LOAD = 770,
+ RBAC_PERM_COMMAND_WP_MODIFY = 771,
+ RBAC_PERM_COMMAND_WP_UNLOAD = 772,
+ RBAC_PERM_COMMAND_WP_RELOAD = 773,
+ RBAC_PERM_COMMAND_WP_SHOW = 774,
+ RBAC_PERM_COMMAND_MODIFY_CURRENCY = 775, // only 4.3.4
+ RBAC_PERM_COMMAND_DEBUG_PHASE = 776, // Only 4.3.4
+
+ // custom permissions 1000+
+ RBAC_PERM_MAX
+};
+
+enum RBACCommandResult
+{
+ RBAC_OK,
+ RBAC_CANT_ADD_ALREADY_ADDED,
+ RBAC_CANT_REVOKE_NOT_IN_LIST,
+ RBAC_IN_GRANTED_LIST,
+ RBAC_IN_DENIED_LIST,
+ RBAC_ID_DOES_NOT_EXISTS
+};
+
+typedef std::bitset<RBAC_PERM_MAX> RBACPermissionContainer;
+typedef std::set<uint32> RBACRoleContainer;
+typedef std::set<uint32> RBACGroupContainer;
+
+class RBACObject
+{
+ public:
+ RBACObject(uint32 id = 0, std::string const& name = ""):
+ _id(id), _name(name) { }
+
+ virtual ~RBACObject() { }
+
+ /// Gets the Name of the Object
+ std::string const& GetName() const { return _name; }
+ /// Gets the Id of the Object
+ uint32 GetId() const { return _id; }
+
+ private:
+ uint32 _id; ///> id of the object
+ std::string _name; ///> name of the object
+};
+
+/// Permission: Defines an autorization to perform certain operation
+class RBACPermission: public RBACObject
+{
+ public:
+ RBACPermission(uint32 id = 0, std::string const& name = ""):
+ RBACObject(id, name) { }
+};
+
+/// Set of Permissions
+class RBACRole: public RBACObject
+{
+ public:
+ RBACRole(uint32 id = 0, std::string const& name = ""):
+ RBACObject(id, name) { }
+
+ /// Gets the Permissions assigned to this role
+ RBACPermissionContainer const& GetPermissions() const { return _perms; }
+ /// Grants a Permission (Adds)
+ void GrantPermission(uint32 id);
+ /// Revokes a Permission (Removes)
+ void RevokePermission(uint32 id);
+
+ private:
+ RBACPermissionContainer _perms; ///> Set of permissions
+};
+
+/// Set of Roles
+class RBACGroup: public RBACObject
+{
+ public:
+ RBACGroup(uint32 id = 0, std::string const& name = ""):
+ RBACObject(id, name) { }
+
+ /// Gets the Roles assigned to this group
+ RBACRoleContainer const& GetRoles() const { return _roles; }
+ /// Grants a Role (Adds)
+ void GrantRole(uint32 role);
+ /// Revokes a Role (Removes)
+ void RevokeRole(uint32 role);
+
+ private:
+ RBACRoleContainer _roles; ///> Set of Roles
+};
+
+/**
+ * @name RBACData
+ * @brief Contains all needed information about the acccount
+ *
+ * This class contains all the data needed to calculate the account permissions.
+ * RBACDAta is formed by group permissions and user permissions through:
+ * - Granted Groups, which contains roles, which contains permissions: Set of granted permissions
+ * - Granted Roles, which contains permissions: Set of granted permissions
+ * - Denied Roles, which contains permissions: Set of denied permissions
+ * - Granted Permissions
+ * - Denied Permissions
+ *
+ * Calculation of current Permissions: Granted permissions - Denied permissions
+ * - Granted permissions: through groups, through roles and directly assigned
+ * - Denied permissions: through roles and directly assigned
+ */
+class RBACData: public RBACObject
+{
+ public:
+ RBACData(uint32 id, std::string const& name, int32 realmId):
+ RBACObject(id, name), _realmId(realmId) { }
+
+ /**
+ * @name HasPermission
+ * @brief Checks if certain action is allowed
+ *
+ * Checks if certain action can be performed.
+ *
+ * @return grant or deny action
+ *
+ * Example Usage:
+ * @code
+ * bool Player::CanJoinArena(Battleground* bg)
+ * {
+ * return bg->isArena() && HasPermission(RBAC_PERM_JOIN_ARENA);
+ * }
+ * @endcode
+ */
+ bool HasPermission(uint32 permission) const { return _globalPerms.test(permission); }
+
+ // Functions enabled to be used by command system
+ /// Returns all the granted permissions (after computation)
+ RBACPermissionContainer const& GetPermissions() const { return _globalPerms; }
+ /// Returns all the granted permissions
+ RBACPermissionContainer const& GetGrantedPermissions() const { return _grantedPerms; }
+ /// Returns all the denied permissions
+ RBACPermissionContainer const& GetDeniedPermissions() const { return _deniedPerms; }
+ /// Returns all the granted roles
+ RBACRoleContainer const& GetGrantedRoles() const { return _grantedRoles; }
+ /// Returns all the denied roles
+ RBACRoleContainer const& GetDeniedRoles() const { return _deniedRoles; }
+ /// Returns all the granted groups
+ RBACGroupContainer const& GetGroups() const { return _groups; }
+
+ /**
+ * @name AddGroup
+ * @brief Adds new group
+ *
+ * Add a new group to the account. If realm is 0 or the group can not be added
+ * No save to db action will be performed.
+ *
+ * Fails if group Id does not exists or group already present
+ *
+ * @param groupId group to be added
+ * @param realmId realm affected
+ *
+ * @return Success or failure (with reason) to add the group
+ *
+ * Example Usage:
+ * @code
+ * // previously defined "RBACData* rbac" with proper initialization
+ * uint32 groupId = 2;
+ * if (rbac->AddGroup(groupId) == RBAC_OK)
+ * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Group %u succesfully added", groupId);
+ * @endcode
+ */
+ RBACCommandResult AddGroup(uint32 groupId, int32 realmId = 0);
+
+ /**
+ * @name RemoveGroup
+ * @brief Removes a group
+ *
+ * Removes a group from the account. If realm is 0 or the group can not be removed
+ * No save to db action will be performed. Any delete operation will always affect
+ * "all realms (-1)" in addition to the realm specified
+ *
+ * Fails if group not present
+ *
+ * @param groupId group to be removed
+ * @param realmId realm affected
+ *
+ * @return Success or failure (with reason) to remove the group
+ *
+ * Example Usage:
+ * // previously defined "RBACData* rbac" with proper initialization
+ * uint32 groupId = 2;
+ * if (rbac->RemoveGroup(groupId) == RBAC_OK)
+ * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Group %u succesfully removed", groupId);
+ * @endcode
+ */
+ RBACCommandResult RemoveGroup(uint32 groupId, int32 realmId = 0);
+
+ /**
+ * @name GrantRole
+ * @brief Grants a role
+ *
+ * Grants a role to the account. If realm is 0 or the role can not be added
+ * No save to db action will be performed.
+ *
+ * Fails if role Id does not exists or role already granted or denied
+ *
+ * @param roleId role to be granted
+ * @param realmId realm affected
+ *
+ * @return Success or failure (with reason) to grant the role
+ *
+ * Example Usage:
+ * // previously defined "RBACData* rbac" with proper initialization
+ * uint32 roleId = 2;
+ * if (rbac->GrantRole(roleId) == RBAC_IN_DENIED_LIST)
+ * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Failed to grant role %u, already denied", roleId);
+ * @endcode
+ */
+ RBACCommandResult GrantRole(uint32 roleId, int32 realmId = 0);
+
+ /**
+ * @name DenyRole
+ * @brief Denies a role
+ *
+ * Denied a role to the account. If realm is 0 or the role can not be added
+ * No save to db action will be performed.
+ *
+ * Fails if role Id does not exists or role already granted or denied
+ *
+ * @param roleId role to be denied
+ * @param realmId realm affected
+ *
+ * @return Success or failure (with reason) to deny the role
+ *
+ * Example Usage:
+ * // previously defined "RBACData* rbac" with proper initialization
+ * uint32 roleId = 2;
+ * if (rbac->DenyRole(roleId) == RBAC_ID_DOES_NOT_EXISTS)
+ * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Role Id %u does not exists", roleId);
+ * @endcode
+ */
+ RBACCommandResult DenyRole(uint32 roleId, int32 realmId = 0);
+
+ /**
+ * @name RevokeRole
+ * @brief Removes a role
+ *
+ * Removes a role from the account. If realm is 0 or the role can not be removed
+ * No save to db action will be performed. Any delete operation will always affect
+ * "all realms (-1)" in addition to the realm specified
+ *
+ * Fails if role not present
+ *
+ * @param roleId role to be removed
+ * @param realmId realm affected
+ *
+ * @return Success or failure (with reason) to remove the role
+ *
+ * Example Usage:
+ * // previously defined "RBACData* rbac" with proper initialization
+ * uint32 roleId = 2;
+ * if (rbac->RevokeRole(roleId) == RBAC_OK)
+ * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Role %u succesfully removed", roleId);
+ * @endcode
+ */
+ RBACCommandResult RevokeRole(uint32 roleId, int32 realmId = 0);
+
+ /**
+ * @name GrantRole
+ * @brief Grants a permission
+ *
+ * Grants a permission to the account. If realm is 0 or the permission can not be added
+ * No save to db action will be performed.
+ *
+ * Fails if permission Id does not exists or permission already granted or denied
+ *
+ * @param permissionId permission to be granted
+ * @param realmId realm affected
+ *
+ * @return Success or failure (with reason) to grant the permission
+ *
+ * Example Usage:
+ * // previously defined "RBACData* rbac" with proper initialization
+ * uint32 permissionId = 2;
+ * if (rbac->GrantRole(permissionId) == RBAC_IN_DENIED_LIST)
+ * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Failed to grant permission %u, already denied", permissionId);
+ * @endcode
+ */
+ RBACCommandResult GrantPermission(uint32 permissionId, int32 realmId = 0);
+
+ /**
+ * @name DenyPermission
+ * @brief Denies a permission
+ *
+ * Denied a permission to the account. If realm is 0 or the permission can not be added
+ * No save to db action will be performed.
+ *
+ * Fails if permission Id does not exists or permission already granted or denied
+ *
+ * @param permissionId permission to be denied
+ * @param realmId realm affected
+ *
+ * @return Success or failure (with reason) to deny the permission
+ *
+ * Example Usage:
+ * // previously defined "RBACData* rbac" with proper initialization
+ * uint32 permissionId = 2;
+ * if (rbac->DenyRole(permissionId) == RBAC_ID_DOES_NOT_EXISTS)
+ * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Role Id %u does not exists", permissionId);
+ * @endcode
+ */
+ RBACCommandResult DenyPermission(uint32 permissionId, int32 realmId = 0);
+
+ /**
+ * @name RevokePermission
+ * @brief Removes a permission
+ *
+ * Removes a permission from the account. If realm is 0 or the permission can not be removed
+ * No save to db action will be performed. Any delete operation will always affect
+ * "all realms (-1)" in addition to the realm specified
+ *
+ * Fails if permission not present
+ *
+ * @param permissionId permission to be removed
+ * @param realmId realm affected
+ *
+ * @return Success or failure (with reason) to remove the permission
+ *
+ * Example Usage:
+ * // previously defined "RBACData* rbac" with proper initialization
+ * uint32 permissionId = 2;
+ * if (rbac->RevokeRole(permissionId) == RBAC_OK)
+ * TC_LOG_DEBUG(LOG_FILTER_PLAYER, "Permission %u succesfully removed", permissionId);
+ * @endcode
+ */
+ RBACCommandResult RevokePermission(uint32 permissionId, int32 realmId = 0);
+
+ /// Loads all permissions, groups and roles assigned to current account
+ void LoadFromDB();
+ private:
+ /// Saves a role to DB, Granted or Denied
+ void SaveRole(uint32 role, bool granted, int32 realm);
+ /// Saves a permission to DB, Granted or Denied
+ void SavePermission(uint32 role, bool granted, int32 realm);
+
+ /**
+ * @name CalculateNewPermissions
+ * @brief Calculates new permissions
+ *
+ * Calculates new permissions after some change in groups, roles or permissions.
+ * The calculation is done Granted - Denied:
+ * - Granted permissions: through groups, through roles and directly assigned
+ * - Denied permissions: through roles and directly assigned
+ */
+ void CalculateNewPermissions();
+
+ int32 GetRealmId() { return _realmId; }
+
+ int32 _realmId; ///> RealmId Affected
+ RBACGroupContainer _groups; ///> Granted groups
+ RBACRoleContainer _grantedRoles; ///> Granted roles
+ RBACRoleContainer _deniedRoles; ///> Denied roles
+ RBACPermissionContainer _grantedPerms; ///> Granted permissions
+ RBACPermissionContainer _deniedPerms; ///> Denied permissions
+ RBACPermissionContainer _globalPerms; ///> Calculated permissions
+};
+
+#endif
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 3d2eaffc15d..caadd842273 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -82,6 +82,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
switch (criteria->requiredType)
{
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: // only hardcoded list
@@ -116,7 +117,6 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
switch (dataType)
{
case ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE:
- case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE:
case ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT:
return true;
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE:
@@ -189,6 +189,14 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
return false;
}
return true;
+ case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE:
+ if (value.compType >= COMP_TYPE_MAX)
+ {
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE (%u) has wrong ComparisionType in value2 (%u), ignored.",
+ value.compType, criteria->requiredType, dataType, value.value);
+ return false;
+ }
+ return true;
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL:
if (level.minlevel > STRONG_MAX_LEVEL)
{
@@ -345,7 +353,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA:
return target && target->HasAuraEffect(aura.spell_id, aura.effect_idx);
case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE:
- return miscvalue1 >= value.minvalue;
+ return CompareValues(ComparisionType(value.compType), miscvalue1, value.value);
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL:
if (!target)
return false;
@@ -508,103 +516,50 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans)
{
if (!m_completedAchievements.empty())
{
- bool need_execute = false;
- std::ostringstream ssdel;
- std::ostringstream ssins;
for (CompletedAchievementMap::iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter)
{
if (!iter->second.changed)
continue;
- /// first new/changed record prefix
- if (!need_execute)
- {
- ssdel << "DELETE FROM character_achievement WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND achievement IN (";
- ssins << "INSERT INTO character_achievement (guid, achievement, date) VALUES ";
- need_execute = true;
- }
- /// next new/changed record prefix
- else
- {
- ssdel << ',';
- ssins << ',';
- }
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT);
+ stmt->setUInt16(0, iter->first);
+ stmt->setUInt32(1, GetPlayer()->GetGUID());
+ trans->Append(stmt);
- // new/changed record data
- ssdel << iter->first;
- ssins << '(' << GetPlayer()->GetGUIDLow() << ',' << iter->first << ',' << uint64(iter->second.date) << ')';
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT);
+ stmt->setUInt32(0, GetPlayer()->GetGUID());
+ stmt->setUInt16(1, iter->first);
+ stmt->setUInt32(2, uint32(iter->second.date));
+ trans->Append(stmt);
- /// mark as saved in db
iter->second.changed = false;
}
-
- if (need_execute)
- {
- ssdel << ')';
- trans->Append(ssdel.str().c_str());
- trans->Append(ssins.str().c_str());
- }
}
if (!m_criteriaProgress.empty())
{
- /// prepare deleting and insert
- bool need_execute_del = false;
- bool need_execute_ins = false;
- std::ostringstream ssdel;
- std::ostringstream ssins;
for (CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter)
{
if (!iter->second.changed)
continue;
- // deleted data (including 0 progress state)
- {
- /// first new/changed record prefix (for any counter value)
- if (!need_execute_del)
- {
- ssdel << "DELETE FROM character_achievement_progress WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND criteria IN (";
- need_execute_del = true;
- }
- /// next new/changed record prefix
- else
- ssdel << ',';
-
- // new/changed record data
- ssdel << iter->first;
- }
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA);
+ stmt->setUInt32(0, GetPlayer()->GetGUID());
+ stmt->setUInt16(1, iter->first);
+ trans->Append(stmt);
- // store data only for real progress
- if (iter->second.counter != 0)
+ if (iter->second.counter)
{
- /// first new/changed record prefix
- if (!need_execute_ins)
- {
- ssins << "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES ";
- need_execute_ins = true;
- }
- /// next new/changed record prefix
- else
- ssins << ',';
-
- // new/changed record data
- ssins << '(' << GetPlayer()->GetGUIDLow() << ',' << iter->first << ',' << iter->second.counter << ',' << iter->second.date << ')';
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS);
+ stmt->setUInt32(0, GetPlayer()->GetGUID());
+ stmt->setUInt16(1, iter->first);
+ stmt->setUInt32(2, iter->second.counter);
+ stmt->setUInt32(3, uint32(iter->second.date));
+ trans->Append(stmt);
}
- /// mark as updated in db
iter->second.changed = false;
}
-
- if (need_execute_del) // DELETE ... IN (.... _)_
- ssdel << ')';
-
- if (need_execute_del || need_execute_ins)
- {
- if (need_execute_del)
- trans->Append(ssdel.str().c_str());
- if (need_execute_ins)
- trans->Append(ssins.str().c_str());
- }
}
}
@@ -882,6 +837,20 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
break;
}
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
+ {
+ // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
+ if (!miscValue2)
+ continue;
+
+ // those requirements couldn't be found in the dbc
+ AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
+ if (!data || !data->Meets(GetPlayer(), unit, miscValue1))
+ continue;
+
+ SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
+ break;
+ }
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria))
if (!data->Meets(GetPlayer(), unit))
@@ -1301,7 +1270,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, 1);
break;
}
-
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
{
@@ -1616,7 +1584,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA:
case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
case ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE:
- case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
break; // Not implemented yet :(
}
@@ -1774,6 +1741,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER:
case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL:
case ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS:
case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID:
@@ -2331,6 +2299,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: // any cases
break;
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
break; // any cases
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
{
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index ce6ab9cd29b..f57c05a2769 100644
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -116,7 +116,8 @@ struct AchievementCriteriaData
// ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE = 8
struct
{
- uint32 minvalue;
+ uint32 value;
+ uint32 compType;
} value;
// ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL = 9
struct
diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp
index a84e7ec30db..08557b939eb 100644
--- a/src/server/game/Battlegrounds/ArenaTeam.cpp
+++ b/src/server/game/Battlegrounds/ArenaTeam.cpp
@@ -82,7 +82,7 @@ bool ArenaTeam::Create(uint64 captainGuid, uint8 type, std::string const& teamNa
// Add captain as member
AddMember(CaptainGuid);
- TC_LOG_INFO(LOG_FILTER_ARENAS, "New ArenaTeam created [Id: %u] [Type: %u] [Captain low GUID: %u]", GetId(), GetType(), captainLowGuid);
+ TC_LOG_INFO(LOG_FILTER_ARENAS, "New ArenaTeam created [Id: %u, Name: %s] [Type: %u] [Captain low GUID: %u]", GetId(), GetName().c_str(), GetType(), captainLowGuid);
return true;
}
@@ -304,9 +304,9 @@ void ArenaTeam::SetCaptain(uint64 guid)
newCaptain->SetArenaTeamInfoField(GetSlot(), ARENA_TEAM_MEMBER, 0);
if (oldCaptain)
{
- TC_LOG_DEBUG(LOG_FILTER_BATTLEGROUND, "Player: %s [GUID: %u] promoted player: %s [GUID: %u] to leader of arena team [Id: %u] [Type: %u].",
+ TC_LOG_DEBUG(LOG_FILTER_BATTLEGROUND, "Player: %s [GUID: %u] promoted player: %s [GUID: %u] to leader of arena team [Id: %u, Name: %s] [Type: %u].",
oldCaptain->GetName().c_str(), oldCaptain->GetGUIDLow(), newCaptain->GetName().c_str(),
- newCaptain->GetGUIDLow(), GetId(), GetType());
+ newCaptain->GetGUIDLow(), GetId(), GetName().c_str(), GetType());
}
}
}
@@ -328,7 +328,7 @@ void ArenaTeam::DelMember(uint64 guid, bool cleanDb)
// delete all info regarding this team
for (uint32 i = 0; i < ARENA_TEAM_END; ++i)
player->SetArenaTeamInfoField(GetSlot(), ArenaTeamInfoType(i), 0);
- TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] left arena team type: %u [Id: %u].", player->GetName().c_str(), player->GetGUIDLow(), GetType(), GetId());
+ TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] left arena team type: %u [Id: %u, Name: %s].", player->GetName().c_str(), player->GetGUIDLow(), GetType(), GetId(), GetName().c_str());
}
// Only used for single member deletion, for arena team disband we use a single query for more efficiency
@@ -353,7 +353,7 @@ void ArenaTeam::Disband(WorldSession* session)
BroadcastEvent(ERR_ARENA_TEAM_DISBANDED_S, 0, 2, session->GetPlayerName(), GetName(), "");
if (Player* player = session->GetPlayer())
- TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] disbanded arena team type: %u [Id: %u].", player->GetName().c_str(), player->GetGUIDLow(), GetType(), GetId());
+ TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] disbanded arena team type: %u [Id: %u, Name: %s].", player->GetName().c_str(), player->GetGUIDLow(), GetType(), GetId(), GetName().c_str());
}
// Update database
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 21c054c8793..211ab6caf77 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -886,9 +886,9 @@ void Battleground::EndBattleground(uint32 winner)
}
}
- uint32 winner_kills = player->GetRandomWinner() ? BG_REWARD_WINNER_HONOR_LAST : BG_REWARD_WINNER_HONOR_FIRST;
- uint32 loser_kills = player->GetRandomWinner() ? BG_REWARD_LOSER_HONOR_LAST : BG_REWARD_LOSER_HONOR_FIRST;
- uint32 winner_arena = player->GetRandomWinner() ? BG_REWARD_WINNER_ARENA_LAST : BG_REWARD_WINNER_ARENA_FIRST;
+ uint32 winner_kills = player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_HONOR_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_HONOR_FIRST);
+ uint32 loser_kills = player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_FIRST);
+ uint32 winner_arena = player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_ARENA_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_ARENA_FIRST);
// Reward winner team
if (team == winner)
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index 1f180542016..76ff08e0281 100644
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -143,16 +143,6 @@ enum BattlegroundBuffObjects
BG_OBJECTID_BERSERKERBUFF_ENTRY = 179905
};
-enum BattlegroundRandomRewards
-{
- BG_REWARD_WINNER_HONOR_FIRST = 30,
- BG_REWARD_WINNER_ARENA_FIRST = 25,
- BG_REWARD_WINNER_HONOR_LAST = 15,
- BG_REWARD_WINNER_ARENA_LAST = 0,
- BG_REWARD_LOSER_HONOR_FIRST = 5,
- BG_REWARD_LOSER_HONOR_LAST = 5
-};
-
const uint32 Buff_Entries[3] = { BG_OBJECTID_SPEEDBUFF_ENTRY, BG_OBJECTID_REGENBUFF_ENTRY, BG_OBJECTID_BERSERKERBUFF_ENTRY };
enum BattlegroundStatus
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index 557cb9de09f..936cc88462f 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -262,8 +262,8 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg)
Battleground::BattlegroundScoreMap::const_iterator itr2 = bg->GetPlayerScoresBegin();
for (Battleground::BattlegroundScoreMap::const_iterator itr = itr2; itr != bg->GetPlayerScoresEnd();)
{
- BattlegroundScore* score = itr2->second;
itr2 = itr++;
+ BattlegroundScore* score = itr2->second;
if (!bg->IsPlayerInBattleground(itr2->first))
{
TC_LOG_ERROR(LOG_FILTER_BATTLEGROUND, "Player " UI64FMTD " has scoreboard entry for battleground %u but is not in battleground!", itr->first, bg->GetTypeID(true));
@@ -828,9 +828,9 @@ void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket* data, uint64 guid
if (!player)
return;
- uint32 winner_kills = player->GetRandomWinner() ? BG_REWARD_WINNER_HONOR_LAST : BG_REWARD_WINNER_HONOR_FIRST;
- uint32 winner_arena = player->GetRandomWinner() ? BG_REWARD_WINNER_ARENA_LAST : BG_REWARD_WINNER_ARENA_FIRST;
- uint32 loser_kills = player->GetRandomWinner() ? BG_REWARD_LOSER_HONOR_LAST : BG_REWARD_LOSER_HONOR_FIRST;
+ uint32 winner_kills = player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_HONOR_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_HONOR_FIRST);
+ uint32 winner_arena = player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_ARENA_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_ARENA_FIRST);
+ uint32 loser_kills = player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_FIRST);
winner_kills = Trinity::Honor::hk_honor_at_level(player->getLevel(), float(winner_kills));
loser_kills = Trinity::Honor::hk_honor_at_level(player->getLevel(), float(loser_kills));
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
index 6fc68c62d1f..29d4e4124c0 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
@@ -544,7 +544,11 @@ void BattlegroundIC::EventPlayerClickedOnFlag(Player* player, GameObject* target
float cords[4] = {banner->GetPositionX(), banner->GetPositionY(), banner->GetPositionZ(), banner->GetOrientation() };
DelObject(nodePoint[i].gameobject_type);
- AddObject(nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry, cords[0], cords[1], cords[2], cords[3], 0, 0, 0, 0, RESPAWN_ONE_DAY);
+ if (!AddObject(nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry, cords[0], cords[1], cords[2], cords[3], 0, 0, 0, 0, RESPAWN_ONE_DAY))
+ {
+ TC_LOG_ERROR(LOG_FILTER_BATTLEGROUND, "Isle of Conquest: There was an error spawning a banner (type: %u, entry: %u). Isle of Conquest BG cancelled.", nodePoint[i].gameobject_type, nodePoint[i].gameobject_entry);
+ Battleground::EndBattleground(WINNER_NONE);
+ }
GetBGObject(nodePoint[i].gameobject_type)->SetUInt32Value(GAMEOBJECT_FACTION, nodePoint[i].faction == TEAM_ALLIANCE ? BG_IC_Factions[1] : BG_IC_Factions[0]);
@@ -641,10 +645,13 @@ void BattlegroundIC::HandleCapturedNodes(ICNodePoint* nodePoint, bool recapture)
for (uint8 u = 0; u < MAX_HANGAR_TELEPORTERS_SPAWNS; ++u)
{
uint8 type = BG_IC_GO_HANGAR_TELEPORTER_1+u;
- AddObject(type, (nodePoint->faction == TEAM_ALLIANCE ? GO_ALLIANCE_GUNSHIP_PORTAL : GO_HORDE_GUNSHIP_PORTAL),
+ if (!AddObject(type, (nodePoint->faction == TEAM_ALLIANCE ? GO_ALLIANCE_GUNSHIP_PORTAL : GO_HORDE_GUNSHIP_PORTAL),
BG_IC_HangarTeleporters[u].GetPositionX(), BG_IC_HangarTeleporters[u].GetPositionY(),
BG_IC_HangarTeleporters[u].GetPositionZ(), BG_IC_HangarTeleporters[u].GetOrientation(),
- 0, 0, 0, 0, RESPAWN_ONE_DAY);
+ 0, 0, 0, 0, RESPAWN_ONE_DAY))
+ {
+ TC_LOG_ERROR(LOG_FILTER_BATTLEGROUND, "Isle of Conquest: There was an error spawning a gunship portal. Type: %u", BG_IC_GO_HANGAR_TELEPORTER_1+u);
+ }
}
//TC_LOG_ERROR(LOG_FILTER_BATTLEGROUND, "BG_IC_GO_HANGAR_BANNER CAPTURED Faction: %u", nodePoint->faction);
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
index 34d03a5d92c..6fdc97f25c5 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
@@ -818,7 +818,7 @@ const Position allianceGunshipPassengers[5] =
struct ICNodePoint
{
uint32 gameobject_type; // with this we will get the GameObject of that point
- uint32 gameobject_entry; // what gamoebject entry is active here.
+ uint32 gameobject_entry; // what gameobject entry is active here.
uint8 faction; // who has this node
ICNodePointType nodeType; // here we can specify if it is graveyards, hangar etc...
uint32 banners[4]; // the banners that have this point
diff --git a/src/server/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp
index 62b3416f72e..96d28035b29 100644
--- a/src/server/game/Chat/Channels/ChannelMgr.cpp
+++ b/src/server/game/Chat/Channels/ChannelMgr.cpp
@@ -43,7 +43,9 @@ ChannelMgr* ChannelMgr::forTeam(uint32 team)
Channel* ChannelMgr::GetJoinChannel(std::string const& name, uint32 channelId)
{
std::wstring wname;
- Utf8toWStr(name, wname);
+ if (!Utf8toWStr(name, wname))
+ return NULL;
+
wstrToLower(wname);
ChannelMap::const_iterator i = channels.find(wname);
@@ -61,7 +63,9 @@ Channel* ChannelMgr::GetJoinChannel(std::string const& name, uint32 channelId)
Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool pkt)
{
std::wstring wname;
- Utf8toWStr(name, wname);
+ if (!Utf8toWStr(name, wname))
+ return NULL;
+
wstrToLower(wname);
ChannelMap::const_iterator i = channels.find(wname);
@@ -84,7 +88,9 @@ Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool pk
void ChannelMgr::LeftChannel(std::string const& name)
{
std::wstring wname;
- Utf8toWStr(name, wname);
+ if (!Utf8toWStr(name, wname))
+ return;
+
wstrToLower(wname);
ChannelMap::const_iterator i = channels.find(wname);
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index ada7909e9ff..933d77cc2e8 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -1500,6 +1500,11 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
}
break;
}
+ case CONDITION_SOURCE_TYPE_PHASE_DEFINITION:
+ {
+ TC_LOG_ERROR(LOG_FILTER_SQL, "CONDITION_SOURCE_TYPE_PHASE_DEFINITION:: is only for 4.3.4 branch, skipped");
+ return false;
+ }
case CONDITION_SOURCE_TYPE_GOSSIP_MENU:
case CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION:
case CONDITION_SOURCE_TYPE_SMART_EVENT:
@@ -1763,7 +1768,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
{
if (cond->ConditionValue2 >= COMP_TYPE_MAX)
{
- TC_LOG_ERROR(LOG_FILTER_SQL, "Level condition has invalid option (%u), skipped", cond->ConditionValue2);
+ TC_LOG_ERROR(LOG_FILTER_SQL, "Level condition has invalid ComparisionType (%u), skipped", cond->ConditionValue2);
return false;
}
if (cond->ConditionValue3)
diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h
index 07eab29e53a..cc2db10e437 100644
--- a/src/server/game/Conditions/ConditionMgr.h
+++ b/src/server/game/Conditions/ConditionMgr.h
@@ -129,17 +129,8 @@ enum ConditionSourceType
CONDITION_SOURCE_TYPE_SMART_EVENT = 22,
CONDITION_SOURCE_TYPE_NPC_VENDOR = 23,
CONDITION_SOURCE_TYPE_SPELL_PROC = 24,
- CONDITION_SOURCE_TYPE_MAX = 25 // MAX
-};
-
-enum ComparisionType
-{
- COMP_TYPE_EQ = 0,
- COMP_TYPE_HIGH,
- COMP_TYPE_LOW,
- COMP_TYPE_HIGH_EQ,
- COMP_TYPE_LOW_EQ,
- COMP_TYPE_MAX
+ CONDITION_SOURCE_TYPE_PHASE_DEFINITION = 25, // only 4.3.4
+ CONDITION_SOURCE_TYPE_MAX = 26 // MAX
};
enum RelationType
@@ -273,27 +264,6 @@ class ConditionMgr
SmartEventConditionContainer SmartEventConditionStore;
};
-template <class T> bool CompareValues(ComparisionType type, T val1, T val2)
-{
- switch (type)
- {
- case COMP_TYPE_EQ:
- return val1 == val2;
- case COMP_TYPE_HIGH:
- return val1 > val2;
- case COMP_TYPE_LOW:
- return val1 < val2;
- case COMP_TYPE_HIGH_EQ:
- return val1 >= val2;
- case COMP_TYPE_LOW_EQ:
- return val1 <= val2;
- default:
- // incorrect parameter
- ASSERT(false);
- return false;
- }
-}
-
#define sConditionMgr ACE_Singleton<ConditionMgr, ACE_Null_Mutex>::instance()
#endif
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index c371fc781fd..e12f70baa41 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -1966,9 +1966,9 @@ struct VehicleSeatEntry
bool CanEnterOrExit() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT; }
bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_SWITCH; }
- bool IsUsableByOverride() const { return (m_flags & VEHICLE_SEAT_FLAG_UNCONTROLLED)
+ bool IsUsableByOverride() const { return (m_flags & (VEHICLE_SEAT_FLAG_UNCONTROLLED | VEHICLE_SEAT_FLAG_UNK18)
|| (m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 |
- VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4)); }
+ VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4))); }
bool IsEjectable() const { return m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE; }
};
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index b1ee724e5f7..68d30cd1dde 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -539,8 +539,11 @@ inline void KillRewarder::_RewardKillCredit(Player* player)
{
// 4.4. Give kill credit (player must not be in group, or he must be alive or without corpse).
if (!_group || player->IsAlive() || !player->GetCorpse())
- if (_victim->GetTypeId() == TYPEID_UNIT)
- player->KilledMonster(_victim->ToCreature()->GetCreatureTemplate(), _victim->GetGUID());
+ if (Creature* target = _victim->ToCreature())
+ {
+ player->KilledMonster(target->GetCreatureTemplate(), target->GetGUID());
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE, target->GetCreatureType(), 1, target);
+ }
}
void KillRewarder::_RewardPlayer(Player* player, bool isDungeon)
@@ -4028,7 +4031,7 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
itr->second->state = PLAYERSPELL_REMOVED;
}
- RemoveAurasDueToSpell(spell_id);
+ RemoveOwnedAura(spell_id, GetGUID());
// remove pet auras
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
@@ -4713,7 +4716,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
if (uint32 guildId = GetGuildIdFromDB(playerguid))
if (Guild* guild = sGuildMgr->GetGuildById(guildId))
- guild->DeleteMember(guid);
+ guild->DeleteMember(guid, false, false, true);
// remove from arena teams
LeaveAllArenaTeams(playerguid);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 7f1d231ebd9..2f309c07cce 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -5236,9 +5236,10 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp)
uint32 oldMSTime = getMSTime();
time_t curTime = time(NULL);
- tm* lt = localtime(&curTime);
+ tm lt;
+ ACE_OS::localtime_r(&curTime, &lt);
uint64 basetime(curTime);
- TC_LOG_INFO(LOG_FILTER_GENERAL, "Returning mails current time: hour: %d, minute: %d, second: %d ", lt->tm_hour, lt->tm_min, lt->tm_sec);
+ TC_LOG_INFO(LOG_FILTER_GENERAL, "Returning mails current time: hour: %d, minute: %d, second: %d ", lt.tm_hour, lt.tm_min, lt.tm_sec);
// Delete all old mails without item and without body immediately, if starting server
if (!serverUp)
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index f43e49a3440..8ec6aac9d4e 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1943,10 +1943,22 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* SendMsgTo)
if (SendMsgTo)
{
- if (isEmpty)
- SendMsgTo->SendResetInstanceSuccess(instanceSave->GetMapId());
- else
+ if (!isEmpty)
SendMsgTo->SendResetInstanceFailed(0, instanceSave->GetMapId());
+ else if (sWorld->getBoolConfig(CONFIG_INSTANCES_RESET_ANNOUNCE))
+ {
+ if (Group* group = SendMsgTo->GetGroup())
+ {
+ for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
+ if (Player* player = itr->GetSource())
+ player->SendResetInstanceSuccess(instanceSave->GetMapId());
+ }
+
+ else
+ SendMsgTo->SendResetInstanceSuccess(instanceSave->GetMapId());
+ }
+ else
+ SendMsgTo->SendResetInstanceSuccess(instanceSave->GetMapId());
}
if (isEmpty || method == INSTANCE_RESET_GROUP_DISBAND || method == INSTANCE_RESET_CHANGE_DIFFICULTY)
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index ab0f1e572f1..b766897988d 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -1578,6 +1578,8 @@ void Guild::HandleAcceptMember(WorldSession* session)
void Guild::HandleLeaveMember(WorldSession* session)
{
Player* player = session->GetPlayer();
+ bool disband = false;
+
// If leader is leaving
if (_IsLeader(player))
{
@@ -1585,8 +1587,11 @@ void Guild::HandleLeaveMember(WorldSession* session)
// Leader cannot leave if he is not the last member
SendCommandResult(session, GUILD_COMMAND_QUIT, ERR_GUILD_LEADER_LEAVE);
else
+ {
// Guild is disbanded if leader leaves.
Disband();
+ disband = true;
+ }
}
else
{
@@ -1599,6 +1604,9 @@ void Guild::HandleLeaveMember(WorldSession* session)
}
sCalendarMgr->RemovePlayerGuildEventsAndSignups(player->GetGUID(), GetId());
+
+ if (disband)
+ delete this;
}
void Guild::HandleRemoveMember(WorldSession* session, std::string const& name)
@@ -1754,6 +1762,9 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount)
bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool repair)
{
+ //clamp amount to MAX_MONEY_AMOUNT, Players can't hold more than that anyway
+ amount = std::min(amount, uint32(MAX_MONEY_AMOUNT));
+
if (m_bankMoney < amount) // Not enough money in bank
return false;
@@ -1812,6 +1823,7 @@ void Guild::HandleDisband(WorldSession* session)
{
Disband();
TC_LOG_DEBUG(LOG_FILTER_GUILD, "Guild Successfully Disbanded");
+ delete this;
}
}
@@ -2272,7 +2284,7 @@ bool Guild::AddMember(uint64 guid, uint8 rankId)
return true;
}
-void Guild::DeleteMember(uint64 guid, bool isDisbanding, bool isKicked)
+void Guild::DeleteMember(uint64 guid, bool isDisbanding, bool isKicked, bool canDeleteGuild)
{
uint32 lowguid = GUID_LOPART(guid);
Player* player = ObjectAccessor::FindPlayer(guid);
@@ -2294,6 +2306,8 @@ void Guild::DeleteMember(uint64 guid, bool isDisbanding, bool isKicked)
if (!newLeader)
{
Disband();
+ if (canDeleteGuild)
+ delete this;
return;
}
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index fab39f48fca..4d8987dbbf0 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -727,7 +727,7 @@ public:
// Members
// Adds member to guild. If rankId == GUILD_RANK_NONE, lowest rank is assigned.
bool AddMember(uint64 guid, uint8 rankId = GUILD_RANK_NONE);
- void DeleteMember(uint64 guid, bool isDisbanding = false, bool isKicked = false);
+ void DeleteMember(uint64 guid, bool isDisbanding = false, bool isKicked = false, bool canDeleteGuild = false);
bool ChangeMemberRank(uint64 guid, uint8 newRank);
// Bank
diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp
index 3fc4e839651..1fcc6ec4e6e 100644
--- a/src/server/game/Guilds/GuildMgr.cpp
+++ b/src/server/game/Guilds/GuildMgr.cpp
@@ -378,20 +378,13 @@ void GuildMgr::LoadGuilds()
TC_LOG_INFO(LOG_FILTER_GUILD, "Validating data of loaded guilds...");
{
uint32 oldMSTime = getMSTime();
- std::set<Guild*> rm; // temporary storage to avoid modifying GuildStore with RemoveGuild() while iterating
- for (GuildContainer::iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr)
+ for (GuildContainer::iterator itr = GuildStore.begin(); itr != GuildStore.end();)
{
Guild* guild = itr->second;
+ ++itr;
if (guild && !guild->Validate())
- rm.insert(guild);
- }
-
- for (std::set<Guild*>::iterator itr = rm.begin(); itr != rm.end(); ++itr)
- {
- Guild* guild = *itr;
- RemoveGuild(guild->GetId());
- delete guild;
+ delete guild;
}
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Validated data of loaded guilds in %u ms", GetMSTimeDiffToNow(oldMSTime));
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 6a7e6c5dedd..9e1dbc133a5 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -1918,7 +1918,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
PreparedQueryResult result = CharacterDatabase.Query(stmt);
if (result)
if (Guild* guild = sGuildMgr->GetGuildById((result->Fetch()[0]).GetUInt32()))
- guild->DeleteMember(MAKE_NEW_GUID(lowGuid, 0, HIGHGUID_PLAYER));
+ guild->DeleteMember(MAKE_NEW_GUID(lowGuid, 0, HIGHGUID_PLAYER), false, false, true);
}
if (!HasPermission(RBAC_PERM_TWO_SIDE_ADD_FRIEND))
diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp
index 32cd7ee4725..0badd503c17 100644
--- a/src/server/game/Handlers/PetHandler.cpp
+++ b/src/server/game/Handlers/PetHandler.cpp
@@ -630,7 +630,9 @@ void WorldSession::HandlePetRename(WorldPacket& recvData)
}
std::wstring wname;
- Utf8toWStr(name, wname);
+ if (!Utf8toWStr(name, wname))
+ return;
+
if (!ObjectMgr::CheckDeclinedNames(wname, declinedname))
{
SendPetNameInvalid(PET_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME, name, &declinedname);
diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp
index ed30b59f0ec..c902eb850f6 100644
--- a/src/server/game/Movement/PathGenerator.cpp
+++ b/src/server/game/Movement/PathGenerator.cpp
@@ -548,7 +548,9 @@ void PathGenerator::UpdateFilter()
NavTerrain PathGenerator::GetNavTerrain(float x, float y, float z)
{
LiquidData data;
- _sourceUnit->GetBaseMap()->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &data);
+ ZLiquidStatus liquidStatus = _sourceUnit->GetBaseMap()->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &data);
+ if (liquidStatus == LIQUID_MAP_NO_WATER)
+ return NAV_GROUND;
switch (data.type_flags)
{
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 3456041ddb2..31323a66ba9 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -59,6 +59,7 @@ void AddSC_event_commandscript();
void AddSC_gm_commandscript();
void AddSC_go_commandscript();
void AddSC_gobject_commandscript();
+void AddSC_group_commandscript();
void AddSC_guild_commandscript();
void AddSC_honor_commandscript();
void AddSC_instance_commandscript();
@@ -71,10 +72,12 @@ void AddSC_misc_commandscript();
void AddSC_mmaps_commandscript();
void AddSC_modify_commandscript();
void AddSC_npc_commandscript();
+void AddSC_pet_commandscript();
void AddSC_quest_commandscript();
void AddSC_rbac_commandscript();
void AddSC_reload_commandscript();
void AddSC_reset_commandscript();
+void AddSC_send_commandscript();
void AddSC_server_commandscript();
void AddSC_tele_commandscript();
void AddSC_ticket_commandscript();
@@ -740,6 +743,7 @@ void AddCommandScripts()
AddSC_gm_commandscript();
AddSC_go_commandscript();
AddSC_gobject_commandscript();
+ AddSC_group_commandscript();
AddSC_guild_commandscript();
AddSC_honor_commandscript();
AddSC_instance_commandscript();
@@ -753,9 +757,11 @@ void AddCommandScripts()
AddSC_modify_commandscript();
AddSC_npc_commandscript();
AddSC_quest_commandscript();
+ AddSC_pet_commandscript();
AddSC_rbac_commandscript();
AddSC_reload_commandscript();
AddSC_reset_commandscript();
+ AddSC_send_commandscript();
AddSC_server_commandscript();
AddSC_tele_commandscript();
AddSC_ticket_commandscript();
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 3d55d9de16f..4b73af1b681 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -1254,9 +1254,9 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
else
{
if (spellId)
- target->RemoveAurasDueToSpell(spellId);
+ target->RemoveOwnedAura(spellId, target->GetGUID());
if (spellId2)
- target->RemoveAurasDueToSpell(spellId2);
+ target->RemoveOwnedAura(spellId2, target->GetGUID());
// Improved Barkskin - apply/remove armor bonus due to shapeshift
if (Player* player=target->ToPlayer())
@@ -5113,7 +5113,7 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo
{
if (apply)
{
- Unit* caster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? GetCaster() : target;
+ Unit* caster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCaster() : target;
if (!caster)
return;
@@ -5125,13 +5125,13 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo
}
else
{
- uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? GetCasterGUID() : target->GetGUID();
+ uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCasterGUID() : target->GetGUID();
target->RemoveAura(triggeredSpellId, casterGUID, 0, aurApp->GetRemoveMode());
}
}
else if (mode & AURA_EFFECT_HANDLE_REAPPLY && apply)
{
- uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? GetCasterGUID() : target->GetGUID();
+ uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCasterGUID() : target->GetGUID();
// change the stack amount to be equal to stack amount of our aura
if (Aura* triggeredAura = target->GetAura(triggeredSpellId, casterGUID))
triggeredAura->ModStackAmount(GetBase()->GetStackAmount() - triggeredAura->GetStackAmount());
@@ -5733,7 +5733,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster)
if (triggeredSpellInfo)
{
- if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? caster : target)
+ if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target)
{
triggerCaster->CastSpell(target, triggeredSpellInfo, true, NULL, this);
TC_LOG_DEBUG(LOG_FILTER_SPELLS_AURAS, "AuraEffect::HandlePeriodicTriggerSpellAuraTick: Spell %u Trigger %u", GetId(), triggeredSpellInfo->Id);
@@ -5753,7 +5753,7 @@ void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit*
uint32 triggerSpellId = GetSpellInfo()->Effects[m_effIndex].TriggerSpell;
if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))
{
- if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? caster : target)
+ if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target)
{
int32 basepoints = GetAmount();
triggerCaster->CastCustomSpell(target, triggerSpellId, &basepoints, &basepoints, &basepoints, true, 0, this);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 91a5c35955a..a8d4c85656b 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -917,13 +917,13 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex)
SpellCastTargets targets;
if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET)
{
- if (!spellInfo->NeedsToBeTriggeredByCaster())
+ if (!spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo))
return;
targets.SetUnitTarget(unitTarget);
}
else //if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH)
{
- if (spellInfo->NeedsToBeTriggeredByCaster() && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK))
+ if (spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK))
return;
if (spellInfo->GetExplicitTargetMask() & TARGET_FLAG_DEST_LOCATION)
@@ -969,13 +969,13 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex)
SpellCastTargets targets;
if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET)
{
- if (!spellInfo->NeedsToBeTriggeredByCaster())
+ if (!spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo))
return;
targets.SetUnitTarget(unitTarget);
}
else //if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT)
{
- if (spellInfo->NeedsToBeTriggeredByCaster() && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK))
+ if (spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK))
return;
if (spellInfo->GetExplicitTargetMask() & TARGET_FLAG_DEST_LOCATION)
@@ -1133,29 +1133,6 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/)
if (!unitTarget || unitTarget->IsInFlight())
return;
- // Pre effects
- switch (m_spellInfo->Id)
- {
- case 66550: // teleports outside (Isle of Conquest)
- if (Player* target = unitTarget->ToPlayer())
- {
- if (target->GetTeamId() == TEAM_ALLIANCE)
- m_targets.SetDst(442.24f, -835.25f, 44.30f, 0.06f, 628);
- else
- m_targets.SetDst(1120.43f, -762.11f, 47.92f, 2.94f, 628);
- }
- break;
- case 66551: // teleports inside (Isle of Conquest)
- if (Player* target = unitTarget->ToPlayer())
- {
- if (target->GetTeamId() == TEAM_ALLIANCE)
- m_targets.SetDst(389.57f, -832.38f, 48.65f, 3.00f, 628);
- else
- m_targets.SetDst(1174.85f, -763.24f, 48.72f, 6.26f, 628);
- }
- break;
- }
-
// If not exist data for dest location - return
if (!m_targets.HasDst())
{
@@ -3902,15 +3879,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
npc->LoadEquipment();
return;
}
- // Emblazon Runeblade
- case 51770:
- {
- if (!m_originalCaster)
- return;
-
- m_originalCaster->CastSpell(m_originalCaster, damage, false);
- break;
- }
// Deathbolt from Thalgran Blightbringer
// reflected by Freya's Ward
// Retribution by Sevenfold Retribution
@@ -3985,26 +3953,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)
return;
}
- case 58941: // Rock Shards
- if (unitTarget && m_originalCaster)
- {
- for (uint32 i = 0; i < 3; ++i)
- {
- m_originalCaster->CastSpell(unitTarget, 58689, true);
- m_originalCaster->CastSpell(unitTarget, 58692, true);
- }
- if (((InstanceMap*)m_originalCaster->GetMap())->GetDifficulty() == REGULAR_DIFFICULTY)
- {
- m_originalCaster->CastSpell(unitTarget, 58695, true);
- m_originalCaster->CastSpell(unitTarget, 58696, true);
- }
- else
- {
- m_originalCaster->CastSpell(unitTarget, 60883, true);
- m_originalCaster->CastSpell(unitTarget, 60884, true);
- }
- }
- return;
case 58983: // Big Blizzard Bear
{
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
@@ -5656,7 +5604,7 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex)
// Blood Tap
if (m_spellInfo->Id == 45529 && count > 0)
{
- for (uint32 l = 0; l < MAX_RUNES && count > 0; ++l)
+ for (uint32 l = 0; l + 1 < MAX_RUNES && count > 0; ++l)
{
// Check if both runes are on cd as that is the only time when this needs to come into effect
if ((player->GetRuneCooldown(l) && player->GetCurrentRune(l) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)) && (player->GetRuneCooldown(l+1) && player->GetCurrentRune(l+1) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)))
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 04437b82f2d..a0e1ec065cc 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1004,14 +1004,12 @@ bool SpellInfo::NeedsExplicitUnitTarget() const
return GetExplicitTargetMask() & TARGET_FLAG_UNIT_MASK;
}
-bool SpellInfo::NeedsToBeTriggeredByCaster() const
+bool SpellInfo::NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) const
{
- if (AttributesCu & SPELL_ATTR0_CU_TRIGGERED_BY_CASTER)
- return true;
-
if (NeedsExplicitUnitTarget())
return true;
+ /*
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
if (Effects[i].IsEffect())
@@ -1021,6 +1019,23 @@ bool SpellInfo::NeedsToBeTriggeredByCaster() const
return true;
}
}
+ */
+
+ if (triggeringSpell->IsChanneled())
+ {
+ uint32 mask = 0;
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ {
+ if (Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetA.GetTarget() != TARGET_DEST_CASTER
+ && Effects[i].TargetB.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetB.GetTarget() != TARGET_DEST_CASTER)
+ {
+ mask |= Effects[i].GetProvidedTargetMask();
+ }
+ }
+
+ if (mask & TARGET_FLAG_UNIT_MASK)
+ return true;
+ }
return false;
}
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 6acde5afa74..c2ca938d26f 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -176,7 +176,6 @@ enum SpellCustomAttributes
SPELL_ATTR0_CU_CONE_LINE = 0x00000004,
SPELL_ATTR0_CU_SHARE_DAMAGE = 0x00000008,
SPELL_ATTR0_CU_NO_INITIAL_THREAT = 0x00000010,
- SPELL_ATTR0_CU_TRIGGERED_BY_CASTER = 0x00000020, // @todo: need generic solution, some triggered spells will be casted by target instead of caster
SPELL_ATTR0_CU_AURA_CC = 0x00000040,
SPELL_ATTR0_CU_DIRECT_DAMAGE = 0x00000100,
SPELL_ATTR0_CU_CHARGE = 0x00000200,
@@ -386,7 +385,7 @@ public:
bool IsAffectingArea() const;
bool IsTargetingArea() const;
bool NeedsExplicitUnitTarget() const;
- bool NeedsToBeTriggeredByCaster() const;
+ bool NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) const;
bool IsPassive() const;
bool IsAutocastable() const;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 5d471492553..29a869cf458 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2974,9 +2974,6 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
case 72293: // Mark of the Fallen Champion (Deathbringer Saurfang)
spellInfo->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF0;
break;
- case 38729: // Rod of Purification
- spellInfo->AttributesCu |= SPELL_ATTR0_CU_TRIGGERED_BY_CASTER;
- break;
default:
break;
}
@@ -3750,6 +3747,13 @@ void SpellMgr::LoadSpellInfoCorrections()
// Crashes client on pressing ESC
spellInfo->AttributesEx4 &= ~SPELL_ATTR4_TRIGGERED;
break;
+ // ISLE OF CONQUEST SPELLS
+ //
+ case 66551: // Teleport
+ spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); // 50000yd
+ break;
+ // ENDOF ISLE OF CONQUEST SPELLS
+ //
default:
break;
}
diff --git a/src/server/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp
index 38d64eedd5c..0457dc7e033 100644
--- a/src/server/game/Weather/Weather.cpp
+++ b/src/server/game/Weather/Weather.cpp
@@ -93,8 +93,9 @@ bool Weather::ReGenerate()
//78 days between January 1st and March 20nd; 365/4=91 days by season
// season source http://aa.usno.navy.mil/data/docs/EarthSeasons.html
time_t gtime = sWorld->GetGameTime();
- struct tm * ltime = localtime(&gtime);
- uint32 season = ((ltime->tm_yday - 78 + 365)/91)%4;
+ struct tm ltime;
+ ACE_OS::localtime_r(&gtime, &ltime);
+ uint32 season = ((ltime.tm_yday - 78 + 365)/91)%4;
static char const* seasonName[WEATHER_SEASONS] = { "spring", "summer", "fall", "winter" };
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index cf6ad3f9886..9e7b1f2f2b5 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1195,9 +1195,20 @@ void World::LoadConfigSettings(bool reload)
// Accountpassword Secruity
m_int_configs[CONFIG_ACC_PASSCHANGESEC] = sConfigMgr->GetIntDefault("Account.PasswordChangeSecurity", 0);
+ // Random Battleground Rewards
+ m_int_configs[CONFIG_BG_REWARD_WINNER_HONOR_FIRST] = sConfigMgr->GetIntDefault("Battleground.RewardWinnerHonorFirst", 30);
+ m_int_configs[CONFIG_BG_REWARD_WINNER_ARENA_FIRST] = sConfigMgr->GetIntDefault("Battleground.RewardWinnerArenaFirst", 25);
+ m_int_configs[CONFIG_BG_REWARD_WINNER_HONOR_LAST] = sConfigMgr->GetIntDefault("Battleground.RewardWinnerHonorLast", 15);
+ m_int_configs[CONFIG_BG_REWARD_WINNER_ARENA_LAST] = sConfigMgr->GetIntDefault("Battleground.RewardWinnerArenaLast", 0);
+ m_int_configs[CONFIG_BG_REWARD_LOSER_HONOR_FIRST] = sConfigMgr->GetIntDefault("Battleground.RewardLoserHonorFirst", 5);
+ m_int_configs[CONFIG_BG_REWARD_LOSER_HONOR_LAST] = sConfigMgr->GetIntDefault("Battleground.RewardLoserHonorLast", 5);
+
// Max instances per hour
m_int_configs[CONFIG_MAX_INSTANCES_PER_HOUR] = sConfigMgr->GetIntDefault("AccountInstancesPerHour", 5);
+ // Anounce reset of instance to whole party
+ m_bool_configs[CONFIG_INSTANCES_RESET_ANNOUNCE] = sConfigMgr->GetBoolDefault("InstancesResetAnnounce", false);
+
// AutoBroadcast
m_bool_configs[CONFIG_AUTOBROADCAST] = sConfigMgr->GetBoolDefault("AutoBroadcast.On", false);
m_int_configs[CONFIG_AUTOBROADCAST_CENTER] = sConfigMgr->GetIntDefault("AutoBroadcast.Center", 0);
@@ -1730,7 +1741,9 @@ void World::SetInitialWorldSettings()
//mailtimer is increased when updating auctions
//one second is 1000 -(tested on win system)
/// @todo Get rid of magic numbers
- mail_timer = ((((localtime(&m_gameTime)->tm_hour + 20) % 24)* HOUR * IN_MILLISECONDS) / m_timers[WUPDATE_AUCTIONS].GetInterval());
+ tm localTm;
+ ACE_OS::localtime_r(&m_gameTime, &localTm);
+ mail_timer = ((((localTm.tm_hour + 20) % 24)* HOUR * IN_MILLISECONDS) / m_timers[WUPDATE_AUCTIONS].GetInterval());
//1440
mail_timer_expires = ((DAY * IN_MILLISECONDS) / (m_timers[WUPDATE_AUCTIONS].GetInterval()));
TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, "Mail timer set to: " UI64FMTD ", mail return is called every " UI64FMTD " minutes", uint64(mail_timer), uint64(mail_timer_expires));
@@ -2769,7 +2782,8 @@ void World::InitDailyQuestResetTime()
// client built-in time for reset is 6:00 AM
// FIX ME: client not show day start time
time_t curTime = time(NULL);
- tm localTm = *localtime(&curTime);
+ tm localTm;
+ ACE_OS::localtime_r(&curTime, &localTm);
localTm.tm_hour = 6;
localTm.tm_min = 0;
localTm.tm_sec = 0;
@@ -2802,7 +2816,8 @@ void World::InitRandomBGResetTime()
// generate time by config
time_t curTime = time(NULL);
- tm localTm = *localtime(&curTime);
+ tm localTm;
+ ACE_OS::localtime_r(&curTime, &localTm);
localTm.tm_hour = getIntConfig(CONFIG_RANDOM_BG_RESET_HOUR);
localTm.tm_min = 0;
localTm.tm_sec = 0;
@@ -2829,7 +2844,8 @@ void World::InitGuildResetTime()
// generate time by config
time_t curTime = time(NULL);
- tm localTm = *localtime(&curTime);
+ tm localTm;
+ ACE_OS::localtime_r(&curTime, &localTm);
localTm.tm_hour = getIntConfig(CONFIG_GUILD_RESET_HOUR);
localTm.tm_min = 0;
localTm.tm_sec = 0;
@@ -2913,7 +2929,8 @@ void World::ResetMonthlyQuests()
// generate time
time_t curTime = time(NULL);
- tm localTm = *localtime(&curTime);
+ tm localTm;
+ ACE_OS::localtime_r(&curTime, &localTm);
int month = localTm.tm_mon;
int year = localTm.tm_year;
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 907491437c4..9435fa8aa94 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -160,6 +160,7 @@ enum WorldBoolConfigs
CONFIG_UI_QUESTLEVELS_IN_DIALOGS, // Should we add quest levels to the title in the NPC dialogs?
CONFIG_EVENT_ANNOUNCE,
CONFIG_STATS_LIMITS_ENABLE,
+ CONFIG_INSTANCES_RESET_ANNOUNCE,
BOOL_CONFIG_VALUE_COUNT
};
@@ -330,6 +331,12 @@ enum WorldIntConfigs
CONFIG_PACKET_SPOOF_BANMODE,
CONFIG_PACKET_SPOOF_BANDURATION,
CONFIG_ACC_PASSCHANGESEC,
+ CONFIG_BG_REWARD_WINNER_HONOR_FIRST,
+ CONFIG_BG_REWARD_WINNER_ARENA_FIRST,
+ CONFIG_BG_REWARD_WINNER_HONOR_LAST,
+ CONFIG_BG_REWARD_WINNER_ARENA_LAST,
+ CONFIG_BG_REWARD_LOSER_HONOR_FIRST,
+ CONFIG_BG_REWARD_LOSER_HONOR_LAST,
INT_CONFIG_VALUE_COUNT
};
diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt
index ce31fa1f4d3..c38789ed90a 100644
--- a/src/server/scripts/Commands/CMakeLists.txt
+++ b/src/server/scripts/Commands/CMakeLists.txt
@@ -8,109 +8,11 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+file(GLOB_RECURSE sources_Commands Commands/*.cpp Commands/*.h)
+
set(scripts_STAT_SRCS
${scripts_STAT_SRCS}
- Commands/cs_account.cpp
- Commands/cs_achievement.cpp
- Commands/cs_arena.cpp
- Commands/cs_ban.cpp
- Commands/cs_bf.cpp
- Commands/cs_cast.cpp
- Commands/cs_character.cpp
- Commands/cs_cheat.cpp
- Commands/cs_debug.cpp
- Commands/cs_deserter.cpp
- Commands/cs_disable.cpp
- Commands/cs_event.cpp
- Commands/cs_gm.cpp
- Commands/cs_go.cpp
- Commands/cs_gobject.cpp
- Commands/cs_guild.cpp
- Commands/cs_honor.cpp
- Commands/cs_instance.cpp
- Commands/cs_learn.cpp
- Commands/cs_lfg.cpp
- Commands/cs_list.cpp
- Commands/cs_lookup.cpp
- Commands/cs_message.cpp
- Commands/cs_misc.cpp
- Commands/cs_modify.cpp
- Commands/cs_npc.cpp
- Commands/cs_quest.cpp
- Commands/cs_rbac.cpp
- Commands/cs_reload.cpp
- Commands/cs_reset.cpp
- Commands/cs_tele.cpp
- Commands/cs_ticket.cpp
- Commands/cs_server.cpp
- Commands/cs_titles.cpp
- Commands/cs_wp.cpp
- Commands/cs_mmaps.cpp
-# Commands/cs_pdump.cpp
-# Commands/cs_channel.cpp
-# Commands/cs_pet.cpp
-# Commands/cs_aura.cpp
-# Commands/cs_unaura.cpp
-# Commands/cs_nameannounce.cpp
-# Commands/cs_gmnameannounce.cpp
-# Commands/cs_announce.cpp
-# Commands/cs_gmannounce.cpp
-# Commands/cs_notify.cpp
-# Commands/cs_gmnotify.cpp
-# Commands/cs_appear.cpp
-# Commands/cs_summon.cpp
-# Commands/cs_groupsummon.cpp
-# Commands/cs_commands.cpp
-# Commands/cs_demorph.cpp
-# Commands/cs_die.cpp
-# Commands/cs_revive.cpp
-# Commands/cs_dismount.cpp
-# Commands/cs_guid.cpp
-# Commands/cs_help.cpp
-# Commands/cs_itemmove.cpp
-# Commands/cs_cooldown.cpp
-# Commands/cs_unlearn.cpp
-# Commands/cs_distance.cpp
-# Commands/cs_recall.cpp
-# Commands/cs_save.cpp
-# Commands/cs_saveall.cpp
-# Commands/cs_kick.cpp
-# Commands/cs_start.cpp
-# Commands/cs_taxicheat.cpp
-# Commands/cs_linkgrave.cpp
-# Commands/cs_neargrave.cpp
-# Commands/cs_explorecheat.cpp
-# Commands/cs_hover.cpp
-# Commands/cs_levelup.cpp
-# Commands/cs_showarea.cpp
-# Commands/cs_hidearea.cpp
-# Commands/cs_additem.cpp
-# Commands/cs_additemset.cpp
-# Commands/cs_bank.cpp
-# Commands/cs_wchange.cpp
-# Commands/cs_maxskill.cpp
-# Commands/cs_setskill.cpp
-# Commands/cs_whispers.cpp
-# Commands/cs_pinfo.cpp
-# Commands/cs_respawn.cpp
-# Commands/cs_send.cpp
-# Commands/cs_mute.cpp
-# Commands/cs_unmute.cpp
-# Commands/cs_movegens.cpp
-# Commands/cs_cometome.cpp
-# Commands/cs_damage.cpp
-# Commands/cs_combatstop.cpp
-# Commands/cs_flusharenapoints.cpp
-# Commands/cs_repairitems.cpp
-# Commands/cs_waterwalk.cpp
-# Commands/cs_freeze.cpp
-# Commands/cs_unfreeze.cpp
-# Commands/cs_listfreeze.cpp
-# Commands/cs_possess.cpp
-# Commands/cs_unpossess.cpp
-# Commands/cs_bindsight.cpp
-# Commands/cs_unbindsight.cpp
-# Commands/cs_playall.cpp
+ ${sources_Commands}
)
message(" -> Prepared: Commands")
diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp
index ada26e69c14..f0d27104035 100644
--- a/src/server/scripts/Commands/cs_account.cpp
+++ b/src/server/scripts/Commands/cs_account.cpp
@@ -362,9 +362,9 @@ public:
return false;
}
- char* oldEmail = strtok(NULL, " ");
+ char* oldEmail = strtok((char*)args, " ");
char* password = strtok(NULL, " ");
- char* email = strtok((char*)args, " ");
+ char* email = strtok(NULL, " ");
char* emailConfirmation = strtok(NULL, " ");
if (!oldEmail || !password || !email || !emailConfirmation)
@@ -438,6 +438,7 @@ public:
static bool HandleAccountPasswordCommand(ChatHandler* handler, char const* args)
{
+ // If no args are given at all, we can return false right away.
if (!*args)
{
handler->SendSysMessage(LANG_CMD_SYNTAX);
@@ -445,13 +446,18 @@ public:
return false;
}
+ // First, we check config. What security type (sec type) is it ? Depending on it, the command branches out
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, " ");
+ // Command is supposed to be: .account password [$oldpassword] [$newpassword] [$newpasswordconfirmation] [$emailconfirmation]
+ char* oldPassword = strtok((char*)args, " "); // This extracts [$oldpassword]
+ char* newPassword = strtok(NULL, " "); // This extracts [$newpassword]
+ char* passwordConfirmation = strtok(NULL, " "); // This extracts [$newpasswordconfirmation]
+ const char* emailConfirmation; // This defines the emailConfirmation variable, which is optional depending on sec type.
+ if (!(emailConfirmation = strtok(NULL, " "))) // This extracts [$emailconfirmation]. If it doesn't exist, however...
+ emailConfirmation = ""; // ... it's simply "" for emailConfirmation.
+ //Is any of those variables missing for any reason ? We return false.
if (!oldPassword || !newPassword || !passwordConfirmation)
{
handler->SendSysMessage(LANG_CMD_SYNTAX);
@@ -459,16 +465,7 @@ 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");
- }
-
+ // We compare the old, saved password to the entered old password - no chance for the unauthorized.
if (!AccountMgr::CheckPassword(handler->GetSession()->GetAccountId(), std::string(oldPassword)))
{
handler->SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD);
@@ -479,8 +476,9 @@ public:
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)))
+ // This compares the old, current email to the entered email - however, only...
+ if ((pwConfig == PW_EMAIL || (pwConfig == PW_RBAC && handler->HasPermission(RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE))) // ...if either PW_EMAIL or PW_RBAC with the Permission is active...
+ && !AccountMgr::CheckEmail(handler->GetSession()->GetAccountId(), std::string(emailConfirmation))) // ... and returns false if the comparison fails.
{
handler->SendSysMessage(LANG_COMMAND_WRONGEMAIL);
handler->SetSentErrorMessage(true);
@@ -488,8 +486,10 @@ public:
handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),
emailConfirmation);
+ return false;
}
+ // Making sure that newly entered password is correctly entered.
if (strcmp(newPassword, passwordConfirmation) != 0)
{
handler->SendSysMessage(LANG_NEW_PASSWORDS_NOT_MATCH);
@@ -497,6 +497,7 @@ public:
return false;
}
+ // Changes password and prints result.
AccountOpResult result = AccountMgr::ChangePassword(handler->GetSession()->GetAccountId(), std::string(newPassword));
switch (result)
{
diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp
index b12e058a78f..dd6e104f135 100644
--- a/src/server/scripts/Commands/cs_ban.cpp
+++ b/src/server/scripts/Commands/cs_ban.cpp
@@ -436,21 +436,23 @@ public:
do
{
time_t timeBan = time_t(fields2[0].GetUInt32());
- tm* tmBan = localtime(&timeBan);
+ tm tmBan;
+ ACE_OS::localtime_r(&timeBan, &tmBan);
if (fields2[0].GetUInt32() == fields2[1].GetUInt32())
{
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
- accountName.c_str(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
+ accountName.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
fields2[2].GetCString(), fields2[3].GetCString());
}
else
{
time_t timeUnban = time_t(fields2[1].GetUInt32());
- tm* tmUnban = localtime(&timeUnban);
+ tm tmUnban;
+ ACE_OS::localtime_r(&timeUnban, &tmUnban);
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
- accountName.c_str(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
- tmUnban->tm_year%100, tmUnban->tm_mon+1, tmUnban->tm_mday, tmUnban->tm_hour, tmUnban->tm_min,
+ accountName.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
+ tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min,
fields2[2].GetCString(), fields2[3].GetCString());
}
}
@@ -523,21 +525,23 @@ public:
do
{
time_t timeBan = time_t(banFields[0].GetUInt32());
- tm* tmBan = localtime(&timeBan);
+ tm tmBan;
+ ACE_OS::localtime_r(&timeBan, &tmBan);
if (banFields[0].GetUInt32() == banFields[1].GetUInt32())
{
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
- char_name.c_str(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
+ char_name.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
banFields[2].GetCString(), banFields[3].GetCString());
}
else
{
time_t timeUnban = time_t(banFields[1].GetUInt32());
- tm* tmUnban = localtime(&timeUnban);
+ tm tmUnban;
+ ACE_OS::localtime_r(&timeUnban, &tmUnban);
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
- char_name.c_str(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
- tmUnban->tm_year%100, tmUnban->tm_mon+1, tmUnban->tm_mday, tmUnban->tm_hour, tmUnban->tm_min,
+ char_name.c_str(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
+ tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min,
banFields[2].GetCString(), banFields[3].GetCString());
}
}
@@ -602,20 +606,22 @@ public:
handler->SendSysMessage("-------------------------------------------------------------------------------");
Field* fields = result->Fetch();
time_t timeBan = time_t(fields[1].GetUInt32());
- tm* tmBan = localtime(&timeBan);
+ tm tmBan;
+ ACE_OS::localtime_r(&timeBan, &tmBan);
if (fields[1].GetUInt32() == fields[2].GetUInt32())
{
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
- fields[0].GetCString(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
+ fields[0].GetCString(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
fields[3].GetCString(), fields[4].GetCString());
}
else
{
time_t timeUnban = time_t(fields[2].GetUInt32());
- tm* tmUnban = localtime(&timeUnban);
+ tm tmUnban;
+ ACE_OS::localtime_r(&timeUnban, &tmUnban);
handler->PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
- fields[0].GetCString(), tmBan->tm_year%100, tmBan->tm_mon+1, tmBan->tm_mday, tmBan->tm_hour, tmBan->tm_min,
- tmUnban->tm_year%100, tmUnban->tm_mon+1, tmUnban->tm_mday, tmUnban->tm_hour, tmUnban->tm_min,
+ fields[0].GetCString(), tmBan.tm_year%100, tmBan.tm_mon+1, tmBan.tm_mday, tmBan.tm_hour, tmBan.tm_min,
+ tmUnban.tm_year%100, tmUnban.tm_mon+1, tmUnban.tm_mday, tmUnban.tm_hour, tmUnban.tm_min,
fields[3].GetCString(), fields[4].GetCString());
}
}
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index df80ba3c797..c13e9d08172 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -264,7 +264,7 @@ public:
unit = player;
std::ifstream ifs("opcode.txt");
- if (ifs.bad())
+ if (ifs.fail())
return false;
// remove comments from file
diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp
new file mode 100644
index 00000000000..784ff216c41
--- /dev/null
+++ b/src/server/scripts/Commands/cs_group.cpp
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Chat.h"
+#include "Language.h"
+#include "LFG.h"
+#include "Player.h"
+#include "ObjectMgr.h"
+#include "GroupMgr.h"
+#include "ScriptMgr.h"
+
+class group_commandscript : public CommandScript
+{
+public:
+ group_commandscript() : CommandScript("group_commandscript") { }
+
+ ChatCommand* GetCommands() const OVERRIDE
+ {
+ static ChatCommand groupCommandTable[] =
+ {
+ { "leader", RBAC_PERM_COMMAND_GROUP_LEADER, false, &HandleGroupLeaderCommand, "", NULL },
+ { "disband", RBAC_PERM_COMMAND_GROUP_DISBAND, false, &HandleGroupDisbandCommand, "", NULL },
+ { "remove", RBAC_PERM_COMMAND_GROUP_REMOVE, false, &HandleGroupRemoveCommand, "", NULL },
+ { "join", RBAC_PERM_COMMAND_GROUP_JOIN, false, &HandleGroupJoinCommand, "", NULL },
+ { "list", RBAC_PERM_COMMAND_GROUP_LIST, false, &HandleGroupListCommand, "", NULL },
+ { "summon", RBAC_PERM_COMMAND_GROUP_SUMMON, false, &HandleGroupSummonCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "group", RBAC_PERM_COMMAND_GROUP, false, NULL, "", groupCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ // Summon group of player
+ static bool HandleGroupSummonCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target;
+ if (!handler->extractPlayerTarget((char*)args, &target))
+ return false;
+
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ Group* group = target->GetGroup();
+
+ std::string nameLink = handler->GetNameLink(target);
+
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Player* gmPlayer = handler->GetSession()->GetPlayer();
+ Group* gmGroup = gmPlayer->GetGroup();
+ Map* gmMap = gmPlayer->GetMap();
+ bool toInstance = gmMap->Instanceable();
+
+ // we are in instance, and can summon only player in our group with us as lead
+ if (toInstance && (
+ !gmGroup || group->GetLeaderGUID() != gmPlayer->GetGUID() ||
+ gmGroup->GetLeaderGUID() != gmPlayer->GetGUID()))
+ // the last check is a bit excessive, but let it be, just in case
+ {
+ handler->SendSysMessage(LANG_CANNOT_SUMMON_TO_INST);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
+ {
+ Player* player = itr->GetSource();
+
+ if (!player || player == gmPlayer || !player->GetSession())
+ continue;
+
+ // check online security
+ if (handler->HasLowerSecurity(player, 0))
+ return false;
+
+ std::string plNameLink = handler->GetNameLink(player);
+
+ if (player->IsBeingTeleported())
+ {
+ handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (toInstance)
+ {
+ Map* playerMap = player->GetMap();
+
+ if (playerMap->Instanceable() && playerMap->GetInstanceId() != gmMap->GetInstanceId())
+ {
+ // cannot summon from instance to instance
+ handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, plNameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ handler->PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), "");
+ if (handler->needReportToTarget(player))
+ ChatHandler(player->GetSession()).PSendSysMessage(LANG_SUMMONED_BY, handler->GetNameLink().c_str());
+
+ // stop flight if need
+ if (player->IsInFlight())
+ {
+ player->GetMotionMaster()->MovementExpired();
+ player->CleanupAfterTaxiFlight();
+ }
+ // save only in non-flight case
+ else
+ player->SaveRecallPosition();
+
+ // before GM
+ float x, y, z;
+ gmPlayer->GetClosePoint(x, y, z, player->GetObjectSize());
+ player->TeleportTo(gmPlayer->GetMapId(), x, y, z, player->GetOrientation());
+ }
+
+ return true;
+ }
+
+ static bool HandleGroupLeaderCommand(ChatHandler* handler, char const* args)
+ {
+ Player* player = NULL;
+ Group* group = NULL;
+ uint64 guid = 0;
+ char* nameStr = strtok((char*)args, " ");
+
+ if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
+ return false;
+
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (group->GetLeaderGUID() != guid)
+ {
+ group->ChangeLeader(guid);
+ group->SendUpdate();
+ }
+
+ return true;
+ }
+
+ static bool HandleGroupDisbandCommand(ChatHandler* handler, char const* args)
+ {
+ Player* player = NULL;
+ Group* group = NULL;
+ uint64 guid = 0;
+ char* nameStr = strtok((char*)args, " ");
+
+ if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
+ return false;
+
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ group->Disband();
+ return true;
+ }
+
+ static bool HandleGroupRemoveCommand(ChatHandler* handler, char const* args)
+ {
+ Player* player = NULL;
+ Group* group = NULL;
+ uint64 guid = 0;
+ char* nameStr = strtok((char*)args, " ");
+
+ if (!handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
+ return false;
+
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, player->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ group->RemoveMember(guid);
+ return true;
+ }
+
+ static bool HandleGroupJoinCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* playerSource = NULL;
+ Player* playerTarget = NULL;
+ Group* groupSource = NULL;
+ Group* groupTarget = NULL;
+ uint64 guidSource = 0;
+ uint64 guidTarget = 0;
+ char* nameplgrStr = strtok((char*)args, " ");
+ char* nameplStr = strtok(NULL, " ");
+
+ if (!handler->GetPlayerGroupAndGUIDByName(nameplgrStr, playerSource, groupSource, guidSource, true))
+ return false;
+
+ if (!groupSource)
+ {
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, playerSource->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!handler->GetPlayerGroupAndGUIDByName(nameplStr, playerTarget, groupTarget, guidTarget, true))
+ return false;
+
+ if (groupTarget || playerTarget->GetGroup() == groupSource)
+ {
+ handler->PSendSysMessage(LANG_GROUP_ALREADY_IN_GROUP, playerTarget->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!groupSource->IsFull())
+ {
+ handler->PSendSysMessage(LANG_GROUP_FULL);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ groupSource->AddMember(playerTarget);
+ groupSource->BroadcastGroupUpdate();
+ handler->PSendSysMessage(LANG_GROUP_PLAYER_JOINED, playerTarget->GetName().c_str(), playerSource->GetName().c_str());
+ return true;
+ }
+
+ static bool HandleGroupListCommand(ChatHandler* handler, char const* args)
+ {
+ Player* playerTarget;
+ uint64 guidTarget;
+ std::string nameTarget;
+
+ uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
+
+ if (sObjectMgr->GetPlayerNameByGUID(parseGUID, nameTarget))
+ {
+ playerTarget = sObjectMgr->GetPlayerByLowGUID(parseGUID);
+ guidTarget = parseGUID;
+ }
+ else if (!handler->extractPlayerTarget((char*)args, &playerTarget, &guidTarget, &nameTarget))
+ return false;
+
+ Group* groupTarget = NULL;
+ if (playerTarget)
+ groupTarget = playerTarget->GetGroup();
+
+ if (!groupTarget)
+ {
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER);
+ stmt->setUInt32(0, guidTarget);
+ PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt);
+ if (resultGroup)
+ groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32());
+ }
+
+ if (!groupTarget)
+ {
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, nameTarget.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "raid" : "party"));
+ Group::MemberSlotList const& members = groupTarget->GetMemberSlots();
+ for (Group::MemberSlotList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
+ {
+ Group::MemberSlot const& slot = *itr;
+
+ std::string flags;
+ if (slot.flags & MEMBER_FLAG_ASSISTANT)
+ flags = "Assistant";
+
+ if (slot.flags & MEMBER_FLAG_MAINTANK)
+ {
+ if (!flags.empty())
+ flags.append(", ");
+ flags.append("MainTank");
+ }
+
+ if (slot.flags & MEMBER_FLAG_MAINASSIST)
+ {
+ if (!flags.empty())
+ flags.append(", ");
+ flags.append("MainAssist");
+ }
+
+ if (flags.empty())
+ flags = "None";
+
+ Player* p = ObjectAccessor::FindPlayer((*itr).guid);
+ const char* onlineState = (p && p->IsInWorld()) ? "online" : "offline";
+
+ handler->PSendSysMessage(LANG_GROUP_PLAYER_NAME_GUID, slot.name.c_str(), onlineState,
+ GUID_LOPART(slot.guid), flags.c_str(), lfg::GetRolesString(slot.roles).c_str());
+ }
+
+ return true;
+ }
+};
+
+void AddSC_group_commandscript()
+{
+ new group_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp
index 0af0da10846..040c68dbacb 100644
--- a/src/server/scripts/Commands/cs_guild.cpp
+++ b/src/server/scripts/Commands/cs_guild.cpp
@@ -118,6 +118,7 @@ public:
return false;
targetGuild->Disband();
+ delete targetGuild;
return true;
}
@@ -164,7 +165,7 @@ public:
if (!targetGuild)
return false;
- targetGuild->DeleteMember(targetGuid, false, true);
+ targetGuild->DeleteMember(targetGuid, false, true, true);
return true;
}
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 9c29e31af96..96244c19036 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -44,85 +44,57 @@ public:
ChatCommand* GetCommands() const OVERRIDE
{
- static ChatCommand groupCommandTable[] =
- {
- { "leader", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGroupLeaderCommand, "", NULL },
- { "disband", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGroupDisbandCommand, "", NULL },
- { "remove", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGroupRemoveCommand, "", NULL },
- { "join", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGroupJoinCommand, "", NULL },
- { "list", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGroupListCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
- };
- static ChatCommand petCommandTable[] =
- {
- { "create", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleCreatePetCommand, "", NULL },
- { "learn", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandlePetLearnCommand, "", NULL },
- { "unlearn", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandlePetUnlearnCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
- };
- static ChatCommand sendCommandTable[] =
- {
- { "items", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleSendItemsCommand, "", NULL },
- { "mail", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleSendMailCommand, "", NULL },
- { "message", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleSendMessageCommand, "", NULL },
- { "money", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleSendMoneyCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
- };
static ChatCommand commandTable[] =
{
- { "dev", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDevCommand, "", NULL },
- { "gps", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGPSCommand, "", NULL },
- { "aura", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleAuraCommand, "", NULL },
- { "unaura", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleUnAuraCommand, "", NULL },
- { "appear", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleAppearCommand, "", NULL },
- { "summon", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleSummonCommand, "", NULL },
- { "groupsummon", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleGroupSummonCommand, "", NULL },
- { "commands", RBAC_PERM_PLAYER_COMMANDS, true, &HandleCommandsCommand, "", NULL },
- { "die", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDieCommand, "", NULL },
- { "revive", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReviveCommand, "", NULL },
- { "dismount", RBAC_PERM_PLAYER_COMMANDS, false, &HandleDismountCommand, "", NULL },
- { "guid", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleGUIDCommand, "", NULL },
- { "help", RBAC_PERM_PLAYER_COMMANDS, true, &HandleHelpCommand, "", NULL },
- { "itemmove", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleItemMoveCommand, "", NULL },
- { "cooldown", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleCooldownCommand, "", NULL },
- { "distance", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleGetDistanceCommand, "", NULL },
- { "recall", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleRecallCommand, "", NULL },
- { "save", RBAC_PERM_PLAYER_COMMANDS, false, &HandleSaveCommand, "", NULL },
- { "saveall", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleSaveAllCommand, "", NULL },
- { "kick", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleKickPlayerCommand, "", NULL },
- { "unstuck", RBAC_PERM_PLAYER_COMMANDS, true, &HandleUnstuckCommand, "", NULL },
- { "linkgrave", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleLinkGraveCommand, "", NULL },
- { "neargrave", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleNearGraveCommand, "", NULL },
- { "showarea", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleShowAreaCommand, "", NULL },
- { "hidearea", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleHideAreaCommand, "", NULL },
- { "additem", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleAddItemCommand, "", NULL },
- { "additemset", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleAddItemSetCommand, "", NULL },
- { "bank", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleBankCommand, "", NULL },
- { "wchange", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleChangeWeather, "", NULL },
- { "maxskill", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleMaxSkillCommand, "", NULL },
- { "setskill", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleSetSkillCommand, "", NULL },
- { "pinfo", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandlePInfoCommand, "", NULL },
- { "respawn", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleRespawnCommand, "", NULL },
- { "send", RBAC_PERM_MODERATOR_COMMANDS, true, NULL, "", sendCommandTable },
- { "pet", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", petCommandTable },
- { "mute", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleMuteCommand, "", NULL },
- { "unmute", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleUnmuteCommand, "", NULL },
- { "movegens", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleMovegensCommand, "", NULL },
- { "cometome", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleComeToMeCommand, "", NULL },
- { "damage", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleDamageCommand, "", NULL },
- { "combatstop", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleCombatStopCommand, "", NULL },
- { "flusharenapoints", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleFlushArenaPointsCommand, "", NULL },
- { "repairitems", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleRepairitemsCommand, "", NULL },
- { "freeze", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleFreezeCommand, "", NULL },
- { "unfreeze", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleUnFreezeCommand, "", NULL },
- { "listfreeze", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleListFreezeCommand, "", NULL },
- { "group", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", groupCommandTable },
- { "possess", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, HandlePossessCommand, "", NULL },
- { "unpossess", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, HandleUnPossessCommand, "", NULL },
- { "bindsight", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, HandleBindSightCommand, "", NULL },
- { "unbindsight", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, HandleUnbindSightCommand, "", NULL },
- { "playall", RBAC_PERM_GAMEMASTER_COMMANDS, false, HandlePlayAllCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "additem", RBAC_PERM_COMMAND_ADDITEM, false, &HandleAddItemCommand, "", NULL },
+ { "additemset", RBAC_PERM_COMMAND_ADDITEMSET, false, &HandleAddItemSetCommand, "", NULL },
+ { "appear", RBAC_PERM_COMMAND_APPEAR, false, &HandleAppearCommand, "", NULL },
+ { "aura", RBAC_PERM_COMMAND_AURA, false, &HandleAuraCommand, "", NULL },
+ { "bank", RBAC_PERM_COMMAND_BANK, false, &HandleBankCommand, "", NULL },
+ { "bindsight", RBAC_PERM_COMMAND_BINDSIGHT, false, &HandleBindSightCommand, "", NULL },
+ { "combatstop", RBAC_PERM_COMMAND_COMBATSTOP, true, &HandleCombatStopCommand, "", NULL },
+ { "cometome", RBAC_PERM_COMMAND_COMETOME, false, &HandleComeToMeCommand, "", NULL },
+ { "commands", RBAC_PERM_COMMAND_COMMANDS, true, &HandleCommandsCommand, "", NULL },
+ { "cooldown", RBAC_PERM_COMMAND_COOLDOWN, false, &HandleCooldownCommand, "", NULL },
+ { "damage", RBAC_PERM_COMMAND_DAMAGE, false, &HandleDamageCommand, "", NULL },
+ { "dev", RBAC_PERM_COMMAND_DEV, false, &HandleDevCommand, "", NULL },
+ { "die", RBAC_PERM_COMMAND_DIE, false, &HandleDieCommand, "", NULL },
+ { "dismount", RBAC_PERM_COMMAND_DISMOUNT, false, &HandleDismountCommand, "", NULL },
+ { "distance", RBAC_PERM_COMMAND_DISTANCE, false, &HandleGetDistanceCommand, "", NULL },
+ { "flusharenapoints", RBAC_PERM_COMMAND_FLUSHARENAPOINTS, false, &HandleFlushArenaPointsCommand, "", NULL },
+ { "freeze", RBAC_PERM_COMMAND_FREEZE, false, &HandleFreezeCommand, "", NULL },
+ { "gps", RBAC_PERM_COMMAND_GPS, false, &HandleGPSCommand, "", NULL },
+ { "guid", RBAC_PERM_COMMAND_GUID, false, &HandleGUIDCommand, "", NULL },
+ { "help", RBAC_PERM_COMMAND_HELP, true, &HandleHelpCommand, "", NULL },
+ { "hidearea", RBAC_PERM_COMMAND_HIDEAREA, false, &HandleHideAreaCommand, "", NULL },
+ { "itemmove", RBAC_PERM_COMMAND_ITEMMOVE, false, &HandleItemMoveCommand, "", NULL },
+ { "kick", RBAC_PERM_COMMAND_KICK, true, &HandleKickPlayerCommand, "", NULL },
+ { "linkgrave", RBAC_PERM_COMMAND_LINKGRAVE, false, &HandleLinkGraveCommand, "", NULL },
+ { "listfreeze", RBAC_PERM_COMMAND_LISTFREEZE, false, &HandleListFreezeCommand, "", NULL },
+ { "maxskill", RBAC_PERM_COMMAND_MAXSKILL, false, &HandleMaxSkillCommand, "", NULL },
+ { "movegens", RBAC_PERM_COMMAND_MOVEGENS, false, &HandleMovegensCommand, "", NULL },
+ { "mute", RBAC_PERM_COMMAND_MUTE, true, &HandleMuteCommand, "", NULL },
+ { "neargrave", RBAC_PERM_COMMAND_NEARGRAVE, false, &HandleNearGraveCommand, "", NULL },
+ { "pinfo", RBAC_PERM_COMMAND_PINFO, true, &HandlePInfoCommand, "", NULL },
+ { "playall", RBAC_PERM_COMMAND_PLAYALL, false, &HandlePlayAllCommand, "", NULL },
+ { "possess", RBAC_PERM_COMMAND_POSSESS, false, &HandlePossessCommand, "", NULL },
+ { "recall", RBAC_PERM_COMMAND_RECALL, false, &HandleRecallCommand, "", NULL },
+ { "repairitems", RBAC_PERM_COMMAND_REPAIRITEMS, true, &HandleRepairitemsCommand, "", NULL },
+ { "respawn", RBAC_PERM_COMMAND_RESPAWN, false, &HandleRespawnCommand, "", NULL },
+ { "revive", RBAC_PERM_COMMAND_REVIVE, true, &HandleReviveCommand, "", NULL },
+ { "saveall", RBAC_PERM_COMMAND_SAVEALL, true, &HandleSaveAllCommand, "", NULL },
+ { "save", RBAC_PERM_COMMAND_SAVE, false, &HandleSaveCommand, "", NULL },
+ { "setskill", RBAC_PERM_COMMAND_SETSKILL, false, &HandleSetSkillCommand, "", NULL },
+ { "showarea", RBAC_PERM_COMMAND_SHOWAREA, false, &HandleShowAreaCommand, "", NULL },
+ { "summon", RBAC_PERM_COMMAND_SUMMON, false, &HandleSummonCommand, "", NULL },
+ { "unaura", RBAC_PERM_COMMAND_UNAURA, false, &HandleUnAuraCommand, "", NULL },
+ { "unbindsight", RBAC_PERM_COMMAND_UNBINDSIGHT, false, HandleUnbindSightCommand, "", NULL },
+ { "unfreeze", RBAC_PERM_COMMAND_UNFREEZE, false, &HandleUnFreezeCommand, "", NULL },
+ { "unmute", RBAC_PERM_COMMAND_UNMUTE, true, &HandleUnmuteCommand, "", NULL },
+ { "unpossess", RBAC_PERM_COMMAND_UNPOSSESS, false, &HandleUnPossessCommand, "", NULL },
+ { "unstuck", RBAC_PERM_COMMAND_UNSTUCK, true, &HandleUnstuckCommand, "", NULL },
+ { "wchange", RBAC_PERM_COMMAND_WCHANGE, false, &HandleChangeWeather, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
@@ -546,97 +518,6 @@ public:
return true;
}
- // Summon group of player
- static bool HandleGroupSummonCommand(ChatHandler* handler, char const* args)
- {
- Player* target;
- if (!handler->extractPlayerTarget((char*)args, &target))
- return false;
-
- // check online security
- if (handler->HasLowerSecurity(target, 0))
- return false;
-
- Group* group = target->GetGroup();
-
- std::string nameLink = handler->GetNameLink(target);
-
- if (!group)
- {
- handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str());
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- Map* gmMap = handler->GetSession()->GetPlayer()->GetMap();
- bool toInstance = gmMap->Instanceable();
-
- // we are in instance, and can summon only player in our group with us as lead
- if (toInstance && (
- !handler->GetSession()->GetPlayer()->GetGroup() || (group->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID()) ||
- (handler->GetSession()->GetPlayer()->GetGroup()->GetLeaderGUID() != handler->GetSession()->GetPlayer()->GetGUID())))
- // the last check is a bit excessive, but let it be, just in case
- {
- handler->SendSysMessage(LANG_CANNOT_SUMMON_TO_INST);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
- {
- Player* player = itr->GetSource();
-
- if (!player || player == handler->GetSession()->GetPlayer() || !player->GetSession())
- continue;
-
- // check online security
- if (handler->HasLowerSecurity(player, 0))
- return false;
-
- std::string plNameLink = handler->GetNameLink(player);
-
- if (player->IsBeingTeleported() == true)
- {
- handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str());
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- if (toInstance)
- {
- Map* playerMap = player->GetMap();
-
- if (playerMap->Instanceable() && playerMap->GetInstanceId() != gmMap->GetInstanceId())
- {
- // cannot summon from instance to instance
- handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, plNameLink.c_str());
- handler->SetSentErrorMessage(true);
- return false;
- }
- }
-
- handler->PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), "");
- if (handler->needReportToTarget(player))
- ChatHandler(player->GetSession()).PSendSysMessage(LANG_SUMMONED_BY, handler->GetNameLink().c_str());
-
- // stop flight if need
- if (player->IsInFlight())
- {
- player->GetMotionMaster()->MovementExpired();
- player->CleanupAfterTaxiFlight();
- }
- // save only in non-flight case
- else
- player->SaveRecallPosition();
-
- // before GM
- float x, y, z;
- handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, player->GetObjectSize());
- player->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, player->GetOrientation());
- }
-
- return true;
- }
static bool HandleCommandsCommand(ChatHandler* handler, char const* /*args*/)
{
@@ -2358,380 +2239,6 @@ public:
return true;
}
- // Send mail by command
- static bool HandleSendMailCommand(ChatHandler* handler, char const* args)
- {
- // format: name "subject text" "mail text"
- Player* target;
- uint64 targetGuid;
- std::string targetName;
- if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
- return false;
-
- char* tail1 = strtok(NULL, "");
- if (!tail1)
- return false;
-
- char const* msgSubject = handler->extractQuotedArg(tail1);
- if (!msgSubject)
- return false;
-
- char* tail2 = strtok(NULL, "");
- if (!tail2)
- return false;
-
- char const* msgText = handler->extractQuotedArg(tail2);
- if (!msgText)
- return false;
-
- // msgSubject, msgText isn't NUL after prev. check
- std::string subject = msgSubject;
- std::string text = msgText;
-
- // from console show not existed sender
- MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
-
- /// @todo Fix poor design
- SQLTransaction trans = CharacterDatabase.BeginTransaction();
- MailDraft(subject, text)
- .SendMailTo(trans, MailReceiver(target, GUID_LOPART(targetGuid)), sender);
-
- CharacterDatabase.CommitTransaction(trans);
-
- std::string nameLink = handler->playerLink(targetName);
- handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
- return true;
- }
- // Send items by mail
- static bool HandleSendItemsCommand(ChatHandler* handler, char const* args)
- {
- // format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12]
- Player* receiver;
- uint64 receiverGuid;
- std::string receiverName;
- if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName))
- return false;
-
- char* tail1 = strtok(NULL, "");
- if (!tail1)
- return false;
-
- char const* msgSubject = handler->extractQuotedArg(tail1);
- if (!msgSubject)
- return false;
-
- char* tail2 = strtok(NULL, "");
- if (!tail2)
- return false;
-
- char const* msgText = handler->extractQuotedArg(tail2);
- if (!msgText)
- return false;
-
- // msgSubject, msgText isn't NUL after prev. check
- std::string subject = msgSubject;
- std::string text = msgText;
-
- // extract items
- typedef std::pair<uint32, uint32> ItemPair;
- typedef std::list< ItemPair > ItemPairs;
- ItemPairs items;
-
- // get all tail string
- char* tail = strtok(NULL, "");
-
- // get from tail next item str
- while (char* itemStr = strtok(tail, " "))
- {
- // and get new tail
- tail = strtok(NULL, "");
-
- // parse item str
- char const* itemIdStr = strtok(itemStr, ":");
- char const* itemCountStr = strtok(NULL, " ");
-
- uint32 itemId = atoi(itemIdStr);
- if (!itemId)
- return false;
-
- ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(itemId);
- if (!item_proto)
- {
- handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- uint32 itemCount = itemCountStr ? atoi(itemCountStr) : 1;
- if (itemCount < 1 || (item_proto->MaxCount > 0 && itemCount > uint32(item_proto->MaxCount)))
- {
- handler->PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, itemCount, itemId);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- while (itemCount > item_proto->GetMaxStackSize())
- {
- items.push_back(ItemPair(itemId, item_proto->GetMaxStackSize()));
- itemCount -= item_proto->GetMaxStackSize();
- }
-
- items.push_back(ItemPair(itemId, itemCount));
-
- if (items.size() > MAX_MAIL_ITEMS)
- {
- handler->PSendSysMessage(LANG_COMMAND_MAIL_ITEMS_LIMIT, MAX_MAIL_ITEMS);
- handler->SetSentErrorMessage(true);
- return false;
- }
- }
-
- // from console show not existed sender
- MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
-
- // fill mail
- MailDraft draft(subject, text);
-
- SQLTransaction trans = CharacterDatabase.BeginTransaction();
-
- for (ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr)
- {
- if (Item* item = Item::CreateItem(itr->first, itr->second, handler->GetSession() ? handler->GetSession()->GetPlayer() : 0))
- {
- item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted
- draft.AddItem(item);
- }
- }
-
- draft.SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender);
- CharacterDatabase.CommitTransaction(trans);
-
- std::string nameLink = handler->playerLink(receiverName);
- handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
- return true;
- }
- /// Send money by mail
- static bool HandleSendMoneyCommand(ChatHandler* handler, char const* args)
- {
- /// format: name "subject text" "mail text" money
-
- Player* receiver;
- uint64 receiverGuid;
- std::string receiverName;
- if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName))
- return false;
-
- char* tail1 = strtok(NULL, "");
- if (!tail1)
- return false;
-
- char* msgSubject = handler->extractQuotedArg(tail1);
- if (!msgSubject)
- return false;
-
- char* tail2 = strtok(NULL, "");
- if (!tail2)
- return false;
-
- char* msgText = handler->extractQuotedArg(tail2);
- if (!msgText)
- return false;
-
- char* moneyStr = strtok(NULL, "");
- int32 money = moneyStr ? atoi(moneyStr) : 0;
- if (money <= 0)
- return false;
-
- // msgSubject, msgText isn't NUL after prev. check
- std::string subject = msgSubject;
- std::string text = msgText;
-
- // from console show not existed sender
- MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
-
- SQLTransaction trans = CharacterDatabase.BeginTransaction();
-
- MailDraft(subject, text)
- .AddMoney(money)
- .SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender);
-
- CharacterDatabase.CommitTransaction(trans);
-
- std::string nameLink = handler->playerLink(receiverName);
- handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
- return true;
- }
- /// Send a message to a player in game
- static bool HandleSendMessageCommand(ChatHandler* handler, char const* args)
- {
- /// - Find the player
- Player* player;
- if (!handler->extractPlayerTarget((char*)args, &player))
- return false;
-
- char* msgStr = strtok(NULL, "");
- if (!msgStr)
- return false;
-
- ///- Check that he is not logging out.
- if (player->GetSession()->isLogingOut())
- {
- handler->SendSysMessage(LANG_PLAYER_NOT_FOUND);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- /// - Send the message
- // Use SendAreaTriggerMessage for fastest delivery.
- player->GetSession()->SendAreaTriggerMessage("%s", msgStr);
- player->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
-
- // Confirmation message
- std::string nameLink = handler->GetNameLink(player);
- handler->PSendSysMessage(LANG_SENDMESSAGE, nameLink.c_str(), msgStr);
-
- return true;
- }
-
- static bool HandleCreatePetCommand(ChatHandler* handler, char const* /*args*/)
- {
- Player* player = handler->GetSession()->GetPlayer();
- Creature* creatureTarget = handler->getSelectedCreature();
-
- if (!creatureTarget || creatureTarget->IsPet() || creatureTarget->GetTypeId() == TYPEID_PLAYER)
- {
- handler->PSendSysMessage(LANG_SELECT_CREATURE);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry());
- // Creatures with family 0 crashes the server
- if (!creatrueTemplate->family)
- {
- handler->PSendSysMessage("This creature cannot be tamed. (family id: 0).");
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- if (player->GetPetGUID())
- {
- handler->PSendSysMessage("You already have a pet");
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- // Everything looks OK, create new pet
- Pet* pet = new Pet(player, HUNTER_PET);
- if (!pet->CreateBaseAtCreature(creatureTarget))
- {
- delete pet;
- handler->PSendSysMessage("Error 1");
- return false;
- }
-
- creatureTarget->setDeathState(JUST_DIED);
- creatureTarget->RemoveCorpse();
- creatureTarget->SetHealth(0); // just for nice GM-mode view
-
- pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, player->GetGUID());
- pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, player->getFaction());
-
- if (!pet->InitStatsForLevel(creatureTarget->getLevel()))
- {
- TC_LOG_ERROR(LOG_FILTER_GENERAL, "InitStatsForLevel() in EffectTameCreature failed! Pet deleted.");
- handler->PSendSysMessage("Error 2");
- delete pet;
- return false;
- }
-
- // prepare visual effect for levelup
- pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()-1);
-
- pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
- // this enables pet details window (Shift+P)
- pet->InitPetCreateSpells();
- pet->SetFullHealth();
-
- pet->GetMap()->AddToMap(pet->ToCreature());
-
- // visual effect for levelup
- pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel());
-
- player->SetMinion(pet, true);
- pet->SavePetToDB(PET_SAVE_AS_CURRENT);
- player->PetSpellInitialize();
-
- return true;
- }
-
- static bool HandlePetLearnCommand(ChatHandler* handler, char const* args)
- {
- if (!*args)
- return false;
-
- Player* player = handler->GetSession()->GetPlayer();
- Pet* pet = player->GetPet();
-
- if (!pet)
- {
- handler->PSendSysMessage("You have no pet");
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- uint32 spellId = handler->extractSpellIdFromLink((char*)args);
-
- if (!spellId || !sSpellMgr->GetSpellInfo(spellId))
- return false;
-
- // Check if pet already has it
- if (pet->HasSpell(spellId))
- {
- handler->PSendSysMessage("Pet already has spell: %u", spellId);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- // Check if spell is valid
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
- if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo))
- {
- handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- pet->learnSpell(spellId);
-
- handler->PSendSysMessage("Pet has learned spell %u", spellId);
- return true;
- }
-
- static bool HandlePetUnlearnCommand(ChatHandler* handler, char const* args)
- {
- if (!*args)
- return false;
-
- Player* player = handler->GetSession()->GetPlayer();
- Pet* pet = player->GetPet();
- if (!pet)
- {
- handler->PSendSysMessage("You have no pet");
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- uint32 spellId = handler->extractSpellIdFromLink((char*)args);
-
- if (pet->HasSpell(spellId))
- pet->removeSpell(spellId, false);
- else
- handler->PSendSysMessage("Pet doesn't have that spell");
-
- return true;
- }
-
static bool HandleFreezeCommand(ChatHandler* handler, char const* args)
{
std::string name;
@@ -2894,177 +2401,6 @@ public:
return true;
}
- static bool HandleGroupLeaderCommand(ChatHandler* handler, char const* args)
- {
- Player* player = NULL;
- Group* group = NULL;
- uint64 guid = 0;
- char* nameStr = strtok((char*)args, " ");
-
- if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
- if (group && group->GetLeaderGUID() != guid)
- {
- group->ChangeLeader(guid);
- group->SendUpdate();
- }
-
- return true;
- }
-
- static bool HandleGroupDisbandCommand(ChatHandler* handler, char const* args)
- {
- Player* player = NULL;
- Group* group = NULL;
- uint64 guid = 0;
- char* nameStr = strtok((char*)args, " ");
-
- if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid))
- if (group)
- group->Disband();
-
- return true;
- }
-
- static bool HandleGroupRemoveCommand(ChatHandler* handler, char const* args)
- {
- Player* player = NULL;
- Group* group = NULL;
- uint64 guid = 0;
- char* nameStr = strtok((char*)args, " ");
-
- if (handler->GetPlayerGroupAndGUIDByName(nameStr, player, group, guid, true))
- if (group)
- group->RemoveMember(guid);
-
- return true;
- }
-
- static bool HandleGroupJoinCommand(ChatHandler* handler, char const* args)
- {
- if (!*args)
- return false;
-
- Player* playerSource = NULL;
- Player* playerTarget = NULL;
- Group* groupSource = NULL;
- Group* groupTarget = NULL;
- uint64 guidSource = 0;
- uint64 guidTarget = 0;
- char* nameplgrStr = strtok((char*)args, " ");
- char* nameplStr = strtok(NULL, " ");
-
- if (handler->GetPlayerGroupAndGUIDByName(nameplgrStr, playerSource, groupSource, guidSource, true))
- {
- if (groupSource)
- {
- if (handler->GetPlayerGroupAndGUIDByName(nameplStr, playerTarget, groupTarget, guidTarget, true))
- {
- if (!groupTarget && playerTarget->GetGroup() != groupSource)
- {
- if (!groupSource->IsFull())
- {
- groupSource->AddMember(playerTarget);
- groupSource->BroadcastGroupUpdate();
- handler->PSendSysMessage(LANG_GROUP_PLAYER_JOINED, playerTarget->GetName().c_str(), playerSource->GetName().c_str());
- return true;
- }
- else
- {
- // group is full
- handler->PSendSysMessage(LANG_GROUP_FULL);
- return true;
- }
- }
- else
- {
- // group is full or target player already in a group
- handler->PSendSysMessage(LANG_GROUP_ALREADY_IN_GROUP, playerTarget->GetName().c_str());
- return true;
- }
- }
- }
- else
- {
- // specified source player is not in a group
- handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, playerSource->GetName().c_str());
- return true;
- }
- }
-
- return true;
- }
-
- static bool HandleGroupListCommand(ChatHandler* handler, char const* args)
- {
- Player* playerTarget;
- uint64 guidTarget;
- std::string nameTarget;
-
- uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
-
- if (sObjectMgr->GetPlayerNameByGUID(parseGUID, nameTarget))
- {
- playerTarget = sObjectMgr->GetPlayerByLowGUID(parseGUID);
- guidTarget = parseGUID;
- }
- else if (!handler->extractPlayerTarget((char*)args, &playerTarget, &guidTarget, &nameTarget))
- return false;
-
- Group* groupTarget = NULL;
- if (playerTarget)
- groupTarget = playerTarget->GetGroup();
-
- if (!groupTarget)
- {
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER);
- stmt->setUInt32(0, guidTarget);
- PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt);
- if (resultGroup)
- groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32());
- }
-
- if (groupTarget)
- {
- handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "raid" : "party"));
- Group::MemberSlotList const& members = groupTarget->GetMemberSlots();
- for (Group::MemberSlotList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
- {
- Group::MemberSlot const& slot = *itr;
-
- std::string flags;
- if (slot.flags & MEMBER_FLAG_ASSISTANT)
- flags = "Assistant";
-
- if (slot.flags & MEMBER_FLAG_MAINTANK)
- {
- if (!flags.empty())
- flags.append(", ");
- flags.append("MainTank");
- }
-
- if (slot.flags & MEMBER_FLAG_MAINASSIST)
- {
- if (!flags.empty())
- flags.append(", ");
- flags.append("MainAssist");
- }
-
- if (flags.empty())
- flags = "None";
-
- Player* p = ObjectAccessor::FindPlayer((*itr).guid);
- const char* onlineState = (p && p->IsInWorld()) ? "online" : "offline";
-
- handler->PSendSysMessage(LANG_GROUP_PLAYER_NAME_GUID, slot.name.c_str(), onlineState,
- GUID_LOPART(slot.guid), flags.c_str(), lfg::GetRolesString(slot.roles).c_str());
- }
- }
- else
- handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, nameTarget.c_str());
-
- return true;
- }
-
static bool HandlePlayAllCommand(ChatHandler* handler, char const* args)
{
if (!*args)
diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp
index 6667499af58..caefcceb886 100644
--- a/src/server/scripts/Commands/cs_mmaps.cpp
+++ b/src/server/scripts/Commands/cs_mmaps.cpp
@@ -45,18 +45,18 @@ public:
{
static ChatCommand mmapCommandTable[] =
{
- { "path", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleMmapPathCommand, "", NULL },
- { "loc", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleMmapLocCommand, "", NULL },
- { "loadedtiles", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleMmapLoadedTilesCommand, "", NULL },
- { "stats", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleMmapStatsCommand, "", NULL },
- { "testarea", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleMmapTestArea, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "loadedtiles", RBAC_PERM_COMMAND_MMAP_LOADEDTILES, false, &HandleMmapLoadedTilesCommand, "", NULL },
+ { "loc", RBAC_PERM_COMMAND_MMAP_LOC, false, &HandleMmapLocCommand, "", NULL },
+ { "path", RBAC_PERM_COMMAND_MMAP_PATH, false, &HandleMmapPathCommand, "", NULL },
+ { "stats", RBAC_PERM_COMMAND_MMAP_STATS, false, &HandleMmapStatsCommand, "", NULL },
+ { "testarea", RBAC_PERM_COMMAND_MMAP_TESTAREA, false, &HandleMmapTestArea, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "mmap", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", mmapCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "mmap", RBAC_PERM_COMMAND_MMAP, true, NULL, "", mmapCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index c3d461f6170..ddd2522c8be 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -40,44 +40,44 @@ public:
{
static ChatCommand modifyspeedCommandTable[] =
{
- { "fly", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyFlyCommand, "", NULL },
- { "all", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyASpeedCommand, "", NULL },
- { "walk", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifySpeedCommand, "", NULL },
- { "backwalk", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyBWalkCommand, "", NULL },
- { "swim", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifySwimCommand, "", NULL },
- { "", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyASpeedCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "all", RBAC_PERM_COMMAND_MODIFY_SPEED_ALL, false, &HandleModifyASpeedCommand, "", NULL },
+ { "backwalk", RBAC_PERM_COMMAND_MODIFY_SPEED_BACKWALK, false, &HandleModifyBWalkCommand, "", NULL },
+ { "fly", RBAC_PERM_COMMAND_MODIFY_SPEED_FLY, false, &HandleModifyFlyCommand, "", NULL },
+ { "walk", RBAC_PERM_COMMAND_MODIFY_SPEED_WALK, false, &HandleModifySpeedCommand, "", NULL },
+ { "swim", RBAC_PERM_COMMAND_MODIFY_SPEED_SWIM, false, &HandleModifySwimCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_MODIFY_SPEED, false, &HandleModifyASpeedCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand modifyCommandTable[] =
{
- { "hp", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyHPCommand, "", NULL },
- { "mana", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyManaCommand, "", NULL },
- { "rage", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyRageCommand, "", NULL },
- { "runicpower", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyRunicPowerCommand, "", NULL },
- { "energy", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyEnergyCommand, "", NULL },
- { "money", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyMoneyCommand, "", NULL },
- { "scale", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyScaleCommand, "", NULL },
- { "bit", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyBitCommand, "", NULL },
- { "faction", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyFactionCommand, "", NULL },
- { "spell", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifySpellCommand, "", NULL },
- { "talentpoints", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyTalentCommand, "", NULL },
- { "mount", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyMountCommand, "", NULL },
- { "honor", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyHonorCommand, "", NULL },
- { "reputation", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleModifyRepCommand, "", NULL },
- { "arenapoints", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyArenaCommand, "", NULL },
- { "drunk", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleModifyDrunkCommand, "", NULL },
- { "standstate", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleModifyStandStateCommand, "", NULL },
- { "phase", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleModifyPhaseCommand, "", NULL },
- { "gender", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleModifyGenderCommand, "", NULL },
- { "speed", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", modifyspeedCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "arenapoints", RBAC_PERM_COMMAND_MODIFY_ARENAPOINTS, false, &HandleModifyArenaCommand, "", NULL },
+ { "bit", RBAC_PERM_COMMAND_MODIFY_BIT, false, &HandleModifyBitCommand, "", NULL },
+ { "drunk", RBAC_PERM_COMMAND_MODIFY_DRUNK, false, &HandleModifyDrunkCommand, "", NULL },
+ { "energy", RBAC_PERM_COMMAND_MODIFY_ENERGY, false, &HandleModifyEnergyCommand, "", NULL },
+ { "faction", RBAC_PERM_COMMAND_MODIFY_FACTION, false, &HandleModifyFactionCommand, "", NULL },
+ { "gender", RBAC_PERM_COMMAND_MODIFY_GENDER, false, &HandleModifyGenderCommand, "", NULL },
+ { "honor", RBAC_PERM_COMMAND_MODIFY_HONOR, false, &HandleModifyHonorCommand, "", NULL },
+ { "hp", RBAC_PERM_COMMAND_MODIFY_HP, false, &HandleModifyHPCommand, "", NULL },
+ { "mana", RBAC_PERM_COMMAND_MODIFY_MANA, false, &HandleModifyManaCommand, "", NULL },
+ { "money", RBAC_PERM_COMMAND_MODIFY_MONEY, false, &HandleModifyMoneyCommand, "", NULL },
+ { "mount", RBAC_PERM_COMMAND_MODIFY_MOUNT, false, &HandleModifyMountCommand, "", NULL },
+ { "phase", RBAC_PERM_COMMAND_MODIFY_PHASE, false, &HandleModifyPhaseCommand, "", NULL },
+ { "rage", RBAC_PERM_COMMAND_MODIFY_RAGE, false, &HandleModifyRageCommand, "", NULL },
+ { "reputation", RBAC_PERM_COMMAND_MODIFY_REPUTATION, false, &HandleModifyRepCommand, "", NULL },
+ { "runicpower", RBAC_PERM_COMMAND_MODIFY_RUNICPOWER, false, &HandleModifyRunicPowerCommand, "", NULL },
+ { "scale", RBAC_PERM_COMMAND_MODIFY_SCALE, false, &HandleModifyScaleCommand, "", NULL },
+ { "speed", RBAC_PERM_COMMAND_MODIFY_SPEED, false, NULL, "", modifyspeedCommandTable },
+ { "spell", RBAC_PERM_COMMAND_MODIFY_SPELL, false, &HandleModifySpellCommand, "", NULL },
+ { "standstate", RBAC_PERM_COMMAND_MODIFY_STANDSTATE, false, &HandleModifyStandStateCommand, "", NULL },
+ { "talentpoints", RBAC_PERM_COMMAND_MODIFY_TALENTPOINTS, false, &HandleModifyTalentCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "morph", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleModifyMorphCommand, "", NULL },
- { "demorph", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleDeMorphCommand, "", NULL },
- { "modify", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", modifyCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "morph", RBAC_PERM_COMMAND_MORPH, false, &HandleModifyMorphCommand, "", NULL },
+ { "demorph", RBAC_PERM_COMMAND_DEMORPH, false, &HandleDeMorphCommand, "", NULL },
+ { "modify", RBAC_PERM_COMMAND_MODIFY, false, NULL, "", modifyCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 872be042074..fc68036aa01 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -33,15 +33,18 @@ EndScriptData */
#include "Player.h"
#include "Pet.h"
-struct NpcFlagText
+template<typename E, typename T = char const*>
+struct EnumName
{
- uint32 flag;
- int32 text;
+ E Value;
+ T Name;
};
+#define CREATE_NAMED_ENUM(VALUE) { VALUE, STRINGIZE(VALUE) }
+
#define NPCFLAG_COUNT 24
-NpcFlagText const npcFlagTexts[NPCFLAG_COUNT] =
+EnumName<NPCFlags, int32> const npcFlagTexts[NPCFLAG_COUNT] =
{
{ UNIT_NPC_FLAG_AUCTIONEER, LANG_NPCINFO_AUCTIONEER },
{ UNIT_NPC_FLAG_BANKER, LANG_NPCINFO_BANKER },
@@ -69,89 +72,76 @@ NpcFlagText const npcFlagTexts[NPCFLAG_COUNT] =
{ UNIT_NPC_FLAG_VENDOR_REAGENT, LANG_NPCINFO_VENDOR_REAGENT }
};
-struct MechanicImmune
-{
- uint32 flag;
- char const* text;
-};
-
-MechanicImmune const mechanicImmunes[MAX_MECHANIC] =
-{
- { MECHANIC_NONE , "MECHANIC_NONE" },
- { MECHANIC_CHARM , "MECHANIC_CHARM" },
- { MECHANIC_DISORIENTED , "MECHANIC_DISORIENTED" },
- { MECHANIC_DISARM , "MECHANIC_DISARM" },
- { MECHANIC_DISTRACT , "MECHANIC_DISTRACT" },
- { MECHANIC_FEAR , "MECHANIC_FEAR" },
- { MECHANIC_GRIP , "MECHANIC_GRIP" },
- { MECHANIC_ROOT , "MECHANIC_ROOT" },
- { MECHANIC_SLOW_ATTACK , "MECHANIC_SLOW_ATTACK" },
- { MECHANIC_SILENCE , "MECHANIC_SILENCE" },
- { MECHANIC_SLEEP , "MECHANIC_SLEEP" },
- { MECHANIC_SNARE , "MECHANIC_SNARE" },
- { MECHANIC_STUN , "MECHANIC_STUN" },
- { MECHANIC_FREEZE , "MECHANIC_FREEZE" },
- { MECHANIC_KNOCKOUT , "MECHANIC_KNOCKOUT" },
- { MECHANIC_BLEED , "MECHANIC_BLEED" },
- { MECHANIC_BANDAGE , "MECHANIC_BANDAGE" },
- { MECHANIC_POLYMORPH , "MECHANIC_POLYMORPH" },
- { MECHANIC_BANISH , "MECHANIC_BANISH" },
- { MECHANIC_SHIELD , "MECHANIC_SHIELD" },
- { MECHANIC_SHACKLE , "MECHANIC_SHACKLE" },
- { MECHANIC_MOUNT , "MECHANIC_MOUNT" },
- { MECHANIC_INFECTED , "MECHANIC_INFECTED" },
- { MECHANIC_TURN , "MECHANIC_TURN" },
- { MECHANIC_HORROR , "MECHANIC_HORROR" },
- { MECHANIC_INVULNERABILITY , "MECHANIC_INVULNERABILITY" },
- { MECHANIC_INTERRUPT , "MECHANIC_INTERRUPT" },
- { MECHANIC_DAZE , "MECHANIC_DAZE" },
- { MECHANIC_DISCOVERY , "MECHANIC_DISCOVERY" },
- { MECHANIC_IMMUNE_SHIELD , "MECHANIC_IMMUNE_SHIELD" },
- { MECHANIC_SAPPED , "MECHANIC_SAPPED" },
- { MECHANIC_ENRAGED , "MECHANIC_ENRAGED" }
-};
-
-
-struct UnitFlag
+EnumName<Mechanics> const mechanicImmunes[MAX_MECHANIC] =
{
- uint32 flag;
- char const* text;
+ CREATE_NAMED_ENUM(MECHANIC_NONE),
+ CREATE_NAMED_ENUM(MECHANIC_CHARM),
+ CREATE_NAMED_ENUM(MECHANIC_DISORIENTED),
+ CREATE_NAMED_ENUM(MECHANIC_DISARM),
+ CREATE_NAMED_ENUM(MECHANIC_DISTRACT),
+ CREATE_NAMED_ENUM(MECHANIC_FEAR),
+ CREATE_NAMED_ENUM(MECHANIC_GRIP),
+ CREATE_NAMED_ENUM(MECHANIC_ROOT),
+ CREATE_NAMED_ENUM(MECHANIC_SLOW_ATTACK),
+ CREATE_NAMED_ENUM(MECHANIC_SILENCE),
+ CREATE_NAMED_ENUM(MECHANIC_SLEEP),
+ CREATE_NAMED_ENUM(MECHANIC_SNARE),
+ CREATE_NAMED_ENUM(MECHANIC_STUN),
+ CREATE_NAMED_ENUM(MECHANIC_FREEZE),
+ CREATE_NAMED_ENUM(MECHANIC_KNOCKOUT),
+ CREATE_NAMED_ENUM(MECHANIC_BLEED),
+ CREATE_NAMED_ENUM(MECHANIC_BANDAGE),
+ CREATE_NAMED_ENUM(MECHANIC_POLYMORPH),
+ CREATE_NAMED_ENUM(MECHANIC_BANISH),
+ CREATE_NAMED_ENUM(MECHANIC_SHIELD),
+ CREATE_NAMED_ENUM(MECHANIC_SHACKLE),
+ CREATE_NAMED_ENUM(MECHANIC_MOUNT),
+ CREATE_NAMED_ENUM(MECHANIC_INFECTED),
+ CREATE_NAMED_ENUM(MECHANIC_TURN),
+ CREATE_NAMED_ENUM(MECHANIC_HORROR),
+ CREATE_NAMED_ENUM(MECHANIC_INVULNERABILITY),
+ CREATE_NAMED_ENUM(MECHANIC_INTERRUPT),
+ CREATE_NAMED_ENUM(MECHANIC_DAZE),
+ CREATE_NAMED_ENUM(MECHANIC_DISCOVERY),
+ CREATE_NAMED_ENUM(MECHANIC_IMMUNE_SHIELD),
+ CREATE_NAMED_ENUM(MECHANIC_SAPPED),
+ CREATE_NAMED_ENUM(MECHANIC_ENRAGED)
};
-UnitFlag const unitFlags[MAX_UNIT_FLAGS] =
+EnumName<UnitFlags> const unitFlags[MAX_UNIT_FLAGS] =
{
- { UNIT_FLAG_SERVER_CONTROLLED , "UNIT_FLAG_SERVER_CONTROLLED" },
- { UNIT_FLAG_NON_ATTACKABLE , "UNIT_FLAG_NON_ATTACKABLE" },
- { UNIT_FLAG_DISABLE_MOVE , "UNIT_FLAG_DISABLE_MOVE" },
- { UNIT_FLAG_PVP_ATTACKABLE , "UNIT_FLAG_PVP_ATTACKABLE" },
- { UNIT_FLAG_RENAME , "UNIT_FLAG_RENAME" },
- { UNIT_FLAG_PREPARATION , "UNIT_FLAG_PREPARATION" },
- { UNIT_FLAG_UNK_6 , "UNIT_FLAG_UNK_6" },
- { UNIT_FLAG_NOT_ATTACKABLE_1 , "UNIT_FLAG_NOT_ATTACKABLE_1" },
- { UNIT_FLAG_IMMUNE_TO_PC , "UNIT_FLAG_IMMUNE_TO_PC" },
- { UNIT_FLAG_IMMUNE_TO_NPC , "UNIT_FLAG_IMMUNE_TO_NPC" },
- { UNIT_FLAG_LOOTING , "UNIT_FLAG_LOOTING" },
- { UNIT_FLAG_PET_IN_COMBAT , "UNIT_FLAG_PET_IN_COMBAT" },
- { UNIT_FLAG_PVP , "UNIT_FLAG_PVP" },
- { UNIT_FLAG_SILENCED , "UNIT_FLAG_SILENCED" },
- { UNIT_FLAG_UNK_14 , "UNIT_FLAG_UNK_14" },
- { UNIT_FLAG_UNK_15 , "UNIT_FLAG_UNK_15" },
- { UNIT_FLAG_UNK_16 , "UNIT_FLAG_UNK_16" },
- { UNIT_FLAG_PACIFIED , "UNIT_FLAG_PACIFIED" },
- { UNIT_FLAG_STUNNED , "UNIT_FLAG_STUNNED" },
- { UNIT_FLAG_IN_COMBAT , "UNIT_FLAG_IN_COMBAT" },
- { UNIT_FLAG_TAXI_FLIGHT , "UNIT_FLAG_TAXI_FLIGHT" },
- { UNIT_FLAG_DISARMED , "UNIT_FLAG_DISARMED" },
- { UNIT_FLAG_CONFUSED , "UNIT_FLAG_CONFUSED" },
- { UNIT_FLAG_FLEEING , "UNIT_FLAG_FLEEING" },
- { UNIT_FLAG_PLAYER_CONTROLLED , "UNIT_FLAG_PLAYER_CONTROLLED" },
- { UNIT_FLAG_NOT_SELECTABLE , "UNIT_FLAG_NOT_SELECTABLE" },
- { UNIT_FLAG_SKINNABLE , "UNIT_FLAG_SKINNABLE" },
- { UNIT_FLAG_MOUNT , "UNIT_FLAG_MOUNT" },
- { UNIT_FLAG_UNK_28 , "UNIT_FLAG_UNK_28" },
- { UNIT_FLAG_UNK_29 , "UNIT_FLAG_UNK_29" },
- { UNIT_FLAG_SHEATHE , "UNIT_FLAG_SHEATHE" },
- { UNIT_FLAG_UNK_31 , "UNIT_FLAG_UNK_31" }
+ CREATE_NAMED_ENUM(UNIT_FLAG_SERVER_CONTROLLED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_NON_ATTACKABLE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_DISABLE_MOVE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PVP_ATTACKABLE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_RENAME),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PREPARATION),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_6),
+ CREATE_NAMED_ENUM(UNIT_FLAG_NOT_ATTACKABLE_1),
+ CREATE_NAMED_ENUM(UNIT_FLAG_IMMUNE_TO_PC),
+ CREATE_NAMED_ENUM(UNIT_FLAG_IMMUNE_TO_NPC),
+ CREATE_NAMED_ENUM(UNIT_FLAG_LOOTING),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PET_IN_COMBAT),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PVP),
+ CREATE_NAMED_ENUM(UNIT_FLAG_SILENCED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_14),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_15),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_16),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PACIFIED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_STUNNED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_IN_COMBAT),
+ CREATE_NAMED_ENUM(UNIT_FLAG_TAXI_FLIGHT),
+ CREATE_NAMED_ENUM(UNIT_FLAG_DISARMED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_CONFUSED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_FLEEING),
+ CREATE_NAMED_ENUM(UNIT_FLAG_PLAYER_CONTROLLED),
+ CREATE_NAMED_ENUM(UNIT_FLAG_NOT_SELECTABLE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_SKINNABLE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_MOUNT),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_28),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_29),
+ CREATE_NAMED_ENUM(UNIT_FLAG_SHEATHE),
+ CREATE_NAMED_ENUM(UNIT_FLAG_UNK_31)
};
class npc_commandscript : public CommandScript
@@ -163,69 +153,65 @@ public:
{
static ChatCommand npcAddCommandTable[] =
{
- { "formation", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleNpcAddFormationCommand, "", NULL },
- { "item", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcAddVendorItemCommand, "", NULL },
- { "move", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcAddMoveCommand, "", NULL },
- { "temp", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcAddTempSpawnCommand, "", NULL },
- //{@todo fix or remove this command
- { "weapon", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleNpcAddWeaponCommand, "", NULL },
- //}
- { "", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcAddCommand, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "formation", RBAC_PERM_COMMAND_NPC_ADD_FORMATION, false, &HandleNpcAddFormationCommand, "", NULL },
+ { "item", RBAC_PERM_COMMAND_NPC_ADD_ITEM, false, &HandleNpcAddVendorItemCommand, "", NULL },
+ { "move", RBAC_PERM_COMMAND_NPC_ADD_MOVE, false, &HandleNpcAddMoveCommand, "", NULL },
+ { "temp", RBAC_PERM_COMMAND_NPC_ADD_TEMP, false, &HandleNpcAddTempSpawnCommand, "", NULL },
+ //{ "weapon", RBAC_PERM_COMMAND_NPC_ADD_WEAPON, false, &HandleNpcAddWeaponCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_NPC_ADD, false, &HandleNpcAddCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand npcDeleteCommandTable[] =
{
- { "item", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcDeleteVendorItemCommand, "", NULL },
- { "", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcDeleteCommand, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "item", RBAC_PERM_COMMAND_NPC_DELETE_ITEM, false, &HandleNpcDeleteVendorItemCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_NPC_DELETE, false, &HandleNpcDeleteCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand npcFollowCommandTable[] =
{
- { "stop", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcUnFollowCommand, "", NULL },
- { "", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcFollowCommand, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "stop", RBAC_PERM_COMMAND_NPC_FOLLOW_STOP, false, &HandleNpcUnFollowCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_NPC_FOLLOW, false, &HandleNpcFollowCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand npcSetCommandTable[] =
{
- { "allowmove", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleNpcSetAllowMovementCommand, "", NULL },
- { "entry", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleNpcSetEntryCommand, "", NULL },
- { "factionid", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetFactionIdCommand, "", NULL },
- { "flag", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetFlagCommand, "", NULL },
- { "level", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetLevelCommand, "", NULL },
- { "link", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetLinkCommand, "", NULL },
- { "model", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetModelCommand, "", NULL },
- { "movetype", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetMoveTypeCommand, "", NULL },
- { "phase", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetPhaseCommand, "", NULL },
- { "spawndist", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetSpawnDistCommand, "", NULL },
- { "spawntime", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetSpawnTimeCommand, "", NULL },
- { "data", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleNpcSetDataCommand, "", NULL },
- //{ @todo fix or remove these commands
- { "name", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetNameCommand, "", NULL },
- { "subname", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcSetSubNameCommand, "", NULL },
- //}
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "allowmove", RBAC_PERM_COMMAND_NPC_SET_ALLOWMOVE, false, &HandleNpcSetAllowMovementCommand, "", NULL },
+ { "entry", RBAC_PERM_COMMAND_NPC_SET_ENTRY, false, &HandleNpcSetEntryCommand, "", NULL },
+ { "factionid", RBAC_PERM_COMMAND_NPC_SET_FACTIONID, false, &HandleNpcSetFactionIdCommand, "", NULL },
+ { "flag", RBAC_PERM_COMMAND_NPC_SET_FLAG, false, &HandleNpcSetFlagCommand, "", NULL },
+ { "level", RBAC_PERM_COMMAND_NPC_SET_LEVEL, false, &HandleNpcSetLevelCommand, "", NULL },
+ { "link", RBAC_PERM_COMMAND_NPC_SET_LINK, false, &HandleNpcSetLinkCommand, "", NULL },
+ { "model", RBAC_PERM_COMMAND_NPC_SET_MODEL, false, &HandleNpcSetModelCommand, "", NULL },
+ { "movetype", RBAC_PERM_COMMAND_NPC_SET_MOVETYPE, false, &HandleNpcSetMoveTypeCommand, "", NULL },
+ { "phase", RBAC_PERM_COMMAND_NPC_SET_PHASE, false, &HandleNpcSetPhaseCommand, "", NULL },
+ { "spawndist", RBAC_PERM_COMMAND_NPC_SET_SPAWNDIST, false, &HandleNpcSetSpawnDistCommand, "", NULL },
+ { "spawntime", RBAC_PERM_COMMAND_NPC_SET_SPAWNTIME, false, &HandleNpcSetSpawnTimeCommand, "", NULL },
+ { "data", RBAC_PERM_COMMAND_NPC_SET_DATA, false, &HandleNpcSetDataCommand, "", NULL },
+ //{ "name", RBAC_PERM_COMMAND_NPC_SET_NAME, false, &HandleNpcSetNameCommand, "", NULL },
+ //{ "subname", RBAC_PERM_COMMAND_NPC_SET_SUBNAME, false, &HandleNpcSetSubNameCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand npcCommandTable[] =
{
- { "info", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleNpcInfoCommand, "", NULL },
- { "near", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcNearCommand, "", NULL },
- { "move", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcMoveCommand, "", NULL },
- { "playemote", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleNpcPlayEmoteCommand, "", NULL },
- { "say", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleNpcSayCommand, "", NULL },
- { "textemote", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleNpcTextEmoteCommand, "", NULL },
- { "whisper", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleNpcWhisperCommand, "", NULL },
- { "yell", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleNpcYellCommand, "", NULL },
- { "tame", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleNpcTameCommand, "", NULL },
- { "add", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", npcAddCommandTable },
- { "delete", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", npcDeleteCommandTable },
- { "follow", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", npcFollowCommandTable },
- { "set", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", npcSetCommandTable },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "info", RBAC_PERM_COMMAND_NPC_INFO, false, &HandleNpcInfoCommand, "", NULL },
+ { "near", RBAC_PERM_COMMAND_NPC_NEAR, false, &HandleNpcNearCommand, "", NULL },
+ { "move", RBAC_PERM_COMMAND_NPC_MOVE, false, &HandleNpcMoveCommand, "", NULL },
+ { "playemote", RBAC_PERM_COMMAND_NPC_PLAYEMOTE, false, &HandleNpcPlayEmoteCommand, "", NULL },
+ { "say", RBAC_PERM_COMMAND_NPC_SAY, false, &HandleNpcSayCommand, "", NULL },
+ { "textemote", RBAC_PERM_COMMAND_NPC_TEXTEMOTE, false, &HandleNpcTextEmoteCommand, "", NULL },
+ { "whisper", RBAC_PERM_COMMAND_NPC_WHISPER, false, &HandleNpcWhisperCommand, "", NULL },
+ { "yell", RBAC_PERM_COMMAND_NPC_YELL, false, &HandleNpcYellCommand, "", NULL },
+ { "tame", RBAC_PERM_COMMAND_NPC_TAME, false, &HandleNpcTameCommand, "", NULL },
+ { "add", RBAC_PERM_COMMAND_NPC_ADD, false, NULL, "", npcAddCommandTable },
+ { "delete", RBAC_PERM_COMMAND_NPC_DELETE, false, NULL, "", npcDeleteCommandTable },
+ { "follow", RBAC_PERM_COMMAND_NPC_FOLLOW, false, NULL, "", npcFollowCommandTable },
+ { "set", RBAC_PERM_COMMAND_NPC_SET, false, NULL, "", npcSetCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "npc", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", npcCommandTable },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "npc", RBAC_PERM_COMMAND_NPC, false, NULL, "", npcCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
@@ -242,10 +228,15 @@ public:
char* team = strtok(NULL, " ");
int32 teamval = 0;
- if (team) { teamval = atoi(team); }
- if (teamval < 0) { teamval = 0; }
+ if (team)
+ teamval = atoi(team);
+
+ if (teamval < 0)
+ teamval = 0;
uint32 id = atoi(charID);
+ if (!sObjectMgr->GetCreatureTemplate(id))
+ return false;
Player* chr = handler->GetSession()->GetPlayer();
float x = chr->GetPositionX();
@@ -737,8 +728,8 @@ public:
handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS));
for (uint8 i = 0; i < MAX_UNIT_FLAGS; ++i)
- if (target->GetUInt32Value(UNIT_FIELD_FLAGS) & unitFlags[i].flag)
- handler->PSendSysMessage(unitFlags[i].text, unitFlags[i].flag);
+ if (target->GetUInt32Value(UNIT_FIELD_FLAGS) & unitFlags[i].Value)
+ handler->PSendSysMessage("%s (0x%X)", unitFlags[i].Name, unitFlags[i].Value);
handler->PSendSysMessage(LANG_NPCINFO_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS_2), target->GetUInt32Value(UNIT_DYNAMIC_FLAGS), target->getFaction());
handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str());
@@ -750,13 +741,13 @@ public:
handler->PSendSysMessage(LANG_NPCINFO_AIINFO, target->GetAIName().c_str(), target->GetScriptName().c_str());
for (uint8 i = 0; i < NPCFLAG_COUNT; i++)
- if (npcflags & npcFlagTexts[i].flag)
- handler->PSendSysMessage(npcFlagTexts[i].text, npcFlagTexts[i].flag);
+ if (npcflags & npcFlagTexts[i].Value)
+ handler->PSendSysMessage(npcFlagTexts[i].Name);
handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask);
for (uint8 i = 0; i < MAX_MECHANIC; ++i)
- if ((mechanicImmuneMask << 1) & mechanicImmunes[i].flag)
- handler->PSendSysMessage(mechanicImmunes[i].text, mechanicImmunes[i].flag);
+ if ((mechanicImmuneMask << 1) & mechanicImmunes[i].Value)
+ handler->PSendSysMessage("%s (0x%X)", mechanicImmunes[i].Name, mechanicImmunes[i].Value);
return true;
}
@@ -1361,6 +1352,9 @@ public:
if (!id)
return false;
+ if (!sObjectMgr->GetCreatureTemplate(id))
+ return false;
+
chr->SummonCreature(id, *chr, TEMPSUMMON_CORPSE_DESPAWN, 120);
return true;
diff --git a/src/server/scripts/Commands/cs_pet.cpp b/src/server/scripts/Commands/cs_pet.cpp
new file mode 100644
index 00000000000..315cf06e995
--- /dev/null
+++ b/src/server/scripts/Commands/cs_pet.cpp
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Chat.h"
+#include "Language.h"
+#include "Pet.h"
+#include "Player.h"
+#include "ObjectMgr.h"
+#include "ScriptMgr.h"
+
+class pet_commandscript : public CommandScript
+{
+public:
+ pet_commandscript() : CommandScript("pet_commandscript") { }
+
+ ChatCommand* GetCommands() const OVERRIDE
+ {
+ static ChatCommand petCommandTable[] =
+ {
+ { "create", RBAC_PERM_COMMAND_PET_CREATE, false, &HandlePetCreateCommand, "", NULL },
+ { "learn", RBAC_PERM_COMMAND_PET_LEARN, false, &HandlePetLearnCommand, "", NULL },
+ { "unlearn", RBAC_PERM_COMMAND_PET_UNLEARN, false, &HandlePetUnlearnCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "pet", RBAC_PERM_COMMAND_PET, false, NULL, "", petCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+ static bool HandlePetCreateCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+ Creature* creatureTarget = handler->getSelectedCreature();
+
+ if (!creatureTarget || creatureTarget->IsPet() || creatureTarget->GetTypeId() == TYPEID_PLAYER)
+ {
+ handler->PSendSysMessage(LANG_SELECT_CREATURE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ CreatureTemplate const* creatrueTemplate = creatureTarget->GetCreatureTemplate();
+ // Creatures with family 0 crashes the server
+ if (!creatrueTemplate->family)
+ {
+ handler->PSendSysMessage("This creature cannot be tamed. (family id: 0).");
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (player->GetPetGUID())
+ {
+ handler->PSendSysMessage("You already have a pet");
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // Everything looks OK, create new pet
+ Pet* pet = new Pet(player, HUNTER_PET);
+ if (!pet->CreateBaseAtCreature(creatureTarget))
+ {
+ delete pet;
+ handler->PSendSysMessage("Error 1");
+ return false;
+ }
+
+ creatureTarget->setDeathState(JUST_DIED);
+ creatureTarget->RemoveCorpse();
+ creatureTarget->SetHealth(0); // just for nice GM-mode view
+
+ pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, player->GetGUID());
+ pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, player->getFaction());
+
+ if (!pet->InitStatsForLevel(creatureTarget->getLevel()))
+ {
+ TC_LOG_ERROR(LOG_FILTER_GENERAL, "InitStatsForLevel() in EffectTameCreature failed! Pet deleted.");
+ handler->PSendSysMessage("Error 2");
+ delete pet;
+ return false;
+ }
+
+ // prepare visual effect for levelup
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()-1);
+
+ pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
+ // this enables pet details window (Shift+P)
+ pet->InitPetCreateSpells();
+ pet->SetFullHealth();
+
+ pet->GetMap()->AddToMap(pet->ToCreature());
+
+ // visual effect for levelup
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel());
+
+ player->SetMinion(pet, true);
+ pet->SavePetToDB(PET_SAVE_AS_CURRENT);
+ player->PetSpellInitialize();
+
+ return true;
+ }
+
+ static bool HandlePetLearnCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* player = handler->GetSession()->GetPlayer();
+ Pet* pet = player->GetPet();
+
+ if (!pet)
+ {
+ handler->PSendSysMessage("You have no pet");
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 spellId = handler->extractSpellIdFromLink((char*)args);
+
+ if (!spellId || !sSpellMgr->GetSpellInfo(spellId))
+ return false;
+
+ // Check if pet already has it
+ if (pet->HasSpell(spellId))
+ {
+ handler->PSendSysMessage("Pet already has spell: %u", spellId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // Check if spell is valid
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
+ if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo))
+ {
+ handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ pet->learnSpell(spellId);
+
+ handler->PSendSysMessage("Pet has learned spell %u", spellId);
+ return true;
+ }
+
+ static bool HandlePetUnlearnCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* player = handler->GetSession()->GetPlayer();
+ Pet* pet = player->GetPet();
+ if (!pet)
+ {
+ handler->PSendSysMessage("You have no pet");
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 spellId = handler->extractSpellIdFromLink((char*)args);
+
+ if (pet->HasSpell(spellId))
+ pet->removeSpell(spellId, false);
+ else
+ handler->PSendSysMessage("Pet doesn't have that spell");
+
+ return true;
+ }
+};
+
+void AddSC_pet_commandscript()
+{
+ new pet_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp
index 20515eb0921..3ad1fea74a2 100644
--- a/src/server/scripts/Commands/cs_quest.cpp
+++ b/src/server/scripts/Commands/cs_quest.cpp
@@ -37,16 +37,16 @@ public:
{
static ChatCommand questCommandTable[] =
{
- { "add", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleQuestAdd, "", NULL },
- { "complete", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleQuestComplete, "", NULL },
- { "remove", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleQuestRemove, "", NULL },
- { "reward", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleQuestReward, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "add", RBAC_PERM_COMMAND_QUEST_ADD, false, &HandleQuestAdd, "", NULL },
+ { "complete", RBAC_PERM_COMMAND_QUEST_COMPLETE, false, &HandleQuestComplete, "", NULL },
+ { "remove", RBAC_PERM_COMMAND_QUEST_REMOVE, false, &HandleQuestRemove, "", NULL },
+ { "reward", RBAC_PERM_COMMAND_QUEST_REWARD, false, &HandleQuestReward, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "quest", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, NULL, "", questCommandTable },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "quest", RBAC_PERM_COMMAND_QUEST, false, NULL, "", questCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_rbac.cpp b/src/server/scripts/Commands/cs_rbac.cpp
index 9c682acb224..ba899fee077 100644
--- a/src/server/scripts/Commands/cs_rbac.cpp
+++ b/src/server/scripts/Commands/cs_rbac.cpp
@@ -64,7 +64,7 @@ public:
{ "grant", RBAC_PERM_COMMAND_RBAC_ACC_ROLE_GRANT, true, &HandleRBACRoleGrantCommand, "", NULL },
{ "deny", RBAC_PERM_COMMAND_RBAC_ACC_ROLE_DENY, true, &HandleRBACRoleDenyCommand, "", NULL },
{ "revoke", RBAC_PERM_COMMAND_RBAC_ACC_ROLE_REVOKE, true, &HandleRBACRoleRevokeCommand, "", NULL },
- { "", RBAC_PERM_COMMAND_RBAC_ACC_ROLE, true, &HandleRBACRoleListCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_RBAC_ACC_ROLE, true, &HandleRBACRoleListCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
@@ -73,7 +73,7 @@ public:
{ "grant", RBAC_PERM_COMMAND_RBAC_ACC_PERM_GRANT, true, &HandleRBACPermGrantCommand, "", NULL },
{ "deny", RBAC_PERM_COMMAND_RBAC_ACC_PERM_DENY, true, &HandleRBACPermDenyCommand, "", NULL },
{ "revoke", RBAC_PERM_COMMAND_RBAC_ACC_PERM_REVOKE, true, &HandleRBACPermRevokeCommand, "", NULL },
- { "", RBAC_PERM_COMMAND_RBAC_ACC_PERM, true, &HandleRBACPermListCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_RBAC_ACC_PERM, true, &HandleRBACPermListCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 36b1c76110d..901a331b4b4 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -51,120 +51,120 @@ public:
{
static ChatCommand reloadAllCommandTable[] =
{
- { "achievement", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllAchievementCommand, "", NULL },
- { "area", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllAreaCommand, "", NULL },
- { "eventai", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllEventAICommand, "", NULL },
- { "gossips", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllGossipsCommand, "", NULL },
- { "item", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllItemCommand, "", NULL },
- { "locales", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllLocalesCommand, "", NULL },
- { "loot", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllLootCommand, "", NULL },
- { "npc", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllNpcCommand, "", NULL },
- { "quest", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllQuestCommand, "", NULL },
- { "scripts", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllScriptsCommand, "", NULL },
- { "spell", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllSpellCommand, "", NULL },
- { "", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAllCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "achievement", RBAC_PERM_COMMANDS_RELOAD_ALL_ACHIEVEMENT, true, &HandleReloadAllAchievementCommand, "", NULL },
+ { "area", RBAC_PERM_COMMANDS_RELOAD_ALL_AREA, true, &HandleReloadAllAreaCommand, "", NULL },
+ { "eventai", RBAC_PERM_COMMANDS_RELOAD_ALL_EVENTAI, true, &HandleReloadAllEventAICommand, "", NULL },
+ { "gossips", RBAC_PERM_COMMANDS_RELOAD_ALL_GOSSIP, true, &HandleReloadAllGossipsCommand, "", NULL },
+ { "item", RBAC_PERM_COMMANDS_RELOAD_ALL_ITEM, true, &HandleReloadAllItemCommand, "", NULL },
+ { "locales", RBAC_PERM_COMMANDS_RELOAD_ALL_LOCALES, true, &HandleReloadAllLocalesCommand, "", NULL },
+ { "loot", RBAC_PERM_COMMANDS_RELOAD_ALL_LOOT, true, &HandleReloadAllLootCommand, "", NULL },
+ { "npc", RBAC_PERM_COMMANDS_RELOAD_ALL_NPC, true, &HandleReloadAllNpcCommand, "", NULL },
+ { "quest", RBAC_PERM_COMMANDS_RELOAD_ALL_QUEST, true, &HandleReloadAllQuestCommand, "", NULL },
+ { "scripts", RBAC_PERM_COMMANDS_RELOAD_ALL_SCRIPTS, true, &HandleReloadAllScriptsCommand, "", NULL },
+ { "spell", RBAC_PERM_COMMANDS_RELOAD_ALL_SPELL, true, &HandleReloadAllSpellCommand, "", NULL },
+ { "", RBAC_PERM_COMMANDS_RELOAD_ALL, true, &HandleReloadAllCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand reloadCommandTable[] =
{
- { "auctions", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAuctionsCommand, "", NULL },
- { "access_requirement", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAccessRequirementCommand, "", NULL },
- { "achievement_criteria_data", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAchievementCriteriaDataCommand, "", NULL },
- { "achievement_reward", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAchievementRewardCommand, "", NULL },
- { "all", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", reloadAllCommandTable },
- { "areatrigger_involvedrelation", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadQuestAreaTriggersCommand, "", NULL },
- { "areatrigger_tavern", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAreaTriggerTavernCommand, "", NULL },
- { "areatrigger_teleport", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAreaTriggerTeleportCommand, "", NULL },
- { "autobroadcast", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadAutobroadcastCommand, "", NULL },
- { "command", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadCommandCommand, "", NULL },
- { "conditions", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadConditions, "", NULL },
- { "config", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadConfigCommand, "", NULL },
- { "creature_text", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadCreatureText, "", NULL },
- { "creature_ai_scripts", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadEventAIScriptsCommand, "", NULL },
- { "creature_ai_texts", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadEventAITextsCommand, "", NULL },
- { "creature_questender", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadCreatureQuestEnderCommand, "", NULL },
- { "creature_linked_respawn", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleReloadLinkedRespawnCommand, "", NULL },
- { "creature_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesCreatureCommand, "", NULL },
- { "creature_onkill_reputation", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadOnKillReputationCommand, "", NULL },
- { "creature_queststarter", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadCreatureQuestStarterCommand, "", NULL },
- { "creature_summon_groups", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadCreatureSummonGroupsCommand, "", NULL },
- { "creature_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadCreatureTemplateCommand, "", NULL },
- //{ "db_script_string", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadDbScriptStringCommand, "", NULL },
- { "disables", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadDisablesCommand, "", NULL },
- { "disenchant_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesDisenchantCommand, "", NULL },
- { "event_scripts", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadEventScriptsCommand, "", NULL },
- { "fishing_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesFishingCommand, "", NULL },
- { "game_graveyard_zone", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadGameGraveyardZoneCommand, "", NULL },
- { "game_tele", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadGameTeleCommand, "", NULL },
- { "gameobject_questender", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadGOQuestEnderCommand, "", NULL },
- { "gameobject_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesGameobjectCommand, "", NULL },
- { "gameobject_queststarter", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadGOQuestStarterCommand, "", NULL },
- { "gm_tickets", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadGMTicketsCommand, "", NULL },
- { "gossip_menu", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadGossipMenuCommand, "", NULL },
- { "gossip_menu_option", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadGossipMenuOptionCommand, "", NULL },
- { "item_enchantment_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadItemEnchantementsCommand, "", NULL },
- { "item_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesItemCommand, "", NULL },
- { "item_set_names", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadItemSetNamesCommand, "", NULL },
- { "lfg_dungeon_rewards", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLfgRewardsCommand, "", NULL },
- { "locales_achievement_reward", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesAchievementRewardCommand, "", NULL },
- { "locales_creature", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesCreatureCommand, "", NULL },
- { "locales_creature_text", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesCreatureTextCommand, "", NULL },
- { "locales_gameobject", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesGameobjectCommand, "", NULL },
- { "locales_gossip_menu_option", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesGossipMenuOptionCommand, "", NULL },
- { "locales_item", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesItemCommand, "", NULL },
- { "locales_item_set_name", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesItemSetNameCommand, "", NULL },
- { "locales_npc_text", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesNpcTextCommand, "", NULL },
- { "locales_page_text", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesPageTextCommand, "", NULL },
- { "locales_points_of_interest", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesPointsOfInterestCommand, "", NULL },
- { "locales_quest", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLocalesQuestCommand, "", NULL },
- { "mail_level_reward", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadMailLevelRewardCommand, "", NULL },
- { "mail_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesMailCommand, "", NULL },
- { "milling_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesMillingCommand, "", NULL },
- { "npc_spellclick_spells", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellClickSpellsCommand, "", NULL},
- { "npc_trainer", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadNpcTrainerCommand, "", NULL },
- { "npc_vendor", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadNpcVendorCommand, "", NULL },
- { "page_text", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadPageTextsCommand, "", NULL },
- { "pickpocketing_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesPickpocketingCommand, "", NULL},
- { "points_of_interest", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadPointsOfInterestCommand, "", NULL },
- { "prospecting_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesProspectingCommand, "", NULL },
- { "quest_poi", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadQuestPOICommand, "", NULL },
- { "quest_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadQuestTemplateCommand, "", NULL },
- { "rbac", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadRBACCommand, "", NULL },
- { "reference_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesReferenceCommand, "", NULL },
- { "reserved_name", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadReservedNameCommand, "", NULL },
- { "reputation_reward_rate", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadReputationRewardRateCommand, "", NULL },
- { "reputation_spillover_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadReputationRewardRateCommand, "", NULL },
- { "skill_discovery_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSkillDiscoveryTemplateCommand, "", NULL },
- { "skill_extra_item_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSkillExtraItemTemplateCommand, "", NULL },
- { "skill_fishing_base_level", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSkillFishingBaseLevelCommand, "", NULL },
- { "skinning_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesSkinningCommand, "", NULL },
- { "smart_scripts", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSmartScripts, "", NULL },
- { "spell_required", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellRequiredCommand, "", NULL },
- { "spell_area", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellAreaCommand, "", NULL },
- { "spell_bonus_data", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellBonusesCommand, "", NULL },
- { "spell_group", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellGroupsCommand, "", NULL },
- { "spell_learn_spell", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellLearnSpellCommand, "", NULL },
- { "spell_loot_template", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadLootTemplatesSpellCommand, "", NULL },
- { "spell_linked_spell", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellLinkedSpellCommand, "", NULL },
- { "spell_pet_auras", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellPetAurasCommand, "", NULL },
- { "spell_proc_event", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellProcEventCommand, "", NULL },
- { "spell_proc", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellProcsCommand, "", NULL },
- { "spell_scripts", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellScriptsCommand, "", NULL },
- { "spell_target_position", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellTargetPositionCommand, "", NULL },
- { "spell_threats", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellThreatsCommand, "", NULL },
- { "spell_group_stack_rules", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadSpellGroupStackRulesCommand, "", NULL },
- { "trinity_string", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadTrinityStringCommand, "", NULL },
- { "warden_action", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadWardenactionCommand, "", NULL },
- { "waypoint_scripts", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadWpScriptsCommand, "", NULL },
- { "waypoint_data", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadWpCommand, "", NULL },
- { "vehicle_accessory", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadVehicleAccessoryCommand, "", NULL },
- { "vehicle_template_accessory", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleReloadVehicleTemplateAccessoryCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "auctions", RBAC_PERM_COMMANDS_RELOAD_AUCTIONS, true, &HandleReloadAuctionsCommand, "", NULL },
+ { "access_requirement", RBAC_PERM_COMMANDS_RELOAD_ACCESS_REQUIREMENT, true, &HandleReloadAccessRequirementCommand, "", NULL },
+ { "achievement_criteria_data", RBAC_PERM_COMMANDS_RELOAD_ACHIEVEMENT_CRITERIA_DATA, true, &HandleReloadAchievementCriteriaDataCommand, "", NULL },
+ { "achievement_reward", RBAC_PERM_COMMANDS_RELOAD_ACHIEVEMENT_REWARD, true, &HandleReloadAchievementRewardCommand, "", NULL },
+ { "all", RBAC_PERM_COMMANDS_RELOAD_ALL, true, NULL, "", reloadAllCommandTable },
+ { "areatrigger_involvedrelation", RBAC_PERM_COMMANDS_RELOAD_AREATRIGGER_INVOLVEDRELATION, true, &HandleReloadQuestAreaTriggersCommand, "", NULL },
+ { "areatrigger_tavern", RBAC_PERM_COMMANDS_RELOAD_AREATRIGGER_TAVERN, true, &HandleReloadAreaTriggerTavernCommand, "", NULL },
+ { "areatrigger_teleport", RBAC_PERM_COMMANDS_RELOAD_AREATRIGGER_TELEPORT, true, &HandleReloadAreaTriggerTeleportCommand, "", NULL },
+ { "autobroadcast", RBAC_PERM_COMMANDS_RELOAD_AUTOBROADCAST, true, &HandleReloadAutobroadcastCommand, "", NULL },
+ { "command", RBAC_PERM_COMMANDS_RELOAD_COMMAND, true, &HandleReloadCommandCommand, "", NULL },
+ { "conditions", RBAC_PERM_COMMANDS_RELOAD_CONDITIONS, true, &HandleReloadConditions, "", NULL },
+ { "config", RBAC_PERM_COMMANDS_RELOAD_CONFIG, true, &HandleReloadConfigCommand, "", NULL },
+ { "creature_text", RBAC_PERM_COMMANDS_RELOAD_CREATURE_TEXT, true, &HandleReloadCreatureText, "", NULL },
+ { "creature_ai_scripts", RBAC_PERM_COMMANDS_RELOAD_CREATURE_AI_SCRIPTS, true, &HandleReloadEventAIScriptsCommand, "", NULL },
+ { "creature_ai_texts", RBAC_PERM_COMMANDS_RELOAD_CREATURE_AI_TEXTS, true, &HandleReloadEventAITextsCommand, "", NULL },
+ { "creature_questender", RBAC_PERM_COMMANDS_RELOAD_CREATURE_QUESTENDER, true, &HandleReloadCreatureQuestEnderCommand, "", NULL },
+ { "creature_linked_respawn", RBAC_PERM_COMMANDS_RELOAD_CREATURE_LINKED_RESPAWN, true, &HandleReloadLinkedRespawnCommand, "", NULL },
+ { "creature_loot_template", RBAC_PERM_COMMANDS_RELOAD_CREATURE_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesCreatureCommand, "", NULL },
+ { "creature_onkill_reputation", RBAC_PERM_COMMANDS_RELOAD_CREATURE_ONKILL_REPUTATION, true, &HandleReloadOnKillReputationCommand, "", NULL },
+ { "creature_queststarter", RBAC_PERM_COMMANDS_RELOAD_CREATURE_QUESTSTARTER, true, &HandleReloadCreatureQuestStarterCommand, "", NULL },
+ { "creature_summon_groups", RBAC_PERM_COMMANDS_RELOAD_CREATURE_SUMMON_GROUPS, true, &HandleReloadCreatureSummonGroupsCommand, "", NULL },
+ { "creature_template", RBAC_PERM_COMMANDS_RELOAD_CREATURE_TEMPLATE, true, &HandleReloadCreatureTemplateCommand, "", NULL },
+ //{ "db_script_string", RBAC_PERM_COMMANDS_RELOAD_, true, &HandleReloadDbScriptStringCommand, "", NULL },
+ { "disables", RBAC_PERM_COMMANDS_RELOAD_DISABLES, true, &HandleReloadDisablesCommand, "", NULL },
+ { "disenchant_loot_template", RBAC_PERM_COMMANDS_RELOAD_DISENCHANT_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesDisenchantCommand, "", NULL },
+ { "event_scripts", RBAC_PERM_COMMANDS_RELOAD_EVENT_SCRIPTS, true, &HandleReloadEventScriptsCommand, "", NULL },
+ { "fishing_loot_template", RBAC_PERM_COMMANDS_RELOAD_FISHING_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesFishingCommand, "", NULL },
+ { "game_graveyard_zone", RBAC_PERM_COMMANDS_RELOAD_GAME_GRAVEYARD_ZONE, true, &HandleReloadGameGraveyardZoneCommand, "", NULL },
+ { "game_tele", RBAC_PERM_COMMANDS_RELOAD_GAME_TELE, true, &HandleReloadGameTeleCommand, "", NULL },
+ { "gameobject_questender", RBAC_PERM_COMMANDS_RELOAD_GAMEOBJECT_QUESTENDER, true, &HandleReloadGOQuestEnderCommand, "", NULL },
+ { "gameobject_loot_template", RBAC_PERM_COMMANDS_RELOAD_GAMEOBJECT_QUEST_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesGameobjectCommand, "", NULL },
+ { "gameobject_queststarter", RBAC_PERM_COMMANDS_RELOAD_GAMEOBJECT_QUESTSTARTER, true, &HandleReloadGOQuestStarterCommand, "", NULL },
+ { "gm_tickets", RBAC_PERM_COMMANDS_RELOAD_GM_TICKETS, true, &HandleReloadGMTicketsCommand, "", NULL },
+ { "gossip_menu", RBAC_PERM_COMMANDS_RELOAD_GOSSIP_MENU, true, &HandleReloadGossipMenuCommand, "", NULL },
+ { "gossip_menu_option", RBAC_PERM_COMMANDS_RELOAD_GOSSIP_MENU_OPTION, true, &HandleReloadGossipMenuOptionCommand, "", NULL },
+ { "item_enchantment_template", RBAC_PERM_COMMANDS_RELOAD_ITEM_ENCHANTMENT_TEMPLATE, true, &HandleReloadItemEnchantementsCommand, "", NULL },
+ { "item_loot_template", RBAC_PERM_COMMANDS_RELOAD_ITEM_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesItemCommand, "", NULL },
+ { "item_set_names", RBAC_PERM_COMMANDS_RELOAD_ITEM_SET_NAMES, true, &HandleReloadItemSetNamesCommand, "", NULL },
+ { "lfg_dungeon_rewards", RBAC_PERM_COMMANDS_RELOAD_LFG_DUNGEON_REWARDS, true, &HandleReloadLfgRewardsCommand, "", NULL },
+ { "locales_achievement_reward", RBAC_PERM_COMMANDS_RELOAD_LOCALES_ACHIEVEMENT_REWARD, true, &HandleReloadLocalesAchievementRewardCommand, "", NULL },
+ { "locales_creature", RBAC_PERM_COMMANDS_RELOAD_LOCALES_CRETURE, true, &HandleReloadLocalesCreatureCommand, "", NULL },
+ { "locales_creature_text", RBAC_PERM_COMMANDS_RELOAD_LOCALES_CRETURE_TEXT, true, &HandleReloadLocalesCreatureTextCommand, "", NULL },
+ { "locales_gameobject", RBAC_PERM_COMMANDS_RELOAD_LOCALES_GAMEOBJECT, true, &HandleReloadLocalesGameobjectCommand, "", NULL },
+ { "locales_gossip_menu_option", RBAC_PERM_COMMANDS_RELOAD_LOCALES_GOSSIP_MENU_OPTION, true, &HandleReloadLocalesGossipMenuOptionCommand, "", NULL },
+ { "locales_item", RBAC_PERM_COMMANDS_RELOAD_LOCALES_ITEM, true, &HandleReloadLocalesItemCommand, "", NULL },
+ { "locales_item_set_name", RBAC_PERM_COMMANDS_RELOAD_LOCALES_ITEM_SET_NAME, true, &HandleReloadLocalesItemSetNameCommand, "", NULL },
+ { "locales_npc_text", RBAC_PERM_COMMANDS_RELOAD_LOCALES_NPC_TEXT, true, &HandleReloadLocalesNpcTextCommand, "", NULL },
+ { "locales_page_text", RBAC_PERM_COMMANDS_RELOAD_LOCALES_PAGE_TEXT, true, &HandleReloadLocalesPageTextCommand, "", NULL },
+ { "locales_points_of_interest", RBAC_PERM_COMMANDS_RELOAD_LOCALES_POINTS_OF_INTEREST, true, &HandleReloadLocalesPointsOfInterestCommand, "", NULL },
+ { "locales_quest", RBAC_PERM_COMMANDS_RELOAD_LOCALES_QUEST, true, &HandleReloadLocalesQuestCommand, "", NULL },
+ { "mail_level_reward", RBAC_PERM_COMMANDS_RELOAD_MAIL_LEVEL_REWARD, true, &HandleReloadMailLevelRewardCommand, "", NULL },
+ { "mail_loot_template", RBAC_PERM_COMMANDS_RELOAD_MAIL_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesMailCommand, "", NULL },
+ { "milling_loot_template", RBAC_PERM_COMMANDS_RELOAD_MILLING_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesMillingCommand, "", NULL },
+ { "npc_spellclick_spells", RBAC_PERM_COMMANDS_RELOAD_NPC_SPELLCLICK_SPELLS, true, &HandleReloadSpellClickSpellsCommand, "", NULL},
+ { "npc_trainer", RBAC_PERM_COMMANDS_RELOAD_NPC_TRAINER, true, &HandleReloadNpcTrainerCommand, "", NULL },
+ { "npc_vendor", RBAC_PERM_COMMANDS_RELOAD_NPC_VENDOR, true, &HandleReloadNpcVendorCommand, "", NULL },
+ { "page_text", RBAC_PERM_COMMANDS_RELOAD_PAGE_TEXT, true, &HandleReloadPageTextsCommand, "", NULL },
+ { "pickpocketing_loot_template", RBAC_PERM_COMMANDS_RELOAD_PICKPOCKETING_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesPickpocketingCommand, "", NULL},
+ { "points_of_interest", RBAC_PERM_COMMANDS_RELOAD_POINTS_OF_INTEREST, true, &HandleReloadPointsOfInterestCommand, "", NULL },
+ { "prospecting_loot_template", RBAC_PERM_COMMANDS_RELOAD_PROSPECTING_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesProspectingCommand, "", NULL },
+ { "quest_poi", RBAC_PERM_COMMANDS_RELOAD_QUEST_POI, true, &HandleReloadQuestPOICommand, "", NULL },
+ { "quest_template", RBAC_PERM_COMMANDS_RELOAD_QUEST_TEMPLATE, true, &HandleReloadQuestTemplateCommand, "", NULL },
+ { "rbac", RBAC_PERM_COMMANDS_RELOAD_RBAC, true, &HandleReloadRBACCommand, "", NULL },
+ { "reference_loot_template", RBAC_PERM_COMMANDS_RELOAD_REFERENCE_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesReferenceCommand, "", NULL },
+ { "reserved_name", RBAC_PERM_COMMANDS_RELOAD_RESERVED_NAME, true, &HandleReloadReservedNameCommand, "", NULL },
+ { "reputation_reward_rate", RBAC_PERM_COMMANDS_RELOAD_REPUTATION_REWARD_RATE, true, &HandleReloadReputationRewardRateCommand, "", NULL },
+ { "reputation_spillover_template", RBAC_PERM_COMMANDS_RELOAD_SPILLOVER_TEMPLATE, true, &HandleReloadReputationRewardRateCommand, "", NULL },
+ { "skill_discovery_template", RBAC_PERM_COMMANDS_RELOAD_SKILL_DISCOVERY_TEMPLATE, true, &HandleReloadSkillDiscoveryTemplateCommand, "", NULL },
+ { "skill_extra_item_template", RBAC_PERM_COMMANDS_RELOAD_SKILL_EXTRA_ITEM_TEMPLATE, true, &HandleReloadSkillExtraItemTemplateCommand, "", NULL },
+ { "skill_fishing_base_level", RBAC_PERM_COMMANDS_RELOAD_SKILL_FISHING_BASE_LEVEL, true, &HandleReloadSkillFishingBaseLevelCommand, "", NULL },
+ { "skinning_loot_template", RBAC_PERM_COMMANDS_RELOAD_SKINNING_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesSkinningCommand, "", NULL },
+ { "smart_scripts", RBAC_PERM_COMMANDS_RELOAD_SMART_SCRIPTS, true, &HandleReloadSmartScripts, "", NULL },
+ { "spell_required", RBAC_PERM_COMMANDS_RELOAD_SPELL_REQUIRED, true, &HandleReloadSpellRequiredCommand, "", NULL },
+ { "spell_area", RBAC_PERM_COMMANDS_RELOAD_SPELL_AREA, true, &HandleReloadSpellAreaCommand, "", NULL },
+ { "spell_bonus_data", RBAC_PERM_COMMANDS_RELOAD_SPELL_BONUS_DATA, true, &HandleReloadSpellBonusesCommand, "", NULL },
+ { "spell_group", RBAC_PERM_COMMANDS_RELOAD_SPELL_GROUP, true, &HandleReloadSpellGroupsCommand, "", NULL },
+ { "spell_learn_spell", RBAC_PERM_COMMANDS_RELOAD_SPELL_LEARN_SPELL, true, &HandleReloadSpellLearnSpellCommand, "", NULL },
+ { "spell_loot_template", RBAC_PERM_COMMANDS_RELOAD_SPELL_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesSpellCommand, "", NULL },
+ { "spell_linked_spell", RBAC_PERM_COMMANDS_RELOAD_SPELL_LINKED_SPELL, true, &HandleReloadSpellLinkedSpellCommand, "", NULL },
+ { "spell_pet_auras", RBAC_PERM_COMMANDS_RELOAD_SPELL_PET_AURAS, true, &HandleReloadSpellPetAurasCommand, "", NULL },
+ { "spell_proc_event", RBAC_PERM_COMMANDS_RELOAD_SPELL_PROC_EVENT, true, &HandleReloadSpellProcEventCommand, "", NULL },
+ { "spell_proc", RBAC_PERM_COMMANDS_RELOAD_SPELL_PROC, true, &HandleReloadSpellProcsCommand, "", NULL },
+ { "spell_scripts", RBAC_PERM_COMMANDS_RELOAD_SPELL_SCRIPTS, true, &HandleReloadSpellScriptsCommand, "", NULL },
+ { "spell_target_position", RBAC_PERM_COMMANDS_RELOAD_SPELL_TARGET_POSITION, true, &HandleReloadSpellTargetPositionCommand, "", NULL },
+ { "spell_threats", RBAC_PERM_COMMANDS_RELOAD_SPELL_THREATS, true, &HandleReloadSpellThreatsCommand, "", NULL },
+ { "spell_group_stack_rules", RBAC_PERM_COMMANDS_RELOAD_SPELL_GROUP_STACK_RULES, true, &HandleReloadSpellGroupStackRulesCommand, "", NULL },
+ { "trinity_string", RBAC_PERM_COMMANDS_RELOAD_TRINITY_STRING, true, &HandleReloadTrinityStringCommand, "", NULL },
+ { "warden_action", RBAC_PERM_COMMANDS_RELOAD_WARDEN_ACTION, true, &HandleReloadWardenactionCommand, "", NULL },
+ { "waypoint_scripts", RBAC_PERM_COMMANDS_RELOAD_WAYPOINT_SCRIPTS, true, &HandleReloadWpScriptsCommand, "", NULL },
+ { "waypoint_data", RBAC_PERM_COMMANDS_RELOAD_WAYPOINT_DATA, true, &HandleReloadWpCommand, "", NULL },
+ { "vehicle_accessory", RBAC_PERM_COMMANDS_RELOAD_VEHICLE_ACCESORY, true, &HandleReloadVehicleAccessoryCommand, "", NULL },
+ { "vehicle_template_accessory", RBAC_PERM_COMMANDS_RELOAD_VEHICLE_TEMPLATE_ACCESSORY, true, &HandleReloadVehicleTemplateAccessoryCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "reload", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", reloadCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "reload", RBAC_PERM_COMMANDS_RELOAD, true, NULL, "", reloadCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp
index 3c95ceae4be..9b0b19bc51c 100644
--- a/src/server/scripts/Commands/cs_reset.cpp
+++ b/src/server/scripts/Commands/cs_reset.cpp
@@ -39,19 +39,19 @@ public:
{
static ChatCommand resetCommandTable[] =
{
- { "achievements", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleResetAchievementsCommand, "", NULL },
- { "honor", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleResetHonorCommand, "", NULL },
- { "level", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleResetLevelCommand, "", NULL },
- { "spells", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleResetSpellsCommand, "", NULL },
- { "stats", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleResetStatsCommand, "", NULL },
- { "talents", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleResetTalentsCommand, "", NULL },
- { "all", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleResetAllCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "achievements", RBAC_PERM_COMMAND_RESET_ACHIEVEMENTS, true, &HandleResetAchievementsCommand, "", NULL },
+ { "honor", RBAC_PERM_COMMAND_RESET_HONOR, true, &HandleResetHonorCommand, "", NULL },
+ { "level", RBAC_PERM_COMMAND_RESET_LEVEL, true, &HandleResetLevelCommand, "", NULL },
+ { "spells", RBAC_PERM_COMMAND_RESET_SPELLS, true, &HandleResetSpellsCommand, "", NULL },
+ { "stats", RBAC_PERM_COMMAND_RESET_STATS, true, &HandleResetStatsCommand, "", NULL },
+ { "talents", RBAC_PERM_COMMAND_RESET_TALENTS, true, &HandleResetTalentsCommand, "", NULL },
+ { "all", RBAC_PERM_COMMAND_RESET_ALL, true, &HandleResetAllCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "reset", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", resetCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "reset", RBAC_PERM_COMMAND_RESET, true, NULL, "", resetCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_send.cpp b/src/server/scripts/Commands/cs_send.cpp
new file mode 100644
index 00000000000..5d50113249a
--- /dev/null
+++ b/src/server/scripts/Commands/cs_send.cpp
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Chat.h"
+#include "Language.h"
+#include "Pet.h"
+#include "Player.h"
+#include "ObjectMgr.h"
+#include "ScriptMgr.h"
+
+class send_commandscript : public CommandScript
+{
+public:
+ send_commandscript() : CommandScript("send_commandscript") { }
+
+ ChatCommand* GetCommands() const OVERRIDE
+ {
+ static ChatCommand sendCommandTable[] =
+ {
+ { "items", RBAC_PERM_COMMAND_SEND_ITEMS, true, &HandleSendItemsCommand, "", NULL },
+ { "mail", RBAC_PERM_COMMAND_SEND_MAIL, true, &HandleSendMailCommand, "", NULL },
+ { "message", RBAC_PERM_COMMAND_SEND_MESSAGE, true, &HandleSendMessageCommand, "", NULL },
+ { "money", RBAC_PERM_COMMAND_SEND_MONEY, true, &HandleSendMoneyCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "send", RBAC_PERM_COMMAND_SEND, false, NULL, "", sendCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ // Send mail by command
+ static bool HandleSendMailCommand(ChatHandler* handler, char const* args)
+ {
+ // format: name "subject text" "mail text"
+ Player* target;
+ uint64 targetGuid;
+ std::string targetName;
+ if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
+ return false;
+
+ char* tail1 = strtok(NULL, "");
+ if (!tail1)
+ return false;
+
+ char const* msgSubject = handler->extractQuotedArg(tail1);
+ if (!msgSubject)
+ return false;
+
+ char* tail2 = strtok(NULL, "");
+ if (!tail2)
+ return false;
+
+ char const* msgText = handler->extractQuotedArg(tail2);
+ if (!msgText)
+ return false;
+
+ // msgSubject, msgText isn't NUL after prev. check
+ std::string subject = msgSubject;
+ std::string text = msgText;
+
+ // from console show not existed sender
+ MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
+
+ /// @todo Fix poor design
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+ MailDraft(subject, text)
+ .SendMailTo(trans, MailReceiver(target, GUID_LOPART(targetGuid)), sender);
+
+ CharacterDatabase.CommitTransaction(trans);
+
+ std::string nameLink = handler->playerLink(targetName);
+ handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
+ return true;
+ }
+
+ // Send items by mail
+ static bool HandleSendItemsCommand(ChatHandler* handler, char const* args)
+ {
+ // format: name "subject text" "mail text" item1[:count1] item2[:count2] ... item12[:count12]
+ Player* receiver;
+ uint64 receiverGuid;
+ std::string receiverName;
+ if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName))
+ return false;
+
+ char* tail1 = strtok(NULL, "");
+ if (!tail1)
+ return false;
+
+ char const* msgSubject = handler->extractQuotedArg(tail1);
+ if (!msgSubject)
+ return false;
+
+ char* tail2 = strtok(NULL, "");
+ if (!tail2)
+ return false;
+
+ char const* msgText = handler->extractQuotedArg(tail2);
+ if (!msgText)
+ return false;
+
+ // msgSubject, msgText isn't NUL after prev. check
+ std::string subject = msgSubject;
+ std::string text = msgText;
+
+ // extract items
+ typedef std::pair<uint32, uint32> ItemPair;
+ typedef std::list< ItemPair > ItemPairs;
+ ItemPairs items;
+
+ // get all tail string
+ char* tail = strtok(NULL, "");
+
+ // get from tail next item str
+ while (char* itemStr = strtok(tail, " "))
+ {
+ // and get new tail
+ tail = strtok(NULL, "");
+
+ // parse item str
+ char const* itemIdStr = strtok(itemStr, ":");
+ char const* itemCountStr = strtok(NULL, " ");
+
+ uint32 itemId = atoi(itemIdStr);
+ if (!itemId)
+ return false;
+
+ ItemTemplate const* item_proto = sObjectMgr->GetItemTemplate(itemId);
+ if (!item_proto)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 itemCount = itemCountStr ? atoi(itemCountStr) : 1;
+ if (itemCount < 1 || (item_proto->MaxCount > 0 && itemCount > uint32(item_proto->MaxCount)))
+ {
+ handler->PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, itemCount, itemId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ while (itemCount > item_proto->GetMaxStackSize())
+ {
+ items.push_back(ItemPair(itemId, item_proto->GetMaxStackSize()));
+ itemCount -= item_proto->GetMaxStackSize();
+ }
+
+ items.push_back(ItemPair(itemId, itemCount));
+
+ if (items.size() > MAX_MAIL_ITEMS)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_MAIL_ITEMS_LIMIT, MAX_MAIL_ITEMS);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ // from console show not existed sender
+ MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
+
+ // fill mail
+ MailDraft draft(subject, text);
+
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+
+ for (ItemPairs::const_iterator itr = items.begin(); itr != items.end(); ++itr)
+ {
+ if (Item* item = Item::CreateItem(itr->first, itr->second, handler->GetSession() ? handler->GetSession()->GetPlayer() : 0))
+ {
+ item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted
+ draft.AddItem(item);
+ }
+ }
+
+ draft.SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender);
+ CharacterDatabase.CommitTransaction(trans);
+
+ std::string nameLink = handler->playerLink(receiverName);
+ handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
+ return true;
+ }
+ /// Send money by mail
+ static bool HandleSendMoneyCommand(ChatHandler* handler, char const* args)
+ {
+ /// format: name "subject text" "mail text" money
+
+ Player* receiver;
+ uint64 receiverGuid;
+ std::string receiverName;
+ if (!handler->extractPlayerTarget((char*)args, &receiver, &receiverGuid, &receiverName))
+ return false;
+
+ char* tail1 = strtok(NULL, "");
+ if (!tail1)
+ return false;
+
+ char* msgSubject = handler->extractQuotedArg(tail1);
+ if (!msgSubject)
+ return false;
+
+ char* tail2 = strtok(NULL, "");
+ if (!tail2)
+ return false;
+
+ char* msgText = handler->extractQuotedArg(tail2);
+ if (!msgText)
+ return false;
+
+ char* moneyStr = strtok(NULL, "");
+ int32 money = moneyStr ? atoi(moneyStr) : 0;
+ if (money <= 0)
+ return false;
+
+ // msgSubject, msgText isn't NUL after prev. check
+ std::string subject = msgSubject;
+ std::string text = msgText;
+
+ // from console show not existed sender
+ MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUIDLow() : 0, MAIL_STATIONERY_GM);
+
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+
+ MailDraft(subject, text)
+ .AddMoney(money)
+ .SendMailTo(trans, MailReceiver(receiver, GUID_LOPART(receiverGuid)), sender);
+
+ CharacterDatabase.CommitTransaction(trans);
+
+ std::string nameLink = handler->playerLink(receiverName);
+ handler->PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str());
+ return true;
+ }
+ /// Send a message to a player in game
+ static bool HandleSendMessageCommand(ChatHandler* handler, char const* args)
+ {
+ /// - Find the player
+ Player* player;
+ if (!handler->extractPlayerTarget((char*)args, &player))
+ return false;
+
+ char* msgStr = strtok(NULL, "");
+ if (!msgStr)
+ return false;
+
+ ///- Check that he is not logging out.
+ if (player->GetSession()->isLogingOut())
+ {
+ handler->SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ /// - Send the message
+ // Use SendAreaTriggerMessage for fastest delivery.
+ player->GetSession()->SendAreaTriggerMessage("%s", msgStr);
+ player->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
+
+ // Confirmation message
+ std::string nameLink = handler->GetNameLink(player);
+ handler->PSendSysMessage(LANG_SENDMESSAGE, nameLink.c_str(), msgStr);
+
+ return true;
+ }
+};
+
+void AddSC_send_commandscript()
+{
+ new send_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp
index 34543a1a4a5..71f232d33a6 100644
--- a/src/server/scripts/Commands/cs_server.cpp
+++ b/src/server/scripts/Commands/cs_server.cpp
@@ -39,60 +39,60 @@ public:
{
static ChatCommand serverIdleRestartCommandTable[] =
{
- { "cancel", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerShutDownCancelCommand, "", NULL },
- { "" , RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerIdleRestartCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "cancel", RBAC_PERM_COMMAND_SERVER_IDLERESTART_CANCEL, true, &HandleServerShutDownCancelCommand, "", NULL },
+ { "" , RBAC_PERM_COMMAND_SERVER_IDLERESTART, true, &HandleServerIdleRestartCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand serverIdleShutdownCommandTable[] =
{
- { "cancel", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerShutDownCancelCommand, "", NULL },
- { "" , RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerIdleShutDownCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "cancel", RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN_CANCEL, true, &HandleServerShutDownCancelCommand, "", NULL },
+ { "" , RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN, true, &HandleServerIdleShutDownCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand serverRestartCommandTable[] =
{
- { "cancel", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerShutDownCancelCommand, "", NULL },
- { "" , RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerRestartCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "cancel", RBAC_PERM_COMMAND_SERVER_RESTART_CANCEL, true, &HandleServerShutDownCancelCommand, "", NULL },
+ { "" , RBAC_PERM_COMMAND_SERVER_RESTART, true, &HandleServerRestartCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand serverShutdownCommandTable[] =
{
- { "cancel", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerShutDownCancelCommand, "", NULL },
- { "" , RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerShutDownCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "cancel", RBAC_PERM_COMMAND_SERVER_SHUTDOWN_CANCEL, true, &HandleServerShutDownCancelCommand, "", NULL },
+ { "" , RBAC_PERM_COMMAND_SERVER_SHUTDOWN, true, &HandleServerShutDownCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand serverSetCommandTable[] =
{
- { "difftime", RBAC_PERM_CONSOLE_COMMANDS, true, &HandleServerSetDiffTimeCommand, "", NULL },
- { "loglevel", RBAC_PERM_CONSOLE_COMMANDS, true, &HandleServerSetLogLevelCommand, "", NULL },
- { "motd", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerSetMotdCommand, "", NULL },
- { "closed", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerSetClosedCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "difftime", RBAC_PERM_COMMAND_SERVER_SET_DIFFTIME, true, &HandleServerSetDiffTimeCommand, "", NULL },
+ { "loglevel", RBAC_PERM_COMMAND_SERVER_SET_LOGLEVEL, true, &HandleServerSetLogLevelCommand, "", NULL },
+ { "motd", RBAC_PERM_COMMAND_SERVER_SET_MOTD, true, &HandleServerSetMotdCommand, "", NULL },
+ { "closed", RBAC_PERM_COMMAND_SERVER_SET_CLOSED, true, &HandleServerSetClosedCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand serverCommandTable[] =
{
- { "corpses", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleServerCorpsesCommand, "", NULL },
- { "exit", RBAC_PERM_CONSOLE_COMMANDS, true, &HandleServerExitCommand, "", NULL },
- { "idlerestart", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", serverIdleRestartCommandTable },
- { "idleshutdown", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", serverIdleShutdownCommandTable },
- { "info", RBAC_PERM_PLAYER_COMMANDS, true, &HandleServerInfoCommand, "", NULL },
- { "motd", RBAC_PERM_PLAYER_COMMANDS, true, &HandleServerMotdCommand, "", NULL },
- { "plimit", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleServerPLimitCommand, "", NULL },
- { "restart", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", serverRestartCommandTable },
- { "shutdown", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", serverShutdownCommandTable },
- { "set", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", serverSetCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "corpses", RBAC_PERM_COMMAND_SERVER_CORPSES, true, &HandleServerCorpsesCommand, "", NULL },
+ { "exit", RBAC_PERM_COMMAND_SERVER_EXIT, true, &HandleServerExitCommand, "", NULL },
+ { "idlerestart", RBAC_PERM_COMMAND_SERVER_IDLERESTART, true, NULL, "", serverIdleRestartCommandTable },
+ { "idleshutdown", RBAC_PERM_COMMAND_SERVER_IDLESHUTDOWN, true, NULL, "", serverIdleShutdownCommandTable },
+ { "info", RBAC_PERM_COMMAND_SERVER_INFO, true, &HandleServerInfoCommand, "", NULL },
+ { "motd", RBAC_PERM_COMMAND_SERVER_MOTD, true, &HandleServerMotdCommand, "", NULL },
+ { "plimit", RBAC_PERM_COMMAND_SERVER_PLIMIT, true, &HandleServerPLimitCommand, "", NULL },
+ { "restart", RBAC_PERM_COMMAND_SERVER_RESTART, true, NULL, "", serverRestartCommandTable },
+ { "shutdown", RBAC_PERM_COMMAND_SERVER_SHUTDOWN, true, NULL, "", serverShutdownCommandTable },
+ { "set", RBAC_PERM_COMMAND_SERVER_SET, true, NULL, "", serverSetCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "server", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, NULL, "", serverCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "server", RBAC_PERM_COMMAND_SERVER, true, NULL, "", serverCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp
index 9dc013a995f..dec9895af26 100644
--- a/src/server/scripts/Commands/cs_tele.cpp
+++ b/src/server/scripts/Commands/cs_tele.cpp
@@ -39,17 +39,17 @@ public:
{
static ChatCommand teleCommandTable[] =
{
- { "add", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleTeleAddCommand, "", NULL },
- { "del", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleTeleDelCommand, "", NULL },
- { "name", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleTeleNameCommand, "", NULL },
- { "group", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleTeleGroupCommand, "", NULL },
- { "", RBAC_PERM_MODERATOR_COMMANDS, false, &HandleTeleCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "add", RBAC_PERM_COMMAND_TELE_ADD, false, &HandleTeleAddCommand, "", NULL },
+ { "del", RBAC_PERM_COMMAND_TELE_DEL, true, &HandleTeleDelCommand, "", NULL },
+ { "name", RBAC_PERM_COMMAND_TELE_NAME, true, &HandleTeleNameCommand, "", NULL },
+ { "group", RBAC_PERM_COMMAND_TELE_GROUP, false, &HandleTeleGroupCommand, "", NULL },
+ { "", RBAC_PERM_COMMAND_TELE, false, &HandleTeleCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "tele", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", teleCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "tele", RBAC_PERM_COMMAND_TELE, false, NULL, "", teleCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp
index 5c1ce304723..1c60a8143b4 100644
--- a/src/server/scripts/Commands/cs_ticket.cpp
+++ b/src/server/scripts/Commands/cs_ticket.cpp
@@ -40,34 +40,34 @@ public:
{
static ChatCommand ticketResponseCommandTable[] =
{
- { "append", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketResponseAppendCommand, "", NULL },
- { "appendln", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketResponseAppendLnCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "append", RBAC_PERM_COMMAND_TICKET_RESPONSE_APPEND, true, &HandleGMTicketResponseAppendCommand, "", NULL },
+ { "appendln", RBAC_PERM_COMMAND_TICKET_RESPONSE_APPENDLN, true, &HandleGMTicketResponseAppendLnCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand ticketCommandTable[] =
{
- { "assign", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGMTicketAssignToCommand, "", NULL },
- { "close", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketCloseByIdCommand, "", NULL },
- { "closedlist", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketListClosedCommand, "", NULL },
- { "comment", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketCommentCommand, "", NULL },
- { "complete", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketCompleteCommand, "", NULL },
- { "delete", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleGMTicketDeleteByIdCommand, "", NULL },
- { "escalate", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketEscalateCommand, "", NULL },
- { "escalatedlist", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGMTicketListEscalatedCommand, "", NULL },
- { "list", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketListCommand, "", NULL },
- { "onlinelist", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketListOnlineCommand, "", NULL },
- { "reset", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleGMTicketResetCommand, "", NULL },
- { "response", RBAC_PERM_MODERATOR_COMMANDS, true, NULL, "", ticketResponseCommandTable },
- { "togglesystem", RBAC_PERM_ADMINISTRATOR_COMMANDS, true, &HandleToggleGMTicketSystem, "", NULL },
- { "unassign", RBAC_PERM_GAMEMASTER_COMMANDS, true, &HandleGMTicketUnAssignCommand, "", NULL },
- { "viewid", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketGetByIdCommand, "", NULL },
- { "viewname", RBAC_PERM_MODERATOR_COMMANDS, true, &HandleGMTicketGetByNameCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "assign", RBAC_PERM_COMMAND_TICKET_ASSIGN, true, &HandleGMTicketAssignToCommand, "", NULL },
+ { "close", RBAC_PERM_COMMAND_TICKET_CLOSE, true, &HandleGMTicketCloseByIdCommand, "", NULL },
+ { "closedlist", RBAC_PERM_COMMAND_TICKET_CLOSEDLIST, true, &HandleGMTicketListClosedCommand, "", NULL },
+ { "comment", RBAC_PERM_COMMAND_TICKET_COMMENT, true, &HandleGMTicketCommentCommand, "", NULL },
+ { "complete", RBAC_PERM_COMMAND_TICKET_COMPLETE, true, &HandleGMTicketCompleteCommand, "", NULL },
+ { "delete", RBAC_PERM_COMMAND_TICKET_DELETE, true, &HandleGMTicketDeleteByIdCommand, "", NULL },
+ { "escalate", RBAC_PERM_COMMAND_TICKET_ESCALATE, true, &HandleGMTicketEscalateCommand, "", NULL },
+ { "escalatedlist", RBAC_PERM_COMMAND_TICKET_ESCALATEDLIST, true, &HandleGMTicketListEscalatedCommand, "", NULL },
+ { "list", RBAC_PERM_COMMAND_TICKET_LIST, true, &HandleGMTicketListCommand, "", NULL },
+ { "onlinelist", RBAC_PERM_COMMAND_TICKET_ONLINELIST, true, &HandleGMTicketListOnlineCommand, "", NULL },
+ { "reset", RBAC_PERM_COMMAND_TICKET_RESET, true, &HandleGMTicketResetCommand, "", NULL },
+ { "response", RBAC_PERM_COMMAND_TICKET_RESPONSE, true, NULL, "", ticketResponseCommandTable },
+ { "togglesystem", RBAC_PERM_COMMAND_TICKET_TOGGLESYSTEM, true, &HandleToggleGMTicketSystem, "", NULL },
+ { "unassign", RBAC_PERM_COMMAND_TICKET_UNASSIGN, true, &HandleGMTicketUnAssignCommand, "", NULL },
+ { "viewid", RBAC_PERM_COMMAND_TICKET_VIEWID, true, &HandleGMTicketGetByIdCommand, "", NULL },
+ { "viewname", RBAC_PERM_COMMAND_TICKET_VIEWNAME, true, &HandleGMTicketGetByNameCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "ticket", RBAC_PERM_MODERATOR_COMMANDS, false, NULL, "", ticketCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "ticket", RBAC_PERM_COMMAND_TICKET, false, NULL, "", ticketCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp
index 1ffb7206f68..f6fd3170bbc 100644
--- a/src/server/scripts/Commands/cs_titles.cpp
+++ b/src/server/scripts/Commands/cs_titles.cpp
@@ -37,21 +37,21 @@ public:
{
static ChatCommand titlesSetCommandTable[] =
{
- { "mask", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleTitlesSetMaskCommand, "", NULL },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "mask", RBAC_PERM_COMMAND_TITLES_SET_MASK, false, &HandleTitlesSetMaskCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand titlesCommandTable[] =
{
- { "add", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleTitlesAddCommand, "", NULL },
- { "current", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleTitlesCurrentCommand, "", NULL },
- { "remove", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleTitlesRemoveCommand, "", NULL },
- { "set", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", titlesSetCommandTable },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "add", RBAC_PERM_COMMAND_TITLES_ADD, false, &HandleTitlesAddCommand, "", NULL },
+ { "current", RBAC_PERM_COMMAND_TITLES_CURRENT, false, &HandleTitlesCurrentCommand, "", NULL },
+ { "remove", RBAC_PERM_COMMAND_TITLES_REMOVE, false, &HandleTitlesRemoveCommand, "", NULL },
+ { "set", RBAC_PERM_COMMAND_TITLES_SET, false, NULL, "", titlesSetCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "titles", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", titlesCommandTable },
- { NULL, RBAC_PERM_PLAYER_COMMANDS, false, NULL, "", NULL }
+ { "titles", RBAC_PERM_COMMAND_TITLES, false, NULL, "", titlesCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp
index 834c0e1b266..b1b6030a892 100644
--- a/src/server/scripts/Commands/cs_wp.cpp
+++ b/src/server/scripts/Commands/cs_wp.cpp
@@ -38,19 +38,19 @@ public:
{
static ChatCommand wpCommandTable[] =
{
- { "add", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleWpAddCommand, "", NULL },
- { "event", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleWpEventCommand, "", NULL },
- { "load", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleWpLoadCommand, "", NULL },
- { "modify", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleWpModifyCommand, "", NULL },
- { "unload", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleWpUnLoadCommand, "", NULL },
- { "reload", RBAC_PERM_ADMINISTRATOR_COMMANDS, false, &HandleWpReloadCommand, "", NULL },
- { "show", RBAC_PERM_GAMEMASTER_COMMANDS, false, &HandleWpShowCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
+ { "add", RBAC_PERM_COMMAND_WP_ADD, false, &HandleWpAddCommand, "", NULL },
+ { "event", RBAC_PERM_COMMAND_WP_EVENT, false, &HandleWpEventCommand, "", NULL },
+ { "load", RBAC_PERM_COMMAND_WP_LOAD, false, &HandleWpLoadCommand, "", NULL },
+ { "modify", RBAC_PERM_COMMAND_WP_MODIFY, false, &HandleWpModifyCommand, "", NULL },
+ { "unload", RBAC_PERM_COMMAND_WP_UNLOAD, false, &HandleWpUnLoadCommand, "", NULL },
+ { "reload", RBAC_PERM_COMMAND_WP_RELOAD, false, &HandleWpReloadCommand, "", NULL },
+ { "show", RBAC_PERM_COMMAND_WP_SHOW, false, &HandleWpShowCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "wp", RBAC_PERM_GAMEMASTER_COMMANDS, false, NULL, "", wpCommandTable },
- { NULL, 0, false, NULL, "", NULL }
+ { "wp", RBAC_PERM_COMMAND_WP, false, NULL, "", wpCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
return commandTable;
}
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
index 382a0002065..ab1367ed684 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
@@ -311,6 +311,23 @@ public:
{
npc_highlord_darion_mograineAI(Creature* creature) : npc_escortAI(creature)
{
+ uiTirionGUID = 0;
+ uiKorfaxGUID = 0;
+ uiMaxwellGUID = 0;
+ uiEligorGUID = 0;
+ uiRayneGUID = 0;
+ uiKoltiraGUID = 0;
+ uiOrbazGUID = 0;
+ uiThassarianGUID = 0;
+ uiLichKingGUID = 0;
+
+ memset(uiDefenderGUID, 0, sizeof(uiDefenderGUID));
+ memset(uiEarthshatterGUID, 0, sizeof(uiEarthshatterGUID));
+ memset(uiAbominationGUID, 0, sizeof(uiAbominationGUID));
+ memset(uiBehemothGUID, 0, sizeof(uiBehemothGUID));
+ memset(uiGhoulGUID, 0, sizeof(uiGhoulGUID));
+ memset(uiWarriorGUID, 0, sizeof(uiWarriorGUID));
+
Reset();
}
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index 11ee7b0e409..7561d1c4991 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -1620,16 +1620,16 @@ class spell_halion_clear_debuffs : public SpellScriptLoader
class TwilightCutterSelector
{
public:
- TwilightCutterSelector(Unit* caster, Unit* cutterCaster) : _caster(caster), _cutterCaster(cutterCaster) {}
+ TwilightCutterSelector(Unit* caster, Unit* target) : _caster(caster), _channelTarget(target) {}
bool operator()(WorldObject* unit)
{
- return !unit->IsInBetween(_caster, _cutterCaster, 4.0f);
+ return !unit->IsInBetween(_caster, _channelTarget, 4.0f);
}
private:
Unit* _caster;
- Unit* _cutterCaster;
+ Unit* _channelTarget;
};
class spell_halion_twilight_cutter : public SpellScriptLoader
@@ -1647,13 +1647,10 @@ class spell_halion_twilight_cutter : public SpellScriptLoader
return;
Unit* caster = GetCaster();
- if (Aura* cutter = caster->GetAura(SPELL_TWILIGHT_CUTTER))
+ if (Unit* channelTarget = ObjectAccessor::GetUnit(*caster, caster->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT)))
{
- if (Unit* cutterCaster = cutter->GetCaster())
- {
- unitList.remove_if(TwilightCutterSelector(caster, cutterCaster));
- return;
- }
+ unitList.remove_if(TwilightCutterSelector(caster, channelTarget));
+ return;
}
// In case cutter caster werent found for some reason
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 84da194aa2d..987807c2080 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -990,12 +990,15 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
lichking->SetReactState(REACT_PASSIVE);
lichking->Attack(me,true);
}
- if (Creature* walltarget = me->SummonCreature(NPC_ICE_WALL, IceWalls[_icewall].GetPositionX(), IceWalls[_icewall].GetPositionY(), IceWalls[_icewall].GetPositionZ(), IceWalls[_icewall].GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 720000))
+ if (_icewall < 4)
{
- _walltargetGUID = walltarget->GetGUID();
- walltarget->AI()->DoCast(walltarget, SPELL_SUMMON_ICE_WALL);
- walltarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- me->Attack(walltarget,false);
+ if (Creature* walltarget = me->SummonCreature(NPC_ICE_WALL, IceWalls[_icewall].GetPositionX(), IceWalls[_icewall].GetPositionY(), IceWalls[_icewall].GetPositionZ(), IceWalls[_icewall].GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 720000))
+ {
+ _walltargetGUID = walltarget->GetGUID();
+ walltarget->AI()->DoCast(walltarget, SPELL_SUMMON_ICE_WALL);
+ walltarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
+ me->Attack(walltarget,false);
+ }
}
_events.ScheduleEvent(EVENT_ESCAPE_20, 3000);
break;
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
index 4bb989bf2e4..20b7d39815f 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
@@ -23,26 +23,26 @@
enum Yells
{
- SAY_AGGRO = 0,
- SAY_PHASE2 = 1,
- SAY_PHASE3 = 2,
- SAY_DEATH = 3,
- SAY_SLAY = 4,
- SAY_THROW_SARONITE = 5,
- SAY_CAST_DEEP_FREEZE = 6,
-
- SAY_TYRANNUS_DEATH = 0
+ SAY_AGGRO = 0,
+ SAY_PHASE2 = 1,
+ SAY_PHASE3 = 2,
+ SAY_DEATH = 3,
+ SAY_SLAY = 4,
+ SAY_THROW_SARONITE = 5,
+ SAY_CAST_DEEP_FREEZE = 6,
+
+ SAY_TYRANNUS_DEATH = 0
};
enum Spells
{
- SPELL_PERMAFROST = 70326,
- SPELL_THROW_SARONITE = 68788,
- SPELL_THUNDERING_STOMP = 68771,
- SPELL_CHILLING_WAVE = 68778,
- SPELL_DEEP_FREEZE = 70381,
- SPELL_FORGE_MACE = 68785,
- SPELL_FORGE_BLADE = 68774,
+ SPELL_PERMAFROST = 70326,
+ SPELL_THROW_SARONITE = 68788,
+ SPELL_THUNDERING_STOMP = 68771,
+ SPELL_CHILLING_WAVE = 68778,
+ SPELL_DEEP_FREEZE = 70381,
+ SPELL_FORGE_MACE = 68785,
+ SPELL_FORGE_BLADE = 68774
};
#define SPELL_PERMAFROST_HELPER RAID_MODE<uint32>(68786, 70336)
@@ -50,9 +50,9 @@ enum Spells
enum Phases
{
- PHASE_ONE = 1,
- PHASE_TWO = 2,
- PHASE_THREE = 3
+ PHASE_ONE = 1,
+ PHASE_TWO = 2,
+ PHASE_THREE = 3
};
enum MiscData
@@ -60,58 +60,45 @@ enum MiscData
EQUIP_ID_SWORD = 49345,
EQUIP_ID_MACE = 49344,
ACHIEV_DOESNT_GO_TO_ELEVEN = 0,
- POINT_FORGE = 0,
+ POINT_FORGE = 0
};
-Position const northForgePos = {722.5643f, -234.1615f, 527.182f, 2.16421f};
-Position const southForgePos = {639.257f, -210.1198f, 529.015f, 0.523599f};
-
-class boss_garfrost : public CreatureScript
-{
enum Events
{
- EVENT_THROW_SARONITE = 1,
- EVENT_CHILLING_WAVE = 2,
- EVENT_DEEP_FREEZE = 3,
- EVENT_JUMP = 4,
- EVENT_FORGING = 5,
- EVENT_RESUME_ATTACK = 6,
+ EVENT_THROW_SARONITE = 1,
+ EVENT_CHILLING_WAVE = 2,
+ EVENT_DEEP_FREEZE = 3,
+ EVENT_FORGE_JUMP = 4,
+ EVENT_RESUME_ATTACK = 5
};
+
+Position const northForgePos = { 722.5643f, -234.1615f, 527.182f, 2.16421f };
+Position const southForgePos = { 639.257f, -210.1198f, 529.015f, 0.523599f };
+
+class boss_garfrost : public CreatureScript
+{
public:
boss_garfrost() : CreatureScript("boss_garfrost") { }
struct boss_garfrostAI : public BossAI
{
- boss_garfrostAI(Creature* creature) : BossAI(creature, DATA_GARFROST)
- {
- }
-
- void InitializeAI() OVERRIDE
- {
- if (!instance || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(PoSScriptName))
- me->IsAIEnabled = false;
- else if (!me->isDead())
- Reset();
- }
+ boss_garfrostAI(Creature* creature) : BossAI(creature, DATA_GARFROST) { }
void Reset() OVERRIDE
{
- events.Reset();
+ _Reset();
events.SetPhase(PHASE_ONE);
SetEquipmentSlots(true);
_permafrostStack = 0;
-
- instance->SetBossState(DATA_GARFROST, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
+ _EnterCombat();
Talk(SAY_AGGRO);
DoCast(me, SPELL_PERMAFROST);
me->CallForHelp(70.0f);
events.ScheduleEvent(EVENT_THROW_SARONITE, 7000);
-
- instance->SetBossState(DATA_GARFROST, IN_PROGRESS);
}
void KilledUnit(Unit* victim) OVERRIDE
@@ -122,12 +109,11 @@ enum Events
void JustDied(Unit* /*killer*/) OVERRIDE
{
+ _JustDied();
Talk(SAY_DEATH);
if (Creature* tyrannus = me->GetCreature(*me, instance->GetData64(DATA_TYRANNUS)))
tyrannus->AI()->Talk(SAY_TYRANNUS_DEATH);
-
- instance->SetBossState(DATA_GARFROST, DONE);
}
void DamageTaken(Unit* /*attacker*/, uint32& /*uiDamage*/) OVERRIDE
@@ -138,7 +124,7 @@ enum Events
Talk(SAY_PHASE2);
events.DelayEvents(8000);
DoCast(me, SPELL_THUNDERING_STOMP);
- events.ScheduleEvent(EVENT_JUMP, 1500);
+ events.ScheduleEvent(EVENT_FORGE_JUMP, 1500);
return;
}
@@ -148,7 +134,7 @@ enum Events
Talk(SAY_PHASE3);
events.DelayEvents(8000);
DoCast(me, SPELL_THUNDERING_STOMP);
- events.ScheduleEvent(EVENT_JUMP, 1500);
+ events.ScheduleEvent(EVENT_FORGE_JUMP, 1500);
return;
}
}
@@ -220,15 +206,15 @@ enum Events
}
events.ScheduleEvent(EVENT_DEEP_FREEZE, 35000, 0, PHASE_THREE);
break;
- case EVENT_JUMP:
+ case EVENT_FORGE_JUMP:
me->AttackStop();
if (events.IsInPhase(PHASE_TWO))
- me->GetMotionMaster()->MoveJump(northForgePos.GetPositionX(), northForgePos.GetPositionY(), northForgePos.GetPositionZ(), 25.0f, 15.0f);
+ me->GetMotionMaster()->MoveJump(northForgePos, 25.0f, 15.0f, POINT_FORGE);
else if (events.IsInPhase(PHASE_THREE))
- me->GetMotionMaster()->MoveJump(southForgePos.GetPositionX(), southForgePos.GetPositionY(), southForgePos.GetPositionZ(), 25.0f, 15.0f);
+ me->GetMotionMaster()->MoveJump(southForgePos, 25.0f, 15.0f, POINT_FORGE);
break;
case EVENT_RESUME_ATTACK:
- if (events.IsInPhase(PHASE_THREE))
+ if (events.IsInPhase(PHASE_TWO))
events.ScheduleEvent(EVENT_CHILLING_WAVE, 5000, 0, PHASE_TWO);
else if (events.IsInPhase(PHASE_THREE))
events.ScheduleEvent(EVENT_DEEP_FREEZE, 10000, 0, PHASE_THREE);
@@ -248,7 +234,7 @@ enum Events
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_garfrostAI(creature);
+ return GetPitOfSaronAI<boss_garfrostAI>(creature);
}
};
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
index b738f0c9358..3b3f65c7704 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
@@ -42,7 +42,7 @@ enum Spells
SPELL_STRANGULATING = 69413, //krick's selfcast in intro
SPELL_SUICIDE = 7,
SPELL_KRICK_KILL_CREDIT = 71308,
- SPELL_NECROMANTIC_POWER = 69753,
+ SPELL_NECROMANTIC_POWER = 69753
};
enum Yells
@@ -71,7 +71,7 @@ enum Yells
SAY_SYLVANAS_OUTRO_4 = 1,
SAY_SYLVANAS_OUTRO_10 = 2,
SAY_TYRANNUS_OUTRO_7 = 1,
- SAY_TYRANNUS_OUTRO_9 = 2,
+ SAY_TYRANNUS_OUTRO_9 = 2
};
enum Events
@@ -98,24 +98,24 @@ enum Events
EVENT_OUTRO_11 = 18,
EVENT_OUTRO_12 = 19,
EVENT_OUTRO_13 = 20,
- EVENT_OUTRO_END = 21,
+ EVENT_OUTRO_END = 21
};
enum KrickPhase
{
PHASE_COMBAT = 1,
- PHASE_OUTRO = 2,
+ PHASE_OUTRO = 2
};
enum Actions
{
- ACTION_OUTRO = 1,
+ ACTION_OUTRO = 1
};
enum Points
{
POINT_KRICK_INTRO = 364770,
- POINT_KRICK_DEATH = 364771,
+ POINT_KRICK_DEATH = 364771
};
static const Position outroPos[8] =
@@ -127,7 +127,7 @@ static const Position outroPos[8] =
{835.5887f, 139.4345f, 530.9526f, 0.0000000f}, // Tyrannus fly down Position (not sniffed)
{828.9342f, 118.6247f, 514.5190f, 0.0000000f}, // Krick's Choke Position
{828.9342f, 118.6247f, 509.4958f, 0.0000000f}, // Kirck's Death Position
- {914.4820f, 143.1602f, 633.3624f, 0.0000000f}, // Tyrannus fly up (not sniffed)
+ {914.4820f, 143.1602f, 633.3624f, 0.0000000f} // Tyrannus fly up (not sniffed)
};
class boss_ick : public CreatureScript
@@ -142,14 +142,6 @@ class boss_ick : public CreatureScript
ASSERT(_vehicle);
}
- void InitializeAI() OVERRIDE
- {
- if (!instance || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(PoSScriptName))
- me->IsAIEnabled = false;
- else if (!me->isDead())
- Reset();
- }
-
void Reset() OVERRIDE
{
events.Reset();
@@ -163,6 +155,8 @@ class boss_ick : public CreatureScript
void EnterCombat(Unit* /*who*/) OVERRIDE
{
+ _EnterCombat();
+
if (Creature* krick = GetKrick())
krick->AI()->Talk(SAY_KRICK_AGGRO);
@@ -170,8 +164,6 @@ class boss_ick : public CreatureScript
events.ScheduleEvent(EVENT_TOXIC_WASTE, 5000);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 10000);
events.ScheduleEvent(EVENT_SPECIAL, urand(30000, 35000));
-
- instance->SetBossState(DATA_ICK, IN_PROGRESS);
}
void EnterEvadeMode() OVERRIDE
@@ -281,7 +273,7 @@ class boss_ick : public CreatureScript
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_ickAI(creature);
+ return GetPitOfSaronAI<boss_ickAI>(creature);
}
};
@@ -296,14 +288,6 @@ class boss_krick : public CreatureScript
{
}
- void InitializeAI() OVERRIDE
- {
- if (!_instanceScript || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(PoSScriptName))
- me->IsAIEnabled = false;
- else if (!me->isDead())
- Reset();
- }
-
void Reset() OVERRIDE
{
_events.Reset();
@@ -509,7 +493,7 @@ class boss_krick : public CreatureScript
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_krickAI(creature);
+ return GetPitOfSaronAI<boss_krickAI>(creature);
}
};
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
index a789d0c6a70..7aa8b123f98 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
@@ -41,7 +41,7 @@ class instance_pit_of_saron : public InstanceMapScript
{
instance_pit_of_saron_InstanceScript(Map* map) : InstanceScript(map)
{
- SetBossNumber(MAX_ENCOUNTER);
+ SetBossNumber(EncounterCount);
LoadDoorData(Doors);
_garfrostGUID = 0;
_krickGUID = 0;
@@ -292,7 +292,7 @@ class instance_pit_of_saron : public InstanceMapScript
if (dataHead1 == 'P' && dataHead2 == 'S')
{
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ for (uint8 i = 0; i < EncounterCount; ++i)
{
uint32 tmpState;
loadStream >> tmpState;
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
index a9b88ca3066..e7a3b069ce3 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
@@ -15,14 +15,12 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_PIT_OF_SARON_H
-#define DEF_PIT_OF_SARON_H
-
-#include "Map.h"
-#include "Creature.h"
+#ifndef PIT_OF_SARON_H_
+#define PIT_OF_SARON_H_
#define PoSScriptName "instance_pit_of_saron"
-#define MAX_ENCOUNTER 3
+
+uint32 const EncounterCount = 3;
enum DataTypes
{
@@ -37,7 +35,7 @@ enum DataTypes
DATA_JAINA_SYLVANAS_1 = 5, // GUID of either Jaina or Sylvanas part 1, depending on team, as it's the same spawn.
DATA_JAINA_SYLVANAS_2 = 6, // GUID of either Jaina or Sylvanas part 2, depending on team, as it's the same spawn.
DATA_TYRANNUS_EVENT = 7,
- DATA_TEAM_IN_INSTANCE = 8,
+ DATA_TEAM_IN_INSTANCE = 8
};
enum CreatureIds
@@ -94,17 +92,13 @@ enum GameObjectIds
{
GO_SARONITE_ROCK = 196485,
GO_ICE_WALL = 201885,
- GO_HALLS_OF_REFLECTION_PORTCULLIS = 201848,
+ GO_HALLS_OF_REFLECTION_PORTCULLIS = 201848
};
template<class AI>
AI* GetPitOfSaronAI(Creature* creature)
{
- if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
- if (instance->GetInstanceScript())
- if (instance->GetScriptId() == sObjectMgr->GetScriptId(PoSScriptName))
- return new AI(creature);
- return NULL;
+ return GetInstanceAI<AI>(creature, PoSScriptName);
}
-#endif
+#endif // PIT_OF_SARON_H_
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
index 107b95c5990..bdab8f3fce6 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
@@ -157,7 +157,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
events.ScheduleEvent(EVENT_TWILIGHT_BLOODBOLT, urand(20000, 25000), EVENT_GROUP_NORMAL);
events.ScheduleEvent(EVENT_AIR_PHASE, 124000 + uint32(Is25ManRaid() ? 3000 : 0));
CleanAuras();
- _offtank = NULL;
+ _offtankGUID = 0;
_vampires.clear();
_creditBloodQuickening = false;
_killMinchar = false;
@@ -366,29 +366,33 @@ class boss_blood_queen_lana_thel : public CreatureScript
if (me->GetVictim())
{
Player* newOfftank = SelectRandomTarget(true);
- if (_offtank != newOfftank)
+ if (newOfftank)
{
- _offtank = newOfftank;
- if (_offtank)
+ if (_offtankGUID != newOfftank->GetGUID())
{
+ _offtankGUID = newOfftank->GetGUID();
+
// both spells have SPELL_ATTR5_SINGLE_TARGET_SPELL, no manual removal needed
- _offtank->CastSpell(me->GetVictim(), SPELL_BLOOD_MIRROR_DAMAGE, true);
- me->GetVictim()->CastSpell(_offtank, SPELL_BLOOD_MIRROR_DUMMY, true);
+ newOfftank->CastSpell(me->GetVictim(), SPELL_BLOOD_MIRROR_DAMAGE, true);
+ me->GetVictim()->CastSpell(newOfftank, SPELL_BLOOD_MIRROR_DUMMY, true);
DoCastVictim(SPELL_BLOOD_MIRROR_VISUAL);
- if (Is25ManRaid() && _offtank->GetQuestStatus(QUEST_BLOOD_INFUSION) == QUEST_STATUS_INCOMPLETE &&
- _offtank->HasAura(SPELL_UNSATED_CRAVING) && !_offtank->HasAura(SPELL_THIRST_QUENCHED) &&
- !_offtank->HasAura(SPELL_GUSHING_WOUND))
- _offtank->CastSpell(_offtank, SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK);
+ if (Is25ManRaid() && newOfftank->GetQuestStatus(QUEST_BLOOD_INFUSION) == QUEST_STATUS_INCOMPLETE &&
+ newOfftank->HasAura(SPELL_UNSATED_CRAVING) && !newOfftank->HasAura(SPELL_THIRST_QUENCHED) &&
+ !newOfftank->HasAura(SPELL_GUSHING_WOUND))
+ newOfftank->CastSpell(newOfftank, SPELL_GUSHING_WOUND, TRIGGERED_FULL_MASK);
}
}
+ else
+ _offtankGUID = 0;
}
events.ScheduleEvent(EVENT_BLOOD_MIRROR, 2500, EVENT_GROUP_CANCELLABLE);
break;
}
case EVENT_DELIRIOUS_SLASH:
- if (_offtank && !me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER))
- DoCast(_offtank, SPELL_DELIRIOUS_SLASH);
+ if (_offtankGUID && !me->HasByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER))
+ if (Player* _offtank = ObjectAccessor::GetPlayer(*me, _offtankGUID))
+ DoCast(_offtank, SPELL_DELIRIOUS_SLASH);
events.ScheduleEvent(EVENT_DELIRIOUS_SLASH, urand(20000, 24000), EVENT_GROUP_NORMAL);
break;
case EVENT_PACT_OF_THE_DARKFALLEN:
@@ -470,7 +474,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
if (Unit* refTarget = (*itr)->getTarget())
- if (refTarget != me->GetVictim() && refTarget->GetTypeId() == TYPEID_PLAYER && (includeOfftank || (refTarget != _offtank)))
+ if (refTarget != me->GetVictim() && refTarget->GetTypeId() == TYPEID_PLAYER && (includeOfftank || (refTarget->GetGUID() != _offtankGUID)))
tempTargets.push_back(refTarget->ToPlayer());
if (tempTargets.empty())
@@ -493,7 +497,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
std::set<uint64> _vampires;
std::set<uint64> _bloodboltedPlayers;
- Player* _offtank;
+ uint64 _offtankGUID;
bool _creditBloodQuickening;
bool _killMinchar;
};
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 c45d3704d5d..394fbc84253 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,10 +21,10 @@
DoorData const doorData[] =
{
- { 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 },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { 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 },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
};
class instance_halls_of_lightning : public InstanceMapScript
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 2a899d26d5a..1268207388c 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
@@ -23,8 +23,8 @@
DoorData const doorData[] =
{
- { GO_SJONNIR_DOOR, DATA_BRANN_EVENT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { 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
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
index 4c6b3ae8b3f..7fcb624c35e 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
@@ -989,6 +989,7 @@ class boss_yogg_saron : public CreatureScript
Talk(SAY_YOGG_SARON_PHASE_3);
DoCast(me, SPELL_PHASE_3_TRANSFORM);
me->RemoveAurasDueToSpell(SPELL_SHADOWY_BARRIER_YOGG);
+ me->ResetPlayerDamageReq();
break;
default:
break;
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
index e44e0ab0539..7d3d149f0ff 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellScript.h"
#include "vault_of_archavon.h"
enum Emotes
@@ -27,9 +28,12 @@ enum Emotes
enum Spells
{
-
// Spells Archavon
SPELL_ROCK_SHARDS = 58678,
+ SPELL_ROCK_SHARDS_VISUAL_L = 58689,
+ SPELL_ROCK_SHARDS_VISUAL_R = 58692,
+ SPELL_ROCK_SHARDS_DAMAGE_L = 58695,
+ SPELL_ROCK_SHARDS_DAMAGE_R = 58696,
SPELL_CRUSHING_LEAP = 58960,
SPELL_STOMP = 58663,
SPELL_IMPALE = 58666,
@@ -205,8 +209,55 @@ class npc_archavon_warder : public CreatureScript
}
};
+// 58941 - Rock Shards
+class spell_archavon_rock_shards : public SpellScriptLoader
+{
+ public:
+ spell_archavon_rock_shards() : SpellScriptLoader("spell_archavon_rock_shards") { }
+
+ class spell_archavon_rock_shards_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_archavon_rock_shards_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_VISUAL_L)
+ || !sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_VISUAL_R)
+ || !sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_DAMAGE_L)
+ || !sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_DAMAGE_R))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+
+ for (uint8 i = 0; i < 3; ++i)
+ {
+ caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_VISUAL_L, true);
+ caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_VISUAL_R, true);
+ }
+
+ caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_DAMAGE_L, true);
+ caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_DAMAGE_R, true);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHit += SpellEffectFn(spell_archavon_rock_shards_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_archavon_rock_shards_SpellScript();
+ }
+};
+
void AddSC_boss_archavon()
{
new boss_archavon();
new npc_archavon_warder();
+ new spell_archavon_rock_shards();
}
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
index 5e2e26b578a..38c14292289 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
@@ -248,7 +248,6 @@ class ThunderingStormCheck
private:
WorldObject const* _source;
- float _dist;
};
// 39365 - Thundering Storm
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
index 54a1ccece51..8b233901608 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
@@ -306,7 +306,7 @@ class instance_blood_furnace : public InstanceMapScript
void ResetPrisoners(const std::set<uint64>& prisoners)
{
- for (std::set<uint64>::iterator i = prisoners.begin(); i != prisoners.end(); ++i)
+ for (std::set<uint64>::const_iterator i = prisoners.begin(); i != prisoners.end(); ++i)
if (Creature* prisoner = instance->GetCreature(*i))
ResetPrisoner(prisoner);
}
@@ -400,7 +400,7 @@ class instance_blood_furnace : public InstanceMapScript
void ActivatePrisoners(const std::set<uint64>& prisoners)
{
- for (std::set<uint64>::iterator i = prisoners.begin(); i != prisoners.end(); ++i)
+ for (std::set<uint64>::const_iterator i = prisoners.begin(); i != prisoners.end(); ++i)
if (Creature* prisoner = instance->GetCreature(*i))
{
prisoner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE);
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index 8804410d814..6b56c51d6e1 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -25,7 +25,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
-#include "SpellAuras.h"
+#include "SpellAuraEffects.h"
#include "Vehicle.h"
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
@@ -2072,8 +2072,6 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader
{
uint32 spellId = 0;
- 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())
{
case NPC_NEW_AVALON_FORGE:
@@ -2092,7 +2090,7 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader
return;
}
- GetOriginalCaster()->CastSpell((Unit*)NULL, spellId, true);
+ GetCaster()->CastSpell((Unit*)NULL, spellId, true);
}
void Register() OVERRIDE
@@ -2107,6 +2105,62 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader
}
};
+// 51769 - Emblazon Runeblade
+class spell_q12619_emblazon_runeblade : public SpellScriptLoader
+{
+ public:
+ spell_q12619_emblazon_runeblade() : SpellScriptLoader("spell_q12619_emblazon_runeblade") { }
+
+ class spell_q12619_emblazon_runeblade_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_q12619_emblazon_runeblade_AuraScript);
+
+ void HandleEffectPeriodic(AuraEffect const* aurEff)
+ {
+ PreventDefaultAction();
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, NULL, aurEff);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_q12619_emblazon_runeblade_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_q12619_emblazon_runeblade_AuraScript();
+ }
+};
+
+// 51770 - Emblazon Runeblade
+class spell_q12619_emblazon_runeblade_effect : public SpellScriptLoader
+{
+ public:
+ spell_q12619_emblazon_runeblade_effect() : SpellScriptLoader("spell_q12619_emblazon_runeblade_effect") { }
+
+ class spell_q12619_emblazon_runeblade_effect_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q12619_emblazon_runeblade_effect_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), false);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHit += SpellEffectFn(spell_q12619_emblazon_runeblade_effect_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_q12619_emblazon_runeblade_effect_SpellScript();
+ }
+};
+
void AddSC_quest_spell_scripts()
{
new spell_q55_sacred_cleansing();
@@ -2157,4 +2211,6 @@ void AddSC_quest_spell_scripts()
new spell_q12308_escape_from_silverbrook_summon_worgen();
new spell_q12308_escape_from_silverbrook();
new spell_q12641_death_comes_from_on_high();
+ new spell_q12619_emblazon_runeblade();
+ new spell_q12619_emblazon_runeblade_effect();
}
diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp
index 94e448bd9bc..6cd5e962c02 100644
--- a/src/server/scripts/World/achievement_scripts.cpp
+++ b/src/server/scripts/World/achievement_scripts.cpp
@@ -279,6 +279,17 @@ class achievement_flirt_with_disaster_perf_check : public AchievementCriteriaScr
}
};
+class achievement_killed_exp_or_honor_target : public AchievementCriteriaScript
+{
+ public:
+ achievement_killed_exp_or_honor_target() : AchievementCriteriaScript("achievement_killed_exp_or_honor_target") { }
+
+ bool OnCheck(Player* player, Unit* target) OVERRIDE
+ {
+ return target && player->isHonorOrXPTarget(target);
+ }
+};
+
void AddSC_achievement_scripts()
{
new achievement_resilient_victory();
@@ -298,4 +309,5 @@ void AddSC_achievement_scripts()
new achievement_tilted();
new achievement_not_even_a_scratch();
new achievement_flirt_with_disaster_perf_check();
+ new achievement_killed_exp_or_honor_target();
}
diff --git a/src/server/shared/Common.h b/src/server/shared/Common.h
index 70ee32d2868..e3074ef45b9 100644
--- a/src/server/shared/Common.h
+++ b/src/server/shared/Common.h
@@ -92,6 +92,7 @@
#include <ace/Guard_T.h>
#include <ace/RW_Thread_Mutex.h>
#include <ace/Thread_Mutex.h>
+#include <ace/OS_NS_time.h>
#if PLATFORM == PLATFORM_WINDOWS
# include <ace/config-all.h>
diff --git a/src/server/shared/CompilerDefs.h b/src/server/shared/CompilerDefs.h
index 10cdaf4e179..909dcd1707b 100644
--- a/src/server/shared/CompilerDefs.h
+++ b/src/server/shared/CompilerDefs.h
@@ -55,11 +55,6 @@
# error "FATAL ERROR: Unknown compiler."
#endif
-#if COMPILER == COMPILER_MICROSOFT
-# pragma warning( disable : 4267 ) // conversion from 'size_t' to 'int', possible loss of data
-# pragma warning( disable : 4786 ) // identifier was truncated to '255' characters in the debug information
-#endif
-
#if defined(__cplusplus) && __cplusplus == 201103L
# define COMPILER_HAS_CPP11_SUPPORT 1
#else
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h
index 5ecadfe18a8..e209beef8b6 100644
--- a/src/server/shared/Database/DatabaseWorkerPool.h
+++ b/src/server/shared/Database/DatabaseWorkerPool.h
@@ -214,6 +214,9 @@ class DatabaseWorkerPool
T* t = GetFreeConnection();
t->Execute(stmt);
t->Unlock();
+
+ //! Delete proxy-class. Not needed anymore
+ delete stmt;
}
/**
@@ -430,7 +433,7 @@ class DatabaseWorkerPool
*/
//! Automanaged (internally) pointer to a prepared statement object for usage in upper level code.
- //! Pointer is deleted in this->Query(PreparedStatement*) or PreparedStatementTask::~PreparedStatementTask.
+ //! Pointer is deleted in this->DirectExecute(PreparedStatement*), this->Query(PreparedStatement*) or PreparedStatementTask::~PreparedStatementTask.
//! This object is not tied to the prepared statement on the MySQL context yet until execution.
PreparedStatement* GetPreparedStatement(uint32 index)
{
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 7e237614f62..fdb71dd8d1a 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -458,6 +458,9 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, "SELECT gi.item_guid, gi.guildid, g.name FROM guild_bank_item gi INNER JOIN guild g ON g.guildid = gi.guildid INNER JOIN item_instance ii ON ii.guid = gi.item_guid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT, "DELETE FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, "DELETE FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT, "INSERT INTO character_achievement (guid, achievement, date) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, "DELETE FROM character_achievement_progress WHERE guid = ? AND criteria = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION, "DELETE FROM character_reputation WHERE guid = ? AND faction = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION, "INSERT INTO character_reputation (guid, faction, standing, flags) VALUES (?, ?, ? , ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = (arenaPoints + ?) WHERE guid = ?", CONNECTION_ASYNC);
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index f97dd63064d..4aeee0ac525 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -394,6 +394,9 @@ enum CharacterDatabaseStatements
CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY,
CHAR_DEL_CHAR_ACHIEVEMENT,
CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS,
+ CHAR_INS_CHAR_ACHIEVEMENT,
+ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA,
+ CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS,
CHAR_DEL_CHAR_REPUTATION_BY_FACTION,
CHAR_INS_CHAR_REPUTATION_BY_FACTION,
CHAR_UPD_CHAR_ARENA_POINTS,
diff --git a/src/server/shared/Logging/Appender.cpp b/src/server/shared/Logging/Appender.cpp
index cde94fe3a7c..f47cbc3b095 100644
--- a/src/server/shared/Logging/Appender.cpp
+++ b/src/server/shared/Logging/Appender.cpp
@@ -20,9 +20,10 @@
std::string LogMessage::getTimeStr(time_t time)
{
- tm* aTm = localtime(&time);
+ tm aTm;
+ ACE_OS::localtime_r(&time, &aTm);
char buf[20];
- snprintf(buf, 20, "%04d-%02d-%02d_%02d:%02d:%02d", aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
+ snprintf(buf, 20, "%04d-%02d-%02d_%02d:%02d:%02d", aTm.tm_year+1900, aTm.tm_mon+1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
return std::string(buf);
}
diff --git a/src/server/shared/Logging/AppenderFile.cpp b/src/server/shared/Logging/AppenderFile.cpp
index 93d53bcc30d..54458346bb9 100644
--- a/src/server/shared/Logging/AppenderFile.cpp
+++ b/src/server/shared/Logging/AppenderFile.cpp
@@ -40,7 +40,7 @@ AppenderFile::~AppenderFile()
void AppenderFile::_write(LogMessage const& message)
{
- bool exceedMaxSize = maxFileSize > 0 && (fileSize + message.Size()) > maxFileSize;
+ bool exceedMaxSize = maxFileSize > 0 && (fileSize.value() + message.Size()) > maxFileSize;
if (dynamicName)
{
@@ -56,7 +56,7 @@ void AppenderFile::_write(LogMessage const& message)
fprintf(logfile, "%s%s", message.prefix.c_str(), message.text.c_str());
fflush(logfile);
- fileSize += message.Size();
+ fileSize += uint64(message.Size());
if (dynamicName)
CloseFile();
diff --git a/src/server/shared/Logging/AppenderFile.h b/src/server/shared/Logging/AppenderFile.h
index c15974799e1..de94a46d692 100644
--- a/src/server/shared/Logging/AppenderFile.h
+++ b/src/server/shared/Logging/AppenderFile.h
@@ -19,6 +19,7 @@
#define APPENDERFILE_H
#include "Appender.h"
+#include "ace/Atomic_Op.h"
class AppenderFile: public Appender
{
@@ -37,7 +38,7 @@ class AppenderFile: public Appender
bool dynamicName;
bool backup;
uint64 maxFileSize;
- uint64 fileSize;
+ ACE_Atomic_Op<ACE_Thread_Mutex, uint64> fileSize;
};
#endif
diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp
index be7aab9cf5e..e6400176155 100644
--- a/src/server/shared/Logging/Log.cpp
+++ b/src/server/shared/Logging/Log.cpp
@@ -295,7 +295,8 @@ void Log::write(LogMessage* msg)
std::string Log::GetTimestampStr()
{
time_t t = time(NULL);
- tm* aTm = localtime(&t);
+ tm aTm;
+ ACE_OS::localtime_r(&t, &aTm);
// YYYY year
// MM month (2 digits 01-12)
// DD day (2 digits 01-31)
@@ -303,7 +304,7 @@ std::string Log::GetTimestampStr()
// MM minutes (2 digits 00-59)
// SS seconds (2 digits 00-59)
char buf[20];
- snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
+ snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm.tm_year+1900, aTm.tm_mon+1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
return std::string(buf);
}
diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h
index 7777842af17..d2677538805 100644
--- a/src/server/shared/Packets/ByteBuffer.h
+++ b/src/server/shared/Packets/ByteBuffer.h
@@ -23,6 +23,7 @@
#include "Errors.h"
#include "ByteConverter.h"
+#include <ace/OS_NS_time.h>
#include <exception>
#include <list>
#include <map>
@@ -457,8 +458,9 @@ class ByteBuffer
void AppendPackedTime(time_t time)
{
- tm* lt = localtime(&time);
- append<uint32>((lt->tm_year - 100) << 24 | lt->tm_mon << 20 | (lt->tm_mday - 1) << 14 | lt->tm_wday << 11 | lt->tm_hour << 6 | lt->tm_min);
+ tm lt;
+ ACE_OS::localtime_r(&time, &lt);
+ append<uint32>((lt.tm_year - 100) << 24 | lt.tm_mon << 20 | (lt.tm_mday - 1) << 14 | lt.tm_wday << 11 | lt.tm_hour << 6 | lt.tm_min);
}
void put(size_t pos, const uint8 *src, size_t cnt)
diff --git a/src/server/shared/Utilities/Timer.h b/src/server/shared/Utilities/Timer.h
index 5bc19a2b779..b0b395865b4 100644
--- a/src/server/shared/Utilities/Timer.h
+++ b/src/server/shared/Utilities/Timer.h
@@ -66,7 +66,7 @@ struct IntervalTimer
void Reset()
{
if (_current >= _interval)
- _current -= _interval;
+ _current %= _interval;
}
void SetCurrent(time_t current)
diff --git a/src/server/shared/Utilities/Util.cpp b/src/server/shared/Utilities/Util.cpp
index 1bba3c2db09..48012b6eea8 100644
--- a/src/server/shared/Utilities/Util.cpp
+++ b/src/server/shared/Utilities/Util.cpp
@@ -215,7 +215,8 @@ uint32 TimeStringToSecs(const std::string& timestring)
std::string TimeToTimestampStr(time_t t)
{
- tm* aTm = localtime(&t);
+ tm aTm;
+ ACE_OS::localtime_r(&t, &aTm);
// YYYY year
// MM month (2 digits 01-12)
// DD day (2 digits 01-31)
@@ -223,7 +224,7 @@ std::string TimeToTimestampStr(time_t t)
// MM minutes (2 digits 00-59)
// SS seconds (2 digits 00-59)
char buf[20];
- snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
+ snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm.tm_year+1900, aTm.tm_mon+1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
return std::string(buf);
}
diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h
index 6d0216225da..30a6b27f186 100644
--- a/src/server/shared/Utilities/Util.h
+++ b/src/server/shared/Utilities/Util.h
@@ -20,6 +20,7 @@
#define _UTIL_H
#include "Define.h"
+#include "Errors.h"
#include <algorithm>
#include <string>
@@ -532,4 +533,36 @@ public:
}
};
+enum ComparisionType
+{
+ COMP_TYPE_EQ = 0,
+ COMP_TYPE_HIGH,
+ COMP_TYPE_LOW,
+ COMP_TYPE_HIGH_EQ,
+ COMP_TYPE_LOW_EQ,
+ COMP_TYPE_MAX
+};
+
+template <class T>
+bool CompareValues(ComparisionType type, T val1, T val2)
+{
+ switch (type)
+ {
+ case COMP_TYPE_EQ:
+ return val1 == val2;
+ case COMP_TYPE_HIGH:
+ return val1 > val2;
+ case COMP_TYPE_LOW:
+ return val1 < val2;
+ case COMP_TYPE_HIGH_EQ:
+ return val1 >= val2;
+ case COMP_TYPE_LOW_EQ:
+ return val1 <= val2;
+ default:
+ // incorrect parameter
+ ASSERT(false);
+ return false;
+ }
+}
+
#endif
diff --git a/src/server/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp
index e136269e2a0..1ebb58eef1a 100644
--- a/src/server/worldserver/CommandLine/CliRunnable.cpp
+++ b/src/server/worldserver/CommandLine/CliRunnable.cpp
@@ -175,6 +175,8 @@ void CliRunnable::run()
{
#if PLATFORM == PLATFORM_WINDOWS
printf("TC>");
+#else
+ free(command_str);
#endif
continue;
}
@@ -184,6 +186,8 @@ void CliRunnable::run()
{
#if PLATFORM == PLATFORM_WINDOWS
printf("TC>");
+#else
+ free(command_str);
#endif
continue;
}
@@ -192,6 +196,7 @@ void CliRunnable::run()
sWorld->QueueCliCommand(new CliCommandHolder(NULL, command.c_str(), &utf8print, &commandFinished));
#if PLATFORM != PLATFORM_WINDOWS
add_history(command.c_str());
+ free(command_str);
#endif
}
else if (feof(stdin))
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index dbf2a808230..62008a3eb38 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -907,6 +907,13 @@ Instance.ResetTimeHour = 4
Instance.UnloadDelay = 1800000
#
+# InstancesResetAnnounce
+# Description: Announce the reset of one instance to whole party.
+# Default: false - (Disabled, don't show, blizzlike)
+# true - (Enabled, show)
+
+InstancesResetAnnounce = false
+#
# Quests.LowLevelHideDiff
# Description: Level difference between player and quest level at which quests are
# considered low-level and are not shown via exclamation mark (!) at quest
@@ -1213,7 +1220,6 @@ Warden.BanDuration = 86400
###################################################################################################
# PLAYER INTERACTION
#
-#
# AllowTwoSide.Interaction.Calendar
# Description: Allow calendar invites between factions.
# Default: 0 - (Disabled)
@@ -2138,6 +2144,29 @@ Battleground.GiveXPForKills = 0
Battleground.Random.ResetHour = 6
#
+# Battleground.RewardWinnerHonorFirst
+# Battleground.RewardWinnerArenaFirst
+# Battleground.RewardWinnerHonorLast
+# Battleground.RewardWinnerArenaLast
+# Battleground.RewardLoserHonorFirst
+# Battleground.RewardLoserHonorLast
+# Description: Random Battlegrounds / call to the arms rewards
+# Default: 30 - Battleground.RewardWinnerHonorFirst
+# 25 - Battleground.RewardWinnerArenaFirst
+# 15 - Battleground.RewardWinnerHonorLast
+# 0 - Battleground.RewardWinnerArenaLast
+# 5 - Battleground.RewardLoserHonorFirst
+# 5 - Battleground.RewardLoserHonorLast
+#
+
+Battleground.RewardWinnerHonorFirst = 30
+Battleground.RewardWinnerArenaFirst = 25
+Battleground.RewardWinnerHonorLast = 15
+Battleground.RewardWinnerArenaLast = 0
+Battleground.RewardLoserHonorFirst = 5
+Battleground.RewardLoserHonorLast = 5
+
+#
###################################################################################################
###################################################################################################
@@ -2616,7 +2645,6 @@ UI.ShowQuestLevelsInDialogs = 0
###################################################################################################
###################################################################################################
-#
# LOGGING SYSTEM SETTINGS
#
# Appender config values: Given a appender "name"
@@ -2805,7 +2833,6 @@ Log.Async.Enable = 0
###################################################################################################
###################################################################################################
-#
# PACKET SPOOF PROTECTION SETTINGS
#
# These settings determine which action to take when harmful packet spoofing is detected.