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
31: CommandScript("item_commandscript") { }
Definition CommandScript.h:25

Member Function Documentation

◆ GetCommands()

ChatCommandTable item_commandscript::GetCommands ( ) const
inlineoverridevirtual

Implements CommandScript.

34 {
35 static ChatCommandTable HandleItemRestoreCommandTable =
36 {
37 { "list", HandleItemRestoreListCommand, SEC_GAMEMASTER, Console::Yes },
38 { "", HandleItemRestoreCommand, SEC_GAMEMASTER, Console::Yes },
39 };
40 static ChatCommandTable itemCommandTable =
41 {
42 { "restore", HandleItemRestoreCommandTable },
43 { "move", HandleItemMoveCommand, SEC_GAMEMASTER, Console::Yes },
44 { "refund", HandleItemRefundCommand, SEC_ADMINISTRATOR, Console::Yes },
45 };
46 static ChatCommandTable commandTable =
47 {
48 { "item", itemCommandTable }
49 };
50 return commandTable;
51 }
@ SEC_ADMINISTRATOR
Definition Common.h:60
@ SEC_GAMEMASTER
Definition Common.h:59
static bool HandleItemRestoreListCommand(ChatHandler *handler, PlayerIdentifier player)
Definition cs_item.cpp:114
static bool HandleItemMoveCommand(ChatHandler *handler, uint8 srcSlot, uint8 dstSlot)
Definition cs_item.cpp:152
static bool HandleItemRestoreCommand(ChatHandler *handler, uint32 restoreId, PlayerIdentifier player)
Definition cs_item.cpp:53
static bool HandleItemRefundCommand(ChatHandler *handler, PlayerIdentifier player, uint32 itemId, uint32 extendedCost)
Definition cs_item.cpp:176
std::vector< ChatCommandBuilder > ChatCommandTable
Definition ChatCommand.h:46

References HandleItemMoveCommand(), HandleItemRefundCommand(), HandleItemRestoreCommand(), HandleItemRestoreListCommand(), SEC_ADMINISTRATOR, and SEC_GAMEMASTER.

