From df87f00e73722117c5d49632dc39505f64512fa1 Mon Sep 17 00:00:00 2001 From: QAston Date: Sat, 6 Aug 2011 22:49:25 +0200 Subject: [PATCH] Core/Commands: Add .cast dest #spellid #x #y #z which orders selected unit to cast a spell at selected destination. --- sql/base/world_database.sql | 1 + .../world/2011_08_06_03_world_command.sql | 3 ++ src/server/game/Chat/Chat.cpp | 1 + src/server/game/Chat/Chat.h | 1 + src/server/game/Chat/Commands/Level3.cpp | 45 +++++++++++++++++++ 5 files changed, 51 insertions(+) create mode 100644 sql/updates/world/2011_08_06_03_world_command.sql diff --git a/sql/base/world_database.sql b/sql/base/world_database.sql index 75970291f..fd56579ca 100644 --- a/sql/base/world_database.sql +++ b/sql/base/world_database.sql @@ -386,6 +386,7 @@ INSERT INTO `command` VALUES ('cast dist',3,'Syntax: .cast dist #spellid [#dist [triggered]]\r\n You will cast spell to pint at distance #dist. If ''trigered'' or part provided then spell casted with triggered flag. Not all spells can be casted as area spells.'), ('cast self',3,'Syntax: .cast self #spellid [triggered]\r\nCast #spellid by target at target itself. If ''trigered'' or part provided then spell casted with triggered flag.'), ('cast target',3,'Syntax: .cast target #spellid [triggered]\r\n Selected target will cast #spellid to his victim. If ''trigered'' or part provided then spell casted with triggered flag.'), +('cast dest',3,'Syntax: .cast dest #spellid #x #y #z [triggered]\r\n Selected target will cast #spellid at provided destination. If ''trigered'' or part provided then spell casted with triggered flag.'), ('character customize',2,'Syntax: .character customize [$name]\r\n\r\nMark selected in game or by $name in command character for customize at next login.'), ('character erase',4,'Syntax: .character erase $name\r\n\r\nDelete character $name. Character finally deleted in case any deleting options.'), ('character deleted delete', 4, 'Syntax: .character deleted delete #guid|$name\r\n\r\nCompletely deletes the selected characters.\r\nIf $name is supplied, only characters with that string in their name will be deleted, if #guid is supplied, only the character with that GUID will be deleted.'), diff --git a/sql/updates/world/2011_08_06_03_world_command.sql b/sql/updates/world/2011_08_06_03_world_command.sql new file mode 100644 index 000000000..7c627b1a9 --- /dev/null +++ b/sql/updates/world/2011_08_06_03_world_command.sql @@ -0,0 +1,3 @@ +DELETE FROM `command` WHERE `name` = 'cast dest'; +INSERT INTO `command` VALUES +('cast dest',3,'Syntax: .cast dest #spellid #x #y #z [triggered]\r\n Selected target will cast #spellid at provided destination. If ''trigered'' or part provided then spell casted with triggered flag.'); \ No newline at end of file diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index d0146184e..9509302f8 100755 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -98,6 +98,7 @@ ChatCommand * ChatHandler::getCommandTable() { "dist", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCastDistCommand>, "", NULL }, { "self", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCastSelfCommand>, "", NULL }, { "target", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCastTargetCommand>, "", NULL }, + { "dest", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCastDestCommand>, "", NULL }, { "", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleCastCommand>, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 217bb9538..d7a9c0b66 100755 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -152,6 +152,7 @@ class ChatHandler bool HandleCastDistCommand(const char *args); bool HandleCastSelfCommand(const char *args); bool HandleCastTargetCommand(const char *args); + bool HandleCastDestCommand(const char *args); bool HandleCharacterCustomizeCommand(const char * args); bool HandleCharacterChangeFactionCommand(const char * args); diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp index 1959feaaa..901d41e5c 100755 --- a/src/server/game/Chat/Commands/Level3.cpp +++ b/src/server/game/Chat/Commands/Level3.cpp @@ -3957,6 +3957,51 @@ bool ChatHandler::HandleCastTargetCommand(const char *args) return true; } +bool ChatHandler::HandleCastDestCommand(const char *args) +{ + Unit* caster = getSelectedUnit(); + if (!caster) + { + SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); + SetSentErrorMessage(true); + return false; + } + + // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form + uint32 spell = extractSpellIdFromLink((char*)args); + if (!spell || !sSpellMgr->GetSpellInfo(spell)) + { + PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); + SetSentErrorMessage(true); + return false; + } + + char* px = strtok(NULL, " "); + char* py = strtok(NULL, " "); + char* pz = strtok(NULL, " "); + + if (!px || !py || !pz) + return false; + + float x = (float)atof(px); + float y = (float)atof(py); + float z = (float)atof(pz); + + char* trig_str = strtok(NULL, " "); + if (trig_str) + { + int l = strlen(trig_str); + if (strncmp(trig_str, "triggered", l) != 0) + return false; + } + + bool triggered = (trig_str != NULL); + + caster->CastSpell(x, y, z, spell, triggered); + + return true; +} + /* ComeToMe command REQUIRED for 3rd party scripting library to have access to PointMovementGenerator Without this function 3rd party scripting library will get linking errors (unresolved external)