AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
item_commandscript Class Reference
Inheritance diagram for item_commandscript:
CommandScript ScriptObject

Public Member Functions

 item_commandscript ()
 
ChatCommandTable GetCommands () const override
 
- Public Member Functions inherited from ScriptObject
virtual bool IsDatabaseBound () const
 
virtual bool isAfterLoadScript () const
 
virtual void checkValidity ()
 
const std::string & GetName () const
 
uint16 GetTotalAvailableHooks ()
 

Static Public Member Functions

static bool HandleItemRestoreCommand (ChatHandler *handler, uint32 restoreId, PlayerIdentifier player)
 
static bool HandleItemRestoreListCommand (ChatHandler *handler, PlayerIdentifier player)
 
static bool HandleItemMoveCommand (ChatHandler *handler, uint8 srcSlot, uint8 dstSlot)
 
static bool HasItemDeletionConfig ()
 
static bool HandleItemRefundCommand (ChatHandler *handler, PlayerIdentifier player, uint32 itemId, uint32 extendedCost)
 

Additional Inherited Members

- Protected Member Functions inherited from CommandScript
 CommandScript (const char *name)
 
- Protected Member Functions inherited from ScriptObject
 ScriptObject (const char *name, uint16 totalAvailableHooks=0)
 
virtual ~ScriptObject ()=default
 

Detailed Description

Constructor & Destructor Documentation

◆ item_commandscript()

item_commandscript::item_commandscript ( )
inline
32: CommandScript("item_commandscript") { }
Definition CommandScript.h:25

Member Function Documentation

◆ GetCommands()

ChatCommandTable item_commandscript::GetCommands ( ) const
inlineoverridevirtual

Implements CommandScript.

35 {
36 static ChatCommandTable HandleItemRestoreCommandTable =
37 {
40 };
41 static ChatCommandTable itemCommandTable =
42 {
43 { "restore", HandleItemRestoreCommandTable },
46 };
47 static ChatCommandTable commandTable =
48 {
49 { "item", itemCommandTable }
50 };
51 return commandTable;
52 }
static bool HandleItemRestoreListCommand(ChatHandler *handler, PlayerIdentifier player)
Definition cs_item.cpp:115
static bool HandleItemMoveCommand(ChatHandler *handler, uint8 srcSlot, uint8 dstSlot)
Definition cs_item.cpp:153
static bool HandleItemRestoreCommand(ChatHandler *handler, uint32 restoreId, PlayerIdentifier player)
Definition cs_item.cpp:54
static bool HandleItemRefundCommand(ChatHandler *handler, PlayerIdentifier player, uint32 itemId, uint32 extendedCost)
Definition cs_item.cpp:177
std::vector< ChatCommandBuilder > ChatCommandTable
Definition ChatCommand.h:46
@ RBAC_PERM_COMMAND_ITEM_REFUND
Definition RBAC.h:652
@ RBAC_PERM_COMMAND_ITEM_RESTORE
Definition RBAC.h:650
@ RBAC_PERM_COMMAND_ITEM_RESTORE_LIST
Definition RBAC.h:651
@ RBAC_PERM_COMMAND_ITEMMOVE
Definition RBAC.h:340

References HandleItemMoveCommand(), HandleItemRefundCommand(), HandleItemRestoreCommand(), HandleItemRestoreListCommand(), rbac::RBAC_PERM_COMMAND_ITEM_REFUND, rbac::RBAC_PERM_COMMAND_ITEM_RESTORE, rbac::RBAC_PERM_COMMAND_ITEM_RESTORE_LIST, and rbac::RBAC_PERM_COMMAND_ITEMMOVE.

◆ HandleItemMoveCommand()

static bool item_commandscript::HandleItemMoveCommand ( ChatHandler handler,
uint8  srcSlot,
uint8  dstSlot 
)
inlinestatic
Todo:
  • move item to other slot
154 {
155 if (srcSlot == dstSlot)
156 return true;
157
158 if (!handler->GetSession()->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, srcSlot, true))
159 return false;
160
161 if (!handler->GetSession()->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, dstSlot, false))
162 return false;
163
164 uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcSlot);
165 uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstSlot);
166
167 handler->GetSession()->GetPlayer()->SwapItem(src, dst);
168
169 return true;
170 }
std::uint16_t uint16
Definition Define.h:108
#define INVENTORY_SLOT_BAG_0
Definition Player.h:656
WorldSession * GetSession()
Definition Chat.h:242
void SwapItem(uint16 src, uint16 dst)
Definition PlayerStorage.cpp:3598
bool IsValidPos(uint16 pos, bool explicit_pos)
Definition Player.h:1283
Player * GetPlayer() const
Definition WorldSession.h:454

References WorldSession::GetPlayer(), ChatHandler::GetSession(), INVENTORY_SLOT_BAG_0, Player::IsValidPos(), and Player::SwapItem().

Referenced by GetCommands().

◆ HandleItemRefundCommand()

static bool item_commandscript::HandleItemRefundCommand ( ChatHandler handler,
PlayerIdentifier  player,
uint32  itemId,
uint32  extendedCost 
)
inlinestatic
178 {
179 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(extendedCost);
180 if (!iece)
181 {
183 return false;
184 }
185
186 ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId);
187
188 if (!item)
189 {
191 return false;
192 }
193
194 if (Player* target = player.GetConnectedPlayer())
195 {
196 if (!target->HasItemCount(itemId, 1, true))
197 {
199 return false;
200 }
201
202 if (iece->reqhonorpoints)
203 {
204 uint32 honor = target->GetHonorPoints() + iece->reqhonorpoints;
205 if (honor > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS))
206 {
207 handler->SendErrorMessage(LANG_CMD_ITEM_REFUND_MAX_HONOR, item->Name1, item->ItemId, sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS), target->GetHonorPoints(), iece->reqhonorpoints);
209 return false;
210 }
211
212 target->SetHonorPoints(honor);
213 ChatHandler(target->GetSession()).PSendSysMessage(LANG_CMD_ITEM_REFUNDED_HONOR, item->Name1, item->ItemId, iece->reqhonorpoints);
215 }
216
217 if (iece->reqarenapoints)
218 {
219 uint32 arenapoints = target->GetArenaPoints() + iece->reqarenapoints;
220 if (arenapoints > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS))
221 {
222 handler->SendErrorMessage(LANG_CMD_ITEM_REFUND_MAX_AP, item->Name1, item->ItemId, sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS), target->GetArenaPoints(), iece->reqarenapoints);
224 return false;
225 }
226
227 target->SetArenaPoints(arenapoints);
228 ChatHandler(target->GetSession()).PSendSysMessage(LANG_CMD_ITEM_REFUNDED_AP, item->Name1, item->ItemId, iece->reqarenapoints);
230 }
231
232 uint8 count = 0;
233 for (uint32 const& reqItem : iece->reqitem)
234 {
235 if (reqItem)
236 {
237 target->AddItem(reqItem, iece->reqitemcount[count]);
238 }
239
240 ++count;
241 }
242
243 target->DestroyItemCount(itemId, 1, true);
244 }
245 else
246 {
247 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
249
250 ObjectGuid::LowType guid = player.GetGUID().GetCounter();
251
253 stmt->SetData(0, itemId);
254 stmt->SetData(1, guid);
255
256 PreparedQueryResult result = CharacterDatabase.Query(stmt);
257
258 if (result)
259 {
260 if (iece->reqhonorpoints)
261 {
262 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_HONORPOINTS);
263 stmt->SetData(0, guid);
264
265 PreparedQueryResult queryResult = CharacterDatabase.Query(stmt);
266
267 if (queryResult)
268 {
269 Field* fields = queryResult->Fetch();
270 if ((fields[0].Get<uint32>() + iece->reqhonorpoints) > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS))
271 {
272 handler->SendErrorMessage(LANG_CMD_ITEM_REFUND_MAX_HONOR, item->Name1, item->ItemId, sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS), fields[0].Get<uint32>(), iece->reqhonorpoints);
273 return false;
274 }
275 }
276
278 stmt->SetData(0, iece->reqhonorpoints);
279 stmt->SetData(1, guid);
280 trans->Append(stmt);
282 }
283
284 if (iece->reqarenapoints)
285 {
286 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ARENAPOINTS);
287 stmt->SetData(0, guid);
288
289 PreparedQueryResult queryResult = CharacterDatabase.Query(stmt);
290
291 if (queryResult)
292 {
293 Field* fields = queryResult->Fetch();
294 if ((fields[0].Get<uint32>() + iece->reqhonorpoints) > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS))
295 {
296 handler->SendErrorMessage(LANG_CMD_ITEM_REFUND_MAX_AP, item->Name1, item->ItemId, sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS), fields[0].Get<uint32>(), iece->reqarenapoints);
297 return false;
298 }
299 }
300
302 stmt->SetData(0, iece->reqarenapoints);
303 stmt->SetData(1, guid);
304 trans->Append(stmt);
306 }
307
309 // fill mail
310 std::string msg = "Your item " + item->Name1 + " has been removed and the used currency restored. This mail contains any items used as currency.";
311 MailDraft draft("Item Refund", msg);
312
313 uint8 count = 0;
314 bool foundItems = false;
315 for (uint32 const& reqItem : iece->reqitem)
316 {
317 if (reqItem)
318 {
319 // Skip invalid items.
320 if (!sObjectMgr->GetItemTemplate(reqItem))
321 {
322 continue;
323 }
324
325 if (Item* item = Item::CreateItem(reqItem, iece->reqitemcount[count]))
326 {
327 item->SaveToDB(trans);
328 draft.AddItem(item);
329 foundItems = true;
330 }
331 }
332
333 ++count;
334 }
335
336 if (foundItems)
337 {
338 draft.SendMailTo(trans, MailReceiver(nullptr, guid), sender);
339 }
340
341 Field* fields = result->Fetch();
342
343 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
344 stmt->SetData(0, fields[0].Get<uint32>());
345 trans->Append(stmt);
346
347 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
348 stmt->SetData(0, fields[0].Get<uint32>());
349 trans->Append(stmt);
350
351 CharacterDatabase.CommitTransaction(trans);
352 }
353 else
354 {
356 return false;
357 }
358 }
359
360 return true;
361 }
@ CHAR_DEL_ITEM_INSTANCE
Definition CharacterDatabase.h:127
@ CHAR_DEL_CHAR_INVENTORY_BY_ITEM
Definition CharacterDatabase.h:439
@ CHAR_SEL_HONORPOINTS
Definition CharacterDatabase.h:520
@ CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY_AND_OWNER
Definition CharacterDatabase.h:363
@ CHAR_UDP_CHAR_HONOR_POINTS_ACCUMULATIVE
Definition CharacterDatabase.h:428
@ CHAR_SEL_ARENAPOINTS
Definition CharacterDatabase.h:521
@ CHAR_UDP_CHAR_ARENA_POINTS_ACCUMULATIVE
Definition CharacterDatabase.h:430
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
std::uint8_t uint8
Definition Define.h:109
std::uint32_t uint32
Definition Define.h:107
@ LANG_CMD_ITEM_REFUND_MAX_HONOR
Definition Language.h:1143
@ LANG_CMD_ITEM_REFUNDED_HONOR
Definition Language.h:1145
@ LANG_CMD_ITEM_REFUND_MAX_AP
Definition Language.h:1146
@ LANG_CMD_ITEM_REFUND_HONOR_FAILED
Definition Language.h:1144
@ LANG_CMD_ITEM_REFUND_AP_FAILED
Definition Language.h:1147
@ LANG_CMD_ITEM_REFUND_NOT_FOUND
Definition Language.h:1149
@ LANG_CMD_ITEM_REFUNDED_AP
Definition Language.h:1148
@ LANG_CMD_ITEM_REFUND_BAD_EXTENDED_COST
Definition Language.h:1142
@ LANG_COMMAND_ITEMIDINVALID
Definition Language.h:476
@ MAIL_STATIONERY_GM
Definition Mail.h:59
@ MAIL_NORMAL
Definition Mail.h:37
#define sObjectMgr
Definition ObjectMgr.h:1723
@ CONFIG_MAX_HONOR_POINTS
Definition WorldConfig.h:195
@ CONFIG_MAX_ARENA_POINTS
Definition WorldConfig.h:198
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:219
void SendErrorMessage(uint32 entry)
Definition Chat.cpp:224
Class used to access individual fields of database query result.
Definition Field.h:98
Definition Item.h:220
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition Item.cpp:1087
Definition Mail.h:119
Definition Mail.h:105
Definition Mail.h:83
LowType GetCounter() const
Definition ObjectGuid.h:145
uint32 LowType
Definition ObjectGuid.h:122
Definition Player.h:1084
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157
#define sWorld
Definition World.h:317
ObjectGuid GetGUID() const
Definition ChatCommandTags.h:181
Player * GetConnectedPlayer() const
Definition ChatCommandTags.h:183
Definition DBCStructure.h:1188
uint32 reqarenapoints
Definition DBCStructure.h:1191
uint32 reqitemcount[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition DBCStructure.h:1194
uint32 reqhonorpoints
Definition DBCStructure.h:1190
Definition ItemTemplate.h:619
std::string Name1
Definition ItemTemplate.h:624
uint32 ItemId
Definition ItemTemplate.h:620

References MailDraft::AddItem(), CHAR_DEL_CHAR_INVENTORY_BY_ITEM, CHAR_DEL_ITEM_INSTANCE, CHAR_SEL_ARENAPOINTS, CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY_AND_OWNER, CHAR_SEL_HONORPOINTS, CHAR_UDP_CHAR_ARENA_POINTS_ACCUMULATIVE, CHAR_UDP_CHAR_HONOR_POINTS_ACCUMULATIVE, CharacterDatabase, CONFIG_MAX_ARENA_POINTS, CONFIG_MAX_HONOR_POINTS, Item::CreateItem(), Field::Get(), Acore::ChatCommands::PlayerIdentifier::GetConnectedPlayer(), ObjectGuid::GetCounter(), Acore::ChatCommands::PlayerIdentifier::GetGUID(), ItemTemplate::ItemId, LANG_CMD_ITEM_REFUND_AP_FAILED, LANG_CMD_ITEM_REFUND_BAD_EXTENDED_COST, LANG_CMD_ITEM_REFUND_HONOR_FAILED, LANG_CMD_ITEM_REFUND_MAX_AP, LANG_CMD_ITEM_REFUND_MAX_HONOR, LANG_CMD_ITEM_REFUND_NOT_FOUND, LANG_CMD_ITEM_REFUNDED_AP, LANG_CMD_ITEM_REFUNDED_HONOR, LANG_COMMAND_ITEMIDINVALID, MAIL_NORMAL, MAIL_STATIONERY_GM, ItemTemplate::Name1, ChatHandler::PSendSysMessage(), ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, ChatHandler::SendErrorMessage(), MailDraft::SendMailTo(), PreparedStatementBase::SetData(), sItemExtendedCostStore, sObjectMgr, and sWorld.

Referenced by GetCommands().

◆ HandleItemRestoreCommand()

static bool item_commandscript::HandleItemRestoreCommand ( ChatHandler handler,
uint32  restoreId,
PlayerIdentifier  player 
)
inlinestatic
55 {
56 if (!restoreId)
57 {
58 return false;
59 }
60
62 {
64 return false;
65 }
66
67 // Check existence of item in recovery table
69 stmt->SetData(0, restoreId);
70 PreparedQueryResult fields = CharacterDatabase.Query(stmt);
71
72 if (!fields || !(*fields)[1].Get<uint32>() || (*fields)[3].Get<uint32>() != player.GetGUID().GetCounter())
73 {
75 return false;
76 }
77
78 // Mail item to player
79 uint32 itemEntry = (*fields)[1].Get<uint32>();
80 uint32 itemCount = (*fields)[2].Get<uint32>();
81
82 if (Player* onlinePlayer = player.GetConnectedPlayer())
83 {
84 onlinePlayer->SendItemRetrievalMail({ { itemEntry, itemCount } });
85 }
86
87 else
88 {
89 MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */);
90 MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed.");
91
92 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
93
94 // Save to prevent loss at next mail load. Item deletes on fail
95 if (Item* item = Item::CreateItem(itemEntry, itemCount, 0))
96 {
97 item->SaveToDB(trans);
98 draft.AddItem(item);
99 }
100
101 draft.SendMailTo(trans, MailReceiver(player.GetGUID().GetCounter()), sender);
102 CharacterDatabase.CommitTransaction(trans);
103 }
104
105 // Remove from recovery table
107 delStmt->SetData(0, (*fields)[0].Get<uint32>());
108 CharacterDatabase.Execute(delStmt);
109
110 std::string nameLink = handler->playerLink(player.GetName());
111 handler->PSendSysMessage(LANG_MAIL_SENT, nameLink);
112 return true;
113 }
@ CHAR_DEL_RECOVERY_ITEM_BY_RECOVERY_ID
Definition CharacterDatabase.h:516
@ CHAR_SEL_RECOVERY_ITEM
Definition CharacterDatabase.h:513
@ LANG_COMMAND_DISABLED
Definition Language.h:1140
@ LANG_ITEM_RESTORE_MISSING
Definition Language.h:242
@ LANG_MAIL_SENT
Definition Language.h:213
@ MAIL_CREATURE
Definition Mail.h:39
std::string playerLink(std::string const &name) const
Definition Chat.h:231
static bool HasItemDeletionConfig()
Definition cs_item.cpp:172
std::string const & GetName() const
Definition ChatCommandTags.h:180

