Standard practice is to create a table of events you actually want to listen to, as looking up a handler in a table of events is way faster (and syntactically nicer) than grinding through a massive cascading if statement.
I think it's easier for me to just paste some code:
Code:
Events = {
UNIT_RAGE = function(fm) fm:OnStatsChanged() end,
UNIT_AURA = function(fm) fm:OnStatsChanged() end,
UNIT_STATS = function(fm) fm:OnStatsChanged() end,
PLAYER_AURAS_CHANGED = function(fm) fm:OnStatsChanged() end,
UNIT_INVENTORY_CHANGED = function(fm) fm:OnEquipmentChanged(); fm:OnStatsChanged(); end,
PLAYER_LEVEL_UP = function(fm) fm:OnStatsChanged() end,
UNIT_SPELLCAST_SUCCEEDED = function(fm) fm:OnSpellCast() end,
CHARACTER_POINTS_CHANGED = function(fm) fm:OnTalentsChanged() end,
UPDATE_SHAPESHIFT_FORM = function(fm) fm:OnStatsChanged() end,
PLAYER_REGEN_DISABLED = function(fm) fm:OnEnterCombat() end,
PLAYER_REGEN_ENABLED = function(fm) fm:OnLeaveCombat() end
}
Code:
self:GetFrame():SetScript(
"OnEvent",
function(frame, event)
FuryMonitor.Main:GetInstance().Events[event](FuryMonitor.Main:GetInstance());
end
);
All of the event arguments are global variables, and WoW's addons run in a single threaded environment, so you don't need to pass them to your event handler:
Code:
function FuryMonitor.Main:OnSpellCast()
local unitName = arg1;
if unitName ~= "player" then
return;
end
self:SetRotationStabilized(false);
local spellName = arg2;
local ability = self:GetAbilityByName(arg2);
if ability then
FuryMonitor.Util.UpdateTime();
ability:Used();
end
end
Edit: see, look, this is even useful for me! It helps me find really dumb code!