aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Player/Player.cpp157
-rw-r--r--src/server/game/Entities/Player/Player.h18
2 files changed, 78 insertions, 97 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 577f1800aee..d635e9fe841 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6966,8 +6966,10 @@ void Player::_LoadCurrency(PreparedQueryResult result)
PlayerCurrency cur;
cur.state = PLAYERCURRENCY_UNCHANGED;
- cur.weekCount = fields[1].GetUInt32();
- cur.totalCount = fields[2].GetUInt32();
+ cur.Quantity = fields[1].GetUInt32();
+ cur.WeeklyQuantity = fields[2].GetUInt32();
+ cur.TrackedQuantity = fields[3].GetUInt32();
+ cur.Flags = fields[4].GetUInt8();
_currencyStorage.insert(PlayerCurrenciesMap::value_type(currencyID, cur));
@@ -6989,16 +6991,20 @@ void Player::_SaveCurrency(SQLTransaction& trans)
stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_PLAYER_CURRENCY);
stmt->setUInt64(0, GetGUID().GetCounter());
stmt->setUInt16(1, itr->first);
- stmt->setUInt32(2, itr->second.weekCount);
- stmt->setUInt32(3, itr->second.totalCount);
+ stmt->setUInt32(2, itr->second.Quantity);
+ stmt->setUInt32(3, itr->second.WeeklyQuantity);
+ stmt->setUInt32(4, itr->second.TrackedQuantity);
+ stmt->setUInt8(5, itr->second.Flags);
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->setUInt64(2, GetGUID().GetCounter());
- stmt->setUInt16(3, itr->first);
+ stmt->setUInt32(0, itr->second.Quantity);
+ stmt->setUInt32(1, itr->second.WeeklyQuantity);
+ stmt->setUInt32(2, itr->second.TrackedQuantity);
+ stmt->setUInt8(3, itr->second.Flags);
+ stmt->setUInt64(4, GetGUID().GetCounter());
+ stmt->setUInt16(5, itr->first);
trans->Append(stmt);
break;
default:
@@ -7015,47 +7021,29 @@ void Player::SendNewCurrency(uint32 id) const
if (itr == _currencyStorage.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) ? CURRENCY_PRECISION : 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
+ WorldPackets::Misc::SetupCurrency packet;
+ WorldPackets::Misc::SetupCurrency::Record record;
+ record.Type = entry->ID;
+ record.Quantity = itr->second.Quantity;
+ record.WeeklyQuantity.Set(itr->second.WeeklyQuantity);
+ record.MaxWeeklyQuantity.Set(GetCurrencyWeekCap(entry) / ((entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? CURRENCY_PRECISION : 1));
+ record.TrackedQuantity.Set(itr->second.TrackedQuantity);
+ record.Flags = itr->second.Flags;
- currencyData << uint32(itr->second.totalCount / precision);
- if (weekCap)
- currencyData << uint32(weekCap);
+ packet.Data.push_back(record);
- //if (seasonTotal)
- // currencyData << uint32(seasonTotal / precision);
-
- currencyData << uint32(entry->ID);
- if (weekCount)
- currencyData << uint32(weekCount);
-
- packet.FlushBits();
- packet.append(currencyData);
- GetSession()->SendPacket(&packet);
+ GetSession()->SendPacket(packet.Write());
}
void Player::SendCurrencies() const
{
- ByteBuffer currencyData;
- WorldPacket packet(SMSG_INIT_CURRENCY, 4 + _currencyStorage.size()*(5*4 + 1));
- size_t count_pos = packet.bitwpos();
- packet.WriteBits(_currencyStorage.size(), 23);
+ WorldPackets::Misc::SetupCurrency packet;
+ packet.Data.reserve(_currencyStorage.size());
- size_t count = 0;
for (PlayerCurrenciesMap::const_iterator itr = _currencyStorage.begin(); itr != _currencyStorage.end(); ++itr)
{
CurrencyTypesEntry const* entry = sCurrencyTypesStore.LookupEntry(itr->first);
@@ -7064,33 +7052,18 @@ void Player::SendCurrencies() const
if (!entry || entry->CategoryID == CURRENCY_CATEGORY_META_CONQUEST)
continue;
- uint32 precision = (entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? CURRENCY_PRECISION : 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 / precision);
-
- currencyData << uint32(entry->ID);
- if (weekCount)
- currencyData << uint32(weekCount);
+ WorldPackets::Misc::SetupCurrency::Record record;
+ record.Type = entry->ID;
+ record.Quantity = itr->second.Quantity;
+ record.WeeklyQuantity.Set(itr->second.WeeklyQuantity);
+ record.MaxWeeklyQuantity.Set(GetCurrencyWeekCap(entry) / ((entry->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? CURRENCY_PRECISION : 1));
+ record.TrackedQuantity.Set(itr->second.TrackedQuantity);
+ record.Flags = itr->second.Flags;
- ++count;
+ packet.Data.push_back(record);
}
- packet.FlushBits();
- packet.append(currencyData);
- packet.PutBits(count_pos, count, 23);
- GetSession()->SendPacket(&packet);
+ GetSession()->SendPacket(packet.Write());
}
void Player::SendPvpRewards() const
@@ -7115,7 +7088,7 @@ uint32 Player::GetCurrency(uint32 id, bool usePrecision) const
CurrencyTypesEntry const* currency = sCurrencyTypesStore.LookupEntry(id);
uint32 precision = (usePrecision && currency->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? CURRENCY_PRECISION : 1;
- return itr->second.totalCount / precision;
+ return itr->second.Quantity / precision;
}
uint32 Player::GetCurrencyOnWeek(uint32 id, bool usePrecision) const
@@ -7127,13 +7100,13 @@ uint32 Player::GetCurrencyOnWeek(uint32 id, bool usePrecision) const
CurrencyTypesEntry const* currency = sCurrencyTypesStore.LookupEntry(id);
uint32 precision = (usePrecision && currency->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? CURRENCY_PRECISION : 1;
- return itr->second.weekCount / precision;
+ return itr->second.WeeklyQuantity / precision;
}
bool Player::HasCurrency(uint32 id, uint32 count) const
{
PlayerCurrenciesMap::const_iterator itr = _currencyStorage.find(id);
- return itr != _currencyStorage.end() && itr->second.totalCount >= count;
+ return itr != _currencyStorage.end() && itr->second.Quantity >= count;
}
void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bool ignoreMultipliers/* = false*/)
@@ -7147,23 +7120,27 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo
if (!ignoreMultipliers)
count *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_CURRENCY_GAIN, id);
- int32 precision = currency->Flags & CURRENCY_FLAG_HIGH_PRECISION ? CURRENCY_PRECISION : 1;
uint32 oldTotalCount = 0;
uint32 oldWeekCount = 0;
+ uint32 oldTrackedCount = 0;
+
PlayerCurrenciesMap::iterator itr = _currencyStorage.find(id);
if (itr == _currencyStorage.end())
{
PlayerCurrency cur;
cur.state = PLAYERCURRENCY_NEW;
- cur.totalCount = 0;
- cur.weekCount = 0;
+ cur.Quantity = 0;
+ cur.WeeklyQuantity = 0;
+ cur.TrackedQuantity = 0;
+ cur.Flags = 0;
_currencyStorage[id] = cur;
itr = _currencyStorage.find(id);
}
else
{
- oldTotalCount = itr->second.totalCount;
- oldWeekCount = itr->second.weekCount;
+ oldTotalCount = itr->second.Quantity;
+ oldWeekCount = itr->second.WeeklyQuantity;
+ oldTrackedCount = itr->second.TrackedQuantity;
}
// count can't be more then weekCap if used (weekCap > 0)
@@ -7176,6 +7153,10 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo
if (totalCap && count > int32(totalCap))
count = totalCap;
+ int32 newTrackedCount = int32(oldTrackedCount) + (count > 0 ? count : 0);
+ if (newTrackedCount < 0)
+ newTrackedCount = 0;
+
int32 newTotalCount = int32(oldTotalCount) + count;
if (newTotalCount < 0)
newTotalCount = 0;
@@ -7204,8 +7185,9 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo
if (itr->second.state != PLAYERCURRENCY_NEW)
itr->second.state = PLAYERCURRENCY_CHANGED;
- itr->second.totalCount = newTotalCount;
- itr->second.weekCount = newWeekCount;
+ itr->second.Quantity = newTotalCount;
+ itr->second.WeeklyQuantity = newWeekCount;
+ itr->second.TrackedQuantity = newTrackedCount;
if (count > 0)
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CURRENCY, id, count);
@@ -7217,20 +7199,15 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo
return;
}
- WorldPacket packet(SMSG_UPDATE_CURRENCY, 12);
+ WorldPackets::Misc::SetCurrency packet;
+ packet.Type = id;
+ packet.Quantity = newTotalCount;
+ packet.SuppressChatLog = !printLog;
+ packet.WeeklyQuantity.Set(newWeekCount);
+ packet.TrackedQuantity.Set(newTrackedCount);
+ packet.Flags = itr->second.Flags;
- packet.WriteBit(weekCap != 0);
- packet.WriteBit(0); // hasSeasonCount
- packet.WriteBit(!printLog); // print in log
-
- // if hasSeasonCount packet << uint32(seasontotalearned); TODO: save this in character DB and use it
-
- packet << uint32(newTotalCount / precision);
- packet << uint32(id);
- if (weekCap)
- packet << uint32(newWeekCount / precision);
-
- GetSession()->SendPacket(&packet);
+ GetSession()->SendPacket(packet.Write());
}
}
@@ -7241,8 +7218,10 @@ void Player::SetCurrency(uint32 id, uint32 count, bool /*printLog*/ /*= true*/)
{
PlayerCurrency cur;
cur.state = PLAYERCURRENCY_NEW;
- cur.totalCount = count;
- cur.weekCount = 0;
+ cur.Quantity = count;
+ cur.WeeklyQuantity = 0;
+ cur.TrackedQuantity = 0;
+ cur.Flags = 0;
_currencyStorage[id] = cur;
}
}
@@ -7273,7 +7252,7 @@ void Player::ResetCurrencyWeekCap()
for (PlayerCurrenciesMap::iterator itr = _currencyStorage.begin(); itr != _currencyStorage.end(); ++itr)
{
- itr->second.weekCount = 0;
+ itr->second.WeeklyQuantity = 0;
itr->second.state = PLAYERCURRENCY_CHANGED;
}
@@ -22860,7 +22839,7 @@ void Player::SendInitialPacketsBeforeAddToMap()
m_reputationMgr->SendInitialReputations();
/// SMSG_SET_FORCED_REACTIONS
m_reputationMgr->SendForceReactions();
- /// SMSG_INIT_CURRENCY
+ /// SMSG_SETUP_CURRENCY
SendCurrencies();
/// SMSG_EQUIPMENT_SET_LIST
SendEquipmentSetList();
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index ef3e0b0bf51..31a145a7147 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -177,17 +177,19 @@ struct SpellModifier
enum PlayerCurrencyState
{
- PLAYERCURRENCY_UNCHANGED = 0,
- PLAYERCURRENCY_CHANGED = 1,
- PLAYERCURRENCY_NEW = 2,
- PLAYERCURRENCY_REMOVED = 3 //not removed just set count == 0
+ PLAYERCURRENCY_UNCHANGED = 0,
+ PLAYERCURRENCY_CHANGED = 1,
+ PLAYERCURRENCY_NEW = 2,
+ PLAYERCURRENCY_REMOVED = 3 //not removed just set count == 0
};
struct PlayerCurrency
{
- PlayerCurrencyState state;
- uint32 totalCount;
- uint32 weekCount;
+ PlayerCurrencyState state;
+ uint32 Quantity;
+ uint32 WeeklyQuantity;
+ uint32 TrackedQuantity;
+ uint8 Flags;
};
typedef std::unordered_map<uint32, PlayerTalent*> PlayerTalentMap;
@@ -1489,7 +1491,7 @@ class Player : public Unit, public GridObject<Player>
* @param id currency entry from CurrencyTypes.dbc
* @param count integer value for adding/removing curent currency
- * @param printLog used on SMSG_UPDATE_CURRENCY
+ * @param printLog used on SMSG_SET_CURRENCY
* @param ignore gain multipliers
*/
void ModifyCurrency(uint32 id, int32 count, bool printLog = true, bool ignoreMultipliers = false);