/*
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by the
* Free Software Foundation; either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#include "Chat.h"
#include "CommandScript.h"
#include "ObjectMgr.h"
#include "Opcodes.h"
#include "Pet.h"
#include "Player.h"
#include "ReputationMgr.h"
#include "StringConvert.h"
using namespace Acore::ChatCommands;
class modify_commandscript : public CommandScript
{
public:
modify_commandscript() : CommandScript("modify_commandscript") { }
ChatCommandTable GetCommands() const override
{
static ChatCommandTable modifyspeedCommandTable =
{
{ "fly", HandleModifyFlyCommand, SEC_GAMEMASTER, Console::No },
{ "all", HandleModifyASpeedCommand, SEC_GAMEMASTER, Console::No },
{ "walk", HandleModifySpeedCommand, SEC_GAMEMASTER, Console::No },
{ "backwalk", HandleModifyBWalkCommand, SEC_GAMEMASTER, Console::No },
{ "swim", HandleModifySwimCommand, SEC_GAMEMASTER, Console::No },
{ "", HandleModifyASpeedCommand, SEC_GAMEMASTER, Console::No }
};
static ChatCommandTable modifyCommandTable =
{
{ "hp", HandleModifyHPCommand, SEC_GAMEMASTER, Console::No },
{ "mana", HandleModifyManaCommand, SEC_GAMEMASTER, Console::No },
{ "rage", HandleModifyRageCommand, SEC_GAMEMASTER, Console::No },
{ "runicpower", HandleModifyRunicPowerCommand, SEC_GAMEMASTER, Console::No },
{ "energy", HandleModifyEnergyCommand, SEC_GAMEMASTER, Console::No },
{ "money", HandleModifyMoneyCommand, SEC_GAMEMASTER, Console::No },
{ "scale", HandleModifyScaleCommand, SEC_GAMEMASTER, Console::No },
{ "bit", HandleModifyBitCommand, SEC_GAMEMASTER, Console::No },
{ "faction", HandleModifyFactionCommand, SEC_ADMINISTRATOR, Console::No },
{ "spell", HandleModifySpellCommand, SEC_CONSOLE, Console::No },
{ "talentpoints", HandleModifyTalentCommand, SEC_GAMEMASTER, Console::No },
{ "mount", HandleModifyMountCommand, SEC_GAMEMASTER, Console::No },
{ "honor", HandleModifyHonorCommand, SEC_GAMEMASTER, Console::No },
{ "reputation", HandleModifyRepCommand, SEC_GAMEMASTER, Console::No },
{ "arenapoints", HandleModifyArenaCommand, SEC_GAMEMASTER, Console::No },
{ "drunk", HandleModifyDrunkCommand, SEC_GAMEMASTER, Console::No },
{ "standstate", HandleModifyStandStateCommand, SEC_GAMEMASTER, Console::No },
{ "phase", HandleModifyPhaseCommand, SEC_GAMEMASTER, Console::No },
{ "gender", HandleModifyGenderCommand, SEC_GAMEMASTER, Console::No },
{ "speed", modifyspeedCommandTable }
};
static ChatCommandTable morphCommandTable =
{
{ "reset", HandleMorphResetCommand, SEC_MODERATOR, Console::No },
{ "target", HandleMorphTargetCommand, SEC_MODERATOR, Console::No },
{ "mount", HandleMorphMountCommand, SEC_MODERATOR, Console::No }
};
static ChatCommandTable commandTable =
{
{ "morph", morphCommandTable },
{ "modify", modifyCommandTable }
};
return commandTable;
}
template
static void NotifyModification(ChatHandler* handler, Unit* target, AcoreStrings resourceMessage, AcoreStrings resourceReportMessage, Args&&... args)
{
if (Player* player = target->ToPlayer())
{
handler->PSendSysMessage(resourceMessage, std::forward(args)..., handler->GetNameLink(player));
if (handler->needReportToTarget(player))
{
ChatHandler(player->GetSession()).PSendSysMessage(resourceReportMessage, handler->GetNameLink(), std::forward(args)...);
}
}
}
static bool CheckModifyInt32(ChatHandler* handler, Player* target, int32 modifyValue)
{
if (modifyValue < 1)
{
handler->SendErrorMessage(LANG_BAD_VALUE);
return false;
}
if (!target)
{
handler->SendErrorMessage(LANG_NO_CHAR_SELECTED);
return false;
}
if (handler->HasLowerSecurity(target))
{
return false;
}
return true;
}
//Edit Player HP
static bool HandleModifyHPCommand(ChatHandler* handler, int32 healthPoints)
{
Player* target = handler->getSelectedPlayer();
if (!CheckModifyInt32(handler, target, healthPoints))
{
return false;
}
handler->PSendSysMessage(LANG_YOU_CHANGE_HP, handler->GetNameLink(target), healthPoints, healthPoints);
if (handler->needReportToTarget(target))
{
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_HP_CHANGED, handler->GetNameLink(), healthPoints, healthPoints);
}
target->SetMaxHealth(healthPoints);
target->SetHealth(healthPoints);
return true;
}
//Edit Player Mana
static bool HandleModifyManaCommand(ChatHandler* handler, int32 manaPoints)
{
Player* target = handler->getSelectedPlayer();
if (!CheckModifyInt32(handler, target, manaPoints))
{
return false;
}
handler->PSendSysMessage(LANG_YOU_CHANGE_MANA, handler->GetNameLink(target), manaPoints, manaPoints);
if (handler->needReportToTarget(target))
{
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MANA_CHANGED, handler->GetNameLink(), manaPoints, manaPoints);
}
target->SetMaxPower(POWER_MANA, manaPoints);
target->SetPower(POWER_MANA, manaPoints);
return true;
}
//Edit Player Energy
static bool HandleModifyEnergyCommand(ChatHandler* handler, int32 energyPoints)
{
Player* target = handler->getSelectedPlayer();
if (!CheckModifyInt32(handler, target, energyPoints))
{
return false;
}
energyPoints *= 10;
handler->PSendSysMessage(LANG_YOU_CHANGE_ENERGY, handler->GetNameLink(target), energyPoints / 10, energyPoints / 10);
if (handler->needReportToTarget(target))
{
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, handler->GetNameLink(), energyPoints / 10, energyPoints / 10);
}
target->SetMaxPower(POWER_ENERGY, energyPoints);
target->SetPower(POWER_ENERGY, energyPoints);
LOG_DEBUG("misc", handler->GetAcoreString(LANG_CURRENT_ENERGY), target->GetMaxPower(POWER_ENERGY));
return true;
}
//Edit Player Rage
static bool HandleModifyRageCommand(ChatHandler* handler, int32 ragePoints)
{
Player* target = handler->getSelectedPlayer();
if (!CheckModifyInt32(handler, target, ragePoints))
{
return false;
}
ragePoints *= 10;
handler->PSendSysMessage(LANG_YOU_CHANGE_RAGE, handler->GetNameLink(target), ragePoints / 10, ragePoints / 10);
if (handler->needReportToTarget(target))
{
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, handler->GetNameLink(), ragePoints / 10, ragePoints / 10);
}
target->SetMaxPower(POWER_RAGE, ragePoints);
target->SetPower(POWER_RAGE, ragePoints);
return true;
}
// Edit Player Runic Power
static bool HandleModifyRunicPowerCommand(ChatHandler* handler, int32 runePoints)
{
Player* target = handler->getSelectedPlayer();
if (!CheckModifyInt32(handler, target, runePoints))
{
return false;
}
runePoints *= 10;
handler->PSendSysMessage(LANG_YOU_CHANGE_RUNIC_POWER, handler->GetNameLink(target), runePoints / 10, runePoints / 10);
if (handler->needReportToTarget(target))
{
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_RUNIC_POWER_CHANGED, handler->GetNameLink(), runePoints / 10, runePoints / 10);
}
target->SetMaxPower(POWER_RUNIC_POWER, runePoints);
target->SetPower(POWER_RUNIC_POWER, runePoints);
return true;
}
//Edit Player Faction
static bool HandleModifyFactionCommand(ChatHandler* handler, Optional factionID, Optional flagID, Optional npcFlagID, Optional dynamicFlagID)
{
Creature* target = handler->getSelectedCreature();
if (!target)
{
handler->SendErrorMessage(LANG_SELECT_CREATURE);
return false;
}
if (!factionID)
{
uint32 factionid = target->GetFaction();
uint32 flag = target->GetUnitFlags();
uint32 npcflag = target->GetNpcFlags();
uint32 dyflag = target->GetDynamicFlags();
handler->PSendSysMessage(LANG_CURRENT_FACTION, target->GetGUID().ToString(), factionid, flag, npcflag, dyflag);
return true;
}
uint32 factionid = factionID.value();
UnitFlags flag;
NPCFlags npcflag;
uint32 dyflag;
auto pflag = flagID;
if (!pflag)
flag = target->GetUnitFlags();
else
flag = UnitFlags(*pflag);
auto pnpcflag = npcFlagID;
if (!pnpcflag)
npcflag = target->GetNpcFlags();
else
npcflag = NPCFlags(*npcFlagID);
auto pdyflag = dynamicFlagID;
if (!pdyflag)
dyflag = target->GetDynamicFlags();
else
dyflag = *dynamicFlagID;
if (!sFactionTemplateStore.LookupEntry(factionid))
{
handler->SendErrorMessage(LANG_WRONG_FACTION, factionid);
return false;
}
handler->PSendSysMessage(LANG_YOU_CHANGE_FACTION, target->GetGUID().ToString(), factionid, flag, npcflag, dyflag);
target->SetFaction(factionid);
target->ReplaceAllUnitFlags(flag);
target->ReplaceAllNpcFlags(npcflag);
target->ReplaceAllDynamicFlags(dyflag);
return true;
}
//Edit Player Spell
static bool HandleModifySpellCommand(ChatHandler* handler, uint8 spellFlatID, uint8 op, uint16 val, Optional mark)
{
Player* target = handler->getSelectedPlayer();
if (!target)
{
handler->SendErrorMessage(LANG_NO_CHAR_SELECTED);
return false;
}
// check online security
if (handler->HasLowerSecurity(target))
{
return false;
}
handler->PSendSysMessage(LANG_YOU_CHANGE_SPELLFLATID, spellFlatID, val, mark ? *mark : 65535, handler->GetNameLink(target));
if (handler->needReportToTarget(target))
{
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, handler->GetNameLink(), spellFlatID, val, mark ? *mark : 65535);
}
WorldPacket data(SMSG_SET_FLAT_SPELL_MODIFIER, (1 + 1 + 2 + 2));
data << uint8(spellFlatID);
data << uint8(op);
data << uint16(val);
data << uint16(mark ? *mark : 65535);
target->GetSession()->SendPacket(&data);
return true;
}
//Edit Player TP
static bool HandleModifyTalentCommand(ChatHandler* handler, uint32 talentPoints)
{
if (!talentPoints)
{
return false;
}
Unit* target = handler->getSelectedUnit();
if (!target)
{
handler->SendErrorMessage(LANG_NO_CHAR_SELECTED);
return false;
}
if (target->IsPlayer())
{
// check online security
if (handler->HasLowerSecurity(target->ToPlayer()))
{
return false;
}
target->ToPlayer()->SetFreeTalentPoints(talentPoints);
target->ToPlayer()->SendTalentsInfoData(false);
return true;
}
else if (target->IsPet())
{
Unit* owner = target->GetOwner();
if (owner && owner->IsPlayer() && ((Pet*)target)->IsPermanentPetFor(owner->ToPlayer()))
{
// check online security
if (handler->HasLowerSecurity(owner->ToPlayer()))
return false;
((Pet*)target)->SetFreeTalentPoints(talentPoints);
owner->ToPlayer()->SendTalentsInfoData(true);
return true;
}
}
handler->SendErrorMessage(LANG_NO_CHAR_SELECTED);
return false;
}
static bool CheckModifySpeed(ChatHandler* handler, Unit* target, float speed, float minimumBound, float maximumBound, bool checkInFlight = true)
{
if (speed > maximumBound || speed < minimumBound)
{
handler->SendErrorMessage(LANG_BAD_VALUE);
return false;
}
if (!target)
{
handler->SendErrorMessage(LANG_NO_CHAR_SELECTED);
return false;
}
if (Player* player = target->ToPlayer())
{
// check online security
if (handler->HasLowerSecurity(player))
{
return false;
}
if (player->IsInFlight() && checkInFlight)
{
handler->SendErrorMessage(LANG_CHAR_IN_FLIGHT, handler->GetNameLink(player).c_str());
return false;
}
}
return true;
}
//Edit Player Aspeed
static bool HandleModifyASpeedCommand(ChatHandler* handler, float allSpeed)
{
Player* target = handler->getSelectedPlayerOrSelf();
if (CheckModifySpeed(handler, target, allSpeed, 0.1f, 50.0f))
{
NotifyModification(handler, target, LANG_YOU_CHANGE_ASPEED, LANG_YOURS_ASPEED_CHANGED, allSpeed);
target->SetSpeed(MOVE_WALK, allSpeed);
target->SetSpeed(MOVE_RUN, allSpeed);
target->SetSpeed(MOVE_SWIM, allSpeed);
target->SetSpeed(MOVE_FLIGHT, allSpeed);
return true;
}
return false;
}
//Edit Player Speed
static bool HandleModifySpeedCommand(ChatHandler* handler, float speed)
{
Player* target = handler->getSelectedPlayerOrSelf();
if (CheckModifySpeed(handler, target, speed, 0.1f, 50.0f))
{
NotifyModification(handler, target, LANG_YOU_CHANGE_SPEED, LANG_YOURS_SPEED_CHANGED, speed);
target->SetSpeedRate(MOVE_RUN, speed);
return true;
}
return false;
}
//Edit Player Swim Speed
static bool HandleModifySwimCommand(ChatHandler* handler, float swimSpeed)
{
Player* target = handler->getSelectedPlayerOrSelf();
if (CheckModifySpeed(handler, target, swimSpeed, 0.1f, 50.0f))
{
NotifyModification(handler, target, LANG_YOU_CHANGE_SWIM_SPEED, LANG_YOURS_SWIM_SPEED_CHANGED, swimSpeed);
target->SetSpeedRate(MOVE_SWIM, swimSpeed);
return true;
}
return false;
}
//Edit Player Walk Speed
static bool HandleModifyBWalkCommand(ChatHandler* handler, float backSpeed)
{
Player* target = handler->getSelectedPlayerOrSelf();
if (CheckModifySpeed(handler, target, backSpeed, 0.1f, 50.0f))
{
NotifyModification(handler, target, LANG_YOU_CHANGE_BACK_SPEED, LANG_YOURS_BACK_SPEED_CHANGED, backSpeed);
target->SetSpeedRate(MOVE_RUN_BACK, backSpeed);
return true;
}
return false;
}
//Edit Player Fly
static bool HandleModifyFlyCommand(ChatHandler* handler, float flySpeed)
{
Player* target = handler->getSelectedPlayerOrSelf();
if (CheckModifySpeed(handler, target, flySpeed, 0.1f, 50.0f, false))
{
NotifyModification(handler, target, LANG_YOU_CHANGE_FLY_SPEED, LANG_YOURS_FLY_SPEED_CHANGED, flySpeed);
target->SetSpeedRate(MOVE_FLIGHT, flySpeed);
return true;
}
return false;
}
//Edit Player or Creature Scale
static bool HandleModifyScaleCommand(ChatHandler* handler, float scale)
{
if (scale > 10.0f || scale < 0.1f)
{
handler->SendErrorMessage(LANG_BAD_VALUE);
return false;
}
Unit* target = handler->getSelectedUnit();
if (!target)
{
handler->SendErrorMessage(LANG_SELECT_CHAR_OR_CREATURE);
return false;
}
if (Player* player = target->ToPlayer())
{
// check online security
if (handler->HasLowerSecurity(player))
return false;
handler->PSendSysMessage(LANG_YOU_CHANGE_SIZE, scale, handler->GetNameLink(player));
if (handler->needReportToTarget(player))
ChatHandler(player->GetSession()).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, handler->GetNameLink(), scale);
}
target->SetObjectScale(scale);
return true;
}
//Enable Player mount
static bool HandleModifyMountCommand(ChatHandler* handler, uint32 creatureDisplayID, Optional speed)
{
if (!sCreatureDisplayInfoStore.LookupEntry(creatureDisplayID))
{
handler->SendErrorMessage(LANG_NO_MOUNT);
return false;
}
Player* target = handler->getSelectedPlayerOrSelf();
if (!target)
{
handler->SendErrorMessage(LANG_NO_CHAR_SELECTED);
return false;
}
// check online security
if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
{
return false;
}
float _speed = speed ? *speed : 1.0f;
if (!CheckModifySpeed(handler, target, _speed, 0.1f, 50.0f))
{
return false;
}
NotifyModification(handler, target, LANG_YOU_GIVE_MOUNT, LANG_MOUNT_GIVED);
target->Mount(creatureDisplayID);
target->SetSpeed(MOVE_RUN, _speed, true);
target->SetSpeed(MOVE_FLIGHT, _speed, true);
return true;
}
//Edit Player money
static bool HandleModifyMoneyCommand(ChatHandler* handler, Tail money)
{
if (money.empty())
{
return false;
}
Player* target = handler->getSelectedPlayer();
if (!target)
{
handler->SendErrorMessage(LANG_NO_CHAR_SELECTED);
return false;
}
// check online security
if (handler->HasLowerSecurity(target))
{
return false;
}
auto IsExistWord = [](std::string_view line, std::initializer_list words)
{
for (auto const& word : words)
{
if (line.find(word) != std::string_view::npos)
{
return true;
}
}
return false;
};
Optional moneyToAddO = 0;
if (IsExistWord(money, { "g", "s", "c" }))
{
moneyToAddO = MoneyStringToMoney(money);
}
else
{
moneyToAddO = Acore::StringTo(money);
}
if (!moneyToAddO)
{
return false;
}
int32 moneyToAdd = *moneyToAddO;
uint32 targetMoney = target->GetMoney();
if (moneyToAdd < 0)
{
int32 newmoney = int32(targetMoney) + moneyToAdd;
LOG_DEBUG("chat.system", handler->GetAcoreString(LANG_CURRENT_MONEY), targetMoney, moneyToAdd, newmoney);
if (newmoney <= 0)
{
handler->PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, handler->GetNameLink(target));
if (handler->needReportToTarget(target))
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_ALL_MONEY_GONE, handler->GetNameLink());
target->SetMoney(0);
}
else
{
if (newmoney > MAX_MONEY_AMOUNT)
newmoney = MAX_MONEY_AMOUNT;
handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, std::abs(moneyToAdd), handler->GetNameLink(target));
if (handler->needReportToTarget(target))
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, handler->GetNameLink(), std::abs(moneyToAdd));
target->SetMoney(newmoney);
}
}
else
{
handler->PSendSysMessage(LANG_YOU_GIVE_MONEY, moneyToAdd, handler->GetNameLink(target));
if (handler->needReportToTarget(target))
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink(), moneyToAdd);
if (moneyToAdd >= MAX_MONEY_AMOUNT)
moneyToAdd = MAX_MONEY_AMOUNT;
if (targetMoney >= uint32(MAX_MONEY_AMOUNT) - moneyToAdd)
moneyToAdd -= targetMoney;
target->ModifyMoney(moneyToAdd);
}
LOG_DEBUG("chat.system", handler->GetAcoreString(LANG_NEW_MONEY), targetMoney, moneyToAdd, target->GetMoney());
return true;
}
//Edit Unit field
static bool HandleModifyBitCommand(ChatHandler* handler, uint16 field, uint32 bit)
{
Unit* target = handler->getSelectedUnit();
if (!target)
{
handler->SendErrorMessage(LANG_NO_CHAR_SELECTED);
return false;
}
// check online security
if (target->IsPlayer() && handler->HasLowerSecurity(target->ToPlayer()))
{
return false;
}
if (field < OBJECT_END || field >= target->GetValuesCount())
{
handler->SendErrorMessage(LANG_BAD_VALUE);
return false;
}
if (bit < 1 || bit > 32)
{
handler->SendErrorMessage(LANG_BAD_VALUE);
return false;
}
if (target->HasFlag(field, (1 << (bit - 1))))
{
target->RemoveFlag(field, (1 << (bit - 1)));
handler->PSendSysMessage(LANG_REMOVE_BIT, bit, field);
}
else
{
target->SetFlag(field, (1 << (bit - 1)));
handler->PSendSysMessage(LANG_SET_BIT, bit, field);
}
return true;
}
static bool HandleModifyHonorCommand(ChatHandler* handler, int32 amount)
{
Player* target = handler->getSelectedPlayer();
if (!target)
{
handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND);
return false;
}
// check online security
if (handler->HasLowerSecurity(target))
{
return false;
}
target->ModifyHonorPoints(amount);
handler->PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, handler->GetNameLink(target), target->GetHonorPoints());
return true;
}
static bool HandleModifyDrunkCommand(ChatHandler* handler, uint8 drunklevel)
{
if (drunklevel > 100)
{
drunklevel = 100;
}
if (Player* target = handler->getSelectedPlayer())
{
target->SetDrunkValue(drunklevel);
}
return true;
}
static bool HandleModifyRepCommand(ChatHandler* handler, uint32 factionId, Variant rank, Optional delta)
{
Player* target = handler->getSelectedPlayer();
if (!target)
{
handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND);
return false;
}
// check online security
if (handler->HasLowerSecurity(target))
{
return false;
}
int32 amount = 0;
if (rank.holds_alternative())
{
std::string rankStr = rank.get();
std::wstring wrankStr;
if (!Utf8toWStr(rankStr, wrankStr))
{
return false;
}
wstrToLower(wrankStr);
int32 r = 0;
amount = -42000;
for (; r < MAX_REPUTATION_RANK; ++r)
{
std::string rank = handler->GetAcoreString(ReputationRankStrIndex[r]);
if (rank.empty())
continue;
std::wstring wrank;
if (!Utf8toWStr(rank, wrank))
continue;
wstrToLower(wrank);
if (wrank.substr(0, wrankStr.size()) == wrankStr)
{
if (delta)
{
if (*delta < 0 || (*delta > ReputationMgr::PointsInRank[r] - 1))
{
handler->SendErrorMessage(LANG_COMMAND_FACTION_DELTA, ReputationMgr::PointsInRank[r] - 1);
return false;
}
amount += *delta;
}
break;
}
amount += ReputationMgr::PointsInRank[r];
}
if (r >= MAX_REPUTATION_RANK)
{
handler->SendErrorMessage(LANG_COMMAND_FACTION_INVPARAM, rankStr.c_str());
return false;
}
}
else
{
amount = rank.get();
}
if (!amount)
{
return false;
}
FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
if (!factionEntry)
{
handler->SendErrorMessage(LANG_COMMAND_FACTION_UNKNOWN, factionId);
return false;
}
if (factionEntry->reputationListID < 0)
{
handler->SendErrorMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name[handler->GetSessionDbcLocale()], factionId);
return false;
}
target->GetReputationMgr().SetOneFactionReputation(factionEntry, float(amount), false);
target->GetReputationMgr().SendState(target->GetReputationMgr().GetState(factionEntry));
handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[handler->GetSessionDbcLocale()], factionId,
handler->GetNameLink(target), target->GetReputationMgr().GetReputation(factionEntry));
return true;
}
static bool HandleMorphTargetCommand(ChatHandler* handler, uint32 displayID)
{
Unit* target = handler->getSelectedUnit();
if (!target)
{
target = handler->GetSession()->GetPlayer();
}
else if (target->IsPlayer() && handler->HasLowerSecurity(target->ToPlayer())) // check online security
{
return false;
}
target->SetDisplayId(displayID);
return true;
}
//morph creature or player
static bool HandleMorphResetCommand(ChatHandler* handler)
{
Unit* target = handler->getSelectedUnit();
if (!target)
{
target = handler->GetSession()->GetPlayer();
}
else if (target->IsPlayer() && handler->HasLowerSecurity(target->ToPlayer())) // check online security
{
return false;
}
target->DeMorph();
return true;
}
static bool HandleMorphMountCommand(ChatHandler* handler, uint32 displayID)
{
Player* target = handler->getSelectedPlayerOrSelf();
if (target->IsPlayer() && handler->HasLowerSecurity(target->ToPlayer())) // check online security
return false;
if (!target->GetAuraEffectsByType(SPELL_AURA_MOUNTED).empty())
target->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, displayID);
else
return false;
return true;
}
//set temporary phase mask for player
static bool HandleModifyPhaseCommand(ChatHandler* handler, uint32 phaseMask)
{
Unit* target = handler->getSelectedUnit();
if (!target)
{
target = handler->GetSession()->GetPlayer();
}
else if (target->IsPlayer() && handler->HasLowerSecurity(target->ToPlayer())) // check online security
{
return false;
}
target->SetPhaseMask(phaseMask, true);
return true;
}
//change standstate
static bool HandleModifyStandStateCommand(ChatHandler* handler, uint32 anim)
{
handler->GetSession()->GetPlayer()->SetUInt32Value(UNIT_NPC_EMOTESTATE, anim);
return true;
}
static bool HandleModifyArenaCommand(ChatHandler* handler, int32 amount)
{
Player* target = handler->getSelectedPlayer();
if (!target)
{
handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND);
return false;
}
target->ModifyArenaPoints(amount);
handler->PSendSysMessage(LANG_COMMAND_MODIFY_ARENA, handler->GetNameLink(target), target->GetArenaPoints());
return true;
}
static bool HandleModifyGenderCommand(ChatHandler* handler, Tail genderString)
{
if (genderString.empty())
{
return false;
}
Player* target = handler->getSelectedPlayer();
if (!target)
{
handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND);
return false;
}
PlayerInfo const* info = sObjectMgr->GetPlayerInfo(target->getRace(), target->getClass());
if (!info)
{
return false;
}
Gender gender;
if (StringEqualI(genderString, "male")) // MALE
{
if (target->getGender() == GENDER_MALE)
return true;
gender = GENDER_MALE;
}
else if (StringEqualI(genderString, "female")) // FEMALE
{
if (target->getGender() == GENDER_FEMALE)
return true;
gender = GENDER_FEMALE;
}
else
{
handler->SendErrorMessage(LANG_MUST_MALE_OR_FEMALE);
return false;
}
// Set gender
target->SetByteValue(UNIT_FIELD_BYTES_0, 2, gender);
target->SetByteValue(PLAYER_BYTES_3, 0, gender);
// Change display ID
target->InitDisplayIds();
char const* gender_full = gender ? "female" : "male";
handler->PSendSysMessage(LANG_YOU_CHANGE_GENDER, handler->GetNameLink(target), gender_full);
if (handler->needReportToTarget(target))
{
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_GENDER_CHANGED, gender_full, handler->GetNameLink());
}
return true;
}
};
void AddSC_modify_commandscript()
{
new modify_commandscript();
}