local im = require("imgui") local ubviews = require("utilitybelt.views") local Quests = require("quests") local imgui = im.ImGui local version = "1.8.1" local currentHUDPosition = nil local defaultHUDposition = Vector2.new(500,100) local iconVectorSize = Vector2.new(16,16) local characterTypeSelf = nil local textures = {} --[[ TODO / POTENTIAL WORK LIST - Clean Up / Speed Up Code - Add Damage Colors To Weapon Types - Tracking for Biting Strike / Crushing Blow / Armor Cleaving - Better Tooltips ]]-- -- Cached Data for Performance local CachedData = { LuminanceFlagged = false, FactionBits = nil, SkillTrainingMagicItemTinkering = SkillTrainingType.Untrained, SkillTrainingItemTinkering = SkillTrainingType.Untrained, SkillTrainingArmorTinkering = SkillTrainingType.Untrained, SkillTrainingWeaponTinkering = SkillTrainingType.Untrained, AugInnateFamily = 0, AugResistanceFamily = 0, InventoryCountAsheronsBenediction = 0, LastUpdatedTime = os.clock() } -- LUA Table for Color Codes local Colors = { Red = Vector4.new(1, 0, 0, 1), SoftRed = Vector4.new(1, 0.5, 0.5, 1), Orange = Vector4.new(1, 0.7, 0.4, 1), SoftOrange = Vector4.new(1, 0.7, 0.2, 1), Yellow = Vector4.new(1, 1, 0, 1), SoftYellow = Vector4.new(1, 1, 0.5, 1), Green = Vector4.new(0, 1, 0, 1), SoftGreen = Vector4.new(0.3, 1, 0.3, 1), SofterGreen = Vector4.new(0.5, 1, 0.5, 1), LightBlue = Vector4.new(0.3, 0.6, 1, 1), SoftBlue = Vector4.new(0.5, 0.7, 1, 1), SoftPurple = Vector4.new(0.8, 0.5, 1, 1), BrightPurple = Vector4.new(0.8, 0.3, 1, 1), White = Vector4.new(1, 1, 1, 1), LightGray = Vector4.new(0.7, 0.7, 0.7, 1), DarkGray = Vector4.new(0.6, 0.6, 0.6, 1) } -- Holds Script-Wide Settings local Settings = { showLuminance = true, showRecallSpells = true, showSociety=true, showFacHub=false, showQuests=false, showFlags=true, hideUnacquiredWeapons=false, hideMissingCantrips=false, hideResistanceCleavingWeapons=true, hideNonEssentialCreatureSlayers=true } -- Different Character Types (Returned by GetCharacterType) local CharacterType = { Unknown = 0, Melee = 1, Archer = 2, WarMage = 3, VoidMage = 4 } -- Quest Info Type (Used In Character Flags) local QuestInfoType = { SolveCount = 1, ReadyCheck = 2, StampCheck = 3 } -- Quest Type (Used For Society Quests) local QuestType = { Other = 0, KillTask = 1, CollectItem = 2, QuestTag = 3, MultiQuestTag = 4 } -- Maps Numeric Value to CreatureType local MapCreatureType = { [0] = CreatureType.Invalid, [1] = CreatureType.Olthoi, [2] = CreatureType.Banderling, [3] = CreatureType.Drudge, [4] = CreatureType.Mosswart, [5] = CreatureType.Lugian, [6] = CreatureType.Tumerok, [7] = CreatureType.Mite, [8] = CreatureType.Tusker, [9] = CreatureType.PhyntosWasp, [10] = CreatureType.Rat, [11] = CreatureType.Auroch, [12] = CreatureType.Cow, [13] = CreatureType.Golem, [14] = CreatureType.Undead, [15] = CreatureType.Gromnie, [16] = CreatureType.Reedshark, [17] = CreatureType.Armoredillo, [18] = CreatureType.Fae, [19] = CreatureType.Virindi, [20] = CreatureType.Wisp, [21] = CreatureType.Knathtead, [22] = CreatureType.Shadow, [23] = CreatureType.Mattekar, [24] = CreatureType.Mumiyah, [25] = CreatureType.Rabbit, [26] = CreatureType.Sclavus, [27] = CreatureType.ShallowsShark, [28] = CreatureType.Monouga, [29] = CreatureType.Zefir, [30] = CreatureType.Skeleton, [31] = CreatureType.Human, [32] = CreatureType.Shreth, [33] = CreatureType.Chittick, [34] = CreatureType.Moarsman, [35] = CreatureType.OlthoiLarvae, [36] = CreatureType.Slithis, [37] = CreatureType.Deru, [38] = CreatureType.FireElemental, [39] = CreatureType.Snowman, [40] = CreatureType.Unknown, [41] = CreatureType.Bunny, [42] = CreatureType.LightningElemental, [43] = CreatureType.Rockslide, [44] = CreatureType.Grievver, [45] = CreatureType.Niffis, [46] = CreatureType.Ursuin, [47] = CreatureType.Crystal, [48] = CreatureType.HollowMinion, [49] = CreatureType.Scarecrow, [50] = CreatureType.Idol, [51] = CreatureType.Empyrean, [52] = CreatureType.Hopeslayer, [53] = CreatureType.Doll, [54] = CreatureType.Marionette, [55] = CreatureType.Carenzi, [56] = CreatureType.Siraluun, [57] = CreatureType.AunTumerok, [58] = CreatureType.HeaTumerok, [59] = CreatureType.Simulacrum, [60] = CreatureType.AcidElemental, [61] = CreatureType.FrostElemental, [62] = CreatureType.Elemental, [63] = CreatureType.Statue, [64] = CreatureType.Wall, [65] = CreatureType.AlteredHuman, [66] = CreatureType.Device, [67] = CreatureType.Harbinger, [68] = CreatureType.DarkSarcophagus, [69] = CreatureType.Chicken, [70] = CreatureType.GotrokLugian, [71] = CreatureType.Margul, [72] = CreatureType.BleachedRabbit, [73] = CreatureType.NastyRabbit, [74] = CreatureType.GrimacingRabbit, [75] = CreatureType.Burun, [76] = CreatureType.Target, [77] = CreatureType.Ghost, [78] = CreatureType.Fiun, [79] = CreatureType.Eater, [80] = CreatureType.Penguin, [81] = CreatureType.Ruschk, [82] = CreatureType.Thrungus, [83] = CreatureType.ViamontianKnight, [84] = CreatureType.Remoran, [85] = CreatureType.Swarm, [86] = CreatureType.Moar, [87] = CreatureType.EnchantedArms, [88] = CreatureType.Sleech, [89] = CreatureType.Mukkir, [90] = CreatureType.Merwart, [91] = CreatureType.Food, [92] = CreatureType.ParadoxOlthoi, [93] = CreatureType.Harvest, [94] = CreatureType.Energy, [95] = CreatureType.Apparition, [96] = CreatureType.Aerbax, [97] = CreatureType.Touched, [98] = CreatureType.BlightedMoarsman, [99] = CreatureType.GearKnight, [100] = CreatureType.Gurog, [101] = CreatureType.Anekshay } -- Skill Replacement for Cantrips That Have Different Names Than Their Skill local MapSkillCantripReplacements = { [SkillId.MagicDefense] = "MagicResistance", [SkillId.MeleeDefense] = "Invulnerability", [SkillId.MissileDefense] = "Impgrenability", [SkillId.MissleWeapons] = "MissileWeapon", [SkillId.HeavyWeapons] = "HeavyWeapon", [SkillId.LightWeapons] = "LightWeapon", [SkillId.FinesseWeapons] = "FinesseWeapon" } -- Color Map for Cantrip Levels local MapCantripColors = { ["N/A"] = Colors.LightGray, ["Minor"] = Colors.White, ["Moderate"] = Colors.SoftGreen, ["Major"] = Colors.LightBlue, ["Epic"] = Colors.BrightPurple, ["Legendary"] = Colors.SoftOrange } -- Rank Map for Societies local MapSocietyRibbons = { -- 1 = Min Ribbons -- 2 = Max Ribbons -- 3 = Ribbons Per Day ["Initiate"] = {min = 1, max = 95, perday = 50}, ["Adept"] = {min = 101, max = 295, perday = 100}, ["Knight"] = {min = 301, max = 595, perday = 150}, ["Lord"] = {min = 601, max = 995, perday = 200}, ["Master"] = {min = 1001, max = 9999, perday = 250} } -- State Tracking for Tree Nodes local TreeOpenStates = { ["Stat Augs"] = false, ["Resistance Augs"] = false } -- Tree Layout for Augmentation Tab local TabAugmentations = { -- 1 = Augmentation Name -- 2 = Augmentation Int ID -- 3 = Augmentation Times Repeatable -- 4 = NPC Trainer -- 5 = NPC Trainer Location ["Death Augs"] = { {name = "Keep Items", id = IntId.AugmentationLessDeathItemLoss, repeatable = 3, trainer = "Rohula bint Ludun", location = "Ayan Baqur"}, {name = "Keep Spells", id = IntId.AugmentationSpellsRemainPastDeath, repeatable = 1, trainer = "Erik Festus", location = "Ayan Baqur"} }, ["Skill Augs"] = { {name = "+5 All Skills", id = IntId.AugmentationJackOfAllTrades, repeatable = 1, trainer = "Arianna the Adept", location = "Bandit Castle"}, {name = "+10 Melee Skills", id = IntId.AugmentationSkilledMelee, repeatable = 1, trainer = "Carlito Gallo", location = "Silyun"}, {name = "+10 Magic Skills", id = IntId.AugmentationSkilledMagic, repeatable = 1, trainer = "Rahina bint Zalanis", location = "Zaikhal"}, {name = "+10 Missile Skills", id = IntId.AugmentationSkilledMissile, repeatable = 1, trainer = "Kilaf", location = "Zaikhal"} }, ["Rating Augs"] = { {name = "25%% Crit Protection", id = IntId.AugmentationCriticalDefense, repeatable = 1, trainer = "Piersanti Linante", location = "Sanamar"}, {name = "1%% Critical Chance", id = IntId.AugmentationCriticalExpertise, repeatable = 1, trainer = "Anfram Mellow", location = "Ayan Baqur"}, {name = "3%% Critical Damage", id = IntId.AugmentationCriticalPower, repeatable = 1, trainer = "Alishia bint Aldan", location = "Ayan Baqur"}, {name = "3%% Damage Rating", id = IntId.AugmentationDamageBonus, repeatable = 1, trainer = "Neela Nashua", location = "Bandit Castle"}, {name = "3%% Damage Reduction", id = IntId.AugmentationDamageReduction, repeatable = 1, trainer = "Emily Yarow", location = "Cragstone"} }, ["Burden / Pack Augs"] = { {name = "Extra Carrying Capacity", id = IntId.AugmentationIncreasedCarryingCapacity, repeatable = 5, trainer = "Husoon", location = "Zaikhal"}, {name = "Extra Pack Slot", id = IntId.AugmentationExtraPackSlot, repeatable = 1, trainer = "Dumida bint Ruminre", location = "Zaikhal"}, {name = "Infused War Magic", id = IntId.AugmentationInfusedWarMagic, repeatable = 1, trainer = "Raphel Detante", location = "Silyun"}, {name = "Infused Void Magic", id = IntId.AugmentationInfusedVoidMagic, repeatable = 1, trainer = "Morathe", location = "Candeth Keep"}, {name = "Infused Creature Magic", id = IntId.AugmentationInfusedCreatureMagic, repeatable = 1, trainer = "Gustuv Lansdown", location = "Cragstone"}, {name = "Infused Life Magic", id = IntId.AugmentationInfusedLifeMagic, repeatable = 1, trainer = "Akemi Fei", location = "Hebian-To"}, {name = "Infused Item Magic", id = IntId.AugmentationInfusedItemMagic, repeatable = 1, trainer = "Gan Fo", location = "Hebian-To"} }, ["Misc Augs"] = { {name = "10%% Health Increase", id = nil, repeatable = 1, trainer = "Donatello Linante", location = "Silyun"}, {name = "Increased Spell Duration", id = IntId.AugmentationIncreasedSpellDuration, repeatable = 5, trainer = "Nawamara Ujio", location = "Mayoi"}, {name = "Faster HP Regen", id = IntId.AugmentationFasterRegen, repeatable = 2, trainer = "Alison Dulane", location = "Bandit Castle"}, {name = "5%% Experience Increase", id = IntId.AugmentationBonusXp, repeatable = 1, trainer = "Rickard Dumalia", location = "Silyun"} }, ["Salvage Augs"] = { {name = "Specialized Weapon Tinkering", id = IntId.AugmentationSpecializeWeaponTinkering, repeatable = 1, trainer = "Lenor Turk", location = "Cragstone"}, {name = "Specialized Armor Tinkering", id = IntId.AugmentationSpecializeArmorTinkering, repeatable = 1, trainer = "Joshun Felden", location = "Cragstone"}, {name = "Specialized Item Tinkering", id = IntId.AugmentationSpecializeItemTinkering, repeatable = 1, trainer = "Brienne Carlus", location = "Cragstone"}, --{"Specialized GearCraft",IntId.AugmentationSpecializeGearcraft,1,"Alex Brummel","Cragstone"}, {name = "Specialized Magic Item Tinkering", id = IntId.AugmentationSpecializeMagicItemTinkering, repeatable = 1, trainer = "Burrell Sammrun", location = "Cragstone"}, {name = "Specialized Salvaging", id = IntId.AugmentationSpecializeSalvaging, repeatable = 1, trainer = "Robert Crow", location = "Cragstone"}, {name = "25%% More Salvage", id = IntId.AugmentationBonusSalvage, repeatable = 4, trainer = "Kris Cennis", location = "Cragstone"}, {name = "5%% Imbue Chance", id = IntId.AugmentationBonusImbueChance, repeatable = 1, trainer = "Lug", location = "Oolutanga's Refuge"} }, ["Stat Augs"] = { {name = "All Stats", id = IntId.AugmentationInnateFamily, repeatable = 10}, {name = "Strength", id = IntId.AugmentationInnateStrength, repeatable = 10, trainer = "Fiun Luunere", location = "Fiun Outpost"}, {name = "Endurance", id = IntId.AugmentationInnateEndurance, repeatable = 10, trainer = "Fiun Ruun", location = "Fiun Outpost"}, {name = "Coordination", id = IntId.AugmentationInnateCoordination, repeatable = 10, trainer = "Fiun Bayaas", location = "Fiun Outpost"}, {name = "Quickness", id = IntId.AugmentationInnateQuickness, repeatable = 10, trainer = "Fiun Riish", location = "Fiun Outpost"}, {name = "Focus", id = IntId.AugmentationInnateFocus, repeatable = 10, trainer = "Fiun Vasherr", location = "Fiun Outpost"}, {name = "Self", id = IntId.AugmentationInnateSelf, repeatable = 10, trainer = "Fiun Noress", location = "Fiun Outpost"} }, ["Resistance Augs"] = { {name = "All Resistances", id = IntId.AugmentationResistanceFamily, repeatable = 2}, {name = "Blunt", id = IntId.AugmentationResistanceBlunt, repeatable = 2, trainer = "Nawamara Dia", location = "Hebian-To"}, {name = "Pierce", id = IntId.AugmentationResistancePierce, repeatable = 2, trainer = "Kyujo Rujen", location = "Hebian-To"}, {name = "Slashing", id = IntId.AugmentationResistanceSlash, repeatable = 2, trainer = "Ilin Wis", location = "Hebian-To"}, {name = "Fire", id = IntId.AugmentationResistanceFire, repeatable = 2, trainer = "Rikshen Ri", location = "Hebian-To"}, {name = "Frost", id = IntId.AugmentationResistanceFrost, repeatable = 2, trainer = "Lu Bao", location = "Hebian-To"}, {name = "Acid", id = IntId.AugmentationResistanceAcid, repeatable = 2, trainer = "Shujio Milao", location = "Hebian-To"}, {name = "Lightning", id = IntId.AugmentationResistanceLightning, repeatable = 2, trainer = "Enli Yuo", location = "Hebian-To"} } } -- Tree Layout for Luminance Auras local TabLuminanceAuras = { -- 1 = Luminance Aura Name -- 2 = Luminance Aura IntID -- 3 = Luminance Aura Cap -- 4 (Seer Auras Only) = Luminance Aura QuestFlag ["Nalicana Auras"] = { {"+1 Aetheria Proc Rating",IntId.LumAugSurgeChanceRating,5}, {"+1 Damage Reduction Rating",IntId.LumAugDamageReductionRating,5}, {"+1 Crit Reduction Rating",IntId.LumAugCritReductionRating,5}, {"+1 Damage Rating",IntId.LumAugDamageRating,5}, {"+1 Crit Damage Rating",IntId.LumAugCritDamageRating,5}, {"+1 Heal Rating",IntId.LumAugHealingRating,5}, {"+1 Equipment Mana Rating",IntId.LumAugItemManaUsage,5}, {"+1 Mana Stone Rating",IntId.LumAugItemManaGain,5}, {"+1 Crafting Skills",IntId.LumAugSkilledCraft,5}, {"+1 All Skills",IntId.LumAugAllSkills,10}, }, ["Seer Auras"] = { {"(Ka'hiri) +2 Specialized Skills",IntId.LumAugSkilledSpec,5,"LoyalToKahiri"}, {"(Ka'hiri) +1 Damage Rating",IntId.LumAugDamageRating,5,"LoyalToKahiri"}, {"(Shade of Lady Adja) +2 Specialized Skills",IntId.LumAugSkilledSpec,5,"LoyalToShadeOfLadyAdja"}, {"(Shade of Lady Adja) +1 Damage Reduction Rating",IntId.LumAugDamageReductionRating,5,"LoyalToShadeOfLadyAdja"}, {"(Liam of Gelid) +1 Damage Rating",IntId.LumAugDamageRating,5,"LoyalToLiamOfGelid"}, {"(Liam of Gelid) +1 Crit Damage Rating",IntId.LumAugCritDamageRating,5,"LoyalToLiamOfGelid"}, {"(Lord Tyragar) +1 Crit Reduction Rating",IntId.LumAugCritReductionRating,5,"LoyalToLordTyragar"}, {"(Lord Tyragar) +1 Damage Reduction Rating",IntId.LumAugDamageReductionRating,5,"LoyalToLordTyragar"}, } } -- Tree Layout for Recall Spells local TabRecallSpells = { -- 1 = Spell Name -- 2 = Spell ID {"Recall the Sanctuary",2023}, {"Aerlinthe Recall",2041}, {"Mount Lethe Recall",2813}, {"Recall Aphus Lassel",2931}, {"Ulgrim's Recall",2941}, {"Recall to the Singularity Caul",2943}, {"Glenden Wood Recall",3865}, {"Bur Recall",4084}, {"Call of the Mhoire Forge",4128}, {"Paradox-touched Olthoi Infested Area Recall",4198}, {"Colosseum Recall",4213}, {"Return to the Keep",4214}, {"Gear Knight Invasion Area Camp Recall",5330}, {"Lost City of Neftet Recall",5541}, {"Rynthid Recall",6150}, {"Viridian Rise Recall",6321}, {"Viridian Rise Great Tree Recall",6322} } -- Tree Layout for Character Flags local TabCharacterFlags = { -- 1 = Flag Name -- 2 = Quest Flag -- 3 = Quest Info Type ["Additional Skill Credits"] = { {"+1 Skill Lum Aura","lumaugskillquest",QuestInfoType.SolveCount}, {"+1 Skill Aun Ralirea","arantahkill1",QuestInfoType.SolveCount}, {"+1 Skill Chasing Oswald","oswaldmanualcompleted",QuestInfoType.SolveCount}, }, ["Aetheria"] = { {"Blue Aetheria (75)","efulcentermanafieldused",QuestInfoType.StampCheck}, {"Yellow Aetheria (150)","efmlcentermanafieldused",QuestInfoType.StampCheck}, {"Red Aetheria (225)","efllcentermanafieldused",QuestInfoType.StampCheck}, }, ["Augmentation Gems"] = { {"Sir Bellas","augmentationblankgemacquired",QuestInfoType.ReadyCheck}, {"Gladiator Diemos Token","pickedupmarkerboss10x",QuestInfoType.ReadyCheck}, {"100K Luminance Gem","blankaugluminancetimer_0511",QuestInfoType.ReadyCheck}, }, ["Other Flags"] = { {"Candeth Keep Treehouse","strongholdbuildercomplete",QuestInfoType.StampCheck}, {"Bur Flag (Portal)","burflagged(permanent)",QuestInfoType.StampCheck}, {"Singularity Caul","virindiisland",QuestInfoType.StampCheck}, {"Vissidal Island","vissflagcomplete",QuestInfoType.StampCheck}, {"Dark Isle","darkisleflagged",QuestInfoType.StampCheck}, {"Luminance Flag","oracleluminancerewardsaccess_1110",QuestInfoType.StampCheck}, {"Diemos Access","golemstonediemosgiven",QuestInfoType.StampCheck} } } -- Tree Layout for Society Quests local TabSocietyQuests = { -- 1 = Quest Name -- 2 = Quest Start Tag -- 3 = Quest End Tag -- 4 = Quest Type -- Other Fields (Dependent on QuestType) -- QuestType.CollectItem -- 5 = Item To Collect -- 6 = # Items to Collect -- QuestType.QuestTag -- 5 = "Ready For Turn In" Quest Tag -- 6 = "Quest Started" Item -- QuestType.MultiQuestTag -- 5 = Additional Quest Tags To Complete (x/cap) ["Initiate"] = { {"GK: Parts x10","","GearknightPartsCollectionWait_0513",QuestType.CollectItem,"Pile of Gearknight Parts",10}, {"GK: Phalanx Kill x10","GearknightInvasionPhalanxKilltask_0513","GearknightInvasionPhalanxKillWait_0513",QuestType.KillTask}, {"GK: Mana Siphon","","GearknightInvasionHighSiphonWait_1009",QuestType.QuestTag,"GearknightInvasionHighSiphonStart_1009","Unstable Mana Stone"}, {"GY: Skeleton Jaw x8","TaskGrave1JawCollectStarted","TaskGrave1JawCollectWait",QuestType.CollectItem,"Pyre Skeleton Jaw",8}, {"GY: Wight Sorcerer Kill x12","TaskGrave1WightMageKilltask","TaskGrave1WightMageWait",QuestType.KillTask}, {"GY: Shambling Archivist Kill","TaskGrave1BossKillStarted","TaskGrave1BossKillWait",QuestType.KillTask}, {"DI: Vaeshok Kill","TaskDIRuschkBossKillTask","TaskDIRuschkBossKillTaskWait",QuestType.KillTask}, {"DI: Deliver Remoran Fin","","TaskDIDeliveryWait",QuestType.QuestTag,"TaskDIDelivery","Altered Dark Remoran Fin"} }, ["Adept"] = { {"DI: Black Coral x10","TaskDIBlackCoralStarted","TaskDIBlackCoralComplete",QuestType.CollectItem,"Black Coral",10}, {"DI: Crystal of Perception","TaskDIScoutStarted","TaskDIScoutComplete",QuestType.Other}, {"DI: Battle Reports x10","TaskDIReportStarted","TaskDIReportWait",QuestType.CollectItem,"Falatacot Battle Report",10}, {"GY: Supplies to Massilor","","TaskGrave2FedExWait",QuestType.QuestTag,"TaskGrave2FedExDelivered","Supplies for Massilor"}, {"GY: Stone Tracing","TaskGrave2WallCarvingStarted","TaskGrave2WallCarvingWait",QuestType.CollectItem,"Imprinted Archaeologist's Paper",1} }, ["Knight"] = { {"FI: Blessed Moarsman Kill x50","TaskFreebooterMoarsmanKilltask","TaskFreebooterMoarsmanKilltaskWait",QuestType.KillTask}, {"FI: Bandit Mana Boss Kill","TaskFreebooterBanditBossKill","TaskFreebooterBanditBossKillWait",QuestType.KillTask}, {"FI: Glowing Jungle Lily x20","TaskFreebooterJungleLilyStarted","TaskFreebooterJungleLilyComplete",QuestType.CollectItem,"Glowing Jungle Lily",20}, {"FI: Glowing Moar Gland x30","TaskFreebooterMoarGlandStarted","TaskFreebooterMoarGlandComplete",QuestType.CollectItem,"Glowing Moar Gland",30}, {"FI: Killer Phyntos Wasp Kill x50","KillTaskPhyntosKiller1109","KillTaskPhyntosKillerWait1109",QuestType.KillTask}, {"FI: Mana-Infused Jungle Flower x20","TaskFreebooterJungleFlowerStarted","TaskFreebooterJungleFlowerComplete",QuestType.CollectItem,"Mana-Infused Jungle Flower",20}, {"FI: Phyntos Larva Kill x20","KillTaskPhyntosLarvae1109","KillTaskPhyntosLarvaeWait1109",QuestType.KillTask}, {"FI: Phyntos Honey x10","","PhyntosHoneyComplete1109",QuestType.CollectItem,"Phyntos Honey",10}, {"FI: Hive Queen Kill","","KillPhyntosQueenPickup1109",QuestType.CollectItem,"Phyntos Queen's Abdomen",1}, {"FI: Phyntos Hive Splinters x10","","PhyntosHiveComplete1109",QuestType.CollectItem,"Hive Splinter",10} }, ["Lord"] = { {"MC: Artifact Collection","TaskMoarsmenArtifactsStarted","TaskMoarsmenArtifactsWait",QuestType.Other}, {"MC: Coral Tower Destroyer","TaskCoralTowersStarted","TaskCoralTowersWait",QuestType.MultiQuestTag,{"CoralTowerBlackDead","CoralTowerBlueDead","CoralTowerGreenDead","CoralTowerRedDead","CoralTowerWhiteDead"}}, {"MC: High Priest of T'thuun Kill","KillTaskMoarsmanHighPriestStarted","KillTaskMoarsmanHighPriestWait",QuestType.MultiQuestTag,{"HighPriestAcolyteDead","HighPriestFirstDead","HighPriestSecondDead","HighPriestThirdDead"}}, {"MC: Magshuth Moarsman Kill x20","KilltaskMagshuthMoarsman","KilltaskMagshuthMoarsmanWait",QuestType.KillTask}, {"MC: Shoguth Moarsman Kill x40","KilltaskShoguthMoarsman","KilltaskShoguthMoarsmanWait",QuestType.KillTask}, {"MC: Moguth Moarsman Kill x60","KilltaskMoguthMoarsman","KilltaskMoguthMoarsmanWait",QuestType.KillTask}, {"MC: Moarsman Spawning Pools","TaskSpawnPoolsStarted","TaskSpawnPoolsWait",QuestType.MultiQuestTag,{"BroodMotherZeroDead","BroodMotherOneDead","BroodMotherTwoDead","BroodMotherThreeDead"}}, {"MC: Palm Fort Defended","","PalmFortDefended1209",QuestType.Other}, {"MC: Supply Saboteur","","SuppliesTurnedIn1209",QuestType.Other} } } -- Tree Layout for Facility Hub Quests local TabFacilityHubQuests = { -- 1 = Fac Hub Quest Name -- 2 = Completion Quest Tag -- 3 = Starting Quest Tag (if different than normal syntax) ["Level 10"] = { {"Glenden Wood","fachubglendenwood"}, {"Folthid Estate","fachubfolthid"}, {"Mosswart Camp","fachubmosswartcamp"} }, ["Level 15"] = { {"Green Mire Grave","fachubgreenmiregrave"}, {"Colier","fachubcolier"}, {"Halls of Helm","fachubhallsofhelm"} }, ["Level 20"] = { {"Dangerous Cave","fachubdangerouscatacombs"}, {"Trothyr's Rest","fachubtrothyrsrest"}, {"Hunter's Leap","fachubhuntersleap"} }, ["Level 25"] = { {"Fledgemaster's Camp","fachubfledgemasterscamp"}, {"Eastham Portals","fachubeastham","fachubeasthamportals_flag"}, {"Catacombs of the Forgotten","fachubcatacombs"} }, ["Level 30"] = { {"Mountain Sewer","fachubmountainsewer"}, {"Mite Maze","fachubmitemaze"}, {"Haunted Mansion","fachubhauntedmansion"} }, ["Level 35"] = { {"Suntik","fachubsuntik"}, {"Banderling Camp","fachubbanderlingcamp"}, {"Skeleton Fort","fachubskeletonfort"} }, ["Level 40"] = { {"Bellig Tower","fachubbellig"}, {"Castle of Baron Nuvillus","fachubcastle"}, {"Dryreach","fachubdryreach"} }, ["Level 45"] = { {"Blackmire","fachubblackmire"} } } -- Tree Layout for Cantrip Tracker local TabCantrips = { ["Specialized Skills"] = {}, ["Trained Skills"] = {}, ["Attributes"] = { ["Strength"] = { value = "N/A", color = Colors.White, spellIcon = SpellId.StrengthSelf8, iconBackground = 0x060013F9}, ["Endurance"] = { value = "N/A", color = Colors.White, spellIcon = SpellId.EnduranceSelf8, iconBackground = 0x060013F9}, ["Coordination"] = { value = "N/A", color = Colors.White, spellIcon = SpellId.CoordinationSelf8, iconBackground = 0x060013F9}, ["Quickness"] = { value = "N/A", color = Colors.White, spellIcon = SpellId.QuicknessSelf8, iconBackground = 0x060013F9}, ["Focus"] = { value = "N/A", color = Colors.White, spellIcon = SpellId.FocusSelf8, iconBackground = 0x060013F9}, ["Willpower"] = { value = "N/A", color = Colors.White, spellIcon = SpellId.WillpowerSelf8, iconBackground = 0x060013F9} }, ["Protection Auras"] = { ["Armor"] = { value = "N/A", color = Colors.DarkGray, spellIcon = SpellId.ArmorSelf8}, -- Light Gray ["Bludgeoning Ward"] = { value = "N/A", color = Colors.LightGray, spellIcon = SpellId.BludgeonProtectionSelf8}, -- Soft Gray ["Piercing Ward"] = { value = "N/A", color = Colors.SoftYellow, spellIcon = SpellId.PiercingProtectionSelf8}, -- Pastel Yellow ["Slashing Ward"] = { value = "N/A", color = Colors.Orange, spellIcon = SpellId.BladeProtectionSelf8}, -- Pastel Orange ["Flame Ward"] = { value = "N/A", color = Colors.SoftRed, spellIcon = SpellId.FireProtectionSelf8}, -- Soft Red ["Frost Ward"] = { value = "N/A", color = Colors.SoftBlue, spellIcon = SpellId.ColdProtectionSelf8}, -- Pastel Blue ["Acid Ward"] = { value = "N/A", color = Colors.SofterGreen, spellIcon = SpellId.AcidProtectionSelf8}, -- Soft Green ["Storm Ward"] = { value = "N/A", color = Colors.SoftPurple, spellIcon = SpellId.LightningProtectionSelf8} -- Pastel Purple } } -- Tree Layout for Weapons Tab local TabWeapons = { ["Creature Slayer"] = { ["Tumerok"] = {IntId.SlayerCreatureType, CreatureType.Tumerok, true, {}}, ["Olthoi"] = {IntId.SlayerCreatureType, CreatureType.Olthoi, true, {}}, ["Ghost"] = {IntId.SlayerCreatureType, CreatureType.Ghost, true, {}}, ["Human"] = {IntId.SlayerCreatureType, CreatureType.Human, true, {}}, ["Elemental"] = {IntId.SlayerCreatureType, CreatureType.Elemental, false, {}}, ["FireElemental"] = {IntId.SlayerCreatureType, CreatureType.FireElemental, false, {}}, ["FrostElemental"] = {IntId.SlayerCreatureType, CreatureType.FrostElemental, false, {}}, ["AcidElemental"] = {IntId.SlayerCreatureType, CreatureType.AcidElemental, false, {}}, ["LightningElemental"] = {IntId.SlayerCreatureType, CreatureType.LightningElemental, false, {}}, ["Shadow"] = {IntId.SlayerCreatureType, CreatureType.Shadow, true, {}}, ["Virindi"] = {IntId.SlayerCreatureType, CreatureType.Virindi, true, {}}, ["Anekshay"] = {IntId.SlayerCreatureType, CreatureType.Anekshay, true, {}}, ["Burun"] = {IntId.SlayerCreatureType, CreatureType.Burun, false, {}}, ["Mukkir"] = {IntId.SlayerCreatureType, CreatureType.Mukkir, true, {}}, ["Skeleton"] = {IntId.SlayerCreatureType, CreatureType.Skeleton, true, {}}, ["Undead"] = {IntId.SlayerCreatureType, CreatureType.Undead, true, {}}, }, ["Rending / Resistance Cleaving"] = { ["Critical Strike"] = {IntId.ImbuedEffect, 1, true,{}}, ["Crippling Blow"] = {IntId.ImbuedEffect, 2, true,{}}, ["Armor Rending"] = {IntId.ImbuedEffect, 4, true,{},{CharacterType.WarMage,CharacterType.VoidMage}}, ["Slash Rending"] = {IntId.ImbuedEffect, 8, true,{},{CharacterType.VoidMage}}, ["Pierce Rending"] = {IntId.ImbuedEffect, 16, true,{},{CharacterType.VoidMage}}, ["Bludgeon Rending"] = {IntId.ImbuedEffect, 32, true,{},{CharacterType.VoidMage}}, ["Cold Rending"] = {IntId.ImbuedEffect, 128, true,{},{CharacterType.VoidMage}}, ["Fire Rending"] = {IntId.ImbuedEffect, 512, true,{},{CharacterType.VoidMage}}, ["Acid Rending"] = {IntId.ImbuedEffect, 64, true,{},{CharacterType.VoidMage}}, ["Electric Rending"] = {IntId.ImbuedEffect, 256, true,{},{CharacterType.VoidMage}}, ["Resistance Cleaving: Slash "] = {IntId.ResistanceModifierType, 1, false,{},{CharacterType.VoidMage}}, ["Resistance Cleaving: Pierce"] = {IntId.ResistanceModifierType, 2, false,{},{CharacterType.VoidMage}}, ["Resistance Cleaving: Bludgeon"] = {IntId.ResistanceModifierType, 4, false,{},{CharacterType.VoidMage}}, ["Resistance Cleaving: Cold"] = {IntId.ResistanceModifierType, 8, false,{},{CharacterType.VoidMage}}, ["Resistance Cleaving: Fire"] = {IntId.ResistanceModifierType, 16, false,{},{CharacterType.VoidMage}}, ["Resistance Cleaving: Acid"] = {IntId.ResistanceModifierType, 32, false,{},{CharacterType.VoidMage}}, ["Resistance Cleaving: Electric"] = {IntId.ResistanceModifierType, 64, false,{},{CharacterType.VoidMage}} } } -- Returns the Type of Character of the Player local function GetCharacterType() --- @type Character local char = game.Character if char == nil then return CharacterType.Unknown end local weenie = char.Weenie if weenie == nil then return CharacterType.Unknown end if weenie.Skills[SkillId.VoidMagic].Training == SkillTrainingType.Specialized then return CharacterType.VoidMage end if weenie.Skills[SkillId.WarMagic].Training == SkillTrainingType.Specialized then return CharacterType.WarMage end if weenie.Skills[SkillId.WarMagic].Training == SkillTrainingType.Trained then return CharacterType.WarMage end if weenie.Skills[SkillId.MissleWeapons].Training == SkillTrainingType.Specialized then return CharacterType.Archer end if weenie.Skills[SkillId.HeavyWeapons].Training == SkillTrainingType.Specialized or weenie.Skills[SkillId.LightWeapons].Training == SkillTrainingType.Specialized or weenie.Skills[SkillId.FinesseWeapons].Training == SkillTrainingType.Specialized or weenie.Skills[SkillId.TwoHandedCombat].Training == SkillTrainingType.Specialized then return CharacterType.Melee end return CharacterType.Unknown end -- Texture Caching local function GetOrCreateTexture(iconID) if iconID == nil then iconID = 0x06005CE6 end local preloadedTexture = textures[iconID] if not preloadedTexture then local texture = ubviews.Huds.GetIconTexture(iconID) if texture then textures[iconID] = texture return texture end else return preloadedTexture end end -- Refresh and Populate Cantrips local function RefreshCantrips() characterTypeSelf = GetCharacterType() for id, sk in pairs(game.Character.Weenie.Skills) do local skillName = MapSkillCantripReplacements[id] if skillName == nil then skillName = tostring(id) end if sk.Training == SkillTrainingType.Specialized then TabCantrips["Specialized Skills"][skillName] = {value = "N/A", color = Colors.White, icon = sk.Dat.IconId} elseif sk.Training == SkillTrainingType.Trained then TabCantrips["Trained Skills"][skillName] = {value = "N/A", color = Colors.White, icon = sk.Dat.IconId} end end for ward, _ in pairs(TabCantrips["Protection Auras"]) do TabCantrips["Protection Auras"][ward].value = "N/A" end for attr, _ in pairs(TabCantrips["Attributes"]) do TabCantrips["Attributes"][attr].value = "N/A" end for _, e in ipairs(game.Character.ActiveEnchantments()) do --- @type Enchantment local ench = e --- @type Spell local spell = game.Character.SpellBook.Get(ench.SpellId) if spell then for type, _ in pairs(MapCantripColors) do for ward, _ in pairs(TabCantrips["Protection Auras"]) do local matchstring = type .. " " .. ward if spell.Name == matchstring then TabCantrips["Protection Auras"][ward].value = type end end for skill, _ in pairs(TabCantrips["Specialized Skills"]) do local matchstring = type .. skill if string.find(spell.Name:gsub("%s+",""),matchstring) then TabCantrips["Specialized Skills"][skill].value = type end end for skill, _ in pairs(TabCantrips["Trained Skills"]) do local matchstring = type .. skill if string.find(spell.Name:gsub("%s+",""),matchstring) then TabCantrips["Trained Skills"][skill].value = type end end for attribute, _ in pairs(TabCantrips["Attributes"]) do local matchstring = type .. attribute if string.find(spell.Name:gsub("%s+",""),matchstring) then TabCantrips["Attributes"][attribute].value = type end end end end end end -- Function Which Takes a WorldObject and Populates Weapons If It's a Tracked Weapon ---@param wobject WorldObject local function CategorizeWeapon(wobject) for _, types in pairs(TabWeapons) do for _, values in pairs(types) do local weaponIntIDCheck = values[1] local weaponIntIDExpectedResult = values[2] if weaponIntIDCheck == IntId.CreatureType then weaponIntIDExpectedResult = MapCreatureType[weaponIntIDExpectedResult] end local weaponIntIDResult = wobject.IntValues[weaponIntIDCheck] if weaponIntIDResult == weaponIntIDExpectedResult then table.insert(values[4],wobject.Id) end end end end -- Takes an Inventory and Categorizes Weapons From It, Calling Appraisals if Needed local function RefreshWeaponsFromInventory(inventory) for _, v in ipairs(inventory) do if v.ObjectClass == ObjectClass.MeleeWeapon or v.ObjectClass == ObjectClass.MissileWeapon or v.ObjectClass == ObjectClass.WandStaffOrb then if v.HasAppraisalData then CategorizeWeapon(v) else v.Appraise(nil,function (res) CategorizeWeapon(game.World.Get(res.ObjectId)) end) end end end end -- Refresh and Populate Weapons Using Above Function local function RefreshWeapons() characterTypeSelf = GetCharacterType() for _, types in pairs(TabWeapons) do for _, values in pairs(types) do -- Reset Table That Holds Player Weapons values[4] = {} end end RefreshWeaponsFromInventory(game.Character.Equipment) RefreshWeaponsFromInventory(game.Character.Inventory) end -- Update Cached Data local function UpdateCachedData() CachedData.LuminanceFlagged = Quests:HasQuestFlag("oracleluminancerewardsaccess_1110") CachedData.FactionBits = game.Character.Weenie.IntValues[IntId.Faction1Bits] CachedData.SkillTrainingMagicItemTinkering = game.Character.Weenie.Skills[SkillId.MagicItemTinkering].Training CachedData.SkillTrainingItemTinkering = game.Character.Weenie.Skills[SkillId.ItemTinkering].Training CachedData.SkillTrainingWeaponTinkering = game.Character.Weenie.Skills[SkillId.WeaponTinkering].Training CachedData.SkillTrainingArmorTinkering = game.Character.Weenie.Skills[SkillId.ArmorTinkering].Training CachedData.InventoryCountAsheronsBenediction = game.Character.GetInventoryCount("Asheron's Lesser Benediction") CachedData.AugInnateFamily = game.Character.Weenie.Value(IntId.AugmentationInnateFamily) CachedData.AugResistanceFamily = game.Character.Weenie.Value(IntId.AugmentationResistanceFamily) CachedData.LastUpdatedTime = os.clock() end print("[LUA]: Loading FlagTracker v"..version) local hud = ubviews.Huds.CreateHud("FlagTracker v"..version,0x06005A8A) hud.ShowInBar = true hud.WindowSettings = im.ImGuiWindowFlags.AlwaysAutoResize hud.OnRender.Add(function() local char = game.Character.Weenie if char == nil then return end if os.clock() - CachedData.LastUpdatedTime >= 3 then UpdateCachedData() end if imgui.BeginTabBar("Flag Tracker Bar") then -- Augmentations Tab if imgui.BeginTabItem("Augs") then for category, augList in pairs(TabAugmentations) do imgui.Separator() imgui.SetNextItemOpen(TreeOpenStates[category] == nil or TreeOpenStates[category]) TreeOpenStates[category] = imgui.TreeNode(category) if TreeOpenStates[category] then -- Create a new table for this category local numColumns = 2 if imgui.BeginTable("Augmentations_" .. category, numColumns * 2) then imgui.TableSetupColumn("Aug 1", im.ImGuiTableColumnFlags.WidthStretch, 200) imgui.TableSetupColumn("Aug 1 Points", im.ImGuiTableColumnFlags.WidthStretch, 35) imgui.TableSetupColumn("Aug 2", im.ImGuiTableColumnFlags.WidthStretch, 200) imgui.TableSetupColumn("Aug 2 Points", im.ImGuiTableColumnFlags.WidthStretch, 35) local currentColumnIndex = 0 for _, augInfo in ipairs(augList) do local prefix = augInfo.name local augID = augInfo.id local cap = augInfo.repeatable local npc = augInfo.trainer local town = augInfo.location local value = 0 if augID == nil then value = CachedData.InventoryCountAsheronsBenediction else value = char.Value(augID) end local skip = (category == "Stat Augs" and CachedData.AugInnateFamily == 10 and value == 0) or (category == "Resistance Augs" and CachedData.AugResistanceFamily == 2 and value == 0) or (augID == IntId.AugmentationSpecializeMagicItemTinkering and CachedData.SkillTrainingMagicItemTinkering == SkillTrainingType.Untrained) or (augID == IntId.AugmentationSpecializeWeaponTinkering and CachedData.SkillTrainingWeaponTinkering == SkillTrainingType.Untrained) or (augID == IntId.AugmentationSpecializeArmorTinkering and CachedData.SkillTrainingArmorTinkering == SkillTrainingType.Untrained) or (augID == IntId.AugmentationSpecializeItemTinkering and CachedData.SkillTrainingItemTinkering == SkillTrainingType.Untrained) if not skip then local color = Colors.Yellow if value >= cap then color = Colors.Green elseif value == 0 then color = Colors.Red end if currentColumnIndex == 0 then imgui.TableNextRow() end imgui.TableSetColumnIndex(currentColumnIndex) imgui.TextColored(color, prefix) if imgui.IsItemHovered() and npc and town then imgui.SetTooltip(string.format("NPC: %s\nTown: %s", npc, town)) end if imgui.IsItemClicked() and npc then local npcObject = game.World.GetNearest(npc, DistanceType.T3D) if npcObject then game.Actions.ObjectSelect(npcObject.Id) end end currentColumnIndex = (currentColumnIndex + 1) % (numColumns * 2) imgui.TableSetColumnIndex(currentColumnIndex) imgui.TextColored(color, value .. "/" .. cap) currentColumnIndex = (currentColumnIndex + 1) % (numColumns * 2) end end imgui.EndTable() end imgui.TreePop() end end imgui.EndTabItem() end -- Luminance Auras Tab if CachedData.LuminanceFlagged and imgui.BeginTabItem("Lum") then for category, auraList in pairs(TabLuminanceAuras) do imgui.SeparatorText(category) if imgui.BeginTable("Luminance Auras_"..category, 2) then imgui.TableSetupColumn("Lum Aura",im.ImGuiTableColumnFlags.WidthStretch,200) imgui.TableSetupColumn("Lum Aura Points",im.ImGuiTableColumnFlags.WidthStretch,35) imgui.TableNextRow() imgui.TableSetColumnIndex(0) local seerAuraCount = 0 for _, auraInfo in ipairs(auraList) do local value = char.Value(auraInfo[2]) or 0 local prefix = auraInfo[1] local cap = auraInfo[3] local color = Colors.Yellow local skip = false if value >= cap and category == "Nalicana Auras" then value = cap elseif category == "Seer Auras" and auraInfo[2] ~= IntId.LumAugSkilledSpec then value = math.max(0,value-5) end if category == "Seer Auras" then local flag = string.lower(auraInfo[4]) skip = not Quests:HasQuestFlag(flag) end if not skip then seerAuraCount = seerAuraCount + 1 if value >= cap then color = Colors.Green elseif value == 0 then color = Colors.Red end imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.TextColored(color, prefix) imgui.TableSetColumnIndex(1) imgui.TextColored(color, value .. "/" .. cap) end end if seerAuraCount == 0 then imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.TextColored(Colors.Red, "No Seer Auras") end imgui.EndTable() end end imgui.EndTabItem() end -- Recall Spells Tab if imgui.BeginTabItem("Recalls") then if imgui.BeginTable("Recall Spells",2) then imgui.TableSetupColumn("Recall Spell",im.ImGuiTableColumnFlags.WidthStretch,128) imgui.TableSetupColumn("Status",im.ImGuiTableColumnFlags.WidthStretch,32) imgui.TableHeadersRow() for _,recallInfo in ipairs(TabRecallSpells) do local spellName = recallInfo[1] local spellID = recallInfo[2] local spellKnown = game.Character.SpellBook.IsKnown(spellID) local color = Colors.Red local status = "Unknown" if spellKnown then color = Colors.Green status = "Known" end imgui.TableNextRow() imgui.TableNextColumn() imgui.Image(GetOrCreateTexture(game.Character.SpellBook.Get(spellID).Icon).TexturePtr,iconVectorSize) imgui.SameLine() imgui.TextColored(color,spellName) imgui.TableNextColumn() imgui.TextColored(color,status) end imgui.EndTable() end imgui.EndTabItem() end -- Society Tab if CachedData.FactionBits ~= nil and CachedData.FactionBits ~= 0 and imgui.BeginTabItem("Society") then if imgui.Button("Refresh Quests") then Quests:Refresh() end local factionbits = CachedData.FactionBits local factionscore = 0 local nextfactionrankscore = 0 local society = "" local societyrank = "" local maxribbonsperday = 0 -- Determine Which Society if factionbits == 1 then society = "Celestial Hand" factionscore = char.IntValues[IntId.SocietyRankCelhan] elseif factionbits == 2 then society = "Edlrytch Web" factionscore = char.IntValues[IntId.SocietyRankEldweb] elseif factionbits == 4 then society = "Radiant Blood" factionscore = char.IntValues[IntId.SocietyRankRadblo] end -- Determine Society Rank for isocietyrank, thresholds in pairs(MapSocietyRibbons) do local lowerT = thresholds.min local upperT = thresholds.max if factionscore >= lowerT and factionscore <= upperT then societyrank = isocietyrank nextfactionrankscore = upperT maxribbonsperday = thresholds.perday end end imgui.SeparatorText(society.." - "..societyrank) if imgui.BeginTable("SocietyInfo",2) then imgui.TableSetupColumn("Label",im.ImGuiTableColumnFlags.WidthStretch,90) imgui.TableSetupColumn("Value",im.ImGuiTableColumnFlags.WidthStretch,32) imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.Text("Ribbons for Next Rank") imgui.TableSetColumnIndex(1) local stringFactionScore if nextfactionrankscore == 9999 then stringFactionScore = "Max" else stringFactionScore = tostring(factionscore).."/"..tostring(nextfactionrankscore) end imgui.TextColored(Colors.Green,stringFactionScore) ---@type Quest local quest = Quests.Dictionary["societyribbonsperdaycounter"] if quest then imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.Text("Ribbons per Day (Counter)") imgui.TableSetColumnIndex(1) imgui.TextColored(Colors.Green,tostring(quest.solves).."/"..tostring(maxribbonsperday)) end ---@type Quest local quest = Quests.Dictionary["societyribbonsperdaytimer"] if quest then imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.Text("Ribbons per Day (Timer)") imgui.TableSetColumnIndex(1) local questColor = Colors.Red local questStatus = Quests:GetTimeUntilExpire(quest) if questStatus == "Ready" then questColor = Colors.Green end imgui.TextColored(questColor,questStatus) end ---@type Quest local quest = Quests.Dictionary["societyarmorwritwait"] if quest then imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.Text("Society Armor Writ") imgui.TableSetColumnIndex(1) local questColor = Colors.Red local questStatus = Quests:GetTimeUntilExpire(quest) if questStatus == "Ready" then questColor = Colors.Green end imgui.TextColored(questColor,questStatus) end ---@type Quest local quest = Quests.Dictionary["societymasterstipendcollectiontimer"] if quest then imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.Text("Society Master Stipend") imgui.TableSetColumnIndex(1) local questColor = Colors.Red local questStatus = Quests:GetTimeUntilExpire(quest) if questStatus == "Ready" then questColor = Colors.Green end imgui.TextColored(questColor,questStatus) end imgui.EndTable() end for isocietyrank, questList in pairs(TabSocietyQuests) do local thresholds = MapSocietyRibbons[isocietyrank] local lowerT = thresholds.min if factionscore >= lowerT then imgui.Separator() if imgui.TreeNode(isocietyrank.." Quests") then if imgui.BeginTable("SocietyInfo",2) then imgui.TableSetupColumn("Quest1",im.ImGuiTableColumnFlags.WidthStretch,90) imgui.TableSetupColumn("Status1",im.ImGuiTableColumnFlags.WidthStretch,32) for socquest in questList do local socquestName = socquest[1] local socquestStart = string.lower(socquest[2]) local socquestEnd = string.lower(socquest[3]) local questType = socquest[4] local questColor = Colors.Yellow local questString = "Ready" imgui.TableNextRow() ---@type Quest local questStart = Quests.Dictionary[socquestStart] ---@type Quest local questEnd = Quests.Dictionary[socquestEnd] if questType == QuestType.QuestTag and Quests:IsQuestAvailable(socquestEnd) then local tag = string.lower(socquest[5]) ---@type Quest local completeQuest = Quests.Dictionary[tag] if completeQuest then questColor = Colors.Green questString = "Complete" else local startItem = socquest[6] if game.Character.GetInventoryCount(startItem) > 0 then questString = "Started" end end elseif questType == QuestType.MultiQuestTag and Quests:IsQuestAvailable(socquestEnd) and Quests:HasQuestFlag(socquestStart) then local tags = socquest[5] local completeCount = 0 for _, tag in pairs(tags) do if Quests:HasQuestFlag(string.lower(tag)) then completeCount = completeCount + 1 end end if completeCount >= #tags then questColor = Colors.Green questString = "Complete ("..completeCount.."/"..#tags..")" else questString = "Started ("..completeCount.."/"..#tags..")" end elseif questType == QuestType.CollectItem and Quests:IsQuestAvailable(socquestEnd) then local questItem = socquest[5] local questItemCount = socquest[6] local collectedCount = game.Character.GetInventoryCount(questItem) questString = "Started ("..collectedCount..")" if collectedCount >= questItemCount then questColor = Colors.Green questString = "Complete ("..collectedCount..")" end elseif questStart then if questType == QuestType.KillTask then questString = "Started ("..questStart.solves..")" if questStart.solves == questStart.maxsolves then questColor = Colors.Green questString = "Complete ("..questStart.solves..")" end elseif questType == QuestType.Other then questString = "Started" elseif questType == QuestType.CollectItem then local questItem = socquest[5] local questItemCount = socquest[6] local collectedCount = game.Character.GetInventoryCount(questItem) questString = "Started ("..collectedCount..")" if collectedCount >= questItemCount then questColor = Colors.Green questString = "Complete ("..collectedCount..")" end end elseif questEnd then questString = Quests:GetTimeUntilExpire(questEnd) if questString == "Ready" then questColor = Colors.Yellow else questColor = Colors.Red end end imgui.TableSetColumnIndex(0) imgui.TextColored(questColor,socquestName) imgui.TableSetColumnIndex(1) imgui.TextColored(questColor,questString) end imgui.EndTable() end imgui.TreePop() end end end imgui.EndTabItem() end -- Fachub Tab if Settings.showFacHub and imgui.BeginTabItem("FacHub") then if imgui.Button("Refresh Quests") then Quests:Refresh() end imgui.TextDisabled("[F] = Flagged / [X] = Completed / [U] = Unknown") for minLevel, fhquests in pairs(TabFacilityHubQuests) do --imgui.SeparatorText(minLevel.." Quests") imgui.Separator() if imgui.TreeNode(minLevel.." Quests") then local columnIndex = 0 if imgui.BeginTable(minLevel.." Quests",6) then imgui.TableSetupColumn(minLevel.." Quest1",im.ImGuiTableColumnFlags.WidthStretch) imgui.TableSetupColumn(minLevel.." Quest2",im.ImGuiTableColumnFlags.WidthStretch) imgui.TableSetupColumn(minLevel.." Quest3",im.ImGuiTableColumnFlags.WidthStretch) for _, fhquest in pairs(fhquests) do local fhquestName = fhquest[1] local fhquestCompleted = fhquest[2] local fhquestStarted = fhquest[3] if not fhquestStarted then fhquestStarted = fhquestCompleted.."portal_flag" end if columnIndex == 0 then imgui.TableNextRow() end local stringFHCompleted local colorQuest if Quests:HasQuestFlag(fhquestCompleted) then stringFHCompleted = "X" colorQuest = Colors.Green elseif Quests:HasQuestFlag(fhquestStarted) then stringFHCompleted = "F" colorQuest = Colors.Yellow else stringFHCompleted = "U" colorQuest = Colors.Red end imgui.TableSetColumnIndex(columnIndex) imgui.TextColored(colorQuest,"["..stringFHCompleted.."] "..fhquestName) columnIndex = columnIndex + 1 if columnIndex >= 3 then columnIndex = 0 end end imgui.EndTable() end imgui.TreePop() end end imgui.EndTabItem() end -- Character Flags Tab if imgui.BeginTabItem("Flags") then if imgui.Button("Refresh Quests") then Quests:Refresh() end for category, flagInfo in pairs(TabCharacterFlags) do imgui.Separator() imgui.SetNextItemOpen(TreeOpenStates[category] == nil or TreeOpenStates[category]) TreeOpenStates[category] = imgui.TreeNode(category) if TreeOpenStates[category] then if imgui.BeginTable("Character Flags_"..category, 2) then imgui.TableSetupColumn("Flag 1",im.ImGuiTableColumnFlags.WidthStretch,128) imgui.TableSetupColumn("Flag 1 Points",im.ImGuiTableColumnFlags.WidthStretch,64) for _, flag in ipairs(flagInfo) do local prefix = flag[1] local queststamp = flag[2] local questinfotype = flag[3] ---@type Quest local quest = Quests.Dictionary[queststamp] local color = Colors.Red local completionString = "Unknown" if questinfotype == QuestInfoType.SolveCount then if quest ~= nil then if quest.solves >= quest.maxsolves then color = Colors.Green elseif quest.solves == 0 then color = Colors.Red end completionString = tostring(quest.solves) .. "/" .. tostring(quest.maxsolves) else color = Colors.Red completionString = "None" end elseif questinfotype == QuestInfoType.StampCheck then if Quests:HasQuestFlag(queststamp) then color = Colors.Green completionString = "Yes" else color = Colors.Red completionString = "No" end elseif questinfotype == QuestInfoType.ReadyCheck then if Quests:IsQuestAvailable(queststamp) then color = Colors.Yellow completionString = "Ready" else completionString = Quests:GetTimeUntilExpire(quest) end end imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.TextColored(color, prefix) imgui.TableSetColumnIndex(1) imgui.TextColored(color, completionString) end imgui.EndTable() end imgui.TreePop() end end imgui.EndTabItem() end -- Cantrips Tab if imgui.BeginTabItem("Cantrips") then if imgui.Button("Refresh") then RefreshCantrips() end for cantripgroup, cantrips in pairs(TabCantrips) do imgui.Separator() imgui.SetNextItemOpen(TreeOpenStates[cantripgroup] == nil or TreeOpenStates[cantripgroup]) TreeOpenStates[cantripgroup] = imgui.TreeNode(cantripgroup) if TreeOpenStates[cantripgroup] then if imgui.BeginTable(cantripgroup,2) then imgui.TableSetupColumn(cantripgroup,im.ImGuiTableColumnFlags.WidthStretch,64) imgui.TableSetupColumn("Status",im.ImGuiTableColumnFlags.WidthStretch,32) for effect, info in pairs(cantrips) do if not (info.value == "N/A" and Settings.hideMissingCantrips) then local iconID = info.icon local iconBackgroundID = info.iconBackground local spellIcon = info.spellIcon imgui.TableNextRow() imgui.TableSetColumnIndex(0) if iconBackgroundID then --- @type ManagedTexture local icon = GetOrCreateTexture(iconBackgroundID) if icon then local pos = imgui.GetCursorScreenPos() imgui.Image(icon.TexturePtr,iconVectorSize) imgui.SetCursorScreenPos(pos) end end if iconID then --- @type ManagedTexture local icon = GetOrCreateTexture(iconID) if icon then imgui.Image(icon.TexturePtr,iconVectorSize) end imgui.SameLine() end if spellIcon then local spell = game.Character.SpellBook.Get(spellIcon.ToNumber()) if spell then --- @type ManagedTexture local icon = GetOrCreateTexture(spell.Icon) if icon then imgui.Image(icon.TexturePtr,iconVectorSize) end imgui.SameLine() end end imgui.TextColored(info.color, effect) imgui.TableSetColumnIndex(1) imgui.TextColored(MapCantripColors[info.value], info.value) end end imgui.EndTable() end imgui.TreePop() end end imgui.EndTabItem() end -- Weapons Tab if imgui.BeginTabItem("Weapons") then if imgui.Button("Refresh") then RefreshWeapons() end -- TODO: Merge Slayers / Resistance Cleaving -- TODO: Color Weapons Based On Damage Type for cat, types in pairs(TabWeapons) do imgui.Separator() imgui.SetNextItemOpen(TreeOpenStates[cat] == nil or TreeOpenStates[cat]) TreeOpenStates[cat] = imgui.TreeNode(cat) if TreeOpenStates[cat] then if imgui.BeginTable(cat,2) then imgui.TableSetupColumn(cat,im.ImGuiTableColumnFlags.WidthStretch,16) imgui.TableSetupColumn("Weapon Name",im.ImGuiTableColumnFlags.WidthStretch,32) -- TODO: Do We Need Separate Tracking For Slayers Which Are Non-Essential (Rares/Etc?) for type, values in pairs(types) do local essential = values[3] local myWeapons = values[4] local skipCharacterTypes = values[5] local skip = ((cat == "Rending / Resistance Cleaving") and (not essential) and Settings.hideResistanceCleavingWeapons) or ((cat == "Creature Slayer") and (not essential) and Settings.hideNonEssentialCreatureSlayers) if skipCharacterTypes then for _, ctype in ipairs(skipCharacterTypes) do if characterTypeSelf == ctype then skip = true end end end if not skip then if #myWeapons > 0 then for _, weaponID in ipairs(myWeapons) do --- @type WorldObject local weapon = game.World.Get(weaponID) if weapon then imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.TextColored(Colors.Green,type) imgui.TableSetColumnIndex(1) local pos = imgui.GetCursorScreenPos() local icon = GetOrCreateTexture(weapon.DataValues[DataId.Icon]) local iconUnderlayID = weapon.DataValues[DataId.IconUnderlay] if not iconUnderlayID then iconUnderlayID = 0x060011CB end local iconUnderlayTexture = GetOrCreateTexture(iconUnderlayID) local iconOverlay = GetOrCreateTexture(weapon.DataValues[DataId.IconOverlay]) imgui.Image(iconUnderlayTexture.TexturePtr,iconVectorSize) imgui.SetCursorScreenPos(pos) imgui.Image(icon.TexturePtr,iconVectorSize) imgui.SetCursorScreenPos(pos) imgui.Image(iconOverlay.TexturePtr,iconVectorSize) if imgui.IsItemClicked() then game.Actions.ObjectSelect(weapon.Id) end imgui.SameLine() imgui.TextColored(Colors.Green,weapon.Name) if imgui.IsItemClicked() then game.Actions.ObjectSelect(weapon.Id) end end end elseif not Settings.hideUnacquiredWeapons then imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.TextColored(Colors.White,type) imgui.TableSetColumnIndex(1) imgui.TextColored(Colors.LightGray,"No Weapon Found") end end end imgui.EndTable() end imgui.TreePop() end end imgui.EndTabItem() end -- General Quests Tab if Settings.showQuests and imgui.BeginTabItem("Quests") then if imgui.Button("Refresh Quests") then Quests:Refresh() end -- Quests Table if imgui.BeginTable("Quests", 6, im.ImGuiTableFlags.ScrollY + im.ImGuiTableFlags.Sortable) then imgui.TableSetupColumn("Quest", im.ImGuiTableColumnFlags.WidthFixed, 256) imgui.TableSetupColumn("Solves", im.ImGuiTableColumnFlags.WidthFixed, 64) imgui.TableSetupColumn("Completed", im.ImGuiTableColumnFlags.WidthFixed, 128) imgui.TableSetupColumn("Max", im.ImGuiTableColumnFlags.WidthFixed, 64) imgui.TableSetupColumn("Delta", im.ImGuiTableColumnFlags.WidthFixed, 64) imgui.TableSetupColumn("Expire", im.ImGuiTableColumnFlags.WidthFixed, 128) imgui.TableSetupScrollFreeze(0, 1) imgui.TableHeadersRow() -- Handle sorting local sort_specs = imgui.TableGetSortSpecs() if sort_specs and sort_specs.SpecsDirty then table.sort(Quests.List,function(a,b) local sortcol = sort_specs.Specs.ColumnIndex + 1 local sortasc = sort_specs.Specs.SortDirection == im.ImGuiSortDirection.Ascending if a and b then local valA = Quests:GetFieldByID(a,sortcol) local valB = Quests:GetFieldByID(b,sortcol) if valA and valB then if tonumber(valA) and tonumber(valB) then ---@diagnostic disable-next-line valA = tonumber(valA) ---@diagnostic disable-next-line valB = tonumber(valB) end if sortasc then return valA < valB else return valB < valA end end return true end return true end) sort_specs.SpecsDirty = false -- Mark as sorted end -- Populate table for _, quest in ipairs(Quests.List) do local color = Colors.Red if Quests:IsQuestMaxSolved(quest.id) then color = Colors.Yellow elseif Quests:IsQuestAvailable(quest.id) then color = Colors.Green end imgui.TableNextRow() imgui.TableSetColumnIndex(0) imgui.TextColored(color, quest.id) -- Quest Name if imgui.IsItemHovered() and Quests.Description then imgui.SetTooltip(Quests.Description) end imgui.TableSetColumnIndex(1) imgui.TextColored(color, quest.solves) -- Solves imgui.TableSetColumnIndex(2) imgui.TextColored(color, Quests:FormatTimeStamp(quest.timestamp)) -- Timestamp imgui.TableSetColumnIndex(3) imgui.TextColored(color, quest.maxsolves) -- MaxSolves imgui.TableSetColumnIndex(4) imgui.TextColored(color, quest.delta) -- Delta imgui.TableSetColumnIndex(5) imgui.TextColored(color, Quests:GetTimeUntilExpire(quest)) -- Expired end imgui.EndTable() end imgui.EndTabItem() end -- Settings Tab if imgui.BeginTabItem("Settings") then imgui.SeparatorText("Tab Visibility") if imgui.Checkbox("Show Fac Hub",Settings.showFacHub) then Settings.showFacHub = not Settings.showFacHub end if imgui.Checkbox("Show Quests",Settings.showQuests) then Settings.showQuests = not Settings.showQuests end if imgui.Checkbox("Hide Unacquired Weapons",Settings.hideUnacquiredWeapons) then Settings.hideUnacquiredWeapons = not Settings.hideUnacquiredWeapons end if imgui.Checkbox("Hide Resistance Cleaving Weapons",Settings.hideResistanceCleavingWeapons) then Settings.hideResistanceCleavingWeapons = not Settings.hideResistanceCleavingWeapons end if imgui.Checkbox("Hide Non-Essential Slayer Weapons",Settings.hideNonEssentialCreatureSlayers) then Settings.hideNonEssentialCreatureSlayers = not Settings.hideNonEssentialCreatureSlayers end if imgui.Checkbox("Hide Missing Cantrips",Settings.hideMissingCantrips) then Settings.hideMissingCantrips = not Settings.hideMissingCantrips end imgui.EndTabItem() end imgui.EndTabBar() end if currentHUDPosition == nil then imgui.SetWindowPos(defaultHUDposition) currentHUDPosition = imgui.GetWindowPos() end end) hud.Visible = true Quests:Refresh() RefreshCantrips() RefreshWeapons()