summaryrefslogtreecommitdiff
path: root/src/scripts/Commands/cs_tele.cpp
diff options
context:
space:
mode:
authorYehonal <yehonal.azeroth@gmail.com>2016-08-12 00:46:43 +0200
committerYehonal <yehonal.azeroth@gmail.com>2016-08-12 02:38:26 +0200
commitb0c8eceb08b9a7688893991e5ba4a3350617e6ed (patch)
tree39a52f0bea8e1ed803dc4298fdeb8b6bd808b67d /src/scripts/Commands/cs_tele.cpp
parenta73ad5cd6eefd619e9371d9b26c7e6317cacd7f7 (diff)
Refactoring part 2 [W.I.P]
Diffstat (limited to 'src/scripts/Commands/cs_tele.cpp')
-rw-r--r--src/scripts/Commands/cs_tele.cpp348
1 files changed, 348 insertions, 0 deletions
diff --git a/src/scripts/Commands/cs_tele.cpp b/src/scripts/Commands/cs_tele.cpp
new file mode 100644
index 0000000000..558994d0f5
--- /dev/null
+++ b/src/scripts/Commands/cs_tele.cpp
@@ -0,0 +1,348 @@
+/*
+ * Copyright (C)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 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 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 <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+Name: tele_commandscript
+%Complete: 100
+Comment: All tele related commands
+Category: commandscripts
+EndScriptData */
+
+#include "Chat.h"
+#include "Group.h"
+#include "Language.h"
+#include "MapManager.h"
+#include "ObjectMgr.h"
+#include "Player.h"
+#include "ScriptMgr.h"
+
+class tele_commandscript : public CommandScript
+{
+public:
+ tele_commandscript() : CommandScript("tele_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand teleCommandTable[] =
+ {
+ { "add", SEC_ADMINISTRATOR, false, &HandleTeleAddCommand, "", NULL },
+ { "del", SEC_ADMINISTRATOR, true, &HandleTeleDelCommand, "", NULL },
+ { "name", SEC_GAMEMASTER, true, &HandleTeleNameCommand, "", NULL },
+ { "group", SEC_GAMEMASTER, false, &HandleTeleGroupCommand, "", NULL },
+ { "", SEC_GAMEMASTER, false, &HandleTeleCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ static ChatCommand commandTable[] =
+ {
+ { "tele", SEC_GAMEMASTER, false, NULL, "", teleCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ static bool HandleTeleAddCommand(ChatHandler* handler, const char* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* player = handler->GetSession()->GetPlayer();
+ if (!player)
+ return false;
+
+ std::string name = args;
+
+ if (sObjectMgr->GetGameTele(name))
+ {
+ handler->SendSysMessage(LANG_COMMAND_TP_ALREADYEXIST);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ GameTele tele;
+ tele.position_x = player->GetPositionX();
+ tele.position_y = player->GetPositionY();
+ tele.position_z = player->GetPositionZ();
+ tele.orientation = player->GetOrientation();
+ tele.mapId = player->GetMapId();
+ tele.name = name;
+
+ if (sObjectMgr->AddGameTele(tele))
+ {
+ handler->SendSysMessage(LANG_COMMAND_TP_ADDED);
+ }
+ else
+ {
+ handler->SendSysMessage(LANG_COMMAND_TP_ADDEDERR);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ return true;
+ }
+
+ static bool HandleTeleDelCommand(ChatHandler* handler, const char* args)
+ {
+ if (!*args)
+ return false;
+
+ // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
+ GameTele const* tele = handler->extractGameTeleFromLink((char*)args);
+ if (!tele)
+ {
+ handler->SendSysMessage(LANG_COMMAND_TELE_NOTFOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ std::string name = tele->name;
+ sObjectMgr->DeleteGameTele(name);
+ handler->SendSysMessage(LANG_COMMAND_TP_DELETED);
+ return true;
+ }
+
+ // teleport player to given game_tele.entry
+ static bool HandleTeleNameCommand(ChatHandler* handler, const char* args)
+ {
+ char* nameStr;
+ char* teleStr;
+ handler->extractOptFirstArg((char*)args, &nameStr, &teleStr);
+ if (!teleStr)
+ return false;
+
+ Player* target;
+ uint64 target_guid;
+ std::string target_name;
+ if (!handler->extractPlayerTarget(nameStr, &target, &target_guid, &target_name))
+ return false;
+
+ if (strcmp(teleStr, "$home") == 0) // References target's homebind
+ {
+ if (target)
+ target->TeleportTo(target->m_homebindMapId, target->m_homebindX, target->m_homebindY, target->m_homebindZ, target->GetOrientation());
+ /* xinef: optimization, not needed function
+ else
+ {
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_HOMEBIND);
+ stmt->setUInt32(0, target_guid);
+ PreparedQueryResult resultDB = CharacterDatabase.Query(stmt);
+
+ if (resultDB)
+ {
+ Field* fieldsDB = resultDB->Fetch();
+ uint32 mapId = fieldsDB[0].GetUInt16();
+ uint32 zoneId = fieldsDB[1].GetUInt16();
+ float posX = fieldsDB[2].GetFloat();
+ float posY = fieldsDB[3].GetFloat();
+ float posZ = fieldsDB[4].GetFloat();
+
+ Player::SavePositionInDB(mapId, posX, posY, posZ, 0, zoneId, target_guid);
+ }
+ }*/
+
+ return true;
+ }
+
+ // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
+ GameTele const* tele = handler->extractGameTeleFromLink(teleStr);
+ if (!tele)
+ {
+ handler->SendSysMessage(LANG_COMMAND_TELE_NOTFOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (target)
+ {
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ std::string chrNameLink = handler->playerLink(target_name);
+
+ if (target->IsBeingTeleported() == true)
+ {
+ handler->PSendSysMessage(LANG_IS_TELEPORTED, chrNameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_TELEPORTING_TO, chrNameLink.c_str(), "", tele->name.c_str());
+ if (handler->needReportToTarget(target))
+ (ChatHandler(target->GetSession())).PSendSysMessage(LANG_TELEPORTED_TO_BY, handler->GetNameLink().c_str());
+
+ // stop flight if need
+ if (target->IsInFlight())
+ {
+ target->GetMotionMaster()->MovementExpired();
+ target->CleanupAfterTaxiFlight();
+ }
+ // save only in non-flight case
+ else
+ target->SaveRecallPosition();
+
+ target->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation);
+ }
+ else
+ {
+ // check offline security
+ if (handler->HasLowerSecurity(NULL, target_guid))
+ return false;
+
+ std::string nameLink = handler->playerLink(target_name);
+
+ handler->PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE), tele->name.c_str());
+ Player::SavePositionInDB(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation,
+ sMapMgr->GetZoneId(tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid);
+ }
+
+ return true;
+ }
+
+ //Teleport group to given game_tele.entry
+ static bool HandleTeleGroupCommand(ChatHandler* handler, const char* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* target = handler->getSelectedPlayer();
+ if (!target)
+ {
+ handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // check online security
+ if (handler->HasLowerSecurity(target, 0))
+ return false;
+
+ // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
+ GameTele const* tele = handler->extractGameTeleFromLink((char*)args);
+ if (!tele)
+ {
+ handler->SendSysMessage(LANG_COMMAND_TELE_NOTFOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ MapEntry const* map = sMapStore.LookupEntry(tele->mapId);
+ if (!map || map->IsBattlegroundOrArena())
+ {
+ handler->SendSysMessage(LANG_CANNOT_TELE_TO_BG);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ std::string nameLink = handler->GetNameLink(target);
+
+ Group* grp = target->GetGroup();
+ if (!grp)
+ {
+ handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
+ {
+ Player* player = itr->GetSource();
+
+ if (!player || !player->GetSession())
+ continue;
+
+ // check online security
+ if (handler->HasLowerSecurity(player, 0))
+ return false;
+
+ std::string plNameLink = handler->GetNameLink(player);
+
+ if (player->IsBeingTeleported())
+ {
+ handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str());
+ continue;
+ }
+
+ handler->PSendSysMessage(LANG_TELEPORTING_TO, plNameLink.c_str(), "", tele->name.c_str());
+ if (handler->needReportToTarget(player))
+ (ChatHandler(player->GetSession())).PSendSysMessage(LANG_TELEPORTED_TO_BY, nameLink.c_str());
+
+ // stop flight if need
+ if (player->IsInFlight())
+ {
+ player->GetMotionMaster()->MovementExpired();
+ player->CleanupAfterTaxiFlight();
+ }
+ // save only in non-flight case
+ else
+ player->SaveRecallPosition();
+
+ player->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation);
+ }
+
+ return true;
+ }
+
+ static bool HandleTeleCommand(ChatHandler* handler, const char* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* me = handler->GetSession()->GetPlayer();
+
+ // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
+ GameTele const* tele = handler->extractGameTeleFromLink((char*)args);
+
+ if (!tele)
+ {
+ handler->SendSysMessage(LANG_COMMAND_TELE_NOTFOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (me->IsInCombat())
+ {
+ handler->SendSysMessage(LANG_YOU_IN_COMBAT);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ MapEntry const* map = sMapStore.LookupEntry(tele->mapId);
+ if (!map || map->IsBattlegroundOrArena())
+ {
+ handler->SendSysMessage(LANG_CANNOT_TELE_TO_BG);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // stop flight if need
+ if (me->IsInFlight())
+ {
+ me->GetMotionMaster()->MovementExpired();
+ me->CleanupAfterTaxiFlight();
+ }
+ // save only in non-flight case
+ else
+ me->SaveRecallPosition();
+
+ me->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation);
+ return true;
+ }
+};
+
+void AddSC_tele_commandscript()
+{
+ new tele_commandscript();
+}