References MailDraft::AddItem(), CHAR_DEL_RECOVERY_ITEM_BY_RECOVERY_ID, CHAR_SEL_RECOVERY_ITEM, CharacterDatabase, Item::CreateItem(), Acore::ChatCommands::PlayerIdentifier::GetConnectedPlayer(), ObjectGuid::GetCounter(), Acore::ChatCommands::PlayerIdentifier::GetGUID(), Acore::ChatCommands::PlayerIdentifier::GetName(), HasItemDeletionConfig(), LANG_COMMAND_DISABLED, LANG_ITEM_RESTORE_MISSING, LANG_MAIL_SENT, MAIL_CREATURE, ChatHandler::playerLink(), ChatHandler::PSendSysMessage(), ChatHandler::SendErrorMessage(), MailDraft::SendMailTo(), and PreparedStatementBase::SetData().

Referenced by GetCommands().

◆ HandleItemRestoreListCommand()

static bool item_commandscript::HandleItemRestoreListCommand ( ChatHandler handler,
PlayerIdentifier  player 
)
inlinestatic
116 {
118 {
120 return false;
121 }
122
124 stmt->SetData(0, player.GetGUID().GetCounter());
125 PreparedQueryResult disposedItems = CharacterDatabase.Query(stmt);
126
127 if (!disposedItems)
128 {
130 return false;
131 }
132
133 do
134 {
135 Field* fields = disposedItems->Fetch();
136 uint32 id = fields[0].Get<uint32>();
137 uint32 itemId = fields[1].Get<uint32>();
138 uint32 count = fields[2].Get<uint32>();
139
140 std::string itemName = "";
141 if (ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId))
142 {
143 itemName = item->Name1;
144 }
145
146 handler->PSendSysMessage(LANG_ITEM_RESTORE_LIST, id, itemName, itemId, count);
147 } while (disposedItems->NextRow());
148
149 return true;
150 }
@ CHAR_SEL_RECOVERY_ITEM_LIST
Definition CharacterDatabase.h:514
@ LANG_ITEM_RESTORE_LIST
Definition Language.h:240
@ LANG_ITEM_RESTORE_LIST_EMPTY
Definition Language.h:241
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112

