示例#1
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            int skillId    = packet.data.ReadInt32(),
                skillLevel = packet.data.ReadInt32();
            //ToDo Add prerequisite checking for new skills
            //ToDo Add passive class specialty skills
            SkillTreeItem skillTreeItem = null;

            if (skillLevel > 1)
            {
                // Should already an entry for this skill
                skillTreeItem       = database.SelectSkillTreeItemByCharSkillId(client.character.id, skillId);
                skillTreeItem.level = skillLevel;
                if (database.UpdateSkillTreeItem(skillTreeItem) == false)
                {
                    _Logger.Error($"Updating SkillTreeItem for Character ID [{client.character.id}]");
                }
            }
            else
            {
                skillTreeItem         = new SkillTreeItem();
                skillTreeItem.skillId = skillId;
                skillTreeItem.level   = skillLevel;
                skillTreeItem.charId  = client.character.id;
                if (database.InsertSkillTreeItem(skillTreeItem) == false)
                {
                    _Logger.Error($"Adding SkillTreeItem for Character ID [{client.character.id}]");
                }
            }

            SendSkillTreeGain(client, skillId, skillLevel);
            client.character.skillPoints -= 1; //remove 1 skillpoint.  ToDo - ensure character has skill points
            RecvSelfSkillPointNotify recvSelfSkillPointNotify = new RecvSelfSkillPointNotify(client.character.skillPoints);

            router.Send(recvSelfSkillPointNotify, client);

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0); //1 = failed to aquire skill, 0 = success? but no skill aquired
            router.Send(client, (ushort)AreaPacketId.recv_skill_request_gain_r, res, ServerType.Area);
        }
        private void LevelUpCheck(NecClient client)
        {
            Experience experience = new Experience();

            Task.Delay(TimeSpan.FromSeconds(1)).ContinueWith
                (t1 =>
            {
                while (client.character.experienceCurrent > experience.CalculateLevelUp((uint)client.character.level + 1).cumulativeExperience)
                {
                    client.character.level++;
                    client.character.skillPoints += 1;
                    client.character.hp.SetMax(client.character.hp.max + 10);
                    client.character.mp.SetMax(client.character.mp.max + 10);
                    client.character.strength     += (ushort)Util.GetRandomNumber(0, 2);
                    client.character.vitality     += (ushort)Util.GetRandomNumber(0, 2);
                    client.character.dexterity    += (ushort)Util.GetRandomNumber(0, 2);
                    client.character.agility      += (ushort)Util.GetRandomNumber(0, 2);
                    client.character.intelligence += (ushort)Util.GetRandomNumber(0, 2);
                    client.character.piety        += (ushort)Util.GetRandomNumber(0, 2);
                    client.character.luck         += (ushort)Util.GetRandomNumber(0, 2);
                    int luckyShot = Util.GetRandomNumber(0, client.character.luck);
                    if (luckyShot > client.character.luck * .8)
                    {
                        client.character.hp.SetMax(client.character.hp.max + 10);
                        client.character.mp.SetMax(client.character.mp.max + 10);
                        client.character.strength     = (ushort)(Util.GetRandomNumber(-2, 2) + client.character.strength);
                        client.character.vitality     = (ushort)(Util.GetRandomNumber(-2, 2) + client.character.vitality);
                        client.character.dexterity    = (ushort)(Util.GetRandomNumber(-2, 2) + client.character.dexterity);
                        client.character.agility      = (ushort)(Util.GetRandomNumber(-2, 2) + client.character.agility);
                        client.character.intelligence = (ushort)(Util.GetRandomNumber(-2, 2) + client.character.intelligence);
                        client.character.piety        = (ushort)(Util.GetRandomNumber(-2, 2) + client.character.piety);
                        client.character.luck         = (ushort)(Util.GetRandomNumber(-2, 2) + client.character.luck);
                    }
                    client.character.hp.ToMax();

                    RecvCharaUpdateLvDetailStart recvCharaUpdateLvDetailStart = new RecvCharaUpdateLvDetailStart();
                    RecvCharaUpdateLv recvCharaUpdateLv                   = new RecvCharaUpdateLv(client.character);
                    RecvCharaUpdateLvDetail recvCharaUpdateLvDetail       = new RecvCharaUpdateLvDetail(client.character, experience);
                    RecvCharaUpdateLvDetail2 recvCharaUpdateLvDetail2     = new RecvCharaUpdateLvDetail2(client.character, experience);
                    RecvCharaUpdateLvDetailEnd recvCharaUpdateLvDetailEnd = new RecvCharaUpdateLvDetailEnd();

                    RecvSelfSkillPointNotify recvSelfSkillPointNotify = new RecvSelfSkillPointNotify(client.character.skillPoints);
                    RecvCharaUpdateMaxHp recvCharaUpdateMaxHp         = new RecvCharaUpdateMaxHp(client.character.hp.max);
                    RecvCharaUpdateMaxMp recvCharaUpdateMaxMp         = new RecvCharaUpdateMaxMp(client.character.mp.max);
                    RecvCharaUpdateHp recvCharaUpdateHp = new RecvCharaUpdateHp(client.character.hp.max);
                    RecvCharaUpdateMp recvCharaUpdateMp = new RecvCharaUpdateMp(client.character.mp.max);
                    RecvCharaUpdateAbility recvCharaUpdateAbilityStr = new RecvCharaUpdateAbility((int)RecvCharaUpdateAbility.Ability.Str, client.character.strength, client.character.battleParam.plusStrength);
                    RecvCharaUpdateAbility recvCharaUpdateAbilityVit = new RecvCharaUpdateAbility((int)RecvCharaUpdateAbility.Ability.Vit, client.character.vitality, client.character.battleParam.plusVitality);
                    RecvCharaUpdateAbility recvCharaUpdateAbilityDex = new RecvCharaUpdateAbility((int)RecvCharaUpdateAbility.Ability.Dex, client.character.dexterity, client.character.battleParam.plusDexterity);
                    RecvCharaUpdateAbility recvCharaUpdateAbilityAgi = new RecvCharaUpdateAbility((int)RecvCharaUpdateAbility.Ability.Agi, client.character.agility, client.character.battleParam.plusAgility);
                    RecvCharaUpdateAbility recvCharaUpdateAbilityInt = new RecvCharaUpdateAbility((int)RecvCharaUpdateAbility.Ability.Int, client.character.intelligence, client.character.battleParam.plusIntelligence);
                    RecvCharaUpdateAbility recvCharaUpdateAbilityPie = new RecvCharaUpdateAbility((int)RecvCharaUpdateAbility.Ability.Pie, client.character.piety, client.character.battleParam.plusPiety);
                    RecvCharaUpdateAbility recvCharaUpdateAbilityLuk = new RecvCharaUpdateAbility((int)RecvCharaUpdateAbility.Ability.Luk, client.character.luck, client.character.battleParam.plusLuck);

                    router.Send(recvCharaUpdateLvDetailStart, client);


                    router.Send(recvSelfSkillPointNotify, client);
                    router.Send(recvCharaUpdateMaxHp, client);
                    router.Send(recvCharaUpdateMaxMp, client);
                    router.Send(recvCharaUpdateHp, client);
                    router.Send(recvCharaUpdateMp, client);
                    router.Send(recvCharaUpdateAbilityStr, client);
                    router.Send(recvCharaUpdateAbilityVit, client);
                    router.Send(recvCharaUpdateAbilityDex, client);
                    router.Send(recvCharaUpdateAbilityAgi, client);
                    router.Send(recvCharaUpdateAbilityInt, client);
                    router.Send(recvCharaUpdateAbilityPie, client);
                    router.Send(recvCharaUpdateAbilityLuk, client);

                    router.Send(recvCharaUpdateLv, client);
                    router.Send(recvCharaUpdateLvDetail, client);
                    router.Send(recvCharaUpdateLvDetail2, client);
                    router.Send(recvCharaUpdateLvDetailEnd, client);
                }
            }
                );
        }