aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Object/Object.h21
-rw-r--r--src/server/game/Entities/Player/Player.cpp30
-rw-r--r--src/server/game/Entities/Player/Player.h8
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp21
-rw-r--r--src/server/game/Globals/ObjectMgr.h2
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp651
-rw-r--r--src/server/game/Server/WorldSession.cpp9
-rw-r--r--src/server/game/Server/WorldSession.h89
-rw-r--r--src/server/scripts/Commands/cs_account.cpp2
-rw-r--r--src/server/scripts/Commands/cs_battlenet_account.cpp2
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp7
-rw-r--r--src/server/scripts/Commands/cs_tele.cpp14
12 files changed, 431 insertions, 425 deletions
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index b8410ec307c..41658946aee 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -474,12 +474,23 @@ struct MovementInfo
class WorldLocation : public Position
{
public:
- explicit WorldLocation(uint32 _mapid = MAPID_INVALID, float _x = 0, float _y = 0, float _z = 0, float _o = 0)
- : m_mapId(_mapid) { Relocate(_x, _y, _z, _o); }
- WorldLocation(const WorldLocation &loc) : Position(loc) { WorldRelocate(loc); }
+ explicit WorldLocation(uint32 _mapId = MAPID_INVALID, float _x = 0.f, float _y = 0.f, float _z = 0.f, float _o = 0.f)
+ : Position(_x, _y, _z, _o), m_mapId(_mapId) { }
- void WorldRelocate(const WorldLocation &loc)
- { m_mapId = loc.GetMapId(); Relocate(loc); }
+ WorldLocation(WorldLocation const& loc)
+ : Position(loc), m_mapId(loc.GetMapId()) { }
+
+ void WorldRelocate(WorldLocation const& loc)
+ {
+ m_mapId = loc.GetMapId();
+ Relocate(loc);
+ }
+
+ void WorldRelocate(uint32 _mapId = MAPID_INVALID, float _x = 0.f, float _y = 0.f, float _z = 0.f, float _o = 0.f)
+ {
+ m_mapId = _mapId;
+ Relocate(_x, _y, _z, _o);
+ }
WorldLocation GetWorldLocation() const
{
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 0935a2e8a72..bc2e655f09f 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -20468,19 +20468,19 @@ void Player::SendAttackSwingNotInRange()
GetSession()->SendPacket(&data);
}
-void Player::SavePositionInDB(uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid)
+void Player::SavePositionInDB(WorldLocation const& loc, uint16 zoneId, ObjectGuid guid, SQLTransaction& trans)
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_POSITION);
- stmt->setFloat(0, x);
- stmt->setFloat(1, y);
- stmt->setFloat(2, z);
- stmt->setFloat(3, o);
- stmt->setUInt16(4, uint16(mapid));
- stmt->setUInt16(5, uint16(zone));
+ stmt->setFloat(0, loc.GetPositionX());
+ stmt->setFloat(1, loc.GetPositionY());
+ stmt->setFloat(2, loc.GetPositionZ());
+ stmt->setFloat(3, loc.GetOrientation());
+ stmt->setUInt16(4, uint16(loc.GetMapId()));
+ stmt->setUInt16(5, zoneId);
stmt->setUInt32(6, guid.GetCounter());
- CharacterDatabase.Execute(stmt);
+ CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
void Player::SetUInt32ValueInArray(Tokenizer& Tokenizer, uint16 index, uint32 value)
@@ -20494,10 +20494,10 @@ void Player::SetUInt32ValueInArray(Tokenizer& Tokenizer, uint16 index, uint32 va
Tokenizer[index] = buf;
}
-void Player::Customize(ObjectGuid guid, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair)
+void Player::Customize(CharacterCustomizeInfo const* customizeInfo, SQLTransaction& trans)
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PLAYERBYTES2);
- stmt->setUInt32(0, guid.GetCounter());
+ stmt->setUInt32(0, customizeInfo->Guid.GetCounter());
PreparedQueryResult result = CharacterDatabase.Query(stmt);
if (!result)
@@ -20507,16 +20507,16 @@ void Player::Customize(ObjectGuid guid, uint8 gender, uint8 skin, uint8 face, ui
uint32 playerBytes2 = fields[0].GetUInt32();
playerBytes2 &= ~0xFF;
- playerBytes2 |= facialHair;
+ playerBytes2 |= customizeInfo->FacialHair;
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GENDER_PLAYERBYTES);
- stmt->setUInt8(0, gender);
- stmt->setUInt32(1, skin | (face << 8) | (hairStyle << 16) | (hairColor << 24));
+ stmt->setUInt8(0, customizeInfo->Gender);
+ stmt->setUInt32(1, customizeInfo->Skin | (customizeInfo->Face << 8) | (customizeInfo->HairStyle << 16) | (customizeInfo->HairColor << 24));
stmt->setUInt32(2, playerBytes2);
- stmt->setUInt32(3, guid.GetCounter());
+ stmt->setUInt32(3, customizeInfo->Guid.GetCounter());
- CharacterDatabase.Execute(stmt);
+ CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
void Player::SendAttackSwingDeadTarget()
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 2d4d5183a92..9a950e01780 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -56,6 +56,8 @@ class PlayerSocial;
class SpellCastTargets;
class UpdateMask;
+struct CharacterCustomizeInfo;
+
typedef std::deque<Mail*> PlayerMails;
#define PLAYER_MAX_SKILLS 128
@@ -1694,8 +1696,8 @@ class Player : public Unit, public GridObject<Player>
static void SetUInt32ValueInArray(Tokenizer& data, uint16 index, uint32 value);
static void SetFloatValueInArray(Tokenizer& data, uint16 index, float value);
- static void Customize(ObjectGuid guid, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair);
- static void SavePositionInDB(uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid);
+ static void Customize(CharacterCustomizeInfo const* customizeInfo, SQLTransaction& trans);
+ static void SavePositionInDB(WorldLocation const& loc, uint16 zoneId, ObjectGuid guid, SQLTransaction& trans);
static void DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRealmChars = true, bool deleteFinally = false);
static void DeleteOldCharacters();
@@ -1936,7 +1938,7 @@ class Player : public Unit, public GridObject<Player>
void SetContestedPvPTimer(uint32 newTime) {m_contestedPvPTimer = newTime;}
void ResetContestedPvP();
- /** todo: -maybe move UpdateDuelFlag+DuelComplete to independent DuelHandler.. **/
+ /// @todo: maybe move UpdateDuelFlag+DuelComplete to independent DuelHandler
DuelInfo* duel;
void UpdateDuelFlag(time_t currTime);
void CheckDuelDistance(time_t currTime);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 6ceee339d70..f7256dc862f 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -1662,7 +1662,7 @@ void ObjectMgr::LoadCreatures()
spawnMasks[i] |= (1 << k);
_creatureDataStore.rehash(result->GetRowCount());
- uint32 count = 0;
+
do
{
Field* fields = result->Fetch();
@@ -1800,12 +1800,10 @@ void ObjectMgr::LoadCreatures()
// Add to grid if not managed by the game event or pool system
if (gameEvent == 0 && PoolId == 0)
AddCreatureToGrid(guid, &data);
+ }
+ while (result->NextRow());
- ++count;
-
- } while (result->NextRow());
-
- TC_LOG_INFO("server.loading", ">> Loaded %u creatures in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " creatures in %u ms", _creatureDataStore.size(), GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::AddCreatureToGrid(uint32 guid, CreatureData const* data)
@@ -1976,8 +1974,6 @@ void ObjectMgr::LoadGameobjects()
{
uint32 oldMSTime = getMSTime();
- uint32 count = 0;
-
// 0 1 2 3 4 5 6
QueryResult result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation, "
// 7 8 9 10 11 12 13 14 15 16 17 18 19
@@ -2000,6 +1996,7 @@ void ObjectMgr::LoadGameobjects()
spawnMasks[i] |= (1 << k);
_gameObjectDataStore.rehash(result->GetRowCount());
+
do
{
Field* fields = result->Fetch();
@@ -2137,10 +2134,10 @@ void ObjectMgr::LoadGameobjects()
if (gameEvent == 0 && PoolId == 0) // if not this is to be managed by GameEvent System or Pool system
AddGameobjectToGrid(guid, &data);
- ++count;
- } while (result->NextRow());
+ }
+ while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %lu gameobjects in %u ms", (unsigned long)_gameObjectDataStore.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " gameobjects in %u ms", _gameObjectDataStore.size(), GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::AddGameobjectToGrid(uint32 guid, GameObjectData const* data)
@@ -7688,7 +7685,7 @@ bool isValidString(const std::wstring& wstr, uint32 strictMask, bool numericOrSp
return false;
}
-uint8 ObjectMgr::CheckPlayerName(const std::string& name, bool create)
+ResponseCodes ObjectMgr::CheckPlayerName(const std::string& name, bool create)
{
std::wstring wname;
if (!Utf8toWStr(name, wname))
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index abd452eaeb0..018fa415438 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -1234,7 +1234,7 @@ class ObjectMgr
bool IsReservedName(std::string const& name) const;
// name with valid structure and symbols
- static uint8 CheckPlayerName(std::string const& name, bool create = false);
+ static ResponseCodes CheckPlayerName(std::string const& name, bool create = false);
static PetNameInvalidReason CheckPetName(std::string const& name);
static bool IsValidCharterName(std::string const& name);
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index bef7aada6e9..854e00595dc 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -267,7 +267,7 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result)
SendPacket(&data);
}
-void WorldSession::HandleCharEnumOpcode(WorldPacket & /*recvData*/)
+void WorldSession::HandleCharEnumOpcode(WorldPacket& /*recvData*/)
{
// remove expired bans
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXPIRED_BANS);
@@ -288,20 +288,18 @@ void WorldSession::HandleCharEnumOpcode(WorldPacket & /*recvData*/)
void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData)
{
- std::string name;
- uint8 race_, class_;
-
- recvData >> name;
-
- recvData >> race_;
- recvData >> class_;
-
- // extract other data required for player creating
- uint8 gender, skin, face, hairStyle, hairColor, facialHair, outfitId;
- recvData >> gender >> skin >> face;
- recvData >> hairStyle >> hairColor >> facialHair >> outfitId;
-
- WorldPacket data(SMSG_CHAR_CREATE, 1); // returned with diff.values in all cases
+ CharacterCreateInfo createInfo;
+
+ recvData >> createInfo.Name
+ >> createInfo.Race
+ >> createInfo.Class
+ >> createInfo.Gender
+ >> createInfo.Skin
+ >> createInfo.Face
+ >> createInfo.HairStyle
+ >> createInfo.HairColor
+ >> createInfo.FacialHair
+ >> createInfo.OutfitId;
if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_TEAMMASK))
{
@@ -309,8 +307,7 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData)
{
bool disabled = false;
- uint32 team = Player::TeamForRace(race_);
- switch (team)
+ switch (Player::TeamForRace(createInfo.Race))
{
case ALLIANCE:
disabled = (mask & (1 << 0)) != 0;
@@ -322,56 +319,50 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData)
if (disabled)
{
- data << uint8(CHAR_CREATE_DISABLED);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_DISABLED);
return;
}
}
}
- ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_);
+ ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(createInfo.Class);
if (!classEntry)
{
- data << uint8(CHAR_CREATE_FAILED);
- SendPacket(&data);
- TC_LOG_ERROR("network", "Class (%u) not found in DBC while creating new char for account (ID: %u): wrong DBC files or cheater?", class_, GetAccountId());
+ TC_LOG_ERROR("network", "Class (%u) not found in DBC while creating new char for account (ID: %u): wrong DBC files or cheater?", createInfo.Class, GetAccountId());
+ SendCharCreate(CHAR_CREATE_FAILED);
return;
}
- ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race_);
+ ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(createInfo.Race);
if (!raceEntry)
{
- data << uint8(CHAR_CREATE_FAILED);
- SendPacket(&data);
- TC_LOG_ERROR("network", "Race (%u) not found in DBC while creating new char for account (ID: %u): wrong DBC files or cheater?", race_, GetAccountId());
+ TC_LOG_ERROR("network", "Race (%u) not found in DBC while creating new char for account (ID: %u): wrong DBC files or cheater?", createInfo.Race, GetAccountId());
+ SendCharCreate(CHAR_CREATE_FAILED);
return;
}
// prevent character creating Expansion race without Expansion account
if (raceEntry->expansion > Expansion())
{
- data << uint8(CHAR_CREATE_EXPANSION);
- TC_LOG_ERROR("network", "Expansion %u account:[%d] tried to Create character with expansion %u race (%u)", Expansion(), GetAccountId(), raceEntry->expansion, race_);
- SendPacket(&data);
+ TC_LOG_ERROR("network", "Expansion %u account:[%d] tried to Create character with expansion %u race (%u)", Expansion(), GetAccountId(), raceEntry->expansion, createInfo.Race);
+ SendCharCreate(CHAR_CREATE_EXPANSION);
return;
}
// prevent character creating Expansion class without Expansion account
if (classEntry->expansion > Expansion())
{
- data << uint8(CHAR_CREATE_EXPANSION_CLASS);
- TC_LOG_ERROR("network", "Expansion %u account:[%d] tried to Create character with expansion %u class (%u)", Expansion(), GetAccountId(), classEntry->expansion, class_);
- SendPacket(&data);
+ TC_LOG_ERROR("network", "Expansion %u account:[%d] tried to Create character with expansion %u class (%u)", Expansion(), GetAccountId(), classEntry->expansion, createInfo.Class);
+ SendCharCreate(CHAR_CREATE_EXPANSION_CLASS);
return;
}
if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RACEMASK))
{
uint32 raceMaskDisabled = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK);
- if ((1 << (race_ - 1)) & raceMaskDisabled)
+ if ((1 << (createInfo.Race - 1)) & raceMaskDisabled)
{
- data << uint8(CHAR_CREATE_DISABLED);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_DISABLED);
return;
}
}
@@ -379,47 +370,42 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData)
if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_CLASSMASK))
{
uint32 classMaskDisabled = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK);
- if ((1 << (class_ - 1)) & classMaskDisabled)
+ if ((1 << (createInfo.Class - 1)) & classMaskDisabled)
{
- data << uint8(CHAR_CREATE_DISABLED);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_DISABLED);
return;
}
}
// prevent character creating with invalid name
- if (!normalizePlayerName(name))
+ if (!normalizePlayerName(createInfo.Name))
{
- data << uint8(CHAR_NAME_NO_NAME);
- SendPacket(&data);
TC_LOG_ERROR("network", "Account:[%d] but tried to Create character with empty [name] ", GetAccountId());
+ SendCharCreate(CHAR_NAME_NO_NAME);
return;
}
// check name limitations
- uint8 res = ObjectMgr::CheckPlayerName(name, true);
+ ResponseCodes res = ObjectMgr::CheckPlayerName(createInfo.Name, true);
if (res != CHAR_NAME_SUCCESS)
{
- data << uint8(res);
- SendPacket(&data);
+ SendCharCreate(res);
return;
}
- if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(name))
+ if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(createInfo.Name))
{
- data << uint8(CHAR_NAME_RESERVED);
- SendPacket(&data);
+ SendCharCreate(CHAR_NAME_RESERVED);
return;
}
- if (class_ == CLASS_DEATH_KNIGHT && !HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_HEROIC_CHARACTER))
+ if (createInfo.Class == CLASS_DEATH_KNIGHT && !HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_HEROIC_CHARACTER))
{
// speedup check for heroic class disabled case
uint32 heroic_free_slots = sWorld->getIntConfig(CONFIG_HEROIC_CHARACTERS_PER_REALM);
if (heroic_free_slots == 0)
{
- data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
return;
}
@@ -427,16 +413,16 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData)
uint32 req_level_for_heroic = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_HEROIC_CHARACTER);
if (req_level_for_heroic > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
{
- data << uint8(CHAR_CREATE_LEVEL_REQUIREMENT);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_LEVEL_REQUIREMENT);
return;
}
}
- delete _charCreateCallback.GetParam(); // Delete existing if any, to make the callback chain reset to stage 0
- _charCreateCallback.SetParam(new CharacterCreateInfo(name, race_, class_, gender, skin, face, hairStyle, hairColor, facialHair, outfitId, recvData));
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHECK_NAME);
- stmt->setString(0, name);
+ stmt->setString(0, createInfo.Name);
+
+ delete _charCreateCallback.GetParam(); // Delete existing if any, to make the callback chain reset to stage 0
+ _charCreateCallback.SetParam(new CharacterCreateInfo(std::move(createInfo)));
_charCreateCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
}
@@ -452,9 +438,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
{
if (result)
{
- WorldPacket data(SMSG_CHAR_CREATE, 1);
- data << uint8(CHAR_CREATE_NAME_IN_USE);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_NAME_IN_USE);
delete createInfo;
_charCreateCallback.Reset();
return;
@@ -468,8 +452,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
_charCreateCallback.FreeResult();
_charCreateCallback.SetFutureResult(LoginDatabase.AsyncQuery(stmt));
_charCreateCallback.NextStage();
+ break;
}
- break;
case 1:
{
uint16 acctCharCount = 0;
@@ -484,15 +468,12 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
if (acctCharCount >= sWorld->getIntConfig(CONFIG_CHARACTERS_PER_ACCOUNT))
{
- WorldPacket data(SMSG_CHAR_CREATE, 1);
- data << uint8(CHAR_CREATE_ACCOUNT_LIMIT);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_ACCOUNT_LIMIT);
delete createInfo;
_charCreateCallback.Reset();
return;
}
-
ASSERT(_charCreateCallback.GetParam() == createInfo);
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_SUM_CHARS);
@@ -501,8 +482,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
_charCreateCallback.FreeResult();
_charCreateCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
_charCreateCallback.NextStage();
+ break;
}
- break;
case 2:
{
if (result)
@@ -512,9 +493,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
if (createInfo->CharCount >= sWorld->getIntConfig(CONFIG_CHARACTERS_PER_REALM))
{
- WorldPacket data(SMSG_CHAR_CREATE, 1);
- data << uint8(CHAR_CREATE_SERVER_LIMIT);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_SERVER_LIMIT);
delete createInfo;
_charCreateCallback.Reset();
return;
@@ -538,8 +517,8 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
_charCreateCallback.NextStage();
HandleCharCreateCallback(PreparedQueryResult(NULL), createInfo); // Will jump to case 3
+ break;
}
- break;
case 3:
{
bool haveSameRace = false;
@@ -567,9 +546,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
if (freeHeroicSlots == 0)
{
- WorldPacket data(SMSG_CHAR_CREATE, 1);
- data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
delete createInfo;
_charCreateCallback.Reset();
return;
@@ -594,9 +571,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
if (accTeam != team)
{
- WorldPacket data(SMSG_CHAR_CREATE, 1);
- data << uint8(CHAR_CREATE_PVP_TEAMS_VIOLATION);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_PVP_TEAMS_VIOLATION);
delete createInfo;
_charCreateCallback.Reset();
return;
@@ -626,9 +601,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
if (freeHeroicSlots == 0)
{
- WorldPacket data(SMSG_CHAR_CREATE, 1);
- data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
delete createInfo;
_charCreateCallback.Reset();
return;
@@ -647,21 +620,12 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
if (checkHeroicReqs && !hasHeroicReqLevel)
{
- WorldPacket data(SMSG_CHAR_CREATE, 1);
- data << uint8(CHAR_CREATE_LEVEL_REQUIREMENT);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_LEVEL_REQUIREMENT);
delete createInfo;
_charCreateCallback.Reset();
return;
}
- if (createInfo->Data.rpos() < createInfo->Data.wpos())
- {
- uint8 unk;
- createInfo->Data >> unk;
- TC_LOG_DEBUG("network", "Character creation %s (account %u) has unhandled tail data: [%u]", createInfo->Name.c_str(), GetAccountId(), unk);
- }
-
Player newChar(this);
newChar.GetMotionMaster()->Initialize();
if (!newChar.Create(sObjectMgr->GenerateLowGuid(HIGHGUID_PLAYER), createInfo))
@@ -669,9 +633,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
// Player not create (race/class/etc problem?)
newChar.CleanupsBeforeDelete();
- WorldPacket data(SMSG_CHAR_CREATE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_ERROR);
delete createInfo;
_charCreateCallback.Reset();
return;
@@ -701,20 +663,17 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
LoginDatabase.CommitTransaction(trans);
- WorldPacket data(SMSG_CHAR_CREATE, 1);
- data << uint8(CHAR_CREATE_SUCCESS);
- SendPacket(&data);
+ SendCharCreate(CHAR_CREATE_SUCCESS);
- std::string IP_str = GetRemoteAddress();
- TC_LOG_INFO("entities.player.character", "Account: %d (IP: %s) Create Character:[%s] (GUID: %u)", GetAccountId(), IP_str.c_str(), createInfo->Name.c_str(), newChar.GetGUIDLow());
+ TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Create Character:[%s] (GUID: %u)", GetAccountId(), GetRemoteAddress().c_str(), createInfo->Name.c_str(), newChar.GetGUIDLow());
sScriptMgr->OnPlayerCreate(&newChar);
sWorld->AddCharacterNameData(newChar.GetGUID(), newChar.GetName(), newChar.getGender(), newChar.getRace(), newChar.getClass(), newChar.getLevel());
newChar.CleanupsBeforeDelete();
delete createInfo;
_charCreateCallback.Reset();
+ break;
}
- break;
}
}
@@ -740,9 +699,7 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData)
if (sGuildMgr->GetGuildByLeader(guid))
{
sScriptMgr->OnPlayerFailedDelete(guid, initAccountId);
- WorldPacket data(SMSG_CHAR_DELETE, 1);
- data << uint8(CHAR_DELETE_FAILED_GUILD_LEADER);
- SendPacket(&data);
+ SendCharDelete(CHAR_DELETE_FAILED_GUILD_LEADER);
return;
}
@@ -750,9 +707,7 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData)
if (sArenaTeamMgr->GetArenaTeamByCaptain(guid))
{
sScriptMgr->OnPlayerFailedDelete(guid, initAccountId);
- WorldPacket data(SMSG_CHAR_DELETE, 1);
- data << uint8(CHAR_DELETE_FAILED_ARENA_CAPTAIN);
- SendPacket(&data);
+ SendCharDelete(CHAR_DELETE_FAILED_ARENA_CAPTAIN);
return;
}
@@ -774,8 +729,7 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData)
return;
}
- std::string IP_str = GetRemoteAddress();
- TC_LOG_INFO("entities.player.character", "Account: %d, IP: %s deleted character: %s, %s, Level: %u", accountId, IP_str.c_str(), name.c_str(), guid.ToString().c_str(), level);
+ TC_LOG_INFO("entities.player.character", "Account: %u, IP: %s deleted character: %s, %s, Level: %u", accountId, GetRemoteAddress().c_str(), name.c_str(), guid.ToString().c_str(), level);
// 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.
@@ -792,9 +746,7 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData)
sCalendarMgr->RemoveAllPlayerEventsAndInvites(guid);
Player::DeleteFromDB(guid, accountId);
- WorldPacket data(SMSG_CHAR_DELETE, 1);
- data << uint8(CHAR_DELETE_SUCCESS);
- SendPacket(&data);
+ SendCharDelete(CHAR_DELETE_SUCCESS);
}
void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData)
@@ -1127,7 +1079,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
SendNotification(LANG_GM_ON);
std::string IP_str = GetRemoteAddress();
- TC_LOG_INFO("entities.player.character", "Account: %d (IP: %s) Login Character:[%s] (GUID: %u) Level: %d",
+ TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Login Character:[%s] (GUID: %u) Level: %d",
GetAccountId(), IP_str.c_str(), pCurrChar->GetName().c_str(), pCurrChar->GetGUIDLow(), pCurrChar->getLevel());
if (!pCurrChar->IsStandState() && !pCurrChar->HasUnitState(UNIT_STATE_STUNNED))
@@ -1159,7 +1111,7 @@ void WorldSession::HandleSetFactionAtWar(WorldPacket& recvData)
}
//I think this function is never used :/ I dunno, but i guess this opcode not exists
-void WorldSession::HandleSetFactionCheat(WorldPacket & /*recvData*/)
+void WorldSession::HandleSetFactionCheat(WorldPacket& /*recvData*/)
{
TC_LOG_ERROR("network", "WORLD SESSION: HandleSetFactionCheat, not expected call, please report.");
GetPlayer()->GetReputationMgr().SendStates();
@@ -1227,63 +1179,52 @@ void WorldSession::HandleShowingCloakOpcode(WorldPacket& recvData)
void WorldSession::HandleCharRenameOpcode(WorldPacket& recvData)
{
- ObjectGuid guid;
- std::string newName;
+ CharacterRenameInfo renameInfo;
- recvData >> guid;
- recvData >> newName;
+ recvData >> renameInfo.Guid
+ >> renameInfo.Name;
// prevent character rename to invalid name
- if (!normalizePlayerName(newName))
+ if (!normalizePlayerName(renameInfo.Name))
{
- WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << uint8(CHAR_NAME_NO_NAME);
- SendPacket(&data);
+ SendCharRename(CHAR_NAME_NO_NAME, renameInfo);
return;
}
- uint8 res = ObjectMgr::CheckPlayerName(newName, true);
+ ResponseCodes res = ObjectMgr::CheckPlayerName(renameInfo.Name, true);
if (res != CHAR_NAME_SUCCESS)
{
- WorldPacket data(SMSG_CHAR_RENAME, 1+8+(newName.size()+1));
- data << uint8(res);
- data << uint64(guid);
- data << newName;
- SendPacket(&data);
+ SendCharRename(res, renameInfo);
return;
}
// check name limitations
- if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(newName))
+ if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(renameInfo.Name))
{
- WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << uint8(CHAR_NAME_RESERVED);
- SendPacket(&data);
+ SendCharRename(CHAR_NAME_RESERVED, renameInfo);
return;
}
// Ensure that the character belongs to the current account, that rename at login is enabled
// and that there is no character with the desired new name
- _charRenameCallback.SetParam(newName);
-
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_FREE_NAME);
- stmt->setUInt32(0, guid.GetCounter());
+ stmt->setUInt32(0, renameInfo.Guid.GetCounter());
stmt->setUInt32(1, GetAccountId());
stmt->setUInt16(2, AT_LOGIN_RENAME);
stmt->setUInt16(3, AT_LOGIN_RENAME);
- stmt->setString(4, newName);
+ stmt->setString(4, renameInfo.Name);
+ delete _charRenameCallback.GetParam();
+ _charRenameCallback.SetParam(new CharacterRenameInfo(std::move(renameInfo)));
_charRenameCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
}
-void WorldSession::HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, std::string const& newName)
+void WorldSession::HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, CharacterRenameInfo const* renameInfo)
{
if (!result)
{
- WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket(&data);
+ SendCharRename(CHAR_CREATE_ERROR, *renameInfo);
return;
}
@@ -1292,12 +1233,10 @@ void WorldSession::HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult resu
uint32 guidLow = fields[0].GetUInt32();
std::string oldName = fields[1].GetString();
- ObjectGuid guid = ObjectGuid(HIGHGUID_PLAYER, guidLow);
-
// Update name and at_login flag in the db
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_NAME);
- stmt->setString(0, newName);
+ stmt->setString(0, renameInfo->Name);
stmt->setUInt16(1, AT_LOGIN_RENAME);
stmt->setUInt32(2, guidLow);
@@ -1310,15 +1249,11 @@ void WorldSession::HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult resu
CharacterDatabase.Execute(stmt);
- TC_LOG_INFO("entities.player.character", "Account: %d (IP: %s) Character:[%s] (%s) Changed name to: %s", GetAccountId(), GetRemoteAddress().c_str(), oldName.c_str(), guid.ToString().c_str(), newName.c_str());
+ TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Character:[%s] (%s) Changed name to: %s", GetAccountId(), GetRemoteAddress().c_str(), oldName.c_str(), renameInfo->Guid.ToString().c_str(), renameInfo->Name.c_str());
- WorldPacket data(SMSG_CHAR_RENAME, 1+8+(newName.size()+1));
- data << uint8(RESPONSE_SUCCESS);
- data << uint64(guid);
- data << newName;
- SendPacket(&data);
+ SendCharRename(RESPONSE_SUCCESS, *renameInfo);
- sWorld->UpdateCharacterNameData(guid, newName);
+ sWorld->UpdateCharacterNameData(renameInfo->Guid, renameInfo->Name);
}
void WorldSession::HandleSetPlayerDeclinedNames(WorldPacket& recvData)
@@ -1331,26 +1266,20 @@ void WorldSession::HandleSetPlayerDeclinedNames(WorldPacket& recvData)
std::string name;
if (!sObjectMgr->GetPlayerNameByGUID(guid, name))
{
- WorldPacket data(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, 4+8);
- data << uint32(1);
- SendPacket(&data);
+ SendSetPlayerDeclinedNamesResult(DECLINED_NAMES_RESULT_ERROR, guid);
return;
}
std::wstring wname;
if (!Utf8toWStr(name, wname))
{
- WorldPacket data(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, 4+8);
- data << uint32(1);
- SendPacket(&data);
+ SendSetPlayerDeclinedNamesResult(DECLINED_NAMES_RESULT_ERROR, guid);
return;
}
if (!isCyrillicCharacter(wname[0])) // name already stored as only single alphabet using
{
- WorldPacket data(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, 4+8);
- data << uint32(1);
- SendPacket(&data);
+ SendSetPlayerDeclinedNamesResult(DECLINED_NAMES_RESULT_ERROR, guid);
return;
}
@@ -1361,9 +1290,7 @@ void WorldSession::HandleSetPlayerDeclinedNames(WorldPacket& recvData)
if (name2 != name) // character have different name
{
- WorldPacket data(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, 4+8);
- data << uint32(1);
- SendPacket(&data);
+ SendSetPlayerDeclinedNamesResult(DECLINED_NAMES_RESULT_ERROR, guid);
return;
}
@@ -1372,18 +1299,14 @@ void WorldSession::HandleSetPlayerDeclinedNames(WorldPacket& recvData)
recvData >> declinedname.name[i];
if (!normalizePlayerName(declinedname.name[i]))
{
- WorldPacket data(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, 4+8);
- data << uint32(1);
- SendPacket(&data);
+ SendSetPlayerDeclinedNamesResult(DECLINED_NAMES_RESULT_ERROR, guid);
return;
}
}
if (!ObjectMgr::CheckDeclinedNames(wname, declinedname))
{
- WorldPacket data(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, 4+8);
- data << uint32(1);
- SendPacket(&data);
+ SendSetPlayerDeclinedNamesResult(DECLINED_NAMES_RESULT_ERROR, guid);
return;
}
@@ -1406,10 +1329,7 @@ void WorldSession::HandleSetPlayerDeclinedNames(WorldPacket& recvData)
CharacterDatabase.CommitTransaction(trans);
- WorldPacket data(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, 4+8);
- data << uint32(0); // OK
- data << uint64(guid);
- SendPacket(&data);
+ SendSetPlayerDeclinedNamesResult(DECLINED_NAMES_RESULT_SUCCESS, guid);
}
void WorldSession::HandleAlterAppearance(WorldPacket& recvData)
@@ -1437,17 +1357,13 @@ void WorldSession::HandleAlterAppearance(WorldPacket& recvData)
GameObject* go = _player->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_BARBER_CHAIR, 5.0f);
if (!go)
{
- WorldPacket data(SMSG_BARBER_SHOP_RESULT, 4);
- data << uint32(2);
- SendPacket(&data);
+ SendBarberShopResult(BARBER_SHOP_RESULT_NOT_ON_CHAIR);
return;
}
if (_player->getStandState() != UNIT_STAND_STATE_SIT_LOW_CHAIR + go->GetGOInfo()->barberChair.chairheight)
{
- WorldPacket data(SMSG_BARBER_SHOP_RESULT, 4);
- data << uint32(2);
- SendPacket(&data);
+ SendBarberShopResult(BARBER_SHOP_RESULT_NOT_ON_CHAIR);
return;
}
@@ -1458,17 +1374,11 @@ void WorldSession::HandleAlterAppearance(WorldPacket& recvData)
// 2 - you have to sit on barber chair
if (!_player->HasEnoughMoney((uint64)cost))
{
- WorldPacket data(SMSG_BARBER_SHOP_RESULT, 4);
- data << uint32(1); // no money
- SendPacket(&data);
+ SendBarberShopResult(BARBER_SHOP_RESULT_NO_MONEY);
return;
}
- else
- {
- WorldPacket data(SMSG_BARBER_SHOP_RESULT, 4);
- data << uint32(0); // ok
- SendPacket(&data);
- }
+
+ SendBarberShopResult(BARBER_SHOP_RESULT_SUCCESS);
_player->ModifyMoney(-int64(cost)); // it isn't free
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER, cost);
@@ -1508,34 +1418,34 @@ void WorldSession::HandleRemoveGlyph(WorldPacket& recvData)
void WorldSession::HandleCharCustomize(WorldPacket& recvData)
{
- ObjectGuid guid;
- std::string newName;
+ CharacterCustomizeInfo customizeInfo;
- recvData >> guid;
- if (!IsLegitCharacterForAccount(guid))
+ recvData >> customizeInfo.Guid;
+ if (!IsLegitCharacterForAccount(customizeInfo.Guid))
{
TC_LOG_ERROR("network", "Account %u, IP: %s tried to customise %s, but it does not belong to their account!",
- GetAccountId(), GetRemoteAddress().c_str(), guid.ToString().c_str());
+ GetAccountId(), GetRemoteAddress().c_str(), customizeInfo.Guid.ToString().c_str());
recvData.rfinish();
KickPlayer();
return;
}
- recvData >> newName;
-
- uint8 gender, skin, face, hairStyle, hairColor, facialHair;
- recvData >> gender >> skin >> hairColor >> hairStyle >> facialHair >> face;
+ recvData >> customizeInfo.Name
+ >> customizeInfo.Gender
+ >> customizeInfo.Skin
+ >> customizeInfo.HairColor
+ >> customizeInfo.HairStyle
+ >> customizeInfo.FacialHair
+ >> customizeInfo.Face;
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_AT_LOGIN);
- stmt->setUInt32(0, guid.GetCounter());
+ stmt->setUInt32(0, customizeInfo.Guid.GetCounter());
// TODO: Make async with callback
PreparedQueryResult result = CharacterDatabase.Query(stmt);
if (!result)
{
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket(&data);
+ SendCharCustomize(CHAR_CREATE_ERROR, customizeInfo);
return;
}
@@ -1544,90 +1454,73 @@ void WorldSession::HandleCharCustomize(WorldPacket& recvData)
if (!(at_loginFlags & AT_LOGIN_CUSTOMIZE))
{
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket(&data);
+ SendCharCustomize(CHAR_CREATE_ERROR, customizeInfo);
return;
}
// prevent character rename to invalid name
- if (!normalizePlayerName(newName))
+ if (!normalizePlayerName(customizeInfo.Name))
{
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_NAME_NO_NAME);
- SendPacket(&data);
+ SendCharCustomize(CHAR_NAME_NO_NAME, customizeInfo);
return;
}
- uint8 res = ObjectMgr::CheckPlayerName(newName, true);
+ ResponseCodes res = ObjectMgr::CheckPlayerName(customizeInfo.Name, true);
if (res != CHAR_NAME_SUCCESS)
{
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(res);
- SendPacket(&data);
+ SendCharCustomize(res, customizeInfo);
return;
}
// check name limitations
- if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(newName))
+ if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(customizeInfo.Name))
{
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_NAME_RESERVED);
- SendPacket(&data);
+ SendCharCustomize(CHAR_NAME_RESERVED, customizeInfo);
return;
}
// character with this name already exist
- if (ObjectGuid newguid = sObjectMgr->GetPlayerGUIDByName(newName))
+ if (ObjectGuid newGuid = sObjectMgr->GetPlayerGUIDByName(customizeInfo.Name))
{
- if (newguid != guid)
+ if (newGuid != customizeInfo.Guid)
{
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_CREATE_NAME_IN_USE);
- SendPacket(&data);
+ SendCharCustomize(CHAR_CREATE_NAME_IN_USE, customizeInfo);
return;
}
}
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_NAME);
- stmt->setUInt32(0, guid.GetCounter());
+ stmt->setUInt32(0, customizeInfo.Guid.GetCounter());
result = CharacterDatabase.Query(stmt);
if (result)
{
std::string oldname = result->Fetch()[0].GetString();
- TC_LOG_INFO("entities.player.character", "Account: %d (IP: %s), Character[%s] (%s) Customized to: %s", GetAccountId(), GetRemoteAddress().c_str(), oldname.c_str(), guid.ToString().c_str(), newName.c_str());
+ TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s), Character[%s] (%s) Customized to: %s",
+ GetAccountId(), GetRemoteAddress().c_str(), oldname.c_str(), customizeInfo.Guid.ToString().c_str(), customizeInfo.Name.c_str());
}
- Player::Customize(guid, gender, skin, face, hairStyle, hairColor, facialHair);
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_NAME_AT_LOGIN);
+ Player::Customize(&customizeInfo, trans);
- stmt->setString(0, newName);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_NAME_AT_LOGIN);
+ stmt->setString(0, customizeInfo.Name);
stmt->setUInt16(1, uint16(AT_LOGIN_CUSTOMIZE));
- stmt->setUInt32(2, guid.GetCounter());
+ stmt->setUInt32(2, customizeInfo.Guid.GetCounter());
- CharacterDatabase.Execute(stmt);
+ trans->Append(stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_DECLINED_NAME);
+ stmt->setUInt32(0, customizeInfo.Guid.GetCounter());
- stmt->setUInt32(0, guid.GetCounter());
+ trans->Append(stmt);
- CharacterDatabase.Execute(stmt);
+ CharacterDatabase.CommitTransaction(trans);
- sWorld->UpdateCharacterNameData(guid, newName, gender);
-
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1+8+(newName.size()+1)+6);
- data << uint8(RESPONSE_SUCCESS);
- data << uint64(guid);
- data << newName;
- data << uint8(gender);
- data << uint8(skin);
- data << uint8(face);
- data << uint8(hairStyle);
- data << uint8(hairColor);
- data << uint8(facialHair);
- SendPacket(&data);
+ sWorld->UpdateCharacterNameData(customizeInfo.Guid, customizeInfo.Name, customizeInfo.Gender);
+
+ SendCharCustomize(RESPONSE_SUCCESS, customizeInfo);
}
void WorldSession::HandleEquipmentSetSave(WorldPacket& recvData)
@@ -1682,7 +1575,7 @@ void WorldSession::HandleEquipmentSetSave(WorldPacket& recvData)
_player->SetEquipmentSet(index, eqSet);
}
-void WorldSession::HandleEquipmentSetDelete(WorldPacket &recvData)
+void WorldSession::HandleEquipmentSetDelete(WorldPacket& recvData)
{
TC_LOG_DEBUG("network", "CMSG_EQUIPMENT_SET_DELETE");
@@ -1750,32 +1643,34 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData)
void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
{
- ObjectGuid guid;
- std::string newname;
- uint8 gender, skin, face, hairStyle, hairColor, facialHair, race;
- recvData >> guid;
+ CharacterFactionChangeInfo factionChangeInfo;
+ recvData >> factionChangeInfo.Guid;
- if (!IsLegitCharacterForAccount(guid))
+ if (!IsLegitCharacterForAccount(factionChangeInfo.Guid))
{
TC_LOG_ERROR("network", "Account %u, IP: %s tried to factionchange character %s, but it does not belong to their account!",
- GetAccountId(), GetRemoteAddress().c_str(), guid.ToString().c_str());
+ GetAccountId(), GetRemoteAddress().c_str(), factionChangeInfo.Guid.ToString().c_str());
recvData.rfinish();
KickPlayer();
return;
}
- recvData >> newname;
- recvData >> gender >> skin >> hairColor >> hairStyle >> facialHair >> face >> race;
+ recvData >> factionChangeInfo.Name
+ >> factionChangeInfo.Gender
+ >> factionChangeInfo.Skin
+ >> factionChangeInfo.HairColor
+ >> factionChangeInfo.HairStyle
+ >> factionChangeInfo.FacialHair
+ >> factionChangeInfo.Face
+ >> factionChangeInfo.Race;
- uint32 lowGuid = guid.GetCounter();
+ uint32 lowGuid = factionChangeInfo.Guid.GetCounter();
// get the players old (at this moment current) race
- CharacterNameData const* nameData = sWorld->GetCharacterNameData(guid);
+ CharacterNameData const* nameData = sWorld->GetCharacterNameData(factionChangeInfo.Guid);
if (!nameData)
{
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket(&data);
+ SendCharFactionChange(CHAR_CREATE_ERROR, factionChangeInfo);
return;
}
@@ -1790,94 +1685,79 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
if (!result)
{
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket(&data);
+ SendCharFactionChange(CHAR_CREATE_ERROR, factionChangeInfo);
return;
}
Field* fields = result->Fetch();
uint32 at_loginFlags = fields[0].GetUInt16();
- char const* knownTitlesStr = fields[1].GetCString();
+ std::string knownTitlesStr = fields[1].GetString();
uint32 used_loginFlag = ((recvData.GetOpcode() == CMSG_CHAR_RACE_CHANGE) ? AT_LOGIN_CHANGE_RACE : AT_LOGIN_CHANGE_FACTION);
- if (!sObjectMgr->GetPlayerInfo(race, playerClass))
+ if (!sObjectMgr->GetPlayerInfo(factionChangeInfo.Race, playerClass))
{
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket(&data);
+ SendCharFactionChange(CHAR_CREATE_ERROR, factionChangeInfo);
return;
}
if (!(at_loginFlags & used_loginFlag))
{
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket(&data);
+ SendCharFactionChange(CHAR_CREATE_ERROR, factionChangeInfo);
return;
}
if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RACEMASK))
{
uint32 raceMaskDisabled = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK);
- if ((1 << (race - 1)) & raceMaskDisabled)
+ if ((1 << (factionChangeInfo.Race - 1)) & raceMaskDisabled)
{
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket(&data);
+ SendCharFactionChange(CHAR_CREATE_ERROR, factionChangeInfo);
return;
}
}
// prevent character rename to invalid name
- if (!normalizePlayerName(newname))
+ if (!normalizePlayerName(factionChangeInfo.Name))
{
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
- data << uint8(CHAR_NAME_NO_NAME);
- SendPacket(&data);
+ SendCharFactionChange(CHAR_NAME_NO_NAME, factionChangeInfo);
return;
}
- uint8 res = ObjectMgr::CheckPlayerName(newname, true);
+ ResponseCodes res = ObjectMgr::CheckPlayerName(factionChangeInfo.Name, true);
if (res != CHAR_NAME_SUCCESS)
{
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
- data << uint8(res);
- SendPacket(&data);
+ SendCharFactionChange(res, factionChangeInfo);
return;
}
// check name limitations
- if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(newname))
+ if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(factionChangeInfo.Name))
{
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
- data << uint8(CHAR_NAME_RESERVED);
- SendPacket(&data);
+ SendCharFactionChange(CHAR_NAME_RESERVED, factionChangeInfo);
return;
}
// character with this name already exist
- if (ObjectGuid newguid = sObjectMgr->GetPlayerGUIDByName(newname))
+ if (ObjectGuid newGuid = sObjectMgr->GetPlayerGUIDByName(factionChangeInfo.Name))
{
- if (newguid != guid)
+ if (newGuid != factionChangeInfo.Guid)
{
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
- data << uint8(CHAR_CREATE_NAME_IN_USE);
- SendPacket(&data);
+ SendCharFactionChange(CHAR_CREATE_NAME_IN_USE, factionChangeInfo);
return;
}
}
// resurrect the character in case he's dead
- sObjectAccessor->ConvertCorpseForPlayer(guid);
+ sObjectAccessor->ConvertCorpseForPlayer(factionChangeInfo.Guid);
- CharacterDatabase.EscapeString(newname);
- Player::Customize(guid, gender, skin, face, hairStyle, hairColor, facialHair);
SQLTransaction trans = CharacterDatabase.BeginTransaction();
+ CharacterDatabase.EscapeString(factionChangeInfo.Name);
+ Player::Customize(&factionChangeInfo, trans);
+
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_FACTION_OR_RACE);
- stmt->setString(0, newname);
- stmt->setUInt8(1, race);
+ stmt->setString(0, factionChangeInfo.Name);
+ stmt->setUInt8(1, factionChangeInfo.Race);
stmt->setUInt16(2, used_loginFlag);
stmt->setUInt32(3, lowGuid);
trans->Append(stmt);
@@ -1886,14 +1766,14 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
stmt->setUInt32(0, lowGuid);
trans->Append(stmt);
- sWorld->UpdateCharacterNameData(guid, newname, gender, race);
+ sWorld->UpdateCharacterNameData(factionChangeInfo.Guid, factionChangeInfo.Name, factionChangeInfo.Gender, factionChangeInfo.Race);
- if (oldRace != race)
+ if (oldRace != factionChangeInfo.Race)
{
TeamId team = TEAM_ALLIANCE;
// Search each faction is targeted
- switch (race)
+ switch (factionChangeInfo.Race)
{
case RACE_ORC:
case RACE_TAUREN:
@@ -1926,12 +1806,12 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
trans->Append(stmt);
// Race specific languages
- if (race != RACE_ORC && race != RACE_HUMAN)
+ if (factionChangeInfo.Race != RACE_ORC && factionChangeInfo.Race != RACE_HUMAN)
{
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILL_LANGUAGE);
stmt->setUInt32(0, lowGuid);
- switch (race)
+ switch (factionChangeInfo.Race)
{
case RACE_DWARF:
stmt->setUInt16(1, 111);
@@ -2032,9 +1912,9 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
PreparedQueryResult result = CharacterDatabase.Query(stmt);
if (result)
if (Guild* guild = sGuildMgr->GetGuildById((result->Fetch()[0]).GetUInt32()))
- guild->DeleteMember(guid, false, false, true);
+ guild->DeleteMember(factionChangeInfo.Guid, false, false, true);
- Player::LeaveAllArenaTeams(guid);
+ Player::LeaveAllArenaTeams(factionChangeInfo.Guid);
}
if (!HasPermission(rbac::RBAC_PERM_TWO_SIDE_ADD_FRIEND))
@@ -2056,26 +1936,29 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PLAYER_HOMEBIND);
stmt->setUInt32(0, lowGuid);
+
+ WorldLocation loc;
+ uint16 zoneId = 0;
if (team == TEAM_ALLIANCE)
{
- stmt->setUInt16(1, 0);
- stmt->setUInt16(2, 1519);
- stmt->setFloat (3, -8867.68f);
- stmt->setFloat (4, 673.373f);
- stmt->setFloat (5, 97.9034f);
- Player::SavePositionInDB(0, -8867.68f, 673.373f, 97.9034f, 0.0f, 1519, guid);
+ loc.WorldRelocate(0, -8867.68f, 673.373f, 97.9034f, 0.0f);
+ zoneId = 1519;
}
else
{
- stmt->setUInt16(1, 1);
- stmt->setUInt16(2, 1637);
- stmt->setFloat (3, 1633.33f);
- stmt->setFloat (4, -4439.11f);
- stmt->setFloat (5, 15.7588f);
- Player::SavePositionInDB(1, 1633.33f, -4439.11f, 15.7588f, 0.0f, 1637, guid);
+ loc.WorldRelocate(1, 1633.33f, -4439.11f, 15.7588f, 0.0f);
+ zoneId = 1637;
}
+
+ stmt->setUInt16(1, loc.GetMapId());
+ stmt->setUInt16(2, zoneId);
+ stmt->setFloat(3, loc.GetPositionX());
+ stmt->setFloat(4, loc.GetPositionY());
+ stmt->setFloat(5, loc.GetPositionZ());
trans->Append(stmt);
+ Player::SavePositionInDB(loc, zoneId, factionChangeInfo.Guid, trans);
+
// Achievement conversion
for (std::map<uint32, uint32>::const_iterator it = sObjectMgr->FactionChangeAchievements.begin(); it != sObjectMgr->FactionChangeAchievements.end(); ++it)
{
@@ -2182,52 +2065,49 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_REP_BY_FACTION);
stmt->setUInt32(0, oldReputation);
stmt->setUInt32(1, lowGuid);
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
- if (!result)
+ if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
{
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket(&data);
- return;
- }
+ Field* fields = result->Fetch();
+ int32 oldDBRep = fields[0].GetInt32();
+ FactionEntry const* factionEntry = sFactionStore.LookupEntry(oldReputation);
- Field* fields = result->Fetch();
- int32 oldDBRep = fields[0].GetInt32();
- FactionEntry const* factionEntry = sFactionStore.LookupEntry(oldReputation);
+ // old base reputation
+ int32 oldBaseRep = sObjectMgr->GetBaseReputationOf(factionEntry, oldRace, playerClass);
- // old base reputation
- int32 oldBaseRep = sObjectMgr->GetBaseReputationOf(factionEntry, oldRace, playerClass);
+ // new base reputation
+ int32 newBaseRep = sObjectMgr->GetBaseReputationOf(sFactionStore.LookupEntry(newReputation), factionChangeInfo.Race, playerClass);
- // new base reputation
- int32 newBaseRep = sObjectMgr->GetBaseReputationOf(sFactionStore.LookupEntry(newReputation), race, playerClass);
+ // final reputation shouldnt change
+ int32 FinalRep = oldDBRep + oldBaseRep;
+ int32 newDBRep = FinalRep - newBaseRep;
- // final reputation shouldnt change
- int32 FinalRep = oldDBRep + oldBaseRep;
- int32 newDBRep = FinalRep - newBaseRep;
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REP_BY_FACTION);
- stmt->setUInt32(0, newReputation);
- stmt->setUInt32(1, lowGuid);
- trans->Append(stmt);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REP_BY_FACTION);
+ stmt->setUInt32(0, newReputation);
+ stmt->setUInt32(1, lowGuid);
+ trans->Append(stmt);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_REP_FACTION_CHANGE);
- stmt->setUInt16(0, uint16(newReputation));
- stmt->setInt32(1, newDBRep);
- stmt->setUInt16(2, uint16(oldReputation));
- stmt->setUInt32(3, lowGuid);
- trans->Append(stmt);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_REP_FACTION_CHANGE);
+ stmt->setUInt16(0, uint16(newReputation));
+ stmt->setInt32(1, newDBRep);
+ stmt->setUInt16(2, uint16(oldReputation));
+ stmt->setUInt32(3, lowGuid);
+ trans->Append(stmt);
+ }
}
// Title conversion
- if (knownTitlesStr)
+ if (!knownTitlesStr.empty())
{
const uint32 ktcount = KNOWN_TITLES_SIZE * 2;
uint32 knownTitles[ktcount];
Tokenizer tokens(knownTitlesStr, ' ', ktcount);
if (tokens.size() != ktcount)
+ {
+ SendCharFactionChange(CHAR_CREATE_ERROR, factionChangeInfo);
return;
+ }
for (uint32 index = 0; index < ktcount; ++index)
knownTitles[index] = atol(tokens[index]);
@@ -2287,21 +2167,9 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData)
CharacterDatabase.CommitTransaction(trans);
- std::string IP_str = GetRemoteAddress();
- TC_LOG_DEBUG("entities.player", "%s (IP: %s) changed race from %u to %u", GetPlayerInfo().c_str(), IP_str.c_str(), oldRace, race);
-
- WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1 + 8 + (newname.size() + 1) + 1 + 1 + 1 + 1 + 1 + 1 + 1);
- data << uint8(RESPONSE_SUCCESS);
- data << uint64(guid);
- data << newname;
- data << uint8(gender);
- data << uint8(skin);
- data << uint8(face);
- data << uint8(hairStyle);
- data << uint8(hairColor);
- data << uint8(facialHair);
- data << uint8(race);
- SendPacket(&data);
+ TC_LOG_DEBUG("entities.player", "%s (IP: %s) changed race from %u to %u", GetPlayerInfo().c_str(), GetRemoteAddress().c_str(), oldRace, factionChangeInfo.Race);
+
+ SendCharFactionChange(RESPONSE_SUCCESS, factionChangeInfo);
}
void WorldSession::HandleRandomizeCharNameOpcode(WorldPacket& recvData)
@@ -2388,3 +2256,82 @@ void WorldSession::HandleOpeningCinematic(WorldPacket& /*recvData*/)
_player->SendCinematicStart(raceEntry->CinematicSequence);
}
}
+
+void WorldSession::SendCharCreate(ResponseCodes result)
+{
+ WorldPacket data(SMSG_CHAR_CREATE, 1);
+ data << uint8(result);
+ SendPacket(&data);
+}
+
+void WorldSession::SendCharDelete(ResponseCodes result)
+{
+ WorldPacket data(SMSG_CHAR_DELETE, 1);
+ data << uint8(result);
+ SendPacket(&data);
+}
+
+void WorldSession::SendCharRename(ResponseCodes result, CharacterRenameInfo const& renameInfo)
+{
+ WorldPacket data(SMSG_CHAR_RENAME, 1 + 8 + renameInfo.Name.size() + 1);
+ data << uint8(result);
+ if (result == RESPONSE_SUCCESS)
+ {
+ data << renameInfo.Guid;
+ data << renameInfo.Name;
+ }
+ SendPacket(&data);
+}
+
+void WorldSession::SendCharCustomize(ResponseCodes result, CharacterCustomizeInfo const& customizeInfo)
+{
+ WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1 + 8 + customizeInfo.Name.size() + 1 + 6);
+ data << uint8(result);
+ if (result == RESPONSE_SUCCESS)
+ {
+ data << customizeInfo.Guid;
+ data << customizeInfo.Name;
+ data << uint8(customizeInfo.Gender);
+ data << uint8(customizeInfo.Skin);
+ data << uint8(customizeInfo.Face);
+ data << uint8(customizeInfo.HairStyle);
+ data << uint8(customizeInfo.HairColor);
+ data << uint8(customizeInfo.FacialHair);
+ }
+ SendPacket(&data);
+}
+
+void WorldSession::SendCharFactionChange(ResponseCodes result, CharacterFactionChangeInfo const& factionChangeInfo)
+{
+ WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1 + 8 + factionChangeInfo.Name.size() + 1 + 7);
+ data << uint8(result);
+ if (result == RESPONSE_SUCCESS)
+ {
+ data << factionChangeInfo.Guid;
+ data << factionChangeInfo.Name;
+ data << uint8(factionChangeInfo.Gender);
+ data << uint8(factionChangeInfo.Skin);
+ data << uint8(factionChangeInfo.Face);
+ data << uint8(factionChangeInfo.HairStyle);
+ data << uint8(factionChangeInfo.HairColor);
+ data << uint8(factionChangeInfo.FacialHair);
+ data << uint8(factionChangeInfo.Race);
+ }
+ SendPacket(&data);
+}
+
+void WorldSession::SendSetPlayerDeclinedNamesResult(DeclinedNameResult result, ObjectGuid guid)
+{
+ WorldPacket data(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, 4 + 8);
+ data << uint32(result);
+ if (result == DECLINED_NAMES_RESULT_SUCCESS)
+ data << guid;
+ SendPacket(&data);
+}
+
+void WorldSession::SendBarberShopResult(BarberShopResult result)
+{
+ WorldPacket data(SMSG_BARBER_SHOP_RESULT, 4);
+ data << uint32(result);
+ SendPacket(&data);
+}
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 0fd46f0d20b..7a1b054d77d 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -581,7 +581,7 @@ void WorldSession::LogoutPlayer(bool save)
// e.g if he got disconnected during a transfer to another map
// calls to GetMap in this case may cause crashes
_player->CleanupsBeforeDelete();
- TC_LOG_INFO("entities.player.character", "Account: %d (IP: %s) Logout Character:[%s] (GUID: %u) Level: %d",
+ TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Logout Character:[%s] (GUID: %u) Level: %d",
GetAccountId(), GetRemoteAddress().c_str(), _player->GetName().c_str(), _player->GetGUIDLow(), _player->getLevel());
sBattlenetServer.SendChangeToonOnlineState(GetBattlenetAccountId(), GetAccountId(), _player->GetGUID(), _player->GetName(), false);
@@ -1077,10 +1077,11 @@ void WorldSession::ProcessQueryCallbacks()
//- HandleCharRenameOpcode
if (_charRenameCallback.IsReady())
{
- std::string param = _charRenameCallback.GetParam();
_charRenameCallback.GetResult(result);
- HandleChangePlayerNameOpcodeCallBack(result, param);
- _charRenameCallback.FreeResult();
+ CharacterRenameInfo* renameInfo = _charRenameCallback.GetParam();
+ HandleChangePlayerNameOpcodeCallBack(result, renameInfo);
+ delete renameInfo;
+ _charRenameCallback.Reset();
}
//- HandleCharAddIgnoreOpcode
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 02a185b0b63..3f864b78362 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -100,10 +100,18 @@ struct AccountData
enum PartyOperation
{
- PARTY_OP_INVITE = 0,
+ PARTY_OP_INVITE = 0,
PARTY_OP_UNINVITE = 1,
- PARTY_OP_LEAVE = 2,
- PARTY_OP_SWAP = 4
+ PARTY_OP_LEAVE = 2,
+ PARTY_OP_SWAP = 4
+};
+
+enum BarberShopResult
+{
+ BARBER_SHOP_RESULT_SUCCESS = 0,
+ BARBER_SHOP_RESULT_NO_MONEY = 1,
+ BARBER_SHOP_RESULT_NOT_ON_CHAIR = 2,
+ BARBER_SHOP_RESULT_NO_MONEY_2 = 3
};
enum BFLeaveReason
@@ -131,6 +139,12 @@ enum CharterTypes
ARENA_TEAM_CHARTER_5v5_TYPE = 5,
};
+enum DeclinedNameResult
+{
+ DECLINED_NAMES_RESULT_SUCCESS = 0,
+ DECLINED_NAMES_RESULT_ERROR = 1
+};
+
#define DB2_REPLY_SPARSE 2442913102
#define DB2_REPLY_ITEM 1344507586
@@ -183,26 +197,52 @@ class CharacterCreateInfo
friend class Player;
protected:
- CharacterCreateInfo(std::string const& name, uint8 race, uint8 cclass, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair, uint8 outfitId,
- WorldPacket& data) : Name(name), Race(race), Class(cclass), Gender(gender), Skin(skin), Face(face), HairStyle(hairStyle), HairColor(hairColor), FacialHair(facialHair),
- OutfitId(outfitId), Data(std::move(data)), CharCount(0)
- { }
-
/// User specified variables
std::string Name;
- uint8 Race;
- uint8 Class;
- uint8 Gender;
- uint8 Skin;
- uint8 Face;
- uint8 HairStyle;
- uint8 HairColor;
- uint8 FacialHair;
- uint8 OutfitId;
- WorldPacket Data;
+ uint8 Race = 0;
+ uint8 Class = 0;
+ uint8 Gender = GENDER_NONE;
+ uint8 Skin = 0;
+ uint8 Face = 0;
+ uint8 HairStyle = 0;
+ uint8 HairColor = 0;
+ uint8 FacialHair = 0;
+ uint8 OutfitId = 0;
/// Server side data
- uint8 CharCount;
+ uint8 CharCount = 0;
+};
+
+struct CharacterRenameInfo
+{
+ friend class WorldSession;
+
+ protected:
+ ObjectGuid Guid;
+ std::string Name;
+};
+
+struct CharacterCustomizeInfo : public CharacterRenameInfo
+{
+ friend class Player;
+ friend class WorldSession;
+
+ protected:
+ uint8 Gender = GENDER_NONE;
+ uint8 Skin = 0;
+ uint8 Face = 0;
+ uint8 HairStyle = 0;
+ uint8 HairColor = 0;
+ uint8 FacialHair = 0;
+};
+
+struct CharacterFactionChangeInfo : public CharacterCustomizeInfo
+{
+ friend class Player;
+ friend class WorldSession;
+
+ protected:
+ uint8 Race = 0;
};
struct PacketCounter
@@ -420,6 +460,13 @@ class WorldSession
void HandleRandomizeCharNameOpcode(WorldPacket& recvData);
void HandleReorderCharacters(WorldPacket& recvData);
void HandleOpeningCinematic(WorldPacket& recvData);
+ void SendCharCreate(ResponseCodes result);
+ void SendCharDelete(ResponseCodes result);
+ void SendCharRename(ResponseCodes result, CharacterRenameInfo const& renameInfo);
+ void SendCharCustomize(ResponseCodes result, CharacterCustomizeInfo const& customizeInfo);
+ void SendCharFactionChange(ResponseCodes result, CharacterFactionChangeInfo const& factionChangeInfo);
+ void SendSetPlayerDeclinedNamesResult(DeclinedNameResult result, ObjectGuid guid);
+ void SendBarberShopResult(BarberShopResult result);
// played time
void HandlePlayedTime(WorldPacket& recvPacket);
@@ -789,7 +836,7 @@ class WorldSession
void HandleSetActionBarToggles(WorldPacket& recvData);
void HandleCharRenameOpcode(WorldPacket& recvData);
- void HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, std::string const& newName);
+ void HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, CharacterRenameInfo const* renameInfo);
void HandleSetPlayerDeclinedNames(WorldPacket& recvData);
void HandleTotemDestroyed(WorldPacket& recvData);
@@ -990,7 +1037,7 @@ class WorldSession
PreparedQueryResultFuture _charEnumCallback;
PreparedQueryResultFuture _addIgnoreCallback;
PreparedQueryResultFuture _stablePetCallback;
- QueryCallback<PreparedQueryResult, std::string> _charRenameCallback;
+ QueryCallback<PreparedQueryResult, CharacterRenameInfo*> _charRenameCallback;
QueryCallback<PreparedQueryResult, std::string> _addFriendCallback;
QueryCallback<PreparedQueryResult, uint32> _unstablePetCallback;
QueryCallback<PreparedQueryResult, uint32> _stableSwapCallback;
diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp
index e398e54ad19..b89048eb70d 100644
--- a/src/server/scripts/Commands/cs_account.cpp
+++ b/src/server/scripts/Commands/cs_account.cpp
@@ -132,7 +132,7 @@ public:
handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName);
if (handler->GetSession())
{
- TC_LOG_INFO("entities.player.character", "Account: %d (IP: %s) Character:[%s] (GUID: %u) created Account %s (Email: '%s')",
+ TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Character:[%s] (GUID: %u) created Account %s (Email: '%s')",
handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),
accountName, email.c_str());
diff --git a/src/server/scripts/Commands/cs_battlenet_account.cpp b/src/server/scripts/Commands/cs_battlenet_account.cpp
index dfbff501144..823fa6ab6a1 100644
--- a/src/server/scripts/Commands/cs_battlenet_account.cpp
+++ b/src/server/scripts/Commands/cs_battlenet_account.cpp
@@ -87,7 +87,7 @@ public:
handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName);
if (handler->GetSession())
{
- TC_LOG_INFO("entities.player.character", "Battle.net account: %d (IP: %s) Character:[%s] (GUID: %u) created Account %s",
+ TC_LOG_INFO("entities.player.character", "Battle.net account: %u (IP: %s) Character:[%s] (GUID: %u) created Account %s",
handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(),
handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(),
accountName);
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 42040df8ed0..055f0aa8914 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -511,13 +511,14 @@ public:
handler->PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE));
// in point where GM stay
- Player::SavePositionInDB(handler->GetSession()->GetPlayer()->GetMapId(),
+ SQLTransaction dummy;
+ Player::SavePositionInDB(WorldLocation(handler->GetSession()->GetPlayer()->GetMapId(),
handler->GetSession()->GetPlayer()->GetPositionX(),
handler->GetSession()->GetPlayer()->GetPositionY(),
handler->GetSession()->GetPlayer()->GetPositionZ(),
- handler->GetSession()->GetPlayer()->GetOrientation(),
+ handler->GetSession()->GetPlayer()->GetOrientation()),
handler->GetSession()->GetPlayer()->GetZoneId(),
- targetGuid);
+ targetGuid, dummy);
}
return true;
diff --git a/src/server/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp
index 6b4fb7d104d..01b146b68c6 100644
--- a/src/server/scripts/Commands/cs_tele.cpp
+++ b/src/server/scripts/Commands/cs_tele.cpp
@@ -141,13 +141,11 @@ public:
if (resultDB)
{
Field* fieldsDB = resultDB->Fetch();
- uint32 mapId = fieldsDB[0].GetUInt16();
+ WorldLocation loc(fieldsDB[0].GetUInt16(), fieldsDB[2].GetFloat(), fieldsDB[3].GetFloat(), fieldsDB[4].GetFloat(), 0.0f);
uint32 zoneId = fieldsDB[1].GetUInt16();
- float posX = fieldsDB[2].GetFloat();
- float posY = fieldsDB[3].GetFloat();
- float posZ = fieldsDB[4].GetFloat();
- Player::SavePositionInDB(mapId, posX, posY, posZ, 0, zoneId, target_guid);
+ SQLTransaction dummy;
+ Player::SavePositionInDB(loc, zoneId, target_guid, dummy);
}
}
@@ -203,8 +201,10 @@ public:
std::string nameLink = handler->playerLink(target_name);
handler->PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE), tele->name.c_str());
- Player::SavePositionInDB(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation,
- sMapMgr->GetZoneId(tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid);
+
+ SQLTransaction dummy;
+ Player::SavePositionInDB(WorldLocation(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation),
+ sMapMgr->GetZoneId(tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid, dummy);
}
return true;