OpenNos.GameObject.Character.GenerateXp C# (CSharp) Method

GenerateXp() public method

public GenerateXp ( NpcMonster monsterinfo, bool isMonsterOwner ) : void
monsterinfo NpcMonster
isMonsterOwner bool
return void
        public void GenerateXp(NpcMonster monsterinfo, bool isMonsterOwner)
        {
            Group grp = ServerManager.Instance.Groups.FirstOrDefault(g => g.IsMemberOfGroup(CharacterId));
            SpecialistInstance specialist = null;
            if (Hp <= 0)
            {
                return;
            }
            if (grp != null)
            {
            }
            if ((int)(LevelXp / (XPLoad() / 10)) < (int)((LevelXp + monsterinfo.XP) / (XPLoad() / 10)))
            {
                Hp = (int)HPLoad();
                Mp = (int)MPLoad();
                Session.SendPacket(GenerateStat());
                Session.SendPacket(GenerateEff(5));
            }

            if (Inventory != null)
            {
                specialist = Inventory.LoadBySlotAndType<SpecialistInstance>((byte)EquipmentType.Sp, InventoryType.Wear);
            }

            if (Level < 99)
            {
                if (isMonsterOwner)
                {
                    LevelXp += GetXP(monsterinfo, grp);
                }
                else
                {
                    LevelXp += GetXP(monsterinfo, grp) / 3;
                }
            }
            if ((Class == 0 && JobLevel < 20) || (Class != 0 && JobLevel < 80))
            {
                if (specialist != null && UseSp && specialist.SpLevel < 99 && specialist.SpLevel > 19)
                {
                    JobLevelXp += GetJXP(monsterinfo, grp) / 2;
                }
                else
                {
                    JobLevelXp += GetJXP(monsterinfo, grp);
                }
            }
            if (specialist != null && UseSp && specialist.SpLevel < 99)
            {
                int multiplier = specialist.SpLevel < 10 ? 10 : specialist.SpLevel < 19 ? 5 : 1;
                specialist.XP += GetJXP(monsterinfo, grp) * multiplier;
            }
            double t = XPLoad();
            while (LevelXp >= t)
            {
                LevelXp -= (long)t;
                Level++;
                t = XPLoad();
                if (Level >= 99)
                {
                    Level = 99;
                    LevelXp = 0;
                }
                Hp = (int)HPLoad();
                Mp = (int)MPLoad();
                Session.SendPacket(GenerateStat());
                Session.SendPacket($"levelup {CharacterId}");
                Session.SendPacket(GenerateMsg(Language.Instance.GetMessageFromKey("LEVELUP"), 0));
                Session.CurrentMap?.Broadcast(GenerateEff(6), MapX, MapY);
                Session.CurrentMap?.Broadcast(GenerateEff(198), MapX, MapY);
                ServerManager.Instance.UpdateGroup(CharacterId);
            }

            WearableInstance fairy = Inventory?.LoadBySlotAndType<WearableInstance>((byte)EquipmentType.Fairy, InventoryType.Wear);
            if (fairy != null)
            {
                if ((fairy.ElementRate + fairy.Item.ElementRate) < fairy.Item.MaxElementRate && Level <= monsterinfo.Level + 15 && Level >= monsterinfo.Level - 15)
                {
                    fairy.XP += ServerManager.FairyXpRate;
                }
                t = CharacterHelper.LoadFairyXPData(fairy.ElementRate);
                while (fairy.XP >= t)
                {
                    fairy.XP -= (int)t;
                    fairy.ElementRate++;
                    if ((fairy.ElementRate + fairy.Item.ElementRate) == fairy.Item.MaxElementRate)
                    {
                        fairy.XP = 0;
                        Session.SendPacket(GenerateMsg(String.Format(Language.Instance.GetMessageFromKey("FAIRYMAX"), fairy.Item.Name), 10));
                    }
                    else
                    {
                        Session.SendPacket(GenerateMsg(String.Format(Language.Instance.GetMessageFromKey("FAIRY_LEVELUP"), fairy.Item.Name), 10));
                    }
                    Session.SendPacket(GeneratePairy());
                }
            }

            t = JobXPLoad();
            while (JobLevelXp >= t)
            {
                JobLevelXp -= (long)t;
                JobLevel++;
                t = JobXPLoad();
                if (JobLevel >= 20 && Class == 0)
                {
                    JobLevel = 20;
                    JobLevelXp = 0;
                }
                else if (JobLevel >= 80)
                {
                    JobLevel = 80;
                    JobLevelXp = 0;
                }
                Hp = (int)HPLoad();
                Mp = (int)MPLoad();
                Session.SendPacket(GenerateStat());
                Session.SendPacket($"levelup {CharacterId}");
                Session.SendPacket(GenerateMsg(Language.Instance.GetMessageFromKey("JOB_LEVELUP"), 0));
                LearnAdventurerSkill();
                Session.CurrentMap?.Broadcast(GenerateEff(6), MapX, MapY);
                Session.CurrentMap?.Broadcast(GenerateEff(198), MapX, MapY);
            }
            if (specialist != null)
            {
                t = SPXPLoad();

                while (UseSp && specialist.XP >= t)
                {
                    specialist.XP -= (long)t;
                    specialist.SpLevel++;
                    t = SPXPLoad();
                    Session.SendPacket(GenerateStat());
                    Session.SendPacket($"levelup {CharacterId}");
                    if (specialist.SpLevel >= 99)
                    {
                        specialist.SpLevel = 99;
                        specialist.XP = 0;
                    }
                    LearnSPSkill();

                    Session.SendPacket(GenerateMsg(Language.Instance.GetMessageFromKey("SP_LEVELUP"), 0));
                    Session.CurrentMap?.Broadcast(GenerateEff(6), MapX, MapY);
                    Session.CurrentMap?.Broadcast(GenerateEff(198), MapX, MapY);
                }
            }
            Session.SendPacket(GenerateLev());
        }
Character