TrinityCore
Loading...
Searching...
No Matches
cs_modify.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/* ScriptData
19Name: modify_commandscript
20%Complete: 100
21Comment: All modify related commands
22Category: commandscripts
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "Chat.h"
27#include "DBCStores.h"
28#include "Log.h"
29#include "ObjectMgr.h"
30#include "Opcodes.h"
31#include "Pet.h"
32#include "Player.h"
33#include "RBAC.h"
34#include "ReputationMgr.h"
35#include "Util.h"
36#include "WorldSession.h"
37
38#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
39#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
40#endif
41
43{
44public:
45 modify_commandscript() : CommandScript("modify_commandscript") { }
46
47 std::vector<ChatCommand> GetCommands() const override
48 {
49 static std::vector<ChatCommand> modifyspeedCommandTable =
50 {
57 };
58 static std::vector<ChatCommand> modifyCommandTable =
59 {
76 { "speed", rbac::RBAC_PERM_COMMAND_MODIFY_SPEED, false, nullptr, "", modifyspeedCommandTable },
81 };
82 static std::vector<ChatCommand> commandTable =
83 {
85 { "demorph", rbac::RBAC_PERM_COMMAND_DEMORPH, false, &HandleDeMorphCommand, "" },
86 { "modify", rbac::RBAC_PERM_COMMAND_MODIFY, false, nullptr, "", modifyCommandTable },
87 };
88 return commandTable;
89 }
90
91 template<typename... Args>
92 static void NotifyModification(ChatHandler* handler, Unit* target, TrinityStrings resourceMessage, TrinityStrings resourceReportMessage, Args&&... args)
93 {
94 if (Player* player = target->ToPlayer())
95 {
96 handler->PSendSysMessage(resourceMessage, handler->GetNameLink(player).c_str(), args...);
97 if (handler->needReportToTarget(player))
98 ChatHandler(player->GetSession()).PSendSysMessage(resourceReportMessage, handler->GetNameLink().c_str(), std::forward<Args>(args)...);
99 }
100 }
101
102 static bool CheckModifyResources(ChatHandler* handler, char const* args, Player* target, int32& res, int32& resmax, int8 const multiplier = 1)
103 {
104 if (!*args)
105 return false;
106
107 res = atoi((char*)args) * multiplier;
108 resmax = atoi((char*)args) * multiplier;
109
110 if (res < 1 || resmax < 1 || resmax < res)
111 {
113 handler->SetSentErrorMessage(true);
114 return false;
115 }
116
117 if (!target)
118 {
120 handler->SetSentErrorMessage(true);
121 return false;
122 }
123
124 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
125 return false;
126
127 return true;
128 }
129
130 //Edit Player HP
131 static bool HandleModifyHPCommand(ChatHandler* handler, char const* args)
132 {
133 int32 hp, hpmax;
134 Player* target = handler->getSelectedPlayerOrSelf();
135 if (CheckModifyResources(handler, args, target, hp, hpmax))
136 {
137 NotifyModification(handler, target, LANG_YOU_CHANGE_HP, LANG_YOURS_HP_CHANGED, hp, hpmax);
138 target->SetMaxHealth(hpmax);
139 target->SetHealth(hp);
140 return true;
141 }
142 return false;
143 }
144
145 //Edit Player Mana
146 static bool HandleModifyManaCommand(ChatHandler* handler, char const* args)
147 {
148 int32 mana, manamax;
149 Player* target = handler->getSelectedPlayerOrSelf();
150
151 if (CheckModifyResources(handler, args, target, mana, manamax))
152 {
153 NotifyModification(handler, target, LANG_YOU_CHANGE_MANA, LANG_YOURS_MANA_CHANGED, mana, manamax);
154 target->SetMaxPower(POWER_MANA, manamax);
155 target->SetPower(POWER_MANA, mana);
156 return true;
157 }
158 return false;
159 }
160
161 //Edit Player Energy
162 static bool HandleModifyEnergyCommand(ChatHandler* handler, char const* args)
163 {
164 int32 energy, energymax;
165 Player* target = handler->getSelectedPlayerOrSelf();
166 int8 const energyMultiplier = 10;
167 if (CheckModifyResources(handler, args, target, energy, energymax, energyMultiplier))
168 {
169 NotifyModification(handler, target, LANG_YOU_CHANGE_ENERGY, LANG_YOURS_ENERGY_CHANGED, energy / energyMultiplier, energymax / energyMultiplier);
170 target->SetMaxPower(POWER_ENERGY, energymax);
171 target->SetPower(POWER_ENERGY, energy);
172 return true;
173 }
174 return false;
175 }
176
177 //Edit Player Rage
178 static bool HandleModifyRageCommand(ChatHandler* handler, char const* args)
179 {
180 int32 rage, ragemax;
181 Player* target = handler->getSelectedPlayerOrSelf();
182 int8 const rageMultiplier = 10;
183 if (CheckModifyResources(handler, args, target, rage, ragemax, rageMultiplier))
184 {
185 NotifyModification(handler, target, LANG_YOU_CHANGE_RAGE, LANG_YOURS_RAGE_CHANGED, rage / rageMultiplier, ragemax / rageMultiplier);
186 target->SetMaxPower(POWER_RAGE, ragemax);
187 target->SetPower(POWER_RAGE, rage);
188 return true;
189 }
190 return false;
191 }
192
193 // Edit Player Runic Power
194 static bool HandleModifyRunicPowerCommand(ChatHandler* handler, char const* args)
195 {
196 int32 rune, runemax;
197 Player* target = handler->getSelectedPlayerOrSelf();
198 int8 const runeMultiplier = 10;
199 if (CheckModifyResources(handler, args, target, rune, runemax, runeMultiplier))
200 {
201 NotifyModification(handler, target, LANG_YOU_CHANGE_RUNIC_POWER, LANG_YOURS_RUNIC_POWER_CHANGED, rune / runeMultiplier, runemax / runeMultiplier);
202 target->SetMaxPower(POWER_RUNIC_POWER, runemax);
203 target->SetPower(POWER_RUNIC_POWER, rune);
204 return true;
205 }
206 return false;
207 }
208
209 //Edit Player Faction
211 {
212 Creature* target = handler->getSelectedCreature();
213 if (!target)
214 {
216 handler->SetSentErrorMessage(true);
217 return false;
218 }
219
220 if (!flag)
221 flag = target->GetUnitFlags();
222
223 if (!npcflag)
224 npcflag = target->GetNpcFlags();
225
226 if (!dyflag)
227 dyflag = target->GetDynamicFlags();
228
229 if (!factionid)
230 {
231 handler->PSendSysMessage(LANG_CURRENT_FACTION, target->GetGUID().ToString().c_str(), *factionid, *flag, *npcflag, *dyflag);
232 return true;
233 }
234
235 if (!sFactionTemplateStore.LookupEntry(*factionid))
236 {
237 handler->PSendSysMessage(LANG_WRONG_FACTION, *factionid);
238 handler->SetSentErrorMessage(true);
239 return false;
240 }
241
242 handler->PSendSysMessage(LANG_YOU_CHANGE_FACTION, target->GetGUID().ToString().c_str(), *factionid, *flag, *npcflag, *dyflag);
243
244 target->SetFaction(*factionid);
245 target->ReplaceAllUnitFlags(UnitFlags(*flag));
246 target->ReplaceAllNpcFlags(NPCFlags(*npcflag));
247 target->ReplaceAllDynamicFlags(*dyflag);
248
249 return true;
250 }
251
252 //Edit Player Spell
253 static bool HandleModifySpellCommand(ChatHandler* handler, char const* args)
254 {
255 if (!*args)
256 return false;
257
258 char* pspellflatid = strtok((char*)args, " ");
259 if (!pspellflatid)
260 return false;
261
262 char* pop = strtok(nullptr, " ");
263 if (!pop)
264 return false;
265
266 char* pval = strtok(nullptr, " ");
267 if (!pval)
268 return false;
269
270 uint16 mark;
271
272 char* pmark = strtok(nullptr, " ");
273
274 uint8 spellflatid = atoi(pspellflatid);
275 uint8 op = atoi(pop);
276 uint16 val = atoi(pval);
277 if (!pmark)
278 mark = 65535;
279 else
280 mark = atoi(pmark);
281
282 Player* target = handler->getSelectedPlayerOrSelf();
283 if (target == nullptr)
284 {
286 handler->SetSentErrorMessage(true);
287 return false;
288 }
289
290 // check online security
291 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
292 return false;
293
294 handler->PSendSysMessage(LANG_YOU_CHANGE_SPELLFLATID, spellflatid, val, mark, handler->GetNameLink(target).c_str());
295 if (handler->needReportToTarget(target))
296 ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, handler->GetNameLink().c_str(), spellflatid, val, mark);
297
299 data << uint8(spellflatid);
300 data << uint8(op);
301 data << uint16(val);
302 data << uint16(mark);
303 target->SendDirectMessage(&data);
304
305 return true;
306 }
307
308 //Edit Player TP
309 static bool HandleModifyTalentCommand (ChatHandler* handler, char const* args)
310 {
311 if (!*args)
312 return false;
313
314 int tp = atoi((char*)args);
315 if (tp < 0)
316 return false;
317
318 Unit* target = handler->getSelectedUnit();
319 if (!target)
320 {
322 handler->SetSentErrorMessage(true);
323 return false;
324 }
325
326 if (target->GetTypeId() == TYPEID_PLAYER)
327 {
328 // check online security
329 if (handler->HasLowerSecurity(target->ToPlayer(), ObjectGuid::Empty))
330 return false;
331 target->ToPlayer()->SetFreeTalentPoints(tp);
332 target->ToPlayer()->SendTalentsInfoData(false);
333 return true;
334 }
335 else if (target->IsPet())
336 {
337 Unit* owner = target->GetOwner();
338 if (owner && owner->GetTypeId() == TYPEID_PLAYER && ((Pet*)target)->IsPermanentPetFor(owner->ToPlayer()))
339 {
340 // check online security
341 if (handler->HasLowerSecurity(owner->ToPlayer(), ObjectGuid::Empty))
342 return false;
343 ((Pet*)target)->SetFreeTalentPoints(tp);
344 owner->ToPlayer()->SendTalentsInfoData(true);
345 return true;
346 }
347 }
348
350 handler->SetSentErrorMessage(true);
351 return false;
352 }
353
354 static bool CheckModifySpeed(ChatHandler* handler, Unit* target, float speed, float minimumBound, float maximumBound, bool checkInFlight = true)
355 {
356 if (speed > maximumBound || speed < minimumBound)
357 {
359 handler->SetSentErrorMessage(true);
360 return false;
361 }
362
363 if (!target)
364 {
366 handler->SetSentErrorMessage(true);
367 return false;
368 }
369
370 if (Player* player = target->ToPlayer())
371 {
372 // check online security
373 if (handler->HasLowerSecurity(player, ObjectGuid::Empty))
374 return false;
375
376 if (player->IsInFlight() && checkInFlight)
377 {
378 handler->PSendSysMessage(LANG_CHAR_IN_FLIGHT, handler->GetNameLink(player).c_str());
379 handler->SetSentErrorMessage(true);
380 return false;
381 }
382 }
383 return true;
384 }
385
386 static bool CheckModifySpeed(ChatHandler* handler, char const* args, Unit* target, float& speed, float minimumBound, float maximumBound, bool checkInFlight = true)
387 {
388 if (!*args)
389 return false;
390
391 speed = (float)atof((char*)args);
392 return CheckModifySpeed(handler, target, speed, minimumBound, maximumBound, checkInFlight);
393 }
394
395 //Edit Player Aspeed
396 static bool HandleModifyASpeedCommand(ChatHandler* handler, char const* args)
397 {
398 float allSpeed;
399 Player* target = handler->getSelectedPlayerOrSelf();
400 if (CheckModifySpeed(handler, args, target, allSpeed, 0.1f, 50.0f))
401 {
403 target->SetSpeedRate(MOVE_WALK, allSpeed);
404 target->SetSpeedRate(MOVE_RUN, allSpeed);
405 target->SetSpeedRate(MOVE_SWIM, allSpeed);
406 target->SetSpeedRate(MOVE_FLIGHT, allSpeed);
407 return true;
408 }
409 return false;
410 }
411
412 //Edit Player Speed
413 static bool HandleModifySpeedCommand(ChatHandler* handler, char const* args)
414 {
415 float Speed;
416 Player* target = handler->getSelectedPlayerOrSelf();
417 if (CheckModifySpeed(handler, args, target, Speed, 0.1f, 50.0f))
418 {
420 target->SetSpeedRate(MOVE_RUN, Speed);
421 return true;
422 }
423 return false;
424 }
425
426 //Edit Player Swim Speed
427 static bool HandleModifySwimCommand(ChatHandler* handler, char const* args)
428 {
429 float swimSpeed;
430 Player* target = handler->getSelectedPlayerOrSelf();
431 if (CheckModifySpeed(handler, args, target, swimSpeed, 0.1f, 50.0f))
432 {
434 target->SetSpeedRate(MOVE_SWIM, swimSpeed);
435 return true;
436 }
437 return false;
438 }
439
440 //Edit Player Backwards Walk Speed
441 static bool HandleModifyBWalkCommand(ChatHandler* handler, char const* args)
442 {
443 float backSpeed;
444 Player* target = handler->getSelectedPlayerOrSelf();
445 if (CheckModifySpeed(handler, args, target, backSpeed, 0.1f, 50.0f))
446 {
448 target->SetSpeedRate(MOVE_RUN_BACK, backSpeed);
449 return true;
450 }
451 return false;
452 }
453
454 //Edit Player Fly
455 static bool HandleModifyFlyCommand(ChatHandler* handler, char const* args)
456 {
457 float flySpeed;
458 Player* target = handler->getSelectedPlayerOrSelf();
459 if (CheckModifySpeed(handler, args, target, flySpeed, 0.1f, 50.0f, false))
460 {
462 target->SetSpeedRate(MOVE_FLIGHT, flySpeed);
463 return true;
464 }
465 return false;
466 }
467
468 //Edit Player or Creature Scale
469 static bool HandleModifyScaleCommand(ChatHandler* handler, char const* args)
470 {
471 float Scale;
472 Unit* target = handler->getSelectedUnit();
473 if (CheckModifySpeed(handler, args, target, Scale, 0.1f, 10.0f, false))
474 {
476 target->SetObjectScale(Scale);
477 return true;
478 }
479 return false;
480 }
481
482 //Enable Player mount
483 static bool HandleModifyMountCommand(ChatHandler* handler, uint32 mount, float speed)
484 {
485 if (!sCreatureDisplayInfoStore.LookupEntry(mount))
486 {
488 handler->SetSentErrorMessage(true);
489 return false;
490 }
491
492 Player* target = handler->getSelectedPlayerOrSelf();
493 if (!target)
494 {
496 handler->SetSentErrorMessage(true);
497 return false;
498 }
499
500 // check online security
501 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
502 return false;
503
504 if (!CheckModifySpeed(handler, target, speed, 0.1f, 50.0f))
505 return false;
506
508 target->Mount(mount);
509 target->SetSpeedRate(MOVE_RUN, speed);
510 target->SetSpeedRate(MOVE_FLIGHT, speed);
511 return true;
512 }
513
514 //Edit Player money
515 static bool HandleModifyMoneyCommand(ChatHandler* handler, char const* args)
516 {
517 if (!*args)
518 return false;
519
520 Player* target = handler->getSelectedPlayerOrSelf();
521 if (!target)
522 {
524 handler->SetSentErrorMessage(true);
525 return false;
526 }
527
528 // check online security
529 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
530 return false;
531
532 Optional<int32> moneyToAddO = 0;
533 if (strchr(args, 'g') || strchr(args, 's') || strchr(args, 'c'))
534 moneyToAddO = MoneyStringToMoney(std::string(args));
535 else
536 moneyToAddO = Trinity::StringTo<int32>(args);
537
538 if (!moneyToAddO)
539 return false;
540
541 int32 moneyToAdd = *moneyToAddO;
542
543 uint32 targetMoney = target->GetMoney();
544
545 if (moneyToAdd < 0)
546 {
547 int32 newmoney = int32(targetMoney) + moneyToAdd;
548
549 TC_LOG_DEBUG("misc", "{}", handler->PGetParseString(LANG_CURRENT_MONEY, targetMoney, moneyToAdd, newmoney));
550 if (newmoney <= 0)
551 {
553 target->SetMoney(0);
554 }
555 else
556 {
557 uint32 moneyToAddMsg = moneyToAdd * -1;
558 if (newmoney > static_cast<int32>(MAX_MONEY_AMOUNT))
559 newmoney = MAX_MONEY_AMOUNT;
560
561 handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, moneyToAddMsg, handler->GetNameLink(target).c_str());
562 if (handler->needReportToTarget(target))
563 ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink().c_str(), moneyToAddMsg);
564 target->SetMoney(newmoney);
565 }
566 }
567 else
568 {
569 handler->PSendSysMessage(LANG_YOU_GIVE_MONEY, moneyToAdd, handler->GetNameLink(target).c_str());
570 if (handler->needReportToTarget(target))
571 ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), moneyToAdd);
572
573 if (targetMoney >= MAX_MONEY_AMOUNT - moneyToAdd)
574 moneyToAdd -= targetMoney;
575
576 target->ModifyMoney(moneyToAdd);
577 }
578
579 TC_LOG_DEBUG("misc", "{}", handler->PGetParseString(LANG_NEW_MONEY, targetMoney, moneyToAdd, target->GetMoney()));
580
581 return true;
582 }
583
584 //Edit Unit field
585 static bool HandleModifyBitCommand(ChatHandler* handler, char const* args)
586 {
587 if (!*args)
588 return false;
589
590 Unit* target = handler->getSelectedUnit();
591 if (!target)
592 {
594 handler->SetSentErrorMessage(true);
595 return false;
596 }
597
598 // check online security
599 if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), ObjectGuid::Empty))
600 return false;
601
602 char* pField = strtok((char*)args, " ");
603 if (!pField)
604 return false;
605
606 char* pBit = strtok(nullptr, " ");
607 if (!pBit)
608 return false;
609
610 uint16 field = atoi(pField);
611 uint32 bit = atoi(pBit);
612
613 if (field < OBJECT_END || field >= target->GetValuesCount())
614 {
616 handler->SetSentErrorMessage(true);
617 return false;
618 }
619 if (bit < 1 || bit > 32)
620 {
622 handler->SetSentErrorMessage(true);
623 return false;
624 }
625
626 if (target->HasFlag(field, (1<<(bit-1))))
627 {
628 target->RemoveFlag(field, (1<<(bit-1)));
629 handler->PSendSysMessage(LANG_REMOVE_BIT, bit, field);
630 }
631 else
632 {
633 target->SetFlag(field, (1<<(bit-1)));
634 handler->PSendSysMessage(LANG_SET_BIT, bit, field);
635 }
636 return true;
637 }
638
639 static bool HandleModifyHonorCommand (ChatHandler* handler, char const* args)
640 {
641 if (!*args)
642 return false;
643
644 Player* target = handler->getSelectedPlayerOrSelf();
645 if (!target)
646 {
648 handler->SetSentErrorMessage(true);
649 return false;
650 }
651
652 // check online security
653 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
654 return false;
655
656 int32 amount = (uint32)atoi(args);
657
658 target->ModifyHonorPoints(amount);
659
660 handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target).c_str(), target->GetHonorPoints());
661
662 return true;
663 }
664
665 static bool HandleModifyDrunkCommand(ChatHandler* handler, char const* args)
666 {
667 if (!*args)
668 return false;
669
670 uint8 drunklevel = (uint8)atoi(args);
671 if (drunklevel > 100)
672 drunklevel = 100;
673
674 if (Player* target = handler->getSelectedPlayerOrSelf())
675 target->SetDrunkValue(drunklevel);
676
677 return true;
678 }
679
680 static bool HandleModifyRepCommand(ChatHandler* handler, char const* args)
681 {
682 if (!*args)
683 return false;
684
685 Player* target = handler->getSelectedPlayerOrSelf();
686 if (!target)
687 {
689 handler->SetSentErrorMessage(true);
690 return false;
691 }
692
693 // check online security
694 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
695 return false;
696
697 char* factionTxt = handler->extractKeyFromLink((char*)args, "Hfaction");
698 if (!factionTxt)
699 return false;
700
701 uint32 factionId = atoi(factionTxt);
702
703 int32 amount = 0;
704 char *rankTxt = strtok(nullptr, " ");
705 if (!factionId || !rankTxt)
706 return false;
707
708 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
709
710 if (!factionEntry)
711 {
713 handler->SetSentErrorMessage(true);
714 return false;
715 }
716
717 if (factionEntry->ReputationIndex < 0)
718 {
719 handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->Name[handler->GetSessionDbcLocale()], factionId);
720 handler->SetSentErrorMessage(true);
721 return false;
722 }
723
724 amount = atoi(rankTxt);
725 // try to find rank by name
726 if ((amount == 0) && (rankTxt[0] != '-') && !isdigit((unsigned char)rankTxt[0]))
727 {
728 std::string rankStr = rankTxt;
729 std::wstring wrankStr;
730 if (!Utf8toWStr(rankStr, wrankStr))
731 return false;
732
733 wstrToLower(wrankStr);
734
735 auto rankThresholdItr = ReputationMgr::ReputationRankThresholds.begin();
737
738 int32 r = 0;
739
740 for (; rankThresholdItr != end; ++rankThresholdItr, ++r)
741 {
742 std::string rank = handler->GetTrinityString(ReputationRankStrIndex[r]);
743 if (rank.empty())
744 continue;
745
746 std::wstring wrank;
747 if (!Utf8toWStr(rank, wrank))
748 continue;
749
750 wstrToLower(wrank);
751
752 if (wrank.substr(0, wrankStr.size()) == wrankStr)
753 break;
754 }
755
756 if (rankThresholdItr == end)
757 {
759 handler->SetSentErrorMessage(true);
760 return false;
761 }
762
763 amount = *rankThresholdItr;
764
765 char *deltaTxt = strtok(nullptr, " ");
766 if (deltaTxt)
767 {
768 int32 toNextRank = 0;
769 auto nextThresholdItr = rankThresholdItr;
770 ++nextThresholdItr;
771 if (nextThresholdItr != end)
772 toNextRank = *nextThresholdItr - *rankThresholdItr;
773
774 int32 delta = atoi(deltaTxt);
775 if (delta < 0 || delta >= toNextRank)
776 {
777 handler->PSendSysMessage(LANG_COMMAND_FACTION_DELTA, std::max(0, toNextRank - 1));
778 handler->SetSentErrorMessage(true);
779 return false;
780 }
781 amount += delta;
782 }
783 }
784
785 target->GetReputationMgr().SetOneFactionReputation(factionEntry, amount, false);
786 target->GetReputationMgr().SendState(target->GetReputationMgr().GetState(factionEntry));
787 handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->Name[handler->GetSessionDbcLocale()], factionId,
788 handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry));
789 return true;
790 }
791
792 //morph creature or player
793 static bool HandleModifyMorphCommand(ChatHandler* handler, uint32 display_id)
794 {
795 Unit* target = handler->getSelectedUnit();
796 if (!target)
797 target = handler->GetSession()->GetPlayer();
798
799 // check online security
800 else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), ObjectGuid::Empty))
801 return false;
802
803 target->SetDisplayId(display_id);
804
805 return true;
806 }
807
808 //set temporary phase mask for player
809 static bool HandleModifyPhaseCommand(ChatHandler* handler, uint32 phasemask)
810 {
811 Unit* target = handler->getSelectedUnit();
812 if (!target)
813 target = handler->GetSession()->GetPlayer();
814
815 // check online security
816 else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), ObjectGuid::Empty))
817 return false;
818
819 target->SetPhaseMask(phasemask, true);
820 return true;
821 }
822
823 //change standstate
824 static bool HandleModifyStandStateCommand(ChatHandler* handler, char const* args)
825 {
826 if (!*args)
827 return false;
828
829 uint32 anim_id = atoi((char*)args);
830 handler->GetSession()->GetPlayer()->SetEmoteState(Emote(anim_id));
831
832 return true;
833 }
834
835 static bool HandleModifyArenaCommand(ChatHandler* handler, char const* args)
836 {
837 if (!*args)
838 return false;
839
840 Player* target = handler->getSelectedPlayerOrSelf();
841 if (!target)
842 {
844 handler->SetSentErrorMessage(true);
845 return false;
846 }
847
848 int32 amount = (uint32)atoi(args);
849
850 target->ModifyArenaPoints(amount);
851
852 handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target).c_str(), target->GetArenaPoints());
853
854 return true;
855 }
856
857 static bool HandleModifyGenderCommand(ChatHandler* handler, char const* args)
858 {
859 if (!*args)
860 return false;
861
862 Player* target = handler->getSelectedPlayerOrSelf();
863
864 if (!target)
865 {
867 handler->SetSentErrorMessage(true);
868 return false;
869 }
870
871 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(target->GetRace(), target->GetClass());
872 if (!info)
873 return false;
874
875 char const* gender_str = (char*)args;
876 int gender_len = strlen(gender_str);
877
878 Gender gender;
879
880 if (!strncmp(gender_str, "male", gender_len)) // MALE
881 {
882 if (target->GetGender() == GENDER_MALE)
883 return true;
884
885 gender = GENDER_MALE;
886 }
887 else if (!strncmp(gender_str, "female", gender_len)) // FEMALE
888 {
889 if (target->GetGender() == GENDER_FEMALE)
890 return true;
891
892 gender = GENDER_FEMALE;
893 }
894 else
895 {
897 handler->SetSentErrorMessage(true);
898 return false;
899 }
900
901 // Set gender
902 target->SetGender(gender);
903 target->SetNativeGender(gender);
904
905 // Change display ID
906 target->InitDisplayIds();
907
908 char const* gender_full = gender ? "female" : "male";
909
910 handler->PSendSysMessage(LANG_YOU_CHANGE_GENDER, handler->GetNameLink(target).c_str(), gender_full);
911
912 if (handler->needReportToTarget(target))
913 ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_GENDER_CHANGED, gender_full, handler->GetNameLink().c_str());
914
915 return true;
916 }
917//demorph player or unit
918 static bool HandleDeMorphCommand(ChatHandler* handler, char const* /*args*/)
919 {
920 Unit* target = handler->getSelectedUnit();
921 if (!target)
922 target = handler->GetSession()->GetPlayer();
923
924 // check online security
925 else if (target->GetTypeId() == TYPEID_PLAYER && handler->HasLowerSecurity(target->ToPlayer(), ObjectGuid::Empty))
926 return false;
927
928 target->DeMorph();
929
930 return true;
931 }
932
933 // mod xp command
934 static bool HandleModifyXPCommand(ChatHandler *handler, char const* args)
935 {
936 if (!*args)
937 return false;
938
939 int32 xp = atoi((char*)args);
940
941 if (xp < 1)
942 {
944 handler->SetSentErrorMessage(true);
945 return false;
946 }
947
948 Player* target = handler->getSelectedPlayerOrSelf();
949 if (!target)
950 {
952 handler->SetSentErrorMessage(true);
953 return false;
954 }
955
956 if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
957 return false;
958
959 // we can run the command
960 target->GiveXP(xp, nullptr);
961 return true;
962 }
963};
964
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
uint8_t uint8
Definition Define.h:135
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
TrinityStrings
Definition Language.h:29
@ LANG_CURRENT_MONEY
Definition Language.h:191
@ LANG_MUST_MALE_OR_FEMALE
Definition Language.h:895
@ LANG_NO_MOUNT
Definition Language.h:187
@ LANG_YOURS_ASPEED_CHANGED
Definition Language.h:175
@ LANG_YOU_CHANGE_SIZE
Definition Language.h:185
@ LANG_SELECT_CREATURE
Definition Language.h:32
@ LANG_YOURS_MANA_CHANGED
Definition Language.h:156
@ LANG_COMMAND_FACTION_UNKNOWN
Definition Language.h:363
@ LANG_YOURS_FLY_SPEED_CHANGED
Definition Language.h:183
@ LANG_COMMAND_FACTION_DELTA
Definition Language.h:365
@ LANG_YOURS_SWIM_SPEED_CHANGED
Definition Language.h:179
@ LANG_YOU_TAKE_ALL_MONEY
Definition Language.h:192
@ LANG_YOU_GIVE_MOUNT
Definition Language.h:188
@ LANG_YOURS_MONEY_TAKEN
Definition Language.h:195
@ LANG_YOU_CHANGE_RAGE
Definition Language.h:161
@ LANG_YOURS_ALL_MONEY_GONE
Definition Language.h:193
@ LANG_YOU_CHANGE_SPEED
Definition Language.h:176
@ LANG_YOU_TAKE_MONEY
Definition Language.h:194
@ LANG_YOURS_SPEED_CHANGED
Definition Language.h:177
@ LANG_REMOVE_BIT
Definition Language.h:202
@ LANG_WRONG_FACTION
Definition Language.h:165
@ LANG_YOURS_MONEY_GIVEN
Definition Language.h:197
@ LANG_YOURS_HP_CHANGED
Definition Language.h:154
@ LANG_YOURS_SIZE_CHANGED
Definition Language.h:186
@ LANG_YOU_CHANGE_ENERGY
Definition Language.h:157
@ LANG_CURRENT_FACTION
Definition Language.h:164
@ LANG_YOU_CHANGE_HP
Definition Language.h:153
@ LANG_YOU_CHANGE_RUNIC_POWER
Definition Language.h:215
@ LANG_COMMAND_MODIFY_HONOR
Definition Language.h:352
@ LANG_NEW_MONEY
Definition Language.h:200
@ LANG_YOURS_SPELLFLATID_CHANGED
Definition Language.h:168
@ LANG_YOU_CHANGE_FLY_SPEED
Definition Language.h:182
@ LANG_YOU_CHANGE_FACTION
Definition Language.h:166
@ LANG_YOU_CHANGE_ASPEED
Definition Language.h:174
@ LANG_YOURS_RAGE_CHANGED
Definition Language.h:162
@ LANG_NO_CHAR_SELECTED
Definition Language.h:150
@ LANG_COMMAND_FACTION_NOREP_ERROR
Definition Language.h:381
@ LANG_YOU_CHANGE_BACK_SPEED
Definition Language.h:180
@ LANG_COMMAND_MODIFY_ARENA
Definition Language.h:361
@ LANG_PLAYER_NOT_FOUND
Definition Language.h:570
@ LANG_COMMAND_INVALID_PARAM
Definition Language.h:364
@ LANG_YOU_CHANGE_GENDER
Definition Language.h:896
@ LANG_SET_BIT
Definition Language.h:203
@ LANG_BAD_VALUE
Definition Language.h:149
@ LANG_YOU_CHANGE_SPELLFLATID
Definition Language.h:167
@ LANG_YOURS_ENERGY_CHANGED
Definition Language.h:158
@ LANG_COMMAND_MODIFY_REP
Definition Language.h:360
@ LANG_YOURS_BACK_SPEED_CHANGED
Definition Language.h:181
@ LANG_YOURS_RUNIC_POWER_CHANGED
Definition Language.h:216
@ LANG_CHAR_IN_FLIGHT
Definition Language.h:53
@ LANG_MOUNT_GIVED
Definition Language.h:189
@ LANG_YOU_CHANGE_SWIM_SPEED
Definition Language.h:178
@ LANG_YOUR_GENDER_CHANGED
Definition Language.h:897
@ LANG_YOU_GIVE_MONEY
Definition Language.h:196
@ LANG_YOU_CHANGE_MANA
Definition Language.h:155
#define TC_LOG_DEBUG(filterType__,...)
Definition Log.h:156
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
#define sObjectMgr
Definition ObjectMgr.h:1721
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
uint32 const MAX_MONEY_AMOUNT
Definition Player.cpp:119
Role Based Access Control related classes definition.
uint32 const ReputationRankStrIndex[MAX_REPUTATION_RANK]
Gender
@ GENDER_MALE
@ GENDER_FEMALE
@ POWER_RAGE
@ POWER_RUNIC_POWER
@ POWER_ENERGY
@ POWER_MANA
NPCFlags
Non Player Character flags.
@ MOVE_FLIGHT
@ MOVE_SWIM
@ MOVE_RUN
@ MOVE_RUN_BACK
@ MOVE_WALK
UnitFlags
void wstrToLower(std::wstring &str)
Definition Util.cpp:480
Optional< int32 > MoneyStringToMoney(std::string const &moneyString)
Definition Util.cpp:216
bool Utf8toWStr(char const *utf8str, size_t csize, wchar_t *wstr, size_t &wsize)
Definition Util.cpp:383
char * extractKeyFromLink(char *text, char const *linkType, char **something1=nullptr)
Definition Chat.cpp:364
Player * getSelectedPlayerOrSelf()
Definition Chat.cpp:346
Unit * getSelectedUnit()
Definition Chat.cpp:314
static std::string PGetParseString(std::string_view fmt, Args &&... args)
Definition Chat.h:81
WorldSession * GetSession()
Definition Chat.h:46
virtual LocaleConstant GetSessionDbcLocale() const
Definition Chat.cpp:692
virtual std::string GetNameLink() const
Definition Chat.cpp:46
bool HasLowerSecurity(Player *target, ObjectGuid guid, bool strong=false)
Definition Chat.cpp:51
Creature * getSelectedCreature()
Definition Chat.cpp:338
void SetSentErrorMessage(bool val)
Definition Chat.h:134
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
virtual char const * GetTrinityString(uint32 entry) const
Definition Chat.cpp:36
static ObjectGuid const Empty
Definition ObjectGuid.h:140
std::string ToString() const
TypeID GetTypeId() const
Definition Object.h:93
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:760
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:775
bool HasFlag(uint16 index, uint32 flag) const
Definition Object.cpp:799
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
virtual void SetObjectScale(float scale)
Definition Object.h:85
uint16 GetValuesCount() const
Definition Object.h:153
static Player * ToPlayer(Object *o)
Definition Object.h:180
Definition Pet.h:40
void SendTalentsInfoData(bool pet)
Definition Player.cpp:25366
uint32 GetArenaPoints() const
Definition Player.h:1867
void SetNativeGender(Gender gender) override
Definition Player.h:1040
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6161
bool ModifyMoney(int32 amount, bool sendError=true)
Definition Player.cpp:22339
void GiveXP(uint32 xp, Unit *victim, float group_rate=1.0f)
Definition Player.cpp:2353
void InitDisplayIds()
Definition Player.cpp:21313
WorldSession * GetSession() const
Definition Player.h:1719
uint32 GetHonorPoints() const
Definition Player.h:1866
uint32 GetMoney() const
Definition Player.h:1408
void SetFreeTalentPoints(uint32 points)
Definition Player.cpp:3776
void ModifyHonorPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
Definition Player.cpp:6679
void ModifyArenaPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
If trans is specified, honor save query will be added to trans.
Definition Player.cpp:6695
ReputationMgr & GetReputationMgr()
Definition Player.h:1848
void SetMoney(uint32 value)
Definition Player.cpp:22365
void SendState(FactionState const *faction)
int32 GetReputation(uint32 faction_id) const
FactionState const * GetState(FactionEntry const *factionEntry) const
bool SetOneFactionReputation(FactionEntry const *factionEntry, int32 standing, bool incremental)
Public for chat command needs.
static std::set< int32 > const ReputationRankThresholds
Definition Unit.h:769
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:819
void SetGender(Gender gender)
Definition Unit.h:899
uint8 GetClass() const
Definition Unit.h:895
NPCFlags GetNpcFlags() const
Definition Unit.h:1095
void SetFaction(uint32 faction) override
Definition Unit.h:974
void ReplaceAllUnitFlags(UnitFlags flags)
Definition Unit.h:956
bool IsPet() const
Definition Unit.h:884
void SetHealth(uint32 val)
Definition Unit.cpp:9361
UnitFlags GetUnitFlags() const
Definition Unit.h:952
void SetMaxPower(Powers power, uint32 val)
Definition Unit.cpp:9462
void Mount(uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
Definition Unit.cpp:8184
Gender GetGender() const
Definition Unit.h:898
void SetEmoteState(Emote emote)
Definition Unit.h:967
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool force=false)
Definition Unit.cpp:9421
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Unit.cpp:12152
virtual void SetDisplayId(uint32 modelId)
Definition Unit.cpp:10407
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition Unit.cpp:8678
void SetMaxHealth(uint32 val)
Definition Unit.cpp:9393
void ReplaceAllNpcFlags(NPCFlags flags)
Definition Unit.h:1099
void DeMorph()
Definition Unit.cpp:3208
uint8 GetRace() const
Definition Unit.h:892
uint32 GetDynamicFlags() const override
Definition Unit.h:818
Unit * GetOwner() const
Definition Object.cpp:2180
Player * GetPlayer() const
static bool CheckModifySpeed(ChatHandler *handler, Unit *target, float speed, float minimumBound, float maximumBound, bool checkInFlight=true)
static bool HandleModifyArenaCommand(ChatHandler *handler, char const *args)
static bool HandleModifyMorphCommand(ChatHandler *handler, uint32 display_id)
static bool HandleModifyFactionCommand(ChatHandler *handler, Optional< uint32 > factionid, Optional< uint32 > flag, Optional< uint32 > npcflag, Optional< uint32 > dyflag)
std::vector< ChatCommand > GetCommands() const override
Definition cs_modify.cpp:47
static bool HandleModifyMountCommand(ChatHandler *handler, uint32 mount, float speed)
static bool HandleModifyRepCommand(ChatHandler *handler, char const *args)
static bool HandleModifyXPCommand(ChatHandler *handler, char const *args)
static bool HandleDeMorphCommand(ChatHandler *handler, char const *)
static void NotifyModification(ChatHandler *handler, Unit *target, TrinityStrings resourceMessage, TrinityStrings resourceReportMessage, Args &&... args)
Definition cs_modify.cpp:92
static bool HandleModifyStandStateCommand(ChatHandler *handler, char const *args)
static bool HandleModifyBitCommand(ChatHandler *handler, char const *args)
static bool HandleModifyRageCommand(ChatHandler *handler, char const *args)
static bool HandleModifySpellCommand(ChatHandler *handler, char const *args)
static bool HandleModifyHPCommand(ChatHandler *handler, char const *args)
static bool HandleModifyPhaseCommand(ChatHandler *handler, uint32 phasemask)
static bool HandleModifyGenderCommand(ChatHandler *handler, char const *args)
static bool HandleModifyEnergyCommand(ChatHandler *handler, char const *args)
static bool HandleModifyDrunkCommand(ChatHandler *handler, char const *args)
static bool HandleModifyFlyCommand(ChatHandler *handler, char const *args)
static bool CheckModifyResources(ChatHandler *handler, char const *args, Player *target, int32 &res, int32 &resmax, int8 const multiplier=1)
static bool HandleModifyTalentCommand(ChatHandler *handler, char const *args)
static bool HandleModifyBWalkCommand(ChatHandler *handler, char const *args)
static bool CheckModifySpeed(ChatHandler *handler, char const *args, Unit *target, float &speed, float minimumBound, float maximumBound, bool checkInFlight=true)
static bool HandleModifySwimCommand(ChatHandler *handler, char const *args)
static bool HandleModifyMoneyCommand(ChatHandler *handler, char const *args)
static bool HandleModifyScaleCommand(ChatHandler *handler, char const *args)
static bool HandleModifyRunicPowerCommand(ChatHandler *handler, char const *args)
static bool HandleModifySpeedCommand(ChatHandler *handler, char const *args)
static bool HandleModifyManaCommand(ChatHandler *handler, char const *args)
static bool HandleModifyASpeedCommand(ChatHandler *handler, char const *args)
static bool HandleModifyHonorCommand(ChatHandler *handler, char const *args)
void AddSC_modify_commandscript()
@ SMSG_SET_FLAT_SPELL_MODIFIER
Definition Opcodes.h:643
@ RBAC_PERM_COMMAND_MODIFY_MONEY
Definition RBAC.h:424
@ RBAC_PERM_COMMAND_MODIFY_RUNICPOWER
Definition RBAC.h:429
@ RBAC_PERM_COMMAND_MODIFY_MOUNT
Definition RBAC.h:425
@ RBAC_PERM_COMMAND_MODIFY_SPEED_SWIM
Definition RBAC.h:436
@ RBAC_PERM_COMMAND_MODIFY_PHASE
Definition RBAC.h:426
@ RBAC_PERM_COMMAND_MODIFY_SPEED_BACKWALK
Definition RBAC.h:433
@ RBAC_PERM_COMMAND_MODIFY_SPEED_FLY
Definition RBAC.h:434
@ RBAC_PERM_COMMAND_MODIFY_SPEED
Definition RBAC.h:431
@ RBAC_PERM_COMMAND_MODIFY_TALENTPOINTS
Definition RBAC.h:439
@ RBAC_PERM_COMMAND_MODIFY
Definition RBAC.h:414
@ RBAC_PERM_COMMAND_MODIFY_SCALE
Definition RBAC.h:430
@ RBAC_PERM_COMMAND_MODIFY_BIT
Definition RBAC.h:416
@ RBAC_PERM_COMMAND_MODIFY_SPEED_WALK
Definition RBAC.h:435
@ RBAC_PERM_COMMAND_MODIFY_HONOR
Definition RBAC.h:421
@ RBAC_PERM_COMMAND_MODIFY_FACTION
Definition RBAC.h:419
@ RBAC_PERM_COMMAND_DEMORPH
Definition RBAC.h:413
@ RBAC_PERM_COMMAND_MODIFY_SPELL
Definition RBAC.h:437
@ RBAC_PERM_COMMAND_MORPH
Definition RBAC.h:412
@ RBAC_PERM_COMMAND_MODIFY_RAGE
Definition RBAC.h:427
@ RBAC_PERM_COMMAND_MODIFY_GENDER
Definition RBAC.h:420
@ RBAC_PERM_COMMAND_MODIFY_MANA
Definition RBAC.h:423
@ RBAC_PERM_COMMAND_MODIFY_ARENAPOINTS
Definition RBAC.h:415
@ RBAC_PERM_COMMAND_MODIFY_XP
Definition RBAC.h:668
@ RBAC_PERM_COMMAND_MODIFY_STANDSTATE
Definition RBAC.h:438
@ RBAC_PERM_COMMAND_MODIFY_REPUTATION
Definition RBAC.h:428
@ RBAC_PERM_COMMAND_MODIFY_ENERGY
Definition RBAC.h:418
@ RBAC_PERM_COMMAND_MODIFY_SPEED_ALL
Definition RBAC.h:432
@ RBAC_PERM_COMMAND_MODIFY_HP
Definition RBAC.h:422
@ RBAC_PERM_COMMAND_MODIFY_DRUNK
Definition RBAC.h:417
char const * Name[16]
int32 ReputationIndex