diff --git a/GameServer/Controllers/ChatCommands/ChatPlayerCommandHandler.cs b/GameServer/Controllers/ChatCommands/ChatPlayerCommandHandler.cs new file mode 100644 index 0000000..261d444 --- /dev/null +++ b/GameServer/Controllers/ChatCommands/ChatPlayerCommandHandler.cs @@ -0,0 +1,68 @@ +using Core.Config; +using GameServer.Controllers.Attributes; +using GameServer.Models; +using GameServer.Models.Chat; +using GameServer.Network; +using GameServer.Systems.Entity; +using Protocol; + +namespace GameServer.Controllers.ChatCommands; + +[ChatCommandCategory("player")] +internal class ChatPlayerCommandHandler +{ + private readonly ChatRoom _helperRoom; + private readonly PlayerSession _session; + private readonly CreatureController _creatureController; + + public ChatPlayerCommandHandler(ModelManager modelManager, PlayerSession session, CreatureController creatureController) + { + _helperRoom = modelManager.Chat.GetChatRoom(1338); + _session = session; + _creatureController = creatureController; + } + + [ChatCommand("getpos")] + [ChatCommandDesc("/player getpos - shows current player coordinates")] + public void OnPlayerGetPosCommand(string[] _) + { + PlayerEntity? entity = _creatureController.GetPlayerEntity(); + if (entity == null) return; + + _helperRoom.AddMessage(1338, 0, $"Your current position: ({entity.Pos.X / 100}, {entity.Pos.Y / 100}, {entity.Pos.Z / 100})"); + } + + [ChatCommand("teleport")] + [ChatCommandDesc("/player teleport [x] [y] [z] - performing fast travel to specified position")] + public async Task OnPlayerTeleportCommand(string[] args) + { + if (args.Length != 3 || !float.TryParse(args[0], out float x) + || !float.TryParse(args[1], out float y) + || !float.TryParse(args[2], out float z)) + { + _helperRoom.AddMessage(1338, 0, $"Usage: /player teleport [x] [y] [z]"); + return; + } + + PlayerEntity? entity = _creatureController.GetPlayerEntity(); + + if (entity != null) + { + await _session.Push(MessageId.TeleportNotify, new TeleportNotify + { + PosX = x * 100, + PosY = y * 100, + PosZ = z * 100, + PosA = 0, + MapId = 8, + Reason = (int)TeleportReason.Gm, + TransitionOption = new TransitionOptionPb + { + TransitionType = (int)TransitionType.Empty + } + }); + } + + _helperRoom.AddMessage(1338, 0, $"Successfully performed fast travel to ({x}, {y}, {z})"); + } +}