📄 statusbars.lua
字号:
-- StatusBars.lua, Daniel Wessl閚 <wesslen@users.sourceforge.net>
-- fixed defaults
local BarSpacing = 18;
local DefaultBGAlpha = 0.35;
local FlashBGAlpha = 0.8;
local FlashDuration = 0.5;
local ComboFlashDuration = 0.25;
local MaxBuffs = 8; -- requires StatusBars.php
local FadeInDuration = 0.2;
local FadeOutDuration = 1.5;
-- possible values for the 'enable' setting
local EnableAlways = 'always';
local EnableInCombat = 'combat';
local EnableInCombatOnly = 'combatonly';
local EnableNondefault = 'auto';
local EnableNever = 'never';
-- possible values for the 'percentage' setting
local PercentageLeft = 'left';
local PercentageRight = 'right';
local PercentageNone = 'none';
-- defaults for user-configurable settings
local DefaultEnable = EnableInCombat;
local DefaultWarnLimit = 0.6;
local DefaultText = '&cur / &max';
local DefaultPercentage = PercentageRight;
local DefaultPercentageText = '&frac%';
local DefaultAlpha = 1;
local DefaultTextColor = 'white';
local DefaultPercentageTextColor = 'ffd100';
local DefaultHealthColor = '<25%:red <50%:orange <75%:yellow green';
local DefaultManaColor = 'blue';
local DefaultRageColor = 'red';
local DefaultEnergyColor = 'yellow';
local DefaultFocusColor = 'orange';
local DefaultComboColor = 'red';
local DefaultHappinessColor = '<50%:red <90%:yellow green';
-- bar information containers
local health = {};
local power = {}; -- mana/rage/energy depending on class
local combo = {};
local druid = {};
local buff = {};
local debuff = {};
local targetHealth = {};
local targetPower = {};
local targetBuff = {};
local targetDebuff = {};
local petHealth = {};
local petPower = {};
local happiness = {};
local petBuff = {};
local petDebuff = {};
local bars = {
health, power, combo, druid, buff, debuff,
targetHealth, targetPower, targetDebuff, targetBuff,
petHealth, petPower, happiness, petBuff, petDebuff
};
local playerLogicals = { 'health', 'mana', 'rage', 'energy', 'focus', 'combo', 'druid', 'buff', 'debuff' };
local targetLogicals = { 'thealth', 'tmana', 'trage', 'tenergy', 'tfocus', 'tdebuff', 'tbuff' };
local petLogicals = { 'phealth', 'pmana', 'prage', 'penergy', 'pfocus', 'phappy', 'pbuff', 'pdebuff' };
local groupedBars = {};
local tickingBars = {};
local groupContainers = {
Player = true,
Target = true,
Pet = true,
Group1 = true,
Group2 = true,
Group3 = true,
Group4 = true,
Group5 = true
};
-- Settings:
--
-- enable: when the bar should be visible
-- EnableAlways
-- EnableInCombat: when in combat and when the property has a non-default value
-- EnableNondefault: when the property has a non-default value
-- EnableNever
-- flash: if the bar should flash when the property is far from the default value
-- warn: distance from the default value at which the bad will flash (i.e. 0.6 = 40% left)
-- text: if current / max should be written on the bar
-- percentage: percentage display (none/left/right)
-- color: (for health only) if the bar should change color ti illustrate the value
--
StatusBars_Settings5 = {};
StatusBars_locked = false;
local playerName = '';
local variables_loaded = false;
local load_time = 0;
local fully_initialized = false;
-- default settings
local function defaultMana() return {
flash = true,
color = DefaultManaColor,
}; end
local function defaultRage() return {
color = DefaultRageColor,
}; end
local function defaultEnergy() return {
color = DefaultEnergyColor,
}; end
local function defaultFocus() return {
color = DefaultFocusColor,
}; end
local function defaultBuff(visible)
t = {
text = '',
ptext = '',
};
if visible then
t.enable = EnableInCombatOnly;
else
t.enable = EnableNever;
end
return t;
end
local function targetDefaultBuff() return {
text = '',
ptext = '',
}; end
local defaultSettings = {
health = {
flash = true,
color = DefaultHealthColor,
},
mana = defaultMana(),
rage = defaultRage(),
energy = defaultEnergy(),
focus = defaultFocus(),
combo = {
text = '',
percentage = PercentageNone,
color = DefaultComboColor,
},
druid = {
color = DefaultManaColor,
enable = EnableNondefault,
},
buff = defaultBuff(false),
debuff = defaultBuff(),
thealth = {
text = '&rank &name',
color = DefaultHealthColor,
},
tmana = defaultMana(),
trage = defaultRage(),
tenergy = defaultEnergy(),
tfocus = defaultFocus(),
tbuff = targetDefaultBuff(),
tdebuff = targetDefaultBuff(),
phealth = {
text = '&name',
color = DefaultHealthColor,
},
pmana = defaultMana(),
prage = defaultRage(),
penergy = defaultEnergy(),
phappy = {
text = '&happy',
flash = true,
warn = 0.5,
color = DefaultHappinessColor,
percentage = PercentageNone,
enable = EnableNondefault,
},
pfocus = defaultFocus(),
pbuff = defaultBuff(false),
pdebuff = defaultBuff(),
};
local function consolePrint(msg)
--DEFAULT_CHAT_FRAME:AddMessage('StatusBars: ' .. msg);
end
local function StatusBars_Enabler(toggle)
if (toggle == 1) then
StatusBars_Enable = 1;
StatusBar.Enable = 1;
StatusBars_PlayerContainer:Show();
StatusBars_TargetContainer:Show();
StatusBars_PetContainer:Show();
StatusBars_Group1Container:Show();
StatusBars_Group2Container:Show();
StatusBars_Group3Container:Show();
StatusBars_Group4Container:Show();
StatusBars_Group5Container:Show();
else
StatusBars_Enable = 0;
StatusBar.Enable = 0;
StatusBars_PlayerContainer:Hide();
StatusBars_TargetContainer:Hide();
StatusBars_PetContainer:Hide();
StatusBars_Group1Container:Hide();
StatusBars_Group2Container:Hide();
StatusBars_Group3Container:Hide();
StatusBars_Group4Container:Hide();
StatusBars_Group5Container:Hide();
end
end
local function StatusBars_LOCK(toggle)
if (toggle == 0) then
StatusBars_locked = false;
else
StatusBars_locked = true;
end
end
local function StatusBars_Register()
if ( StatusBar == nil )then
StatusBar = {};
end
if ( StatusBar.Enable == nil )then
StatusBar.Enable = 1;
end
StatusBars_Enable = StatusBar.Enable;
if ( StatusBars_Enable == 0 ) then
StatusBars_PlayerContainer:Hide();
StatusBars_TargetContainer:Hide();
StatusBars_PetContainer:Hide();
StatusBars_Group1Container:Hide();
StatusBars_Group2Container:Hide();
StatusBars_Group3Container:Hide();
StatusBars_Group4Container:Hide();
StatusBars_Group5Container:Hide();
end
gLim_RegisterButton (
"Status Bars",
"战斗指示灯",
"Interface\\AddOns\\StatusBars\\Icon",
function()
gLimModSecBookShowConfig("gLimStatusBars");
end,
2,
3
);
gLim_RegisterConfigClass(
"gLimStatusBars",
"Status Bars",
"黑眼圈"
);
gLim_RegisterConfigSection(
"gLimStatusBarsSection",
"战斗指示灯",
"战斗指示灯设置",
"黑眼圈",
"gLimStatusBars"
);
gLim_RegisterConfigCheckBox(
"gLim_StatusBars_Enable",
"开启战斗指示灯",
"选择开启战斗指示灯",
StatusBars_Enable,
StatusBars_Enabler,
"gLimStatusBars"
);
local glimStatusBars_locked;
if (StatusBars_locked == true) then
glimStatusBars_locked = 1;
else
glimStatusBars_locked = 0;
end
gLim_RegisterConfigCheckBox(
"gLim_StatusBars_LOCKEnable",
"锁定当前位置",
"锁定当前位置,如果不锁定你可以按住SHIFT加鼠标左键来定位状态条的位置",
glimStatusBars_locked,
StatusBars_LOCK,
"gLimStatusBars"
);
end
local function clone(x)
if type(x) == 'table' then
local t = {};
table.foreach(x,
function(key, val)
t[key] = clone(val);
end
);
return t;
else
return x;
end
end
-- set global defaults (does not override already set values)
local function setDefault(which, value)
table.foreach(defaultSettings,
function(logical, ops)
if ops[which] == nil then
ops[which] = value;
end
end
);
end
local function setDefaultGroup(group, logicals)
table.foreach(logicals,
function(i, logical)
defaultSettings[logical]['group'] = group;
end
);
end
setDefault('enable', DefaultEnable);
setDefault('text', DefaultText);
setDefault('warn', DefaultWarnLimit);
setDefault('flash', false);
setDefault('alpha', DefaultAlpha);
setDefault('percentage', DefaultPercentage);
setDefault('ptext', DefaultPercentageText);
setDefault('scale', 1);
setDefault('tcolor', DefaultTextColor);
setDefault('pcolor', DefaultPercentageTextColor);
setDefaultGroup('player', playerLogicals);
setDefaultGroup('target', targetLogicals);
setDefaultGroup('pet', petLogicals);
defaultSettings.tbuff.warn = nil;
defaultSettings.tbuff.flash = nil;
local function round(x) return floor(x + 0.5); end
local function trim(text) return string.gsub(text, "%s*(.-)%s*$", "%1", 1); end
-- get option
local function optionT(logical, which)
local value = nil;
local t;
if playerName ~= '' then
t = StatusBars_Settings5[playerName];
if t ~= nil then
t = t[logical];
if t ~= nil then
value = t[which];
end
end
end
if value == nil then
t = defaultSettings[logical];
if t == nil then
return nil;
elseif (logical == 'thealth' or logical == 'phealth')
and which == 'text' and MobHealthFrame ~= nil then
return DefaultText;
else
return t[which];
end
else
return value;
end
end
local function option(vars, which)
return optionT(vars.logical, which);
end
--set option
local function setOptionT(logical, which, value)
local char = StatusBars_Settings5[playerName];
if char == nil then
char = {};
StatusBars_Settings5[playerName] = char;
end
local l = char[logical];
if l == nil then
l = {};
char[logical] = l;
end
l[which] = value;
end
local function assignGroups()
groupedBars = {};
table.foreach(groupContainers,
function(uname, t)
local lname = string.lower(uname);
groupedBars[lname] = { n = 0, name = uname };
end
);
table.foreachi(bars,
function(i, vars)
local vars = bars[i];
if vars.logical == nil then
-- not fully loaded yet
return;
end
local g = option(vars, 'group');
table.insert(groupedBars[g], vars);
end
);
end
-- place the active bars
-- used to remove the empty space where the combo bar would be when in bear form
local function sortBars(gbars, container)
local pos = 0;
local cname = 'StatusBars_' .. container .. 'Container';
local cvar = getglobal(cname);
table.foreachi(gbars,
function(i, vars)
if not vars.never and (vars.visible or (vars.softEnable and not vars.nospace)) then
vars.frame:SetPoint('TOP', cname, 'TOP', 0, pos);
pos = pos - BarSpacing;
end
end
);
cvar:SetHeight(abs(pos)+1);
end
local function sortGroupBars(name)
local g = groupedBars[name];
if g then
sortBars(g, g.name);
end
end
local function sortNeighborBars(vars)
sortGroupBars(option(vars, 'group'));
end
local function sortAllBars()
table.foreach(groupContainers,
function(uname, t)
local lname = string.lower(uname);
sortGroupBars(lname);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -