diff --git a/data/sql/updates/pending_db_world/rev_1629233438552386300.sql b/data/sql/updates/pending_db_world/rev_1629233438552386300.sql new file mode 100644 index 000000000..63c222027 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1629233438552386300.sql @@ -0,0 +1,3 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1629233438552386300'); + +UPDATE `command` SET `help` = 'Syntax: .modify mount #id #speed\nSet CreatureDisplayID as #id and set speed to #speed value between 0.1 - 50.0' WHERE `name` = 'modify mount'; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 568c2fef9..c4142f807 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -957,6 +957,8 @@ public: player->Dismount(); player->RemoveAurasByType(SPELL_AURA_MOUNTED); + player->SetSpeed(MOVE_RUN, 1, true); + player->SetSpeed(MOVE_FLIGHT, 1, true); return true; } diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index e213c7193..864605b07 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -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 + 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)...); + } + } + } + //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(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(args), " "); + char const* speed_cstr = strtok(nullptr, " "); + + if (!mount_cstr) + { + return false; + } + + if (!speed_cstr) + { + speed_cstr = "1"; + } + + uint32 mount = Acore::StringTo(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; }