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); }
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); }
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); }
private void AddGameEvent(Guid sessionId, GameEventType type, object model) { var session = gameData.GetSession(sessionId); var gameEvent = gameData.CreateSessionEvent(type, session, model); gameData.Add(gameEvent); }
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; } }
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); //} }
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); } }
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); }
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, })); }
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; }
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); }
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 })); }
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); }
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; }
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)); }
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); }