diff options
author | cyberbrest <cyberbrest@cyberbrest.com> | 2012-09-03 22:27:18 +0300 |
---|---|---|
committer | cyberbrest <cyberbrest@cyberbrest.com> | 2012-09-03 22:55:13 +0300 |
commit | 0c40fb0fe9a28400e8639145800224c9a9c1de48 (patch) | |
tree | 2eba4fc79e7f0529eae6e16057316ca221c6c37c /src | |
parent | e9a3d3876943610641904caad624517977eb8aec (diff) |
[Core/Currency] save all currencies on special db table.
+ fix initialization currencies.
Diffstat (limited to 'src')
5 files changed, 128 insertions, 3 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f0a3628e32c..2661c83842c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7290,6 +7290,105 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto } +void Player::_LoadCurrency(PreparedQueryResult result) +{ + if (!result) + return; + + do + { + Field* fields = result->Fetch(); + + uint16 currencyID = fields[0].GetUInt16(); + + CurrencyTypesEntry const* currency = sCurrencyTypesStore.LookupEntry(currencyID); + if(!currencyID) + continue; + + PlayerCurrency cur; + cur.state = PLAYERCURRENCY_UNCHANGED; + cur.weekCount = fields[1].GetUInt32(); + cur.totalCount = fields[2].GetUInt32(); + + m_currencies.insert(PlayerCurrenciesMap::value_type(currencyID, cur)); + + } while (result->NextRow()); +} + +void Player::_SaveCurrency(SQLTransaction& trans) +{ + PreparedStatement* stmt = NULL; + for (PlayerCurrenciesMap::iterator itr = m_currencies.begin(); itr != m_currencies.end(); ++itr) + { + CurrencyTypesEntry const* entry = sCurrencyTypesStore.LookupEntry(itr->first); + if (!entry) // should never happen + continue; + + switch(itr->second.state) + { + case PLAYERCURRENCY_NEW: + stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_PLAYER_CURRENCY); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt16(1, itr->first); + stmt->setUInt32(2, itr->second.weekCount); + stmt->setUInt32(3, itr->second.totalCount); + trans->Append(stmt); + break; + case PLAYERCURRENCY_CHANGED: + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_PLAYER_CURRENCY); + stmt->setUInt32(0, itr->second.weekCount); + stmt->setUInt32(1, itr->second.totalCount); + stmt->setUInt32(2, GetGUIDLow()); + stmt->setUInt16(3, itr->first); + trans->Append(stmt); + break; + default: + break; + } + + itr->second.state = PLAYERCURRENCY_UNCHANGED; + } +} + +void SendNewCurrency(uint32 id) const +{ + PlayerCurrenciesMap::const_iterator itr = m_currencies.find(id); + if (itr == m_currencies.end()) + return; + + ByteBuffer currencyData; + WorldPacket packet(SMSG_INIT_CURRENCY, 4 + (5*4 + 1)); + packet.WriteBits(1, 23); + + CurrencyTypesEntry const* entry = sCurrencyTypesStore.LookupEntry(id); + if (!entry) // should never happen + return; + + uint32 precision = (entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? 100 : 1; + uint32 weekCount = itr->second.weekCount / precision; + uint32 weekCap = _GetCurrencyWeekCap(entry) / precision; + + packet.WriteBit(weekCount); + packet.WriteBits(0, 4); // some flags + packet.WriteBit(weekCap); + packet.WriteBit(0); // season total earned + + currencyData << uint32(itr->second.totalCount / precision); + if (weekCap) + currencyData << uint32(weekCap); + + //if (seasonTotal) + // currencyData << uint32(seasonTotal); + + currencyData << uint32(entry->ID); + if (weekCount) + currencyData << uint32(weekCount); + + packet.FlushBits(); + packet.append(currencyData); + GetSession()->SendPacket(&packet); +} + void Player::SendCurrencies() const { ByteBuffer currencyData; @@ -7339,6 +7438,7 @@ bool Player::HasCurrency(uint32 id, uint32 count) const PlayerCurrenciesMap::const_iterator itr = m_currencies.find(id); return itr != m_currencies.end() && itr->second.totalCount >= count; } + void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/) { if (!count) @@ -7411,6 +7511,13 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/) if (count > 0) UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CURRENCY, id, count); + // on new case just set init. + if(itr->second.state == PLAYERCURRENCY_NEW) + { + SendNewCurrency(id); + return; + } + WorldPacket packet(SMSG_UPDATE_CURRENCY, 12); packet.WriteBit(weekCap != 0); @@ -16717,8 +16824,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) SetArenaTeamInfoField(arena_slot, ArenaTeamInfoType(j), 0); } - SetCurrency(CURRENCY_TYPE_CONQUEST_POINTS, fields[40].GetUInt32()); - SetCurrency(CURRENCY_TYPE_HONOR_POINTS, fields[41].GetUInt32()); + _LoadCurrency(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADCURRENCY)); SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[42].GetUInt32()); SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[43].GetUInt16()); SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[44].GetUInt16()); @@ -18833,6 +18939,7 @@ void Player::SaveToDB(bool create /*=false*/) GetSession()->SaveTutorialsData(trans); // changed only while character in game _SaveGlyphs(trans); _SaveInstanceTimeRestrictions(trans); + _SaveCurrency(trans); // check if stats should only be saved on logout // save stats can be out of transaction @@ -18850,6 +18957,7 @@ void Player::SaveToDB(bool create /*=false*/) void Player::SaveInventoryAndGoldToDB(SQLTransaction& trans) { _SaveInventory(trans); + _SaveCurrency(trans); SaveGoldToDB(trans); } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index c4047485033..219880df7f5 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -130,7 +130,7 @@ enum PlayerCurrencyState PLAYERCURRENCY_UNCHANGED = 0, PLAYERCURRENCY_CHANGED = 1, PLAYERCURRENCY_NEW = 2, - PLAYERCURRENCY_REMOVED = 3 + PLAYERCURRENCY_REMOVED = 3 //not removed just set count == 0 }; struct PlayerCurrency @@ -792,6 +792,7 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOADINSTANCELOCKTIMES = 30, PLAYER_LOGIN_QUERY_LOADSEASONALQUESTSTATUS = 31, PLAYER_LOGIN_QUERY_LOADVOIDSTORAGE = 32, + PLAYER_LOGIN_QUERY_LOADCURRENCY = 33, MAX_PLAYER_LOGIN_QUERY, }; @@ -1340,6 +1341,7 @@ class Player : public Unit, public GridObject<Player> void AddRefundReference(uint32 it); void DeleteRefundReference(uint32 it); + void SendNewCurrency(uint32 id) const; void SendCurrencies() const; uint32 GetCurrency(uint32 id) const; bool HasCurrency(uint32 id, uint32 count) const; @@ -2695,6 +2697,7 @@ class Player : public Unit, public GridObject<Player> void _LoadGlyphs(PreparedQueryResult result); void _LoadTalents(PreparedQueryResult result); void _LoadInstanceTimeRestrictions(PreparedQueryResult result); + void _LoadCurrency(PreparedQueryResult result); /*********************************************************/ /*** SAVE SYSTEM ***/ @@ -2717,6 +2720,7 @@ class Player : public Unit, public GridObject<Player> void _SaveTalents(SQLTransaction& trans); void _SaveStats(SQLTransaction& trans); void _SaveInstanceTimeRestrictions(SQLTransaction& trans); + void _SaveCurrency(SQLTransaction& trans); /*********************************************************/ /*** ENVIRONMENTAL SYSTEM ***/ diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index c7b66381158..b28ce3ab180 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -202,6 +202,10 @@ bool LoginQueryHolder::Initialize() stmt->setUInt32(0, m_accountId); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOADINSTANCELOCKTIMES, stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PLAYER_CURRENCY); + stmt->setUInt32(0, lowGuid); + res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOADCURRENCY, stmt); + return res; } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 368e70a758c..b441ad6939f 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -257,6 +257,11 @@ void CharacterDatabaseConnection::DoPrepareStatements() PREPARE_STATEMENT(CHAR_INS_AURA, "INSERT INTO character_aura (guid, caster_guid, item_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) " "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC) + // Currency + PREPARE_STATEMENT(CHAR_SEL_PLAYER_CURRENCY, "SELECT currency, week_count, total_count FROM character_currency WHERE guid = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_UPD_PLAYER_CURRENCY, "UPDATE character_currency SET week_count = ?, total_count = ? WHERE guid = ? AND currency = ?", CONNECTION_ASYNC); + PREPARE_STATEMENT(CHAR_REP_PLAYER_CURRENCY, "REPLACE INTO character_currency (guid, currency, week_count, total_count) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + // Account data PREPARE_STATEMENT(CHAR_SEL_ACCOUNT_DATA, "SELECT type, time, data FROM account_data WHERE accountId = ?", CONNECTION_SYNCH) PREPARE_STATEMENT(CHAR_REP_ACCOUNT_DATA, "REPLACE INTO account_data (accountId, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC) diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index 8c7042ad926..9682a6ab641 100755 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -248,6 +248,10 @@ enum CharacterDatabaseStatements CHAR_INS_AURA, + CHAR_SEL_PLAYER_CURRENCY, + CHAR_UPD_PLAYER_CURRENCY, + CHAR_REP_PLAYER_CURRENCY, + CHAR_SEL_ACCOUNT_DATA, CHAR_REP_ACCOUNT_DATA, CHAR_DEL_ACCOUNT_DATA, |