Ejemplo n.º 1
0
        public static EClass Convert(this EClientClass cls)
        {
            string memberName  = cls.ToString();
            EClass serverClass = (EClass)Enum.Parse(typeof(EClass), memberName);

            return(serverClass);
        }
Ejemplo n.º 2
0
        public static CharacterJobBonus ParseJobBonus(string filepath)
        {
            CharacterJobBonus bonus        = new CharacterJobBonus();
            EClientClass      currentClass = EClientClass.Novice;

            using (XmlReader xml = XmlReader.Create(filepath)) {
                while (xml.Read() == true)
                {
                    if (xml.NodeType != XmlNodeType.Element)
                    {
                        continue;
                    }
                    string name = xml.Name;

                    if (name == "Job")
                    {
                        int idInt = int.Parse(xml.GetAttribute("ID"));
                        currentClass = (EClientClass)idInt;
                        bonus.Add(currentClass, new Dictionary <int, EStatusAttribute>());
                    }
                    else if (name == "Bonus")
                    {
                        string           attString = xml.GetAttribute("Type");
                        EStatusAttribute att       = (EStatusAttribute)Enum.Parse(typeof(EStatusAttribute), attString);
                        int level = int.Parse(xml.GetAttribute("Level"));

                        bonus[currentClass].Add(level, att);
                    }
                }
            }             // using

            return(bonus);
        }
Ejemplo n.º 3
0
        public static EClientClass Index(this EClientClass cls)
        {
            int iCls = (int)cls;

            if (iCls >= (int)EClientClass.NoviceHigh)
            {
                return((EClientClass)(iCls - (int)EClientClass.NoviceHigh + (int)EClientClass.MaxBasic));
            }
            return(cls);
        }
Ejemplo n.º 4
0
        public static CharacterJobModifer ParseJobModifer(string filepath)
        {
            CharacterJobModifer modifer      = new CharacterJobModifer();
            EClientClass        currentClass = EClientClass.Novice;

            using (XmlReader xml = XmlReader.Create(filepath)) {
                while (xml.Read() == true)
                {
                    if (xml.NodeType != XmlNodeType.Element)
                    {
                        continue;
                    }
                    string name = xml.Name;

                    if (name == "Job")
                    {
                        int idInt = int.Parse(xml.GetAttribute("ID"));
                        currentClass = (EClientClass)idInt;
                        modifer.Add(currentClass, new CharacterJobModiferValues());
                    }
                    else if (name == "Mod")
                    {
                        string typeName           = xml.GetAttribute("Name");
                        ECharacterJobModifer type = (ECharacterJobModifer)Enum.Parse(typeof(ECharacterJobModifer), typeName);
                        int value = int.Parse(xml.GetAttribute("Value"));

                        modifer[currentClass].Add((int)type, value);
                    }
                    else if (name == "Weapon")
                    {
                        int type  = int.Parse(xml.GetAttribute("Type"));
                        int value = int.Parse(xml.GetAttribute("Value"));

                        modifer[currentClass].Add(type, value);
                    }
                }
            }             // using

            return(modifer);
        }
Ejemplo n.º 5
0
        private void CheckNewSkills(Character character, EClass normalClass, EClientClass c)
        {
            int flag;
            int iC = (int)c;

            do
            {
                flag = 0;
                foreach (SkillTreeJobSkill skill in SkillTree.Tree[iC].Values)
                {
                    int        j, f, k;
                    ESkillInf2 inf2;

                    // Skill already known?
                    if (character.Status.Skills[skill.ID].ID > 0)
                    {
                        continue;
                    }

                    f = 1;
                    if (Config.PlayerSkillfree == false)
                    {
                        foreach (SkillTreeJobSkillRequirement req in skill.Values)
                        {
                            if (req.ID < 1)
                            {
                                continue;
                            }

                            CharacterSkill charSkill = character.Status.Skills[req.ID];
                            int            hasLv     = 0;
                            if (charSkill.ID == 0 || charSkill.Flag == ESkillFlag.Temporary || charSkill.Flag == ESkillFlag.Plagiarized)
                            {
                                req.ID = 0;                      //Not learned.
                            }
                            else                                 //Real lerned level
                            {
                                if ((int)charSkill.Flag >= (int)ESkillFlag.ReplacedLv0)
                                {
                                    hasLv = (int)charSkill.Flag - (int)ESkillFlag.ReplacedLv0;
                                }
                                else
                                {
                                    hasLv = charSkill.Level;
                                }
                            }
                            if (hasLv < req.Level)
                            {
                                f = 0;
                                break;
                            }
                        }

                        // job level requirement wasn't satisfied
                        if (character.Status.LevelJob < skill.JobLevel)
                        {
                            f = 0;
                        }
                    }

                    if (f == 1)
                    {
                        SkillDatabaseData skillData = (SkillDatabaseData)World.Database.Skill[(ESkill)skill.ID];
                        CharacterSkill    newSkill  = character.Status.Skills[skill.ID];
                        inf2 = skillData.Inf2;

                        // Cannot be learned via normal means
                        // Note: this check DOES allows raising already known skills.
                        if (newSkill.Level < 1 && (
                                ((inf2 & ESkillInf2.Quest) > 0 && Config.QuestSkillLearn == false) ||
                                (inf2 & ESkillInf2.Wedding) > 0 ||
                                ((inf2 & ESkillInf2.Spirit) > 0 && !character.StatusChange.HasStatus(EStatusChange.Spirit))
                                ))
                        {
                            continue;
                        }
                        newSkill.ID = (ushort)skill.ID;
                        // TODO: i couldnt find the place where eA set the level oif newly learned skills
                        //		 seems they start with zero, but this cant be!
                        if (newSkill.Level < 1)
                        {
                            newSkill.Level = 1;
                        }

                        // Spirit skills cannot be learned, they will only show up on your tree when you get buffed.
                        if ((inf2 & ESkillInf2.Spirit) > 0)
                        {
                            newSkill.Flag = ESkillFlag.Temporary;                             //So it is not saved, and tagged as a "bonus" skill.
                        }

                        // Save back
                        character.Status.Skills[skill.ID] = newSkill;
                        // skill list has changed, perform another pass
                        flag = 1;
                    }
                }                 // foreach
            } while (flag > 0);
        }
Ejemplo n.º 6
0
        public void CalculateTree(Character character, EClass normalClass, EClientClass c)
        {
            for (int i = 0; i < this.Length; i++)
            {
                CharacterSkill skill = this[i];
                // Restore original level of skills after deleting earned skills.
                if (skill.Flag != ESkillFlag.Permanent && skill.Flag != ESkillFlag.Plagiarized)
                {
                    skill.Level = (ushort)(skill.Flag == ESkillFlag.Temporary ? 0 : ((int)skill.Flag - (int)ESkillFlag.ReplacedLv0));
                    skill.Flag  = ESkillFlag.Permanent;
                }

                // Enable Bard/Dancer spirit linked skills
                if (
                    character.StatusChange.Count > 0 &&
                    character.StatusChange.HasStatus(EStatusChange.Spirit) &&
                    character.StatusChange[EStatusChange.Spirit].Value2 == (int)ESkill.SlBarddancer &&
                    i >= (int)ESkill.DcHumming && i <= (int)ESkill.DcServiceforyou
                    )
                {
                    // Link dancer skills to bard
                    if (character.Status.Sex == EAccountSex.Female)
                    {
                        // TODO: .. eh what? Why the hell -8? is this safe?
                        if (this[i - 8].Level < 10)
                        {
                            continue;
                        }
                        skill.ID    = (ushort)i;
                        skill.Level = this[i - 8].Level;                         // Set the level to the same as the linking skill
                        skill.Flag  = ESkillFlag.Temporary;                      // Tag it as a non-savable, non-uppable, bonus skill
                    }
                    else
                    {
                        // Link bard skills to dancer.
                        if (skill.Level < 10)
                        {
                            continue;
                        }
                        CharacterSkill tmpSkill = this[i - 8];
                        tmpSkill.ID    = (ushort)(i - 8);
                        tmpSkill.Level = skill.Level;                         // Set the level to the same as the linking skill
                        tmpSkill.Flag  = ESkillFlag.Temporary;                // Tag it as a non-savable, non-uppable, bonus skill
                        this[i - 8]    = tmpSkill;
                    }
                }

                // save changed skill
                this[i] = skill;
            }             // for


            CheckNewSkills(character, normalClass, c);

            /* Taekwon Ranger Bonus Skill Tree
             * ============================================
             * - Grant All Taekwon Tree, but only as Bonus Skills in case they drop from ranking.
             * - (c > 0) to avoid grant Novice Skill Tree in case of Skill Reset (need more logic)
             * - (sd->status.skill_point == 0) to wait until all skill points are asigned to avoid problems with Job Change quest.
             */

            if (
                c != EClientClass.Novice &&
                (character.Class & EClass.UPPERMASK) == EClass.Taekwon &&
                character.Status.LevelBase >= 90 &&
                character.Status.SkillPoints == 0 && FameListHelper.Taekwon.Contains(character.ID) == true
                )
            {
                ESkillInf2 flagQuestWedding = (ESkillInf2.Quest | ESkillInf2.Wedding);
                foreach (SkillTreeJobSkill skill in SkillTree.Tree[(int)c].Values)
                {
                    SkillDatabaseData skillData = (SkillDatabaseData)World.Database.Skill[(ESkill)skill.ID];
                    // Do not include Quest/Wedding skills
                    if ((skillData.Inf2 & flagQuestWedding) > 0)
                    {
                        continue;
                    }

                    CharacterSkill charSkill = character.Status.Skills[skill.ID];
                    if (charSkill.ID == 0)
                    {
                        // So it is not saved, and tagged as a "bonus" skill
                        charSkill.ID   = (ushort)skill.ID;
                        charSkill.Flag = ESkillFlag.Temporary;
                    }
                    else
                    {
                        // Remember original level
                        charSkill.Flag = (ESkillFlag)((int)ESkillFlag.ReplacedLv0 + charSkill.Level);
                    }

                    charSkill.Level = (ushort)skill.MaxLevel;

                    character.Status.Skills[skill.ID] = charSkill;
                }
            }             // if taekwon

            // GM all skills
            if (Config.GmAllSkill > 0 && character.GMLevel >= Config.GmAllSkill)
            {
                ESkillInf2 flag = (ESkillInf2.Npc | ESkillInf2.Guild);
                for (int i = 0; i < this.Length; i++)
                {
                    CharacterSkill    skill     = this[i];
                    SkillDatabaseData skillData = (SkillDatabaseData)World.Database.Skill[i];

                    // Only skills you can't have are npc/guild ones
                    if ((skillData.Inf2 & flag) > 0)
                    {
                        continue;
                    }
                    // Skill is learnable (MaxLevel above 0)
                    if (skillData.Max < 1)
                    {
                        continue;
                    }

                    skill.ID = (ushort)i;
                    this[i]  = skill;
                }
            }
        }