Core/Commands: Implemented command to teleport character to npc

Port From (https://github.com/TrinityCore/TrinityCore/commit/e93ef06b05c27c7c79b234e331a0d26aa956ba65)
This commit is contained in:
hondacrx
2022-06-09 21:15:23 -04:00
parent 452dd95e39
commit 34ace549e8
2 changed files with 146 additions and 47 deletions
+126 -31
View File
@@ -23,6 +23,7 @@ using Game.Entities;
using Game.Groups; using Game.Groups;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Game.Maps;
namespace Game.Chat namespace Game.Chat
{ {
@@ -30,15 +31,16 @@ namespace Game.Chat
class TeleCommands class TeleCommands
{ {
[Command("", RBACPermissions.CommandTele)] [Command("", RBACPermissions.CommandTele)]
static bool HandleTeleCommand(CommandHandler handler, GameTele tele) static bool HandleTeleCommand(CommandHandler handler, string name)
{ {
var tele = Global.ObjectMgr.GetGameTele(name);
if (tele == null) if (tele == null)
{ {
handler.SendSysMessage(CypherStrings.CommandTeleNotfound); handler.SendSysMessage(CypherStrings.CommandTeleNotfound);
return false; return false;
} }
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetPlayer();
if (player.IsInCombat() && !handler.GetSession().HasPermission(RBACPermissions.CommandTeleName)) if (player.IsInCombat() && !handler.GetSession().HasPermission(RBACPermissions.CommandTeleName))
{ {
handler.SendSysMessage(CypherStrings.YouInCombat); handler.SendSysMessage(CypherStrings.YouInCombat);
@@ -65,7 +67,7 @@ namespace Game.Chat
[Command("add", RBACPermissions.CommandTeleAdd)] [Command("add", RBACPermissions.CommandTeleAdd)]
static bool HandleTeleAddCommand(CommandHandler handler, string name) static bool HandleTeleAddCommand(CommandHandler handler, string name)
{ {
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetPlayer();
if (player == null) if (player == null)
return false; return false;
@@ -98,8 +100,9 @@ namespace Game.Chat
} }
[Command("del", RBACPermissions.CommandTeleDel, true)] [Command("del", RBACPermissions.CommandTeleDel, true)]
static bool HandleTeleDelCommand(CommandHandler handler, GameTele tele) static bool HandleTeleDelCommand(CommandHandler handler, string name)
{ {
var tele = Global.ObjectMgr.GetGameTele(name);
if (tele == null) if (tele == null)
{ {
handler.SendSysMessage(CypherStrings.CommandTeleNotfound); handler.SendSysMessage(CypherStrings.CommandTeleNotfound);
@@ -112,8 +115,9 @@ namespace Game.Chat
} }
[Command("group", RBACPermissions.CommandTeleGroup)] [Command("group", RBACPermissions.CommandTeleGroup)]
static bool HandleTeleGroupCommand(CommandHandler handler, GameTele tele) static bool HandleTeleGroupCommand(CommandHandler handler, string name)
{ {
var tele = Global.ObjectMgr.GetGameTele(name);
if (tele == null) if (tele == null)
{ {
handler.SendSysMessage(CypherStrings.CommandTeleNotfound); handler.SendSysMessage(CypherStrings.CommandTeleNotfound);
@@ -181,7 +185,60 @@ namespace Game.Chat
return true; return true;
} }
[Command("name", RBACPermissions.CommandTeleName, true)] static bool DoNameTeleport(CommandHandler handler, PlayerIdentifier player, uint mapId, Position pos, string locationName)
{
if (!GridDefines.IsValidMapCoord(mapId, pos) || Global.ObjectMgr.IsTransportMap(mapId))
{
handler.SendSysMessage(CypherStrings.InvalidTargetCoord, pos.GetPositionX(), pos.GetPositionY(), mapId);
return false;
}
Player target = player.GetConnectedPlayer();
if (target != null)
{
// check online security
if (handler.HasLowerSecurity(target, ObjectGuid.Empty))
return false;
string chrNameLink = handler.PlayerLink(target.GetName());
if (target.IsBeingTeleported() == true)
{
handler.SendSysMessage(CypherStrings.IsTeleported, chrNameLink);
return false;
}
handler.SendSysMessage(CypherStrings.TeleportingTo, chrNameLink, "", locationName);
if (handler.NeedReportToTarget(target))
target.SendSysMessage(CypherStrings.TeleportedToBy, handler.GetNameLink());
// stop flight if need
if (target.IsInFlight())
target.FinishTaxiFlight();
else
target.SaveRecallPosition(); // save only in non-flight case
target.TeleportTo(new WorldLocation(mapId, pos));
}
else
{
// check offline security
if (handler.HasLowerSecurity(null, player.GetGUID()))
return false;
string nameLink = handler.PlayerLink(player.GetName());
handler.SendSysMessage(CypherStrings.TeleportingTo, nameLink, handler.GetCypherString(CypherStrings.Offline), locationName);
Player.SavePositionInDB(new WorldLocation(mapId, pos), Global.MapMgr.GetZoneId(PhasingHandler.EmptyPhaseShift, new WorldLocation(mapId, pos)), player.GetGUID(), null);
}
return true;
}
class TeleNameCommands
{
[Command("", RBACPermissions.CommandTeleName, true)]
static bool HandleTeleNameCommand(CommandHandler handler, string playerName, string where) static bool HandleTeleNameCommand(CommandHandler handler, string playerName, string where)
{ {
var player = PlayerIdentifier.ParseFromString(playerName); var player = PlayerIdentifier.ParseFromString(playerName);
@@ -219,47 +276,85 @@ namespace Game.Chat
if (tele == null) if (tele == null)
return false; return false;
if (target) return DoNameTeleport(handler, player, tele.mapId, new Position(tele.posX, tele.posY, tele.posZ, tele.orientation), tele.name);
}
class TeleNameNpcCommands
{ {
// check online security [Command("guid", RBACPermissions.CommandTeleName, true)]
if (handler.HasLowerSecurity(target, ObjectGuid.Empty)) static bool HandleTeleNameNpcSpawnIdCommand(CommandHandler handler, string playerName, ulong spawnId)
{
var player = PlayerIdentifier.ParseFromString(playerName);
if (player == null)
return false; return false;
string chrNameLink = handler.PlayerLink(target.GetName()); CreatureData spawnpoint = Global.ObjectMgr.GetCreatureData(spawnId);
if (spawnpoint == null)
if (target.IsBeingTeleported() == true)
{ {
handler.SendSysMessage(CypherStrings.IsTeleported, chrNameLink); handler.SendSysMessage(CypherStrings.CommandGocreatnotfound);
return false; return false;
} }
handler.SendSysMessage(CypherStrings.TeleportingTo, chrNameLink, "", tele.name); CreatureTemplate creatureTemplate = Global.ObjectMgr.GetCreatureTemplate(spawnpoint.Id);
if (handler.NeedReportToTarget(target))
target.SendSysMessage(CypherStrings.TeleportedToBy, handler.GetNameLink());
// stop flight if need return DoNameTeleport(handler, player, spawnpoint.MapId, spawnpoint.SpawnPoint, creatureTemplate.Name);
if (target.IsInFlight())
target.FinishTaxiFlight();
else
target.SaveRecallPosition(); // save only in non-flight case
target.TeleportTo(tele.mapId, tele.posX, tele.posY, tele.posZ, tele.orientation);
} }
[Command("id", RBACPermissions.CommandTeleName, true)]
static bool HandleTeleNameNpcIdCommand(CommandHandler handler, string playerName, uint creatureId)
{
var player = PlayerIdentifier.ParseFromString(playerName);
if (player == null)
return false;
CreatureData spawnpoint = null;
foreach (var (id, creatureData) in Global.ObjectMgr.GetAllCreatureData())
{
if (id != creatureId)
continue;
if (spawnpoint == null)
spawnpoint = creatureData;
else else
{ {
// check offline security handler.SendSysMessage(CypherStrings.CommandGocreatmultiple);
if (handler.HasLowerSecurity(null, target.GetGUID())) break;
}
}
if (spawnpoint == null)
{
handler.SendSysMessage(CypherStrings.CommandGocreatnotfound);
return false;
}
CreatureTemplate creatureTemplate = Global.ObjectMgr.GetCreatureTemplate(creatureId);
return DoNameTeleport(handler, player, spawnpoint.MapId, spawnpoint.SpawnPoint, creatureTemplate.Name);
}
[Command("name", RBACPermissions.CommandTeleName, true)]
static bool HandleTeleNameNpcNameCommand(CommandHandler handler, string playerName, string name)
{
var player = PlayerIdentifier.ParseFromString(playerName);
if (player == null)
return false; return false;
string nameLink = handler.PlayerLink(target.GetName()); DB.World.EscapeString(ref name);
handler.SendSysMessage(CypherStrings.TeleportingTo, nameLink, handler.GetCypherString(CypherStrings.Offline), tele.name); SQLResult result = DB.World.Query($"SELECT c.position_x, c.position_y, c.position_z, c.orientation, c.map, ct.name FROM creature c INNER JOIN creature_template ct ON c.id = ct.entry WHERE ct.name LIKE '{name}'");
if (result.IsEmpty())
Player.SavePositionInDB(new WorldLocation(tele.mapId, tele.posX, tele.posY, tele.posZ, tele.orientation), {
Global.MapMgr.GetZoneId(PhasingHandler.EmptyPhaseShift, tele.mapId, tele.posX, tele.posY, tele.posZ), target.GetGUID()); handler.SendSysMessage(CypherStrings.CommandGocreatnotfound);
return false;
} }
return true; if (result.NextRow())
handler.SendSysMessage(CypherStrings.CommandGocreatmultiple);
return DoNameTeleport(handler, player, result.Read<ushort>(4), new Position(result.Read<float>(0), result.Read<float>(1), result.Read<float>(2), result.Read<float>(3)), result.Read<string>(5));
}
}
} }
} }
} }
+4
View File
@@ -428,6 +428,10 @@ namespace Game.Entities
return GetAreaId(phaseShift, loc.GetMapId(), loc); return GetAreaId(phaseShift, loc.GetMapId(), loc);
} }
public uint GetZoneId(PhaseShift phaseShift, uint mapid, Position pos) { return GetZoneId(phaseShift, mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); }
public uint GetZoneId(PhaseShift phaseShift, WorldLocation loc) { return GetZoneId(phaseShift, loc.GetMapId(), loc); }
public uint GetZoneId(PhaseShift phaseShift, uint mapid, float x, float y, float z) public uint GetZoneId(PhaseShift phaseShift, uint mapid, float x, float y, float z)
{ {
Map m = CreateBaseMap(mapid); Map m = CreateBaseMap(mapid);