Пример #1
0
        protected void UpdateResources(
            IGameData gameData,
            DataModels.GameSession session,
            Character character,
            DataModels.Resources resources)
        {
            if (resources == null)
            {
                resources = new DataModels.Resources
                {
                    Id = Guid.NewGuid(),
                };
                gameData.Add(resources);
                character.ResourcesId = resources.Id;
            }

            var user      = gameData.GetUser(character.UserId);
            var gameEvent = gameData.CreateSessionEvent(GameEventType.ResourceUpdate, session,
                                                        new ResourceUpdate
            {
                UserId      = user.UserId,
                FishAmount  = resources.Fish,
                OreAmount   = resources.Ore,
                WheatAmount = resources.Wheat,
                WoodAmount  = resources.Wood,
                CoinsAmount = resources.Coins
            });

            gameData.Add(gameEvent);
        }
Пример #2
0
        private Player CreatePlayer(DataModels.GameSession session, User user)
        {
            var character = new Character
            {
                Id           = Guid.NewGuid(),
                Name         = user.UserName,
                UserId       = user.Id,
                OriginUserId = session?.UserId ?? Guid.Empty,
                Created      = DateTime.UtcNow
            };

            var appearance      = GenerateRandomAppearance();
            var syntyAppearance = GenerateRandomSyntyAppearance();

            var skills     = GenerateSkills();
            var resources  = GenerateResources();
            var statistics = GenerateStatistics();

            gameData.Add(syntyAppearance);
            gameData.Add(statistics);
            gameData.Add(skills);
            gameData.Add(appearance);
            gameData.Add(resources);

            character.SyntyAppearanceId = syntyAppearance.Id;
            character.ResourcesId       = resources.Id;
            character.AppearanceId      = appearance.Id;
            character.StatisticsId      = statistics.Id;
            character.SkillsId          = skills.Id;
            character.UserIdLock        = session?.UserId;
            character.LastUsed          = DateTime.UtcNow;
            gameData.Add(character);
            return(character.Map(gameData, user));
        }
Пример #3
0
        public void SendExpMultiplier(DataModels.GameSession session)
        {
            var activeEvent = gameData.GetActiveExpMultiplierEvent();

            if (activeEvent == null)
            {
                return;
            }

            var userId      = session.UserId;
            var user        = gameData.GetUser(userId);
            var patreonTier = user.PatreonTier.GetValueOrDefault();
            var multiplier  = MaxMultiplier[patreonTier];
            //if (multiplier >= 0)
            //{
            var expMulti = Math.Min(multiplier, activeEvent.Multiplier);
            var expEvent = gameData.CreateSessionEvent(
                GameEventType.ExpMultiplier,
                session,
                new ExpMultiplier
            {
                EndTime    = activeEvent.EndTime,
                EventName  = activeEvent.EventName,
                Multiplier = expMulti,
                StartTime  = activeEvent.StartTime
            }
                );

            gameData.Add(expEvent);
            //}
        }
Пример #4
0
        public static Models.GameSession Map(IGameData gameData, DataModels.GameSession data)
        {
            var session = DataMapper.Map <Models.GameSession, DataModels.GameSession>(data);
            var user    = gameData.GetUser(session.UserId);

            if (user == null)
            {
                return(null);
            }


            var state = gameData.GetSessionState(session.Id);

            if (state != null)
            {
                session.ClientVersion = state.ClientVersion;
                session.SyncTime      = state.SyncTime;
            }

            session.TwitchUserId    = user.UserId;
            session.UserName        = user.UserName;
            session.AdminPrivileges = user.IsAdmin.GetValueOrDefault();
            session.ModPrivileges   = user.IsModerator.GetValueOrDefault();
            session.Players         = gameData.GetSessionCharacters(data)
                                      .Select(x => Map(gameData, x))
                                      .Where(x => x != null)
                                      .ToList();

            return(session);
        }
Пример #5
0
        public override void Handle(
            IIntegrityChecker integrityChecker,
            IGameData gameData,
            DataModels.GameSession session,
            Character character,
            CharacterState characterState)
        {
            var now       = DateTime.UtcNow;
            var resources = gameData.GetResources(character.ResourcesId);
            var state     = gameData.GetCharacterSessionState(session.Id, character.Id);

            if (now - state.LastTaskUpdate >= TimeSpan.FromSeconds(ResourceGatherInterval))
            {
                session.Updated      = DateTime.UtcNow;
                state.LastTaskUpdate = DateTime.UtcNow;

                if (resources.Ore >= OrePerIngot)
                {
                    resources.Ore -= OrePerIngot;
                    IncrementItemStack(gameData, session, character, IngotId);
                }

                if (resources.Wood >= WoodPerPlank)
                {
                    resources.Wood -= WoodPerPlank;
                    IncrementItemStack(gameData, session, character, PlankId);
                }

                UpdateResources(gameData, session, character, resources);
            }
        }
Пример #6
0
 public abstract void Process(
     IIntegrityChecker integrityChecker,
     IGameData gameData,
     IPlayerInventoryProvider inventoryProvider,
     DataModels.GameSession session,
     Character character,
     DataModels.CharacterState state);
Пример #7
0
        private void TryRemovePlayerFromPreviousSession(Character character, DataModels.GameSession joiningSession)
        {
            var userToRemove = gameData.GetUser(character.UserId);

            if (userToRemove == null)
            {
                return;
            }

            var currentSession = gameData.GetUserSession(character.UserIdLock.GetValueOrDefault());

            if (currentSession == null || currentSession.Id == joiningSession.Id || currentSession.UserId == joiningSession.UserId)
            {
                return;
            }

            var targetSessionUser = gameData.GetUser(joiningSession.UserId);
            var characterUser     = gameData.GetUser(character.UserId);
            var gameEvent         = gameData.CreateSessionEvent(
                GameEventType.PlayerRemove,
                currentSession,
                new PlayerRemove()
            {
                Reason =
                    targetSessionUser != null
                        ? $"{character.Name} joined {targetSessionUser.UserName}'s stream"
                        : $"{character.Name} joined another session.",

                UserId = characterUser.UserId
            });

            gameData.Add(gameEvent);
        }
Пример #8
0
 public override void Handle(
     IIntegrityChecker integrityChecker,
     IGameData gameData,
     DataModels.GameSession session,
     Character character,
     CharacterState state)
 {
 }
Пример #9
0
 public override void Handle(
     IIntegrityChecker integrityChecker,
     IGameData gameData,
     DataModels.GameSession session,
     Character character,
     CharacterState state)
 {
     UpdateResourceGain(integrityChecker, gameData, session, character, resources => ++ resources.Fish);
 }
Пример #10
0
 private static SessionToken GenerateSessionToken(AuthToken token, DataModels.GameSession session)
 {
     return(new SessionToken
     {
         AuthToken = token.Token,
         ExpiresUtc = DateTime.UtcNow + TimeSpan.FromDays(180),
         SessionId = session.Id,
         StartedUtc = session.Started
     });
 }
Пример #11
0
        protected DataModels.Resources GetVillageResources(IGameData gameData, DataModels.GameSession session)
        {
            DataModels.Resources resx = null;
            var village = gameData.GetVillageBySession(session);

            if (village != null)
            {
                resx = gameData.GetResources(village.ResourcesId);
            }
            return(resx);
        }
Пример #12
0
        public void SendVillageInfo(DataModels.GameSession newGameSession)
        {
            var villageInfo      = villageManager.GetVillageInfo(newGameSession.Id);
            var villageInfoEvent = gameData.CreateSessionEvent(
                GameEventType.VillageInfo,
                newGameSession,
                villageInfo
                );

            gameData.Add(villageInfoEvent);
        }
Пример #13
0
        public void EndSession(DataModels.GameSession session)
        {
            var characters = gameData.GetSessionCharacters(session);

            foreach (var character in characters)
            {
                character.UserIdLock = null;
            }

            session.Status  = (int)SessionStatus.Inactive;
            session.Stopped = DateTime.UtcNow;
        }
Пример #14
0
        public void SendPubSubToken(DataModels.GameSession session, string pubsubAccessToken)
        {
            var serverTime = gameData.CreateSessionEvent(
                GameEventType.PubSubToken,
                session,
                new PubSubToken
            {
                Token = pubsubAccessToken
            }
                );

            gameData.Add(serverTime);
        }
Пример #15
0
        public void SendServerTime(DataModels.GameSession session)
        {
            var serverTime = gameData.CreateSessionEvent(
                GameEventType.ServerTime,
                session,
                new ServerTime
            {
                TimeUtc = DateTime.UtcNow
            }
                );

            gameData.Add(serverTime);
        }
Пример #16
0
        private Player CreatePlayer(
            DataModels.GameSession session, string userId, string userName)
        {
            var user = new User
            {
                Id       = Guid.NewGuid(),
                UserId   = userId,
                UserName = userName,
                Created  = DateTime.UtcNow
            };

            gameData.Add(user);
            return(CreatePlayer(session, user));
        }
Пример #17
0
        public void SendPermissionData(DataModels.GameSession gameSession, DataModels.User user = null)
        {
            if (gameData == null)
            {
                logger.LogError(nameof(gameData) + " is null. unable to send permission data.");
                return;
            }

            if (gameSession == null)
            {
                logger.LogError(nameof(gameSession) + " is null. Unable to send permission data.");
                return;
            }

            user = user ?? gameData.GetUser(gameSession.UserId);
            var isAdmin     = user.IsAdmin.GetValueOrDefault();
            var isModerator = user.IsModerator.GetValueOrDefault();
            //var subInfo = await twitchClient.GetSubscriberAsync(user.UserId);
            var patreonTier = user.PatreonTier ?? 0;

            var subscriptionTier   = patreonTier;
            var expMultiplierLimit = MaxMultiplier[patreonTier];

            if (isModerator)
            {
                subscriptionTier   = 3;
                expMultiplierLimit = MaxMultiplier[subscriptionTier];
            }

            if (isAdmin)
            {
                subscriptionTier   = 3;
                expMultiplierLimit = 50000000;
            }

            var permissionEvent = gameData.CreateSessionEvent(
                GameEventType.PermissionChange,
                gameSession,
                new Permissions
            {
                IsAdministrator         = user.IsAdmin ?? false,
                IsModerator             = user.IsModerator ?? false,
                SubscriberTier          = subscriptionTier,
                ExpMultiplierLimit      = expMultiplierLimit,
                StrictLevelRequirements = true,
            });

            gameData.Add(permissionEvent);
        }
Пример #18
0
        public static Models.GameSession Map(IGameData gameData, DataModels.GameSession data)
        {
            var session = DataMapper.Map <Models.GameSession, DataModels.GameSession>(data);
            var user    = gameData.GetUser(session.UserId);

            session.TwitchUserId    = user.UserId;
            session.UserName        = user.UserName;
            session.AdminPrivileges = user.IsAdmin.GetValueOrDefault();
            session.ModPrivileges   = user.IsModerator.GetValueOrDefault();
            session.Players         = gameData.GetSessionCharacters(data)
                                      .Select(x => Map(gameData, x))
                                      .ToList();

            return(session);
        }
Пример #19
0
        public override void Process(
            IIntegrityChecker integrityChecker,
            IGameData gameData,
            IPlayerInventoryProvider inventoryProvider,
            DataModels.GameSession session,
            Character character,
            CharacterState state)
        {
            UpdateResourceGain(integrityChecker, gameData, inventoryProvider, session, character, resources =>
            {
                session.Updated = DateTime.UtcNow;
                var skills      = gameData.GetCharacterSkills(character.SkillsId);
                if (skills == null)
                {
                    return;
                }

                var miningLevel = skills.MiningLevel;
                var multiDrop   = Random.NextDouble();
                var isMultiDrop = multiDrop <= 0.1;
                var chance      = Random.NextDouble();
                if (chance <= ItemDropRateSettings.InitDropChance)
                {
                    foreach (var res in DroppableResources.OrderByDescending(x => x.SkillLevel))
                    {
                        chance = Random.NextDouble();
                        if (miningLevel >= res.SkillLevel && (chance <= res.GetDropChance(miningLevel)))
                        {
                            IncrementItemStack(gameData, inventoryProvider, session, character, res.Id);
                            if (isMultiDrop)
                            {
                                isMultiDrop = false;
                                continue;
                            }
                            break;
                        }
                    }
                }

                ++resources.Ore;

                var villageResources = GetVillageResources(gameData, session);
                if (villageResources != null)
                {
                    ++villageResources.Ore;
                }
            });
        }
Пример #20
0
        private void UpdateResources(IGameData gameData, DataModels.GameSession session, Character character, DataModels.Resources resources)
        {
            var user      = gameData.GetUser(character.UserId);
            var gameEvent = gameData.CreateSessionEvent(GameEventType.ResourceUpdate, session,
                                                        new ResourceUpdate
            {
                UserId      = user.UserId,
                FishAmount  = resources.Fish,
                OreAmount   = resources.Ore,
                WheatAmount = resources.Wheat,
                WoodAmount  = resources.Wood,
                CoinsAmount = resources.Coins
            });

            gameData.Add(gameEvent);
        }
Пример #21
0
        protected void IncrementItemStack(
            IGameData gameData,
            IPlayerInventoryProvider inventoryProvider,
            DataModels.GameSession session,
            Character character, Guid itemId)
        {
            var inventory = inventoryProvider.Get(character.Id);
            var items     = inventory.AddItem(itemId);

            gameData.Add(gameData.CreateSessionEvent(GameEventType.ItemAdd, session, new ItemAdd
            {
                UserId          = gameData.GetUser(character.UserId).UserId,
                Amount          = 1,
                ItemId          = itemId,
                InventoryItemId = items.FirstOrDefault().Id,
            }));
        }
Пример #22
0
 private static SessionToken GenerateSessionToken(
     AuthToken token,
     DataModels.User user,
     DataModels.GameSession session,
     string clientVersion)
 {
     return(new SessionToken
     {
         AuthToken = token.Token,
         ExpiresUtc = DateTime.UtcNow + TimeSpan.FromDays(180),
         SessionId = session.Id,
         StartedUtc = session.Started,
         TwitchDisplayName = user.DisplayName,
         TwitchUserId = user.UserId,
         TwitchUserName = user.UserName,
         ClientVersion = clientVersion
     });
 }
Пример #23
0
 public override void Process(
     IIntegrityChecker integrityChecker,
     IGameData gameData,
     IPlayerInventoryProvider inventoryProvider,
     DataModels.GameSession session,
     Character character,
     CharacterState state)
 {
     UpdateResourceGain(integrityChecker, gameData, inventoryProvider, session, character, resources =>
     {
         ++resources.Fish;
         var villageResources = GetVillageResources(gameData, session);
         if (villageResources != null)
         {
             ++villageResources.Fish;
         }
     });
 }
Пример #24
0
        public void EndSession(DataModels.GameSession session)
        {
            var characters = gameData.GetSessionCharacters(session);
            var owner      = gameData.GetUser(session.UserId);

            var data = new StreamerInfo();

            data.StreamerUserId     = owner.UserId;
            data.StreamerUserName   = owner.UserName;
            data.IsRavenfallRunning = false;
            data.StreamerSessionId  = null;
            data.Started            = null;

            var state = gameData.GetSessionState(session.Id);

            if (state != null)
            {
                data.ClientVersion = state.ClientVersion;
            }

            if (extWsConnectionProvider.TryGetAllByStreamer(session.UserId, out var allConnections))
            {
                foreach (var connection in allConnections)
                {
                    connection.SendAsync(data);
                }
            }

            foreach (var character in characters)
            {
                character.UserIdLock = null;
            }

            session.Status  = (int)SessionStatus.Inactive;
            session.Stopped = DateTime.UtcNow;

            gameData.ClearAllCharacterSessionStates(session.UserId);
            //gameData.ClearCharacterSessionStates(session.Id);

#if DEBUG
            logger.LogDebug(owner.UserName + " game session ended. " + characters.Count + " characters cleared.");
#endif
        }
Пример #25
0
        public override void Process(
            IIntegrityChecker integrityChecker,
            IGameData gameData,
            IPlayerInventoryProvider inventoryProvider,
            DataModels.GameSession session,
            Character character,
            CharacterState characterState)
        {
            var now       = DateTime.UtcNow;
            var resources = gameData.GetResources(character.ResourcesId);

            if (resources == null)
            {
                resources = new DataModels.Resources
                {
                    Id = Guid.NewGuid(),
                };
                gameData.Add(resources);
                character.ResourcesId = resources.Id;
            }
            var state = gameData.GetCharacterSessionState(session.Id, character.Id);

            if (now - state.LastTaskUpdate >= TimeSpan.FromSeconds(ItemDropRateSettings.ResourceGatherInterval))
            {
                session.Updated      = DateTime.UtcNow;
                state.LastTaskUpdate = DateTime.UtcNow;

                if (resources.Ore >= OrePerIngot)
                {
                    resources.Ore -= OrePerIngot;
                    IncrementItemStack(gameData, inventoryProvider, session, character, IngotId);
                }

                if (resources.Wood >= WoodPerPlank)
                {
                    resources.Wood -= WoodPerPlank;
                    IncrementItemStack(gameData, inventoryProvider, session, character, PlankId);
                }

                UpdateResources(gameData, session, character, resources);
            }
        }
Пример #26
0
        public override void Process(
            IIntegrityChecker integrityChecker,
            IGameData gameData,
            IPlayerInventoryProvider inventoryProvider,
            DataModels.GameSession session,
            Character character,
            CharacterState state)
        {
            if (DateTime.UtcNow - lastUpdate < updateInterval)
            {
                return;
            }

            var village = gameData.GetOrCreateVillageBySession(session);
            var players = gameData.GetSessionCharacters(session);

            village.Experience += players.Count * 20;

            var newLevel   = GameMath.OLD_ExperienceToLevel(village.Experience);
            var levelDelta = newLevel - village.Level;

            village.Level = newLevel;

            var villageHouses = gameData.GetOrCreateVillageHouses(village);

            if (levelDelta > 0 || DateTime.UtcNow - lastExpSend > updateExpInterval)
            {
                var data = new VillageLevelUp
                {
                    Experience = village.Experience,
                    Level      = village.Level,
                    LevelDelta = levelDelta,
                    HouseSlots = villageHouses.Count
                };

                gameData.Add(gameData.CreateSessionEvent(GameEventType.VillageLevelUp, session, data));
                lastExpSend = DateTime.UtcNow;
            }

            lastUpdate = DateTime.UtcNow;
        }
Пример #27
0
        public override void Handle(
            IIntegrityChecker integrityChecker,
            IGameData gameData,
            DataModels.GameSession session,
            Character character,
            CharacterState state)
        {
            UpdateResourceGain(integrityChecker, gameData, session, character, resources =>
            {
                session.Updated = DateTime.UtcNow;
                var skills      = gameData.GetSkills(character.SkillsId);
                var miningLevel = GameMath.ExperienceToLevel(skills.Mining);
                var chance      = Random.NextDouble();

                var multiDrop   = Random.NextDouble();
                var isMultiDrop = multiDrop >= 0.5;

                // clamp to always be 10% chance on each resource gain.
                // so we dont get drops too often.
                if (chance <= 0.1)
                {
                    foreach (var res in DroppableResources.OrderBy(x => random.NextDouble()))
                    {
                        if (miningLevel >= res.SkillLevel && chance <= res.GetDropChance(miningLevel))
                        {
                            IncrementItemStack(gameData, session, character, res.Id);
                            if (isMultiDrop)
                            {
                                isMultiDrop = false;
                                continue;
                            }
                            break;
                        }
                    }
                }

                ++resources.Ore;
            });
        }
Пример #28
0
        protected void UpdateResourceGain(
            IIntegrityChecker integrityChecker,
            IGameData gameData,
            IPlayerInventoryProvider inventoryProvider,
            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(ItemDropRateSettings.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);
                }
            }
        }
Пример #29
0
        protected void IncrementItemStack(
            IGameData gameData,
            DataModels.GameSession session,
            Character character, Guid itemId)
        {
            var items = gameData.GetInventoryItems(character.Id, itemId);

            if (items == null || items.Count == 0)
            {
                gameData.Add(CreateInventoryItem(character, itemId));
            }
            else
            {
                ++items.First().Amount;
            }
            var user = gameData.GetUser(character.UserId);

            gameData.Add(gameData.CreateSessionEvent(GameEventType.ItemAdd, session, new ItemAdd
            {
                UserId = user.UserId,
                Amount = 1,
                ItemId = itemId
            }));
        }
Пример #30
0
 public abstract void Handle(
     IIntegrityChecker integrityChecker,
     IGameData gameData,
     DataModels.GameSession session,
     Character character,
     DataModels.CharacterState state);