Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
0
        public bool KickPlayer(Guid characterId)
        {
            var character    = gameData.GetCharacter(characterId);
            var userToRemove = gameData.GetUser(character.UserId);

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

            //var currentSession = gameData.GetSessionByUserId(userId);
            var currentSession = gameData.GetSessionByUserId(character.UserIdLock.GetValueOrDefault());

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

            var characterUser = gameData.GetUser(character.UserId);
            var gameEvent     = gameData.CreateSessionEvent(
                GameEventType.PlayerRemove,
                currentSession,
                new PlayerRemove()
            {
                Reason      = $"{character.Name} was kicked remotely.",
                UserId      = characterUser.UserId,
                CharacterId = character.Id
            });

            gameData.Add(gameEvent);
            return(true);
        }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
        private void AddGameEvent(Guid sessionId, GameEventType type, object model)
        {
            var session   = gameData.GetSession(sessionId);
            var gameEvent = gameData.CreateSessionEvent(type, session, model);

            gameData.Add(gameEvent);
        }
Ejemplo n.º 5
0
        private void UpdateClanExperience(IGameData gameData, GameSession session, Clan clan)
        {
            var now     = DateTime.UtcNow;
            var elapsed = TimeSpan.Zero;

            if (clanExpUpdate.TryGetValue(clan.Id, out var lastUpdate))
            {
                elapsed = now - lastUpdate;
            }

            if (clan.Level == 0)
            {
                clan.Level = 1;
            }

            var exp = elapsed.TotalSeconds;

            //var multi = gameData.GetActiveExpMultiplierEvent();
            //if (multi != null)
            //{
            //    exp *= multi.Multiplier;
            //}

            clan.Experience += exp;

            var nextLevel = GameMath.ExperienceForLevel(clan.Level + 1);
            var oldLevel  = clan.Level;

            while (clan.Experience >= nextLevel)
            {
                clan.Experience -= nextLevel;
                ++clan.Level;
                nextLevel = GameMath.ExperienceForLevel(clan.Level + 1);
            }

            clanExpUpdate[clan.Id] = now;

            var announcementKey = session.Id + "_" + clan.Id; // Use session ID and not clan ID as we need to send to all open clients and not just once per clan.

            if (!clanExpAnnouncement.TryGetValue(announcementKey, out var lastAnnouncement))
            {
                clanExpAnnouncement[announcementKey] = now;
            }

            if (now - lastAnnouncement > UpdateInterval)
            {
                gameData.Add(gameData.CreateSessionEvent(GameEventType.ClanLevelChanged, session, new ClanLevelChanged
                {
                    ClanId     = clan.Id,
                    Experience = (long)clan.Experience,
                    Level      = clan.Level,
                    LevelDelta = clan.Level - oldLevel,
                }));
                clanExpAnnouncement[announcementKey] = now;
            }
        }
Ejemplo n.º 6
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);
            //}
        }
Ejemplo n.º 7
0
        public void BroadcastMessageAsync(string message, int time)
        {
            var sessions = gameData.GetActiveSessions();

            foreach (var session in sessions)
            {
                var gameEvent = gameData.CreateSessionEvent(GameEventType.ServerMessage, session, new ServerMessage()
                {
                    Message = message,
                    Time    = time
                });

                gameData.Add(gameEvent);
            }
        }
Ejemplo n.º 8
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);
        }
Ejemplo n.º 9
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,
            }));
        }
Ejemplo n.º 10
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;
        }
Ejemplo n.º 11
0
        public Task BroadcastMessageAsync(string message)
        {
            // 1. get all active sessions
            var sessions = gameData.GetActiveSessions();

            //var sessions = await db.GameSession
            //    .Include(x => x.GameEvents)
            //    .Where(x => x.Stopped != null)
            //    .ToListAsync();

            // 2. push a new event for each session
            foreach (var session in sessions)
            {
                //var revision = session.GameEvents.Count > 0
                //    ? session.GameEvents.Max(x => x.Revision) + 1 : 1;

                var gameEvent = gameData.CreateSessionEvent(GameEventType.ServerMessage, session, new ServerMessage()
                {
                    Message = message,
                });

                gameData.Add(gameEvent);

                //await db.GameEvent.AddAsync(new DataModels.GameEvent()
                //{
                //    Id = Guid.NewGuid(),
                //    GameSessionId = session.Id,
                //    GameSession = session,
                //    Data = JSON.Stringify(new ServerMessage()
                //    {
                //        Message = message,
                //    }),
                //    Type = (int)GameEventType.ServerMessage,
                //    Revision = revision
                //});
            }

            return(Task.CompletedTask);
        }
