Esempio n. 1
0
File: PC.cs Progetto: xxlio109/Saga
        public void OnJobChange(byte NewJob, byte ChangeWeapon, ushort postfix)
        {
            //removing passive status

            #region Old Addition handling
            List <string> dellist = new List <string>();
            foreach (string i in this.Char.Tasks.Keys)
            {
                try
                {
                    if (i == "AutoSave" || i == "RegenerationHP" || i == "RegenerationSP" || i == "LPReduction")
                    {
                        continue;
                    }
                    MultiRunTask task = this.Char.Tasks[i];
                    task.Deactivate();
                    dellist.Add(i);
                }
                catch (Exception ex)
                {
                    Logger.ShowError(ex);
                }
            }
            foreach (string i in dellist)
            {
                this.Char.Tasks.Remove(i);
            }
            #endregion

            #region New Addition Handling
            Addition[] additionlist = new Addition[this.Char.BattleStatus.Additions.Count];
            this.Char.BattleStatus.Additions.Values.CopyTo(additionlist, 0);
            foreach (Addition i in additionlist)
            {
                if (i.Activated)
                {
                    i.AdditionEnd();
                }
            }
            this.Char.BattleStatus.Additions.Clear();
            #endregion

            if (!this.Char.JobLevels.ContainsKey(this.Char.job))
            {
                this.Char.JobLevels.Add(this.Char.job, (byte)this.Char.jLevel);
                MapServer.charDB.NewJobLevel(this.Char, this.Char.job, (byte)this.Char.jLevel);
            }
            else
            {
                this.Char.JobLevels[this.Char.job] = (byte)this.Char.jLevel;
                MapServer.charDB.UpdateJobLevel(this.Char, this.Char.job, (byte)this.Char.jLevel);
            }
            this.Char.job = (JobType)NewJob;
            if (!this.Char.JobLevels.ContainsKey(this.Char.job))
            {
                this.Char.JobLevels.Add(this.Char.job, 1);
                MapServer.charDB.NewJobLevel(this.Char, this.Char.job, 1);
            }
            this.Char.jLevel = this.Char.JobLevels[this.Char.job];
            this.Char.jExp   = ExperienceManager.Instance.GetExpForLevel(this.Char.jLevel - 1, ExperienceManager.LevelType.JLEVEL);

            Weapon weapon = WeaponFactory.GetActiveWeapon(this.Char);
            //Change weapon
            if (ChangeWeapon == 1)
            {
                WeaponInfo info;
                switch (this.Char.job)
                {
                case JobType.ENCHANTER:
                    weapon.type        = (ushort)WeaponType.SWORD_STICK;
                    weapon.augeSkillID = 150029;
                    break;

                case JobType.SWORDMAN:
                    weapon.type        = (ushort)WeaponType.LONG_SWORD;
                    weapon.augeSkillID = 150015;
                    break;

                case JobType.THIEF:
                    weapon.type        = (ushort)WeaponType.SHORT_SWORD;
                    weapon.augeSkillID = 150001;
                    break;

                case JobType.RECRUIT:
                    weapon.type        = (ushort)WeaponType.DAMPTFLINTE;
                    weapon.augeSkillID = 150043;
                    break;

                case JobType.CLOWN:
                    weapon.type        = (ushort)WeaponType.SHORT_SWORD;
                    weapon.augeSkillID = 150001;
                    break;

                case JobType.NOVICE:
                    weapon.type        = (ushort)WeaponType.SHORT_SWORD;
                    weapon.augeSkillID = 150001;
                    break;
                }
                info = WeaponFactory.GetWeaponInfo((byte)weapon.type, weapon.level);
                if (weapon.durability > info.maxdurability)
                {
                    weapon.durability = (ushort)info.maxdurability;
                }
            }

            /*this.Char.str = 5;
             * this.Char.dex = 3;
             * this.Char.con = 3;
             * this.Char.intel = 2;
             * this.Char.luk = 0;
             * this.Char.stpoints = (byte)(2 * (this.Char.cLevel - 1));*/
            SkillHandler.SkillResetOnJobChange(this.Char);
            SkillHandler.CalcHPSP(ref this.client.Char);
            this.client.SendCharStatus(0);
            this.client.SendBattleStatus();
            this.client.SendExtStats();
            Packets.Server.WeaponTypeChange p = new SagaMap.Packets.Server.WeaponTypeChange();
            p.SetType(weapon.type);
            p.SetWeaponAuge(weapon.augeSkillID);
            p.SetPostFix(postfix);
            this.client.netIO.SendPacket(p, client.SessionID);
            //if (this.checkTwoHanded())  //this is not working
            this.MakeInactive(EQUIP_SLOT.LEFT_HAND);
            Packets.Server.ChangedJob p2 = new SagaMap.Packets.Server.ChangedJob();
            p2.SetJob(NewJob);
            p2.SetUnknown(this.Char.id);
            this.client.netIO.SendPacket(p2, client.SessionID);
            if (this.Char.CurTarget != null)
            {
                Npc npc = (Npc)this.Char.CurTarget.e;
                npc.NPCChat(this.Char, 1758);
            }
            else
            {
                Logger.ShowDebug(this.Char.name + "->CurTarget == null ", null);
            }
            if (this.client.Party != null)
            {
                this.client.Party.UpdateMemberInfo(this.client);
            }
        }