References CHAR_SEL_RECOVERY_ITEM_LIST, CharacterDatabase, Field::Get(), ObjectGuid::GetCounter(), Acore::ChatCommands::PlayerIdentifier::GetGUID(), HasItemDeletionConfig(), LANG_COMMAND_DISABLED, LANG_ITEM_RESTORE_LIST, LANG_ITEM_RESTORE_LIST_EMPTY, ChatHandler::PSendSysMessage(), ChatHandler::SendErrorMessage(), PreparedStatementBase::SetData(), and sObjectMgr.

Referenced by GetCommands().

◆ HasItemDeletionConfig()

static bool item_commandscript::HasItemDeletionConfig ( )
inlinestatic
173 {
174 return sWorld->getBoolConfig(CONFIG_ITEMDELETE_METHOD) || sWorld->getBoolConfig(CONFIG_ITEMDELETE_VENDOR);
175 }
@ CONFIG_ITEMDELETE_METHOD
Definition WorldConfig.h:118
@ CONFIG_ITEMDELETE_VENDOR
Definition WorldConfig.h:119

References CONFIG_ITEMDELETE_METHOD, CONFIG_ITEMDELETE_VENDOR, and sWorld.

Referenced by HandleItemRestoreCommand(), and HandleItemRestoreListCommand().


The documentation for this class was generated from the following file: