Fixes #4 - missing totems

Added formatter file, removed whitespaces, fixed issue with tremor totem missing.
This commit is contained in:
MDGitHubRepo
2024-12-08 22:35:22 -05:00
parent f68fb493a4
commit 3076660609
3 changed files with 824 additions and 799 deletions
+7
View File
@@ -0,0 +1,7 @@
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"[lua]": {
"editor.defaultFormatter": "Koihik.vscode-lua-format"
}
}
+226 -194
View File
@@ -8,24 +8,20 @@
Totem Module Data
]]
--[[ ----------------------------------------------------------------
]] --[[ ----------------------------------------------------------------
COE.TotemData contains a list of totem classes that are
returned by COE:CreateTotem
For every available totem the player has, one object is
added to this list
-------------------------------------------------------------------]]
COE["TotemData"] = {};
-------------------------------------------------------------------]] COE["TotemData"] =
{};
COE["TotemCount"] = 0;
--[[ ----------------------------------------------------------------
COE.MaxTotems stores the maximum number of totems per element
This is taken right from the current game content
-------------------------------------------------------------------]]
COE["MaxTotems"] = { Earth = 5, Fire = 5, Water = 7, Air = 7 };
COE["MaxTotems"] = {Earth = 5, Fire = 5, Water = 7, Air = 7};
--[[ ----------------------------------------------------------------
COE.TotemsAvailable contains the number of totems available
@@ -37,7 +33,6 @@ COE.TotemsAvailable["Fire"] = 0;
COE.TotemsAvailable["Water"] = 0;
COE.TotemsAvailable["Air"] = 0;
--[[ ----------------------------------------------------------------
COE.ActiveTotems contains a pointer to the active totem of
each element
@@ -50,9 +45,8 @@ COE.TotemsAvailable["Air"] = 0;
to prevent actions that trigger SPELLCAST_STOP and are not
hooked from activating the timer accidentally
-------------------------------------------------------------------]]
COE["ActiveTotems"] = { Earth = nil, Fire = nil, Water = nil, Air = nil };
COE["TotemPending"] = { Totem = nil, UseRank = 0, Timeout = 0.75 };
COE["ActiveTotems"] = {Earth = nil, Fire = nil, Water = nil, Air = nil};
COE["TotemPending"] = {Totem = nil, UseRank = 0, Timeout = 0.75};
--[[ ----------------------------------------------------------------
COE.CleansingTotems stores pointers to the buttons and totems
@@ -60,33 +54,39 @@ COE["TotemPending"] = { Totem = nil, UseRank = 0, Timeout = 0.75 };
or fear effects
-------------------------------------------------------------------]]
COE["CleansingTotems"] = {
Poison = { Totem = nil, Button = nil, Warn = false },
Disease = { Totem = nil, Button = nil, Warn = false },
Tremor = { Totem = nil, Button = nil, Warn = false } };
Poison = {Totem = nil, Button = nil, Warn = false},
Disease = {Totem = nil, Button = nil, Warn = false},
Tremor = {Totem = nil, Button = nil, Warn = false}
};
--[[ ----------------------------------------------------------------
COE.TotemSets contains the totem pointers for each set and
element
-------------------------------------------------------------------]]
COE["TotemSetCount"] = 0;
COE["TotemSets"] = { }
COE["TotemSets"] = {}
--[[ ----------------------------------------------------------------
COE.SetCycle stores which totem of the active set have
already been thrown
-------------------------------------------------------------------]]
COE["SetCycle"] = { Earth = false, Fire = false, Water = false, Air = false };
COE["SetCycle"] = {Earth = false, Fire = false, Water = false, Air = false};
--[[ ----------------------------------------------------------------
COE.NoTotem is a placeholder for an empty anchor button
-------------------------------------------------------------------]]
COE["NoTotem"] = { SpellName = "", Element = "", Texture = "Interface\\Icons\\INV_Misc_Idol_03.blp",
ToolPresent = false, Ranks = { SpellID = 0, Mana = 0, Duration = 0, Health = 0, Cooldown = 0 },
MaxRank = 1, isActive = false, CurDuration = 0, CurHealth = 0, CurCooldown = 0 };
COE["NoTotem"] = {
SpellName = "",
Element = "",
Texture = "Interface\\Icons\\INV_Misc_Idol_03.blp",
ToolPresent = false,
Ranks = {SpellID = 0, Mana = 0, Duration = 0, Health = 0, Cooldown = 0},
MaxRank = 1,
isActive = false,
CurDuration = 0,
CurHealth = 0,
CurCooldown = 0
};
--[[ ----------------------------------------------------------------
METHOD: COE:CreateTotem
@@ -94,23 +94,31 @@ COE["NoTotem"] = { SpellName = "", Element = "", Texture = "Interface\\Icons\\IN
PURPOSE: Returns the totem class for a new totem
-------------------------------------------------------------------]]
function COE:CreateTotem()
return { SpellName = "", Element = "", Texture = "",
ToolPresent = false, Ranks = {}, MaxRank = 0, isActive = false,
CurDuration = 0, CurHealth = 0, CurCooldown = 0,
isTrinket = false, TrinketSlot = nil };
return {
SpellName = "",
Element = "",
Texture = "",
ToolPresent = false,
Ranks = {},
MaxRank = 0,
isActive = false,
CurDuration = 0,
CurHealth = 0,
CurCooldown = 0,
isTrinket = false,
TrinketSlot = nil
};
end
--[[ ----------------------------------------------------------------
METHOD: COE:CreateTotemRank
PURPOSE: Returns the class for a new totem rank
-------------------------------------------------------------------]]
function COE:CreateTotemRank()
return { SpellID = 0, Mana = 0, Duration = 0, Health = 0, Cooldown = 0 };
return {SpellID = 0, Mana = 0, Duration = 0, Health = 0, Cooldown = 0};
end
--[[ ----------------------------------------------------------------
METHOD: COE:ElementFromTool
@@ -118,7 +126,7 @@ end
This is needed for the french version to work. In the
english and german versions it just returns the input
-------------------------------------------------------------------]]
function COE:ElementFromTool( element )
function COE:ElementFromTool(element)
if element == COESTR_TOTEMTOOLS_EARTH then
return COESTR_ELEMENT_EARTH;
@@ -132,27 +140,25 @@ function COE:ElementFromTool( element )
end
--[[ ----------------------------------------------------------------
METHOD: COE:LocalizedElement
PURPOSE: Translates a localized element name into english
-------------------------------------------------------------------]]
function COE:LocalizedElement( element )
function COE:LocalizedElement(element)
if( element == COESTR_ELEMENT_EARTH ) then
if (element == COESTR_ELEMENT_EARTH) then
return "Earth";
elseif( element == COESTR_ELEMENT_FIRE ) then
elseif (element == COESTR_ELEMENT_FIRE) then
return "Fire";
elseif( element == COESTR_ELEMENT_WATER ) then
elseif (element == COESTR_ELEMENT_WATER) then
return "Water";
elseif( element == COESTR_ELEMENT_AIR ) then
elseif (element == COESTR_ELEMENT_AIR) then
return "Air";
end
end
--[[ ----------------------------------------------------------------
METHOD: COE:ScanTotems
@@ -161,7 +167,7 @@ end
-------------------------------------------------------------------]]
function COE:ScanTotems()
COE:DebugMessage( "Scanning Totems..." );
COE:DebugMessage("Scanning Totems...");
-- delete existing totem objects
-- ------------------------------
@@ -174,49 +180,48 @@ function COE:ScanTotems()
-- iterate over all spells in the spellbook
-- -----------------------------------------
local i, k = 1;
local i = 1;
while true do
local SpellName, SpellRank = GetSpellName( i, BOOKTYPE_SPELL );
if not SpellName or SpellName == "Totemic Recall" then
do break end;
end
local SpellName, SpellRank = GetSpellName(i, BOOKTYPE_SPELL);
if not SpellName then do break end end
-- is this a totem?
-- -----------------
if( string.find( SpellName, COESTR_SCANTOTEMS ) ~= nil ) then
if (SpellName ~= "Totemic Recall" and
string.find(SpellName, COESTR_SCANTOTEMS) ~= nil) then
local newtotem = true;
local totem = nil;
-- get the rank value
-- -------------------
local _,_,rank = string.find( SpellRank, COESTR_TOTEMRANK );
if( not rank ) then
local _, _, rank = string.find(SpellRank, COESTR_TOTEMRANK);
if (not rank) then
rank = 1;
else
rank = tonumber( rank );
rank = tonumber(rank);
end
-- =======================================================================
-- check if totem already exists with another rank in the list
-- =======================================================================
for k = 1, COE.TotemCount do
if( SpellName == COE.TotemData[k].SpellName ) then
if (SpellName == COE.TotemData[k].SpellName) then
-- use existing totem object
-- --------------------------
totem = COE.TotemData[k];
newtotem = false;
break;
break
end
end
COETotemTT:SetSpell( i, BOOKTYPE_SPELL );
COETotemTT:SetSpell(i, BOOKTYPE_SPELL);
-- =======================================================================
-- create new totem object if not found
-- =======================================================================
if( not totem ) then
if (not totem) then
totem = COE:CreateTotem();
-- set totem spell name
@@ -226,44 +231,46 @@ function COE:ScanTotems()
-- get totem school from tooltip
-- ------------------------------
local text = COETotemTTTextLeft4;
if( text and text:GetText() ) then
if (text and text:GetText()) then
local _,_, element = string.find( text:GetText(), COESTR_TOTEMTOOLS );
if( element ) then
local _, _, element =
string.find(text:GetText(), COESTR_TOTEMTOOLS);
if (element) then
-- if element starts with a |, the player does
-- not possess the needed totem for this spell
-- extract the color code before using the element
-- ------------------------------------------------
if( string.sub( element, 1, 1 ) == "|" ) then
element = string.sub( element, 11 );
if (string.sub(element, 1, 1) == "|") then
element = string.sub(element, 11);
end
-- get element from tool
-- ----------------------
element = COE:ElementFromTool( element );
element = COE:ElementFromTool(element);
-- translate element to english
-- -----------------------------
element = COE:LocalizedElement( element );
element = COE:LocalizedElement(element);
-- valid element?
-- ---------------
if( COE.TotemsAvailable[element] ~= nil ) then
if (COE.TotemsAvailable[element] ~= nil) then
totem.Element = element;
COE.TotemsAvailable[element] = COE.TotemsAvailable[element] + 1;
COE.TotemsAvailable[element] =
COE.TotemsAvailable[element] + 1;
else
COE:Message( COESTR_INVALIDELEMENT .. SpellName );
COE:Message(COESTR_INVALIDELEMENT .. SpellName);
end
end
end
-- get totem texture
-- ------------------
totem.Texture = GetSpellTexture( i, BOOKTYPE_SPELL );
totem.Texture = GetSpellTexture(i, BOOKTYPE_SPELL);
-- get tool presence
-- ------------------
totem.ToolPresent = COE:IsToolPresent( i );
totem.ToolPresent = COE:IsToolPresent(i);
end
-- =======================================================================
@@ -278,56 +285,56 @@ function COE:ScanTotems()
-- get totem mana cost from tooltip
-- ---------------------------------
text = COETotemTTTextLeft2;
if( text and text:GetText() ) then
if (text and text:GetText()) then
local _,_, mana = string.find( text:GetText(), COESTR_TOTEMMANA );
if( mana ) then
totemrank.Mana = tonumber( mana );
end
local _, _, mana = string.find(text:GetText(), COESTR_TOTEMMANA);
if (mana) then totemrank.Mana = tonumber(mana); end
end
-- get totem duration and health
-- ------------------------------
totemrank.Duration, totemrank.Health, totemrank.Cooldown = COE:GetTotemDurationAndHealth( i );
totemrank.Duration, totemrank.Health, totemrank.Cooldown =
COE:GetTotemDurationAndHealth(i);
-- store rank in totem
-- --------------------
totem.Ranks[rank] = totemrank;
if( rank > totem.MaxRank ) then
totem.MaxRank = rank;
end
if (rank > totem.MaxRank) then totem.MaxRank = rank; end
-- is this a new totem?
-- ---------------------
if( newtotem ) then
if (newtotem) then
-- store totem
-- ------------
COE.TotemCount = COE.TotemCount + 1;
COE.TotemData[COE.TotemCount] = totem;
-- check if it's a cleansing totem
-- --------------------------------
if( SpellName == COESTR_TOTEMPOISON ) then
if (SpellName == COESTR_TOTEMPOISON) then
COE.CleansingTotems.Poison.Totem = totem;
elseif( SpellName == COESTR_TOTEMDISEASE ) then
elseif (SpellName == COESTR_TOTEMDISEASE) then
COE.CleansingTotems.Disease.Totem = totem;
elseif( SpellName == COESTR_TOTEMTREMOR ) then
elseif (SpellName == COESTR_TOTEMTREMOR) then
COE.CleansingTotems.Tremor.Totem = totem;
end
COE:DebugMessage( "Found totem: " .. SpellName );
COE:DebugMessage("Found totem: " .. SpellName);
end
-- =======================================================================
-- check visibility options
-- =======================================================================
if( COE_DisplayedTotems[SpellName] == nil ) then
if (COE_DisplayedTotems[SpellName] == nil) then
-- perhaps a new totem. set it to default visible
-- and reorder it when the element count is known
-- -----------------------------------------------
COE_DisplayedTotems[SpellName] = { Order = 0, Element = totem.Element, Visible = true };
COE_DisplayedTotems[SpellName] = {
Order = 0,
Element = totem.Element,
Visible = true
};
else
-- update old saved variables versions by adding the element
-- ----------------------------------------------------------
@@ -347,7 +354,7 @@ function COE:ScanTotems()
-- to make it invisible anyway
-- the player needs to have at least one water totem though
-- --------------------------------------------------------------
if( COE.TotemsAvailable.Water > 0 ) then
if (COE.TotemsAvailable.Water > 0) then
local trinket = COE:CreateTotem();
trinket.SpellName = "Trinket";
trinket.Element = "Water";
@@ -365,11 +372,11 @@ function COE:ScanTotems()
COE.TotemCount = COE.TotemCount + 1;
COE.TotemData[COE.TotemCount] = trinket;
if( COE_DisplayedTotems[trinket.SpellName] == nil ) then
if (COE_DisplayedTotems[trinket.SpellName] == nil) then
-- perhaps a new totem. set it to default visible
-- and reorder it when the element count is known
-- -----------------------------------------------
COE_DisplayedTotems[trinket.SpellName] = { Order = 0, Visible = true };
COE_DisplayedTotems[trinket.SpellName] = {Order = 0, Visible = true};
end
end
@@ -377,10 +384,11 @@ function COE:ScanTotems()
-- Finish
-- ===================================
COE:DebugMessage( "Found " .. COE.TotemCount .. " totems in spellbook" ..
"(" .. COE.TotemsAvailable.Earth .. " Earth, " ..
COE.TotemsAvailable.Fire .. " Fire, " .. COE.TotemsAvailable.Water .. " Water, " ..
COE.TotemsAvailable.Air .. " Air)" );
COE:DebugMessage(
"Found " .. COE.TotemCount .. " totems in spellbook" .. "(" ..
COE.TotemsAvailable.Earth .. " Earth, " .. COE.TotemsAvailable.Fire ..
" Fire, " .. COE.TotemsAvailable.Water .. " Water, " ..
COE.TotemsAvailable.Air .. " Air)");
-- reorder new totems
-- -------------------
@@ -388,7 +396,6 @@ function COE:ScanTotems()
end
--[[ ----------------------------------------------------------------
METHOD: COE:GetTotemDurationAndHealth
@@ -398,14 +405,14 @@ end
totem duration then
Also the health and the cooldown of the totem are returned
-------------------------------------------------------------------]]
function COE:GetTotemDurationAndHealth( spellid )
function COE:GetTotemDurationAndHealth(spellid)
COETotemTTTextRight3:SetText( nil );
COETotemTT:SetSpell( spellid, BOOKTYPE_SPELL );
COETotemTTTextRight3:SetText(nil);
COETotemTT:SetSpell(spellid, BOOKTYPE_SPELL);
text = COETotemTTTextLeft5:GetText();
if( not text ) then
COE:DebugMessage( "nil text with id: " .. spellid );
if (not text) then
COE:DebugMessage("nil text with id: " .. spellid);
return 0, 0;
end
@@ -420,33 +427,34 @@ function COE:GetTotemDurationAndHealth( spellid )
-- first search for a minute specification
-- if we find one it is surely the totem duration
-- -----------------------------------------------
local _,_,minutetext = string.find( text, COESTR_MINUTEDURATION );
if( minutetext ) then
local _, _, minutetext = string.find(text, COESTR_MINUTEDURATION);
if (minutetext) then
-- calculate the duration in seconds
-- ----------------------------------
local min = tonumber( string.sub( minutetext, 1, 1 ) );
local sec = tonumber( string.sub( minutetext, 3, 4 ) ) / 100 * 60;
local min = tonumber(string.sub(minutetext, 1, 1));
local sec = tonumber(string.sub(minutetext, 3, 4)) / 100 * 60;
duration = min * 60 + sec;
else
_,_,minutetext = string.find( text, COESTR_MINUTEDURATION_INT );
if( minutetext ) then
duration = tonumber( minutetext ) * 60;
_, _, minutetext = string.find(text, COESTR_MINUTEDURATION_INT);
if (minutetext) then
duration = tonumber(minutetext) * 60;
else
-- now test for a duration in seconds
-- -----------------------------------
local _,b,sectext1 = string.find( text, COESTR_SECDURATION );
if( sectext1 ) then
local _, b, sectext1 = string.find(text, COESTR_SECDURATION);
if (sectext1) then
-- look if there are two second specifications
-- if so, take the greate one
-- --------------------------------------------
local _,_,sectext2 = string.find( string.sub( text, b ), COESTR_SECDURATION );
local _, _, sectext2 = string.find(string.sub(text, b),
COESTR_SECDURATION);
if( sectext2 ) then
duration = math.max( tonumber( sectext1 ), tonumber( sectext2 ) );
if (sectext2) then
duration = math.max(tonumber(sectext1), tonumber(sectext2));
else
duration = tonumber( sectext1 );
duration = tonumber(sectext1);
end
end
end
@@ -457,11 +465,11 @@ function COE:GetTotemDurationAndHealth( spellid )
-- ===============================================================
for num, regex in COESTR_TOTEMHEALTH do
local match = { string.gfind( text, regex )() };
if ( table.getn(match) >= 1 ) then
local match = {string.gfind(text, regex)()};
if (table.getn(match) >= 1) then
health = tonumber( match[1] );
break;
health = tonumber(match[1]);
break
end
end
@@ -471,16 +479,16 @@ function COE:GetTotemDurationAndHealth( spellid )
text = COETotemTTTextRight3:GetText();
if( not text ) then
if (not text) then
cooldown = 0;
else
_,_,cooldown = string.find( text, COESTR_SECDURATION );
if( cooldown ) then
cooldown = tonumber( cooldown );
_, _, cooldown = string.find(text, COESTR_SECDURATION);
if (cooldown) then
cooldown = tonumber(cooldown);
else
_,_,cooldown = string.find( text, COESTR_MINUTEDURATION_INT );
if( cooldown ) then
cooldown = tonumber( cooldown ) * 60;
_, _, cooldown = string.find(text, COESTR_MINUTEDURATION_INT);
if (cooldown) then
cooldown = tonumber(cooldown) * 60;
else
cooldown = 0;
end
@@ -491,7 +499,6 @@ function COE:GetTotemDurationAndHealth( spellid )
end
--[[ ----------------------------------------------------------------
METHOD: COE:IsToolPresent
@@ -501,33 +508,30 @@ end
This is done by testing the color of the "Tools:" section
in the totem tooltip
-------------------------------------------------------------------]]
function COE:IsToolPresent( spellid )
function COE:IsToolPresent(spellid)
-- get totem tooltip
-- ------------------
COETotemTT:SetSpell( spellid, BOOKTYPE_SPELL );
COETotemTT:SetSpell(spellid, BOOKTYPE_SPELL);
-- test for presence of the totem tool
-- ------------------------------------
local text = COETotemTTTextLeft4;
if( text and text:GetText() ) then
if (text and text:GetText()) then
local _,_, element = string.find( text:GetText(), COESTR_TOTEMTOOLS );
if( element ) then
local _, _, element = string.find(text:GetText(), COESTR_TOTEMTOOLS);
if (element) then
-- if element doesn't start with a |, the player
-- possesses the needed totem for this spell
-- ------------------------------------------------
if( string.sub( element, 1, 1 ) ~= "|" ) then
return true;
end
if (string.sub(element, 1, 1) ~= "|") then return true; end
end
end
return false;
end
--[[ ----------------------------------------------------------------
METHOD: COE:IsTrinketPresent
@@ -539,12 +543,12 @@ end
function COE:IsTrinketPresent()
for i = 0, 1 do
local slot = GetInventorySlotInfo( "Trinket" .. i .. "Slot" );
local item = GetInventoryItemLink( "player", slot );
local slot = GetInventorySlotInfo("Trinket" .. i .. "Slot");
local item = GetInventoryItemLink("player", slot);
if( item ) then
local itemname = string.find( item, COESTR_TRINKET );
if( itemname ) then
if (item) then
local itemname = string.find(item, COESTR_TRINKET);
if (itemname) then
-- trinket is equipped
-- --------------------
return true, slot;
@@ -556,7 +560,6 @@ function COE:IsTrinketPresent()
end
--[[ ----------------------------------------------------------------
METHOD: COE:ReorderNewTotems
@@ -565,32 +568,50 @@ end
totems in this element
-------------------------------------------------------------------]]
function COE:ReorderNewTotems()
COE:DebugMessage("Executing ReorderNewTotems");
local nextslot = { Earth = COE.TotemsAvailable.Earth, Fire = COE.TotemsAvailable.Fire,
Water = COE.TotemsAvailable.Water, Air = COE.TotemsAvailable.Air };
local nextslot = {
Earth = COE.TotemsAvailable.Earth,
Fire = COE.TotemsAvailable.Fire,
Water = COE.TotemsAvailable.Water,
Air = COE.TotemsAvailable.Air
};
local used = { Earth = {}, Fire = {}, Water = {}, Air = {} };
local used = {Earth = {}, Fire = {}, Water = {}, Air = {}};
local bError = false;
local k;
COE:DebugMessage("ReorderNewTotems COE.TotemCount: " .. COE.TotemCount);
for k = 1, COE.TotemCount do
local totem = COE.TotemData[k];
if( COE_DisplayedTotems[totem.SpellName] ~= nil ) then
if( COE_DisplayedTotems[totem.SpellName].Order == 0 ) then
COE:DebugMessage(
"ReorderNewTotems processing totem: " .. totem.Element .. " " ..
totem.SpellName);
if (COE_DisplayedTotems[totem.SpellName] ~= nil) then
if (COE_DisplayedTotems[totem.SpellName].Order == 0) then
-- this totem has just been added
-- assign the currently free slot
-- -------------------------------
COE_DisplayedTotems[totem.SpellName].Order = nextslot[totem.Element];
if (not nextslot[totem.Element]) then
COE:DebugMessage(
"ReorderNewTotems nextslot[totem.Element] is nil");
end
COE_DisplayedTotems[totem.SpellName].Order =
nextslot[totem.Element];
nextslot[totem.Element] = nextslot[totem.Element] - 1;
end
-- register that this slot of the element is now in use
-- mark as error if already in use
-- -----------------------------------------------------
if( used[totem.Element][COE_DisplayedTotems[totem.SpellName].Order] == nil ) then
used[totem.Element][COE_DisplayedTotems[totem.SpellName].Order] = true;
if (used[totem.Element][COE_DisplayedTotems[totem.SpellName].Order] ==
nil) then
used[totem.Element][COE_DisplayedTotems[totem.SpellName].Order] =
true;
else
bError = true;
end
@@ -599,14 +620,14 @@ function COE:ReorderNewTotems()
-- are there multiple entries for one slot?
-- -----------------------------------------
if( bError ) then
if (bError) then
-- there is something wrong with the saved variables
-- reset all ordering and reassign it
-- --------------------------------------------------
for k = 1, COE.TotemCount do
local totem = COE.TotemData[k];
if( COE_DisplayedTotems[totem.SpellName] ~= nil ) then
if (COE_DisplayedTotems[totem.SpellName] ~= nil) then
COE_DisplayedTotems[totem.SpellName].Order = 0;
end
end
@@ -617,7 +638,6 @@ function COE:ReorderNewTotems()
end
--[[ ----------------------------------------------------------------
METHOD: COE:InitTotemSets
@@ -626,30 +646,34 @@ end
-------------------------------------------------------------------]]
function COE:InitTotemSets()
local indices = { "Earth", "Fire", "Water", "Air" };
local indices = {"Earth", "Fire", "Water", "Air"};
COE.TotemSets = {};
-- for each standard set
-- ----------------------
local set;
for set = 1, table.getn( COE_SavedTotemSets ) do
for set = 1, table.getn(COE_SavedTotemSets) do
COE.TotemSets[set] = { Earth = nil, Fire = nil, Water = nil, Air = nil,
CastOrder = COE_SavedTotemSets[set].CastOrder };
COE.TotemSets[set] = {
Earth = nil,
Fire = nil,
Water = nil,
Air = nil,
CastOrder = COE_SavedTotemSets[set].CastOrder
};
-- for each element
-- -----------------
local k, totem;
for k = 1,4 do
for k = 1, 4 do
if( COE_SavedTotemSets[set][indices[k]] ~= "" ) then
if (COE_SavedTotemSets[set][indices[k]] ~= "") then
-- iterate over all totems
-- ------------------------
for totem in COE.TotemData do
if( COE.TotemData[totem].SpellName == COE_SavedTotemSets[set][indices[k]] ) then
if (COE.TotemData[totem].SpellName ==
COE_SavedTotemSets[set][indices[k]]) then
COE.TotemSets[set][indices[k]] = COE.TotemData[totem];
end
end
@@ -659,35 +683,41 @@ function COE:InitTotemSets()
-- for each custom set
-- --------------------
for set = 1, table.getn( COE_CustomTotemSets ) do
for set = 1, table.getn(COE_CustomTotemSets) do
COE.TotemSets[COESET_DEFAULT + set] = { Earth = nil, Fire = nil, Water = nil, Air = nil,
CastOrder = COE_CustomTotemSets[set].CastOrder };
COE.TotemSets[COESET_DEFAULT + set] = {
Earth = nil,
Fire = nil,
Water = nil,
Air = nil,
CastOrder = COE_CustomTotemSets[set].CastOrder
};
-- for each element
-- -----------------
local k, totem;
for k = 1,4 do
for k = 1, 4 do
if( COE_CustomTotemSets[set][indices[k]] ~= "" ) then
if (COE_CustomTotemSets[set][indices[k]] ~= "") then
-- iterate over all totems
-- ------------------------
for totem in COE.TotemData do
if( COE.TotemData[totem].SpellName == COE_CustomTotemSets[set][indices[k]] ) then
COE.TotemSets[COESET_DEFAULT + set][indices[k]] = COE.TotemData[totem];
if (COE.TotemData[totem].SpellName ==
COE_CustomTotemSets[set][indices[k]]) then
COE.TotemSets[COESET_DEFAULT + set][indices[k]] =
COE.TotemData[totem];
end
end
end
end
end
COE.TotemSetCount = table.getn( COE.TotemSets );
COE.TotemSetCount = table.getn(COE.TotemSets);
end
--[[ =============================================================================================
F I X E S
@@ -705,19 +735,19 @@ function COE:Fix_CastOrderLocalization()
-- for each standard set
-- ----------------------
local set, k;
for set = 1, table.getn( COE_SavedTotemSets ) do
for set = 1, table.getn(COE_SavedTotemSets) do
for k = 1, 4 do
if( COE_SavedTotemSets[set].CastOrder[k] == "Earth" ) then
if (COE_SavedTotemSets[set].CastOrder[k] == "Earth") then
COE_SavedTotemSets[set].CastOrder[k] = COESTR_ELEMENT_EARTH;
elseif( COE_SavedTotemSets[set].CastOrder[k] == "Fire" ) then
elseif (COE_SavedTotemSets[set].CastOrder[k] == "Fire") then
COE_SavedTotemSets[set].CastOrder[k] = COESTR_ELEMENT_FIRE;
elseif( COE_SavedTotemSets[set].CastOrder[k] == "Water" ) then
elseif (COE_SavedTotemSets[set].CastOrder[k] == "Water") then
COE_SavedTotemSets[set].CastOrder[k] = COESTR_ELEMENT_WATER;
elseif( COE_SavedTotemSets[set].CastOrder[k] == "Air" ) then
elseif (COE_SavedTotemSets[set].CastOrder[k] == "Air") then
COE_SavedTotemSets[set].CastOrder[k] = COESTR_ELEMENT_AIR;
end
end
@@ -725,11 +755,10 @@ function COE:Fix_CastOrderLocalization()
-- notify user
-- ------------
COE:Message( COESTR_FIXEDSETS );
COE:Message(COESTR_FIXEDSETS);
end
--[[ ----------------------------------------------------------------
METHOD: COE:Fix_DisplayedTotems
@@ -739,41 +768,38 @@ function COE:Fix_DisplayedTotems()
local i;
local fixed = false;
foreach( COE_DisplayedTotems, function( index, value )
foreach(COE_DisplayedTotems, function(index, value)
-- is this an old-style entry?
-- ----------------------------
if( type( value ) == "boolean" ) then
COE_DisplayedTotems[index] = { Order = 0, Visible = value };
if (type(value) == "boolean") then
COE_DisplayedTotems[index] = {Order = 0, Visible = value};
fixed = true;
elseif( type( value ) == "table" ) then
if( COE_DisplayedTotems[index].Visible == nil ) then
elseif (type(value) == "table") then
if (COE_DisplayedTotems[index].Visible == nil) then
COE_DisplayedTotems[index].Visible = true;
fixed = true;
end
if( COE_DisplayedTotems[index].Order == nil ) then
if (COE_DisplayedTotems[index].Order == nil) then
COE_DisplayedTotems[index].Order = 0;
fixed = true;
end
else
COE_DisplayedTotems[index] = { Order = 0, Visible = value };
COE_DisplayedTotems[index] = {Order = 0, Visible = value};
fixed = true;
end
end );
end);
-- notify user
-- ------------
if( fixed ) then
COE:Message( COESTR_FIXEDDISPLAY );
end
if (fixed) then COE:Message(COESTR_FIXEDDISPLAY); end
end
--[[ ----------------------------------------------------------------
METHOD: COE:Fix_CastOrderLocalization2
@@ -785,19 +811,22 @@ function COE:Fix_CastOrderLocalization2()
-- for each standard set
-- ----------------------
local set, k;
for set = 1, table.getn( COE_SavedTotemSets ) do
for set = 1, table.getn(COE_SavedTotemSets) do
for k = 1, 4 do
if( COE_SavedTotemSets[set].CastOrder[k] == COESTR_TOTEMTOOLS_EARTH ) then
if (COE_SavedTotemSets[set].CastOrder[k] == COESTR_TOTEMTOOLS_EARTH) then
COE_SavedTotemSets[set].CastOrder[k] = COESTR_ELEMENT_EARTH;
elseif( COE_SavedTotemSets[set].CastOrder[k] == COESTR_TOTEMTOOLS_FIRE ) then
elseif (COE_SavedTotemSets[set].CastOrder[k] ==
COESTR_TOTEMTOOLS_FIRE) then
COE_SavedTotemSets[set].CastOrder[k] = COESTR_ELEMENT_FIRE;
elseif( COE_SavedTotemSets[set].CastOrder[k] == COESTR_TOTEMTOOLS_WATER ) then
elseif (COE_SavedTotemSets[set].CastOrder[k] ==
COESTR_TOTEMTOOLS_WATER) then
COE_SavedTotemSets[set].CastOrder[k] = COESTR_ELEMENT_WATER;
elseif( COE_SavedTotemSets[set].CastOrder[k] == COESTR_TOTEMTOOLS_AIR ) then
elseif (COE_SavedTotemSets[set].CastOrder[k] ==
COESTR_TOTEMTOOLS_AIR) then
COE_SavedTotemSets[set].CastOrder[k] = COESTR_ELEMENT_AIR;
end
end
@@ -805,19 +834,22 @@ function COE:Fix_CastOrderLocalization2()
-- for each custom set
-- --------------------
for set = 1, table.getn( COE_CustomTotemSets ) do
for set = 1, table.getn(COE_CustomTotemSets) do
for k = 1, 4 do
if( COE_CustomTotemSets[set].CastOrder[k] == COESTR_TOTEMTOOLS_EARTH ) then
if (COE_CustomTotemSets[set].CastOrder[k] == COESTR_TOTEMTOOLS_EARTH) then
COE_CustomTotemSets[set].CastOrder[k] = COESTR_ELEMENT_EARTH;
elseif( COE_CustomTotemSets[set].CastOrder[k] == COESTR_TOTEMTOOLS_FIRE ) then
elseif (COE_CustomTotemSets[set].CastOrder[k] ==
COESTR_TOTEMTOOLS_FIRE) then
COE_CustomTotemSets[set].CastOrder[k] = COESTR_ELEMENT_FIRE;
elseif( COE_CustomTotemSets[set].CastOrder[k] == COESTR_TOTEMTOOLS_WATER ) then
elseif (COE_CustomTotemSets[set].CastOrder[k] ==
COESTR_TOTEMTOOLS_WATER) then
COE_CustomTotemSets[set].CastOrder[k] = COESTR_ELEMENT_WATER;
elseif( COE_CustomTotemSets[set].CastOrder[k] == COESTR_TOTEMTOOLS_AIR ) then
elseif (COE_CustomTotemSets[set].CastOrder[k] ==
COESTR_TOTEMTOOLS_AIR) then
COE_CustomTotemSets[set].CastOrder[k] = COESTR_ELEMENT_AIR;
end
end
+70 -84
View File
@@ -5,11 +5,7 @@
by Wyverex (2006)
]]
if( not COE ) then
COE = {};
end
]] if (not COE) then COE = {}; end
COE_VERSION = 2.6
@@ -40,7 +36,6 @@ COE["EventPrintMode"] = false;
COE["UpdateInterval"] = 0.1;
COE["ForceUpdate"] = COE.UpdateInterval * 2;
--[[ ----------------------------------------------------------------
The AdvisorInterval controls how often the party/raid is
scanned for debuffs that are curable by totems
@@ -50,31 +45,30 @@ COE["ForceUpdate"] = COE.UpdateInterval * 2;
COE["AdvisorInterval"] = 1;
COE["AdvisorWarningInterval"] = 7;
--[[ ----------------------------------------------------------------
METHOD: COE:Init
PURPOSE: Loads submodules and initializes data
-------------------------------------------------------------------]]
function COE:Init()
COE:Message( "Call of Elements v" .. COE_VERSION );
COE:Message("Call of Elements v" .. COE_VERSION);
-- load only for shamans
-- ----------------------
local _, EnglishClass = UnitClass( "player" );
if( EnglishClass ~= "SHAMAN" ) then
COE:Message( COESTR_NOTASHAMAN );
local _, EnglishClass = UnitClass("player");
if (EnglishClass ~= "SHAMAN") then
COE:Message(COESTR_NOTASHAMAN);
COE.Initialized = false;
else
COE.Initialized = true;
this:RegisterEvent( "VARIABLES_LOADED" );
this:RegisterEvent("VARIABLES_LOADED");
this:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF");
-- register shell command
-- -----------------------
SlashCmdList["COE"] = COEProcessShellCommand;
SLASH_COE1="/coe";
SLASH_COE1 = "/coe";
end
end
@@ -101,9 +95,9 @@ end
PURPOSE: Handles frame events
-------------------------------------------------------------------]]
function COE:OnEvent( event )
function COE:OnEvent(event)
if( event == "VARIABLES_LOADED" ) then
if (event == "VARIABLES_LOADED") then
-- fix saved variables if this update has to do so
-- ------------------------------------------------
COE:FixSavedVariables();
@@ -125,10 +119,9 @@ end
PURPOSE: Adds a message to the default chat frame
-------------------------------------------------------------------]]
function COE:Message( msg )
DEFAULT_CHAT_FRAME:AddMessage( "[COE] " .. msg, 0.93, 0.83, 0.45 );
end;
function COE:Message(msg)
DEFAULT_CHAT_FRAME:AddMessage("[COE] " .. msg, 0.93, 0.83, 0.45);
end
--[[ ----------------------------------------------------------------
METHOD: COE:DebugMessage
@@ -136,12 +129,11 @@ end;
PURPOSE: Adds a debug message to the default chat frame if
debug mode is enabled
-------------------------------------------------------------------]]
function COE:DebugMessage( msg )
if( COE.DebugMode ) then
DEFAULT_CHAT_FRAME:AddMessage( "[COE] " .. msg, 1, 0, 0 );
function COE:DebugMessage(msg)
if (COE.DebugMode) then
DEFAULT_CHAT_FRAME:AddMessage("[COE] " .. msg, 1, 0, 0);
end
end;
end
--[[ ----------------------------------------------------------------
METHOD: COE:Notification
@@ -149,28 +141,27 @@ end;
PURPOSE: Adds a message to the error frame in the upper
screen center
-------------------------------------------------------------------]]
function COE:Notification( msg, color )
function COE:Notification(msg, color)
local col;
-- choose color
-- -------------
if( color == COECOL_TOTEMWARNING ) then
col = { r = 0, g = 0.6, b = 1 };
elseif( color == COECOL_TOTEMDESTROYED ) then
col = { r = 1, g = 0.4, b = 0 };
elseif( color == COECOL_TOTEMCLEANSING ) then
col = { r = 0, g = 1, b = 0.4 };
if (color == COECOL_TOTEMWARNING) then
col = {r = 0, g = 0.6, b = 1};
elseif (color == COECOL_TOTEMDESTROYED) then
col = {r = 1, g = 0.4, b = 0};
elseif (color == COECOL_TOTEMCLEANSING) then
col = {r = 0, g = 1, b = 0.4};
else
col = { r = 1, g = 1, b = 1 };
col = {r = 1, g = 1, b = 1};
end
-- add message
-- ------------
UIErrorsFrame:AddMessage( msg, col.r, col.g, col.b, 1.0, UIERRORS_HOLD_TIME );
end;
UIErrorsFrame:AddMessage(msg, col.r, col.g, col.b, 1.0, UIERRORS_HOLD_TIME);
end
--[[ ----------------------------------------------------------------
METHOD: COE:ToggleConfigFrame
@@ -179,74 +170,70 @@ end;
-------------------------------------------------------------------]]
function COE:ToggleConfigFrame()
if( COE_ConfigFrame:IsVisible() ) then
if (COE_ConfigFrame:IsVisible()) then
COE_Config:CloseDialog()
else
COE_ConfigFrame:Show();
end
PlaySound( "igMainMenuOption" );
PlaySound("igMainMenuOption");
end
--[[ ----------------------------------------------------------------
METHOD: COEProcessShellCommand
PURPOSE: Executes the entered shell command
-------------------------------------------------------------------]]
function COEProcessShellCommand( msg )
function COEProcessShellCommand(msg)
if( msg == "" or msg == "config" ) then
if (msg == "" or msg == "config") then
COE:ToggleConfigFrame();
elseif( msg == "list" ) then
elseif (msg == "list") then
COE:DisplayShellCommands();
elseif( msg == "nextset" ) then
elseif (msg == "nextset") then
COE_Totem:SwitchToNextSet();
elseif( msg == "priorset" ) then
elseif (msg == "priorset") then
COE_Totem:SwitchToPriorSet();
elseif( msg == "throwset" ) then
elseif (msg == "throwset") then
COE_Totem:ThrowSet();
elseif( msg == "restartset" ) then
elseif (msg == "restartset") then
COE_Totem:ResetSetCycle();
elseif( msg == "reset" ) then
elseif (msg == "reset") then
COE_Totem:ResetTimers();
elseif( msg == "reload" ) then
elseif (msg == "reload") then
COE_Totem:Rescan();
elseif( msg == "resetframes" ) then
elseif (msg == "resetframes") then
COE_Totem:ResetFrames();
elseif( msg == "advised" ) then
elseif (msg == "advised") then
COE_Totem:ThrowAdvisedTotem();
elseif( msg == "resetordering" ) then
elseif (msg == "resetordering") then
COE_DisplayedTotems = {};
COE_Totem:Rescan();
elseif( msg == "bestheal" ) then
elseif (msg == "bestheal") then
COE_Heal:BestHeal();
elseif( msg == "battleheal" ) then
elseif (msg == "battleheal") then
COE_Heal:BattleHeal();
else
local _,_,arg = string.find( msg, "set (.*)" );
if( arg ) then
COE_Totem:SwitchToSet( arg );
end
local _, _, arg = string.find(msg, "set (.*)");
if (arg) then COE_Totem:SwitchToSet(arg); end
end
end
--[[ ----------------------------------------------------------------
METHOD: COE:DisplayShellCommands
@@ -254,24 +241,23 @@ end
-------------------------------------------------------------------]]
function COE:DisplayShellCommands()
COE:Message( COESHELL_INTRO );
COE:Message( COESHELL_CONFIG );
COE:Message( COESHELL_LIST );
COE:Message( COESHELL_NEXTSET );
COE:Message( COESHELL_PRIORSET );
COE:Message( COESHELL_SET );
COE:Message( COESHELL_RESTARTSET );
COE:Message( COESHELL_RESET );
COE:Message( COESHELL_RESETFRAMES );
COE:Message( COESHELL_RESETORDERING );
COE:Message( COESHELL_RELOAD );
COE:Message( COESHELL_MACRONOTE );
COE:Message( COESHELL_THROWSET );
COE:Message( COESHELL_ADVISED );
COE:Message(COESHELL_INTRO);
COE:Message(COESHELL_CONFIG);
COE:Message(COESHELL_LIST);
COE:Message(COESHELL_NEXTSET);
COE:Message(COESHELL_PRIORSET);
COE:Message(COESHELL_SET);
COE:Message(COESHELL_RESTARTSET);
COE:Message(COESHELL_RESET);
COE:Message(COESHELL_RESETFRAMES);
COE:Message(COESHELL_RESETORDERING);
COE:Message(COESHELL_RELOAD);
COE:Message(COESHELL_MACRONOTE);
COE:Message(COESHELL_THROWSET);
COE:Message(COESHELL_ADVISED);
end
--[[ ----------------------------------------------------------------
METHOD: COE:FixSavedVariables
@@ -283,37 +269,37 @@ function COE:FixSavedVariables()
-- is the version stored in the saved variables?
-- ----------------------------------------------
if( not COE_Config:GetSaved( COEOPT_VERSION ) ) then
if (not COE_Config:GetSaved(COEOPT_VERSION)) then
-- this is version <= v1.6
-- ------------------------
COE_Config:SetOption( COEOPT_VERSION, 1.6 );
COE_Config:SetOption(COEOPT_VERSION, 1.6);
end
local version = COE_Config:GetSaved( COEOPT_VERSION );
local version = COE_Config:GetSaved(COEOPT_VERSION);
if( version == 1.6 ) then
if (version == 1.6) then
-- fix localized cast order in 1.7
-- --------------------------------
COE:Fix_CastOrderLocalization();
COE:Message( COESTR_UDATEDSAVED .. "1.7" );
COE_Config:SetOption( COEOPT_VERSION, 1.7 );
version = COE_Config:GetSaved( COEOPT_VERSION );
COE:Message(COESTR_UDATEDSAVED .. "1.7");
COE_Config:SetOption(COEOPT_VERSION, 1.7);
version = COE_Config:GetSaved(COEOPT_VERSION);
end
if( version == 1.7 ) then
if (version == 1.7) then
-- fix cast order again to due to a typo
-- --------------------------------------
COE:Fix_CastOrderLocalization();
COE:Message( COESTR_UDATEDSAVED .. "1.8" );
COE_Config:SetOption( COEOPT_VERSION, 1.8 );
version = COE_Config:GetSaved( COEOPT_VERSION );
COE:Message(COESTR_UDATEDSAVED .. "1.8");
COE_Config:SetOption(COEOPT_VERSION, 1.8);
version = COE_Config:GetSaved(COEOPT_VERSION);
end
-- fix totem set element strings
-- ------------------------------
COE:Fix_CastOrderLocalization2();
COE_Config:SetOption( COEOPT_VERSION, 2.1 );
COE_Config:SetOption(COEOPT_VERSION, 2.1);
end