Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
cs_tele.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6/* ScriptData
7Name: tele_commandscript
8%Complete: 100
9Comment: All tele related commands
10Category: commandscripts
11EndScriptData */
12
13#include "Chat.h"
14#include "Group.h"
15#include "Language.h"
16#include "MapManager.h"
17#include "ObjectMgr.h"
18#include "Player.h"
19#include "ScriptMgr.h"
20
22{
23public:
24 tele_commandscript() : CommandScript("tele_commandscript") { }
25
26 std::vector<ChatCommand> GetCommands() const OVERRIDE
27 {
28 static std::vector<ChatCommand> teleCommandTable =
29 {
35 };
36 static std::vector<ChatCommand> commandTable =
37 {
38 { "tele", rbac::RBAC_PERM_COMMAND_TELE, false, NULL, "", teleCommandTable },
39 };
40 return commandTable;
41 }
42
43 static bool HandleTeleAddCommand(ChatHandler* handler, const char* args)
44 {
45 if (!*args)
46 return false;
47
48 Player* player = handler->GetSession()->GetPlayer();
49 if (!player)
50 return false;
51
52 std::string name = args;
53
54 if (sObjectMgr->GetGameTeleExactName(name))
55 {
57 handler->SetSentErrorMessage(true);
58 return false;
59 }
60
61 GameTele tele;
62 tele.position_x = player->GetPositionX();
63 tele.position_y = player->GetPositionY();
64 tele.position_z = player->GetPositionZ();
65 tele.orientation = player->GetOrientation();
66 tele.mapId = player->GetMapId();
67 tele.name = name;
68
69 if (sObjectMgr->AddGameTele(tele))
70 {
72 }
73 else
74 {
76 handler->SetSentErrorMessage(true);
77 return false;
78 }
79
80 return true;
81 }
82
83 static bool HandleTeleDelCommand(ChatHandler* handler, const char* args)
84 {
85 if (!*args)
86 return false;
87
88 // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
89 GameTele const* tele = handler->extractGameTeleFromLink((char*)args);
90 if (!tele)
91 {
93 handler->SetSentErrorMessage(true);
94 return false;
95 }
96 std::string name = tele->name;
97 sObjectMgr->DeleteGameTele(name);
99 return true;
100 }
101
102 // teleport player to given game_tele.entry
103 static bool HandleTeleNameCommand(ChatHandler* handler, const char* args)
104 {
105 char* nameStr;
106 char* teleStr;
107 handler->extractOptFirstArg((char*)args, &nameStr, &teleStr);
108 if (!teleStr)
109 return false;
110
111 Player* target;
112 uint64 target_guid;
113 std::string target_name;
114 if (!handler->extractPlayerTarget(nameStr, &target, &target_guid, &target_name))
115 return false;
116
117 if (strcmp(teleStr, "$home") == 0) // References target's homebind
118 {
119 if (target)
120 target->TeleportTo(target->m_homebindMapId, target->m_homebindX, target->m_homebindY, target->m_homebindZ, target->GetOrientation());
121 else
122 {
123 PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_HOMEBIND);
124 stmt->setUInt32(0, target_guid);
125 PreparedQueryResult resultDB = CharacterDatabase.Query(stmt);
126
127 if (resultDB)
128 {
129 Field* fieldsDB = resultDB->Fetch();
130 uint32 mapId = fieldsDB[0].GetUInt16();
131 uint32 zoneId = fieldsDB[1].GetUInt16();
132 float posX = fieldsDB[2].GetFloat();
133 float posY = fieldsDB[3].GetFloat();
134 float posZ = fieldsDB[4].GetFloat();
135
136 Player::SavePositionInDB(mapId, posX, posY, posZ, 0, zoneId, target_guid);
137 }
138 }
139
140 return true;
141 }
142
143 // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
144 GameTele const* tele = handler->extractGameTeleFromLink(teleStr);
145 if (!tele)
146 {
148 handler->SetSentErrorMessage(true);
149 return false;
150 }
151
152 if (target)
153 {
154 // check online security
155 if (handler->HasLowerSecurity(target, 0))
156 return false;
157
158 std::string chrNameLink = handler->playerLink(target_name);
159
160 if (target->IsBeingTeleported() == true)
161 {
162 handler->PSendSysMessage(LANG_IS_TELEPORTED, chrNameLink.c_str());
163 handler->SetSentErrorMessage(true);
164 return false;
165 }
166
167 handler->PSendSysMessage(LANG_TELEPORTING_TO, chrNameLink.c_str(), "", tele->name.c_str());
168 if (handler->needReportToTarget(target))
170
171 // stop flight if need
172 if (target->IsInFlight())
173 {
174 target->GetMotionMaster()->MovementExpired();
175 target->CleanupAfterTaxiFlight();
176 }
177 // save only in non-flight case
178 else
179 target->SaveRecallPosition();
180
181 target->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation);
182 }
183 else
184 {
185 // check offline security
186 if (handler->HasLowerSecurity(NULL, target_guid))
187 return false;
188
189 std::string nameLink = handler->playerLink(target_name);
190
191 handler->PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), handler->GetSkyFireString(LANG_OFFLINE), tele->name.c_str());
193 sMapMgr->GetZoneId(tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid);
194 }
195
196 return true;
197 }
198
199 //Teleport group to given game_tele.entry
200 static bool HandleTeleGroupCommand(ChatHandler* handler, const char* args)
201 {
202 if (!*args)
203 return false;
204
205 Player* target = handler->getSelectedPlayer();
206 if (!target)
207 {
209 handler->SetSentErrorMessage(true);
210 return false;
211 }
212
213 // check online security
214 if (handler->HasLowerSecurity(target, 0))
215 return false;
216
217 // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
218 GameTele const* tele = handler->extractGameTeleFromLink((char*)args);
219 if (!tele)
220 {
222 handler->SetSentErrorMessage(true);
223 return false;
224 }
225
226 MapEntry const* map = sMapStore.LookupEntry(tele->mapId);
227 if (!map || map->IsBattlegroundOrArena())
228 {
230 handler->SetSentErrorMessage(true);
231 return false;
232 }
233
234 std::string nameLink = handler->GetNameLink(target);
235
236 Group* grp = target->GetGroup();
237 if (!grp)
238 {
239 handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str());
240 handler->SetSentErrorMessage(true);
241 return false;
242 }
243
244 for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
245 {
246 Player* player = itr->GetSource();
247
248 if (!player || !player->GetSession())
249 continue;
250
251 // check online security
252 if (handler->HasLowerSecurity(player, 0))
253 return false;
254
255 std::string plNameLink = handler->GetNameLink(player);
256
257 if (player->IsBeingTeleported())
258 {
259 handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str());
260 continue;
261 }
262
263 handler->PSendSysMessage(LANG_TELEPORTING_TO, plNameLink.c_str(), "", tele->name.c_str());
264 if (handler->needReportToTarget(player))
265 ChatHandler(player->GetSession()).PSendSysMessage(LANG_TELEPORTED_TO_BY, nameLink.c_str());
266
267 // stop flight if need
268 if (player->IsInFlight())
269 {
270 player->GetMotionMaster()->MovementExpired();
271 player->CleanupAfterTaxiFlight();
272 }
273 // save only in non-flight case
274 else
275 player->SaveRecallPosition();
276
277 player->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation);
278 }
279
280 return true;
281 }
282
283 static bool HandleTeleCommand(ChatHandler* handler, const char* args)
284 {
285 if (!*args)
286 return false;
287
288 Player* me = handler->GetSession()->GetPlayer();
289
290 // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
291 GameTele const* tele = handler->extractGameTeleFromLink((char*)args);
292
293 if (!tele)
294 {
296 handler->SetSentErrorMessage(true);
297 return false;
298 }
299
300 if (me->IsInCombat())
301 {
303 handler->SetSentErrorMessage(true);
304 return false;
305 }
306
307 MapEntry const* map = sMapStore.LookupEntry(tele->mapId);
308 if (!map || map->IsBattlegroundOrArena())
309 {
311 handler->SetSentErrorMessage(true);
312 return false;
313 }
314
315 // stop flight if need
316 if (me->IsInFlight())
317 {
320 }
321 // save only in non-flight case
322 else
323 me->SaveRecallPosition();
324
325 me->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation);
326 return true;
327 }
328};
329
@ CHAR_SEL_CHAR_HOMEBIND
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ LANG_COMMAND_TP_ALREADYEXIST
Definition Language.h:442
@ LANG_OFFLINE
Definition Language.h:50
@ LANG_COMMAND_TP_ADDEDERR
Definition Language.h:444
@ LANG_NOT_IN_GROUP
Definition Language.h:119
@ LANG_IS_TELEPORTED
Definition Language.h:104
@ LANG_YOU_IN_COMBAT
Definition Language.h:36
@ LANG_COMMAND_TP_DELETED
Definition Language.h:445
@ LANG_NO_CHAR_SELECTED
Definition Language.h:118
@ LANG_COMMAND_TP_ADDED
Definition Language.h:443
@ LANG_TELEPORTED_TO_BY
Definition Language.h:113
@ LANG_COMMAND_TELE_NOTFOUND
Definition Language.h:173
@ LANG_TELEPORTING_TO
Definition Language.h:112
@ LANG_CANNOT_TELE_TO_BG
Definition Language.h:715
#define sMapMgr
Definition MapManager.h:145
#define sObjectMgr
Definition ObjectMgr.h:1617
Skyfire::AutoPtr< PreparedResultSet, Skyfire::Mutex > PreparedQueryResult
Definition QueryResult.h:94
virtual std::string GetNameLink() const
Definition Chat.h:79
GameTele const * extractGameTeleFromLink(char *text)
Definition Chat.cpp:1089
bool HasLowerSecurity(Player *target, uint64 guid, bool strong=false)
Definition Chat.cpp:78
void extractOptFirstArg(char *args, char **arg1, char **arg2)
Definition Chat.cpp:1237
std::string playerLink(std::string const &name) const
Definition Chat.h:108
Player * getSelectedPlayer()
Definition Chat.cpp:829
WorldSession * GetSession()
Definition Chat.h:43
void PSendSysMessage(const char *format,...) ATTR_PRINTF(2
Definition Chat.cpp:221
void SetSentErrorMessage(bool val)
Definition Chat.h:114
bool extractPlayerTarget(char *args, Player **player, uint64 *player_guid=NULL, std::string *player_name=NULL)
Definition Chat.cpp:1184
virtual bool needReportToTarget(Player *chr) const
Definition Chat.cpp:1271
virtual void SendSysMessage(const char *str)
Definition Chat.cpp:153
virtual const char * GetSkyFireString(int32 entry) const
Definition Chat.cpp:68
CommandScript(const char *name)
Definition Field.h:16
uint16 GetUInt16() const
Definition Field.h:69
float GetFloat() const
Definition Field.h:177
Definition Group.h:147
GroupReference * GetFirstMember()
Definition Group.h:225
GroupReference * next()
void MovementExpired(bool reset=true)
float m_homebindZ
Definition Player.h:2851
uint32 m_homebindMapId
Definition Player.h:2847
static void SavePositionInDB(uint32 mapid, float x, float y, float z, float o, uint32 zone, uint64 guid)
Definition Player.cpp:15406
WorldSession * GetSession() const
Definition Player.h:2417
void SaveRecallPosition()
Definition Player.cpp:6866
float m_homebindY
Definition Player.h:2850
Group * GetGroup()
Definition Player.h:2972
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0)
Definition Player.cpp:2090
void CleanupAfterTaxiFlight()
Definition Player.cpp:16748
bool IsBeingTeleported() const
Definition Player.h:2493
float m_homebindX
Definition Player.h:2849
void setUInt32(const uint8 index, const uint32 value)
MotionMaster * GetMotionMaster()
Definition Unit.h:2605
bool IsInFlight() const
Definition Unit.h:1891
bool IsInCombat() const
Definition Unit.h:1896
uint32 GetMapId() const
Definition Object.h:546
Player * GetPlayer() const
static bool HandleTeleNameCommand(ChatHandler *handler, const char *args)
Definition cs_tele.cpp:103
static bool HandleTeleAddCommand(ChatHandler *handler, const char *args)
Definition cs_tele.cpp:43
static bool HandleTeleGroupCommand(ChatHandler *handler, const char *args)
Definition cs_tele.cpp:200
static bool HandleTeleCommand(ChatHandler *handler, const char *args)
Definition cs_tele.cpp:283
static bool HandleTeleDelCommand(ChatHandler *handler, const char *args)
Definition cs_tele.cpp:83
std::vector< ChatCommand > GetCommands() const OVERRIDE
Definition cs_tele.cpp:26
void AddSC_tele_commandscript()
Definition cs_tele.cpp:330
CharacterDatabaseWorkerPool CharacterDatabase
Accessor to the character database.
Definition Main.cpp:41
@ RBAC_PERM_COMMAND_TELE_GROUP
Definition RBAC.h:629
@ RBAC_PERM_COMMAND_TELE_ADD
Definition RBAC.h:626
@ RBAC_PERM_COMMAND_TELE_NAME
Definition RBAC.h:628
@ RBAC_PERM_COMMAND_TELE
Definition RBAC.h:625
@ RBAC_PERM_COMMAND_TELE_DEL
Definition RBAC.h:627
float position_y
Definition ObjectMgr.h:127
float orientation
Definition ObjectMgr.h:129
float position_x
Definition ObjectMgr.h:126
uint32 mapId
Definition ObjectMgr.h:130
std::string name
Definition ObjectMgr.h:131
float position_z
Definition ObjectMgr.h:128
bool IsBattlegroundOrArena() const
float GetPositionZ() const
Definition Object.h:330
float GetOrientation() const
Definition Object.h:331
float GetPositionX() const
Definition Object.h:328
float GetPositionY() const
Definition Object.h:329