aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/CharacterHandler.cpp
diff options
context:
space:
mode:
authorAokromes <Aokromes@users.noreply.github.com>2014-06-23 22:48:35 +0200
committerAokromes <Aokromes@users.noreply.github.com>2014-06-23 22:48:35 +0200
commit84e6af26e62eab87f94d2889943590d088f2ab65 (patch)
tree12238630eaccd03a9c64219f9ce650b0cb04e51e /src/server/game/Handlers/CharacterHandler.cpp
parent7b832135218d58322c7fa93defb3dbc0a68b3fbd (diff)
parent6949735098144e478451e73179ca2d9c6e7344f7 (diff)
Merge pull request #11976 from Ascathor/master
Core/Misc: New ability to log account IP access history
Diffstat (limited to 'src/server/game/Handlers/CharacterHandler.cpp')
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 330b11e047f..c2f93190a05 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -696,10 +696,15 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData)
{
uint64 guid;
recvData >> guid;
+ // Initiating
+ uint32 initAccountId = GetAccountId();
// can't delete loaded character
if (ObjectAccessor::FindPlayer(guid))
+ {
+ sScriptMgr->OnPlayerFailedDelete(guid, initAccountId);
return;
+ }
uint32 accountId = 0;
uint8 level = 0;
@@ -708,6 +713,7 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData)
// is guild leader
if (sGuildMgr->GetGuildByLeader(guid))
{
+ sScriptMgr->OnPlayerFailedDelete(guid, initAccountId);
WorldPacket data(SMSG_CHAR_DELETE, 1);
data << uint8(CHAR_DELETE_FAILED_GUILD_LEADER);
SendPacket(&data);
@@ -717,6 +723,7 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData)
// is arena team captain
if (sArenaTeamMgr->GetArenaTeamByCaptain(guid))
{
+ sScriptMgr->OnPlayerFailedDelete(guid, initAccountId);
WorldPacket data(SMSG_CHAR_DELETE, 1);
data << uint8(CHAR_DELETE_FAILED_ARENA_CAPTAIN);
SendPacket(&data);
@@ -735,12 +742,18 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData)
}
// prevent deleting other players' characters using cheating tools
- if (accountId != GetAccountId())
+ if (accountId != initAccountId)
+ {
+ sScriptMgr->OnPlayerFailedDelete(guid, initAccountId);
return;
+ }
std::string IP_str = GetRemoteAddress();
TC_LOG_INFO("entities.player.character", "Account: %d, IP: %s deleted character: %s, GUID: %u, Level: %u", accountId, IP_str.c_str(), name.c_str(), GUID_LOPART(guid), level);
- sScriptMgr->OnPlayerDelete(guid);
+
+ // To prevent hook failure, place hook before removing reference from DB
+ sScriptMgr->OnPlayerDelete(guid, initAccountId); // To prevent race conditioning, but as it also makes sense, we hand the accountId over for successful delete.
+ // Shouldn't interfere with character deletion though
if (sLog->ShouldLog("entities.player.dump", LOG_LEVEL_INFO)) // optimize GetPlayerDump call
{