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); } } ); }