refactor(Script/Command): modify mount & dismount (#7413)

* refactor(Script/Command): modify mount

* oopsies

* Update rev_1629233438552386300.sql

* codestyle

* Update src/server/scripts/Commands/cs_modify.cpp

Co-authored-by: Stefano Borzì <stefanoborzi32@gmail.com>

* Update src/server/scripts/Commands/cs_modify.cpp

Co-authored-by: Stefano Borzì <stefanoborzi32@gmail.com>

* Update src/server/scripts/Commands/cs_modify.cpp

Co-authored-by: Stefano Borzì <stefanoborzi32@gmail.com>

* some improvements

* When using .dismount also update speed to 100%

* remove atoul

* Update cs_modify.cpp

* test

Co-authored-by: Kargatum <dowlandtop@yandex.com>

* Update cs_modify.cpp

* fix tyop

Co-authored-by: Stefano Borzì <stefanoborzi32@gmail.com>
Co-authored-by: Kargatum <dowlandtop@yandex.com>
This commit is contained in:
Kitzunu
2021-08-29 10:45:43 +02:00
committed by GitHub
parent 8388578cec
commit 6978d62482
3 changed files with 96 additions and 239 deletions

View File

@@ -19,6 +19,7 @@ EndScriptData */
#include "Player.h"
#include "ReputationMgr.h"
#include "ScriptMgr.h"
#include "StringConvert.h"
class modify_commandscript : public CommandScript
{
@@ -75,6 +76,19 @@ public:
return commandTable;
}
template<typename... Args>
static void NotifyModification(ChatHandler* handler, Unit* target, AcoreStrings resourceMessage, AcoreStrings resourceReportMessage, Args&&... args)
{
if (Player* player = target->ToPlayer())
{
handler->PSendSysMessage(resourceMessage, handler->GetNameLink(player).c_str(), args...);
if (handler->needReportToTarget(player))
{
ChatHandler(player->GetSession()).PSendSysMessage(resourceReportMessage, handler->GetNameLink().c_str(), std::forward<Args>(args)...);
}
}
}
//Edit Player HP
static bool HandleModifyHPCommand(ChatHandler* handler, const char* args)
{
@@ -454,6 +468,48 @@ public:
return false;
}
static bool CheckModifySpeed(ChatHandler* handler, char const* args, Unit* target, float& speed, float minimumBound, float maximumBound, bool checkInFlight = true)
{
if (!*args)
{
return false;
}
speed = Acore::StringTo<float>(args).value();
if (speed > maximumBound || speed < minimumBound)
{
handler->SendSysMessage(LANG_BAD_VALUE);
handler->SetSentErrorMessage(true);
return false;
}
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
handler->SetSentErrorMessage(true);
return false;
}
if (Player* player = target->ToPlayer())
{
// check online security
if (handler->HasLowerSecurity(player, ObjectGuid::Empty))
{
return false;
}
if (player->IsInFlight() && checkInFlight)
{
handler->PSendSysMessage(LANG_CHAR_IN_FLIGHT, handler->GetNameLink(player).c_str());
handler->SetSentErrorMessage(true);
return false;
}
}
return true;
}
//Edit Player Aspeed
static bool HandleModifyASpeedCommand(ChatHandler* handler, const char* args)
{
@@ -725,229 +781,32 @@ public:
static bool HandleModifyMountCommand(ChatHandler* handler, const char* args)
{
if (!*args)
return false;
uint16 mId = 1147;
float speed = (float)15;
uint32 num = 0;
num = atoi((char*)args);
switch (num)
{
case 1:
mId = 14340;
break;
case 2:
mId = 4806;
break;
case 3:
mId = 6471;
break;
case 4:
mId = 12345;
break;
case 5:
mId = 6472;
break;
case 6:
mId = 6473;
break;
case 7:
mId = 10670;
break;
case 8:
mId = 10719;
break;
case 9:
mId = 10671;
break;
case 10:
mId = 10672;
break;
case 11:
mId = 10720;
break;
case 12:
mId = 14349;
break;
case 13:
mId = 11641;
break;
case 14:
mId = 12244;
break;
case 15:
mId = 12242;
break;
case 16:
mId = 14578;
break;
case 17:
mId = 14579;
break;
case 18:
mId = 14349;
break;
case 19:
mId = 12245;
break;
case 20:
mId = 14335;
break;
case 21:
mId = 207;
break;
case 22:
mId = 2328;
break;
case 23:
mId = 2327;
break;
case 24:
mId = 2326;
break;
case 25:
mId = 14573;
break;
case 26:
mId = 14574;
break;
case 27:
mId = 14575;
break;
case 28:
mId = 604;
break;
case 29:
mId = 1166;
break;
case 30:
mId = 2402;
break;
case 31:
mId = 2410;
break;
case 32:
mId = 2409;
break;
case 33:
mId = 2408;
break;
case 34:
mId = 2405;
break;
case 35:
mId = 14337;
break;
case 36:
mId = 6569;
break;
case 37:
mId = 10661;
break;
case 38:
mId = 10666;
break;
case 39:
mId = 9473;
break;
case 40:
mId = 9476;
break;
case 41:
mId = 9474;
break;
case 42:
mId = 14374;
break;
case 43:
mId = 14376;
break;
case 44:
mId = 14377;
break;
case 45:
mId = 2404;
break;
case 46:
mId = 2784;
break;
case 47:
mId = 2787;
break;
case 48:
mId = 2785;
break;
case 49:
mId = 2736;
break;
case 50:
mId = 2786;
break;
case 51:
mId = 14347;
break;
case 52:
mId = 14346;
break;
case 53:
mId = 14576;
break;
case 54:
mId = 9695;
break;
case 55:
mId = 9991;
break;
case 56:
mId = 6448;
break;
case 57:
mId = 6444;
break;
case 58:
mId = 6080;
break;
case 59:
mId = 6447;
break;
case 60:
mId = 4805;
break;
case 61:
mId = 9714;
break;
case 62:
mId = 6448;
break;
case 63:
mId = 6442;
break;
case 64:
mId = 14632;
break;
case 65:
mId = 14332;
break;
case 66:
mId = 14331;
break;
case 67:
mId = 8469;
break;
case 68:
mId = 2830;
break;
case 69:
mId = 2346;
break;
default:
handler->SendSysMessage(LANG_NO_MOUNT);
handler->SetSentErrorMessage(true);
return false;
return false;
}
Player* target = handler->getSelectedPlayer();
char const* mount_cstr = strtok(const_cast<char*>(args), " ");
char const* speed_cstr = strtok(nullptr, " ");
if (!mount_cstr)
{
return false;
}
if (!speed_cstr)
{
speed_cstr = "1";
}
uint32 mount = Acore::StringTo<uint32>(mount_cstr).value();
if (!sCreatureDisplayInfoStore.LookupEntry(mount))
{
handler->SendSysMessage(LANG_NO_MOUNT);
handler->SetSentErrorMessage(true);
return false;
}
Player* target = handler->getSelectedPlayerOrSelf();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
@@ -956,29 +815,22 @@ public:
}
// check online security
if (handler->HasLowerSecurity(target))
if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
{
return false;
}
handler->PSendSysMessage(LANG_YOU_GIVE_MOUNT, handler->GetNameLink(target).c_str());
if (handler->needReportToTarget(target))
(ChatHandler(target->GetSession())).PSendSysMessage(LANG_MOUNT_GIVED, handler->GetNameLink().c_str());
float speed = 0.f;
if (!CheckModifySpeed(handler, speed_cstr, target, speed, 0.1f, 50.0f))
{
return false;
}
target->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP);
target->Mount(mId);
WorldPacket data(SMSG_FORCE_RUN_SPEED_CHANGE, (8 + 4 + 1 + 4));
data << target->GetPackGUID();
data << (uint32)0;
data << (uint8)0; //new 2.1.0
data << float(speed);
target->SendMessageToSet(&data, true);
data.Initialize(SMSG_FORCE_SWIM_SPEED_CHANGE, (8 + 4 + 4));
data << target->GetPackGUID();
data << (uint32)0;
data << float(speed);
target->SendMessageToSet(&data, true);
NotifyModification(handler, target, LANG_YOU_GIVE_MOUNT, LANG_MOUNT_GIVED);
target->Mount(mount);
target->SetSpeed(MOVE_RUN, speed, true);
target->SetSpeed(MOVE_FLIGHT, speed, true);
return true;
}