Beispiel #1
0
        //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);
        }
Beispiel #2
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);
            }
        }
Beispiel #3
0
        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)
 {
 }
Beispiel #6
0
 public PlayerManager(
     ILogger <PlayerManager> logger,
     IGameData gameData,
     IIntegrityChecker integrityChecker)
 {
     this.logger           = logger;
     this.gameData         = gameData;
     this.integrityChecker = integrityChecker;
 }
Beispiel #7
0
 public void Process(
     IIntegrityChecker integrityChecker,
     IGameData gameData,
     IPlayerInventoryProvider inventoryProvider,
     GameSession session,
     Character character,
     CharacterState state)
 {
 }
Beispiel #8
0
 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;
         }
     });
 }
Beispiel #12
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);
            }
        }
Beispiel #13
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;
        }
        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;
            });
        }
Beispiel #15
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);
                }
            }
        }
Beispiel #16
0
        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;
 }
Beispiel #18
0
        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);
            }
Beispiel #20
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;
        }
Beispiel #21
0
 public abstract void Handle(
     IIntegrityChecker integrityChecker,
     IGameData gameData,
     DataModels.GameSession session,
     Character character,
     DataModels.CharacterState state);