Ejemplo n.º 12
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
            }));
        }
Ejemplo n.º 13
0
        public bool WalkTo(string userId, int x, int y, int z)
        {
            var targetSession = gameData.GetSessionByUserId(userId);

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

            var character = gameData.GetCharacterByUserId(userId);

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

            gameData.Add(gameData.CreateSessionEvent(
                             GameEventType.PlayerMove,
                             targetSession,
                             new PlayerMove()
            {
                UserId = userId,
                X      = x,
                Y      = y,
                Z      = z
            }
                             ));

            return(true);
        }
Ejemplo n.º 14
0
        public override void Process(
            IIntegrityChecker integrityChecker,
            IGameData gameData,
            IPlayerInventoryProvider inventoryProvider,
            GameSession session,
            Character character,
            CharacterState state)
        {
            if (state == null)
            {
                return;
            }

            var isResting = state.InOnsen.GetValueOrDefault() &&
                            !state.InDungeon.GetValueOrDefault() &&
                            !state.InArena &&
                            !state.InRaid &&
                            !string.IsNullOrEmpty(state.Island) &&
                            string.IsNullOrEmpty(state.DuelOpponent);

            var now = DateTime.UtcNow;

            if (!lastUpdate.TryGetValue(character.Id, out var lastUpdateTime))
            {
                lastUpdateTime = now;
            }

            var elapsed       = now - lastUpdateTime;
            var requireUpdate = isResting
                ? AddRestTime(state, elapsed)
                : RemoveRestTime(state, elapsed);

            if (!lastEvent.TryGetValue(character.Id, out var lastEventUpdate))
            {
                lastEventUpdate = DateTime.MinValue;
            }

            if (requireUpdate)
            {
                var sinceLastEvent = now - lastEventUpdate;
                if (sinceLastEvent >= RestedEventUpdateInterval)
                {
                    var restedTime    = (double)(state.RestedTime ?? 0);
                    var restedPercent = restedTime / MaxRestTime.TotalSeconds;
                    var isRested      = restedTime > 0;

                    var data = new Models.PlayerRestedUpdate
                    {
                        CharacterId   = character.Id,
                        ExpBoost      = isRested ? ExpBoost : 0,
                        StatsBoost    = isRested ? CombatStatsBoost : 0,
                        RestedTime    = restedTime,
                        RestedPercent = restedPercent,
                    };

                    var gameEvent = gameData.CreateSessionEvent(GameEventType.PlayerRestedUpdate, session, data);
                    gameData.Add(gameEvent);
                    lastEvent[character.Id] = now;

                    if (restedTime > 0)
                    {
                        TrySendToExtensionAsync(character, data);
                    }
                }
            }
            lastUpdate[character.Id] = now;
        }
