コード例 #1
0
        // extrawords
        // 1 - username
        // 2 - password
        public void Execute(List <string> extraWords, AttachedClient executingClient)
        {
            if (executingClient == null)
            {
                return;
            }

            if (extraWords.Count != 2)
            {
                var errorMsgDto = new DescriptiveTextDto("Wrong number of parameters.");
                executingClient?.SendDtoMessage(errorMsgDto);
                return;
            }

            if (AttachedClients.IsAccountLoggedIn(extraWords[0]))
            {
                var errorMsgDto = new DescriptiveTextDto("Account is already logged in.");
                executingClient?.SendDtoMessage(errorMsgDto);
                return;
            }

            var potentialAccount = GrainClusterClient.Accounts.GetAccount(extraWords[0]).Result;

            if (potentialAccount != null && potentialAccount.ValidatePassword(extraWords[1]).Result)
            {
                executingClient.AttachedAccount = potentialAccount;
                var successMsgDto = new DescriptiveTextDto("Login success.");
                executingClient?.SendDtoMessage(successMsgDto);
            }
            else
            {
                var errorMsgDto = new DescriptiveTextDto("Either the username or password were incorrect.");
                executingClient?.SendDtoMessage(errorMsgDto);
            }
        }
コード例 #2
0
        // extrawords
        // 1 - username
        // 2 - password
        public void Execute(List <string> extraWords, AttachedClient executingClient)
        {
            if (executingClient == null)
            {
                return;
            }

            if (extraWords.Count != 2)
            {
                var errorMsgDto = new DescriptiveTextDto("Wrong number of parameters.");
                executingClient?.SendDtoMessage(errorMsgDto);
                return;
            }

            var potentialAccount = GrainClusterClient.Accounts.CreateAccount(extraWords[0], extraWords[1]).Result;

            if (potentialAccount == null)
            {
                var errorMsgDto = new DescriptiveTextDto("Error creating account.");
                executingClient?.SendDtoMessage(errorMsgDto);
                return;
            }

            var successMsgDto = new DescriptiveTextDto("Account created.");

            executingClient?.SendDtoMessage(successMsgDto);
        }
コード例 #3
0
        public void Execute(List <string> extraWords, IAccountGrain executingAccount)
        {
            AttachedClient executingClient = AttachedClients.GetAccountFocusedClient(executingAccount);

            if (executingAccount == null || executingClient == null)
            {
                var errorMsgDto = new DescriptiveTextDto("The use player command is currently unavailable.");
                executingClient?.SendDtoMessage(errorMsgDto);
                return;
            }

            if (extraWords.Count != 1)
            {
                var errorMsgDto = new DescriptiveTextDto("Wrong number of parameters.");
                executingClient?.SendDtoMessage(errorMsgDto);
                return;
            }

            var character = executingAccount.GetCharacter(extraWords[0]).Result;;

            if (character == null)
            {
                var errorMsgDto = new DescriptiveTextDto("Unknown character.");
                executingClient?.SendDtoMessage(errorMsgDto);
                return;
            }

            // TODO: this instantly will switch active players in an account.. there needs to be a cooldown time here to logout then login
            AttachedClients.SetClientFocusedCharacter(executingClient.TrackingId, character.TrackingId);
            if (character.IsNew)
            {
                character.IsNew = false;
                var gameIntroMsgDto = new DescriptiveTextDto(GrainClusterClient.Universe.GetGameIntroductionText().Result);
                executingClient?.SendDtoMessage(gameIntroMsgDto);
            }
            else
            {
                var successMsgDto = new DescriptiveTextDto($"You have entered {character.GetLocation().LocationName}.");
                executingClient?.SendDtoMessage(successMsgDto);
            }
            var othersMsgDto = new DescriptiveTextDto($"{character.Name} has entered the area.");

            character.GetLocation().SendDescriptiveTextDtoMessage($"{character.Name} has entered the area.", character);
        }
コード例 #4
0
        public void Execute(List <string> extraWords, IAccountGrain executingAccount)
        {
            AttachedClient executingClient = AttachedClients.GetAccountFocusedClient(executingAccount);

            if (executingAccount == null || executingClient == null || !executingAccount.CanCreateNewPlayer().Result)
            {
                var errorMsgDto = new DescriptiveTextDto("The create new player command is currently unavailable.");
                executingClient?.SendDtoMessage(errorMsgDto);
                return;
            }

            if (extraWords.Count != 1)
            {
                var errorMsgDto = new DescriptiveTextDto("Wrong number of parameters.");
                executingClient?.SendDtoMessage(errorMsgDto);
                return;
            }

            if (GrainClusterClient.Universe.IsPlayerCharacterNameInUse(extraWords[0]).Result)
            {
                var errorMsgDto = new DescriptiveTextDto("This character name is already taken.");
                executingClient?.SendDtoMessage(errorMsgDto);
                return;
            }

            var newPlayerCharacter = EngineInternal.NewPlayerCreator();

            newPlayerCharacter.Name = extraWords[0];

            // Mark all player characters as needing focus to stay in the world
            newPlayerCharacter.NeedsFocus = true;
            executingAccount.AddCharacter(newPlayerCharacter.TrackingId).Wait();

            var successMsgDto = new DescriptiveTextDto("New player created.");

            executingClient?.SendDtoMessage(successMsgDto);
        }
コード例 #5
0
        internal static bool TryRunCommandFromClient(string word, List <string> extraWords, AttachedClient executingClient)
        {
            // Built in anonymous commands
            var anonCommandToRun = BuildInAnonymousCommands
                                   .Where(c => c.ActivatingWords.Any(w => w.Equals(word, StringComparison.OrdinalIgnoreCase)))
                                   .FirstOrDefault(); // No permission check on anon commands

            if (anonCommandToRun != null)
            {
                anonCommandToRun.Execute(extraWords, executingClient);
                return(true);
            }

            // Anything further requires an account attached to the client
            if (executingClient?.AttachedAccount == null)
            {
                return(false);
            }

            // Try to run an account level command
            if (TryRunCommandFromAccount(word, extraWords, executingClient.AttachedAccount))
            {
                return(true);
            }

            // Anything further requires a player logged into the game
            var playerCharacter = AttachedClients.GetClientFocusedCharacter(executingClient.TrackingId);

            if (playerCharacter == null)
            {
                return(false);
            }

            if (!playerCharacter.CanTakeTurn())
            {
                var secondsLeft = playerCharacter.GetSecondsTillNextTurn();
                playerCharacter.SendDescriptiveTextDtoMessage($"You cannot take your next turn yet. ({secondsLeft} seconds left).");
                return(true);
            }
            else
            {
                bool commandResult = TryRunCommandFromCharacter(word, extraWords, playerCharacter, executingClient.AttachedAccount.GetPermissions().Result);
                playerCharacter.TurnComplete();
                return(commandResult);
            }
        }