TrinityCore
Loading...
Searching...
No Matches
cs_misc.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 "ScriptMgr.h"
19#include "AccountMgr.h"
20#include "ArenaTeamMgr.h"
21#include "CellImpl.h"
22#include "CharacterCache.h"
23#include "Chat.h"
24#include "DatabaseEnv.h"
25#include "DisableMgr.h"
26#include "GridNotifiers.h"
27#include "Group.h"
28#include "GroupMgr.h"
29#include "InstanceSaveMgr.h"
30#include "IpAddress.h"
31#include "IPLocation.h"
32#include "Item.h"
33#include "Language.h"
34#include "LFG.h"
35#include "Log.h"
36#include "MiscPackets.h"
37#include "MMapFactory.h"
38#include "MotionMaster.h"
39#include "MovementDefines.h"
40#include "ObjectAccessor.h"
41#include "ObjectMgr.h"
42#include "Opcodes.h"
43#include "Pet.h"
44#include "Player.h"
45#include "Realm.h"
46#include "SpellAuras.h"
47#include "SpellHistory.h"
48#include "SpellMgr.h"
49#include "Transport.h"
50#include "Weather.h"
51#include "WeatherMgr.h"
52#include "World.h"
53#include "WorldSession.h"
54
55// temporary hack until includes are sorted out (don't want to pull in Windows.h)
56#ifdef GetClassName
57#undef GetClassName
58#endif
59
60#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
61#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
62#endif
63
64using namespace Trinity::ChatCommands;
65
67{
68public:
69 misc_commandscript() : CommandScript("misc_commandscript") { }
70
72 {
73 static ChatCommandTable commandTable =
74 {
75 { "additem", HandleAddItemCommand, rbac::RBAC_PERM_COMMAND_ADDITEM, Console::No },
76 { "additem to", HandleAddItemToCommand, rbac::RBAC_PERM_COMMAND_ADDITEM, Console::No },
77 { "additem set", HandleAddItemSetCommand, rbac::RBAC_PERM_COMMAND_ADDITEMSET, Console::No },
78 { "appear", HandleAppearCommand, rbac::RBAC_PERM_COMMAND_APPEAR, Console::No },
79 { "aura", HandleAuraCommand, rbac::RBAC_PERM_COMMAND_AURA, Console::No },
80 { "bank", HandleBankCommand, rbac::RBAC_PERM_COMMAND_BANK, Console::No },
81 { "bindsight", HandleBindSightCommand, rbac::RBAC_PERM_COMMAND_BINDSIGHT, Console::No },
82 { "combatstop", HandleCombatStopCommand, rbac::RBAC_PERM_COMMAND_COMBATSTOP, Console::Yes },
83 { "cometome", HandleComeToMeCommand, rbac::RBAC_PERM_COMMAND_COMETOME, Console::No },
84 { "commands", HandleCommandsCommand, rbac::RBAC_PERM_COMMAND_COMMANDS, Console::Yes },
85 { "cooldown", HandleCooldownCommand, rbac::RBAC_PERM_COMMAND_COOLDOWN, Console::No },
86 { "damage", HandleDamageCommand, rbac::RBAC_PERM_COMMAND_DAMAGE, Console::No },
87 { "damage go", HandleDamageGoCommand, rbac::RBAC_PERM_COMMAND_DAMAGE, Console::No },
88 { "dev", HandleDevCommand, rbac::RBAC_PERM_COMMAND_DEV, Console::No },
89 { "die", HandleDieCommand, rbac::RBAC_PERM_COMMAND_DIE, Console::No },
90 { "dismount", HandleDismountCommand, rbac::RBAC_PERM_COMMAND_DISMOUNT, Console::No },
93 { "freeze", HandleFreezeCommand, rbac::RBAC_PERM_COMMAND_FREEZE, Console::No },
94 { "gps", HandleGPSCommand, rbac::RBAC_PERM_COMMAND_GPS, Console::No },
95 { "guid", HandleGUIDCommand, rbac::RBAC_PERM_COMMAND_GUID, Console::No },
96 { "help", HandleHelpCommand, rbac::RBAC_PERM_COMMAND_HELP, Console::Yes },
97 { "hidearea", HandleHideAreaCommand, rbac::RBAC_PERM_COMMAND_HIDEAREA, Console::No },
98 { "itemmove", HandleItemMoveCommand, rbac::RBAC_PERM_COMMAND_ITEMMOVE, Console::No },
100 { "linkgrave", HandleLinkGraveCommand, rbac::RBAC_PERM_COMMAND_LINKGRAVE, Console::No },
101 { "listfreeze", HandleListFreezeCommand, rbac::RBAC_PERM_COMMAND_LISTFREEZE, Console::No },
102 { "maxskill", HandleMaxSkillCommand, rbac::RBAC_PERM_COMMAND_MAXSKILL, Console::No },
103 { "movegens", HandleMovegensCommand, rbac::RBAC_PERM_COMMAND_MOVEGENS, Console::No },
104 { "mute", HandleMuteCommand, rbac::RBAC_PERM_COMMAND_MUTE, Console::Yes },
105 { "mutehistory", HandleMuteHistoryCommand, rbac::RBAC_PERM_COMMAND_MUTEHISTORY, Console::Yes },
106 { "neargrave", HandleNearGraveCommand, rbac::RBAC_PERM_COMMAND_NEARGRAVE, Console::No },
107 { "pinfo", HandlePInfoCommand, rbac::RBAC_PERM_COMMAND_PINFO, Console::Yes },
108 { "playall", HandlePlayAllCommand, rbac::RBAC_PERM_COMMAND_PLAYALL, Console::No },
109 { "possess", HandlePossessCommand, rbac::RBAC_PERM_COMMAND_POSSESS, Console::No },
110 { "pvpstats", HandlePvPstatsCommand, rbac::RBAC_PERM_COMMAND_PVPSTATS, Console::Yes },
111 { "recall", HandleRecallCommand, rbac::RBAC_PERM_COMMAND_RECALL, Console::No },
112 { "repairitems", HandleRepairitemsCommand, rbac::RBAC_PERM_COMMAND_REPAIRITEMS, Console::Yes },
113 { "respawn", HandleRespawnCommand, rbac::RBAC_PERM_COMMAND_RESPAWN, Console::No },
114 { "revive", HandleReviveCommand, rbac::RBAC_PERM_COMMAND_REVIVE, Console::Yes },
115 { "saveall", HandleSaveAllCommand, rbac::RBAC_PERM_COMMAND_SAVEALL, Console::Yes },
116 { "save", HandleSaveCommand, rbac::RBAC_PERM_COMMAND_SAVE, Console::No },
117 { "setskill", HandleSetSkillCommand, rbac::RBAC_PERM_COMMAND_SETSKILL, Console::No },
118 { "showarea", HandleShowAreaCommand, rbac::RBAC_PERM_COMMAND_SHOWAREA, Console::No },
119 { "summon", HandleSummonCommand, rbac::RBAC_PERM_COMMAND_SUMMON, Console::No },
120 { "unaura", HandleUnAuraCommand, rbac::RBAC_PERM_COMMAND_UNAURA, Console::No },
121 { "unbindsight", HandleUnbindSightCommand, rbac::RBAC_PERM_COMMAND_UNBINDSIGHT, Console::No },
122 { "unfreeze", HandleUnFreezeCommand, rbac::RBAC_PERM_COMMAND_UNFREEZE, Console::No },
123 { "unmute", HandleUnmuteCommand, rbac::RBAC_PERM_COMMAND_UNMUTE, Console::Yes },
124 { "unpossess", HandleUnPossessCommand, rbac::RBAC_PERM_COMMAND_UNPOSSESS, Console::No },
125 { "unstuck", HandleUnstuckCommand, rbac::RBAC_PERM_COMMAND_UNSTUCK, Console::Yes },
126 { "wchange", HandleChangeWeather, rbac::RBAC_PERM_COMMAND_WCHANGE, Console::No },
127 { "mailbox", HandleMailBoxCommand, rbac::RBAC_PERM_COMMAND_MAILBOX, Console::No },
128 };
129 return commandTable;
130 }
131
132 static bool HandlePvPstatsCommand(ChatHandler* handler)
133 {
135 {
137 PreparedQueryResult result = CharacterDatabase.Query(stmt);
138
139 if (result)
140 {
141 Field* fields = result->Fetch();
142 uint32 horde_victories = fields[1].GetUInt32();
143
144 if (!(result->NextRow()))
145 return false;
146
147 fields = result->Fetch();
148 uint32 alliance_victories = fields[1].GetUInt32();
149
150 handler->PSendSysMessage(LANG_PVPSTATS, alliance_victories, horde_victories);
151 }
152 else
153 return false;
154 }
155 else
157
158 return true;
159 }
160
161 static bool HandleDevCommand(ChatHandler* handler, Optional<bool> enableArg)
162 {
163 Player* player = handler->GetSession()->GetPlayer();
164
165 if (!enableArg)
166 {
168 return true;
169 }
170
171 if (*enableArg)
172 {
173 player->SetDeveloper(true);
175 }
176 else
177 {
178 player->SetDeveloper(false);
180 }
181
182 return true;
183 }
184
185 static bool HandleGPSCommand(ChatHandler* handler, char const* args)
186 {
187 WorldObject* object = nullptr;
188 if (*args)
189 {
190 HighGuid guidHigh;
191 ObjectGuid::LowType guidLow = handler->extractLowGuidFromLink((char*)args, guidHigh);
192 if (!guidLow)
193 return false;
194 switch (guidHigh)
195 {
196 case HighGuid::Player:
197 {
198 object = ObjectAccessor::FindPlayerByLowGUID(guidLow);
199 if (!object)
200 {
202 handler->SetSentErrorMessage(true);
203 }
204 break;
205 }
206 case HighGuid::Unit:
207 {
208 object = handler->GetCreatureFromPlayerMapByDbGuid(guidLow);
209 if (!object)
210 {
212 handler->SetSentErrorMessage(true);
213 }
214 break;
215 }
217 {
218 object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
219 if (!object)
220 {
222 handler->SetSentErrorMessage(true);
223 }
224 break;
225 }
226 default:
227 return false;
228 }
229 if (!object)
230 return false;
231 }
232 else
233 {
234 object = handler->getSelectedUnit();
235 if (!object)
236 {
238 handler->SetSentErrorMessage(true);
239 return false;
240 }
241 }
242
243 CellCoord cellCoord = Trinity::ComputeCellCoord(object->GetPositionX(), object->GetPositionY());
244 Cell cell(cellCoord);
245
246 uint32 zoneId, areaId;
247 object->GetZoneAndAreaId(zoneId, areaId);
248 uint32 mapId = object->GetMapId();
249
250 MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);
251 AreaTableEntry const* zoneEntry = sAreaTableStore.LookupEntry(zoneId);
252 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
253
254 float zoneX = object->GetPositionX();
255 float zoneY = object->GetPositionY();
256
257 Map2ZoneCoordinates(zoneX, zoneY, zoneId);
258
259 Map const* map = object->GetMap();
260 float groundZ = object->GetMapHeight(object->GetPositionX(), object->GetPositionY(), MAX_HEIGHT);
261 float floorZ = object->GetMapHeight(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ());
262
263 GridCoord gridCoord = Trinity::ComputeGridCoord(object->GetPositionX(), object->GetPositionY());
264
265 int gridX = (MAX_NUMBER_OF_GRIDS - 1) - gridCoord.x_coord;
266 int gridY = (MAX_NUMBER_OF_GRIDS - 1) - gridCoord.y_coord;
267
268 uint32 haveMap = Map::ExistMap(mapId, gridX, gridY) ? 1 : 0;
269 uint32 haveVMap = Map::ExistVMap(mapId, gridX, gridY) ? 1 : 0;
271
272 if (haveVMap)
273 {
274 if (object->IsOutdoors())
276 else
278 }
279 else
281
282 char const* unknown = handler->GetTrinityString(LANG_UNKNOWN);
283
285 mapId, (mapEntry ? mapEntry->MapName[handler->GetSessionDbcLocale()] : unknown),
286 zoneId, (zoneEntry ? zoneEntry->AreaName[handler->GetSessionDbcLocale()] : unknown),
287 areaId, (areaEntry ? areaEntry->AreaName[handler->GetSessionDbcLocale()] : unknown),
288 object->GetPhaseMask(),
289 object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation());
290 if (Transport* transport = object->GetTransport())
292 transport->GetGOInfo()->moTransport.mapID, object->GetTransOffsetX(), object->GetTransOffsetY(), object->GetTransOffsetZ(), object->GetTransOffsetO(),
293 transport->GetEntry(), transport->GetName().c_str());
295 cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(),
296 zoneX, zoneY, groundZ, floorZ, map->GetMinHeight(object->GetPositionX(), object->GetPositionY()), haveMap, haveVMap, haveMMap);
297
298 LiquidData liquidStatus;
299 ZLiquidStatus status = map->GetLiquidStatus(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), {}, &liquidStatus);
300 if (status)
301 handler->PSendSysMessage(LANG_LIQUID_STATUS, liquidStatus.level, liquidStatus.depth_level, liquidStatus.entry, liquidStatus.type_flags, status);
302
303 return true;
304 }
305
306 static bool HandleAuraCommand(ChatHandler* handler, SpellInfo const* spell)
307 {
308 Unit* target = handler->getSelectedUnit();
309 if (!target)
310 {
312 handler->SetSentErrorMessage(true);
313 return false;
314 }
315
316 if(!spell)
317 return false;
318
319 AuraCreateInfo createInfo(spell, MAX_EFFECT_MASK, target);
320 createInfo.SetCaster(target);
321
323
324 return true;
325 }
326
327 static bool HandleUnAuraCommand(ChatHandler* handler, Variant<SpellInfo const*, EXACT_SEQUENCE("all")> spellArg)
328 {
329 Unit* target = handler->getSelectedUnit();
330 if (!target)
331 {
333 handler->SetSentErrorMessage(true);
334 return false;
335 }
336
337 if (spellArg.holds_alternative<EXACT_SEQUENCE("all")>())
338 {
339 target->RemoveAllAuras();
340 return true;
341 }
342
343 if (SpellInfo const* spellInfo = spellArg.get<SpellInfo const*>())
344 {
345 target->RemoveAurasDueToSpell(spellInfo->Id);
346 return true;
347 }
348
349 return false;
350 }
351
352 // Teleport to Player
353 static bool HandleAppearCommand(ChatHandler* handler, char const* args)
354 {
355 Player* target;
356 ObjectGuid targetGuid;
357 std::string targetName;
358 if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
359 return false;
360
361 Player* _player = handler->GetSession()->GetPlayer();
362 if (target == _player || targetGuid == _player->GetGUID())
363 {
365 handler->SetSentErrorMessage(true);
366 return false;
367 }
368
369 if (target)
370 {
371 // check online security
372 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
373 return false;
374
375 std::string chrNameLink = handler->playerLink(targetName);
376
377 Map* map = target->GetMap();
378 if (map->IsBattlegroundOrArena())
379 {
380 // only allow if gm mode is on
381 if (!_player->IsGameMaster())
382 {
383 handler->PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, chrNameLink.c_str());
384 handler->SetSentErrorMessage(true);
385 return false;
386 }
387 }
388 else if (map->IsDungeon())
389 {
390 // we have to go to instance, and can go to player only if:
391 // 1) we are in his group (either as leader or as member)
392 // 2) we are not bound to any group and have GM mode on
393 if (_player->GetGroup())
394 {
395 // we are in group, we can go only if we are in the player group
396 if (_player->GetGroup() != target->GetGroup())
397 {
398 handler->PSendSysMessage(LANG_CANNOT_GO_TO_INST_PARTY, chrNameLink.c_str());
399 handler->SetSentErrorMessage(true);
400 return false;
401 }
402 }
403 else
404 {
405 // we are not in group, let's verify our GM mode
406 if (!_player->IsGameMaster())
407 {
408 handler->PSendSysMessage(LANG_CANNOT_GO_TO_INST_GM, chrNameLink.c_str());
409 handler->SetSentErrorMessage(true);
410 return false;
411 }
412 }
413
414 // if the player or the player's group is bound to another instance
415 // the player will not be bound to another one
416 InstancePlayerBind* bind = _player->GetBoundInstance(target->GetMapId(), target->GetDifficulty(map->IsRaid()));
417 if (!bind)
418 {
419 Group* group = _player->GetGroup();
420 // if no bind exists, create a solo bind
421 InstanceGroupBind* gBind = group ? group->GetBoundInstance(target) : nullptr; // if no bind exists, create a solo bind
422 if (!gBind)
423 if (InstanceSave* save = sInstanceSaveMgr->GetInstanceSave(target->GetInstanceId()))
424 _player->BindToInstance(save, !save->CanReset());
425 }
426
427 if (map->IsRaid())
428 _player->SetRaidDifficulty(target->GetRaidDifficulty());
429 else
430 _player->SetDungeonDifficulty(target->GetDungeonDifficulty());
431 }
432
433 handler->PSendSysMessage(LANG_APPEARING_AT, chrNameLink.c_str());
434
435 if (_player->GetBattlegroundId() && _player->GetBattlegroundId() != target->GetBattlegroundId())
436 _player->LeaveBattleground(false, true);
437
438 if (map->IsBattlegroundOrArena())
439 {
440 // all's well, set bg id
441 // when porting out from the bg, it will be reset to 0
442 _player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId());
443 // remember current position as entry point for return at bg end teleportation
444 if (!_player->GetMap()->IsBattlegroundOrArena())
445 _player->SetBattlegroundEntryPoint();
446 }
447
448 // stop flight if need
449 if (_player->IsInFlight())
450 _player->FinishTaxiFlight();
451 else
452 _player->SaveRecallPosition(); // save only in non-flight case
453
454 // to point to see at target with same orientation
455 float x, y, z;
456 target->GetClosePoint(x, y, z, _player->GetCombatReach(), 1.0f);
457
458 _player->TeleportTo(target->GetMapId(), x, y, z, _player->GetAbsoluteAngle(target), TELE_TO_GM_MODE);
459 _player->SetPhaseMask(target->GetPhaseMask(), true);
460 }
461 else
462 {
463 // check offline security
464 if (handler->HasLowerSecurity(nullptr, targetGuid))
465 return false;
466
467 std::string nameLink = handler->playerLink(targetName);
468
469 handler->PSendSysMessage(LANG_APPEARING_AT, nameLink.c_str());
470
471 // to point where player stay (if loaded)
472 float x, y, z, o;
473 uint32 map;
474 bool in_flight;
475 if (!Player::LoadPositionFromDB(map, x, y, z, o, in_flight, targetGuid))
476 return false;
477
478 if (_player->GetBattlegroundId())
479 _player->LeaveBattleground(false, true);
480
481 // stop flight if need
482 if (_player->IsInFlight())
483 _player->FinishTaxiFlight();
484 else
485 _player->SaveRecallPosition(); // save only in non-flight case
486
487 _player->TeleportTo(map, x, y, z, _player->GetOrientation());
488 }
489
490 return true;
491 }
492
493 // Summon Player
494 static bool HandleSummonCommand(ChatHandler* handler, char const* args)
495 {
496 Player* target;
497 ObjectGuid targetGuid;
498 std::string targetName;
499 if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
500 return false;
501
502 Player* _player = handler->GetSession()->GetPlayer();
503 if (target == _player || targetGuid == _player->GetGUID())
504 {
506 handler->SetSentErrorMessage(true);
507 return false;
508 }
509
510 if (target)
511 {
512 std::string nameLink = handler->playerLink(targetName);
513 // check online security
514 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
515 return false;
516
517 if (target->IsBeingTeleported())
518 {
519 handler->PSendSysMessage(LANG_IS_TELEPORTED, nameLink.c_str());
520 handler->SetSentErrorMessage(true);
521 return false;
522 }
523
524 Map* map = _player->GetMap();
525
526 if (map->IsBattlegroundOrArena())
527 {
528 // only allow if gm mode is on
529 if (!_player->IsGameMaster())
530 {
531 handler->PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, nameLink.c_str());
532 handler->SetSentErrorMessage(true);
533 return false;
534 }
535 }
536 else if (map->IsDungeon())
537 {
538 Map* targetMap = target->GetMap();
539 Player* targetGroupLeader = nullptr;
540 if (Group* targetGroup = target->GetGroup())
541 targetGroupLeader = ObjectAccessor::GetPlayer(map, targetGroup->GetLeaderGUID());
542
543 // check if far teleport is allowed
544 if (!targetGroupLeader || (targetGroupLeader->GetMapId() != map->GetId()) || (targetGroupLeader->GetInstanceId() != map->GetInstanceId()))
545 if ((targetMap->GetId() != map->GetId()) || (targetMap->GetInstanceId() != map->GetInstanceId()))
546 {
548 handler->SetSentErrorMessage(true);
549 return false;
550 }
551
552 // check if we're already in a different instance of the same map
553 if ((targetMap->GetId() == map->GetId()) && (targetMap->GetInstanceId() != map->GetInstanceId()))
554 {
555 handler->PSendSysMessage(LANG_CANNOT_SUMMON_INST_INST, nameLink.c_str());
556 handler->SetSentErrorMessage(true);
557 return false;
558 }
559 }
560
561 handler->PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), "");
562 if (handler->needReportToTarget(target))
563 ChatHandler(target->GetSession()).PSendSysMessage(LANG_SUMMONED_BY, handler->playerLink(_player->GetName()).c_str());
564
565 if (target->GetBattlegroundId() && _player->GetBattlegroundId() != target->GetBattlegroundId())
566 target->LeaveBattleground(false, true);
567
568 if (map->IsBattlegroundOrArena())
569 {
570 // all's well, set bg id
571 // when porting out from the bg, it will be reset to 0
572 target->SetBattlegroundId(_player->GetBattlegroundId(), _player->GetBattlegroundTypeId());
573 // remember current position as entry point for return at bg end teleportation
574 if (!target->GetMap()->IsBattlegroundOrArena())
576 }
577
578 // stop flight if need
579 if (_player->IsInFlight())
580 _player->FinishTaxiFlight();
581 else
582 _player->SaveRecallPosition(); // save only in non-flight case
583
584 // before GM
585 float x, y, z;
586 _player->GetClosePoint(x, y, z, target->GetCombatReach());
587 target->TeleportTo(_player->GetMapId(), x, y, z, target->GetOrientation());
588 target->SetPhaseMask(_player->GetPhaseMask(), true);
589 }
590 else
591 {
592 // check offline security
593 if (handler->HasLowerSecurity(nullptr, targetGuid))
594 return false;
595
596 std::string nameLink = handler->playerLink(targetName);
597
598 handler->PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE));
599
600 // in point where GM stay
602 _player->GetPositionX(),
603 _player->GetPositionY(),
604 _player->GetPositionZ(),
605 _player->GetOrientation()),
606 _player->GetZoneId(),
607 targetGuid, nullptr);
608 }
609
610 return true;
611 }
612
613 static bool HandleCommandsCommand(ChatHandler* handler)
614 {
616 return true;
617 }
618
619 static bool HandleDieCommand(ChatHandler* handler)
620 {
621 Unit* target = handler->getSelectedUnit();
622
623 if (!target || !handler->GetSession()->GetPlayer()->GetTarget())
624 {
626 handler->SetSentErrorMessage(true);
627 return false;
628 }
629
630 if (Player* player = target->ToPlayer())
631 if (handler->HasLowerSecurity(player, ObjectGuid::Empty, false))
632 return false;
633
634 if (target->IsAlive())
635 {
636 if (sWorld->getBoolConfig(CONFIG_DIE_COMMAND_MODE))
637 Unit::Kill(handler->GetSession()->GetPlayer(), target);
638 else
639 Unit::DealDamage(handler->GetSession()->GetPlayer(), target, target->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
640 }
641
642 return true;
643 }
644
645 static bool HandleReviveCommand(ChatHandler* handler, char const* args)
646 {
647 Player* target;
648 ObjectGuid targetGuid;
649 if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid))
650 return false;
651
652 if (target)
653 {
655 target->SpawnCorpseBones();
656 target->SaveToDB();
657 }
658 else
659 {
660 CharacterDatabaseTransaction trans(nullptr);
661 Player::OfflineResurrect(targetGuid, trans);
662 }
663
664 return true;
665 }
666
667 static bool HandleDismountCommand(ChatHandler* handler)
668 {
669 Player* player = handler->getSelectedPlayerOrSelf();
670
671 // If player is not mounted, so go out :)
672 if (!player->IsMounted())
673 {
675 handler->SetSentErrorMessage(true);
676 return false;
677 }
678
679 if (player->IsInFlight())
680 {
682 handler->SetSentErrorMessage(true);
683 return false;
684 }
685
686 player->Dismount();
688 return true;
689 }
690
691 static bool HandleGUIDCommand(ChatHandler* handler)
692 {
693 ObjectGuid guid = handler->GetSession()->GetPlayer()->GetTarget();
694
695 if (guid.IsEmpty())
696 {
698 handler->SetSentErrorMessage(true);
699 return false;
700 }
701
702 handler->PSendSysMessage(LANG_OBJECT_GUID, guid.ToString().c_str());
703 return true;
704 }
705
706 static bool HandleHelpCommand(ChatHandler* handler, Tail cmd)
707 {
709 if (cmd.empty())
711 return true;
712 }
713
714 // move item to other slot
715 static bool HandleItemMoveCommand(ChatHandler* handler, uint8 srcSlot, uint8 dstSlot)
716 {
717 if (srcSlot == dstSlot)
718 return true;
719
720 if (!handler->GetSession()->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, srcSlot, true))
721 return false;
722
723 if (!handler->GetSession()->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0, dstSlot, false))
724 return false;
725
726 uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcSlot);
727 uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstSlot);
728
729 handler->GetSession()->GetPlayer()->SwapItem(src, dst);
730
731 return true;
732 }
733
735 {
736 Unit* target = handler->getSelectedUnit();
737 if (!target)
738 {
740 handler->SetSentErrorMessage(true);
741 return false;
742 }
743
745 if (!owner)
746 {
747 owner = handler->GetSession()->GetPlayer();
748 target = owner;
749 }
750
751 std::string nameLink = handler->GetNameLink(owner);
752
753 if (!spellArg)
754 {
756 handler->PSendSysMessage(LANG_REMOVEALL_COOLDOWN, nameLink.c_str());
757 }
758 else
759 {
760 if (!*spellArg)
761 {
762 handler->PSendSysMessage(LANG_UNKNOWN_SPELL, owner == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str());
763 handler->SetSentErrorMessage(true);
764 return false;
765 }
766
767 target->GetSpellHistory()->ResetCooldown((*spellArg)->Id, true);
768 handler->PSendSysMessage(LANG_REMOVE_COOLDOWN, (*spellArg)->Id, owner == handler->GetSession()->GetPlayer() ? handler->GetTrinityString(LANG_YOU) : nameLink.c_str());
769 }
770 return true;
771 }
772
773 static bool HandleGetDistanceCommand(ChatHandler* handler, char const* args)
774 {
775 WorldObject* object = nullptr;
776 if (*args)
777 {
778 HighGuid guidHigh;
779 ObjectGuid::LowType guidLow = handler->extractLowGuidFromLink((char*)args, guidHigh);
780 if (!guidLow)
781 return false;
782 switch (guidHigh)
783 {
784 case HighGuid::Player:
785 {
786 object = ObjectAccessor::FindPlayerByLowGUID(guidLow);
787 if (!object)
788 {
790 handler->SetSentErrorMessage(true);
791 }
792 break;
793 }
794 case HighGuid::Unit:
795 {
796 object = handler->GetCreatureFromPlayerMapByDbGuid(guidLow);
797 if (!object)
798 {
800 handler->SetSentErrorMessage(true);
801 }
802 break;
803 }
805 {
806 object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
807 if (!object)
808 {
810 handler->SetSentErrorMessage(true);
811 }
812 break;
813 }
814 default:
815 return false;
816 }
817 if (!object)
818 return false;
819 }
820 else
821 {
822 object = handler->getSelectedUnit();
823 if (!object)
824 {
826 handler->SetSentErrorMessage(true);
827 return false;
828 }
829 }
830
831 handler->PSendSysMessage(LANG_DISTANCE, handler->GetSession()->GetPlayer()->GetDistance(object), handler->GetSession()->GetPlayer()->GetDistance2d(object), handler->GetSession()->GetPlayer()->GetExactDist(object), handler->GetSession()->GetPlayer()->GetExactDist2d(object));
832 return true;
833 }
834
835 // Teleport player to last position
836 static bool HandleRecallCommand(ChatHandler* handler, char const* args)
837 {
838 Player* target;
839 if (!handler->extractPlayerTarget((char*)args, &target))
840 return false;
841
842 // check online security
843 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
844 return false;
845
846 if (target->IsBeingTeleported())
847 {
848 handler->PSendSysMessage(LANG_IS_TELEPORTED, handler->GetNameLink(target).c_str());
849 handler->SetSentErrorMessage(true);
850 return false;
851 }
852
853 target->FinishTaxiFlight();
854
855 target->Recall();
856 return true;
857 }
858
859 static bool HandleSaveCommand(ChatHandler* handler)
860 {
861 Player* player = handler->GetSession()->GetPlayer();
862
863 // save GM account without delay and output message
865 {
866 if (Player* target = handler->getSelectedPlayer())
867 target->SaveToDB();
868 else
869 player->SaveToDB();
871 return true;
872 }
873
874 // save if the player has last been saved over 20 seconds ago
875 uint32 saveInterval = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
876 if (saveInterval == 0 || (saveInterval > 20 * IN_MILLISECONDS && player->GetSaveTimer() <= saveInterval - 20 * IN_MILLISECONDS))
877 player->SaveToDB();
878
879 return true;
880 }
881
882 // Save all players in the world
883 static bool HandleSaveAllCommand(ChatHandler* handler)
884 {
887 return true;
888 }
889
890 // kick player
891 static bool HandleKickPlayerCommand(ChatHandler* handler, char const* args)
892 {
893 Player* target = nullptr;
894 std::string playerName;
895 if (!handler->extractPlayerTarget((char*)args, &target, nullptr, &playerName))
896 return false;
897
898 if (handler->GetSession() && target == handler->GetSession()->GetPlayer())
899 {
901 handler->SetSentErrorMessage(true);
902 return false;
903 }
904
905 // check online security
906 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
907 return false;
908
909 std::string kickReasonStr = handler->GetTrinityString(LANG_NO_REASON);
910 if (*args != '\0')
911 {
912 char const* kickReason = strtok(nullptr, "\r");
913 if (kickReason != nullptr)
914 kickReasonStr = kickReason;
915 }
916
917 if (sWorld->getBoolConfig(CONFIG_SHOW_KICK_IN_WORLD))
918 sWorld->SendWorldText(LANG_COMMAND_KICKMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), playerName.c_str(), kickReasonStr.c_str());
919 else
920 handler->PSendSysMessage(LANG_COMMAND_KICKMESSAGE, playerName.c_str());
921
922 target->GetSession()->KickPlayer("HandleKickPlayerCommand GM Command");
923
924 return true;
925 }
926
927 static bool HandleUnstuckCommand(ChatHandler* handler, char const* args)
928 {
929 // No args required for players
931 {
932 // 7355: "Stuck"
933 if (Player* player = handler->GetSession()->GetPlayer())
934 player->CastSpell(player, 7355, false);
935 return true;
936 }
937
938 if (!*args)
939 return false;
940
941 char* player_str = strtok((char*)args, " ");
942 if (!player_str)
943 return false;
944
945 std::string location_str = "inn";
946 if (char const* loc = strtok(nullptr, " "))
947 location_str = loc;
948
949 Player* player = nullptr;
950 if (!handler->extractPlayerTarget(player_str, &player))
951 return false;
952
953 if (player->IsInFlight() || player->IsInCombat())
954 {
955 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(7355);
956 if (!spellInfo)
957 return false;
958
959 if (Player* caster = handler->GetSession()->GetPlayer())
961
962 return false;
963 }
964
965 if (location_str == "inn")
966 {
967 player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->GetOrientation());
968 return true;
969 }
970
971 if (location_str == "graveyard")
972 {
973 player->RepopAtGraveyard();
974 return true;
975 }
976
977 if (location_str == "startzone")
978 {
979 player->TeleportTo(player->GetStartPosition());
980 return true;
981 }
982
983 //Not a supported argument
984 return false;
985
986 }
987
988 static bool HandleLinkGraveCommand(ChatHandler* handler, uint32 graveyardId, Optional<std::string> teamArg)
989 {
990 uint32 team;
991
992 if (!teamArg)
993 team = 0;
994 else if (StringEqualI(*teamArg, "horde"))
995 team = HORDE;
996 else if (StringEqualI(*teamArg, "alliance"))
997 team = ALLIANCE;
998 else
999 return false;
1000
1001 WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(graveyardId);
1002
1003 if (!graveyard)
1004 {
1005 handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNOEXIST, graveyardId);
1006 handler->SetSentErrorMessage(true);
1007 return false;
1008 }
1009
1010 Player* player = handler->GetSession()->GetPlayer();
1011
1012 uint32 zoneId = player->GetZoneId();
1013
1014 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(zoneId);
1015 if (!areaEntry || areaEntry->ParentAreaID !=0)
1016 {
1017 handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, graveyardId, zoneId);
1018 handler->SetSentErrorMessage(true);
1019 return false;
1020 }
1021
1022 if (sObjectMgr->AddGraveyardLink(graveyardId, zoneId, team))
1023 handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDLINKED, graveyardId, zoneId);
1024 else
1025 handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDALRLINKED, graveyardId, zoneId);
1026
1027 return true;
1028 }
1029
1031 {
1032 uint32 team;
1033
1034 if (!teamArg)
1035 team = 0;
1036 else if (StringEqualI(*teamArg, "horde"))
1037 team = HORDE;
1038 else if (StringEqualI(*teamArg, "alliance"))
1039 team = ALLIANCE;
1040 else
1041 return false;
1042
1043 Player* player = handler->GetSession()->GetPlayer();
1044 uint32 zone_id = player->GetZoneId();
1045
1046 WorldSafeLocsEntry const* graveyard = sObjectMgr->GetClosestGraveyard(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), team, nullptr);
1047 if (graveyard)
1048 {
1049 uint32 graveyardId = graveyard->ID;
1050
1051 GraveyardData const* data = sObjectMgr->FindGraveyardData(graveyardId, zone_id);
1052 if (!data)
1053 {
1054 handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDERROR, graveyardId);
1055 handler->SetSentErrorMessage(true);
1056 return false;
1057 }
1058
1059 team = data->team;
1060
1061 std::string team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_NOTEAM);
1062
1063 if (team == 0)
1064 team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_ANY);
1065 else if (team == HORDE)
1066 team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE);
1067 else if (team == ALLIANCE)
1069
1070 handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNEAREST, graveyardId, team_name.c_str(), zone_id);
1071 }
1072 else
1073 {
1074 std::string team_name;
1075
1076 if (team == HORDE)
1077 team_name = handler->GetTrinityString(LANG_COMMAND_GRAVEYARD_HORDE);
1078 else if (team == ALLIANCE)
1080
1081 if (!team)
1083 else
1084 handler->PSendSysMessage(LANG_COMMAND_ZONENOGRAFACTION, zone_id, team_name.c_str());
1085 }
1086
1087 return true;
1088 }
1089
1090 static bool HandleShowAreaCommand(ChatHandler* handler, uint32 areaId)
1091 {
1092 Player* playerTarget = handler->getSelectedPlayer();
1093 if (!playerTarget)
1094 {
1096 handler->SetSentErrorMessage(true);
1097 return false;
1098 }
1099
1100 AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId);
1101 if (!area)
1102 {
1104 handler->SetSentErrorMessage(true);
1105 return false;
1106 }
1107
1108 int32 offset = area->AreaBit / 32;
1109 if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
1110 {
1112 handler->SetSentErrorMessage(true);
1113 return false;
1114 }
1115
1116 uint32 val = uint32((1 << (area->AreaBit % 32)));
1117 uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
1118 playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields | val)));
1119
1121 return true;
1122 }
1123
1124 static bool HandleHideAreaCommand(ChatHandler* handler, uint32 areaId)
1125 {
1126 Player* playerTarget = handler->getSelectedPlayer();
1127 if (!playerTarget)
1128 {
1130 handler->SetSentErrorMessage(true);
1131 return false;
1132 }
1133
1134 AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId);
1135 if (!area)
1136 {
1138 handler->SetSentErrorMessage(true);
1139 return false;
1140 }
1141
1142 int32 offset = area->AreaBit / 32;
1143 if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
1144 {
1146 handler->SetSentErrorMessage(true);
1147 return false;
1148 }
1149
1150 uint32 val = uint32((1 << (area->AreaBit % 32)));
1151 uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
1152 playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields ^ val)));
1153
1155 return true;
1156 }
1157
1158 static bool HandleAddItemCommand(ChatHandler* handler, char const* args)
1159 {
1160 if (!*args)
1161 return false;
1162
1163 uint32 itemId = 0;
1164
1165 if (args[0] == '[') // [name] manual form
1166 {
1167 char const* itemNameStr = strtok((char*)args, "]");
1168
1169 if (itemNameStr && itemNameStr[0])
1170 {
1171 std::string itemName = itemNameStr+1;
1172 WorldDatabase.EscapeString(itemName);
1173
1175 stmt->setString(0, itemName);
1176 PreparedQueryResult result = WorldDatabase.Query(stmt);
1177
1178 if (!result)
1179 {
1180 stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_ITEM_TEMPLATE_LOCALE_BY_NAME);
1181 stmt->setString(0, itemName);
1182 result = WorldDatabase.Query(stmt);
1183 }
1184
1185 if (!result)
1186 {
1187 handler->PSendSysMessage(LANG_COMMAND_COULDNOTFIND, itemNameStr+1);
1188 handler->SetSentErrorMessage(true);
1189 return false;
1190 }
1191 itemId = result->Fetch()->GetUInt32();
1192 }
1193 else
1194 return false;
1195 }
1196 else // item_id or [name] Shift-click form |color|Hitem:item_id:0:0:0|h[name]|h|r
1197 {
1198 char const* id = handler->extractKeyFromLink((char*)args, "Hitem");
1199 if (!id)
1200 return false;
1201
1202 itemId = Trinity::StringTo<uint32>(id).value_or(0);
1203 }
1204
1205 char const* ccount = strtok(nullptr, " ");
1206
1207 int32 count = 1;
1208
1209 if (ccount)
1210 count = strtol(ccount, nullptr, 10);
1211
1212 if (count == 0)
1213 count = 1;
1214
1215 Player* player = handler->GetSession()->GetPlayer();
1216 Player* playerTarget = handler->getSelectedPlayer();
1217 if (!playerTarget)
1218 playerTarget = player;
1219
1220 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId);
1221 if (!itemTemplate)
1222 {
1224 handler->SetSentErrorMessage(true);
1225 return false;
1226 }
1227
1228 // Subtract
1229 if (count < 0)
1230 {
1231 uint32 destroyedItemCount = playerTarget->DestroyItemCount(itemId, -count, true, false);
1232
1233 if (destroyedItemCount > 0)
1234 {
1235 // output the amount of items successfully destroyed
1236 handler->PSendSysMessage(LANG_REMOVEITEM, itemId, destroyedItemCount, handler->GetNameLink(playerTarget).c_str());
1237
1238 // check to see if we were unable to destroy all of the amount requested.
1239 uint32 unableToDestroyItemCount = -count - destroyedItemCount;
1240 if (unableToDestroyItemCount > 0)
1241 {
1242 // output message for the amount of items we couldn't destroy
1243 handler->PSendSysMessage(LANG_REMOVEITEM_FAILURE, itemId, unableToDestroyItemCount, handler->GetNameLink(playerTarget).c_str());
1244 }
1245 }
1246 else
1247 {
1248 // failed to destroy items of the amount requested
1249 handler->PSendSysMessage(LANG_REMOVEITEM_FAILURE, itemId, -count, handler->GetNameLink(playerTarget).c_str());
1250 }
1251
1252 return true;
1253 }
1254
1255 // Adding items
1256 uint32 noSpaceForCount = 0;
1257
1258 // check space and find places
1259 ItemPosCountVec dest;
1260 InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount);
1261 if (msg != EQUIP_ERR_OK) // convert to possible store amount
1262 count -= noSpaceForCount;
1263
1264 if (count == 0 || dest.empty()) // can't add any
1265 {
1266 handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount);
1267 handler->SetSentErrorMessage(true);
1268 return false;
1269 }
1270
1271 Item* item = playerTarget->StoreNewItem(dest, itemId, true, GenerateItemRandomPropertyId(itemId));
1272
1273 // remove binding (let GM give it to another player later)
1274 if (player == playerTarget)
1275 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
1276 if (Item* item1 = player->GetItemByPos(itr->pos))
1277 item1->SetBinding(false);
1278
1279 if (count > 0 && item)
1280 {
1281 player->SendNewItem(item, count, false, true);
1282 handler->PSendSysMessage(LANG_ADDITEM, itemId, count, handler->GetNameLink(playerTarget).c_str());
1283 if (player != playerTarget)
1284 playerTarget->SendNewItem(item, count, true, false);
1285 }
1286
1287 if (noSpaceForCount > 0)
1288 handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount);
1289
1290 return true;
1291 }
1292
1293 static bool HandleAddItemToCommand(ChatHandler* handler, char const* args)
1294 {
1295 if (!*args)
1296 return false;
1297
1298 Player* player = handler->GetSession()->GetPlayer();
1299 Player* playerTarget = nullptr;
1300 if (!handler->extractPlayerTarget((char*)args, &playerTarget))
1301 {
1302 handler->SetSentErrorMessage(true);
1303 return false;
1304 }
1305
1306 char* tailArgs = strtok(nullptr, "");
1307 if (!tailArgs)
1308 return false;
1309
1310 uint32 itemId = 0;
1311
1312 if (tailArgs[0] == '[') // [name] manual form
1313 {
1314 char const* itemNameStr = strtok(tailArgs, "]");
1315
1316 if (itemNameStr && itemNameStr[0])
1317 {
1318 std::string itemName = itemNameStr + 1;
1319 WorldDatabase.EscapeString(itemName);
1320
1322 stmt->setString(0, itemName);
1323 PreparedQueryResult result = WorldDatabase.Query(stmt);
1324
1325 if (!result)
1326 {
1327 stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_ITEM_TEMPLATE_LOCALE_BY_NAME);
1328 stmt->setString(0, itemName);
1329 result = WorldDatabase.Query(stmt);
1330 }
1331
1332 if (!result)
1333 {
1334 handler->PSendSysMessage(LANG_COMMAND_COULDNOTFIND, itemNameStr + 1);
1335 handler->SetSentErrorMessage(true);
1336 return false;
1337 }
1338 itemId = result->Fetch()->GetUInt32();
1339 }
1340 else
1341 return false;
1342 }
1343 else // item_id or [name] Shift-click form |color|Hitem:item_id:0:0:0|h[name]|h|r
1344 {
1345 char const* id = handler->extractKeyFromLink(tailArgs, "Hitem");
1346 if (!id)
1347 return false;
1348
1349 itemId = Trinity::StringTo<uint32>(id).value_or(0);
1350 }
1351
1352 char const* ccount = strtok(nullptr, " ");
1353
1354 int32 count = 1;
1355
1356 if (ccount)
1357 count = strtol(ccount, nullptr, 10);
1358
1359 if (count == 0)
1360 count = 1;
1361
1362 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId);
1363 if (!itemTemplate)
1364 {
1366 handler->SetSentErrorMessage(true);
1367 return false;
1368 }
1369
1370 // Subtract
1371 if (count < 0)
1372 {
1373 uint32 destroyedItemCount = playerTarget->DestroyItemCount(itemId, -count, true, false);
1374
1375 if (destroyedItemCount > 0)
1376 {
1377 // output the amount of items successfully destroyed
1378 handler->PSendSysMessage(LANG_REMOVEITEM, itemId, destroyedItemCount, handler->GetNameLink(playerTarget).c_str());
1379
1380 // check to see if we were unable to destroy all of the amount requested.
1381 uint32 unableToDestroyItemCount = -count - destroyedItemCount;
1382 if (unableToDestroyItemCount > 0)
1383 {
1384 // output message for the amount of items we couldn't destroy
1385 handler->PSendSysMessage(LANG_REMOVEITEM_FAILURE, itemId, unableToDestroyItemCount, handler->GetNameLink(playerTarget).c_str());
1386 }
1387 }
1388 else
1389 {
1390 // failed to destroy items of the amount requested
1391 handler->PSendSysMessage(LANG_REMOVEITEM_FAILURE, itemId, -count, handler->GetNameLink(playerTarget).c_str());
1392 }
1393
1394 return true;
1395 }
1396
1397 // Adding items
1398 uint32 noSpaceForCount = 0;
1399
1400 // check space and find places
1401 ItemPosCountVec dest;
1402 InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount);
1403 if (msg != EQUIP_ERR_OK) // convert to possible store amount
1404 count -= noSpaceForCount;
1405
1406 if (count == 0 || dest.empty()) // can't add any
1407 {
1408 handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount);
1409 handler->SetSentErrorMessage(true);
1410 return false;
1411 }
1412
1413 Item* item = playerTarget->StoreNewItem(dest, itemId, true, GenerateItemRandomPropertyId(itemId));
1414
1415 // remove binding (let GM give it to another player later)
1416 if (player == playerTarget)
1417 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
1418 if (Item* item1 = player->GetItemByPos(itr->pos))
1419 item1->SetBinding(false);
1420
1421 if (count > 0 && item)
1422 {
1423 player->SendNewItem(item, count, false, true);
1424 if (player != playerTarget)
1425 playerTarget->SendNewItem(item, count, true, false);
1426 }
1427
1428 if (noSpaceForCount > 0)
1429 handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount);
1430
1431 return true;
1432 }
1433
1435 {
1436 // prevent generation all items with itemset field value '0'
1437 if (*itemSetId == 0)
1438 {
1440 handler->SetSentErrorMessage(true);
1441 return false;
1442 }
1443
1444 Player* player = handler->GetSession()->GetPlayer();
1445 Player* playerTarget = handler->getSelectedPlayer();
1446 if (!playerTarget)
1447 playerTarget = player;
1448
1449 bool found = false;
1450 ItemTemplateContainer const& its = sObjectMgr->GetItemTemplateStore();
1451 for (auto const& itemTemplatePair : its)
1452 {
1453 if (itemTemplatePair.second.ItemSet != *itemSetId)
1454 continue;
1455
1456 found = true;
1457 ItemPosCountVec dest;
1458 InventoryResult msg = playerTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemTemplatePair.first, 1);
1459 if (msg == EQUIP_ERR_OK)
1460 {
1461 Item* item = playerTarget->StoreNewItem(dest, itemTemplatePair.first, true);
1462
1463 // remove binding (let GM give it to another player later)
1464 if (player == playerTarget)
1465 item->SetBinding(false);
1466
1467 player->SendNewItem(item, 1, false, true);
1468 if (player != playerTarget)
1469 playerTarget->SendNewItem(item, 1, true, false);
1470 }
1471 else
1472 {
1473 player->SendEquipError(msg, nullptr, nullptr, itemTemplatePair.first);
1474 handler->PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemTemplatePair.first, 1);
1475 }
1476 }
1477
1478 if (!found)
1479 {
1481 handler->SetSentErrorMessage(true);
1482 return false;
1483 }
1484
1485 return true;
1486 }
1487
1488 static bool HandleBankCommand(ChatHandler* handler)
1489 {
1490 handler->GetSession()->SendShowBank(handler->GetSession()->GetPlayer()->GetGUID());
1491 return true;
1492 }
1493
1494 static bool HandleChangeWeather(ChatHandler* handler, WeatherType type, float intensity)
1495 {
1496 // Weather is OFF
1497 if (!sWorld->getBoolConfig(CONFIG_WEATHER))
1498 {
1500 handler->SetSentErrorMessage(true);
1501 return false;
1502 }
1503
1504 Player* player = handler->GetSession()->GetPlayer();
1505 uint32 zoneid = player->GetZoneId();
1506
1507 Weather* weather = player->GetMap()->GetOrGenerateZoneDefaultWeather(zoneid);
1508 if (!weather)
1509 {
1511 handler->SetSentErrorMessage(true);
1512 return false;
1513 }
1514
1515 weather->SetWeather(type, intensity);
1516
1517 return true;
1518 }
1519
1521 {
1522 Player* player = handler->getSelectedPlayerOrSelf();
1523 if (!player)
1524 {
1526 handler->SetSentErrorMessage(true);
1527 return false;
1528 }
1529
1530 // each skills that have max skill value dependent from level seted to current level max skill value
1532 return true;
1533 }
1534
1535 static bool HandleSetSkillCommand(ChatHandler* handler, Variant<Hyperlink<skill>, uint32> skillId, uint32 level, Optional<uint32> maxSkillArg)
1536 {
1537 Player* target = handler->getSelectedPlayerOrSelf();
1538 if (!target)
1539 {
1541 handler->SetSentErrorMessage(true);
1542 return false;
1543 }
1544
1545 SkillLineEntry const* skillLine = sSkillLineStore.LookupEntry(skillId);
1546 if (!skillLine)
1547 {
1548 handler->PSendSysMessage(LANG_INVALID_SKILL_ID, *skillId);
1549 handler->SetSentErrorMessage(true);
1550 return false;
1551 }
1552
1553 bool targetHasSkill = target->GetSkillValue(skillId) != 0;
1554
1555 // If our target does not yet have the skill they are trying to add to them, the chosen level also becomes
1556 // the max level of the new profession.
1557 uint16 max = maxSkillArg.value_or(targetHasSkill ? target->GetPureMaxSkillValue(skillId) : level);
1558
1559 if (level <= 0 || level > max)
1560 return false;
1561
1562 // If the player has the skill, we get the current skill step. If they don't have the skill, we
1563 // add the skill to the player's book with step 1 (which is the first rank, in most cases something
1564 // like 'Apprentice <skill>'.
1565 target->SetSkill(skillId, targetHasSkill ? target->GetSkillStep(skillId) : 1, level, max);
1566 handler->PSendSysMessage(LANG_SET_SKILL, *skillId, skillLine->DisplayName[handler->GetSessionDbcLocale()], handler->GetNameLink(target).c_str(), level, max);
1567 return true;
1568 }
1569
1588 {
1589 if (!arg)
1591
1592 if (!arg)
1593 return false;
1594
1595 // Define ALL the player variables!
1596 Player* target = arg->GetConnectedPlayer();
1597 ObjectGuid targetGuid = arg->GetGUID();
1598 std::string targetName = arg->GetName();
1599 CharacterDatabasePreparedStatement* stmt = nullptr;
1600
1601 /* The variables we extract for the command. They are
1602 * default as "does not exist" to prevent problems
1603 * The output is printed in the follow manner:
1604 *
1605 * Player %s %s (guid: %u) - I. LANG_PINFO_PLAYER
1606 * ** GM Mode active, Phase: -1 - II. LANG_PINFO_GM_ACTIVE (if GM)
1607 * ** Banned: (Type, Reason, Time, By) - III. LANG_PINFO_BANNED (if banned)
1608 * ** Muted: (Reason, Time, By) - IV. LANG_PINFO_MUTED (if muted)
1609 * * Account: %s (id: %u), GM Level: %u - V. LANG_PINFO_ACC_ACCOUNT
1610 * * Last Login: %u (Failed Logins: %u) - VI. LANG_PINFO_ACC_LASTLOGIN
1611 * * Uses OS: %s - Latency: %u ms - VII. LANG_PINFO_ACC_OS
1612 * * Registration Email: %s - Email: %s - VIII. LANG_PINFO_ACC_REGMAILS
1613 * * Last IP: %u (Locked: %s) - IX. LANG_PINFO_ACC_IP
1614 * * Level: %u (%u/%u XP (%u XP left) - X. LANG_PINFO_CHR_LEVEL
1615 * * Race: %s %s, Class %s - XI. LANG_PINFO_CHR_RACE
1616 * * Alive ?: %s - XII. LANG_PINFO_CHR_ALIVE
1617 * * Phase: %s - XIII. LANG_PINFO_CHR_PHASE (if not GM)
1618 * * Money: %ug%us%uc - XIV. LANG_PINFO_CHR_MONEY
1619 * * Map: %s, Area: %s - XV. LANG_PINFO_CHR_MAP
1620 * * Guild: %s (Id: %u) - XVI. LANG_PINFO_CHR_GUILD (if in guild)
1621 * ** Rank: %s - XVII. LANG_PINFO_CHR_GUILD_RANK (if in guild)
1622 * ** Note: %s - XVIII.LANG_PINFO_CHR_GUILD_NOTE (if in guild and has note)
1623 * ** O. Note: %s - XVIX. LANG_PINFO_CHR_GUILD_ONOTE (if in guild and has officer note)
1624 * * Played time: %s - XX. LANG_PINFO_CHR_PLAYEDTIME
1625 * * Mails: %u Read/%u Total - XXI. LANG_PINFO_CHR_MAILS (if has mails)
1626 *
1627 * Not all of them can be moved to the top. These should
1628 * place the most important ones to the head, though.
1629 *
1630 * For a cleaner overview, I segment each output in Roman numerals
1631 */
1632
1633 // Account data print variables
1634 std::string userName = handler->GetTrinityString(LANG_ERROR);
1635 uint32 accId = 0;
1636 ObjectGuid::LowType lowguid = targetGuid.GetCounter();
1637 std::string eMail = handler->GetTrinityString(LANG_ERROR);
1638 std::string regMail = handler->GetTrinityString(LANG_ERROR);
1639 uint32 security = 0;
1640 std::string lastIp = handler->GetTrinityString(LANG_ERROR);
1641 uint8 locked = 0;
1642 std::string lastLogin = handler->GetTrinityString(LANG_ERROR);
1643 uint32 failedLogins = 0;
1644 uint32 latency = 0;
1645 std::string OS = handler->GetTrinityString(LANG_UNKNOWN);
1646
1647 // Mute data print variables
1648 int64 muteTime = -1;
1649 std::string muteReason = handler->GetTrinityString(LANG_NO_REASON);
1650 std::string muteBy = handler->GetTrinityString(LANG_UNKNOWN);
1651
1652 // Ban data print variables
1653 int64 banTime = -1;
1654 std::string banType = handler->GetTrinityString(LANG_UNKNOWN);
1655 std::string banReason = handler->GetTrinityString(LANG_NO_REASON);
1656 std::string bannedBy = handler->GetTrinityString(LANG_UNKNOWN);
1657
1658 // Character data print variables
1659 uint8 raceid, classid = 0; //RACE_NONE, CLASS_NONE
1660 std::string raceStr, classStr = handler->GetTrinityString(LANG_UNKNOWN);
1661 uint8 gender = 0;
1662 int8 locale = handler->GetSessionDbcLocale();
1663 uint32 totalPlayerTime = 0;
1664 uint8 level = 0;
1665 std::string alive = handler->GetTrinityString(LANG_ERROR);
1666 uint32 money = 0;
1667 uint32 xp = 0;
1668 uint32 xptotal = 0;
1669
1670 // Position data print
1671 uint32 mapId;
1672 uint32 areaId;
1673 uint32 phase = 0;
1674 char const* areaName = nullptr;
1675 char const* zoneName = nullptr;
1676
1677 // Guild data print variables defined so that they exist, but are not necessarily used
1678 ObjectGuid::LowType guildId = 0;
1679 uint8 guildRankId = 0;
1680 std::string guildName;
1681 std::string guildRank;
1682 std::string note;
1683 std::string officeNote;
1684
1685 // Mail data print is only defined if you have a mail
1686
1687 if (target)
1688 {
1689 // check online security
1690 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
1691 return false;
1692
1693 accId = target->GetSession()->GetAccountId();
1694 money = target->GetMoney();
1695 totalPlayerTime = target->GetTotalPlayedTime();
1696 level = target->GetLevel();
1697 latency = target->GetSession()->GetLatency();
1698 raceid = target->GetRace();
1699 classid = target->GetClass();
1700 muteTime = target->GetSession()->m_muteTime;
1701 mapId = target->GetMapId();
1702 areaId = target->GetAreaId();
1703 alive = target->IsAlive() ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO);
1704 gender = target->GetNativeGender();
1705 phase = target->GetPhaseMask();
1706 }
1707 // get additional information from DB
1708 else
1709 {
1710 // check offline security
1711 if (handler->HasLowerSecurity(nullptr, targetGuid))
1712 return false;
1713
1714 // Query informations from the DB
1715 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PINFO);
1716 stmt->setUInt32(0, lowguid);
1717 PreparedQueryResult result = CharacterDatabase.Query(stmt);
1718
1719 if (!result)
1720 return false;
1721
1722 Field* fields = result->Fetch();
1723 totalPlayerTime = fields[0].GetUInt32();
1724 level = fields[1].GetUInt8();
1725 money = fields[2].GetUInt32();
1726 accId = fields[3].GetUInt32();
1727 raceid = fields[4].GetUInt8();
1728 classid = fields[5].GetUInt8();
1729 mapId = fields[6].GetUInt16();
1730 areaId = fields[7].GetUInt16();
1731 gender = fields[8].GetUInt8();
1732 uint32 health = fields[9].GetUInt32();
1733 uint32 playerFlags = fields[10].GetUInt32();
1734
1735 if (!health || playerFlags & PLAYER_FLAGS_GHOST)
1736 alive = handler->GetTrinityString(LANG_NO);
1737 else
1738 alive = handler->GetTrinityString(LANG_YES);
1739 }
1740
1741 // Query the prepared statement for login data
1742 LoginDatabasePreparedStatement* stmt2 = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO);
1743 stmt2->setInt32(0, int32(realm.Id.Realm));
1744 stmt2->setUInt32(1, accId);
1745 PreparedQueryResult result = LoginDatabase.Query(stmt2);
1746
1747 if (result)
1748 {
1749 Field* fields = result->Fetch();
1750 userName = fields[0].GetString();
1751 security = fields[1].GetUInt8();
1752
1753 // Only fetch these fields if commander has sufficient rights)
1754 if (handler->HasPermission(rbac::RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA) && // RBAC Perm. 48, Role 39
1755 (!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security)))
1756 {
1757 eMail = fields[2].GetString();
1758 regMail = fields[3].GetString();
1759 lastIp = fields[4].GetString();
1760 lastLogin = fields[5].GetString();
1761
1762 if (IpLocationRecord const* location = sIPLocation->GetLocationRecord(lastIp))
1763 {
1764 lastIp.append(" (");
1765 lastIp.append(location->CountryName);
1766 lastIp.append(")");
1767 }
1768 }
1769 else
1770 {
1771 eMail = handler->GetTrinityString(LANG_UNAUTHORIZED);
1772 regMail = handler->GetTrinityString(LANG_UNAUTHORIZED);
1773 lastIp = handler->GetTrinityString(LANG_UNAUTHORIZED);
1774 lastLogin = handler->GetTrinityString(LANG_UNAUTHORIZED);
1775 }
1776 muteTime = fields[6].GetUInt64();
1777 muteReason = fields[7].GetString();
1778 muteBy = fields[8].GetString();
1779 failedLogins = fields[9].GetUInt32();
1780 locked = fields[10].GetUInt8();
1781 OS = fields[11].GetString();
1782 }
1783
1784 // Creates a chat link to the character. Returns nameLink
1785 std::string nameLink = handler->playerLink(targetName);
1786
1787 // Returns banType, banTime, bannedBy, banreason
1788 stmt2 = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO_BANS);
1789 stmt2->setUInt32(0, accId);
1790 PreparedQueryResult result2 = LoginDatabase.Query(stmt2);
1791 if (!result2)
1792 {
1793 banType = handler->GetTrinityString(LANG_CHARACTER);
1794 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_BANS);
1795 stmt->setUInt32(0, lowguid);
1796 result2 = CharacterDatabase.Query(stmt);
1797 }
1798 else
1799 banType = handler->GetTrinityString(LANG_ACCOUNT);
1800
1801 if (result2)
1802 {
1803 Field* fields = result2->Fetch();
1804 bool permanent = fields[1].GetUInt64() != 0;
1805 banTime = !permanent ? int64(fields[0].GetUInt32()) : 0;
1806 bannedBy = fields[2].GetString();
1807 banReason = fields[3].GetString();
1808 }
1809
1810 // Can be used to query data from Characters database
1811 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_XP);
1812 stmt->setUInt32(0, lowguid);
1813 PreparedQueryResult result4 = CharacterDatabase.Query(stmt);
1814
1815 if (result4)
1816 {
1817 Field* fields = result4->Fetch();
1818 xp = fields[0].GetUInt32(); // Used for "current xp" output and "%u XP Left" calculation
1819 ObjectGuid::LowType gguid = fields[1].GetUInt32(); // We check if have a guild for the person, so we might not require to query it at all
1820 xptotal = sObjectMgr->GetXPForLevel(level);
1821
1822 if (gguid)
1823 {
1824 // Guild Data - an own query, because it may not happen.
1825 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED);
1826 stmt->setUInt32(0, lowguid);
1827 PreparedQueryResult result5 = CharacterDatabase.Query(stmt);
1828 if (result5)
1829 {
1830 Field* fields5 = result5->Fetch();
1831 guildId = fields5[0].GetUInt32();
1832 guildName = fields5[1].GetString();
1833 guildRank = fields5[2].GetString();
1834 guildRankId = fields5[3].GetUInt8();
1835 note = fields5[4].GetString();
1836 officeNote = fields5[5].GetString();
1837 }
1838 }
1839 }
1840
1841 // Initiate output
1842 // Output I. LANG_PINFO_PLAYER
1843 handler->PSendSysMessage(LANG_PINFO_PLAYER, target ? "" : handler->GetTrinityString(LANG_OFFLINE), nameLink.c_str(), targetGuid.ToString().c_str());
1844
1845 // Output II. LANG_PINFO_GM_ACTIVE if character is gamemaster
1846 if (target && target->IsGameMaster())
1848
1849 // Output III. LANG_PINFO_BANNED if ban exists and is applied
1850 if (banTime >= 0)
1851 handler->PSendSysMessage(LANG_PINFO_BANNED, banType.c_str(), banReason.c_str(), banTime > 0 ? secsToTimeString(std::max<int64>(banTime - GameTime::GetGameTime(), 0), TimeFormat::ShortText).c_str() : handler->GetTrinityString(LANG_PERMANENTLY), bannedBy.c_str());
1852
1853 // Output IV. LANG_PINFO_MUTED if mute is applied
1854 if (muteTime > 0)
1855 handler->PSendSysMessage(LANG_PINFO_MUTED, muteReason.c_str(), secsToTimeString(muteTime - GameTime::GetGameTime(), TimeFormat::ShortText).c_str(), muteBy.c_str());
1856
1857 // Output V. LANG_PINFO_ACC_ACCOUNT
1858 handler->PSendSysMessage(LANG_PINFO_ACC_ACCOUNT, userName.c_str(), accId, security);
1859
1860 // Output VI. LANG_PINFO_ACC_LASTLOGIN
1861 handler->PSendSysMessage(LANG_PINFO_ACC_LASTLOGIN, lastLogin.c_str(), failedLogins);
1862
1863 // Output VII. LANG_PINFO_ACC_OS
1864 handler->PSendSysMessage(LANG_PINFO_ACC_OS, OS.c_str(), latency);
1865
1866 // Output VIII. LANG_PINFO_ACC_REGMAILS
1867 handler->PSendSysMessage(LANG_PINFO_ACC_REGMAILS, regMail.c_str(), eMail.c_str());
1868
1869 // Output IX. LANG_PINFO_ACC_IP
1870 handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO));
1871
1872 // Output X. LANG_PINFO_CHR_LEVEL
1873 if (level != sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
1874 handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL_LOW, level, xp, xptotal, (xptotal - xp));
1875 else
1877
1878 // Output XI. LANG_PINFO_CHR_RACE
1879 raceStr = GetRaceName(raceid, locale);
1880 classStr = GetClassName(classid, locale);
1881 handler->PSendSysMessage(LANG_PINFO_CHR_RACE, (gender == 0 ? handler->GetTrinityString(LANG_CHARACTER_GENDER_MALE) : handler->GetTrinityString(LANG_CHARACTER_GENDER_FEMALE)), raceStr.c_str(), classStr.c_str());
1882
1883 // Output XII. LANG_PINFO_CHR_ALIVE
1884 handler->PSendSysMessage(LANG_PINFO_CHR_ALIVE, alive.c_str());
1885
1886 // Output XIII. LANG_PINFO_CHR_PHASE if player is not in GM mode (GM is in every phase)
1887 if (target && !target->IsGameMaster()) // IsInWorld() returns false on loadingscreen, so it's more
1888 handler->PSendSysMessage(LANG_PINFO_CHR_PHASE, phase); // precise than just target (safer ?).
1889 // However, as we usually just require a target here, we use target instead.
1890 // Output XIV. LANG_PINFO_CHR_MONEY
1891 uint32 gold = money / GOLD;
1892 uint32 silv = (money % GOLD) / SILVER;
1893 uint32 copp = (money % GOLD) % SILVER;
1894 handler->PSendSysMessage(LANG_PINFO_CHR_MONEY, gold, silv, copp);
1895
1896 // Position data
1897 MapEntry const* map = sMapStore.LookupEntry(mapId);
1898 AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId);
1899 if (area)
1900 {
1901 zoneName = area->AreaName[locale];
1902
1903 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->ParentAreaID);
1904 if (zone)
1905 {
1906 areaName = zoneName;
1907 zoneName = zone->AreaName[locale];
1908 }
1909 }
1910
1911 if (!zoneName)
1912 zoneName = handler->GetTrinityString(LANG_UNKNOWN);
1913
1914 if (areaName)
1915 handler->PSendSysMessage(LANG_PINFO_CHR_MAP_WITH_AREA, map->MapName[locale], zoneName, areaName);
1916 else
1917 handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->MapName[locale], zoneName);
1918
1919 // Output XVII. - XVIX. if they are not empty
1920 if (!guildName.empty())
1921 {
1922 handler->PSendSysMessage(LANG_PINFO_CHR_GUILD, guildName.c_str(), guildId);
1923 handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_RANK, guildRank.c_str(), uint32(guildRankId));
1924 if (!note.empty())
1925 handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_NOTE, note.c_str());
1926 if (!officeNote.empty())
1927 handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_ONOTE, officeNote.c_str());
1928 }
1929
1930 // Output XX. LANG_PINFO_CHR_PLAYEDTIME
1931 handler->PSendSysMessage(LANG_PINFO_CHR_PLAYEDTIME, (secsToTimeString(totalPlayerTime, TimeFormat::ShortText, true)).c_str());
1932
1933 // Mail Data - an own query, because it may or may not be useful.
1934 // SQL: "SELECT SUM(CASE WHEN (checked & 1) THEN 1 ELSE 0 END) AS 'readmail', COUNT(*) AS 'totalmail' FROM mail WHERE `receiver` = ?"
1935 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_MAILS);
1936 stmt->setUInt32(0, lowguid);
1937 PreparedQueryResult result6 = CharacterDatabase.Query(stmt);
1938 if (result6)
1939 {
1940 Field* fields = result6->Fetch();
1941 uint32 readmail = uint32(fields[0].GetDouble());
1942 uint32 totalmail = uint32(fields[1].GetUInt64());
1943
1944 // Output XXI. LANG_INFO_CHR_MAILS if at least one mail is given
1945 if (totalmail >= 1)
1946 handler->PSendSysMessage(LANG_PINFO_CHR_MAILS, readmail, totalmail);
1947 }
1948
1949 return true;
1950 }
1951
1952 static bool HandleRespawnCommand(ChatHandler* handler)
1953 {
1954 Player* player = handler->GetSession()->GetPlayer();
1955
1956 // accept only explicitly selected target (not implicitly self targeting case)
1957 Creature* target = !player->GetTarget().IsEmpty() ? handler->getSelectedCreature() : nullptr;
1958 if (target)
1959 {
1960 if (target->IsPet())
1961 {
1963 handler->SetSentErrorMessage(true);
1964 return false;
1965 }
1966
1967 if (target->isDead())
1968 target->Respawn();
1969 return true;
1970 }
1971
1972 // First handle any creatures that still have a corpse around
1973 Trinity::RespawnDo u_do;
1975 Cell::VisitGridObjects(player, worker, player->GetGridActivationRange());
1976
1977 // Now handle any that had despawned, but had respawn time logged.
1978 std::vector<RespawnInfo const*> data;
1979 player->GetMap()->GetRespawnInfo(data, SPAWN_TYPEMASK_ALL);
1980 if (!data.empty())
1981 {
1982 uint32 const gridId = Trinity::ComputeGridCoord(player->GetPositionX(), player->GetPositionY()).GetId();
1983 for (RespawnInfo const* info : data)
1984 if (info->gridId == gridId)
1985 player->GetMap()->Respawn(info->type, info->spawnId);
1986 }
1987
1988 return true;
1989 }
1990
1991 // mute player for the specified duration
1992 static bool HandleMuteCommand(ChatHandler* handler, Optional<PlayerIdentifier> player, uint32 muteTime, Tail muteReason)
1993 {
1994 std::string muteReasonStr{ muteReason };
1995 if (muteReason.empty())
1996 muteReasonStr = handler->GetTrinityString(LANG_NO_REASON);
1997
1998 if (!player)
1999 player = PlayerIdentifier::FromTarget(handler);
2000 if (!player)
2001 {
2003 handler->SetSentErrorMessage(true);
2004 return false;
2005 }
2006
2007 Player* target = player->GetConnectedPlayer();
2008 uint32 accountId = target ? target->GetSession()->GetAccountId() : sCharacterCache->GetCharacterAccountIdByGuid(*player);
2009
2010 // find only player from same account if any
2011 if (!target)
2012 if (WorldSession* session = sWorld->FindSession(accountId))
2013 target = session->GetPlayer();
2014
2015 // must have strong lesser security level
2016 if (handler->HasLowerSecurity(target, player->GetGUID(), true))
2017 return false;
2018
2020 std::string muteBy = "";
2021 if (Player* gmPlayer = handler->GetPlayer())
2022 muteBy = gmPlayer->GetName();
2023 else
2024 muteBy = handler->GetTrinityString(LANG_CONSOLE);
2025
2026 if (target)
2027 {
2028 // Target is online, mute will be in effect right away.
2029 int64 mutedUntil = GameTime::GetGameTime() + static_cast<int64>(muteTime) * MINUTE;
2030 target->GetSession()->m_muteTime = mutedUntil;
2031 stmt->setInt64(0, mutedUntil);
2032 }
2033 else
2034 {
2035 // Target is offline, mute will be in effect starting from the next login.
2036 stmt->setInt64(0, -static_cast<int64>(muteTime) * MINUTE);
2037 }
2038
2039 stmt->setString(1, muteReasonStr);
2040 stmt->setString(2, muteBy);
2041 stmt->setUInt32(3, accountId);
2042 LoginDatabase.Execute(stmt);
2043 stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT_MUTE);
2044 stmt->setUInt32(0, accountId);
2045 stmt->setUInt32(1, muteTime);
2046 stmt->setString(2, muteBy);
2047 stmt->setString(3, muteReasonStr);
2048 LoginDatabase.Execute(stmt);
2049
2050 std::string nameLink = handler->playerLink(*player);
2051 if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD))
2052 sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy.c_str(), nameLink.c_str(), muteTime, muteReasonStr.c_str());
2053 if (target)
2054 {
2055 ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, muteTime, muteBy.c_str(), muteReasonStr.c_str());
2056 handler->PSendSysMessage(LANG_YOU_DISABLE_CHAT, nameLink.c_str(), muteTime, muteReasonStr.c_str());
2057 }
2058 else
2059 {
2060 handler->PSendSysMessage(LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), muteTime, muteReasonStr.c_str());
2061 }
2062
2063 return true;
2064 }
2065
2066 // unmute player
2067 static bool HandleUnmuteCommand(ChatHandler* handler, char const* args)
2068 {
2069 Player* target;
2070 ObjectGuid targetGuid;
2071 std::string targetName;
2072 if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
2073 return false;
2074
2075 uint32 accountId = target ? target->GetSession()->GetAccountId() : sCharacterCache->GetCharacterAccountIdByGuid(targetGuid);
2076
2077 // find only player from same account if any
2078 if (!target)
2079 if (WorldSession* session = sWorld->FindSession(accountId))
2080 target = session->GetPlayer();
2081
2082 // must have strong lesser security level
2083 if (handler->HasLowerSecurity (target, targetGuid, true))
2084 return false;
2085
2086 if (target)
2087 {
2088 if (target->GetSession()->CanSpeak())
2089 {
2091 handler->SetSentErrorMessage(true);
2092 return false;
2093 }
2094
2095 target->GetSession()->m_muteTime = 0;
2096 }
2097
2099 stmt->setInt64(0, 0);
2100 stmt->setString(1, "");
2101 stmt->setString(2, "");
2102 stmt->setUInt32(3, accountId);
2103 LoginDatabase.Execute(stmt);
2104
2105 if (target)
2107
2108 std::string nameLink = handler->playerLink(targetName);
2109
2110 handler->PSendSysMessage(LANG_YOU_ENABLE_CHAT, nameLink.c_str());
2111
2112 return true;
2113 }
2114
2115 // mutehistory command
2116 static bool HandleMuteHistoryCommand(ChatHandler* handler, std::string accountName)
2117 {
2118 if (!Utf8ToUpperOnlyLatin(accountName))
2119 {
2120 handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
2121 handler->SetSentErrorMessage(true);
2122 return false;
2123 }
2124
2125 uint32 accountId = AccountMgr::GetId(accountName);
2126 if (!accountId)
2127 {
2128 handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
2129 return false;
2130 }
2131
2132 return HandleMuteHistoryHelper(accountId, accountName.c_str(), handler);
2133 }
2134
2135 // helper for mutehistory
2136 static bool HandleMuteHistoryHelper(uint32 accountId, char const* accountName, ChatHandler *handler)
2137 {
2139 stmt->setUInt32(0, accountId);
2140 PreparedQueryResult result = LoginDatabase.Query(stmt);
2141
2142 if (!result)
2143 {
2144 handler->PSendSysMessage(LANG_COMMAND_MUTEHISTORY_EMPTY, accountName);
2145 return true;
2146 }
2147
2148 handler->PSendSysMessage(LANG_COMMAND_MUTEHISTORY, accountName);
2149 do
2150 {
2151 Field* fields = result->Fetch();
2152
2153 // we have to manually set the string for mutedate
2154 time_t sqlTime = fields[0].GetUInt32();
2155 tm timeinfo;
2156 char buffer[80];
2157
2158 // set it to string
2159 localtime_r(&sqlTime, &timeinfo);
2160 strftime(buffer, sizeof(buffer),"%Y-%m-%d %I:%M%p", &timeinfo);
2161
2162 handler->PSendSysMessage(LANG_COMMAND_MUTEHISTORY_OUTPUT, buffer, fields[1].GetUInt32(), fields[2].GetCString(), fields[3].GetCString());
2163 } while (result->NextRow());
2164 return true;
2165 }
2166
2168 {
2169 Unit* unit = handler->getSelectedUnit();
2170 if (!unit)
2171 {
2173 handler->SetSentErrorMessage(true);
2174 return false;
2175 }
2176
2177 handler->PSendSysMessage(LANG_MOVEGENS_LIST, (unit->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), unit->GetGUID().ToString().c_str());
2178
2179 if (unit->GetMotionMaster()->Empty())
2180 {
2181 handler->SendSysMessage("Empty");
2182 return true;
2183 }
2184
2185 float x, y, z;
2186 unit->GetMotionMaster()->GetDestination(x, y, z);
2187
2188 std::vector<MovementGeneratorInformation> const list = unit->GetMotionMaster()->GetMovementGeneratorsInformation();
2189 for (MovementGeneratorInformation const& info : list)
2190 {
2191 switch (info.Type)
2192 {
2193 case IDLE_MOTION_TYPE:
2195 break;
2196 case RANDOM_MOTION_TYPE:
2198 break;
2201 break;
2204 break;
2205 case CHASE_MOTION_TYPE:
2206 if (info.TargetGUID.IsEmpty())
2208 else if (info.TargetGUID.IsPlayer())
2209 handler->PSendSysMessage(LANG_MOVEGENS_CHASE_PLAYER, info.TargetName.c_str(), info.TargetGUID.ToString().c_str());
2210 else
2211 handler->PSendSysMessage(LANG_MOVEGENS_CHASE_CREATURE, info.TargetName.c_str(), info.TargetGUID.ToString().c_str());
2212 break;
2213 case FOLLOW_MOTION_TYPE:
2214 if (info.TargetGUID.IsEmpty())
2216 else if (info.TargetGUID.IsPlayer())
2217 handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_PLAYER, info.TargetName.c_str(), info.TargetGUID.ToString().c_str());
2218 else
2219 handler->PSendSysMessage(LANG_MOVEGENS_FOLLOW_CREATURE, info.TargetName.c_str(), info.TargetGUID.ToString().c_str());
2220 break;
2221 case HOME_MOTION_TYPE:
2222 if (unit->GetTypeId() == TYPEID_UNIT)
2224 else
2226 break;
2227 case FLIGHT_MOTION_TYPE:
2229 break;
2230 case POINT_MOTION_TYPE:
2231 handler->PSendSysMessage(LANG_MOVEGENS_POINT, x, y, z);
2232 break;
2235 break;
2238 break;
2239 case EFFECT_MOTION_TYPE:
2241 break;
2242 default:
2243 handler->PSendSysMessage(LANG_MOVEGENS_UNKNOWN, info.Type);
2244 break;
2245 }
2246 }
2247 return true;
2248 }
2249
2251 {
2252 Creature* caster = handler->getSelectedCreature();
2253 if (!caster)
2254 {
2256 handler->SetSentErrorMessage(true);
2257 return false;
2258 }
2259
2260 Player* player = handler->GetSession()->GetPlayer();
2261
2262 caster->GetMotionMaster()->MovePoint(0, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
2263
2264 return true;
2265 }
2266
2268 {
2269 Unit* target = handler->getSelectedUnit();
2270 if (!target || !handler->GetSession()->GetPlayer()->GetTarget())
2271 {
2273 handler->SetSentErrorMessage(true);
2274 return false;
2275 }
2276
2277 if (Player* player = target->ToPlayer())
2278 if (handler->HasLowerSecurity(player, ObjectGuid::Empty, false))
2279 return false;
2280
2281 if (!target->IsAlive())
2282 return true;
2283
2284 // flat melee damage without resistence/etc reduction
2285 if (!school)
2286 {
2287 Unit::DealDamage(handler->GetSession()->GetPlayer(), target, damage, nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
2288 if (target != handler->GetSession()->GetPlayer())
2290 return true;
2291 }
2292
2293 SpellSchoolMask schoolmask = SpellSchoolMask(1 << *school);
2294
2295 if (Unit::IsDamageReducedByArmor(schoolmask))
2296 damage = Unit::CalcArmorReducedDamage(handler->GetSession()->GetPlayer(), target, damage, nullptr, BASE_ATTACK);
2297
2298 Player* attacker = handler->GetSession()->GetPlayer();
2299
2300 // melee damage by specific school
2301 if (!spellInfo)
2302 {
2303 DamageInfo dmgInfo(attacker, target, damage, nullptr, schoolmask, SPELL_DIRECT_DAMAGE, BASE_ATTACK);
2304 Unit::CalcAbsorbResist(dmgInfo);
2305
2306 if (!dmgInfo.GetDamage())
2307 return true;
2308
2309 damage = dmgInfo.GetDamage();
2310
2311 uint32 absorb = dmgInfo.GetAbsorb();
2312 uint32 resist = dmgInfo.GetResist();
2313 Unit::DealDamageMods(target, damage, &absorb);
2314 Unit::DealDamage(attacker, target, damage, nullptr, DIRECT_DAMAGE, schoolmask, nullptr, false);
2315 attacker->SendAttackStateUpdate(HITINFO_AFFECTS_VICTIM, target, 0, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0);
2316 return true;
2317 }
2318
2319 // non-melee damage
2320
2321 SpellNonMeleeDamage damageInfo(attacker, target, (*spellInfo)->Id, (*spellInfo)->SchoolMask);
2322 damageInfo.damage = damage;
2323 Unit::DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb);
2324 target->DealSpellDamage(&damageInfo, true);
2325 target->SendSpellNonMeleeDamageLog(&damageInfo);
2326 return true;
2327 }
2328
2330 {
2331 GameObject* go = handler->GetObjectFromPlayerMapByDbGuid(*spawnId);
2332 if (!go)
2333 {
2334 handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, *spawnId);
2335 handler->SetSentErrorMessage(true);
2336 return false;
2337 }
2338
2339 if (!go->IsDestructibleBuilding())
2340 {
2342 handler->SetSentErrorMessage(true);
2343 return false;
2344 }
2345
2346 go->ModifyHealth(-damage, handler->GetSession()->GetPlayer());
2347 handler->PSendSysMessage(LANG_GAMEOBJECT_DAMAGED, go->GetName().c_str(), *spawnId, -damage, go->GetGOValue()->Building.Health);
2348 return true;
2349 }
2350
2351 static bool HandleCombatStopCommand(ChatHandler* handler, char const* args)
2352 {
2353 Player* target = nullptr;
2354
2355 if (args && args[0] != '\0')
2356 {
2357 target = ObjectAccessor::FindPlayerByName(args);
2358 if (!target)
2359 {
2361 handler->SetSentErrorMessage(true);
2362 return false;
2363 }
2364 }
2365
2366 if (!target)
2367 {
2368 if (!handler->extractPlayerTarget((char*)args, &target))
2369 return false;
2370 }
2371
2372 // check online security
2373 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
2374 return false;
2375
2376 target->CombatStop();
2377 return true;
2378 }
2379
2381 {
2382 sArenaTeamMgr->DistributeArenaPoints();
2383 return true;
2384 }
2385
2386 static bool HandleRepairitemsCommand(ChatHandler* handler, char const* args)
2387 {
2388 Player* target;
2389 if (!handler->extractPlayerTarget((char*)args, &target))
2390 return false;
2391
2392 // check online security
2393 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
2394 return false;
2395
2396 // Repair items
2397 target->DurabilityRepairAll(false, 0, false);
2398
2399 handler->PSendSysMessage(LANG_YOU_REPAIR_ITEMS, handler->GetNameLink(target).c_str());
2400 if (handler->needReportToTarget(target))
2402
2403 return true;
2404 }
2405
2406 static bool HandleFreezeCommand(ChatHandler* handler, char const* args)
2407 {
2408 Player* player = handler->getSelectedPlayer(); // Selected player, if any. Might be null.
2409 uint32 freezeDuration = 0; // Freeze Duration (in seconds)
2410 bool canApplyFreeze = false; // Determines if every possible argument is set so Freeze can be applied
2411 bool getDurationFromConfig = false; // If there's no given duration, we'll retrieve the world cfg value later
2412
2413 /*
2414 Possible Freeze Command Scenarios:
2415 case 1 - .freeze (without args and a selected player)
2416 case 2 - .freeze duration (with a selected player)
2417 case 3 - .freeze player duration
2418 case 4 - .freeze player (without specifying duration)
2419 */
2420
2421 // case 1: .freeze
2422 if (!*args)
2423 {
2424 // Might have a selected player. We'll check it later
2425 // Get the duration from world cfg
2426 getDurationFromConfig = true;
2427 }
2428 else
2429 {
2430 // Get the args that we might have (up to 2)
2431 char const* arg1 = strtok((char*)args, " ");
2432 char const* arg2 = strtok(nullptr, " ");
2433
2434 // Analyze them to see if we got either a playerName or duration or both
2435 if (arg1)
2436 {
2437 if (isNumeric(arg1))
2438 {
2439 // case 2: .freeze duration
2440 // We have a selected player. We'll check him later
2441 freezeDuration = uint32(atoi(arg1));
2442 canApplyFreeze = true;
2443 }
2444 else
2445 {
2446 // case 3 or 4: .freeze player duration | .freeze player
2447 // find the player
2448 std::string name = arg1;
2449 normalizePlayerName(name);
2450 player = ObjectAccessor::FindPlayerByName(name);
2451 // Check if we have duration set
2452 if (arg2 && isNumeric(arg2))
2453 {
2454 freezeDuration = uint32(atoi(arg2));
2455 canApplyFreeze = true;
2456 }
2457 else
2458 getDurationFromConfig = true;
2459 }
2460 }
2461 }
2462
2463 // Check if duration needs to be retrieved from config
2464 if (getDurationFromConfig)
2465 {
2466 freezeDuration = sWorld->getIntConfig(CONFIG_GM_FREEZE_DURATION);
2467 canApplyFreeze = true;
2468 }
2469
2470 // Player and duration retrieval is over
2471 if (canApplyFreeze)
2472 {
2473 if (!player) // can be null if some previous selection failed
2474 {
2476 return true;
2477 }
2478 else if (player == handler->GetSession()->GetPlayer())
2479 {
2480 // Can't freeze himself
2482 return true;
2483 }
2484 else // Apply the effect
2485 {
2486 // Add the freeze aura and set the proper duration
2487 // Player combat status and flags are now handled
2488 // in Freeze Spell AuraScript (OnApply)
2489 Aura* freeze = player->AddAura(9454, player);
2490 if (freeze)
2491 {
2492 if (freezeDuration)
2493 freeze->SetDuration(freezeDuration * IN_MILLISECONDS);
2494 handler->PSendSysMessage(LANG_COMMAND_FREEZE, player->GetName().c_str());
2495 // save player
2496 player->SaveToDB();
2497 return true;
2498 }
2499 }
2500 }
2501 return false;
2502 }
2503
2504 static bool HandleUnFreezeCommand(ChatHandler* handler, Optional<std::string> targetNameArg)
2505 {
2506 std::string name;
2507 Player* player;
2508
2509 if (targetNameArg)
2510 {
2511 name = *targetNameArg;
2512 normalizePlayerName(name);
2513 player = ObjectAccessor::FindPlayerByName(name);
2514 }
2515 else // If no name was entered - use target
2516 {
2517 player = handler->getSelectedPlayer();
2518 if (player)
2519 name = player->GetName();
2520 }
2521
2522 if (player)
2523 {
2524 handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str());
2525
2526 // Remove Freeze spell (allowing movement and spells)
2527 // Player Flags + Neutral faction removal is now
2528 // handled on the Freeze Spell AuraScript (OnRemove)
2529 player->RemoveAurasDueToSpell(9454);
2530 }
2531 else
2532 {
2533 if (targetNameArg)
2534 {
2535 // Check for offline players
2536 ObjectGuid guid = sCharacterCache->GetCharacterGuidByName(name);
2537 if (guid.IsEmpty())
2538 {
2540 return true;
2541 }
2542
2543 // If player found: delete his freeze aura
2545 stmt->setUInt32(0, guid.GetCounter());
2546 CharacterDatabase.Execute(stmt);
2547
2548 handler->PSendSysMessage(LANG_COMMAND_UNFREEZE, name.c_str());
2549 return true;
2550 }
2551 else
2552 {
2554 return true;
2555 }
2556 }
2557
2558 return true;
2559 }
2560
2562 {
2563 // Get names from DB
2565 PreparedQueryResult result = CharacterDatabase.Query(stmt);
2566 if (!result)
2567 {
2569 return true;
2570 }
2571
2572 // Header of the names
2574
2575 // Output of the results
2576 do
2577 {
2578 Field* fields = result->Fetch();
2579 std::string player = fields[0].GetString();
2580 int32 remaintime = fields[1].GetInt32();
2581 // Save the frozen player to update remaining time in case of future .listfreeze uses
2582 // before the frozen state expires
2583 if (Player* frozen = ObjectAccessor::FindPlayerByName(player))
2584 frozen->SaveToDB();
2585 // Notify the freeze duration
2586 if (remaintime == -1) // Permanent duration
2587 handler->PSendSysMessage(LANG_COMMAND_PERMA_FROZEN_PLAYER, player.c_str());
2588 else
2589 // show time left (seconds)
2590 handler->PSendSysMessage(LANG_COMMAND_TEMP_FROZEN_PLAYER, player.c_str(), remaintime / IN_MILLISECONDS);
2591 }
2592 while (result->NextRow());
2593
2594 return true;
2595 }
2596
2597 static bool HandlePlayAllCommand(ChatHandler* handler, uint32 soundId)
2598 {
2599 if (!sSoundEntriesStore.LookupEntry(soundId))
2600 {
2601 handler->PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId);
2602 handler->SetSentErrorMessage(true);
2603 return false;
2604 }
2605
2606 sWorld->SendGlobalMessage(WorldPackets::Misc::PlaySound(soundId).Write());
2607
2609 return true;
2610 }
2611
2612 static bool HandlePossessCommand(ChatHandler* handler)
2613 {
2614 Unit* unit = handler->getSelectedUnit();
2615 if (!unit)
2616 return false;
2617
2618 handler->GetSession()->GetPlayer()->CastSpell(unit, 530, true);
2619 return true;
2620 }
2621
2623 {
2624 Unit* unit = handler->getSelectedUnit();
2625 if (!unit)
2626 unit = handler->GetSession()->GetPlayer();
2627
2628 unit->RemoveCharmAuras();
2629
2630 return true;
2631 }
2632
2634 {
2635 Unit* unit = handler->getSelectedUnit();
2636 if (!unit)
2637 return false;
2638
2639 handler->GetSession()->GetPlayer()->CastSpell(unit, 6277, true);
2640 return true;
2641 }
2642
2644 {
2645 Player* player = handler->GetSession()->GetPlayer();
2646
2647 if (player->isPossessing())
2648 return false;
2649
2650 player->StopCastingBindSight();
2651 return true;
2652 }
2653
2654 static bool HandleMailBoxCommand(ChatHandler* handler)
2655 {
2656 Player* player = handler->GetSession()->GetPlayer();
2657
2658 handler->GetSession()->SendShowMailBox(player->GetGUID());
2659 return true;
2660 }
2661};
2662
2664{
2665 new misc_commandscript();
2666}
#define sArenaTeamMgr
#define sCharacterCache
@ CHAR_SEL_PINFO_XP
@ CHAR_SEL_PVPSTATS_FACTIONS_OVERALL
@ CHAR_DEL_CHAR_AURA_FROZEN
@ CHAR_SEL_CHARACTER_AURA_FROZEN
@ CHAR_SEL_GUILD_MEMBER_EXTENDED
@ CHAR_SEL_CHAR_PINFO
@ CHAR_SEL_PINFO_MAILS
@ CHAR_SEL_PINFO_BANS
#define EXACT_SEQUENCE(str)
@ IN_MILLISECONDS
Definition Common.h:35
@ MINUTE
Definition Common.h:29
AccountTypes
Definition Common.h:39
#define MAX_EFFECT_MASK
Definition DBCEnums.h:389
char const * GetClassName(uint8 class_, uint8 locale)
DBCStorage< WorldSafeLocsEntry > sWorldSafeLocsStore(WorldSafeLocsEntryfmt)
void Map2ZoneCoordinates(float &x, float &y, uint32 zone)
DBCStorage< SoundEntriesEntry > sSoundEntriesStore(SoundEntriesfmt)
char const * GetRaceName(uint8 race, uint8 locale)
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
uint8_t uint8
Definition Define.h:135
int64_t int64
Definition Define.h:128
int8_t int8
Definition Define.h:131
int32_t int32
Definition Define.h:129
uint16_t uint16
Definition Define.h:134
uint32_t uint32
Definition Define.h:133
#define MAX_NUMBER_OF_GRIDS
Definition GridDefines.h:36
#define sIPLocation
Definition IPLocation.h:48
#define sInstanceSaveMgr
InventoryResult
Definition ItemDefines.h:25
@ EQUIP_ERR_OK
Definition ItemDefines.h:26
int32 GenerateItemRandomPropertyId(uint32 item_id)
@ LANG_COMMAND_KICKSELF
Definition Language.h:332
@ LANG_COMMAND_KICKMESSAGE_WORLD
Definition Language.h:1221
@ LANG_YES
Definition Language.h:482
@ LANG_MOVEGENS_FOLLOW_PLAYER
Definition Language.h:915
@ LANG_CHARACTER_GENDER_FEMALE
Definition Language.h:804
@ LANG_DEV_ON
Definition Language.h:913
@ LANG_COMMAND_GRAVEYARDALRLINKED
Definition Language.h:513
@ LANG_MOVEGENS_EFFECT
Definition Language.h:918
@ LANG_SELECT_CREATURE
Definition Language.h:32
@ LANG_PINFO_CHR_GUILD_NOTE
Definition Language.h:796
@ LANG_PINFO_CHR_ALIVE
Definition Language.h:790
@ LANG_SUMMONING
Definition Language.h:142
@ LANG_NO_REASON
Definition Language.h:1094
@ LANG_PINFO_ACC_LASTLOGIN
Definition Language.h:784
@ LANG_CHARACTER
Definition Language.h:1099
@ LANG_UNKNOWN
Definition Language.h:77
@ LANG_COMMAND_GRAVEYARD_ALLIANCE
Definition Language.h:520
@ LANG_PINFO_CHR_PHASE
Definition Language.h:791
@ LANG_COMMAND_OBJNOTFOUND
Definition Language.h:324
@ LANG_MOVEGENS_UNKNOWN
Definition Language.h:615
@ LANG_ERROR
Definition Language.h:78
@ LANG_PERMANENTLY
Definition Language.h:1100
@ LANG_COMMAND_ZONENOGRAFACTION
Definition Language.h:524
@ LANG_NO_WEATHER
Definition Language.h:463
@ LANG_DEV_OFF
Definition Language.h:914
@ LANG_OFFLINE
Definition Language.h:69
@ LANG_PLAYERS_SAVED
Definition Language.h:47
@ LANG_PINFO_CHR_LEVEL_LOW
Definition Language.h:788
@ LANG_CANNOT_GO_TO_INST_PARTY
Definition Language.h:138
@ LANG_PINFO_CHR_PLAYEDTIME
Definition Language.h:798
@ LANG_UNAUTHORIZED
Definition Language.h:1089
@ LANG_COMMAND_PLAYED_TO_ALL
Definition Language.h:1067
@ LANG_GPS_POSITION_INDOORS
Definition Language.h:1102
@ LANG_COMMAND_DISABLE_CHAT_DELAYED
Definition Language.h:334
@ LANG_IS_TELEPORTED
Definition Language.h:136
@ LANG_LIQUID_STATUS
Definition Language.h:217
@ LANG_COMMAND_COULDNOTFIND
Definition Language.h:497
@ LANG_COMMAND_FREEZE_ERROR
Definition Language.h:1059
@ LANG_COMMAND_NOCREATUREFOUND
Definition Language.h:510
@ LANG_PINFO_CHR_RACE
Definition Language.h:789
@ LANG_PINFO_CHR_MAP_WITH_AREA
Definition Language.h:801
@ LANG_ITEM_CANNOT_CREATE
Definition Language.h:568
@ LANG_MOVEGENS_CHASE_PLAYER
Definition Language.h:609
@ LANG_COMMAND_GRAVEYARDNOEXIST
Definition Language.h:512
@ LANG_CANT_TELEPORT_SELF
Definition Language.h:213
@ LANG_PVPSTATS
Definition Language.h:112
@ LANG_APPEARING_AT
Definition Language.h:147
@ LANG_MOVEGENS_IDLE
Definition Language.h:604
@ LANG_YOU
Definition Language.h:76
@ LANG_MOVEGENS_CONFUSED
Definition Language.h:608
@ LANG_PINFO_PLAYER
Definition Language.h:779
@ LANG_COMMAND_LIST_FREEZE
Definition Language.h:1063
@ LANG_MOVEGENS_FOLLOW_CREATURE
Definition Language.h:916
@ LANG_MOVEGENS_FOLLOW_NULL
Definition Language.h:917
@ LANG_PLAYER_SAVED
Definition Language.h:46
@ LANG_PINFO_ACC_OS
Definition Language.h:785
@ LANG_UNEXPLORE_AREA
Definition Language.h:645
@ LANG_CHARACTER_GENDER_MALE
Definition Language.h:803
@ LANG_MOVEGENS_DISTRACT
Definition Language.h:680
@ LANG_YOUR_CHAT_DISABLED
Definition Language.h:354
@ LANG_COMMAND_GRAVEYARDWRONGZONE
Definition Language.h:515
@ LANG_COMMAND_NO_FROZEN_PLAYERS
Definition Language.h:1062
@ LANG_CHAT_ALREADY_ENABLED
Definition Language.h:356
@ LANG_COMMAND_GRAVEYARDNEAREST
Definition Language.h:522
@ LANG_WEATHER_DISABLED
Definition Language.h:464
@ LANG_GAMEOBJECT_DAMAGED
Definition Language.h:219
@ LANG_COMMAND_UNFREEZE
Definition Language.h:1061
@ LANG_NO_ITEMS_FROM_ITEMSET_FOUND
Definition Language.h:573
@ LANG_PINFO_CHR_MONEY
Definition Language.h:792
@ LANG_REMOVE_COOLDOWN
Definition Language.h:563
@ LANG_INVALID_SKILL_ID
Definition Language.h:556
@ LANG_YOU_REPAIR_ITEMS
Definition Language.h:391
@ LANG_YOU_ENABLE_CHAT
Definition Language.h:358
@ LANG_YOUR_CHAT_ENABLED
Definition Language.h:357
@ LANG_COMMAND_TEMP_FROZEN_PLAYER
Definition Language.h:1078
@ LANG_CANNOT_SUMMON_INST_INST
Definition Language.h:141
@ LANG_PINFO_CHR_LEVEL_HIGH
Definition Language.h:800
@ LANG_NO
Definition Language.h:483
@ LANG_COMMAND_MUTEMESSAGE_WORLD
Definition Language.h:1224
@ LANG_CANNOT_SUMMON_TO_INST
Definition Language.h:137
@ LANG_UNKNOWN_SPELL
Definition Language.h:560
@ LANG_YOUR_ITEMS_REPAIRED
Definition Language.h:392
@ LANG_YOU_DISABLE_CHAT
Definition Language.h:355
@ LANG_COMMAND_GRAVEYARDLINKED
Definition Language.h:514
@ LANG_PINFO_CHR_MAP
Definition Language.h:793
@ LANG_CHAR_NON_MOUNTED
Definition Language.h:54
@ LANG_NO_CHAR_SELECTED
Definition Language.h:150
@ LANG_OBJECT_GUID
Definition Language.h:244
@ LANG_TRANSPORT_POSITION
Definition Language.h:229
@ LANG_MOVEGENS_CHASE_CREATURE
Definition Language.h:610
@ LANG_PINFO_ACC_IP
Definition Language.h:787
@ LANG_CONSOLE
Definition Language.h:1098
@ LANG_COMMAND_ZONENOGRAVEYARDS
Definition Language.h:523
@ LANG_INVALID_GAMEOBJECT_TYPE
Definition Language.h:218
@ LANG_SELECT_CHAR_OR_CREATURE
Definition Language.h:31
@ LANG_COMMAND_NOGAMEOBJECTFOUND
Definition Language.h:511
@ LANG_MOVEGENS_RANDOM
Definition Language.h:605
@ LANG_REMOVEITEM_FAILURE
Definition Language.h:691
@ LANG_PINFO_BANNED
Definition Language.h:781
@ LANG_PLAYER_NOT_FOUND
Definition Language.h:570
@ LANG_COMMAND_MUTEHISTORY_OUTPUT
Definition Language.h:1124
@ LANG_COMMAND_MUTEHISTORY_EMPTY
Definition Language.h:1123
@ LANG_SOUND_NOT_EXIST
Definition Language.h:212
@ LANG_SUMMONED_BY
Definition Language.h:143
@ LANG_MOVEGENS_WAYPOINT
Definition Language.h:606
@ LANG_MOVEGENS_POINT
Definition Language.h:678
@ LANG_PINFO_CHR_GUILD_RANK
Definition Language.h:795
@ LANG_CANNOT_GO_TO_INST_GM
Definition Language.h:139
@ LANG_PINFO_ACC_ACCOUNT
Definition Language.h:783
@ LANG_EXPLORE_AREA
Definition Language.h:644
@ LANG_COMMAND_GRAVEYARD_NOTEAM
Definition Language.h:518
@ LANG_ACCOUNT
Definition Language.h:832
@ LANG_PINFO_ACC_REGMAILS
Definition Language.h:786
@ LANG_BAD_VALUE
Definition Language.h:149
@ LANG_ADDITEM
Definition Language.h:565
@ LANG_COMMAND_MUTEHISTORY
Definition Language.h:1122
@ LANG_PVPSTATS_DISABLED
Definition Language.h:113
@ LANG_PINFO_GM_ACTIVE
Definition Language.h:780
@ LANG_CANNOT_GO_TO_BG_GM
Definition Language.h:728
@ LANG_COMMAND_FREEZE
Definition Language.h:1058
@ LANG_PINFO_CHR_MAILS
Definition Language.h:799
@ LANG_COMMAND_PERMA_FROZEN_PLAYER
Definition Language.h:1064
@ LANG_MOVEGENS_CHASE_NULL
Definition Language.h:611
@ LANG_GPS_POSITION_OUTDOORS
Definition Language.h:1101
@ LANG_MOVEGENS_FLIGHT
Definition Language.h:614
@ LANG_ACCOUNT_NOT_EXIST
Definition Language.h:473
@ LANG_COMMAND_KICKMESSAGE
Definition Language.h:333
@ LANG_PINFO_CHR_GUILD
Definition Language.h:794
@ LANG_CHAR_IN_FLIGHT
Definition Language.h:53
@ LANG_COMMAND_GRAVEYARDERROR
Definition Language.h:517
@ LANG_COMMAND_FREEZE_WRONG
Definition Language.h:1060
@ LANG_PINFO_CHR_GUILD_ONOTE
Definition Language.h:797
@ LANG_MAP_POSITION
Definition Language.h:135
@ LANG_MOVEGENS_HOME_CREATURE
Definition Language.h:612
@ LANG_GRID_POSITION
Definition Language.h:220
@ LANG_SET_SKILL
Definition Language.h:553
@ LANG_NO_SELECTION
Definition Language.h:243
@ LANG_MOVEGENS_HOME_PLAYER
Definition Language.h:613
@ LANG_MOVEGENS_LIST
Definition Language.h:603
@ LANG_GPS_NO_VMAP
Definition Language.h:1103
@ LANG_DISTANCE
Definition Language.h:575
@ LANG_COMMAND_GRAVEYARD_HORDE
Definition Language.h:521
@ LANG_COMMAND_GRAVEYARD_ANY
Definition Language.h:519
@ LANG_MOVEGENS_FEAR
Definition Language.h:679
@ LANG_REMOVEITEM
Definition Language.h:567
@ LANG_PINFO_MUTED
Definition Language.h:782
@ LANG_REMOVEALL_COOLDOWN
Definition Language.h:562
@ LANG_COMMAND_ITEMIDINVALID
Definition Language.h:498
@ LOGIN_SEL_PINFO
@ LOGIN_SEL_ACCOUNT_MUTE_INFO
@ LOGIN_UPD_MUTE_TIME
@ LOGIN_SEL_PINFO_BANS
@ LOGIN_INS_ACCOUNT_MUTE
ZLiquidStatus
Definition MapDefines.h:74
#define MAX_HEIGHT
Definition Map.h:240
@ DISTRACT_MOTION_TYPE
@ IDLE_MOTION_TYPE
@ CHASE_MOTION_TYPE
@ WAYPOINT_MOTION_TYPE
@ FLEEING_MOTION_TYPE
@ CONFUSED_MOTION_TYPE
@ HOME_MOTION_TYPE
@ POINT_MOTION_TYPE
@ FLIGHT_MOTION_TYPE
@ FOLLOW_MOTION_TYPE
@ RANDOM_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TYPEID_UNIT
Definition ObjectGuid.h:38
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
HighGuid
Definition ObjectGuid.h:63
bool normalizePlayerName(std::string &name)
std::unordered_map< uint32, ItemTemplate > ItemTemplateContainer
Definition ObjectMgr.h:556
#define sObjectMgr
Definition ObjectMgr.h:1721
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
std::vector< ItemPosCount > ItemPosCountVec
Definition Player.h:624
@ TELE_TO_GM_MODE
Definition Player.h:679
@ PLAYER_FLAGS_GHOST
Definition Player.h:348
#define INVENTORY_SLOT_BAG_0
Definition Player.h:547
#define PLAYER_EXPLORED_ZONES_SIZE
Definition Player.h:117
SpellSchoolMask
@ SPELL_SCHOOL_MASK_NORMAL
@ BASE_ATTACK
@ ALLIANCE
@ HORDE
@ SILVER
@ GOLD
WeatherType
@ SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW
@ SPAWN_TYPEMASK_ALL
Definition SpawnData.h:43
@ SPELL_AURA_MOUNTED
#define sSpellMgr
Definition SpellMgr.h:738
@ HITINFO_AFFECTS_VICTIM
@ VICTIMSTATE_HIT
Definition Unit.h:48
@ NULL_BAG
Definition Unit.h:61
@ NULL_SLOT
Definition Unit.h:62
@ DIRECT_DAMAGE
Definition Unit.h:353
@ SPELL_DIRECT_DAMAGE
Definition Unit.h:354
@ PLAYER_EXPLORED_ZONES_1
bool StringEqualI(std::string_view a, std::string_view b)
Definition Util.cpp:706
bool Utf8ToUpperOnlyLatin(std::string &utf8String)
Definition Util.cpp:610
std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat, bool hoursOnly)
Definition Util.cpp:115
bool isNumeric(wchar_t wchar)
Definition Util.h:176
@ WORLD_SEL_ITEM_TEMPLATE_LOCALE_BY_NAME
@ WORLD_SEL_ITEM_TEMPLATE_BY_NAME
static uint32 GetId(std::string_view username)
static Aura * TryRefreshStackOrCreate(AuraCreateInfo &createInfo, bool updateEffectMask=true)
void SetDuration(int32 duration, bool withMods=false)
char * extractKeyFromLink(char *text, char const *linkType, char **something1=nullptr)
Definition Chat.cpp:364
Player * getSelectedPlayerOrSelf()
Definition Chat.cpp:346
virtual bool HasPermission(uint32 permission) const
Definition Chat.cpp:41
std::string playerLink(std::string const &name) const
Definition Chat.h:127
Unit * getSelectedUnit()
Definition Chat.cpp:314
Player * getSelectedPlayer()
Definition Chat.cpp:302
WorldSession * GetSession()
Definition Chat.h:46
virtual LocaleConstant GetSessionDbcLocale() const
Definition Chat.cpp:692
virtual std::string GetNameLink() const
Definition Chat.cpp:46
Creature * GetCreatureFromPlayerMapByDbGuid(ObjectGuid::LowType lowguid)
Definition Chat.cpp:499
bool HasLowerSecurity(Player *target, ObjectGuid guid, bool strong=false)
Definition Chat.cpp:51
Creature * getSelectedCreature()
Definition Chat.cpp:338
GameObject * GetObjectFromPlayerMapByDbGuid(ObjectGuid::LowType lowguid)
Definition Chat.cpp:489
void SetSentErrorMessage(bool val)
Definition Chat.h:134
Player * GetPlayer() const
Definition Chat.cpp:34
void PSendSysMessage(char const *fmt, Args &&... args)
Definition Chat.h:69
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:101
virtual bool needReportToTarget(Player *chr) const
Definition Chat.cpp:686
bool extractPlayerTarget(char *args, Player **player, ObjectGuid *player_guid=nullptr, std::string *player_name=nullptr)
Definition Chat.cpp:589
ObjectGuid::LowType extractLowGuidFromLink(char *text, HighGuid &guidHigh)
Definition Chat.cpp:530
virtual char const * GetTrinityString(uint32 entry) const
Definition Chat.cpp:36
void Respawn(bool force=false)
uint32 GetResist() const
Definition Unit.h:466
uint32 GetDamage() const
Definition Unit.h:464
uint32 GetAbsorb() const
Definition Unit.h:465
Class used to access individual fields of database query result.
Definition Field.h:92
uint8 GetUInt8() const
Definition Field.cpp:29
std::string GetString() const
Definition Field.cpp:125
uint64 GetUInt64() const
Definition Field.cpp:77
uint16 GetUInt16() const
Definition Field.cpp:45
uint32 GetUInt32() const
Definition Field.cpp:61
int32 GetInt32() const
Definition Field.cpp:69
GameObjectValue const * GetGOValue() const
Definition GameObject.h:106
void ModifyHealth(int32 change, WorldObject *attackerOrHealer=nullptr, uint32 spellId=0)
bool IsDestructibleBuilding() const
Definition Group.h:165
InstanceGroupBind * GetBoundInstance(Player *player)
Definition Group.cpp:2286
Definition Item.h:62
void SetBinding(bool val)
Definition Item.h:80
static MMapManager * createOrGetMMapManager()
dtNavMesh const * GetNavMesh(uint32 mapId)
Definition Map.h:281
bool IsDungeon() const
Definition Map.cpp:4236
bool IsBattlegroundOrArena() const
Definition Map.cpp:4277
Weather * GetOrGenerateZoneDefaultWeather(uint32 zoneId)
Definition Map.cpp:4772
bool IsRaid() const
Definition Map.cpp:4246
float GetMinHeight(float x, float y) const
Definition Map.cpp:2530
ZLiquidStatus GetLiquidStatus(uint32 phaseMask, float x, float y, float z, Optional< uint8 > ReqLiquidType, LiquidData *data=nullptr, float collisionHeight=2.03128f) const
Definition Map.cpp:2635
uint32 GetId() const
Definition Map.cpp:4216
RespawnInfo * GetRespawnInfo(SpawnObjectType type, ObjectGuid::LowType spawnId) const
Definition Map.cpp:3185
uint32 GetInstanceId() const
Definition Map.h:387
static bool ExistVMap(uint32 mapid, int gx, int gy)
Definition Map.cpp:138
static bool ExistMap(uint32 mapid, int gx, int gy)
Definition Map.cpp:109
void Respawn(RespawnInfo *info, CharacterDatabaseTransaction dbTrans=nullptr)
Definition Map.cpp:3105
std::vector< MovementGeneratorInformation > GetMovementGeneratorsInformation() const
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
bool GetDestination(float &x, float &y, float &z)
bool Empty() const
LowType GetCounter() const
Definition ObjectGuid.h:156
static ObjectGuid const Empty
Definition ObjectGuid.h:140
bool IsEmpty() const
Definition ObjectGuid.h:172
std::string ToString() const
uint32 LowType
Definition ObjectGuid.h:142
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:249
TypeID GetTypeId() const
Definition Object.h:93
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:585
static Player * ToPlayer(Object *o)
Definition Object.h:180
void StopCastingBindSight() const
Definition Player.cpp:24109
bool IsValidPos(uint16 pos, bool explicit_pos) const
Definition Player.h:1122
Difficulty GetRaidDifficulty() const
Definition Player.h:1636
Item * StoreNewItem(ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0, GuidSet const &allowedLooters=GuidSet())
Definition Player.cpp:11621
uint32 GetSaveTimer() const
Definition Player.h:2075
float m_homebindZ
Definition Player.h:2089
BattlegroundTypeId GetBattlegroundTypeId() const
Definition Player.h:1985
void LeaveBattleground(bool teleportToEntryPoint=true, bool withoutDeserterDebuff=false)
Definition Player.cpp:21955
uint32 GetTotalPlayedTime() const
Definition Player.h:1036
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Player.cpp:22320
Gender GetNativeGender() const override
Definition Player.h:1039
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5892
uint32 m_homebindMapId
Definition Player.h:2085
void SetDungeonDifficulty(Difficulty dungeon_difficulty)
Definition Player.h:1638
static void OfflineResurrect(ObjectGuid const &guid, CharacterDatabaseTransaction trans)
Definition Player.cpp:4465
void SetBattlegroundEntryPoint()
Definition Player.cpp:21901
void SetDeveloper(bool on)
Definition Player.h:995
void SpawnCorpseBones(bool triggerSave=true)
Definition Player.cpp:4536
Difficulty GetDifficulty(bool isRaid) const
Definition Player.h:1634
void DurabilityRepairAll(bool takeCost, float discountMod, bool guildBank)
Definition Player.cpp:4660
static void SavePositionInDB(WorldLocation const &loc, uint16 zoneId, ObjectGuid guid, CharacterDatabaseTransaction trans)
Definition Player.cpp:20047
void SetRaidDifficulty(Difficulty raid_difficulty)
Definition Player.h:1639
void SetSkill(uint32 id, uint16 step, uint16 newVal, uint16 maxVal)
Definition Player.cpp:5759
void SwapItem(uint16 src, uint16 dst)
Definition Player.cpp:12630
WorldSession * GetSession() const
Definition Player.h:1719
Item * GetItemByPos(uint16 pos) const
Definition Player.cpp:9552
void SaveRecallPosition()
Definition Player.h:2078
void RepopAtGraveyard()
Definition Player.cpp:4773
uint16 GetPureMaxSkillValue(uint32 skill) const
Definition Player.cpp:5922
uint32 DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition Player.cpp:12209
void FinishTaxiFlight()
Definition Player.cpp:21202
void Recall()
Definition Player.h:2079
uint16 GetSkillStep(uint32 skill) const
Definition Player.cpp:5880
float m_homebindY
Definition Player.h:2088
Group * GetGroup()
Definition Player.h:2171
void SendNewItem(Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
Definition Player.cpp:13856
bool IsGameMaster() const
Definition Player.h:998
void UpdateWeaponsSkillsToMaxSkillsForLevel()
Definition Player.cpp:5733
uint32 GetMoney() const
Definition Player.h:1408
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0)
Definition Player.cpp:1524
static bool LoadPositionFromDB(uint32 &mapid, float &x, float &y, float &z, float &o, bool &in_flight, ObjectGuid guid)
Definition Player.cpp:16823
void SendEquipError(InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0) const
Definition Player.cpp:13075
void SaveToDB(bool create=false)
Definition Player.cpp:18984
uint32 GetBattlegroundId() const
Definition Player.h:1984
bool IsDeveloper() const
Definition Player.h:994
InstancePlayerBind * BindToInstance(InstanceSave *save, bool permanent, BindExtensionState extendState=EXTEND_STATE_NORMAL, bool load=false)
Definition Player.cpp:18618
void SetBattlegroundId(uint32 val, BattlegroundTypeId bgTypeId)
Definition Player.cpp:23092
WorldLocation GetStartPosition() const
Definition Player.cpp:22058
Difficulty GetDungeonDifficulty() const
Definition Player.h:1635
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
Definition Player.cpp:9989
bool IsBeingTeleported() const
Definition Player.h:1820
InstancePlayerBind * GetBoundInstance(uint32 mapid, Difficulty difficulty, bool withExpired=false)
Definition Player.cpp:18564
float m_homebindX
Definition Player.h:2087
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition Player.cpp:4346
void setUInt32(uint8 index, uint32 value)
void setInt64(uint8 index, int64 value)
void setInt32(uint8 index, int32 value)
void setString(uint8 index, std::string const &value)
void ResetCooldown(uint32 spellId, bool update=false)
void ResetAllCooldowns()
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE, uint32 *param1=nullptr, uint32 *param2=nullptr)
Definition Spell.cpp:4177
Definition Unit.h:769
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true)
Definition Unit.cpp:716
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3765
uint8 GetClass() const
Definition Unit.h:895
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition Unit.cpp:5319
void DealSpellDamage(SpellNonMeleeDamage const *damageInfo, bool durabilityLoss)
Definition Unit.cpp:1109
static void CalcAbsorbResist(DamageInfo &damageInfo, Spell *spell=nullptr)
Definition Unit.cpp:1769
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool IsPet() const
Definition Unit.h:884
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit *victim, uint32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=MAX_ATTACK, uint8 attackerLevel=0)
Definition Unit.cpp:1585
void Dismount()
Definition Unit.cpp:8234
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:11964
bool IsAlive() const
Definition Unit.h:1234
float GetCombatReach() const override
Definition Unit.h:839
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const *log)
Definition Unit.cpp:5185
bool IsInFlight() const
Definition Unit.h:1119
bool isPossessing() const
Definition Unit.cpp:6290
uint32 GetHealth() const
Definition Unit.h:913
bool IsMounted() const
Definition Unit.h:1013
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
void RemoveAllAuras()
Definition Unit.cpp:4157
SpellHistory * GetSpellHistory()
Definition Unit.h:1484
static void Kill(Unit *attacker, Unit *victim, bool durabilityLoss=true)
Definition Unit.cpp:10930
void CombatStop(bool includingCast=false, bool mutualPvP=true)
Definition Unit.cpp:5691
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr)
Definition Unit.cpp:1576
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition Unit.cpp:706
ObjectGuid GetTarget() const
Definition Unit.h:1797
uint8 GetLevel() const
Definition Unit.h:889
uint8 GetRace() const
Definition Unit.h:892
void RemoveCharmAuras()
Definition Unit.cpp:6384
bool IsInCombat() const
Definition Unit.h:1144
bool isDead() const
Definition Unit.h:1236
Weather for one zone.
Definition Weather.h:67
uint32 GetMapId() const
Definition Position.h:193
uint32 GetPhaseMask() const
Definition Object.h:368
Map * GetMap() const
Definition Object.h:449
float GetGridActivationRange() const
Definition Object.cpp:1476
void GetClosePoint(float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0) const
Definition Object.cpp:3244
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
uint32 GetInstanceId() const
Definition Object.h:365
bool IsOutdoors() const
Definition Object.h:377
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:1141
std::string const & GetName() const
Definition Object.h:382
Transport * GetTransport() const
Definition Object.h:564
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Object.cpp:2203
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1123
uint32 GetAreaId() const
Definition Object.h:374
uint32 GetZoneId() const
Definition Object.h:373
Player session in the World.
void SendNotification(const char *format,...) ATTR_PRINTF(2
AccountTypes GetSecurity() const
void KickPlayer(std::string const &reason)
Kick a player out of the World.
Player * GetPlayer() const
bool CanSpeak() const
bool HasPermission(uint32 permissionId)
uint32 GetAccountId() const
void SendShowMailBox(ObjectGuid guid)
void SendShowBank(ObjectGuid guid)
uint32 GetLatency() const
std::string const & GetPlayerName() const
time_t m_muteTime
static bool HandleDevCommand(ChatHandler *handler, Optional< bool > enableArg)
Definition cs_misc.cpp:161
static bool HandleGetDistanceCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:773
static bool HandleMuteHistoryHelper(uint32 accountId, char const *accountName, ChatHandler *handler)
Definition cs_misc.cpp:2136
static bool HandleDamageCommand(ChatHandler *handler, uint32 damage, Optional< SpellSchools > school, Optional< SpellInfo const * > spellInfo)
Definition cs_misc.cpp:2267
static bool HandleSaveCommand(ChatHandler *handler)
Definition cs_misc.cpp:859
static bool HandlePlayAllCommand(ChatHandler *handler, uint32 soundId)
Definition cs_misc.cpp:2597
static bool HandleAuraCommand(ChatHandler *handler, SpellInfo const *spell)
Definition cs_misc.cpp:306
static bool HandleUnbindSightCommand(ChatHandler *handler)
Definition cs_misc.cpp:2643
static bool HandleCooldownCommand(ChatHandler *handler, Optional< SpellInfo const * > spellArg)
Definition cs_misc.cpp:734
static bool HandleSummonCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:494
static bool HandleMuteCommand(ChatHandler *handler, Optional< PlayerIdentifier > player, uint32 muteTime, Tail muteReason)
Definition cs_misc.cpp:1992
static bool HandleBankCommand(ChatHandler *handler)
Definition cs_misc.cpp:1488
static bool HandleListFreezeCommand(ChatHandler *handler)
Definition cs_misc.cpp:2561
static bool HandleReviveCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:645
static bool HandleUnAuraCommand(ChatHandler *handler, Variant< SpellInfo const *, EXACT_SEQUENCE("all")> spellArg)
Definition cs_misc.cpp:327
static bool HandleShowAreaCommand(ChatHandler *handler, uint32 areaId)
Definition cs_misc.cpp:1090
ChatCommandTable GetCommands() const override
Definition cs_misc.cpp:71
static bool HandleCommandsCommand(ChatHandler *handler)
Definition cs_misc.cpp:613
static bool HandleMailBoxCommand(ChatHandler *handler)
Definition cs_misc.cpp:2654
static bool HandleDieCommand(ChatHandler *handler)
Definition cs_misc.cpp:619
static bool HandlePInfoCommand(ChatHandler *handler, Optional< PlayerIdentifier > arg)
Definition cs_misc.cpp:1587
static bool HandleKickPlayerCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:891
static bool HandleChangeWeather(ChatHandler *handler, WeatherType type, float intensity)
Definition cs_misc.cpp:1494
static bool HandleHelpCommand(ChatHandler *handler, Tail cmd)
Definition cs_misc.cpp:706
static bool HandleRespawnCommand(ChatHandler *handler)
Definition cs_misc.cpp:1952
static bool HandleAddItemToCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:1293
static bool HandleMovegensCommand(ChatHandler *handler)
Definition cs_misc.cpp:2167
static bool HandleGUIDCommand(ChatHandler *handler)
Definition cs_misc.cpp:691
static bool HandleAddItemSetCommand(ChatHandler *handler, Variant< Hyperlink< itemset >, uint32 > itemSetId)
Definition cs_misc.cpp:1434
static bool HandleGPSCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:185
static bool HandleSaveAllCommand(ChatHandler *handler)
Definition cs_misc.cpp:883
static bool HandleUnFreezeCommand(ChatHandler *handler, Optional< std::string > targetNameArg)
Definition cs_misc.cpp:2504
static bool HandleDamageGoCommand(ChatHandler *handler, Variant< Hyperlink< gameobject >, ObjectGuid::LowType > spawnId, int32 damage)
Definition cs_misc.cpp:2329
static bool HandleBindSightCommand(ChatHandler *handler)
Definition cs_misc.cpp:2633
static bool HandleComeToMeCommand(ChatHandler *handler)
Definition cs_misc.cpp:2250
static bool HandleAddItemCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:1158
static bool HandleUnPossessCommand(ChatHandler *handler)
Definition cs_misc.cpp:2622
static bool HandleNearGraveCommand(ChatHandler *handler, Optional< std::string > teamArg)
Definition cs_misc.cpp:1030
static bool HandleUnmuteCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:2067
static bool HandleDismountCommand(ChatHandler *handler)
Definition cs_misc.cpp:667
static bool HandleRecallCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:836
static bool HandleCombatStopCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:2351
static bool HandleHideAreaCommand(ChatHandler *handler, uint32 areaId)
Definition cs_misc.cpp:1124
static bool HandlePvPstatsCommand(ChatHandler *handler)
Definition cs_misc.cpp:132
static bool HandleMuteHistoryCommand(ChatHandler *handler, std::string accountName)
Definition cs_misc.cpp:2116
static bool HandleMaxSkillCommand(ChatHandler *handler)
Definition cs_misc.cpp:1520
static bool HandleFlushArenaPointsCommand(ChatHandler *)
Definition cs_misc.cpp:2380
static bool HandleLinkGraveCommand(ChatHandler *handler, uint32 graveyardId, Optional< std::string > teamArg)
Definition cs_misc.cpp:988
static bool HandleRepairitemsCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:2386
static bool HandleFreezeCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:2406
static bool HandleSetSkillCommand(ChatHandler *handler, Variant< Hyperlink< skill >, uint32 > skillId, uint32 level, Optional< uint32 > maxSkillArg)
Definition cs_misc.cpp:1535
static bool HandleItemMoveCommand(ChatHandler *handler, uint8 srcSlot, uint8 dstSlot)
Definition cs_misc.cpp:715
static bool HandlePossessCommand(ChatHandler *handler)
Definition cs_misc.cpp:2612
static bool HandleUnstuckCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:927
static bool HandleAppearCommand(ChatHandler *handler, char const *args)
Definition cs_misc.cpp:353
void AddSC_misc_commandscript()
Definition cs_misc.cpp:2663
#define sWorld
Definition World.h:900
Realm realm
Definition World.cpp:3605
void SetWeather(WeatherType type, float intensity)
Set the weather.
Definition Weather.cpp:275
@ CONFIG_MAX_PLAYER_LEVEL
Definition World.h:236
@ CONFIG_GM_FREEZE_DURATION
Definition World.h:262
@ CONFIG_INTERVAL_SAVE
Definition World.h:212
@ CONFIG_SHOW_KICK_IN_WORLD
Definition World.h:142
@ CONFIG_WEATHER
Definition World.h:111
@ CONFIG_SHOW_MUTE_IN_WORLD
Definition World.h:143
@ CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE
Definition World.h:127
@ CONFIG_DIE_COMMAND_MODE
Definition World.h:122
bool IsPathfindingEnabled(uint32 mapId)
time_t GetGameTime()
Definition GameTime.cpp:42
TC_GAME_API Player * FindPlayerByName(std::string_view name)
TC_GAME_API void SaveAllPlayers()
TC_GAME_API Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API void SendCommandHelpFor(ChatHandler &handler, std::string_view cmd)
std::vector< ChatCommandBuilder > ChatCommandTable
Definition ChatCommand.h:50
GridCoord ComputeGridCoord(float x, float y)
CellCoord ComputeCellCoord(float x, float y)
@ RBAC_PERM_COMMAND_COMMANDS
Definition RBAC.h:366
@ RBAC_PERM_COMMAND_DISMOUNT
Definition RBAC.h:371
@ RBAC_PERM_COMMAND_FLUSHARENAPOINTS
Definition RBAC.h:373
@ RBAC_PERM_COMMAND_POSSESS
Definition RBAC.h:389
@ RBAC_PERM_COMMAND_NEARGRAVE
Definition RBAC.h:386
@ RBAC_PERM_COMMAND_PLAYALL
Definition RBAC.h:388
@ RBAC_PERM_COMMAND_UNFREEZE
Definition RBAC.h:401
@ RBAC_PERM_COMMAND_MUTE
Definition RBAC.h:385
@ RBAC_PERM_COMMAND_HIDEAREA
Definition RBAC.h:378
@ RBAC_PERM_COMMAND_SHOWAREA
Definition RBAC.h:397
@ RBAC_PERM_COMMAND_REPAIRITEMS
Definition RBAC.h:391
@ RBAC_PERM_COMMAND_BINDSIGHT
Definition RBAC.h:363
@ RBAC_PERM_COMMAND_ADDITEM
Definition RBAC.h:358
@ RBAC_PERM_COMMAND_DEV
Definition RBAC.h:369
@ RBAC_PERM_COMMAND_RESPAWN
Definition RBAC.h:392
@ RBAC_PERM_COMMAND_PVPSTATS
Definition RBAC.h:667
@ RBAC_PERM_COMMAND_UNMUTE
Definition RBAC.h:402
@ RBAC_PERM_COMMAND_HELP
Definition RBAC.h:377
@ RBAC_PERM_COMMAND_COOLDOWN
Definition RBAC.h:367
@ RBAC_PERM_COMMAND_COMETOME
Definition RBAC.h:365
@ RBAC_PERM_COMMAND_COMBATSTOP
Definition RBAC.h:364
@ RBAC_PERM_COMMAND_SETSKILL
Definition RBAC.h:396
@ RBAC_PERM_COMMAND_ADDITEMSET
Definition RBAC.h:359
@ RBAC_PERM_COMMAND_AURA
Definition RBAC.h:361
@ RBAC_PERM_COMMANDS_SAVE_WITHOUT_DELAY
Definition RBAC.h:83
@ RBAC_PERM_COMMAND_MOVEGENS
Definition RBAC.h:384
@ RBAC_PERM_COMMAND_UNSTUCK
Definition RBAC.h:404
@ RBAC_PERM_COMMAND_REVIVE
Definition RBAC.h:393
@ RBAC_PERM_COMMAND_APPEAR
Definition RBAC.h:360
@ RBAC_PERM_COMMAND_FREEZE
Definition RBAC.h:374
@ RBAC_PERM_COMMAND_BANK
Definition RBAC.h:362
@ RBAC_PERM_COMMAND_GPS
Definition RBAC.h:375
@ RBAC_PERM_COMMAND_UNPOSSESS
Definition RBAC.h:403
@ RBAC_PERM_COMMAND_MAXSKILL
Definition RBAC.h:383
@ RBAC_PERM_COMMAND_SUMMON
Definition RBAC.h:398
@ RBAC_PERM_COMMAND_RECALL
Definition RBAC.h:390
@ RBAC_PERM_COMMAND_DIE
Definition RBAC.h:370
@ RBAC_PERM_COMMAND_ITEMMOVE
Definition RBAC.h:379
@ RBAC_PERM_COMMAND_MAILBOX
Definition RBAC.h:647
@ RBAC_PERM_COMMAND_SAVE
Definition RBAC.h:395
@ RBAC_PERM_COMMAND_LISTFREEZE
Definition RBAC.h:382
@ RBAC_PERM_COMMAND_UNBINDSIGHT
Definition RBAC.h:400
@ RBAC_PERM_COMMANDS_USE_UNSTUCK_WITH_ARGS
Definition RBAC.h:84
@ RBAC_PERM_COMMAND_DAMAGE
Definition RBAC.h:368
@ RBAC_PERM_RESURRECT_WITH_FULL_HPS
Definition RBAC.h:91
@ RBAC_PERM_COMMAND_UNAURA
Definition RBAC.h:399
@ RBAC_PERM_COMMAND_KICK
Definition RBAC.h:380
@ RBAC_PERM_COMMAND_WCHANGE
Definition RBAC.h:405
@ RBAC_PERM_COMMAND_LINKGRAVE
Definition RBAC.h:381
@ RBAC_PERM_COMMAND_SAVEALL
Definition RBAC.h:394
@ RBAC_PERM_COMMANDS_PINFO_CHECK_PERSONAL_DATA
Definition RBAC.h:101
@ RBAC_PERM_COMMAND_PINFO
Definition RBAC.h:387
@ RBAC_PERM_COMMAND_MUTEHISTORY
Definition RBAC.h:502
@ RBAC_PERM_COMMAND_GUID
Definition RBAC.h:376
@ RBAC_PERM_COMMAND_DISTANCE
Definition RBAC.h:372
char const * AreaName[16]
AuraCreateInfo & SetCaster(Unit *caster)
Definition Cell.h:47
uint32 GridX() const
Definition Cell.h:72
static void VisitGridObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:168
uint32 GridY() const
Definition Cell.h:73
uint32 CellX() const
Definition Cell.h:70
uint32 CellY() const
Definition Cell.h:71
uint32 x_coord
uint32 y_coord
uint32 GetId() const
uint32 entry
Definition MapDefines.h:88
float depth_level
Definition MapDefines.h:90
uint32 type_flags
Definition MapDefines.h:87
float level
Definition MapDefines.h:89
char const * MapName[16]
float GetExactDist2d(const float x, const float y) const
Definition Position.h:109
float GetExactDist(float x, float y, float z) const
Definition Position.h:121
float GetPositionZ() const
Definition Position.h:81
float GetOrientation() const
Definition Position.h:82
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:128
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
uint32 Realm
Definition Realm.h:44
RealmHandle Id
Definition Realm.h:67
char const * DisplayName[16]
static Optional< PlayerIdentifier > FromTarget(ChatHandler *handler)
static Optional< PlayerIdentifier > FromTargetOrSelf(ChatHandler *handler)
struct GameObjectValue::@190 Building