diff --git a/data/sql/updates/pending_db_world/rev_1556618006402506300.sql b/data/sql/updates/pending_db_world/rev_1556618006402506300.sql new file mode 100644 index 000000000..6c20c4898 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1556618006402506300.sql @@ -0,0 +1,13 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1556618006402506300'); + +DELETE FROM `command` WHERE `name` IN +("deserter instance add", +"deserter instance remove", +"deserter bg add", +"deserter bg remove"); + + INSERT INTO `command` (`name`, `security`, `help`) VALUES +("deserter instance add", 3, "Syntax: .deserter instance add $time \n\n Adds the instance deserter debuff to your target with $time duration."), +("deserter instance remove", 3, "Syntax: .deserter instance remove \n\n Removes the instance deserter debuff from your target."), +("deserter bg add", 3, "Syntax: .deserter bg add $time \n\n Adds the bg deserter debuff to your target with $time duration."), +("deserter bg remove", 3, "Syntax: .deserter bg remove \n\n Removes the bg deserter debuff from your target."); diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt index 07f3aba29..40282e88c 100644 --- a/src/server/scripts/Commands/CMakeLists.txt +++ b/src/server/scripts/Commands/CMakeLists.txt @@ -18,6 +18,7 @@ set(scripts_STAT_SRCS Commands/cs_character.cpp Commands/cs_cheat.cpp Commands/cs_debug.cpp + Commands/cs_deserter.cpp Commands/cs_disable.cpp Commands/cs_event.cpp Commands/cs_gm.cpp diff --git a/src/server/scripts/Commands/cs_deserter.cpp b/src/server/scripts/Commands/cs_deserter.cpp new file mode 100644 index 000000000..20c4818b2 --- /dev/null +++ b/src/server/scripts/Commands/cs_deserter.cpp @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license: https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2 + * Copyright (C) 2008-2016 TrinityCore + * Copyright (C) 2005-2009 MaNGOS + */ + +#include "Chat.h" +#include "Player.h" +#include "Language.h" +#include "ScriptMgr.h" +#include "SpellAuras.h" +#include "SpellAuraEffects.h" + + enum Spells +{ + LFG_SPELL_DUNGEON_DESERTER = 71041, + BG_SPELL_DESERTER = 26013 +}; + +class deserter_commandscript : public CommandScript +{ +public: + deserter_commandscript() : CommandScript("deserter_commandscript") { } + + std::vector GetCommands() const override + { + static std::vector deserterinstanceCommandTable = + { + { "add", SEC_ADMINISTRATOR, false, &HandleDeserterInstanceAdd, "" }, + { "remove", SEC_ADMINISTRATOR, false, &HandleDeserterInstanceRemove, "" } + }; + + static std::vector deserterBGCommandTable = + { + { "add", SEC_ADMINISTRATOR, false, &HandleDeserterBGAdd, "" }, + { "remove", SEC_ADMINISTRATOR, false, &HandleDeserterBGRemove, "" } + }; + + static std::vector deserterCommandTable = + { + { "instance", SEC_ADMINISTRATOR, false, nullptr, "", deserterinstanceCommandTable }, + { "bg", SEC_ADMINISTRATOR, false, nullptr, "", deserterBGCommandTable } + }; + + static std::vector commandTable = + { + { "deserter", SEC_ADMINISTRATOR, false, nullptr, "", deserterCommandTable } + }; + + return commandTable; + } + + static bool HandleDeserterAdd(ChatHandler* handler, char const* args, bool isInstance) + { + if (!*args) + return false; + + Player* targetPlayer = handler->getSelectedPlayer(); + if (!targetPlayer) + { + handler->SendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + char* timeStr = strtok((char*)args, " "); + if (!timeStr) + { + handler->SendSysMessage(LANG_BAD_VALUE); + handler->SetSentErrorMessage(true); + return false; + } + uint32 time = atoi(timeStr); + + if (!time) + { + handler->SendSysMessage(LANG_BAD_VALUE); + handler->SetSentErrorMessage(true); + return false; + } + + Aura* aura = targetPlayer->AddAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER, targetPlayer); + + if (!aura) + { + handler->SendSysMessage(LANG_BAD_VALUE); + handler->SetSentErrorMessage(true); + return false; + } + aura->SetDuration(time * IN_MILLISECONDS); + + return true; + } + + static bool HandleDeserterRemove(ChatHandler* handler, char const* /*args*/, bool isInstance) + { + Player* targetPlayer = handler->getSelectedPlayer(); + if (!targetPlayer) + { + handler->SendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + + targetPlayer->RemoveAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER); + + return true; + } + + static bool HandleDeserterInstanceAdd(ChatHandler* handler, char const* args) + { + return HandleDeserterAdd(handler, args, true); + } + + static bool HandleDeserterBGAdd(ChatHandler* handler, char const* args) + { + return HandleDeserterAdd(handler, args, false); + } + + static bool HandleDeserterInstanceRemove(ChatHandler* handler, char const* args) + { + return HandleDeserterRemove(handler, args, true); + } + + static bool HandleDeserterBGRemove(ChatHandler* handler, char const* args) + { + return HandleDeserterRemove(handler, args, false); + } +}; + + void AddSC_deserter_commandscript() +{ + new deserter_commandscript(); +} diff --git a/src/server/scripts/ScriptLoader.cpp b/src/server/scripts/ScriptLoader.cpp index 80c1e9921..61fb237fc 100644 --- a/src/server/scripts/ScriptLoader.cpp +++ b/src/server/scripts/ScriptLoader.cpp @@ -34,6 +34,7 @@ void AddSC_cast_commandscript(); void AddSC_character_commandscript(); void AddSC_cheat_commandscript(); void AddSC_debug_commandscript(); +void AddSC_deserter_commandscript(); void AddSC_disable_commandscript(); void AddSC_event_commandscript(); void AddSC_gm_commandscript(); @@ -611,6 +612,7 @@ void AddCommandScripts() AddSC_character_commandscript(); AddSC_cheat_commandscript(); AddSC_debug_commandscript(); + AddSC_deserter_commandscript(); AddSC_disable_commandscript(); AddSC_event_commandscript(); AddSC_gm_commandscript();