MosswartMassacre/flagtracker/index.lua
2025-06-09 02:03:11 +02:00

1455 lines
No EOL
74 KiB
Lua

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()