using System.Collections.Generic; using System.Linq; using Dalamud.Plugin.Services; using Lumina.Excel.Sheets; namespace LLib.GameData; public static class EClassJobExtensions { public static bool IsClass(this EClassJob classJob) { bool flag; switch (classJob) { case EClassJob.Gladiator: case EClassJob.Pugilist: case EClassJob.Marauder: case EClassJob.Lancer: case EClassJob.Archer: case EClassJob.Conjurer: case EClassJob.Thaumaturge: case EClassJob.Arcanist: case EClassJob.Rogue: flag = true; break; default: flag = false; break; } if (!flag && !classJob.IsCrafter()) { return classJob.IsGatherer(); } return true; } public static bool HasBaseClass(this EClassJob classJob) { return classJob.GetBaseClass().HasValue; } public static EClassJob? GetBaseClass(this EClassJob classJob) { return classJob switch { EClassJob.Paladin => EClassJob.Gladiator, EClassJob.Warrior => EClassJob.Marauder, EClassJob.Monk => EClassJob.Pugilist, EClassJob.Dragoon => EClassJob.Lancer, EClassJob.Ninja => EClassJob.Rogue, EClassJob.Bard => EClassJob.Archer, EClassJob.WhiteMage => EClassJob.Conjurer, EClassJob.BlackMage => EClassJob.Thaumaturge, EClassJob.Summoner => EClassJob.Arcanist, EClassJob.Scholar => EClassJob.Arcanist, _ => null, }; } public static EClassJob AsJob(this EClassJob classJob) { return classJob switch { EClassJob.Gladiator => EClassJob.Paladin, EClassJob.Marauder => EClassJob.Warrior, EClassJob.Pugilist => EClassJob.Monk, EClassJob.Lancer => EClassJob.Dragoon, EClassJob.Rogue => EClassJob.Ninja, EClassJob.Archer => EClassJob.Bard, EClassJob.Conjurer => EClassJob.WhiteMage, EClassJob.Thaumaturge => EClassJob.BlackMage, EClassJob.Arcanist => EClassJob.Summoner, _ => classJob, }; } public static bool IsTank(this EClassJob classJob) { switch (classJob) { case EClassJob.Gladiator: case EClassJob.Marauder: case EClassJob.Paladin: case EClassJob.Warrior: case EClassJob.DarkKnight: case EClassJob.Gunbreaker: return true; default: return false; } } public static bool IsHealer(this EClassJob classJob) { switch (classJob) { case EClassJob.Conjurer: case EClassJob.WhiteMage: case EClassJob.Scholar: case EClassJob.Astrologian: case EClassJob.Sage: return true; default: return false; } } public static bool IsMelee(this EClassJob classJob) { switch (classJob) { case EClassJob.Pugilist: case EClassJob.Lancer: case EClassJob.Monk: case EClassJob.Dragoon: case EClassJob.Rogue: case EClassJob.Ninja: case EClassJob.Samurai: case EClassJob.Reaper: case EClassJob.Viper: case EClassJob.Beastmaster: return true; default: return false; } } public static bool IsPhysicalRanged(this EClassJob classJob) { switch (classJob) { case EClassJob.Archer: case EClassJob.Bard: case EClassJob.Machinist: case EClassJob.Dancer: return true; default: return false; } } public static bool IsCaster(this EClassJob classJob) { switch (classJob) { case EClassJob.Thaumaturge: case EClassJob.BlackMage: case EClassJob.Arcanist: case EClassJob.Summoner: case EClassJob.RedMage: case EClassJob.BlueMage: case EClassJob.Pictomancer: return true; default: return false; } } public static bool IsDps(this EClassJob classJob) { if (!classJob.IsMelee() && !classJob.IsPhysicalRanged()) { return classJob.IsCaster(); } return true; } public static bool DealsPhysicalDamage(this EClassJob classJob) { if (!classJob.IsTank() && !classJob.IsMelee()) { return classJob.IsPhysicalRanged(); } return true; } public static bool DealsMagicDamage(this EClassJob classJob) { if (!classJob.IsHealer()) { return classJob.IsCaster(); } return true; } public static bool IsCrafter(this EClassJob classJob) { if (classJob >= EClassJob.Carpenter) { return classJob <= EClassJob.Culinarian; } return false; } public static bool IsGatherer(this EClassJob classJob) { if (classJob >= EClassJob.Miner) { return classJob <= EClassJob.Fisher; } return false; } public static bool IsLimitedJob(this EClassJob classJob) { if (classJob == EClassJob.BlueMage || classJob == EClassJob.Beastmaster) { return true; } return false; } public static string ToFriendlyString(this EClassJob classJob) { return classJob switch { EClassJob.WhiteMage => "White Mage", EClassJob.BlackMage => "Black Mage", EClassJob.DarkKnight => "Dark Knight", EClassJob.RedMage => "Red Mage", EClassJob.BlueMage => "Blue Mage", _ => classJob.ToString(), }; } public static bool IsInCategory(this EClassJob classJob, ClassJobCategory category) { return classJob switch { EClassJob.Adventurer => category.ADV, EClassJob.Gladiator => category.GLA, EClassJob.Pugilist => category.PGL, EClassJob.Marauder => category.MRD, EClassJob.Lancer => category.LNC, EClassJob.Archer => category.ARC, EClassJob.Conjurer => category.CNJ, EClassJob.Thaumaturge => category.THM, EClassJob.Carpenter => category.CRP, EClassJob.Blacksmith => category.BSM, EClassJob.Armorer => category.ARM, EClassJob.Goldsmith => category.GSM, EClassJob.Leatherworker => category.LTW, EClassJob.Weaver => category.WVR, EClassJob.Alchemist => category.ALC, EClassJob.Culinarian => category.CUL, EClassJob.Miner => category.MIN, EClassJob.Botanist => category.BTN, EClassJob.Fisher => category.FSH, EClassJob.Paladin => category.PLD, EClassJob.Monk => category.MNK, EClassJob.Warrior => category.WAR, EClassJob.Dragoon => category.DRG, EClassJob.Bard => category.BRD, EClassJob.WhiteMage => category.WHM, EClassJob.BlackMage => category.BLM, EClassJob.Arcanist => category.ACN, EClassJob.Summoner => category.SMN, EClassJob.Scholar => category.SCH, EClassJob.Rogue => category.ROG, EClassJob.Ninja => category.NIN, EClassJob.Machinist => category.MCH, EClassJob.DarkKnight => category.DRK, EClassJob.Astrologian => category.AST, EClassJob.Samurai => category.SAM, EClassJob.RedMage => category.RDM, EClassJob.BlueMage => category.BLU, EClassJob.Gunbreaker => category.GNB, EClassJob.Dancer => category.DNC, EClassJob.Reaper => category.RPR, EClassJob.Sage => category.SGE, EClassJob.Viper => category.VPR, EClassJob.Pictomancer => category.PCT, EClassJob.Beastmaster => category.Unknown0, _ => false, }; } public static int GetLevel(this EClassJob classJob, IDataManager dataManager) { ClassJob? rowOrDefault = dataManager.GetExcelSheet().GetRowOrDefault((uint)classJob); if (!rowOrDefault.HasValue || rowOrDefault.Value.ExpArrayIndex < 0) { return 0; } return PlayerStateHelper.GetClassJobLevel(rowOrDefault.Value.ExpArrayIndex); } public static int GetExperience(this EClassJob classJob, IDataManager dataManager) { ClassJob? rowOrDefault = dataManager.GetExcelSheet().GetRowOrDefault((uint)classJob); if (!rowOrDefault.HasValue || rowOrDefault.Value.ExpArrayIndex < 0) { return 0; } return PlayerStateHelper.GetClassJobExperience(rowOrDefault.Value.ExpArrayIndex); } public static List GetActions(this EClassJob classJob, IDataManager dataManager) { return (from a in dataManager.GetExcelSheet() where a.ClassJob.RowId == (uint)classJob && a.ClassJobLevel > 0 orderby a.ClassJobLevel select a).ToList(); } }