import "Turbine.UI";
import "Turbine.UI.Lotro";
import "Turbine.Gameplay";
import "KragenPlugs.Utils";
import "KragenPlugs.KragenBars";
GuardianBars = class( KragenPlugs.KragenBars.ClassBar );
function GuardianBars:Constructor()
KragenPlugs.KragenBars.ClassBar.Constructor( self );
-- SET AND UPDATE DEFAULT SETTINGS
if (not settings.class) then
settings.class = vars.playerclass;
self:DefaultSettings();
self:ShowSetup();
else
self.settings = settings.classinfo;
if (settings.vers ~= vars.vers) then
self:UpdateSettings();
end
end
-- CLASS SPECIFIC VARIABLES
self.wound = 0;
self.effectlist = {};
self.effectlist['GuardiansWard'] = Effect();
self.effectlist['ImprovedGuardiansWard'] = Effect();
self.effectlist['BlockResponse'] = Effect();
self.effectlist['ShieldSwipe'] = Effect();
self.effectlist['ParryResponse'] = Effect();
self.effectlist['Retaliation'] = Effect();
self.effectlist['Stunned'] = Effect();
self.effectlist['Dazed'] = Effect();
self.effectlist['KnockedDown'] = Effect();
self.effectlist['Overpower'] = Effect();
self.effectlist['Campsite'] = Effect();
self.effectlist['ShieldSpikes'] = Effect();
-- DEFINE THE EFFECT LIST BASED ON CLIENT LANGUAGE
self.DefineEffectList = function()
-- ENGLISH CLIENT
if (settings.language == 1) then
self.effectlist['GuardiansWard'] :SetName("Guardian's Ward");
self.effectlist['ImprovedGuardiansWard'] :SetName("Improved Guardian's Ward");
self.effectlist['BlockResponse'] :SetName('Block Response');
self.effectlist['ShieldSwipe'] :SetName('Shield Swipe');
self.effectlist['ParryResponse'] :SetName('Parry Response');
self.effectlist['Retaliation'] :SetName('Retaliation');
self.effectlist['Stunned'] :SetName('Stunned');
self.effectlist['Dazed'] :SetName('Dazed');
self.effectlist['KnockedDown'] :SetName('Knocked Down');
self.effectlist['Overpower'] :SetName('Overpower');
self.effectlist['Campsite'] :SetName('Campsite');
self.effectlist['ShieldSpikes'] :SetName(' Spike');
-- FRENCH CLIENT
elseif (settings.language == 2) then
self.effectlist['GuardiansWard'] :SetName('Protection de gardien');
self.effectlist['ImprovedGuardiansWard'] :SetName('Protection de gardien améliorée');
self.effectlist['BlockResponse'] :SetName('Block Response');
self.effectlist['ShieldSwipe'] :SetName('Balayage au bouclier');
self.effectlist['ParryResponse'] :SetName('Réaction de parade');
self.effectlist['Retaliation'] :SetName('Riposte');
self.effectlist['Stunned'] :SetName('Etourdi');
self.effectlist['Dazed'] :SetName('Hébété');
self.effectlist['KnockedDown'] :SetName('Renversé');
self.effectlist['Overpower'] :SetName('Surpuissance');
self.effectlist['Campsite'] :SetName('Campsite');
self.effectlist['ShieldSpikes'] :SetName(' Spikes');
-- GERMAN CLIENT
elseif (settings.language == 3) then
self.effectlist['GuardiansWard'] :SetName('Wächerschild');
self.effectlist['ImprovedGuardiansWard'] :SetName('Verbesserung: Wächterschild');
self.effectlist['BlockResponse'] :SetName('Block Response');
self.effectlist['ShieldSwipe'] :SetName('Schildstreich');
self.effectlist['ParryResponse'] :SetName('Erwiderung "Parade"');
self.effectlist['Retaliation'] :SetName('Vergeltung');
self.effectlist['Stunned'] :SetName('Bewusstlos geschlagen');
self.effectlist['Dazed'] :SetName('Benommenheit');
self.effectlist['KnockedDown'] :SetName('Zu Boden geschlagen');
self.effectlist['Overpower'] :SetName('Überwältigen');
self.effectlist['Campsite'] :SetName('Campsite');
self.effectlist['ShieldSpikes'] :SetName(' Spikes');
end
end
-- BUILD WINDOWS BARS SKILLS AND MULTIS --
-- Build Windows
for k,v in pairs(self.settings.userconf) do
self.barlist[v.id] = k;
self.windows[k] = SkillWindow(v.name, v.defpos[1], v.defpos[2], v.size[1], v.size[2], {active = v.active, x = v.x, y = v.y, rotate = v.rotate});
self.bars[k] = SkillBar(self.windows[k], 1, 1, v.size[1], v.size[2], true, false);
self.barcount = self.barcount + 1;
end
for k,v in pairs(self.settings.preconf) do
self.barlist[v.id] = k;
self.windows[k] = SkillWindow(v.name, v.defpos[1], v.defpos[2], v.size[1], v.size[2], {active = v.active, x = v.x, y = v.y, rotate = v.rotate});
self.barcount = self.barcount + 1;
end
-- Build Bars
self.bars["Overpower"] = SkillBar(self.windows["Overpower"], 1, 1, 3, 1, true, true);
self.bars["BlockTier1"] = SkillBar(self.windows["Block"], 1, 1, 3, 1, true, true);
self.bars["BlockTier2"] = SkillBar(self.windows["Block"], 1.5, 1, 2, 1, true, true);
self.bars["BlockTier3"] = SkillBar(self.windows["Block"], 4, 1, 1, 1, true, true);
self.bars["ParryTier1"] = SkillBar(self.windows["Parry"], 2, 1, 1, 1, true, true);
self.bars["ParryTier2"] = SkillBar(self.windows["Parry"], 1, 1, 3, 1, true, true);
self.bars["ParryTier3"] = SkillBar(self.windows["Parry"], 4, 1, 2, 1, true, true);
-- Build Skills
self.skills["ShieldSwipe"] = SkillSlot(self.bars["BlockTier1"], 1, 1, false, 2, "0x7000305D");
self.skills["CatchABreath"] = SkillSlot(self.bars["BlockTier1"], 2, 1, false, 16, "0x7000307D");
self.skills["LitanyOfDefiance"] = SkillSlot(self.bars["BlockTier1"], 3, 1, false, 60, "0x7000F095");
self.skills["ShieldBash"] = SkillSlot(self.bars["BlockTier2"], 1, 1, false, 10, "0x70003EE1");
self.skills["ShieldTaunt"] = SkillSlot(self.bars["BlockTier2"], 2, 1, false, 22, "0x70003EE6");
self.skills["ShieldSmash"] = SkillSlot(self.bars["BlockTier3"], 1, 1, false, 41, "0x70002EC4");
self.skills["Retaliation"] = SkillSlot(self.bars["ParryTier1"], 1, 1, false, 8, "0x70003EE0");
self.skills["Overwhelm"] = SkillSlot(self.bars["ParryTier2"], 1, 1, false, 8, "0x70003EE2");
self.skills["WhirlingRetaliation"] = SkillSlot(self.bars["ParryTier2"], 2, 1, false, 14, "0x70003EE4");
self.skills["Thrust"] = SkillSlot(self.bars["ParryTier2"], 3, 1, false, 18, "0x70003EE5");
self.skills["SaltTheWound"] = SkillSlot(self.bars["ParryTier3"], 2, 1, true, 22, "0x7000D4AF");
self.skills["ToTheKing"] = SkillSlot(self.bars["ParryTier3"], 1, 1, false, 41, "0x70002EA5");
self.skills["GuardiansWard"] = SkillSlot(self.bars["Ward"], 1, 1, true, 1, "0x70003066");
self.skills["ShieldBlow"] = SkillSlot(self.bars["Melee"], 1, 1, true, { 1, 54 }, { "0x7000306F", "0x7000F1E0" });
self.skills["Sting"] = SkillSlot(self.bars["Melee"], 2, 1, true, { 1, 52 }, { "0x70003058", "0x7000F1E1" });
self.skills["SweepingCut"] = SkillSlot(self.bars["Melee"], 3, 1, true, 4, "0x70003EDE");
self.skills["VexingBlow"] = SkillSlot(self.bars["Melee"], 4, 1, true, 6, "0x7000308A");
self.skills["Stamp"] = SkillSlot(self.bars["Melee"], 5, 1, true, 32, "0x70003EE7");
self.skills["TakeToHeart"] = SkillSlot(self.bars["Melee"], 6, 1, true, 58, "0x7000ED87");
self.skills["Challenge"] = SkillSlot(self.bars["Taunt"], 1, 1, true, 16, "0x70003097");
self.skills["FrayTheEdge"] = SkillSlot(self.bars["Taunt"], 2, 1, true, 40, "0x7000D4B5");
self.skills["Engage"] = SkillSlot(self.bars["Taunt"], 3, 1, true, 42, "0x7000D4B2");
self.skills["ChallengeTheDarkness"] = SkillSlot(self.bars["Taunt"], 4, 1, self.settings.traits["ChallengeTheDarkness"].active, 41, "0x70002EDF");
self.skills["GuardiansPledge"] = SkillSlot(self.bars["SelfBuffs"], 1, 1, true, 20, "0x700030A4");
self.skills["ThrillOfDanger"] = SkillSlot(self.bars["SelfBuffs"], 2, 1, true, 26, "0x700030B4");
self.skills["WarriorsHeart"] = SkillSlot(self.bars["SelfBuffs"], 3, 1, true, { 30, 64 }, { "0x700030AC", "0x70020DF5" });
self.skills["DeepBreath"] = SkillSlot(self.bars["SelfBuffs"], 4, 1, true, 34, "0x700030A8");
self.skills["IgnoreThePain"] = SkillSlot(self.bars["SelfBuffs"], 5, 1, true, 44, "0x70021663");
self.skills["Charge"] = SkillSlot(self.bars["SelfBuffs"], 6, 1, true, { 48, 62 }, { "0x7000DD14", "0x7001F4B6" });
self.skills["Protection"] = SkillSlot(self.bars["Protect"], 1, 1, true, 24, "0x7000309A");
self.skills["ShieldWall"] = SkillSlot(self.bars["Protect"], 2, 1, true, 50, "0x7000D4AE");
self.skills["ForcedOpening"] = SkillSlot(self.bars["Overpower"], 1, 1, false, 30, "0x7000D4B0");
self.skills["Stagger"] = SkillSlot(self.bars["Overpower"], 2, 1, false, 46, "0x7000D4B3");
self.skills["BrutalAssault"] = SkillSlot(self.bars["Overpower"], 3, 1, false, 56, "0x7000F158");
self.skills["TurnTheTables"] = SkillSlot(self.bars["Stunned"], 1, 1, false, 36, "0x70003EE8");
self.skills["SummonTinker"] = SkillSlot(self.bars["Utility"], 1, 1, false, 26, "0x7000D4B4");
self.skills["GuardiansPromise"] = SkillSlot(self.bars["Utility"], 2, 1, true, 38, "0x70003EE9");
self.skills["LetFly"] = SkillSlot(self.bars["Ranged"], 1, 1, true, 30, "0x70003E14");
self.skills["OverpowerTactics"] = ItemSlot(self.bars["ClassItems"], 1, 1, self.settings.quickslots["Tactics"].active, self.settings.quickslots["Tactics"].type, self.settings.quickslots["Tactics"].data);
-- Build Stance Slot
self.multi = { };
self.multi["StanceSlot"] = SkillMultiSlot(self.bars["Stances"], 1, 1, true);
self.multi["StanceSlot"]:AddShortCut("GuardiansDefence", 4, "0x70003EDF");
self.multi["StanceSlot"]:AddShortCut("GuardiansParry", 12, "0x70003EE3");
self.multi["StanceSlot"]:AddShortCut("Overpower", 30, "0x7000D4B1");
if (self.settings.traits["ThreatStance"].active) then self.multi["StanceSlot"]:AddShortCut("GuardiansThreat", 41, "0x70002ED4"); end
self.multi["StanceSlot"]:LevelCheck();
-- Build Shield Spike Slot
self.multi["ShieldSpikes"] = ItemMultiSlot(self.bars["ClassItems"], 2, 1, true);
self.multi["ShieldSpikes"]:AddShortCut("Spike1", self.settings.quickslots["Spike1"].active, self.settings.quickslots["Spike1"].type, self.settings.quickslots["Spike1"].data);
self.multi["ShieldSpikes"]:AddShortCut("Spike2", self.settings.quickslots["Spike2"].active, self.settings.quickslots["Spike2"].type, self.settings.quickslots["Spike2"].data);
self.multi["ShieldSpikes"]:AddShortCut("Spike3", self.settings.quickslots["Spike3"].active, self.settings.quickslots["Spike3"].type, self.settings.quickslots["Spike3"].data);
self.multi["ShieldSpikes"]:AddShortCut("Spike4", self.settings.quickslots["Spike4"].active, self.settings.quickslots["Spike4"].type, self.settings.quickslots["Spike4"].data);
-- SET COMBAT STATES
self.skills["ThrillOfDanger"]:SetCombat( true, false );
self.skills["GuardiansPromise"]:SetCombat( false, true );
self.skills["SummonTinker"]:SetCombat( false, true );
-- CLASS SPECIFIC SETUP/DEFAULT CODE
self.windows["Overpower"]:SetZOrder(-10);
-- CLASS SPECIFIC EVENTS
-- Stance Changed Event
AddCallback(vars.classattr, "StanceChanged", function(sender, args)
KragenBars:StanceChange(vars.classattr:GetStance());
end);
-- Block Changed Event
AddCallback(vars.classattr, "IsBlockTier3AvailableChanged", function(sender, args)
KragenBars:BlockChange(3, vars.classattr:IsBlockTier3Available());
end);
-- Parry Changed Event
AddCallback(vars.classattr, "IsParryTier3AvailableChanged", function(sender, args)
KragenBars:ParryChange(3, vars.classattr:IsParryTier3Available());
end);
-- INITIALIZE BARS
self:InitBars();
self:BlockChange(3, vars.classattr:IsBlockTier3Available());
self:ParryChange(3, vars.classattr:IsParryTier3Available());
self:StanceChange(vars.classattr:GetStance());
self:CombatChange(vars.player:IsInCombat());
end
-- ADD EFFECT EVENT
function GuardianBars:AddEffect( effectIndex )
local effect = vars.player:GetEffects():Get( effectIndex );
-- Guardian's Ward
if (effect:GetName() == self.effectlist["GuardiansWard"]:GetName() or effect:GetName() == self.effectlist["ImprovedGuardiansWard"]:GetName()) then
self.skills["GuardiansWard"]:SetState( true , self.settings.defaults["WardActive"].selected < 3, effect:GetID());
if (self.settings.defaults["WardActive"].selected == 2) then
self.skills["GuardiansWard"]:SetHover( true );
elseif (self.settings.defaults["WardActive"].selected == 4) then
self.skills["GuardiansWard"]:StartTimer( effect:GetDuration() * .70, true );
end
elseif (effect:GetName() == self.effectlist["BlockResponse"]:GetName()) then
self.bars["BlockTier1"]:SetState( true, effect:GetID());
if (not self.bars["BlockTier2"].state) then
self.skills["ShieldSwipe"]:SetActive(true);
self.skills["CatchABreath"]:SetActive(true);
self.skills["LitanyOfDefiance"]:SetActive(true);
if (vars.playerlevel >= 10) then
self.bars["BlockTier1"]:SetZOrder(0);
self.bars["BlockTier2"]:SetZOrder(-10);
end
end
elseif (effect:GetName() == self.effectlist["ShieldSwipe"]:GetName()) then
self.bars["BlockTier2"]:SetState( true, effect:GetID());
self.skills["ShieldSwipe"]:SetActive(false);
self.skills["CatchABreath"]:SetActive(false);
self.skills["LitanyOfDefiance"]:SetActive(false);
self.bars["BlockTier1"]:SetZOrder(-10);
self.bars["BlockTier2"]:SetZOrder(0);
self.skills["ShieldTaunt"]:SetActive(true);
self.skills["ShieldBash"]:SetActive(true);
elseif (effect:GetName() == self.effectlist["ParryResponse"]:GetName()) then
self.bars["ParryTier1"]:SetState( true, effect:GetID());
if (not self.bars["ParryTier2"].state) then
self.skills["Retaliation"]:SetActive( true );
self.bars["ParryTier1"]:SetZOrder(0);
self.bars["ParryTier2"]:SetZOrder(-10);
end
elseif (effect:GetName() == self.effectlist["Retaliation"]:GetName()) then
self.bars["ParryTier2"]:SetState( true, effect:GetID());
self.skills["Retaliation"]:SetActive( false );
self.bars["ParryTier1"]:SetZOrder(-10);
self.bars["ParryTier2"]:SetZOrder(0);
self.skills["Overwhelm"]:SetActive( true );
self.skills["Thrust"]:SetActive( true );
self.skills["WhirlingRetaliation"]:SetActive( true );
-- Stunned, Dazed, Knocked Down
elseif (effect:GetName() == self.effectlist["Stunned"]:GetName() or effect:GetName() == self.effectlist["Dazed"]:GetName() or effect:GetName() == self.effectlist["KnockedDown"]:GetName()) then
self.skills["TurnTheTables"]:SetState( true , true, effect:GetID());
-- Stance Change
elseif (effect:GetName() == self.effectlist["Overpower"]:GetName()) then
self.bars["Overpower"]:SetState( true, effect:GetID() );
self.windows["Overpower"]:SetZOrder(0);
self.windows["Block"]:SetZOrder(-10);
self.skills["ForcedOpening"]:SetActive( true );
self.skills["Stagger"]:SetActive( true );
self.skills["BrutalAssault"]:SetActive( true );
self.skills["ShieldBlow"]:SetActive( false );
self.skills["Protection"]:SetActive( false );
self.skills["ShieldWall"]:SetActive( false );
elseif (effect:GetName() == self.effectlist["Campsite"]:GetName()) then
self.skills["SummonTinker"]:SetState(true, true, effect:GetID() );
elseif (string.find(effect:GetName(), self.effectlist["ShieldSpikes"]:GetName()) ~= nil ) then
self.multi["ShieldSpikes"]:SetState(true, true, effect:GetID() );
self.multi["ShieldSpikes"]:SetHover(true);
-- Wound
elseif (effect:GetCategory() == Turbine.Gameplay.EffectCategory.Wound ) then
self.wound = self.wound + 1;
if (self.settings.features["WoundIndicator"].active) then
self.skills["IgnoreThePain"]:SetColor("red");
end
end
end
-- REMOVE EFFECT EVENT
function GuardianBars:RemoveEffect( effect )
-- SetState can be called on both bars and skills
-- it will store the incoming effect id and flag the state
-- SetState(effectstate:Boolean, effectid:int);
-- Guardian's Ward
if (effect:GetName() == self.effectlist["GuardiansWard"]:GetName() or effect:GetName() == self.effectlist["ImprovedGuardiansWard"]:GetName()) then
self.skills["GuardiansWard"]:SetState( false , true, effect:GetID());
if (not self.skills["GuardiansWard"].state) then
self.skills["GuardiansWard"]:SetHover( false );
end
elseif (effect:GetName() == self.effectlist["BlockResponse"]:GetName()) then
self.bars["BlockTier1"]:SetState( false, effect:GetID());
if (not self.bars["BlockTier1"].state) then
self.skills["ShieldSwipe"]:SetActive(false);
self.skills["CatchABreath"]:SetActive(false);
self.skills["LitanyOfDefiance"]:SetActive(false);
end
elseif (effect:GetName() == self.effectlist["ShieldSwipe"]:GetName()) then
self.bars["BlockTier2"]:SetState( false, effect:GetID());
if (not self.bars["BlockTier2"].state) then
self.skills["ShieldTaunt"]:SetActive(false);
self.skills["ShieldBash"]:SetActive(false);
if (self.bars["BlockTier1"].state) then
self.skills["ShieldSwipe"]:SetActive(true);
self.skills["CatchABreath"]:SetActive(true);
self.skills["LitanyOfDefiance"]:SetActive(true);
self.bars["BlockTier1"]:SetZOrder(0);
self.bars["BlockTier2"]:SetZOrder(-10);
end
end
elseif (effect:GetName() == self.effectlist["ParryResponse"]:GetName()) then
self.bars["ParryTier1"]:SetState( false, effect:GetID());
if (not self.bars["ParryTier1"].state) then
self.skills["Retaliation"]:SetActive(false);
end
elseif (effect:GetName() == self.effectlist["Retaliation"]:GetName()) then
self.bars["ParryTier2"]:SetState( false, effect:GetID());
if (not self.bars["ParryTier2"].state) then
self.skills["Overwhelm"]:SetActive(false);
self.skills["Thrust"]:SetActive(false);
self.skills["WhirlingRetaliation"]:SetActive(false);
if (self.bars["ParryTier1"].state) then
self.skills["Retaliation"]:SetActive(true);
self.bars["ParryTier1"]:SetZOrder(0);
self.bars["ParryTier2"]:SetZOrder(-10);
end
end
-- Stunned, Dazed or Knocked Down
elseif (effect:GetName() == self.effectlist["Stunned"]:GetName() or effect:GetName() == self.effectlist["Dazed"]:GetName() or effect:GetName() == self.effectlist["KnockedDown"]:GetName()) then
self.skills["TurnTheTables"]:SetState( false , false, effect:GetID());
-- Overpower
elseif (effect:GetName() == self.effectlist["Overpower"]:GetName()) then
self.bars["Overpower"]:SetState( false, effect:GetID() );
if (not self.bars["Overpower"].state) then
self.windows["Overpower"]:SetZOrder(-10);
self.windows["Block"]:SetZOrder(0);
self.skills["ForcedOpening"]:SetActive( false );
self.skills["Stagger"]:SetActive( false );
self.skills["BrutalAssault"]:SetActive( false );
self.skills["ShieldBlow"]:SetActive( true );
self.skills["Protection"]:SetActive( true );
self.skills["ShieldWall"]:SetActive( true );
end
-- Summon Tinker Available
elseif (effect:GetName() == self.effectlist["Campsite"]:GetName()) then
self.skills["SummonTinker"]:SetState(false, false, effect:GetID() );
-- Shield Spikes Used
elseif (string.find(effect:GetName(), self.effectlist["ShieldSpikes"]:GetName()) ~= nil ) then
self.multi["ShieldSpikes"]:SetState(false, true, effect:GetID() );
self.multi["ShieldSpikes"]:SetHover(false);
-- Wound
elseif (effect:GetCategory() == Turbine.Gameplay.EffectCategory.Wound ) then
self.wound = self.wound - 1;
if (self.wound == 0) then
self.skills["IgnoreThePain"]:SetColor();
end
end
end
-- STANCE CHANGED EVENT
function GuardianBars:StanceChange(stance)
-- PRIMARY STANCE SWITCHING
if (self.settings.features["StancePriority"].active) then
local newstance = 0;
if (stance == 3) then
newstance = 4;
elseif (stance == 4) then
newstance = 3;
else
newstance = stance;
end
if (newstance == self.settings.defaults["PrimaryStance"].selected) then
self.multi["StanceSlot"]:SetIndex(self.settings.defaults["SecondaryStance"].selected);
else
self.multi["StanceSlot"]:SetIndex(self.settings.defaults["PrimaryStance"].selected);
end
end
-- HOVER/DISAPPEAR SWITCHING
if (stance == 0) then
self.multi["StanceSlot"]:SetHover( false );
self.multi["StanceSlot"]:SetActive( true );
else
self.multi["StanceSlot"]:SetActive( self.settings.defaults["StanceActive"].selected ~= 3);
self.multi["StanceSlot"]:SetHover( self.settings.defaults["StanceActive"].selected == 2 );
end
end
-- BLOCK CHANGED EVENT
function GuardianBars:BlockChange(tier, state)
if (tier == 3) then
self.skills["ShieldSmash"]:SetActive( state and self.settings.traits["ShieldSmash"].active );
end
end
-- PARRY CHANGED EVENT
function GuardianBars:ParryChange(tier, state)
if (tier == 3) then
self.skills["ToTheKing"]:SetActive( state and self.settings.traits["ToTheKing"].active );
end
end
-- DEFAULT SETTINGS
function GuardianBars:DefaultSettings()
self.settings = { preconf = { }, userconf = { }, traits = { }, features = { }, defaults = { }, quickslots = { } };
self.settings.preconf["Block"] = { id = 1, name = "Block Reactives", defpos = {1,3}, size={4,1}, active = true, x=0, y=0, rotate=0 };
self.settings.preconf["Parry"] = { id = 2, name = "Parry Reactives", defpos = {1,2}, size={5,1}, active = true, x=0, y=0, rotate=0 };
self.settings.preconf["Overpower"] = { id = 3, name = "Overpower", defpos = {1,3}, size={3,1}, active = true, x=0, y=0, rotate=0 };
self.settings.userconf["Ward"] = { id = 4, name = "Ward", defpos = {1,4}, size={1,1}, active = true, x=0, y=0, rotate=0 };
self.settings.userconf["Melee"] = { id = 5, name = "Melee", defpos = {2,4}, size={6,1}, active = true, x=0, y=0, rotate=0 };
self.settings.userconf["Taunt"] = { id = 6, name = "Taunt", defpos = {7,4}, size={4,1}, active = true, x=0, y=0, rotate=0 };
self.settings.userconf["SelfBuffs"] = { id = 7, name = "Self Buffs", defpos = {1,1}, size={6,1}, active = true, x=0, y=0, rotate=0 };
self.settings.userconf["Protect"] = { id = 8, name = "Protect", defpos = {6,2}, size={2,1}, active = true, x=0, y=0, rotate=0 };
self.settings.userconf["Stances"] = { id = 9, name = "Stances", defpos = {12,3}, size={1,1}, active = true, x=0, y=0, rotate=0 };
self.settings.userconf["Stunned"] = { id = 10, name = "Stunned", defpos = {12,2}, size={1,1}, active = true, x=0, y=0, rotate=0 };
self.settings.userconf["Utility"] = { id = 11, name = "Utility", defpos = {8,1}, size={2,1}, active = true, x=0, y=0, rotate=0 };
self.settings.userconf["Ranged"] = { id = 12, name = "Ranged", defpos = {12,4}, size={1,1}, active = true, x=0, y=0, rotate=0 };
self.settings.userconf["ClassItems"] = { id = 13, name = "Class Items", defpos = {11,1}, size={2,1}, active = true, x=0, y=0, rotate=0 };
self.settings.traits["ToTheKing"] = { id = 1, name = 'To The King', active = false };
self.settings.traits["ShieldSmash"] = { id = 2, name = 'Shield Smash', active = false };
self.settings.traits["ThreatStance"] = { id = 3, name = 'Threat Stance', active = false };
self.settings.traits["ChallengeTheDarkness"] = { id = 4, name = 'Challenge The Darkness', active = false };
self.settings.features["StancePriority"] = { id = 1, name = 'Stance Priority', active = true };
self.settings.features["WoundIndicator"] = { id = 2, name = 'Wound Indicator', active = true };
self.settings.defaults["PrimaryStance"] = { id = 1, name = 'Primary Stance', selected = 1, list = { "Guardian's Defence", "Guardian's Parry", "Overpower", "Threat" } };
self.settings.defaults["SecondaryStance"] = { id = 2, name = 'Secondary Stance', selected = 3, list = { "Guardian's Defence", "Guardian's Parry", "Overpower", "Threat" } };
self.settings.defaults["StanceActive"] = { id = 3, name = 'Stance Active', selected = 2, list = { "None", "Dim", "Hide" } };
self.settings.defaults["WardActive"] = { id = 4, name = 'Guardians Ward Active', selected = 4, list = { "None", "Dim", "Hide", "Early Warning" } };
self.settings.quickslots["Spike1"] = {id = 1, name = "Shield Spikes 1", active = false, type = 0, data = ""};
self.settings.quickslots["Spike2"] = {id = 2, name = "Shield Spikes 2", active = false, type = 0, data = ""};
self.settings.quickslots["Spike3"] = {id = 3, name = "Shield Spikes 3", active = false, type = 0, data = ""};
self.settings.quickslots["Spike4"] = {id = 4, name = "Shield Spikes 4", active = false, type = 0, data = ""};
self.settings.quickslots["Tactics"] = {id = 5, name = "Overpower Tactics", active = false, type = 0, data = ""};
end
-- UPDATE SETTINGS
function GuardianBars:UpdateSettings()
if (settings.vers < 3.01) then
if (self.settings["Features"].wardwarning) then self.settings.defaults["WardActive"].selected = 4; else self.settings.defaults["WardActive"].selected = 3; end
if (self.settings["Features"].stancehover) then self.settings.defaults["StanceActive"].selected = 2; else if (self.settings["Features"].stancedisappear) then self.settings.defaults["StanceActive"].selected = 3; else self.settings.defaults["StanceActive"].selected = 1; end end
self.settings["Features"].wardwarning = nil;
self.settings["Features"].stancehover = nil;
self.settings["Features"].stancedisappear = nil;
end
if (settings.vers < 3.20) then
self.settings["Quickslots"].tactics = {active = false, type = 0, data = "" }
end
if (settings.vers < 3.21) then
local oldclassinfo = self.settings;
self:DefaultSettings();
for k,v in pairs(oldclassinfo) do
if (k ~= "Features" and k ~= "Quickslots") then
if (self.settings.preconf[k] == nil) then
if (self.settings.userconf[k] ~= nil) then
self.settings.userconf[k].x = v.x;
self.settings.userconf[k].y = v.y;
self.settings.userconf[k].rotate = v.rotate;
self.settings.userconf[k].active = v.active;
end
else
self.settings.preconf[k].x = v.x;
self.settings.preconf[k].y = v.y;
self.settings.preconf[k].rotate = v.rotate;
self.settings.preconf[k].active = v.active;
end
elseif (k == "Features") then
for key, value in pairs(v) do
if (key == 'totheking') then
self.settings.traits["ToTheKing"].active = value;
elseif (key == 'shieldsmash') then
self.settings.traits["ShieldSmash"].active = value;
elseif (key == 'darkness') then
self.settings.traits["ChallengeTheDarkness"].active = value;
elseif (key == 'threat') then
self.settings.traits["ThreatStance"].active = value;
elseif (key == 'woundindicator') then
self.settings.features["WoundIndicator"].active = value;
elseif (key == 'stancepriority') then
self.settings.features["StancePriority"].active = value;
elseif (key == 'stanceactive') then
self.settings.defaults["StanceActive"].selected = value;
elseif (key == 'wardactive') then
self.settings.defaults["WardActive"].selected = value;
elseif (key == 'stanceactive') then
self.settings.defaults["PrimaryStance"].selected = value;
elseif (key == 'secondarystance') then
self.settings.defaults["SecondaryStance"].selected = value;
end
end
elseif (k == "Quickslots") then
for key, value in pairs(v) do
if (key == 'spike1') then
self.settings.quickslots["Spike1"].active = value.active;
self.settings.quickslots["Spike1"].type = value.type;
self.settings.quickslots["Spike1"].data = value.data;
elseif (key == 'spike2') then
self.settings.quickslots["Spike2"].active = value.active;
self.settings.quickslots["Spike2"].type = value.type;
self.settings.quickslots["Spike2"].data = value.data;
elseif (key == 'spike3') then
self.settings.quickslots["Spike3"].active = value.active;
self.settings.quickslots["Spike3"].type = value.type;
self.settings.quickslots["Spike3"].data = value.data;
elseif (key == 'spike4') then
self.settings.quickslots["Spike4"].active = value.active;
self.settings.quickslots["Spike4"].type = value.type;
self.settings.quickslots["Spike4"].data = value.data;
end
end
end
end
end
settings.vers = vars.vers;
end
-- DISPLAY SETUP WINDOW AND SET ALL CHECKBOXES COMBOBOXES SLIDERS AND QUICKSLOTS
function GuardianBars:ShowSetup()
self.setup:SetVisible(true);
self.setupbb.opacityslider:SetValue(settings.opacity * 100);
self.setupbb.checkboxlock:SetChecked(settings.lockslots);
self.setupbb.checkboxgrid:SetChecked(settings.snaptogrid);
self.setupbb.combolangbox:SetSelection(settings.language);
for k, v in pairs (self.settings.preconf) do
self.setupbb["checkboxbb"..tostring(v.id)]:SetText(v.name);
self.setupbb["checkboxbb"..tostring(v.id)]:SetChecked (v.active);
self.setupbb["checkboxbb"..tostring(v.id)]:SetVisible(true);
end
for k, v in pairs (self.settings.userconf) do
self.setupbb["checkboxbb"..tostring(v.id)]:SetText(v.name);
self.setupbb["checkboxbb"..tostring(v.id)]:SetChecked (v.active);
self.setupbb["checkboxbb"..tostring(v.id)]:SetVisible(true);
end
for k,v in pairs(self.settings.traits) do
self.setupf["checkboxf"..tostring(v.id)]:SetText(v.name);
self.setupf["checkboxf"..tostring(v.id)]:SetChecked (v.active);
self.setupf["checkboxf"..tostring(v.id)]:SetVisible(true);
end
for k,v in pairs(self.settings.features) do
self.setupf["checkboxf"..tostring(v.id+9)]:SetText(v.name);
self.setupf["checkboxf"..tostring(v.id+9)]:SetChecked (v.active);
self.setupf["checkboxf"..tostring(v.id+9)]:SetVisible(true);
end
for k,v in pairs(self.settings.defaults) do
self.setupf["combo"..tostring(v.id).."box"].listBox:ClearItems();
self.setupf["combo"..tostring(v.id).."Label"]:SetText(v.name);
self.setupf["combo"..tostring(v.id).."Label"]:SetVisible(true);
for key,value in pairs(v.list) do
self.setupf["combo"..tostring(v.id).."box"]:AddItem(value, key);
end
self.setupf["combo"..tostring(v.id).."box"]:SetVisible(true);
self.setupf["combo"..tostring(v.id).."box"]:SetSelection(v.selected);
end
for k,v in pairs(self.settings.quickslots) do
pcall(function() self.setupqs["quickslot"..tostring(v.id)]:SetShortcut(Turbine.UI.Lotro.Shortcut( v.type, v.data ) ); end);
self.setupqs["quickslot"..tostring(v.id)]:SetVisible(true);
self.setupqs["quickslot"..tostring(v.id).."cb"]:SetText(v.name);
self.setupqs["quickslot"..tostring(v.id).."cb"]:SetChecked(v.active);
self.setupqs["quickslot"..tostring(v.id).."cb"]:SetVisible(true);
end
end
-- SET ALL VARIABLES OFF OF SETUP WINDOW
function GuardianBars:SetupClosing()
settings.opacity = self.setupbb.opacityslider:GetValue() / 100;
settings.lockslots = self.setupbb.checkboxlock:IsChecked();
settings.snaptogrid = self.setupbb.checkboxgrid:IsChecked();
settings.language = self.setupbb.combolangbox:GetSelection();
for k, v in pairs (self.settings.preconf) do
v.active = self.setupbb["checkboxbb"..tostring(v.id)]:IsChecked();
end
for k, v in pairs (self.settings.userconf) do
v.active = self.setupbb["checkboxbb"..tostring(v.id)]:IsChecked();
end
for k, v in pairs (self.settings.traits) do
v.active = self.setupf["checkboxf"..tostring(v.id)]:IsChecked();
end
for k, v in pairs (self.settings.features) do
v.active = self.setupf["checkboxf"..tostring(v.id+9)]:IsChecked();
end
for k,v in pairs (self.settings.defaults) do
v.selected = self.setupf["combo"..tostring(v.id).."box"]:GetSelection();
end
for k, v in pairs (self.settings.quickslots) do
v.active = self.setupqs["quickslot"..tostring(v.id).."cb"]:IsChecked();
v.type = self.setupqs["quickslot"..tostring(v.id)]:GetShortcut():GetType();
v.data = self.setupqs["quickslot"..tostring(v.id)]:GetShortcut():GetData();
end
self:SaveSettings();
self:Refresh();
end
-- REFRESH SKILLS AND BARS
function GuardianBars:Refresh()
-- GENERIC REFRESH (Required for all classes)
self:RefreshBars();
-- REDEFINE EFFECTLIST IN CASE OF LANGUAGE CHANGE
self.DefineEffectList();
-- CLASS SPECIFIC REFRESH
-- Setup Features
self.skills["GuardiansWard"]:SetActive( true );
if (self.settings.defaults["WardActive"].selected == 2) then
self.skills["GuardiansWard"]:SetHover( self.skills["GuardiansWard"].state );
elseif (self.settings.defaults["WardActive"].selected >= 3) then
self.skills["GuardiansWard"]:SetActive( not self.skills["GuardiansWard"].state );
end
-- Set State on Legendary Skills
self.skills["ShieldSmash"]:SetActive(self.settings.traits["ShieldSmash"].active and vars.classattr:IsBlockTier3Available());
self.skills["ToTheKing"]:SetActive(self.settings.traits["ToTheKing"].active and vars.classattr:IsParryTier3Available());
self.skills["ChallengeTheDarkness"]:SetActive(self.settings.traits["ChallengeTheDarkness"].active);
-- Rebuild Stance Slot
self.multi["StanceSlot"]:Clear();
self.multi["StanceSlot"]:AddShortCut("GuardiansDefence", 4, "0x70003EDF");
self.multi["StanceSlot"]:AddShortCut("GuardiansParry", 12, "0x70003EE3");
self.multi["StanceSlot"]:AddShortCut("Overpower", 30, "0x7000D4B1");
if (self.settings.traits["ThreatStance"].active) then self.multi["StanceSlot"]:AddShortCut("GuardiansThreat", 41, "0x70002ED4"); end
self.multi["StanceSlot"]:LevelCheck();
-- Setup Quickslots
self.skills["OverpowerTactics"]:SetQuickslot(self.settings.quickslots["Tactics"].active, self.settings.quickslots["Tactics"].type, self.settings.quickslots["Tactics"].data);
-- Rebuild Shield Spikes Slot
self.multi["ShieldSpikes"]:Clear();
self.multi["ShieldSpikes"]:AddShortCut("Spike1", self.settings.quickslots["Spike1"].active, self.settings.quickslots["Spike1"].type, self.settings.quickslots["Spike1"].data);
self.multi["ShieldSpikes"]:AddShortCut("Spike2", self.settings.quickslots["Spike2"].active, self.settings.quickslots["Spike2"].type, self.settings.quickslots["Spike2"].data);
self.multi["ShieldSpikes"]:AddShortCut("Spike3", self.settings.quickslots["Spike3"].active, self.settings.quickslots["Spike3"].type, self.settings.quickslots["Spike3"].data);
self.multi["ShieldSpikes"]:AddShortCut("Spike4", self.settings.quickslots["Spike4"].active, self.settings.quickslots["Spike4"].type, self.settings.quickslots["Spike4"].data);
self.multi["ShieldSpikes"]:Refresh();
-- Set Wound Indicator
if (self.settings.features["WoundIndicator"].active and self.wound > 0) then
self.skills["IgnoreThePain"]:SetColor("red");
else
self.skills["IgnoreThePain"]:SetColor();
end
-- Refresh States
self:StanceChange(vars.classattr:GetStance());
self:CombatChange(vars.player:IsInCombat());
--Turbine.Shell.WriteLine("KragenBars: Guardian Bars refresh completed successfully.");
end