diff options
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/AI/CreatureAI.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 68 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 38 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 13 | ||||
| -rw-r--r-- | src/server/game/Accounts/AccountMgr.cpp | 85 | ||||
| -rw-r--r-- | src/server/game/Accounts/AccountMgr.h | 17 | ||||
| -rw-r--r-- | src/server/game/Accounts/RBAC.h | 210 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 15 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 4 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Miscellaneous/Language.h | 13 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 5 | ||||
| -rw-r--r-- | src/server/game/World/World.h | 3 |
15 files changed, 441 insertions, 58 deletions
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index cbb79b47958..75a1488ed45 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -75,6 +75,8 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= NULL*/, float maxRangeToN } } + // Intended duplicated check, the code above this should select a victim + // If it can't find a suitable attack target then we should error out. if (!creature->HasReactState(REACT_PASSIVE) && !creature->GetVictim()) { TC_LOG_ERROR(LOG_FILTER_GENERAL, "DoZoneInCombat called for creature that has empty threat list (creature entry = %u)", creature->GetEntry()); diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 2d6046cbddf..f94a3e79066 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -731,7 +731,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u me->AI()->EnterEvadeMode(); TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_EVADE: Creature %u EnterEvadeMode", me->GetGUIDLow()); - return; + break; } case SMART_ACTION_FLEE_FOR_ASSIST: { @@ -854,7 +854,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } case SMART_ACTION_CALL_KILLEDMONSTER: { - if (e.target.type == SMART_TARGET_NONE) // Loot recipient and his group members + if (e.target.type == SMART_TARGET_NONE || e.target.type == SMART_TARGET_SELF) // Loot recipient and his group members { if (!me) break; @@ -1340,15 +1340,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!me) break; - ObjectList* targets = GetTargets(e, unit); if (e.GetTargetType() == SMART_TARGET_SELF) me->SetFacingTo(me->GetHomePosition().GetOrientation()); else if (e.GetTargetType() == SMART_TARGET_POSITION) me->SetFacingTo(e.target.o); - else if (targets && !targets->empty()) - me->SetFacingToObject(*targets->begin()); + else if (ObjectList* targets = GetTargets(e, unit)) + { + if (!targets->empty()) + me->SetFacingToObject(*targets->begin()); + + delete targets; + } - delete targets; break; } case SMART_ACTION_PLAYMOVIE: @@ -1445,7 +1448,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript: SMART_ACTION_EQUIP uses non-existent equipment info id %u for creature %u", equipId, npc->GetEntry()); delete targets; - return; + break; } npc->SetCurrentEquipmentId(equipId); @@ -1879,11 +1882,13 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) + { if (Creature* creature = (*itr)->ToCreature()) { creature->GetMotionMaster()->Clear(); creature->GetMotionMaster()->MoveJump(e.target.x, e.target.y, e.target.z, (float)e.action.jump.speedxy, (float)e.action.jump.speedz); } + } /// @todo Resume path when reached jump location delete targets; @@ -1913,7 +1918,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!storedTargets) { delete targets; - return; + break; } for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) @@ -1950,6 +1955,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) + { if (Player* player = (*itr)->ToPlayer()) { if (e.action.sendGossipMenu.gossipMenuId) @@ -1959,6 +1965,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u player->SEND_GOSSIP_MENU(e.action.sendGossipMenu.gossipNpcTextId, GetBaseObject()->GetGUID()); } + } delete targets; break; @@ -1970,15 +1977,32 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) + { if (IsCreature(*itr)) { if (e.GetTargetType() == SMART_TARGET_SELF) (*itr)->ToCreature()->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); else if (e.GetTargetType() == SMART_TARGET_POSITION) (*itr)->ToCreature()->SetHomePosition(e.target.x, e.target.y, e.target.z, e.target.o); + else if (e.GetTargetType() == SMART_TARGET_CREATURE_RANGE || e.GetTargetType() == SMART_TARGET_CREATURE_GUID || + e.GetTargetType() == SMART_TARGET_CREATURE_DISTANCE || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_RANGE || + e.GetTargetType() == SMART_TARGET_GAMEOBJECT_GUID || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_DISTANCE || + e.GetTargetType() == SMART_TARGET_CLOSEST_CREATURE || e.GetTargetType() == SMART_TARGET_CLOSEST_GAMEOBJECT || + e.GetTargetType() == SMART_TARGET_OWNER_OR_SUMMONER || e.GetTargetType() == SMART_TARGET_ACTION_INVOKER || + e.GetTargetType() == SMART_TARGET_CLOSEST_ENEMY || e.GetTargetType() == SMART_TARGET_CLOSEST_FRIENDLY) + { + if (ObjectList* targets = GetTargets(e, unit)) + { + if (WorldObject* target = targets->front()) + (*itr)->ToCreature()->SetHomePosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation()); + + delete targets; + } + } else - TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript: Action target for SMART_ACTION_SET_HOME_POS is not using SMART_TARGET_SELF or SMART_TARGET_POSITION, skipping"); + TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript: Action target for SMART_ACTION_SET_HOME_POS is invalid, skipping"); } + } delete targets; break; @@ -2101,7 +2125,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!sGameEventMgr->IsActiveEvent(eventId)) { TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript::ProcessAction: At case SMART_ACTION_GAME_EVENT_STOP, inactive event (id: %u)", eventId); - return; + break; } sGameEventMgr->StopEvent(eventId, true); break; @@ -2112,7 +2136,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (sGameEventMgr->IsActiveEvent(eventId)) { TC_LOG_ERROR(LOG_FILTER_SQL, "SmartScript::ProcessAction: At case SMART_ACTION_GAME_EVENT_START, already activated event (id: %u)", eventId); - return; + break; } sGameEventMgr->StartEvent(eventId, true); break; @@ -2621,10 +2645,20 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui } case SMART_EVENT_TARGET_CASTING: { - if (!me || !me->IsInCombat() || !me->GetVictim() || !me->GetVictim()->IsNonMeleeSpellCasted(false, false, true)) + if (!me || !me->IsInCombat()) return; - ProcessTimedAction(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax, me->GetVictim()); + Unit* victim = me->GetVictim(); + + if (!victim || !victim->IsNonMeleeSpellCasted(false, false, true)) + return; + + if (e.event.targetCasting.spellId > 0) + if (Spell* currSpell = victim->GetCurrentSpell(CURRENT_GENERIC_SPELL)) + if (currSpell->m_spellInfo->Id != e.event.targetCasting.spellId) + return; + + ProcessTimedAction(e, e.event.targetCasting.repeatMin, e.event.targetCasting.repeatMax, me->GetVictim()); break; } case SMART_EVENT_FRIENDLY_HEALTH: @@ -2632,10 +2666,10 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui if (!me || !me->IsInCombat()) return; - Unit* target = DoSelectLowestHpFriendly((float)e.event.friendlyHealt.radius, e.event.friendlyHealt.hpDeficit); + Unit* target = DoSelectLowestHpFriendly((float)e.event.friendlyHealth.radius, e.event.friendlyHealth.hpDeficit); if (!target || !target->IsInCombat()) return; - ProcessTimedAction(e, e.event.friendlyHealt.repeatMin, e.event.friendlyHealt.repeatMax, target); + ProcessTimedAction(e, e.event.friendlyHealth.repeatMin, e.event.friendlyHealth.repeatMax, target); break; } case SMART_EVENT_FRIENDLY_IS_CC: @@ -2983,7 +3017,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui { uint32 healthPct = uint32((*itr)->ToUnit()->GetHealthPct()); - if (healthPct > e.event.friendlyHealtPct.maxHpPct || healthPct < e.event.friendlyHealtPct.minHpPct) + if (healthPct > e.event.friendlyHealthPct.maxHpPct || healthPct < e.event.friendlyHealthPct.minHpPct) continue; target = (*itr)->ToUnit(); @@ -2996,7 +3030,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui if (!target) return; - ProcessTimedAction(e, e.event.friendlyHealtPct.repeatMin, e.event.friendlyHealtPct.repeatMax, target); + ProcessTimedAction(e, e.event.friendlyHealthPct.repeatMin, e.event.friendlyHealthPct.repeatMax, target); break; } default: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 081599c322e..01f9080fba1 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -28,6 +28,8 @@ #include "ScriptedCreature.h" #include "GameEventMgr.h" #include "CreatureTextMgr.h" +#include "SpellMgr.h" +#include "SpellInfo.h" #include "SmartScriptMgr.h" @@ -407,10 +409,10 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; case SMART_EVENT_FRIENDLY_HEALTH: - if (!NotNULL(e, e.event.friendlyHealt.radius)) + if (!NotNULL(e, e.event.friendlyHealth.radius)) return false; - if (!IsMinMaxValid(e, e.event.friendlyHealt.repeatMin, e.event.friendlyHealt.repeatMax)) + if (!IsMinMaxValid(e, e.event.friendlyHealth.repeatMin, e.event.friendlyHealth.repeatMax)) return false; break; case SMART_EVENT_FRIENDLY_IS_CC: @@ -437,6 +439,15 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) return false; break; case SMART_EVENT_TARGET_CASTING: + if (e.event.targetCasting.spellId > 0 && !sSpellMgr->GetSpellInfo(e.event.targetCasting.spellId)) + { + sLog->outError(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent Spell entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.spellHit.spell); + return false; + } + + if (!IsMinMaxValid(e, e.event.targetCasting.repeatMin, e.event.targetCasting.repeatMax)) + return false; + break; case SMART_EVENT_PASSENGER_BOARDED: case SMART_EVENT_PASSENGER_REMOVED: if (!IsMinMaxValid(e, e.event.minMax.repeatMin, e.event.minMax.repeatMax)) @@ -546,10 +557,10 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) break; } case SMART_EVENT_FRIENDLY_HEALTH_PCT: - if (!IsMinMaxValid(e, e.event.friendlyHealtPct.repeatMin, e.event.friendlyHealtPct.repeatMax)) + if (!IsMinMaxValid(e, e.event.friendlyHealthPct.repeatMin, e.event.friendlyHealthPct.repeatMax)) return false; - if (e.event.friendlyHealtPct.maxHpPct > 100 || e.event.friendlyHealtPct.minHpPct > 100) + if (e.event.friendlyHealthPct.maxHpPct > 100 || e.event.friendlyHealthPct.minHpPct > 100) { TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u has pct value above 100, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); return false; @@ -769,6 +780,25 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_CALL_KILLEDMONSTER: if (!IsCreatureValid(e, e.action.killedMonster.creature)) return false; + + for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i); + if (!spellInfo) + continue; + + for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + { + if (spellInfo->Effects[j].Effect == SPELL_EFFECT_KILL_CREDIT || spellInfo->Effects[j].Effect == SPELL_EFFECT_KILL_CREDIT2) + { + uint32 killCredit = spellInfo->Effects[j].MiscValue; + + if (e.action.killedMonster.creature == killCredit) + TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u Kill Credit: %u has already spell kill credit (SpellId: %u effect: %u)", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.killedMonster.creature, spellInfo->Id, j); + } + } + } + if (e.GetTargetType() == SMART_TARGET_POSITION) { TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses incorrect TargetType %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.GetTargetType()); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 8337f9e15ee..0bb559dfe3c 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -94,7 +94,7 @@ enum SMART_EVENT SMART_EVENT_OOC_LOS = 10, // NoHostile, MaxRnage, CooldownMin, CooldownMax SMART_EVENT_RESPAWN = 11, // type, MapId, ZoneId SMART_EVENT_TARGET_HEALTH_PCT = 12, // HPMin%, HPMax%, RepeatMin, RepeatMax - SMART_EVENT_TARGET_CASTING = 13, // RepeatMin, RepeatMax + SMART_EVENT_TARGET_CASTING = 13, // RepeatMin, RepeatMax, spellid SMART_EVENT_FRIENDLY_HEALTH = 14, // HPDeficit, Radius, RepeatMin, RepeatMax SMART_EVENT_FRIENDLY_IS_CC = 15, // Radius, RepeatMin, RepeatMax SMART_EVENT_FRIENDLY_MISSING_BUFF = 16, // SpellId, Radius, RepeatMin, RepeatMax @@ -215,11 +215,18 @@ struct SmartEvent struct { + uint32 repeatMin; + uint32 repeatMax; + uint32 spellId; + } targetCasting; + + struct + { uint32 hpDeficit; uint32 radius; uint32 repeatMin; uint32 repeatMax; - } friendlyHealt; + } friendlyHealth; struct { @@ -368,7 +375,7 @@ struct SmartEvent uint32 maxHpPct; uint32 repeatMin; uint32 repeatMax; - } friendlyHealtPct; + } friendlyHealthPct; struct { diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index a9f178685d9..819a3b85fe6 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -34,21 +34,24 @@ AccountMgr::~AccountMgr() ClearRBAC(); } -AccountOpResult AccountMgr::CreateAccount(std::string username, std::string password) +AccountOpResult AccountMgr::CreateAccount(std::string username, std::string password, std::string email = "") { if (utf8length(username) > MAX_ACCOUNT_STR) return AOR_NAME_TOO_LONG; // username's too long normalizeString(username); normalizeString(password); + normalizeString(email); if (GetId(username)) - return AOR_NAME_ALREDY_EXIST; // username does already exist + return AOR_NAME_ALREADY_EXIST; // username does already exist PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT); stmt->setString(0, username); stmt->setString(1, CalculateShaPassHash(username, password)); + stmt->setString(2, email); + stmt->setString(3, email); LoginDatabase.DirectExecute(stmt); // Enforce saving, otherwise AddGroup can fail @@ -202,6 +205,52 @@ AccountOpResult AccountMgr::ChangePassword(uint32 accountId, std::string newPass return AOR_OK; } +AccountOpResult AccountMgr::ChangeEmail(uint32 accountId, std::string newEmail) +{ + std::string username; + + if (!GetName(accountId, username)) + return AOR_NAME_NOT_EXIST; // account doesn't exist + + if (utf8length(newEmail) > MAX_EMAIL_STR) + return AOR_EMAIL_TOO_LONG; + + normalizeString(username); + normalizeString(newEmail); + + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_EMAIL); + + stmt->setString(0, newEmail); + stmt->setUInt32(1, accountId); + + LoginDatabase.Execute(stmt); + + return AOR_OK; +} + +AccountOpResult AccountMgr::ChangeRegEmail(uint32 accountId, std::string newEmail) +{ + std::string username; + + if (!GetName(accountId, username)) + return AOR_NAME_NOT_EXIST; // account doesn't exist + + if (utf8length(newEmail) > MAX_EMAIL_STR) + return AOR_EMAIL_TOO_LONG; + + normalizeString(username); + normalizeString(newEmail); + + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_REG_EMAIL); + + stmt->setString(0, newEmail); + stmt->setUInt32(1, accountId); + + LoginDatabase.Execute(stmt); + + return AOR_OK; +} + uint32 AccountMgr::GetId(std::string const& username) { PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_ACCOUNT_ID_BY_USERNAME); @@ -245,6 +294,21 @@ bool AccountMgr::GetName(uint32 accountId, std::string& name) return false; } +bool AccountMgr::GetEmail(uint32 accountId, std::string& email) +{ + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_EMAIL_BY_ID); + stmt->setUInt32(0, accountId); + PreparedQueryResult result = LoginDatabase.Query(stmt); + + if (result) + { + email = (*result)[0].GetString(); + return true; + } + + return false; +} + bool AccountMgr::CheckPassword(uint32 accountId, std::string password) { std::string username; @@ -263,6 +327,23 @@ bool AccountMgr::CheckPassword(uint32 accountId, std::string password) return (result) ? true : false; } +bool AccountMgr::CheckEmail(uint32 accountId, std::string newEmail) +{ + std::string oldEmail; + + // We simply return false for a non-existing email + if (!GetEmail(accountId, oldEmail)) + return false; + + normalizeString(oldEmail); + normalizeString(newEmail); + + if (strcmp(oldEmail.c_str(), newEmail.c_str()) == 0) + return true; + + return false; +} + uint32 AccountMgr::GetCharactersCount(uint32 accountId) { // check character count diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h index 878ecde24f9..92c1e2292d0 100644 --- a/src/server/game/Accounts/AccountMgr.h +++ b/src/server/game/Accounts/AccountMgr.h @@ -27,12 +27,21 @@ enum AccountOpResult AOR_OK, AOR_NAME_TOO_LONG, AOR_PASS_TOO_LONG, - AOR_NAME_ALREDY_EXIST, + AOR_EMAIL_TOO_LONG, + AOR_NAME_ALREADY_EXIST, AOR_NAME_NOT_EXIST, AOR_DB_INTERNAL_ERROR }; +enum PasswordChangeSecurity +{ + PW_NONE, + PW_EMAIL, + PW_RBAC +}; + #define MAX_ACCOUNT_STR 16 +#define MAX_EMAIL_STR 64 typedef std::map<uint32, RBACPermission*> RBACPermissionsContainer; typedef std::map<uint32, RBACRole*> RBACRolesContainer; @@ -48,16 +57,20 @@ class AccountMgr ~AccountMgr(); public: - AccountOpResult CreateAccount(std::string username, std::string password); + AccountOpResult CreateAccount(std::string username, std::string password, std::string email); static AccountOpResult DeleteAccount(uint32 accountId); static AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword); static AccountOpResult ChangePassword(uint32 accountId, std::string newPassword); + static AccountOpResult ChangeEmail(uint32 accountId, std::string newEmail); + static AccountOpResult ChangeRegEmail(uint32 accountId, std::string newEmail); static bool CheckPassword(uint32 accountId, std::string password); + static bool CheckEmail(uint32 accountId, std::string newEmail); static uint32 GetId(std::string const& username); static uint32 GetSecurity(uint32 accountId); static uint32 GetSecurity(uint32 accountId, int32 realmId); static bool GetName(uint32 accountId, std::string& name); + static bool GetEmail(uint32 accountId, std::string& email); static uint32 GetCharactersCount(uint32 accountId); static std::string CalculateShaPassHash(std::string const& name, std::string const& password); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index be4356f6b54..492a7197cfe 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -96,6 +96,8 @@ enum RBACPermissions RBAC_PERM_CHANGE_CHANNEL_NOT_MODERATOR = 46,
RBAC_PERM_CHECK_FOR_LOWER_SECURITY = 47,
RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA = 48,
+ RBAC_PERM_EMAIL_CONFIRM_FOR_PASS_CHANGE = 49,
+ RBAC_PERM_MAY_CHECK_OWN_EMAIL = 50,
// Leave some space for core permissions
RBAC_PERM_COMMAND_RBAC = 200,
RBAC_PERM_COMMAND_RBAC_ACC = 201,
@@ -160,6 +162,214 @@ enum RBACPermissions RBAC_PERM_COMMAND_BF_SWITCH = 260,
RBAC_PERM_COMMAND_BF_TIMER = 261,
RBAC_PERM_COMMAND_BF_ENABLE = 262,
+ RBAC_PERM_COMMAND_ACCOUNT_EMAIL = 263,
+ RBAC_PERM_COMMAND_ACCOUNT_SET_SEC = 264,
+ RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_EMAIL = 265,
+ RBAC_PERM_COMMAND_ACCOUNT_SET_SEC_REGMAIL = 266,
+ RBAC_PERM_COMMAND_CAST = 267,
+ RBAC_PERM_COMMAND_CAST_BACK = 268,
+ RBAC_PERM_COMMAND_CAST_DIST = 269,
+ RBAC_PERM_COMMAND_CAST_SELF = 270,
+ RBAC_PERM_COMMAND_CAST_TARGET = 271,
+ RBAC_PERM_COMMAND_CAST_DEST = 272,
+ RBAC_PERM_COMMAND_CHARACTER = 273,
+ RBAC_PERM_COMMAND_CHARACTER_CUSTOMIZE = 274,
+ RBAC_PERM_COMMAND_CHARACTER_CHANGEFACTION = 275,
+ RBAC_PERM_COMMAND_CHARACTER_CHANGERACE = 276,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED = 277,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_DELETE = 278, // Not in DB - console
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_LIST = 279,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_RESTORE = 280,
+ RBAC_PERM_COMMAND_CHARACTER_DELETED_OLD = 281, // Not in DB - console
+ RBAC_PERM_COMMAND_CHARACTER_ERASE = 282, // Not in DB - console
+ RBAC_PERM_COMMAND_CHARACTER_LEVEL = 283,
+ RBAC_PERM_COMMAND_CHARACTER_RENAME = 284,
+ RBAC_PERM_COMMAND_CHARACTER_REPUTATION = 285,
+ RBAC_PERM_COMMAND_CHARACTER_TITLES = 286,
+ RBAC_PERM_COMMAND_LEVELUP = 287,
+ RBAC_PERM_COMMAND_PDUMP = 288,
+ RBAC_PERM_COMMAND_PDUMP_LOAD = 289,
+ RBAC_PERM_COMMAND_PDUMP_WRITE = 290,
+ RBAC_PERM_COMMAND_CHEAT = 291,
+ RBAC_PERM_COMMAND_CHEAT_CASTTIME = 292,
+ RBAC_PERM_COMMAND_CHEAT_COOLDOWN = 293,
+ RBAC_PERM_COMMAND_CHEAT_EXPLORE = 294,
+ RBAC_PERM_COMMAND_CHEAT_GOD = 295,
+ RBAC_PERM_COMMAND_CHEAT_POWER = 296,
+ RBAC_PERM_COMMAND_CHEAT_STATUS = 297,
+ RBAC_PERM_COMMAND_CHEAT_TAXI = 298,
+ RBAC_PERM_COMMAND_CHEAT_WATERWALK = 299,
+ RBAC_PERM_COMMAND_DEBUG = 300,
+ RBAC_PERM_COMMAND_DEBUG_ANIM = 301,
+ RBAC_PERM_COMMAND_DEBUG_AREATRIGGERS = 302,
+ RBAC_PERM_COMMAND_DEBUG_ARENA = 303,
+ RBAC_PERM_COMMAND_DEBUG_BG = 304,
+ RBAC_PERM_COMMAND_DEBUG_ENTERVEHICLE = 305,
+ RBAC_PERM_COMMAND_DEBUG_GETITEMSTATE = 306,
+ RBAC_PERM_COMMAND_DEBUG_GETITEMVALUE = 307,
+ RBAC_PERM_COMMAND_DEBUG_GETVALUE = 308,
+ RBAC_PERM_COMMAND_DEBUG_HOSTIL = 309,
+ RBAC_PERM_COMMAND_DEBUG_ITEMEXPIRE = 310,
+ RBAC_PERM_COMMAND_DEBUG_LOOTRECIPIENT = 311,
+ RBAC_PERM_COMMAND_DEBUG_LOS = 312,
+ RBAC_PERM_COMMAND_DEBUG_MOD32VALUE = 313,
+ RBAC_PERM_COMMAND_DEBUG_MOVEFLAGS = 314,
+ RBAC_PERM_COMMAND_DEBUG_PLAY = 315,
+ RBAC_PERM_COMMAND_DEBUG_PLAY_CINEMATIC = 316,
+ RBAC_PERM_COMMAND_DEBUG_PLAY_MOVIE = 317,
+ RBAC_PERM_COMMAND_DEBUG_PLAY_SOUND = 318,
+ RBAC_PERM_COMMAND_DEBUG_SEND = 319,
+ RBAC_PERM_COMMAND_DEBUG_SEND_BUYERROR = 320,
+ RBAC_PERM_COMMAND_DEBUG_SEND_CHANNELNOTIFY = 321,
+ RBAC_PERM_COMMAND_DEBUG_SEND_CHATMESSAGE = 322,
+ RBAC_PERM_COMMAND_DEBUG_SEND_EQUIPERROR = 323,
+ RBAC_PERM_COMMAND_DEBUG_SEND_LARGEPACKET = 324,
+ RBAC_PERM_COMMAND_DEBUG_SEND_OPCODE = 325,
+ RBAC_PERM_COMMAND_DEBUG_SEND_QINVALIDMSG = 326,
+ RBAC_PERM_COMMAND_DEBUG_SEND_QPARTYMSG = 327,
+ RBAC_PERM_COMMAND_DEBUG_SEND_SELLERROR = 328,
+ RBAC_PERM_COMMAND_DEBUG_SEND_SETPHASESHIFT = 329,
+ RBAC_PERM_COMMAND_DEBUG_SEND_SPELLFAIL = 330,
+ RBAC_PERM_COMMAND_DEBUG_SETAURASTATE = 331,
+ RBAC_PERM_COMMAND_DEBUG_SETBIT = 332,
+ RBAC_PERM_COMMAND_DEBUG_SETITEMVALUE = 333,
+ RBAC_PERM_COMMAND_DEBUG_SETVALUE = 334,
+ RBAC_PERM_COMMAND_DEBUG_SETVID = 335,
+ RBAC_PERM_COMMAND_DEBUG_SPAWNVEHICLE = 336,
+ RBAC_PERM_COMMAND_DEBUG_THREAT = 337,
+ RBAC_PERM_COMMAND_DEBUG_UPDATE = 338,
+ RBAC_PERM_COMMAND_DEBUG_UWS = 339,
+ RBAC_PERM_COMMAND_WPGPS = 340,
+ RBAC_PERM_COMMAND_DESERTER = 341,
+ RBAC_PERM_COMMAND_DESERTER_BG = 342,
+ RBAC_PERM_COMMAND_DESERTER_BG_ADD = 343,
+ RBAC_PERM_COMMAND_DESERTER_BG_REMOVE = 344,
+ RBAC_PERM_COMMAND_DESERTER_INSTANCE = 345,
+ RBAC_PERM_COMMAND_DESERTER_INSTANCE_ADD = 346,
+ RBAC_PERM_COMMAND_DESERTER_INSTANCE_REMOVE = 347,
+ RBAC_PERM_COMMAND_DISABLE = 348,
+ RBAC_PERM_COMMAND_DISABLE_ADD = 349,
+ RBAC_PERM_COMMAND_DISABLE_ADD_ACHIEVEMENT_CRITERIA = 350,
+ RBAC_PERM_COMMAND_DISABLE_ADD_BATTLEGROUND = 351,
+ RBAC_PERM_COMMAND_DISABLE_ADD_MAP = 352,
+ RBAC_PERM_COMMAND_DISABLE_ADD_MMAP = 353,
+ RBAC_PERM_COMMAND_DISABLE_ADD_OUTDOORPVP = 354,
+ RBAC_PERM_COMMAND_DISABLE_ADD_QUEST = 355,
+ RBAC_PERM_COMMAND_DISABLE_ADD_SPELL = 356,
+ RBAC_PERM_COMMAND_DISABLE_ADD_VMAP = 357,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE = 358,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_ACHIEVEMENT_CRITERIA = 359,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_BATTLEGROUND = 360,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_MAP = 361,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_MMAP = 362,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_OUTDOORPVP = 363,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_QUEST = 364,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_SPELL = 365,
+ RBAC_PERM_COMMAND_DISABLE_REMOVE_VMAP = 366,
+ RBAC_PERM_COMMAND_EVENT = 367,
+ RBAC_PERM_COMMAND_EVENT_ACTIVELIST = 368,
+ RBAC_PERM_COMMAND_EVENT_START = 369,
+ RBAC_PERM_COMMAND_EVENT_STOP = 370,
+ RBAC_PERM_COMMAND_GM = 371,
+ RBAC_PERM_COMMAND_GM_CHAT = 372,
+ RBAC_PERM_COMMAND_GM_FLY = 373,
+ RBAC_PERM_COMMAND_GM_INGAME = 374,
+ RBAC_PERM_COMMAND_GM_LIST = 375,
+ RBAC_PERM_COMMAND_GM_VISIBLE = 376,
+ RBAC_PERM_COMMAND_GO = 377,
+ RBAC_PERM_COMMAND_GO_CREATURE = 378,
+ RBAC_PERM_COMMAND_GO_GRAVEYARD = 379,
+ RBAC_PERM_COMMAND_GO_GRID = 380,
+ RBAC_PERM_COMMAND_GO_OBJECT = 381,
+ RBAC_PERM_COMMAND_GO_TAXINODE = 382,
+ RBAC_PERM_COMMAND_GO_TICKET = 383,
+ RBAC_PERM_COMMAND_GO_TRIGGER = 384,
+ RBAC_PERM_COMMAND_GO_XYZ = 385,
+ RBAC_PERM_COMMAND_GO_ZONEXY = 386,
+ RBAC_PERM_COMMAND_GOBJECT = 387,
+ RBAC_PERM_COMMAND_GOBJECT_ACTIVATE = 388,
+ RBAC_PERM_COMMAND_GOBJECT_ADD = 389,
+ RBAC_PERM_COMMAND_GOBJECT_ADD_TEMP = 390,
+ RBAC_PERM_COMMAND_GOBJECT_DELETE = 391,
+ RBAC_PERM_COMMAND_GOBJECT_INFO = 392,
+ RBAC_PERM_COMMAND_GOBJECT_MOVE = 393,
+ RBAC_PERM_COMMAND_GOBJECT_NEAR = 394,
+ RBAC_PERM_COMMAND_GOBJECT_SET = 395,
+ RBAC_PERM_COMMAND_GOBJECT_SET_PHASE = 396,
+ RBAC_PERM_COMMAND_GOBJECT_SET_STATE = 397,
+ RBAC_PERM_COMMAND_GOBJECT_TARGET = 398,
+ RBAC_PERM_COMMAND_GOBJECT_TURN = 399,
+ RBAC_PERM_COMMAND_GUILD = 401,
+ RBAC_PERM_COMMAND_GUILD_CREATE = 402,
+ RBAC_PERM_COMMAND_GUILD_DELETE = 403,
+ RBAC_PERM_COMMAND_GUILD_INVITE = 404,
+ RBAC_PERM_COMMAND_GUILD_UNINVITE = 405,
+ RBAC_PERM_COMMAND_GUILD_RANK = 406,
+ RBAC_PERM_COMMAND_GUILD_RENAME = 407,
+ RBAC_PERM_COMMAND_HONOR = 408,
+ RBAC_PERM_COMMAND_HONOR_ADD = 409,
+ RBAC_PERM_COMMAND_HONOR_ADD_KILL = 410,
+ RBAC_PERM_COMMAND_HONOR_UPDATE = 411,
+ RBAC_PERM_COMMAND_INSTANCE = 412,
+ RBAC_PERM_COMMAND_INSTANCE_LISTBINDS = 413,
+ RBAC_PERM_COMMAND_INSTANCE_UNBIND = 414,
+ RBAC_PERM_COMMAND_INSTANCE_STATS = 415,
+ RBAC_PERM_COMMAND_INSTANCE_SAVEDATA = 416,
+ RBAC_PERM_COMMAND_LEARN = 417,
+ RBAC_PERM_COMMAND_LEARN_ALL = 418,
+ RBAC_PERM_COMMAND_LEARN_ALL_MY = 419,
+ RBAC_PERM_COMMAND_LEARN_ALL_MY_CLASS = 420,
+ RBAC_PERM_COMMAND_LEARN_ALL_MY_PETTALENTS = 421,
+ RBAC_PERM_COMMAND_LEARN_ALL_MY_SPELLS = 422,
+ RBAC_PERM_COMMAND_LEARN_ALL_MY_TALENTS = 423,
+ RBAC_PERM_COMMAND_LEARN_ALL_GM = 424,
+ RBAC_PERM_COMMAND_LEARN_ALL_CRAFTS = 425,
+ RBAC_PERM_COMMAND_LEARN_ALL_DEFAULT = 426,
+ RBAC_PERM_COMMAND_LEARN_ALL_LANG = 427,
+ RBAC_PERM_COMMAND_LEARN_ALL_RECIPES = 428,
+ RBAC_PERM_COMMAND_UNLEARN = 429,
+ RBAC_PERM_COMMAND_LFG = 430,
+ RBAC_PERM_COMMAND_LFG_PLAYER = 431,
+ RBAC_PERM_COMMAND_LFG_GROUP = 432,
+ RBAC_PERM_COMMAND_LFG_QUEUE = 433,
+ RBAC_PERM_COMMAND_LFG_CLEAN = 434,
+ RBAC_PERM_COMMAND_LFG_OPTIONS = 435,
+ RBAC_PERM_COMMAND_LIST = 436,
+ RBAC_PERM_COMMAND_LIST_CREATURE = 437,
+ RBAC_PERM_COMMAND_LIST_ITEM = 438,
+ RBAC_PERM_COMMAND_LIST_OBJECT = 439,
+ RBAC_PERM_COMMAND_LIST_AURAS = 440,
+ RBAC_PERM_COMMAND_LIST_MAIL = 441,
+ RBAC_PERM_COMMAND_LOOKUP = 442,
+ RBAC_PERM_COMMAND_LOOKUP_AREA = 443,
+ RBAC_PERM_COMMAND_LOOKUP_CREATURE = 444,
+ RBAC_PERM_COMMAND_LOOKUP_EVENT = 445,
+ RBAC_PERM_COMMAND_LOOKUP_FACTION = 446,
+ RBAC_PERM_COMMAND_LOOKUP_ITEM = 447,
+ RBAC_PERM_COMMAND_LOOKUP_ITEMSET = 448,
+ RBAC_PERM_COMMAND_LOOKUP_OBJECT = 449,
+ RBAC_PERM_COMMAND_LOOKUP_QUEST = 450,
+ RBAC_PERM_COMMAND_LOOKUP_PLAYER = 451,
+ RBAC_PERM_COMMAND_LOOKUP_PLAYER_IP = 452,
+ RBAC_PERM_COMMAND_LOOKUP_PLAYER_ACCOUNT = 453,
+ RBAC_PERM_COMMAND_LOOKUP_PLAYER_EMAIL = 454,
+ RBAC_PERM_COMMAND_LOOKUP_SKILL = 455,
+ RBAC_PERM_COMMAND_LOOKUP_SPELL = 456,
+ RBAC_PERM_COMMAND_LOOKUP_SPELL_ID = 457,
+ RBAC_PERM_COMMAND_LOOKUP_TAXINODE = 458,
+ RBAC_PERM_COMMAND_LOOKUP_TELE = 459,
+ RBAC_PERM_COMMAND_LOOKUP_TITLE = 460,
+ RBAC_PERM_COMMAND_LOOKUP_MAP = 461,
+ RBAC_PERM_COMMAND_ANNOUNCE = 462,
+ RBAC_PERM_COMMAND_CHANNEL = 463,
+ RBAC_PERM_COMMAND_CHANNEL_SET = 464,
+ RBAC_PERM_COMMAND_CHANNEL_SET_OWNERSHIP = 465,
+ RBAC_PERM_COMMAND_GMANNOUNCE = 466,
+ RBAC_PERM_COMMAND_GMNAMEANNOUNCE = 467,
+ RBAC_PERM_COMMAND_GMNOTIFY = 468,
+ RBAC_PERM_COMMAND_NAMEANNOUNCE = 469,
+ RBAC_PERM_COMMAND_NOTIFY = 470,
+ RBAC_PERM_COMMAND_WHISPERS = 471,
// custom permissions 1000+
RBAC_PERM_MAX
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 6cd61dc043c..5a787f910b8 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -137,20 +137,7 @@ void Object::_Create(uint32 guidlow, uint32 entry, HighGuid guidhigh) uint64 guid = MAKE_NEW_GUID(guidlow, entry, guidhigh); SetUInt64Value(OBJECT_FIELD_GUID, guid); - uint32 type = 0; - switch (m_objectType) - { - //case TYPEID_ITEM: type = 3; break; - //case TYPEID_CONTAINER: type = 7; break; //+4 - //case TYPEID_UNIT: type = 9; break; //+2 - //case TYPEID_PLAYER: type = 25; break; //+16 - //case TYPEID_GAMEOBJECT: type = 33; break; //+8 - case TYPEID_DYNAMICOBJECT: type = 65; break; //+32 - //case TYPEID_CORPSE: type = 129; break; //+64 - default: type = m_objectType; break; - } - SetUInt32Value(OBJECT_FIELD_TYPE, type); - //SetUInt32Value(OBJECT_FIELD_TYPE, m_objectType); + SetUInt32Value(OBJECT_FIELD_TYPE, m_objectType); m_PackGUID.wpos(0); m_PackGUID.appendPackGUID(GetGUID()); } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 4c48d80762d..66b3a737e0c 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -54,7 +54,7 @@ enum TypeMask TYPEMASK_GAMEOBJECT = 0x0020, TYPEMASK_DYNAMICOBJECT = 0x0040, TYPEMASK_CORPSE = 0x0080, - TYPEMASK_SEER = TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT + TYPEMASK_SEER = TYPEMASK_PLAYER | TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT }; enum TypeID @@ -450,7 +450,7 @@ struct MovementInfo float splineElevation; MovementInfo() : - guid(0), flags(0), flags2(0), time(0), pitch(0.0f) + guid(0), flags(0), flags2(0), time(0), pitch(0.0f), fallTime(0), splineElevation(0.0f) { pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f); transport.Reset(); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 27f97ba93d4..04c2c22c595 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2407,6 +2407,8 @@ bool InstanceMap::AddPlayerToMap(Player* player) mapSave = sInstanceSaveMgr->AddInstanceSave(GetId(), GetInstanceId(), Difficulty(GetSpawnMode()), 0, true); } + ASSERT(mapSave); + // check for existing instance binds InstancePlayerBind* playerBind = player->GetBoundInstance(GetId(), Difficulty(GetSpawnMode())); if (playerBind && playerBind->perm) @@ -2441,10 +2443,7 @@ bool InstanceMap::AddPlayerToMap(Player* player) if (groupBind->save != mapSave) { TC_LOG_ERROR(LOG_FILTER_MAPS, "InstanceMap::Add: player %s(%d) is being put into instance %d, %d, %d but he is in group %d which is bound to instance %d, %d, %d!", player->GetName().c_str(), player->GetGUIDLow(), mapSave->GetMapId(), mapSave->GetInstanceId(), mapSave->GetDifficulty(), GUID_LOPART(group->GetLeaderGUID()), groupBind->save->GetMapId(), groupBind->save->GetInstanceId(), groupBind->save->GetDifficulty()); - if (mapSave) - TC_LOG_ERROR(LOG_FILTER_MAPS, "MapSave players: %d, group count: %d", mapSave->GetPlayerCount(), mapSave->GetGroupCount()); - else - TC_LOG_ERROR(LOG_FILTER_MAPS, "MapSave NULL"); + TC_LOG_ERROR(LOG_FILTER_MAPS, "MapSave players: %d, group count: %d", mapSave->GetPlayerCount(), mapSave->GetGroupCount()); if (groupBind->save) TC_LOG_ERROR(LOG_FILTER_MAPS, "GroupBind save players: %d, group count: %d", groupBind->save->GetPlayerCount(), groupBind->save->GetGroupCount()); else diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 772d5bcfb75..ce280a11fc3 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -811,6 +811,7 @@ enum TrinityStrings LANG_PINFO_ACC_ACCOUNT = 714, LANG_PINFO_ACC_LASTLOGIN = 716, LANG_PINFO_ACC_OS = 749, + LANG_PINFO_ACC_REGMAILS = 879, LANG_PINFO_ACC_IP = 752, LANG_PINFO_CHR_LEVEL_LOW = 843, LANG_PINFO_CHR_RACE = 844, @@ -844,7 +845,17 @@ enum TrinityStrings LANG_ARENA_INFO_MEMBERS = 869, LANG_ARENA_LOOKUP = 870, // = 871, see LANG_PINFO_CHR_LEVEL_HIGH - // Room for in-game strings 872-999 not used + LANG_COMMAND_WRONGEMAIL = 872, + LANG_NEW_EMAILS_NOT_MATCH = 873, + LANG_COMMAND_EMAIL = 874, + LANG_EMAIL_TOO_LONG = 875, + LANG_COMMAND_NOTCHANGEEMAIL = 876, + LANG_OLD_EMAIL_IS_NEW_EMAIL = 877, + LANG_COMMAND_EMAIL_OUTPUT = 878, + // = 879, see LANG_PINFO_CHR_REGMAILS + LANG_ACCOUNT_SEC_TYPE = 880, + LANG_RBAC_EMAIL_REQUIRED = 881, + // Room for in-game strings 882-999 not used // Level 4 (CLI only commands) LANG_COMMAND_EXIT = 1000, diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index ffd8805901a..0e85815a054 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -277,18 +277,15 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) { if (!AntiDOS.EvaluateOpcode(*packet)) { - delete packet; - packet = NULL; KickPlayer(); } - - if (packet && packet->GetOpcode() >= NUM_MSG_TYPES) + else if (packet->GetOpcode() >= NUM_MSG_TYPES) { TC_LOG_ERROR(LOG_FILTER_OPCODES, "Received non-existed opcode %s from %s", GetOpcodeNameForLogging(packet->GetOpcode()).c_str() , GetPlayerInfo().c_str()); sScriptMgr->OnUnknownPacketReceive(m_Socket, WorldPacket(*packet)); } - else if (packet) + else { OpcodeHandler &opHandle = opcodeTable[packet->GetOpcode()]; try @@ -373,7 +370,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) break; } } - catch(ByteBufferException &) + catch (ByteBufferException const&) { TC_LOG_ERROR(LOG_FILTER_GENERAL, "WorldSession::Update ByteBufferException occured while parsing a packet (opcode: %u) from client %s, accountid=%i. Skipped packet.", packet->GetOpcode(), GetRemoteAddress().c_str(), GetAccountId()); @@ -383,6 +380,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) if (deletePacket) delete packet; + + deletePacket = true; } if (m_Socket && !m_Socket->IsClosed() && _warden) diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 625ebff8471..508fc0351a9 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -445,9 +445,15 @@ int WorldSocket::Update (void) if (closing_) return -1; - if (m_OutActive || (m_OutBuffer->length() == 0 && msg_queue()->is_empty())) + if (m_OutActive) return 0; + { + ACE_GUARD_RETURN (LockType, Guard, m_OutBufferLock, 0); + if (m_OutBuffer->length() == 0 && msg_queue()->is_empty()) + return 0; + } + int ret; do ret = handle_output(get_handle()); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 2bc4f3a0258..cf6ad3f9886 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -83,7 +83,7 @@ ACE_Atomic_Op<ACE_Thread_Mutex, bool> World::m_stopEvent = false; uint8 World::m_ExitCode = SHUTDOWN_EXIT_CODE; -volatile uint32 World::m_worldLoopCounter = 0; +ACE_Atomic_Op<ACE_Thread_Mutex, uint32> World::m_worldLoopCounter = 0; float World::m_MaxVisibleDistanceOnContinents = DEFAULT_VISIBILITY_DISTANCE; float World::m_MaxVisibleDistanceInInstances = DEFAULT_VISIBILITY_INSTANCE; @@ -1192,6 +1192,9 @@ void World::LoadConfigSettings(bool reload) // DBC_ItemAttributes m_bool_configs[CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES] = sConfigMgr->GetBoolDefault("DBC.EnforceItemAttributes", true); + // Accountpassword Secruity + m_int_configs[CONFIG_ACC_PASSCHANGESEC] = sConfigMgr->GetIntDefault("Account.PasswordChangeSecurity", 0); + // Max instances per hour m_int_configs[CONFIG_MAX_INSTANCES_PER_HOUR] = sConfigMgr->GetIntDefault("AccountInstancesPerHour", 5); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index bf90b5ac01a..907491437c4 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -329,6 +329,7 @@ enum WorldIntConfigs CONFIG_PACKET_SPOOF_POLICY, CONFIG_PACKET_SPOOF_BANMODE, CONFIG_PACKET_SPOOF_BANDURATION, + CONFIG_ACC_PASSCHANGESEC, INT_CONFIG_VALUE_COUNT }; @@ -514,7 +515,7 @@ struct CharacterNameData class World { public: - static volatile uint32 m_worldLoopCounter; + static ACE_Atomic_Op<ACE_Thread_Mutex, uint32> m_worldLoopCounter; World(); ~World(); |
