//private static readonly Version ClientVersion_ClanLevel = new Version(0, 7, 1); public override void Process( IIntegrityChecker integrityChecker, IGameData gameData, IPlayerInventoryProvider inventoryProvider, GameSession session, Character character, CharacterState state) { var membership = gameData.GetClanMembership(character.Id); if (membership == null) { return; } var clan = gameData.GetClan(membership.ClanId); if (clan == null) { return; } UpdateClanExperience(gameData, session, clan); UpdateClanSkillsExperience(gameData, session, character, state, clan); }
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 GameProcessor( IRavenBotApiClient ravenbotApi, IIntegrityChecker integrityChecker, IGameWebSocketConnection websocket, IExtensionWebSocketConnectionProvider extWsProvider, ISessionManager sessionManager, IPlayerInventoryProvider inventoryProvider, IGameData gameData, IGameManager gameManager, SessionToken sessionToken) { this.gameData = gameData; this.gameManager = gameManager; this.ravenbotApi = ravenbotApi; this.integrityChecker = integrityChecker; this.gameConnection = websocket; this.extensionConnectionProvider = extWsProvider; this.sessionManager = sessionManager; this.inventoryProvider = inventoryProvider; this.sessionToken = sessionToken; RegisterPlayerTask <ClanProcessor>(ClanProcessorName); RegisterPlayerTask <VillageProcessor>(VillageProcessorName); RegisterPlayerTask <LoyaltyProcessor>(LoyaltyProcessorName); RegisterPlayerTask <RestedProcessor>(RestedProcessorName); RegisterPlayerTask <FightingTaskProcessor>("Fighting"); RegisterPlayerTask <MiningTaskProcessor>("Mining"); RegisterPlayerTask <FishingTaskProcessor>("Fishing"); RegisterPlayerTask <FarmingTaskProcessor>("Farming"); RegisterPlayerTask <WoodcuttingTaskProcessor>("Woodcutting"); RegisterPlayerTask <CraftingTaskProcessor>("Crafting"); RegisterPlayerTask <CookingTaskProcessor>("Cooking"); SendSessionData(); }
public void Handle( IIntegrityChecker integrityChecker, IGameData gameData, GameSession session, Character character, CharacterState state) { }
public override void Handle( IIntegrityChecker integrityChecker, IGameData gameData, DataModels.GameSession session, Character character, CharacterState state) { }
public PlayerManager( ILogger <PlayerManager> logger, IGameData gameData, IIntegrityChecker integrityChecker) { this.logger = logger; this.gameData = gameData; this.integrityChecker = integrityChecker; }
public void Process( IIntegrityChecker integrityChecker, IGameData gameData, IPlayerInventoryProvider inventoryProvider, GameSession session, Character character, CharacterState state) { }
public override void Handle( IIntegrityChecker integrityChecker, IGameData gameData, GameSession session, Character character, CharacterState state) { UpdateResourceGain(integrityChecker, gameData, session, character, resources => ++ resources.Wood); }
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; } }); }
public WebSocketConnectionProvider( ILogger <WebSocketConnectionProvider> logger, IIntegrityChecker integrityChecker, IGameData gameData, IGameManager gameManager, IGamePacketManager packetManager, IGamePacketSerializer packetSerializer, ISessionManager sessionManager) { this.logger = logger; this.integrityChecker = integrityChecker; this.gameData = gameData; this.gameManager = gameManager; this.packetManager = packetManager; this.packetSerializer = packetSerializer; this.sessionManager = sessionManager; }
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 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); } } }
public override void Process( IIntegrityChecker integrityChecker, IGameData gameData, IPlayerInventoryProvider inventoryProvider, GameSession session, Character character, CharacterState state) { var user = gameData.GetUser(character.UserId); var loyalty = gameData.GetUserLoyalty(character.UserId, session.UserId); if (loyalty == null && character.UserIdLock != null) { loyalty = gameData.GetUserLoyalty(character.UserId, character.UserIdLock.GetValueOrDefault()); } if (loyalty == null) { loyalty = CreateUserLoyalty(gameData, session, user); } //bool isActive = CheckUserActivity(user.Id, character, state); DateTime now = DateTime.UtcNow; TimeSpan elapsed = TimeSpan.Zero; if (lastUpdate.TryGetValue(user.Id, out var lastUpdateTime)) { elapsed = now - lastUpdateTime; loyalty.AddPlayTime(elapsed); } lastUpdate[user.Id] = now; var isSubMdVip = loyalty.IsSubscriber || loyalty.IsModerator || loyalty.IsVip; var activityMultiplier = isSubMdVip ? UserLoyalty.ActivityMultiplier : 1d; loyalty.AddExperience((double)elapsed.TotalSeconds * UserLoyalty.ExpPerSecond * activityMultiplier); }
public GameWebSocketConnectionProvider( ILogger <GameWebSocketConnectionProvider> logger, IRavenBotApiClient ravenBotApi, IIntegrityChecker integrityChecker, IPlayerInventoryProvider inventoryProvider, IExtensionWebSocketConnectionProvider extWsProvider, IGameData gameData, IGameManager gameManager, IGamePacketManager packetManager, IGamePacketSerializer packetSerializer, ISessionManager sessionManager) { this.logger = logger; this.ravenBotApi = ravenBotApi; this.integrityChecker = integrityChecker; this.inventoryProvider = inventoryProvider; this.extWsProvider = extWsProvider; this.gameData = gameData; this.gameManager = gameManager; this.packetManager = packetManager; this.packetSerializer = packetSerializer; this.sessionManager = sessionManager; }
public GameProcessor( IIntegrityChecker integrityChecker, IWebSocketConnection ws, IGameData gameData, IGameManager gameManager, SessionToken sessionToken) { this.gameData = gameData; this.gameManager = gameManager; this.integrityChecker = integrityChecker; this.ws = ws; this.sessionToken = sessionToken; RegisterPlayerTask <VillageProcessor>(VillageProcessorName); RegisterPlayerTask <FightingTaskProcessor>("Fighting"); RegisterPlayerTask <MiningTaskProcessor>("Mining"); RegisterPlayerTask <FishingTaskProcessor>("Fishing"); RegisterPlayerTask <FarmingTaskProcessor>("Farming"); RegisterPlayerTask <WoodcuttingTaskProcessor>("Woodcutting"); RegisterPlayerTask <CraftingTaskProcessor>("Crafting"); RegisterPlayerTask <CookingTaskProcessor>("Cooking"); }
public WebSocketConnection( ILogger logger, IIntegrityChecker integrityChecker, IGameData gameData, IGameManager gameManager, IGamePacketManager packetManager, IGamePacketSerializer packetSerializer, WebSocketConnectionProvider sessionProvider, WebSocket ws, SessionToken sessionToken) { this.receiveLoop = new Thread(ReceiveLoop); this.gameLoop = new Thread(GameUpdateLoop); this.logger = logger; this.sessionToken = sessionToken; this.packetManager = packetManager; this.packetSerializer = packetSerializer; this.sessionProvider = sessionProvider; this.ws = ws; this.killTask = new TaskCompletionSource <object>(); this.gameProcessor = new GameProcessor(integrityChecker, this, gameData, gameManager, sessionToken); }
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 abstract void Handle( IIntegrityChecker integrityChecker, IGameData gameData, DataModels.GameSession session, Character character, DataModels.CharacterState state);