protected void UpdateResourceGain(
            IIntegrityChecker integrityChecker,
            IGameData gameData,
            DataModels.GameSession session,
            Character character,
            Action <DataModels.Resources> onUpdate)
        {
            if (!integrityChecker.VerifyPlayer(session.Id, character.Id, 0))
            {
                return;
            }

            var now   = DateTime.UtcNow;
            var state = gameData.GetCharacterSessionState(session.Id, character.Id);

            if (now - state.LastTaskUpdate >= TimeSpan.FromSeconds(ResourceGatherInterval))
            {
                session.Updated = DateTime.UtcNow;
                var resources = gameData.GetResources(character.ResourcesId);
                var oldWood   = resources.Wood;
                var oldWheat  = resources.Wheat;
                var oldFish   = resources.Fish;
                var oldOre    = resources.Ore;
                var oldCoins  = resources.Coins;

                state.LastTaskUpdate = DateTime.UtcNow;
                onUpdate?.Invoke(resources);

                if (oldCoins != resources.Coins ||
                    oldWood != resources.Wood ||
                    oldWheat != resources.Wheat ||
                    oldFish != resources.Fish ||
                    oldOre != resources.Ore)
                {
                    UpdateResources(gameData, session, character, resources);
                }
            }
        }
Beispiel #2
0
        public bool[] UpdateMany(SessionToken token, PlayerState[] states)
        {
            var results     = new List <bool>();
            var gameSession = gameData.GetSession(token.SessionId);

            if (gameSession == null)
            {
                return(Enumerable.Range(0, states.Length).Select(x => false).ToArray());
            }


            var sessionPlayers = gameData.GetSessionCharacters(gameSession);

            foreach (var state in states)
            {
                var user = gameData.GetUser(state.UserId);
                if (user == null)
                {
                    logger.LogError($"Trying to save player with userId {state.UserId}, but no user was found matching the id.");
                    results.Add(false);
                    continue;
                }

                var character = gameData.GetCharacterByUserId(user.Id);
                if (character == null)
                {
                    results.Add(false);
                    continue;
                }

                if (!integrityChecker.VerifyPlayer(gameSession.Id, character.Id, state.SyncTime))
                {
                    results.Add(false);
                    continue;
                }

                try
                {
                    if (state.Experience != null && state.Experience.Length > 0)
                    {
                        UpdateExperience(token, state.UserId, state.Experience);
                    }

                    if (state.Statistics != null && state.Statistics.Length > 0)
                    {
                        UpdateStatistics(token, state.UserId, state.Statistics);
                    }

                    EquipBestItems(character);

                    character.Revision = character.Revision.GetValueOrDefault() + 1;

                    results.Add(true);
                }
                catch
                {
                    results.Add(false);
                }
            }

            return(results.ToArray());
        }