TrinityCore
BlackMarketHandler.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "WorldSession.h"
19#include "BlackMarketMgr.h"
20#include "BlackMarketPackets.h"
21#include "DatabaseEnv.h"
22#include "Item.h"
23#include "Log.h"
24#include "NPCPackets.h"
25#include "Player.h"
26
28{
30 if (!unit)
31 {
32 TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketHello - Unit (GUID: {}) not found or you can't interact with him.", blackMarketOpen.Guid.ToString());
33 return;
34 }
35
36 // remove fake death
37 if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
39
40 SendBlackMarketOpenResult(blackMarketOpen.Guid, unit);
41}
42
44{
46 npcInteraction.Npc = guid;
48 npcInteraction.Success = sBlackMarketMgr->IsEnabled();
49 SendPacket(npcInteraction.Write());
50}
51
53{
54 if (!sBlackMarketMgr->IsEnabled())
55 return;
56
58 if (!unit)
59 {
60 TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketRequestItems - Unit (GUID: {}) not found or you can't interact with him.", blackMarketRequestItems.Guid.ToString());
61 return;
62 }
63
65 sBlackMarketMgr->BuildItemsResponse(result, GetPlayer());
66 SendPacket(result.Write());
67}
68
70{
71 if (!sBlackMarketMgr->IsEnabled())
72 return;
73
74 Player* player = GetPlayer();
76 if (!unit)
77 {
78 TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Unit (GUID: {}) not found or you can't interact with him.", blackMarketBidOnItem.Guid.ToString());
79 return;
80 }
81
82 BlackMarketEntry* entry = sBlackMarketMgr->GetAuctionByID(blackMarketBidOnItem.MarketID);
83 if (!entry)
84 {
85 TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Player ({}, name: {}) tried to bid on a nonexistent auction (MarketId: {}).", player->GetGUID().ToString(), player->GetName(), blackMarketBidOnItem.MarketID);
86 SendBlackMarketBidOnItemResult(ERR_BMAH_ITEM_NOT_FOUND, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item);
87 return;
88 }
89
90 if (entry->GetBidder() == player->GetGUID().GetCounter())
91 {
92 TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Player ({}, name: {}) tried to place a bid on an item he already bid on. (MarketId: {}).", player->GetGUID().ToString(), player->GetName(), blackMarketBidOnItem.MarketID);
93 SendBlackMarketBidOnItemResult(ERR_BMAH_ALREADY_BID, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item);
94 return;
95 }
96
97 if (!entry->ValidateBid(blackMarketBidOnItem.BidAmount))
98 {
99 TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Player ({}, name: {}) tried to place an invalid bid. Amount: {} (MarketId: {}).", player->GetGUID().ToString(), player->GetName(), blackMarketBidOnItem.BidAmount, blackMarketBidOnItem.MarketID);
100 SendBlackMarketBidOnItemResult(ERR_BMAH_HIGHER_BID, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item);
101 return;
102 }
103
104 if (!player->HasEnoughMoney(blackMarketBidOnItem.BidAmount))
105 {
106 TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Player ({}, name: {}) does not have enough money to place bid. (MarketId: {}).", player->GetGUID().ToString(), player->GetName(), blackMarketBidOnItem.MarketID);
107 SendBlackMarketBidOnItemResult(ERR_BMAH_NOT_ENOUGH_MONEY, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item);
108 return;
109 }
110
111 if (entry->GetSecondsRemaining() <= 0)
112 {
113 TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketBidOnItem - Player ({}, name: {}) tried to bid on a completed auction. (MarketId: {}).", player->GetGUID().ToString(), player->GetName(), blackMarketBidOnItem.MarketID);
114 SendBlackMarketBidOnItemResult(ERR_BMAH_DATABASE_ERROR, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item);
115 return;
116 }
117
118 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
119
120 sBlackMarketMgr->SendAuctionOutbidMail(entry, trans);
121 entry->PlaceBid(blackMarketBidOnItem.BidAmount, player, trans);
122
123 CharacterDatabase.CommitTransaction(trans);
124
125 SendBlackMarketBidOnItemResult(ERR_BMAH_OK, blackMarketBidOnItem.MarketID, blackMarketBidOnItem.Item);
126}
127
129{
131
132 packet.MarketID = marketId;
133 packet.Item = item;
134 packet.Result = result;
135
136 SendPacket(packet.Write());
137}
138
140{
142
143 packet.MarketID = entry->GetMarketId();
144 packet.Item.Initialize(item);
145
146 SendPacket(packet.Write());
147}
148
150{
152
153 packet.MarketID = templ->MarketID;
154 packet.Item = templ->Item;
155 packet.RandomPropertiesID = 0;
156
157 SendPacket(packet.Write());
158}
#define sBlackMarketMgr
@ ERR_BMAH_HIGHER_BID
@ ERR_BMAH_DATABASE_ERROR
@ ERR_BMAH_NOT_ENOUGH_MONEY
@ ERR_BMAH_OK
@ ERR_BMAH_ITEM_NOT_FOUND
@ ERR_BMAH_ALREADY_BID
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
int32_t int32
Definition: Define.h:138
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
@ SPELL_AURA_FEIGN_DEATH
@ UNIT_NPC_FLAG_BLACK_MARKET
Definition: UnitDefines.h:328
@ UNIT_NPC_FLAG_2_BLACK_MARKET_VIEW
Definition: UnitDefines.h:344
@ UNIT_NPC_FLAG_2_NONE
Definition: UnitDefines.h:336
@ UNIT_STATE_DIED
Definition: Unit.h:255
int32 GetMarketId() const
uint32 GetSecondsRemaining() const
bool ValidateBid(uint64 bid) const
ObjectGuid::LowType GetBidder() const
void PlaceBid(uint64 bid, Player *player, CharacterDatabaseTransaction trans)
Definition: Item.h:170
LowType GetCounter() const
Definition: ObjectGuid.h:293
std::string ToString() const
Definition: ObjectGuid.cpp:554
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
Creature * GetNPCIfCanInteractWith(ObjectGuid const &guid, NPCFlags npcFlags, NPCFlags2 npcFlags2) const
Definition: Player.cpp:1947
bool HasEnoughMoney(uint64 amount) const
Definition: Player.h:1740
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3812
std::string const & GetName() const
Definition: Object.h:555
WorldPacket const * Write() override
Definition: NPCPackets.cpp:94
void SendBlackMarketBidOnItemResult(int32 result, int32 marketId, WorldPackets::Item::ItemInstance &item)
void HandleBlackMarketOpen(WorldPackets::BlackMarket::BlackMarketOpen &blackMarketOpen)
void SendBlackMarketOutbidNotification(BlackMarketTemplate const *templ)
void HandleBlackMarketBidOnItem(WorldPackets::BlackMarket::BlackMarketBidOnItem &blackMarketBidOnItem)
void SendBlackMarketOpenResult(ObjectGuid guid, Creature *auctioneer)
Player * GetPlayer() const
void SendBlackMarketWonNotification(BlackMarketEntry const *entry, Item const *item)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
void HandleBlackMarketRequestItems(WorldPackets::BlackMarket::BlackMarketRequestItems &blackMarketRequestItems)
WorldPackets::Item::ItemInstance Item
void Initialize(::Item const *item)