protected override async UniTask OnExecuteAsync() { if (Context.Parameters.Length != 1) { throw new CommandWrongUsageException(Context); } var warpsData = await m_DataStore.LoadAsync <WarpsData>(WarpsKey); string searchTerm = Context.Parameters[0]; if (!warpsData.Warps.ContainsKey(searchTerm)) { throw new UserFriendlyException(m_StringLocalizer["warps:none", new { Warp = searchTerm }]); } if (await m_PermissionChecker.CheckPermissionAsync(Context.Actor, $"warps.{searchTerm}") == PermissionGrantResult.Deny) { throw new UserFriendlyException(m_StringLocalizer["warps:no_permission", new { Warp = searchTerm }]); } UnturnedUser uPlayer = (UnturnedUser)Context.Actor; var warp = warpsData.Warps[searchTerm]; double?cooldown = await m_CooldownManager.OnCooldownAsync(uPlayer, "warps", searchTerm, warp.Cooldown); if (cooldown.HasValue) { throw new UserFriendlyException(m_StringLocalizer["warps:cooldown", new { Time = cooldown, Warp = searchTerm }]); } // Delay warping so that they cannot escape combat int delay = m_Configuration.GetValue <int>("teleportation:delay"); bool cancelOnMove = m_Configuration.GetValue <bool>("teleportation:cancelOnMove"); bool cancelOnDamage = m_Configuration.GetValue <bool>("teleportation:cancelOnDamage"); // Tell the player of the delay and not to move await uPlayer.PrintMessageAsync(m_StringLocalizer["warps:success", new { Warp = searchTerm, Time = delay }]); bool success = await m_TeleportService.TeleportAsync(uPlayer, new TeleportOptions(m_PluginAccessor.Instance, delay, cancelOnMove, cancelOnDamage)); if (!success) { throw new UserFriendlyException(m_StringLocalizer["teleport:canceled"]); } await UniTask.SwitchToMainThread(); uPlayer.Player.Player.teleportToLocation(warp.Location.ToUnityVector3(), uPlayer.Player.Player.transform.eulerAngles.y); }
protected override async UniTask OnExecuteAsync() { if (Context.Parameters.Length > 1) { throw new CommandWrongUsageException(Context); } UnturnedUser uPlayer = (UnturnedUser)Context.Actor; bool bed = Context.Parameters.Length == 0; string homeName = Context.Parameters.Length == 1 ? Context.Parameters[0] : ""; SerializableVector3 home = null; // If user is teleporting to a home, query the datastore for the Vector3 location if (!bed) { UserData userData = await m_UserDataStore.GetUserDataAsync(uPlayer.Id, uPlayer.Type); if (!userData.Data.ContainsKey("homes")) { throw new UserFriendlyException(m_StringLocalizer["home:no_home"]); } var homes = (Dictionary <object, object>)userData.Data["homes"]; if (!homes.ContainsKey(homeName)) { throw new UserFriendlyException(m_StringLocalizer["home:invalid_home", new { Home = homeName }]); } home = SerializableVector3.Deserialize(homes[homeName]); if (home == null) { throw new UserFriendlyException(m_StringLocalizer["home:invalid_home", new { Home = homeName }]); } } // Here we will delay the teleportation whether it be to a bed or home int delay = m_Configuration.GetValue <int>("teleportation:delay"); bool cancelOnMove = m_Configuration.GetValue <bool>("teleportation:cancelOnMove"); bool cancelOnDamage = m_Configuration.GetValue <bool>("teleportation:cancelOnDamage"); await uPlayer.PrintMessageAsync(m_StringLocalizer["home:success", new { Home = homeName, Time = delay }]); bool success = await m_TeleportService.TeleportAsync(uPlayer, new TeleportOptions(m_PluginAccessor.Instance, delay, cancelOnMove, cancelOnDamage)); if (!success) { throw new UserFriendlyException(m_StringLocalizer["teleport:canceled"]); } // Bed-specific teleportation if (bed) { await UniTask.SwitchToMainThread(); if (!uPlayer.Player.Player.teleportToBed()) { throw new UserFriendlyException(m_StringLocalizer["home:no_bed"]); } return; } if (!await uPlayer.Player.Player.TeleportToLocationAsync(home.ToUnityVector3())) { throw new UserFriendlyException(m_StringLocalizer["home:failure", new { Home = homeName }]); } }
protected override async UniTask OnExecuteAsync() { if (Context.Parameters.Length > 1) { throw new CommandWrongUsageException(Context); } UnturnedUser uPlayer = (UnturnedUser)Context.Actor; ulong recipientSteamID = uPlayer.SteamId.m_SteamID; UnturnedUser requester; switch (Context.Parameters.Length) { case 0: if (!m_TpaRequestManager.IsRequestOpen(recipientSteamID)) { throw new UserFriendlyException(m_StringLocalizer["tpa:accept:no_requests"]); } ulong firstRequester = m_TpaRequestManager.AcceptRequest(recipientSteamID); requester = m_UserDirectory.FindUser(firstRequester.ToString(), UserSearchMode.FindById); if (requester == null) { throw new UserFriendlyException(m_StringLocalizer["tpa:accept:disconnected", new { Requester = firstRequester.ToString() }]); } break; case 1: string requesterName = Context.Parameters[0]; requester = m_UserDirectory.FindUser(requesterName, UserSearchMode.FindByName); if (requester == null) { throw new UserFriendlyException(m_StringLocalizer["tpa:invalid_recipient", new { Recipient = requesterName }]); } if (!m_TpaRequestManager.IsRequestOpen(recipientSteamID, requester.SteamId.m_SteamID)) { throw new UserFriendlyException(m_StringLocalizer["tpa:accept:no_requests_from", new { Requester = requester.DisplayName }]); } break; default: throw new UserFriendlyException("This is a placeholder so that we can reassure the compiler that requester will never be null."); } int delay = m_Configuration.GetValue <int>("teleportation:delay"); bool cancelOnMove = m_Configuration.GetValue <bool>("teleportation:cancelOnMove"); bool cancelOnDamage = m_Configuration.GetValue <bool>("teleportation:cancelOnDamage"); await uPlayer.PrintMessageAsync(m_StringLocalizer["tpa:accept:accepted_self", new { Requester = requester.DisplayName, Time = delay }]); requester.PrintMessageAsync(m_StringLocalizer["tpa:accept:accepted_other", new { Recipient = uPlayer.DisplayName, Time = delay }]); bool successful = await m_TeleportService.TeleportAsync(requester, new TeleportOptions(m_PluginAccessor.Instance, delay, cancelOnMove, cancelOnDamage)); if (!successful) { requester.PrintMessageAsync(m_StringLocalizer["teleport:canceled"], Color.DarkRed); throw new UserFriendlyException(m_StringLocalizer["teleport:canceled"]); } await requester.Player.Player.TeleportToLocationAsync(uPlayer.Player.Player.transform.position); }