// // Licensed under the MIT License. See LICENSE file in the project root for full license information. // namespace MUnique.OpenMU.GameLogic.PlugIns.ChatCommands; using System.Runtime.InteropServices; using MUnique.OpenMU.GameLogic.PlayerActions; using MUnique.OpenMU.GameLogic.PlugIns.ChatCommands.Arguments; using MUnique.OpenMU.PlugIns; /// /// A chat command plugin which handles move commands. /// [Guid("4564AE2B-4819-4155-B5B2-FE2ED0CF7A7F")] [PlugIn] [Display(Name = nameof(PlugInResources.MoveChatCommandPlugIn_Name), Description = nameof(PlugInResources.MoveChatCommandPlugIn_Description), ResourceType = typeof(PlugInResources))] [ChatCommandHelp(Command, typeof(MoveChatCommandArgs), CharacterStatus.Normal)] public class MoveChatCommandPlugIn : ChatCommandPlugInBase { private const string Command = "/move"; /// public override string Key => Command; /// public override CharacterStatus MinCharacterStatusRequirement => CharacterStatus.Normal; /// protected override async ValueTask DoHandleCommandAsync(Player sender, MoveChatCommandArgs arguments) { var senderIsGameMaster = sender.SelectedCharacter?.CharacterStatus == CharacterStatus.GameMaster; var isGameMasterWarpingCharacter = senderIsGameMaster && !string.IsNullOrWhiteSpace(arguments.MapIdOrName); if (isGameMasterWarpingCharacter) { var targetPlayer = await this.GetPlayerByCharacterNameAsync(sender, arguments.Target!).ConfigureAwait(false); var exitGate = await this.GetExitGateAsync(sender, arguments.MapIdOrName!, arguments.Coordinates).ConfigureAwait(false); if (targetPlayer is null || exitGate is null) { return; } await targetPlayer.WarpToAsync(exitGate).ConfigureAwait(false); if (!targetPlayer.Name.Equals(sender.Name)) { await targetPlayer.ShowLocalizedBlueMessageAsync(nameof(PlayerMessage.MovedByGameMaster)).ConfigureAwait(false); await sender.ShowLocalizedBlueMessageAsync(nameof(PlayerMessage.MovedPlayerResult), this.Key, targetPlayer.Name, exitGate!.Map!.Name.GetTranslation(sender.Culture), targetPlayer.Position.X, targetPlayer.Position.Y).ConfigureAwait(false); } } else { var warpInfo = this.GetWarpInfo(sender, arguments.Target!); if (warpInfo != null) { await new WarpAction().WarpToAsync(sender, warpInfo).ConfigureAwait(false); } } } }