◆ HandleItemMoveCommand()

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

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
177 {
178 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(extendedCost);
179 if (!iece)
180 {
182 return false;
183 }
184
185 ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId);
186
187 if (!item)
188 {
190 return false;
191 }
192
193 if (Player* target = player.GetConnectedPlayer())
194 {
195 if (!target->HasItemCount(itemId, 1, true))
196 {
198 return false;
199 }
200
201 if (iece->reqhonorpoints)
202 {
203 uint32 honor = target->GetHonorPoints() + iece->reqhonorpoints;
204 if (honor > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS))
205 {
206 handler->SendErrorMessage(LANG_CMD_ITEM_REFUND_MAX_HONOR, item->Name1, item->ItemId, sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS), target->GetHonorPoints(), iece->reqhonorpoints);
208 return false;
209 }
210
211 target->SetHonorPoints(honor);
212 ChatHandler(target->GetSession()).PSendSysMessage(LANG_CMD_ITEM_REFUNDED_HONOR, item->Name1, item->ItemId, iece->reqhonorpoints);
214 }
215
216 if (iece->reqarenapoints)
217 {
218 uint32 arenapoints = target->GetArenaPoints() + iece->reqarenapoints;
219 if (arenapoints > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS))
220 {
221 handler->SendErrorMessage(LANG_CMD_ITEM_REFUND_MAX_AP, item->Name1, item->ItemId, sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS), target->GetArenaPoints(), iece->reqarenapoints);
223 return false;
224 }
225
226 target->SetArenaPoints(arenapoints);
227 ChatHandler(target->GetSession()).PSendSysMessage(LANG_CMD_ITEM_REFUNDED_AP, item->Name1, item->ItemId, iece->reqarenapoints);
229 }
230
231 uint8 count = 0;
232 for (uint32 const& reqItem : iece->reqitem)
233 {
234 if (reqItem)
235 {
236 target->AddItem(reqItem, iece->reqitemcount[count]);
237 }
238
239 ++count;
240 }
241
242 target->DestroyItemCount(itemId, 1, true);
243 }
244 else
245 {
246 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
248
249 ObjectGuid::LowType guid = player.GetGUID().GetCounter();
250
252 stmt->SetData(0, itemId);
253 stmt->SetData(1, guid);
254
255 PreparedQueryResult result = CharacterDatabase.Query(stmt);
256
257 if (result)
258 {
259 if (iece->reqhonorpoints)
260 {
261 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_HONORPOINTS);
262 stmt->SetData(0, guid);
263
264 PreparedQueryResult queryResult = CharacterDatabase.Query(stmt);
265
266 if (queryResult)
267 {
268 Field* fields = queryResult->Fetch();
269 if ((fields[0].Get<uint32>() + iece->reqhonorpoints) > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS))
270 {
271 handler->SendErrorMessage(LANG_CMD_ITEM_REFUND_MAX_HONOR, item->Name1, item->ItemId, sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS), fields[0].Get<uint32>(), iece->reqhonorpoints);
272 return false;
273 }
274 }
275
277 stmt->SetData(0, iece->reqhonorpoints);
278 stmt->SetData(1, guid);
279 trans->Append(stmt);
281 }
282
283 if (iece->reqarenapoints)
284 {
285 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ARENAPOINTS);
286 stmt->SetData(0, guid);
287
288 PreparedQueryResult queryResult = CharacterDatabase.Query(stmt);
289
290 if (queryResult)
291 {
292 Field* fields = queryResult->Fetch();
293 if ((fields[0].Get<uint32>() + iece->reqhonorpoints) > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS))
294 {
295 handler->SendErrorMessage(LANG_CMD_ITEM_REFUND_MAX_AP, item->Name1, item->ItemId, sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS), fields[0].Get<uint32>(), iece->reqarenapoints);
296 return false;
297 }
298 }
299
301 stmt->SetData(0, iece->reqarenapoints);
302 stmt->SetData(1, guid);
303 trans->Append(stmt);
305 }
306
308 // fill mail
309 std::string msg = "Your item " + item->Name1 + " has been removed and the used currency restored. This mail contains any items used as currency.";
310 MailDraft draft("Item Refund", msg);
311
312 uint8 count = 0;
313 bool foundItems = false;
314 for (uint32 const& reqItem : iece->reqitem)
315 {
316 if (reqItem)
317 {
318 // Skip invalid items.
319 if (!sObjectMgr->GetItemTemplate(reqItem))
320 {
321 continue;
322 }
323
324 if (Item* item = Item::CreateItem(reqItem, iece->reqitemcount[count]))
325 {
326 item->SaveToDB(trans);
327 draft.AddItem(item);
328 foundItems = true;
329 }
330 }
331
332 ++count;
333 }
334
335 if (foundItems)
336 {
337 draft.SendMailTo(trans, MailReceiver(nullptr, guid), sender);
338 }
339
340 Field* fields = result->Fetch();
341
342 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
343 stmt->SetData(0, fields[0].Get<uint32>());
344 trans->Append(stmt);
345
346 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
347 stmt->SetData(0, fields[0].Get<uint32>());
348 trans->Append(stmt);
349
350 CharacterDatabase.CommitTransaction(trans);
351 }
352 else
353 {
355 return false;
356 }
357 }
358
359 return true;
360 }
@ CHAR_DEL_ITEM_INSTANCE
Definition CharacterDatabase.h:127
@ CHAR_DEL_CHAR_INVENTORY_BY_ITEM
Definition CharacterDatabase.h:435
@ CHAR_SEL_HONORPOINTS
Definition CharacterDatabase.h:516
@ CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY_AND_OWNER
Definition CharacterDatabase.h:361
@ CHAR_UDP_CHAR_HONOR_POINTS_ACCUMULATIVE
Definition CharacterDatabase.h:426
@ CHAR_SEL_ARENAPOINTS
Definition CharacterDatabase.h:517
@ CHAR_UDP_CHAR_ARENA_POINTS_ACCUMULATIVE
Definition CharacterDatabase.h:428
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
@ CONFIG_MAX_HONOR_POINTS
Definition IWorld.h:242
@ CONFIG_MAX_ARENA_POINTS
Definition IWorld.h:245
@ LANG_CMD_ITEM_REFUND_MAX_HONOR
Definition Language.h:1129
@ LANG_CMD_ITEM_REFUNDED_HONOR
Definition Language.h:1131
@ LANG_CMD_ITEM_REFUND_MAX_AP
Definition Language.h:1132
@ LANG_CMD_ITEM_REFUND_HONOR_FAILED
Definition Language.h:1130
@ LANG_CMD_ITEM_REFUND_AP_FAILED
Definition Language.h:1133
@ LANG_CMD_ITEM_REFUND_NOT_FOUND
Definition Language.h:1135
@ LANG_CMD_ITEM_REFUNDED_AP
Definition Language.h:1134
@ LANG_CMD_ITEM_REFUND_BAD_EXTENDED_COST
Definition Language.h:1128
@ LANG_COMMAND_ITEMIDINVALID
Definition Language.h:468
@ MAIL_STATIONERY_GM
Definition Mail.h:59
@ MAIL_NORMAL
Definition Mail.h:37
#define sObjectMgr
Definition ObjectMgr.h:1650
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:211
void SendErrorMessage(uint32 entry)
Definition Chat.cpp:216
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:1082
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157
#define sWorld
Definition World.h:357
ObjectGuid GetGUID() const
Definition ChatCommandTags.h:176
Player * GetConnectedPlayer() const
Definition ChatCommandTags.h:178
Definition DBCStructure.h:1186
uint32 reqarenapoints
Definition DBCStructure.h:1189
uint32 reqitemcount[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition DBCStructure.h:1192
uint32 reqhonorpoints
Definition DBCStructure.h:1188
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
54 {
55 if (!restoreId)
56 {
57 return false;
58 }
59
61 {
63 return false;
64 }
65
66 // Check existence of item in recovery table
68 stmt->SetData(0, restoreId);
69 PreparedQueryResult fields = CharacterDatabase.Query(stmt);
70
71 if (!fields || !(*fields)[1].Get<uint32>() || (*fields)[3].Get<uint32>() != player.GetGUID().GetCounter())
72 {
74 return false;
75 }
76
77 // Mail item to player
78 uint32 itemEntry = (*fields)[1].Get<uint32>();
79 uint32 itemCount = (*fields)[2].Get<uint32>();
80
81 if (Player* onlinePlayer = player.GetConnectedPlayer())
82 {
83 onlinePlayer->SendItemRetrievalMail({ { itemEntry, itemCount } });
84 }
85
86 else
87 {
88 MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */);
89 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.");
90
91 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
92
93 // Save to prevent loss at next mail load. Item deletes on fail
94 if (Item* item = Item::CreateItem(itemEntry, itemCount, 0))
95 {
96 item->SaveToDB(trans);
97 draft.AddItem(item);
98 }
99
100 draft.SendMailTo(trans, MailReceiver(player.GetGUID().GetCounter()), sender);
101 CharacterDatabase.CommitTransaction(trans);
102 }
103
104 // Remove from recovery table
106 delStmt->SetData(0, (*fields)[0].Get<uint32>());
107 CharacterDatabase.Execute(delStmt);
108
109 std::string nameLink = handler->playerLink(player.GetName());
110 handler->PSendSysMessage(LANG_MAIL_SENT, nameLink);
111 return true;
112 }
@ CHAR_DEL_RECOVERY_ITEM_BY_RECOVERY_ID
Definition CharacterDatabase.h:512
@ CHAR_SEL_RECOVERY_ITEM
Definition CharacterDatabase.h:509
@ LANG_COMMAND_DISABLED
Definition Language.h:1126
@ LANG_ITEM_RESTORE_MISSING
Definition Language.h:235
@ LANG_MAIL_SENT
Definition Language.h:210
@ 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:171
std::string const & GetName() const
Definition ChatCommandTags.h:175

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
115 {
117 {
119 return false;
120 }
121
123 stmt->SetData(0, player.GetGUID().GetCounter());
124 PreparedQueryResult disposedItems = CharacterDatabase.Query(stmt);
125
126 if (!disposedItems)
127 {
129 return false;
130 }
131
132 do
133 {
134 Field* fields = disposedItems->Fetch();
135 uint32 id = fields[0].Get<uint32>();
136 uint32 itemId = fields[1].Get<uint32>();
137 uint32 count = fields[2].Get<uint32>();
138
139 std::string itemName = "";
140 if (ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId))
141 {
142 itemName = item->Name1;
143 }
144
145 handler->PSendSysMessage(LANG_ITEM_RESTORE_LIST, id, itemName, itemId, count);
146 } while (disposedItems->NextRow());
147
148 return true;
149 }
@ CHAR_SEL_RECOVERY_ITEM_LIST
Definition CharacterDatabase.h:510
@ LANG_ITEM_RESTORE_LIST
Definition Language.h:233
@ LANG_ITEM_RESTORE_LIST_EMPTY
Definition Language.h:234
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
172 {
173 return sWorld->getBoolConfig(CONFIG_ITEMDELETE_METHOD) || sWorld->getBoolConfig(CONFIG_ITEMDELETE_VENDOR);
174 }
@ CONFIG_ITEMDELETE_METHOD
Definition IWorld.h:157
@ CONFIG_ITEMDELETE_VENDOR
Definition IWorld.h:158

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: