diff options
| author | roc13x <roc13x@gmail.com> | 2017-08-17 02:00:42 -0600 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-08-20 18:10:11 +0200 |
| commit | e04f75bd962006662bc0f77f0034f061605fb1c6 (patch) | |
| tree | 5e8d1bf38ab41319634e104bdb08dce56d16ac9d /src/server/game/Guilds/Guild.cpp | |
| parent | 26d63a276e51db88e293e61b190ca3789fea13db (diff) | |
Core/Players: Several gold handling improvements
* Update gold limit to 10 million
* Updated auction house gold handling to 64-bit
* Fixed some vendor checks for when BuyCount > 1
* Tweaked some checks for available gold space
* Updated guild bank gold handling to 64-bit and fix withdraw limits
* Enforce gold limit on guild bank
* Check correct rank right when withdrawing from bank
* Other small changes to update money to 64-bit
Closes #19195
Closes #20152
Diffstat (limited to 'src/server/game/Guilds/Guild.cpp')
| -rw-r--r-- | src/server/game/Guilds/Guild.cpp | 96 |
1 files changed, 49 insertions, 47 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 23a7f1d884c..83c35e52133 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -174,7 +174,7 @@ void Guild::BankEventLogEntry::SaveToDB(SQLTransaction& trans) const stmt->setUInt8 (++index, m_bankTabId); stmt->setUInt8 (++index, uint8(m_eventType)); stmt->setUInt64(++index, m_playerGuid); - stmt->setUInt32(++index, m_itemOrMoney); + stmt->setUInt64(++index, m_itemOrMoney); stmt->setUInt16(++index, m_itemStackCount); stmt->setUInt8 (++index, m_destTabId); stmt->setUInt64(++index, m_timestamp); @@ -330,9 +330,6 @@ void Guild::RankInfo::SetRights(uint32 rights) void Guild::RankInfo::SetBankMoneyPerDay(uint32 money) { - if (m_rankId == GR_GUILDMASTER) // Prevent loss of leader rights - money = uint32(GUILD_WITHDRAW_MONEY_UNLIMITED); - if (m_bankMoneyPerDay == money) return; @@ -522,13 +519,14 @@ Guild::Member::Member(ObjectGuid::LowType guildId, ObjectGuid guid, uint8 rankId m_logoutTime(::time(nullptr)), m_accountId(0), m_rankId(rankId), + m_bankWithdrawMoney(0), m_achievementPoints(0), m_totalActivity(0), m_weekActivity(0), m_totalReputation(0), m_weekReputation(0) { - memset(m_bankWithdraw, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(int32)); + memset(m_bankWithdraw, 0, (GUILD_BANK_MAX_TABS) * sizeof(uint32)); } // Member @@ -613,9 +611,11 @@ bool Guild::Member::LoadFromDB(Field* fields) m_publicNote = fields[3].GetString(); m_officerNote = fields[4].GetString(); - for (uint8 i = 0; i <= GUILD_BANK_MAX_TABS; ++i) + for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; ++i) m_bankWithdraw[i] = fields[5 + i].GetUInt32(); + m_bankWithdrawMoney = fields[13].GetUInt64(); + SetStats(fields[14].GetString(), fields[15].GetUInt8(), // characters.level fields[16].GetUInt8(), // characters.class @@ -658,16 +658,14 @@ bool Guild::Member::CheckStats() const return true; } -// Decreases amount of money/slots left for today. -// If (tabId == GUILD_BANK_MAX_TABS) decrease money amount. -// Otherwise decrease remaining items amount for specified tab. -void Guild::Member::UpdateBankWithdrawValue(SQLTransaction& trans, uint8 tabId, uint32 amount) +// Decreases amount of slots left for today. +void Guild::Member::UpdateBankTabWithdrawValue(SQLTransaction& trans, uint8 tabId, uint32 amount) { m_bankWithdraw[tabId] += amount; - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_MEMBER_WITHDRAW); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_MEMBER_WITHDRAW_TABS); stmt->setUInt64(0, m_guid.GetCounter()); - for (uint8 i = 0; i <= GUILD_BANK_MAX_TABS;) + for (uint8 i = 0; i < GUILD_BANK_MAX_TABS;) { uint32 withdraw = m_bankWithdraw[i++]; stmt->setUInt32(i, withdraw); @@ -676,11 +674,24 @@ void Guild::Member::UpdateBankWithdrawValue(SQLTransaction& trans, uint8 tabId, CharacterDatabase.ExecuteOrAppend(trans, stmt); } +// Decreases amount of money left for today. +void Guild::Member::UpdateBankMoneyWithdrawValue(SQLTransaction& trans, uint64 amount) +{ + m_bankWithdrawMoney += amount; + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_MEMBER_WITHDRAW_MONEY); + stmt->setUInt64(0, m_guid.GetCounter()); + stmt->setUInt64(1, m_bankWithdrawMoney); + CharacterDatabase.ExecuteOrAppend(trans, stmt); +} + void Guild::Member::ResetValues(bool weekly /* = false*/) { - for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId) + for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId) m_bankWithdraw[tabId] = 0; + m_bankWithdrawMoney = 0; + if (weekly) { m_weekActivity = 0; @@ -698,18 +709,6 @@ Player* Guild::Member::FindConnectedPlayer() const return ObjectAccessor::FindConnectedPlayer(m_guid); } -// Get amount of money/slots left for today. -// If (tabId == GUILD_BANK_MAX_TABS) return money amount. -// Otherwise return remaining items amount for specified tab. -int32 Guild::Member::GetBankWithdrawValue(uint8 tabId) const -{ - // Guild master has unlimited amount. - if (IsRank(GR_GUILDMASTER)) - return static_cast<int32>(tabId == GUILD_BANK_MAX_TABS ? GUILD_WITHDRAW_MONEY_UNLIMITED : GUILD_WITHDRAW_SLOT_UNLIMITED); - - return m_bankWithdraw[tabId]; -} - // EmblemInfo void EmblemInfo::ReadPacket(WorldPackets::Guild::SaveGuildEmblem& packet) { @@ -1394,7 +1393,7 @@ void Guild::SendGuildRankInfo(WorldSession* session) const rankData.RankID = uint32(rankInfo->GetId()); rankData.RankOrder = uint32(i); rankData.Flags = rankInfo->GetRights(); - rankData.WithdrawGoldLimit = uint32(rankInfo->GetBankMoneyPerDay()); + rankData.WithdrawGoldLimit = rankInfo->GetBankMoneyPerDay(); rankData.RankName = rankInfo->GetName(); for (uint8 j = 0; j < GUILD_BANK_MAX_TABS; ++j) @@ -1908,6 +1907,11 @@ void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId) void Guild::HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool cashFlow /*=false*/) { + // guild bank cannot have more than MAX_MONEY_AMOUNT + amount = std::min(amount, MAX_MONEY_AMOUNT - m_bankMoney); + if (!amount) + return; + Player* player = session->GetPlayer(); // Call script after validation and before money transfer. @@ -1937,7 +1941,7 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint64 amount, bool repair) { // clamp amount to MAX_MONEY_AMOUNT, Players can't hold more than that anyway - amount = std::min(amount, uint64(MAX_MONEY_AMOUNT)); + amount = std::min(amount, MAX_MONEY_AMOUNT); if (m_bankMoney < amount) // Not enough money in bank return false; @@ -1948,7 +1952,10 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint64 amount, bool if (!member) return false; - if (uint64(_GetMemberRemainingMoney(member)) < amount) // Check if we have enough slot/money today + if (!_HasRankRight(player, repair ? GR_RIGHT_WITHDRAW_REPAIR : GR_RIGHT_WITHDRAW_GOLD)) + return false; + + if (_GetMemberRemainingMoney(member) < int64(amount)) // Check if we have enough slot/money today return false; // Call script after validation and before money transfer. @@ -1965,7 +1972,7 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint64 amount, bool } // Update remaining money amount - member->UpdateBankWithdrawValue(trans, GUILD_BANK_MAX_TABS, amount); + member->UpdateBankMoneyWithdrawValue(trans, amount); // Remove money from bank _ModifyBankMoney(trans, amount, false); @@ -2127,7 +2134,7 @@ void Guild::SendPermissions(WorldSession* session) const WorldPackets::Guild::GuildPermissionsQueryResults queryResult; queryResult.RankID = rankId; - queryResult.WithdrawGoldLimit = _GetMemberRemainingMoney(member); + queryResult.WithdrawGoldLimit = int32(_GetRankBankMoneyPerDay(rankId)); queryResult.Flags = _GetRankRights(rankId); queryResult.NumTabs = _GetPurchasedTabsSize(); queryResult.Tab.reserve(GUILD_BANK_MAX_TABS); @@ -2150,13 +2157,13 @@ void Guild::SendMoneyInfo(WorldSession* session) const if (!member) return; - int32 amount = _GetMemberRemainingMoney(member); + int64 amount = _GetMemberRemainingMoney(member); WorldPackets::Guild::GuildBankRemainingWithdrawMoney packet; - packet.RemainingWithdrawMoney = int64(amount); + packet.RemainingWithdrawMoney = amount; session->SendPacket(packet.Write()); - TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_MONEY_WITHDRAWN [%s] Money: %u", session->GetPlayerInfo().c_str(), amount); + TC_LOG_DEBUG("guild", "SMSG_GUILD_BANK_MONEY_WITHDRAWN [%s] Money: " SI64FMTD, session->GetPlayerInfo().c_str(), amount); } void Guild::SendLoginInfo(WorldSession* session) @@ -2973,7 +2980,7 @@ inline uint32 Guild::_GetRankRights(uint8 rankId) const return 0; } -inline int32 Guild::_GetRankBankMoneyPerDay(uint8 rankId) const +inline uint32 Guild::_GetRankBankMoneyPerDay(uint8 rankId) const { if (const RankInfo* rankInfo = GetRankInfo(rankId)) return rankInfo->GetBankMoneyPerDay(); @@ -3004,7 +3011,7 @@ inline int32 Guild::_GetMemberRemainingSlots(Member const* member, uint8 tabId) return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED); if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0) { - int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member->GetBankWithdrawValue(tabId); + int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member->GetBankTabWithdrawValue(tabId); if (remaining > 0) return remaining; } @@ -3012,17 +3019,17 @@ inline int32 Guild::_GetMemberRemainingSlots(Member const* member, uint8 tabId) return 0; } -inline int32 Guild::_GetMemberRemainingMoney(Member const* member) const +inline int64 Guild::_GetMemberRemainingMoney(Member const* member) const { if (member) { uint8 rankId = member->GetRankId(); if (rankId == GR_GUILDMASTER) - return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED); + return std::numeric_limits<int64>::max(); if ((_GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0) { - int32 remaining = _GetRankBankMoneyPerDay(rankId) - member->GetBankWithdrawValue(GUILD_BANK_MAX_TABS); + int64 remaining = (int64(_GetRankBankMoneyPerDay(rankId)) * GOLD) - member->GetBankMoneyWithdrawValue(); if (remaining > 0) return remaining; } @@ -3033,12 +3040,7 @@ inline int32 Guild::_GetMemberRemainingMoney(Member const* member) const inline void Guild::_UpdateMemberWithdrawSlots(SQLTransaction& trans, ObjectGuid guid, uint8 tabId) { if (Member* member = GetMember(guid)) - { - uint8 rankId = member->GetRankId(); - if (rankId != GR_GUILDMASTER - && member->GetBankWithdrawValue(tabId) < _GetRankBankTabSlotsPerDay(rankId, tabId)) - member->UpdateBankWithdrawValue(trans, tabId, 1); - } + member->UpdateBankTabWithdrawValue(trans, tabId, 1); } inline bool Guild::_MemberHasTabRights(ObjectGuid guid, uint8 tabId, int32 rights) const @@ -3281,7 +3283,7 @@ void Guild::_SendBankContentUpdate(uint8 tabId, SlotIds slots) const if (_MemberHasTabRights(itr->second->GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB)) if (Player* player = itr->second->FindPlayer()) { - packet.WithdrawalsRemaining = int32(_GetMemberRemainingSlots(itr->second, tabId)); + packet.WithdrawalsRemaining = _GetMemberRemainingSlots(itr->second, tabId); player->GetSession()->SendPacket(packet.Write()); } } @@ -3295,8 +3297,8 @@ void Guild::SendBankList(WorldSession* session, uint8 tabId, bool fullUpdate) co WorldPackets::Guild::GuildBankQueryResults packet; - packet.Money = uint64(m_bankMoney); - packet.WithdrawalsRemaining = int32(_GetMemberRemainingSlots(member, tabId)); + packet.Money = m_bankMoney; + packet.WithdrawalsRemaining = _GetMemberRemainingSlots(member, tabId); packet.Tab = int32(tabId); packet.FullUpdate = fullUpdate; |
