diff --git a/sql/updates/9999_01_characters_characters.sql b/sql/updates/9999_01_characters_characters.sql new file mode 100644 index 0000000..23f4cba --- /dev/null +++ b/sql/updates/9999_01_characters_characters.sql @@ -0,0 +1,9 @@ +ALTER TABLE characters +ADD level INT UNSIGNED NOT NULL AFTER class, +ADD xp INT UNSIGNED NOT NULL AFTER level, +ADD money INT UNSIGNED NOT NULL AFTER xp; + +UPDATE characters SET +level = CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(data, ' ', 54), ' ', -1) AS UNSIGNED), +xp = CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(data, ' ', 609), ' ', -1) AS UNSIGNED), +money = CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(data, ' ', 1145), ' ', -1) AS UNSIGNED); diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index dcd61ea..ad3fe07 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -335,7 +335,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) if(!AllowTwoSideAccounts || skipCinematics == 1 || class_ == CLASS_DEATH_KNIGHT) { - QueryResult *result2 = CharacterDatabase.PQuery("SELECT guid,race,class FROM characters WHERE account = '%u' %s", + QueryResult *result2 = CharacterDatabase.PQuery("SELECT level,race,class FROM characters WHERE account = '%u' %s", GetAccountId(), (skipCinematics == 1 || class_ == CLASS_DEATH_KNIGHT) ? "" : "LIMIT 1"); if(result2) { @@ -362,8 +362,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) if(!have_req_level_for_heroic) { - uint32 acc_guid = field[0].GetUInt32(); - uint32 acc_level = Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,acc_guid); + uint32 acc_level = field[0].GetUInt32(); if(acc_level >= req_level_for_heroic) have_req_level_for_heroic = true; } @@ -417,8 +416,7 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) if(!have_req_level_for_heroic) { - uint32 acc_guid = field[0].GetUInt32(); - uint32 acc_level = Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,acc_guid); + uint32 acc_level = field[0].GetUInt32(); if(acc_level >= req_level_for_heroic) have_req_level_for_heroic = true; } diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp index a4c4a26..ee6c164 100644 --- a/src/game/Guild.cpp +++ b/src/game/Guild.cpp @@ -352,17 +352,14 @@ bool Guild::FillPlayerData(uint64 guid, MemberSlot* memslot) } else { - QueryResult *result = CharacterDatabase.PQuery("SELECT name,data,zone,class FROM characters WHERE guid = '%u'", GUID_LOPART(guid)); + QueryResult *result = CharacterDatabase.PQuery("SELECT name,level,zone,class FROM characters WHERE guid = '%u'", GUID_LOPART(guid)); if(!result) return false; // player doesn't exist Field *fields = result->Fetch(); plName = fields[0].GetCppString(); - - Tokens data = StrSplit(fields[1].GetCppString(), " "); - plLevel = Player::GetUInt32ValueFromArray(data,UNIT_FIELD_LEVEL); - + plLevel = fields[1].GetUInt32(); plZone = fields[2].GetUInt32(); plClass = fields[3].GetUInt32(); delete result; diff --git a/src/game/GuildHandler.cpp b/src/game/GuildHandler.cpp index 9b5dba2..649f57b 100644 --- a/src/game/GuildHandler.cpp +++ b/src/game/GuildHandler.cpp @@ -976,7 +976,7 @@ void WorldSession::HandleGuildBankDepositMoney( WorldPacket & recv_data ) pGuild->SetBankMoney(pGuild->GetGuildBankMoney()+money); GetPlayer()->ModifyMoney(-int(money)); - GetPlayer()->SaveDataFieldToDB(); //contains money + GetPlayer()->SaveGoldToDB(); CharacterDatabase.CommitTransaction(); @@ -1032,7 +1032,7 @@ void WorldSession::HandleGuildBankWithdrawMoney( WorldPacket & recv_data ) } GetPlayer()->ModifyMoney(money); - GetPlayer()->SaveDataFieldToDB(); // contains money + GetPlayer()->SaveGoldToDB(); CharacterDatabase.CommitTransaction(); diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 6a3b6fa..65d63cc 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -2133,21 +2133,17 @@ bool ChatHandler::HandlePInfoCommand(const char* args) if (HasLowerSecurity(NULL, target_guid)) return false; - // 0 - QueryResult *result = CharacterDatabase.PQuery("SELECT totaltime FROM characters WHERE guid = '%u'", GUID_LOPART(target_guid)); + // 0 1 2 + QueryResult *result = CharacterDatabase.PQuery("SELECT totaltime, level, money FROM characters WHERE guid = '%u'", GUID_LOPART(target_guid)); if (!result) return false; Field *fields = result->Fetch(); total_player_time = fields[0].GetUInt32(); + level = fields[1].GetUInt32(); + money = fields[2].GetUInt32(); delete result; - Tokens data; - if (!Player::LoadValuesArrayFromDB(data,target_guid)) - return false; - - money = Player::GetUInt32ValueFromArray(data, PLAYER_FIELD_COINAGE); - level = Player::GetUInt32ValueFromArray(data, UNIT_FIELD_LEVEL); accId = objmgr.GetPlayerAccountIdByGUID(target_guid); } diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index bebba74..1a3021e 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -3931,11 +3931,7 @@ void ChatHandler::HandleCharacterLevel(Player* player, uint64 player_guid, uint3 else { // update level and XP at level, all other will be updated at loading - Tokens values; - Player::LoadValuesArrayFromDB(values,player_guid); - Player::SetUInt32ValueInArray(values,UNIT_FIELD_LEVEL,newlevel); - Player::SetUInt32ValueInArray(values,PLAYER_XP,0); - Player::SaveValuesArrayInDB(values,player_guid); + CharacterDatabase.PExecute("UPDATA characters SET level = '%u', xp = 0 WHERE guid = '%u'", newlevel, GUID_LOPART(player_guid)); } } @@ -3960,7 +3956,7 @@ bool ChatHandler::HandleCharacterLevelCommand(const char* args) if(!extractPlayerTarget(nameStr,&target,&target_guid,&target_name)) return false; - int32 oldlevel = target ? target->getLevel() : Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,target_guid); + int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromDB(target_guid); int32 newlevel = levelStr ? atoi(levelStr) : oldlevel; if(newlevel < 1) @@ -3999,7 +3995,7 @@ bool ChatHandler::HandleLevelUpCommand(const char* args) if(!extractPlayerTarget(nameStr,&target,&target_guid,&target_name)) return false; - int32 oldlevel = target ? target->getLevel() : Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,target_guid); + int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromDB(target_guid); int32 addlevel = levelStr ? atoi(levelStr) : 1; int32 newlevel = oldlevel + addlevel; diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp index 0d90792..2453f19 100644 --- a/src/game/Mail.cpp +++ b/src/game/Mail.cpp @@ -557,7 +557,7 @@ void WorldSession::HandleMailTakeMoney(WorldPacket & recv_data ) // save money and mail to prevent cheating CharacterDatabase.BeginTransaction(); - pl->SaveDataFieldToDB(); // contains money + pl->SaveGoldToDB(); pl->_SaveMail(); CharacterDatabase.CommitTransaction(); } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 41a8701..3767316 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -6061,6 +6061,19 @@ uint32 Player::GetZoneIdFromDB(uint64 guid) return zone; } +uint32 Player::GetLevelFromDB(uint64 guid) +{ + QueryResult *result = CharacterDatabase.PQuery( "SELECT level FROM characters WHERE guid='%u'", GUID_LOPART(guid) ); + if (!result) + return 0; + + Field* fields = result->Fetch(); + uint32 level = fields[0].GetUInt32(); + delete result; + + return level; +} + void Player::UpdateArea(uint32 newArea) { // FFA_PVP flags are area and not zone id dependent @@ -15514,8 +15527,12 @@ void Player::SaveToDB() void Player::SaveInventoryAndGoldToDB() { _SaveInventory(); - //money is in data field - SaveDataFieldToDB(); + SaveGoldToDB(); +} + +void Player::SaveGoldToDB() +{ + CharacterDatabase.PExecute("UPDATE money = '%u' WHERE guid = '%u'", GetMoney(), GetGUIDLow()); } void Player::_SaveActions() diff --git a/src/game/Player.h b/src/game/Player.h index 02d8f30..bd2ac98 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1261,6 +1261,7 @@ class MANGOS_DLL_SPEC Player : public Unit static uint32 GetUInt32ValueFromDB(uint16 index, uint64 guid); static float GetFloatValueFromDB(uint16 index, uint64 guid); static uint32 GetZoneIdFromDB(uint64 guid); + static uint32 GetLevelFromDB(uint64 guid); static bool LoadPositionFromDB(uint32& mapid, float& x,float& y,float& z,float& o, bool& in_flight, uint64 guid); /*********************************************************/ @@ -1269,6 +1270,7 @@ class MANGOS_DLL_SPEC Player : public Unit void SaveToDB(); void SaveInventoryAndGoldToDB(); // fast save function for item/money cheating preventing + void SaveGoldToDB(); void SaveDataFieldToDB(); static bool SaveValuesArrayInDB(Tokens const& data,uint64 guid); static void SetUInt32ValueInArray(Tokens& data,uint16 index, uint32 value);