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 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)); }
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 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); }
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); } }
public abstract void Process( IIntegrityChecker integrityChecker, IGameData gameData, IPlayerInventoryProvider inventoryProvider, DataModels.GameSession session, Character character, DataModels.CharacterState state);
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 override void Handle( IIntegrityChecker integrityChecker, IGameData gameData, DataModels.GameSession session, Character character, CharacterState state) { }
public override void Handle( IIntegrityChecker integrityChecker, IGameData gameData, DataModels.GameSession session, Character character, CharacterState state) { UpdateResourceGain(integrityChecker, gameData, session, character, resources => ++ resources.Fish); }
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 }); }
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); }
public void SendVillageInfo(DataModels.GameSession newGameSession) { var villageInfo = villageManager.GetVillageInfo(newGameSession.Id); var villageInfoEvent = gameData.CreateSessionEvent( GameEventType.VillageInfo, newGameSession, villageInfo ); gameData.Add(villageInfoEvent); }
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; }
public void SendPubSubToken(DataModels.GameSession session, string pubsubAccessToken) { var serverTime = gameData.CreateSessionEvent( GameEventType.PubSubToken, session, new PubSubToken { Token = pubsubAccessToken } ); gameData.Add(serverTime); }
public void SendServerTime(DataModels.GameSession session) { var serverTime = gameData.CreateSessionEvent( GameEventType.ServerTime, session, new ServerTime { TimeUtc = DateTime.UtcNow } ); gameData.Add(serverTime); }
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)); }
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); }
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); }
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; } }); }
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, })); }
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 }); }
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; } }); }
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 }
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); } }
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 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; }); }
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); } } }
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 abstract void Handle( IIntegrityChecker integrityChecker, IGameData gameData, DataModels.GameSession session, Character character, DataModels.CharacterState state);