Ejemplo n.º 15
0
        public async Task <SessionToken> BeginSessionAsync(
            AuthToken token,
            string clientVersion,
            string accessKey,
            bool isLocal,
            float syncTime)
        {
            var game = gameData.Client;
            var user = gameData.GetUser(token.UserId);

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

            if (game.AccessKey != accessKey)
            {
                return(null);
            }

            var userId        = token.UserId;
            var activeSession = gameData.GetUserSession(userId);

            // x => x.UserId == userId && x.Status == (int)SessionStatus.Active

            if (activeSession != null)
            {
                EndSession(activeSession);
            }

            var newGameSession = gameData.CreateSession(userId);

            gameData.Add(newGameSession);

            var sessionState = gameData.GetSessionState(newGameSession.Id);

            sessionState.SyncTime = syncTime;

            var isAdmin     = user.IsAdmin.GetValueOrDefault();
            var isModerator = user.IsModerator.GetValueOrDefault();
            var subInfo     = await twitchClient.GetSubscriberAsync(user.UserId);

            var subscriptionTier   = 0;
            var expMultiplierLimit = 0;

            if (subInfo != null && int.TryParse(subInfo.Tier, out subscriptionTier))
            {
                subscriptionTier  /= 1000;
                expMultiplierLimit = subscriptionTier == 1 ? 10 : (subscriptionTier - 1) * 25;
            }
            if (isModerator)
            {
                subscriptionTier   = 3;
                expMultiplierLimit = 50;
            }
            if (isAdmin)
            {
                subscriptionTier   = 3;
                expMultiplierLimit = 5000;
            }
            if (isAdmin || isModerator || subInfo != null)
            {
                var permissionEvent = gameData.CreateSessionEvent(
                    GameEventType.PermissionChange,
                    newGameSession,
                    new Permissions
                {
                    IsAdministrator    = user.IsAdmin ?? false,
                    IsModerator        = user.IsModerator ?? false,
                    SubscriberTier     = subscriptionTier,
                    ExpMultiplierLimit = expMultiplierLimit,
                });

                gameData.Add(permissionEvent);
            }

            var village          = gameData.GetOrCreateVillageBySession(newGameSession);
            var villageHouses    = gameData.GetOrCreateVillageHouses(village);
            var villageInfoEvent = gameData.CreateSessionEvent(
                GameEventType.VillageInfo,
                newGameSession,
                new VillageInfo
            {
                Name       = village.Name,
                Level      = village.Level,
                Experience = village.Experience,
                Houses     = villageHouses.Select(x =>
                                                  new VillageHouseInfo
                {
                    Owner = x.UserId != null
                               ? gameData.GetUser(x.UserId.Value).UserId
                               : null,
                    Slot = x.Slot,
                    Type = x.Type
                }
                                                  ).ToList()
            }
                );

            gameData.Add(villageInfoEvent);

            return(GenerateSessionToken(token, newGameSession));
        }
Ejemplo n.º 16
0
        public async Task <ExtensionPlayerJoinResult> PlayerJoin(string broadcasterId)
        {
            var result = new ExtensionPlayerJoinResult();

            if (string.IsNullOrEmpty(broadcasterId))
            {
                result.ErrorMessage = "Invalid broadcaster or bad character id";
                return(result);
            }

            var activeSession = gameData.GetOwnedSessionByUserId(broadcasterId);

            if (activeSession == null)
            {
                result.ErrorMessage = "Broadcaster does not have an active game session";
                return(result);
            }

            if (TryGetSession(out var sessionInfo))
            {
                var user = gameData.GetUser(sessionInfo.AccountId);
                if (user == null)
                {
                    result.ErrorMessage = "No such user.";
                    return(result);
                }

                var existingCharacters = gameData.GetCharactersByUserId(user.Id);
                if (existingCharacters.Count >= 3)
                {
                    result.ErrorMessage = "You already have 3 characters.";
                    return(result);
                }

                var index  = existingCharacters.Count + 1;
                var player = await playerManager.CreatePlayer(user.UserId, user.UserName, index.ToString());

                if (player == null)
                {
                    result.ErrorMessage = "Failed to create a new character.";
                    return(result);
                }

                var c = gameData.GetCharacter(player.Id);
                if (c == null)
                {
                    result.ErrorMessage = "Okay. We don't know what went wrong here. Very sorry!";
                    return(result);
                }

                // We are just going to assume that it was successeful
                // since, if it "fails" as the character is already in game. well. Then what harm done?
                result.Success = true;
                result.Player  = c.MapForWebsite(gameData, user);

                sessionInfoProvider.SetActiveCharacter(sessionInfo, c.Id);

                var gameEvent = gameData.CreateSessionEvent(
                    GameEventType.PlayerAdd,
                    activeSession,
                    new PlayerAdd()
                {
                    CharacterId = c.Id,
                    Identifier  = c.Identifier,
                    UserId      = sessionInfo.UserId,
                    UserName    = sessionInfo.UserName
                });

                gameData.Add(gameEvent);
            }
            else
            {
                result.ErrorMessage = "You don't seem to be authenticated.";
                return(result);
            }

            return(result);
        }