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/Handlers | |
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/Handlers')
-rw-r--r-- | src/server/game/Handlers/AuctionHouseHandler.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Handlers/MailHandler.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Handlers/TradeHandler.cpp | 4 |
4 files changed, 19 insertions, 13 deletions
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 52eeea3d1f0..dc846cc10a7 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -223,8 +223,8 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell uint32 auctionTime = uint32(packet.RunTime * sWorld->getRate(RATE_AUCTION_TIME)); AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction()); - uint32 deposit = sAuctionMgr->GetAuctionDeposit(auctionHouseEntry, packet.RunTime, item, finalCount); - if (!_player->HasEnoughMoney((uint64)deposit)) + uint64 deposit = sAuctionMgr->GetAuctionDeposit(auctionHouseEntry, packet.RunTime, item, finalCount); + if (!_player->HasEnoughMoney(deposit)) { SendAuctionCommandResult(NULL, AUCTION_SELL_ITEM, ERR_AUCTION_NOT_ENOUGHT_MONEY); return; @@ -440,7 +440,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlac PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID); stmt->setUInt64(0, auction->bidder); - stmt->setUInt32(1, auction->bid); + stmt->setUInt64(1, auction->bid); stmt->setUInt32(2, auction->Id); trans->Append(stmt); @@ -511,8 +511,8 @@ void WorldSession::HandleAuctionRemoveItem(WorldPackets::AuctionHouse::AuctionRe { if (auction->bidder) // If we have a bidder, we have to send him the money he paid { - uint32 auctionCut = auction->GetAuctionCut(); - if (!player->HasEnoughMoney((uint64)auctionCut)) //player doesn't have enough money, maybe message needed + uint64 auctionCut = auction->GetAuctionCut(); + if (!player->HasEnoughMoney(auctionCut)) //player doesn't have enough money, maybe message needed return; sAuctionMgr->SendAuctionCancelledToBidderMail(auction, trans); player->ModifyMoney(-int64(auctionCut)); diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 3f7aae6f91a..0e14a16d415 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -445,6 +445,16 @@ void WorldSession::HandleSellItemOpcode(WorldPackets::Item::SellItem& packet) { if (pProto->GetSellPrice() > 0) { + uint64 money = uint64(pProto->GetSellPrice()) * packet.Amount; + + if (!_player->ModifyMoney(money)) // ensure player doesn't exceed gold limit + { + _player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, packet.ItemGUID); + return; + } + + _player->UpdateCriteria(CRITERIA_TYPE_MONEY_FROM_VENDORS, money); + if (packet.Amount < pItem->GetCount()) // need split items { Item* pNewItem = pItem->CloneItem(packet.Amount, _player); @@ -472,10 +482,6 @@ void WorldSession::HandleSellItemOpcode(WorldPackets::Item::SellItem& packet) RemoveItemFromUpdateQueueOf(pItem, _player); _player->AddItemToBuyBackSlot(pItem); } - - uint32 money = pProto->GetSellPrice() * packet.Amount; - _player->ModifyMoney(money); - _player->UpdateCriteria(CRITERIA_TYPE_MONEY_FROM_VENDORS, money); } else _player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, packet.ItemGUID); diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 73423256893..b0c473091b4 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -456,7 +456,7 @@ void WorldSession::HandleMailTakeItem(WorldPackets::Mail::MailTakeItem& packet) } // prevent cheating with skip client money check - if (!player->HasEnoughMoney(uint64(m->COD))) + if (!player->HasEnoughMoney(m->COD)) { player->SendMailResult(packet.MailID, MAIL_ITEM_TAKEN, MAIL_ERR_NOT_ENOUGH_MONEY); return; @@ -509,7 +509,7 @@ void WorldSession::HandleMailTakeItem(WorldPackets::Mail::MailTakeItem& packet) .SendMailTo(trans, MailReceiver(receiver, m->sender), MailSender(MAIL_NORMAL, m->receiver), MAIL_CHECK_MASK_COD_PAYMENT); } - player->ModifyMoney(-int32(m->COD)); + player->ModifyMoney(-int64(m->COD)); } m->COD = 0; m->state = MAIL_STATE_CHANGED; diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index ea79a4a67f9..93be14c374c 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -285,7 +285,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& acc return; } - if (_player->GetMoney() >= uint64(MAX_MONEY_AMOUNT) - his_trade->GetMoney()) + if (_player->GetMoney() > MAX_MONEY_AMOUNT - his_trade->GetMoney()) { info.Status = TRADE_STATUS_FAILED; info.BagResult = EQUIP_ERR_TOO_MUCH_GOLD; @@ -294,7 +294,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& acc return; } - if (trader->GetMoney() >= uint64(MAX_MONEY_AMOUNT) - my_trade->GetMoney()) + if (trader->GetMoney() > MAX_MONEY_AMOUNT - my_trade->GetMoney()) { info.Status = TRADE_STATUS_FAILED; info.BagResult = EQUIP_ERR_TOO_MUCH_GOLD; |