예제 #1
0
        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);
        }
예제 #2
0
        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 }]);
            }
        }
예제 #3
0
        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);
        }