Quoted from "QthePhysicist;272302"
when i fire the actions off, they all seem to work fine, i.e., they recognize that i have the buff on already and don't recast it, except for "Tea-scented Waffle" which continues to fire and is not recognizing that i already have that buff. could there be something wrong with the name of the buff, "Tea-scented Waffle"?
|
|
Source code |
1 |
/run Msg(BuffList("player"))
|
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
function General(arg1,arg2)
local Skill = {}
local i = 0
local mana = PctM("player")
local health = PctH("player")
local thealth = PctH("target")
local friendly = (not UnitCanAttack("player","target"))
local shield = (GetEquipSlotInfo(17) ~= nil)
local tspell,ttime,telapsed = UnitCastingTime("target")
local combat = GetPlayerCombatState()
local bigparty = (GetNumPartyMembers() > 2)
local pbuffs = BuffList("player")
local tbuffs = BuffList("target")
i=i+1; Skill[i] = { name = "Hall of Dead Heroes", use = (health <= .10) }
i=i+1; Skill[i] = { name = "Magic Barrier", use = ((not combat) and (not string.find(pbuffs,"Magic Barrier"))) }
i=i+1; Skill[i] = { name = "Blessed Spring Water", use = ((not combat) and (not string.find(pbuffs,"Blessed Spring Water"))) }
i=i+1; Skill[i] = { name = "Action: 20 (Mana Pot)" , use = (mana < .40) }
i=i+1; Skill[i] = { name = "Action: 61 (Banquet)", use = ((health < .99) and (not string.find(pbuffs,"Dragon's Banquet"))) }
i=i+1; Skill[i] = { name = "Action: 62 (Tea Waffle)", use = ((health < .99) and (not string.find(pbuffs,"Tea-scented Waffle"))) }
i=i+1; Skill[i] = { name = "Action: 63 (Holy Power)", use = ((health < .99) and (not string.find(pbuffs,"Potion of Holy Power"))) }
i=i+1; Skill[i] = { name = "Action: 64 (Mana Source)", use = ((health < .99) and (not string.find(pbuffs,"Mana Source"))) }
i=i+1; Skill[i] = { name = "Action: 65 (Life Source)", use = ((health < .99) and (not string.find(pbuffs,"Life Source"))) }
i=i+1; Skill[i] = { name = "Action: 66 (Crystal Sugar)", use = ((health < .99) and (not string.find(pbuffs,"Crystal Sugar"))) }
i=i+1; Skill[i] = { name = "Action: 67 (Fruit Pie)", use = ((health < .99) and (not string.find(pbuffs,"Exotic Fruit Pie"))) }
i=i+1; Skill[i] = { name = "Action: 68 (Stim)", use = ((health < .99) and (not string.find(pbuffs,"Stimulant"))) }
i=i+1; Skill[i] = { name = "Action: 69 (Scent)", use = ((health < .99) and (not string.find(pbuffs,"Stimulating Scent"))) }
i=i+1; Skill[i] = { name = "Shock", use = ((not friendly) and (ttime >= 1) and (ttime - telapsed > 0.5)) }
-- i=i+1; Skill[i] = { name = "Charge", use = ((not friendly) and (ttime >= 1) and (ttime - telapsed > 0.5)) }
i=i+1; Skill[i] = { name = "Enhanced Armor", use = (not string.find(pbuffs,"Enhanced Armor")) }
i=i+1; Skill[i] = { name = "Holy Seal", use = (not string.find(pbuffs,"Holy Seal")) }
i=i+1; Skill[i] = { name = "Charge", use = ((not friendly) and (not string.find(tbuffs,"Charge"))) }
i=i+1; Skill[i] = { name = "Holy Aura", use = (health <= .25) }
i=i+1; Skill[i] = { name = "Holy Shield", use = (health <= .33) }
i=i+1; Skill[i] = { name = "Resolution", use = (health <= .40) }
i=i+1; Skill[i] = { name = "Urgent Heal", use = ((not friendly) and (health <= .50)) }
i=i+1; Skill[i] = { name = "Urgent Heal", use = (friendly and (thealth <= .50)) }
i=i+1; Skill[i] = { name = "Regenerate", use = ((not friendly) and (health <= .95) and (not string.find(pbuffs,"Regenerate"))) }
i=i+1; Skill[i] = { name = "Regenerate", use = (friendly and (thealth <= .95) and (not string.find(tbuffs,"Regenerate"))) }
i=i+1; Skill[i] = { name = "Holy Smite", use = ((not friendly) and (not bigparty) and string.find(tbuffs,"Holy Light's Fury")) }
i=i+1; Skill[i] = { name = "Holy Light's Fury", use = ((not friendly) and (not bigparty) and (not string.find(tbuffs,"Holy Light's Fury"))) }
i=i+1; Skill[i] = { name = "Shield of Atonement", use = ((not friendly) and shield) }
i=i+1; Skill[i] = { name = "Shield of Valor", use = ((not friendly) and shield) }
i=i+1; Skill[i] = { name = "Whirlwind Shield", use = ((not friendly) and shield) }
i=i+1; Skill[i] = { name = "Threaten", use = (string.find(tbuffs,"Holy Seals 3") and (not string.find(pbuffs,"Threaten")) and (arg2 == "threaten")) }
i=i+1; Skill[i] = { name = "Mana Return", use = (string.find(tbuffs,"Holy Seals 3")) }
-- i=i+1; Skill[i] = { name = "Disarmament", use = ((not friendly) and (not bigparty) and (not string.find(tbuffs,"Disarmament IV"))) }
i=i+1; Skill[i] = { name = "Shock", use = ((not friendly) and string.find(tbuffs,"Light Seal III") and (arg2 == "shock")) }
i=i+1; Skill[i] = { name = "Punishment", use = ((not friendly) and string.find(tbuffs,"Light Seal III")) }
i=i+1; Skill[i] = { name = "Holy Strike", use = (not friendly) }
MyCombat(Skill,arg1)
end
|
Quoted from "Calico;272290"
List me the skills you want on it, and I'll give it a shot.
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function ScoutWarrior(arg1)
local Skill = {}
local i = 0
local friendly = (not UnitCanAttack("player","target"))
local rage = UnitMana("player")
local focus = UnitSkill("player")
local tbuffs = BuffList("target")
local tspell = UnitCastingTime("target")
i=i+1; Skill[i] = { ['name'] = "Frost Arrow", ['use'] = (not ChkBuff("player","Frost Arrow")) }
i=i+1; Skill[i] = { ['name'] = "Battle Instinct", ['use'] = (not ChkBuff("player","Battle Instinct") and (rage >= 30 ) }
i=i+1; Skill[i] = { ['name'] = "Berserk", ['use'] = (not ChkBuff("player","Berserk") and (rage >= 25 ) }
i=i+1; Skill[i] = { ['name'] = "Throat Attack", ['use'] = ((not friendly) and (tspell ~= nil)) }
i=i+1; Skill[i] = { ['name'] = "Enraged", ['use'] = (rage <= 50) }
i=i+1; Skill[i] = { ['name'] = "Combo Shot", ['use'] = (not friendly) }
i=i+1; Skill[i] = { ['name'] = "Vampire Arrows", ['use'] = ((not friendly) and (focus >= 20)) }
i=i+1; Skill[i] = { ['name'] = "Shot", ['use'] = (not friendly) }
i=i+1; Skill[i] = { ['name'] = "Wind Arrows", ['use'] = ((not friendly) and (focus >= 15)) }
i=i+1; Skill[i] = { ['name'] = "Slash", ['use'] = ((not friendly) and (rage >= 25)) }
MyCombat(Skill,arg1)
end
|
Quoted from "Mousekawitz;272276"
Haha, tried patching one together, ended up breaking it so bad it won't even read my class skills anymore, hahaa. Have to clear it out and redo it all.. Found a good warrior/scout function on page 4, still need s/w, which is mainly using berserk and the elites.
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
function ScoutWarrior(arg1, arg2)
local Skill = {}
local i = 0
local focus = UnitMana("player")
local rage = UnitSkill("player")
local friendly = (not UnitCanAttack("player", "target"))
local pbuffs = BuffList("player")
i=i+1; Skill[i] = { name = "Enraged", use = (rage <= 80) }
i=i+1; Skill[i] = { name = "Berserk", use = ((not string.find(pbuffs, "Berserk")) and (rage >= 25)) }
i=i+1; Skill[i] = { name = "Mental Focus", use = ((not string.find(pbuffs, "Mental Focus")) and (rage >= 30)) }
i=i+1; Skill[i] = { name = "Battle Instinct", use = ((not string.find(pbuffs, "Battle Instinct")) and (rage >= 30)) }
i=i+1; Skill[i] = { name = "Target Lock", use = ((not string.find(pbuffs, "Target Lock")) and (focus >= 30)) }
i=i+1; Skill[i] = { name = "Combo Shot", use = (not friendly) }
i=i+1; Skill[i] = { name = "Shot", use = (not friendly) }
i=i+1; Skill[i] = { name = "Piercing Arrow", use = ((not friendly) and (arg2 ~= "noPA")) }
-- i=i+1; Skill[i] = { name = "Vampire Arrows", use = ((not friendly) and (focus >= 20)) }
i=i+1; Skill[i] = { name = "Sapping Arrow", use = (not friendly) }
i=i+1; Skill[i] = { name = "Wind Arrows", use = ((not friendly) and (focus >= 15)) }
i=i+1; Skill[i] = { name = "Frost Arrow", use = ((not string.find(pbuffs, "Frost Arrow")) and (focus >= 50)) }
i=i+1; Skill[i] = { name = "Snipe", use = (not friendly) }
return MyCombat(Skill, arg1)
end
|
|
|
Source code |
1 |
/run ScoutWarrior() |
|
|
Source code |
1 |
/run ScoutWarrior("", "noPA")
|
Quoted from "Mousekawitz;272449"
Here's the shitty attempt I had, piecing together lines from a bunch of functions. It doesn't work, but it'll give you an idea of what I was trying to do maybe?
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function ScoutWarrior(arg1)
local Skill = {}
local i = 0
local friendly = (not UnitCanAttack("player", "target"))
local rage = UnitSkill("player")
local focus = UnitMana("player")
local tspell,ttime,telapsed = UnitCastingTime("target")
local pbuffs = BuffList("player")
local tbuffs = BuffList("target")
i=i+1; Skill[i] = { ['name'] = "Frost Arrow", ['use'] = (not string.find(pbuffs, "Frost Arrow")) }
i=i+1; Skill[i] = { ['name'] = "Battle Instinct", ['use'] = ((not string.find(pbuffs, "Battle Instinct")) and (rage >= 30 )) }
i=i+1; Skill[i] = { ['name'] = "Berserk", ['use'] = ((not string.find(pbuffs, "Berserk")) and (rage >= 25 )) }
i=i+1; Skill[i] = { ['name'] = "Throat Attack", ['use'] = ((not friendly) and (tspell ~= nil) and (ttime >= 1) and ((ttime - telapsed) > 0.5)) }
i=i+1; Skill[i] = { ['name'] = "Enraged", ['use'] = (rage <= 50) }
i=i+1; Skill[i] = { ['name'] = "Combo Shot", ['use'] = (not friendly) }
i=i+1; Skill[i] = { ['name'] = "Vampire Arrows", ['use'] = ((not friendly) and (focus >= 20)) }
i=i+1; Skill[i] = { ['name'] = "Shot", ['use'] = (not friendly) }
i=i+1; Skill[i] = { ['name'] = "Wind Arrows", ['use'] = ((not friendly) and (focus >= 15)) }
i=i+1; Skill[i] = { ['name'] = "Slash", ['use'] = ((not friendly) and (rage >= 25)) }
MyCombat(Skill,arg1)
end
|

Quoted from "Mousekawitz;272475"
So they'll only go off if usable, not run to the target as if I used that attack normally? That's perfect and better than what I had hoped![]()
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function WardenScout(arg1)
local Skill = {}
local i = 0
local tgt = "player"
local friendly = false
i=i+1; Skill[i] = { ['name'] = "Summon Spirit of the Oak", ['use'] = ((not ChkBuff("player", "Heart of the Oak") and (not combat)) }
i=i+1; Skill[i] = { ['name'] = "Heart of the Oak", ['use'] = (not ChkNuff("palyer", "Heart of the Oak)) }
i=i+1; Skill[i] = { ['name'] = "Submission", ['use'] = ((not pet)) }
i=i+1; Skill[i] = { ['name'] = "Chiron the Centaur", ['use'] = ((not pet)) }
MyCombat(Skill, arg1)
end
|
Quoted from "itsishy;272645"
Is there a way to check if I have a one handed equipped or two handed? I'm currently using two macros for my w/k depending on which weapons I'm using. It would be nice if I could just use one macro that "knows" which weapon I'm using and adjusts accordingly.
Also, Slash and Shadow Stab have the same dot name, "Bleed". Is there a way to work around this? Tactical will trigger from a rogues "Bleed" but it obviously wont hit twice as it does with the warrior "Bleed". I think they recently changed this because it was working properly for a while, but now it isn't.
Quoted from "Geistware;272790"
It seems to me that the developers continue to break the game when any add-on becomes popular. Normally an add-on becomes popular because it helps everyone to enjoy the game more. With this said, more wide spread use of the combat engine may force them to change the game in order to break the engine.

|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
-- DIY Combat Engine version 1.3.1
g_skill = {}
function Msg(outstr,a1,a2,a3)
DEFAULT_CHAT_FRAME:AddMessage(tostring(outstr),a1,a2,a3)
end
function ReadSkills()
g_skill = {}
local skillname,slot
Msg("- Reading Class Skills")
for page = 2,4 do
slot = 1
skillname = GetSkillDetail(page,slot)
repeat
local a1,a2,a3,a4,a5,a6,a7,a8,skillusable = GetSkillDetail(page,slot)
if skillusable then
g_skill[skillname] = { ['page'] = page, ['slot'] = slot }
end
slot = slot + 1
skillname = GetSkillDetail(page,slot)
until skillname == nil
end
end
ReadSkills() -- Read skills into g_skill table at login
function PctH(tgt)
return (UnitHealth(tgt)/UnitMaxHealth(tgt))
end
function PctM(tgt)
return (UnitMana(tgt)/UnitMaxMana(tgt))
end
function ChkBuff(tgt,buffname)
local cnt = 1
local buffcmd = UnitBuff
if UnitCanAttack("player",tgt) then
buffcmd = UnitDebuff
end
local buff = buffcmd(tgt,cnt)
while buff ~= nil do
if string.gsub(buff, "(%()(.)(%))", "%2") == buffname then
return true
end
cnt = cnt + 1
buff = buffcmd(tgt,cnt)
end
return false
end
function BuffList(tgt)
local cnt = 1
local buffcmd = UnitBuff
local buffstr = "/"
if UnitCanAttack("player",tgt) then
buffcmd = UnitDebuff
end
local buff = buffcmd(tgt,cnt)
while buff ~= nil do
buffstr = buffstr..buff.."/"
cnt = cnt + 1
buff = buffcmd(tgt,cnt)
end
return string.gsub(buffstr, "(%()(.)(%))", "%2")
end
function CD(skillname)
local firstskill = GetSkillDetail(2,1)
if (g_skill[firstskill] == nil) or (g_skill[firstskill].page ~= 2) then
ReadSkills()
end
if g_skill[skillname] ~= nil then
local tt,cd = GetSkillCooldown(g_skill[skillname].page,g_skill[skillname].slot)
return cd==0
elseif skillname == nil then
return false
else
Msg("Skill not available: "..skillname)
return false
end
end
function MyCombat(Skill, arg1)
local spell_name = UnitCastingTime("player")
local talktome = ((arg1 == "v1") or (arg1 == "v2"))
local action,actioncd,actiondef,actioncnt
if spell_name ~= nil then
if (arg1 == "v2") then Msg("- ['..spell_name..']", 0, 1, 1) end
return true
end
for x,tbl in ipairs(Skill) do
if Skill[x].use then
if string.find(Skill[x].name, "Action:") then
action = tonumber((string.gsub(Skill[x].name, "(Action:)( *)(%d+)(.*)", "%3")))
_1,actioncd = GetActionCooldown(action)
actiondef,_1,actioncnt = GetActionInfo(action)
if GetActionUsable(action) and (actioncd == 0) and (actiondef ~= nil) and (actioncnt > 0) then
if talktome then Msg("- "..Skill[x].name) end
UseAction(action)
return true
end
elseif string.find(Skill[x].name, "Item:") then
action = string.gsub(Skill[x].name, "(Item:)( *)(.*)", "%3")
if talktome then Msg("- "..Skill[x].name) end
UseItemByName(action)
return true
elseif CD(Skill[x].name) then
if talktome then Msg("- "..Skill[x].name) end
CastSpellByName(Skill[x].name)
return true
end
end
end
if (arg1 == "v2") then Msg("- [IDLE]", 0, 1, 1) end
return false
end
function ScoutPriest(arg1)
local Skill = {}
local i = 0
local focus = UnitMana("player")
local friendly = (not UnitCanAttack("player","target"))
-- i=i+1; Skill[i] = { name = "Frost Arrow", use = (not ChkBuff("player","Frost Arrow")) }
-- i=i+1; Skill[i] = { name = "Combo Shot", use = (not friendly) }
i=i+1; Skill[i] = { name = "Shot", use = (not friendly) }
-- i=i+1; Skill[i] = { name = "Piercing Arrow", use = (not friendly) }
-- i=i+1; Skill[i] = { name = "Vampire Arrows", use = ((not friendly) and (focus >= 20)) }
i=i+1; Skill[i] = { name = "Wind Arrows", use = ((not friendly) and (focus >= 15)) }
-- i=i+1; Skill[i] = { name = "Snipe", use = (not friendly) }
i=i+1; Skill[i] = { name = "Urgent Heal", use = (health <= .50) }
i=i+1; Skill[i] = { name = "Regenerate", use = ((health <= .95) and (not string.find(buffs, "Regenerate"))) }
MyCombat(Skill,arg1)
end
|
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
-- DIY Combat Engine version 1.3.1
g_skill = {}
function Msg(outstr,a1,a2,a3)
DEFAULT_CHAT_FRAME:AddMessage(tostring(outstr),a1,a2,a3)
end
function ReadSkills()
g_skill = {}
local skillname,slot
Msg("- Reading Class Skills")
for page = 2,4 do
slot = 1
skillname = GetSkillDetail(page,slot)
repeat
local a1,a2,a3,a4,a5,a6,a7,a8,skillusable = GetSkillDetail(page,slot)
if skillusable then
g_skill[skillname] = { ['page'] = page, ['slot'] = slot }
end
slot = slot + 1
skillname = GetSkillDetail(page,slot)
until skillname == nil
end
end
ReadSkills() -- Read skills into g_skill table at login
function PctH(tgt)
return (UnitHealth(tgt)/UnitMaxHealth(tgt))
end
function PctM(tgt)
return (UnitMana(tgt)/UnitMaxMana(tgt))
end
function ChkBuff(tgt,buffname)
local cnt = 1
local buffcmd = UnitBuff
if UnitCanAttack("player",tgt) then
buffcmd = UnitDebuff
end
local buff = buffcmd(tgt,cnt)
while buff ~= nil do
if string.gsub(buff, "(%()(.)(%))", "%2") == buffname then
return true
end
cnt = cnt + 1
buff = buffcmd(tgt,cnt)
end
return false
end
function BuffList(tgt)
local cnt = 1
local buffcmd = UnitBuff
local buffstr = "/"
if UnitCanAttack("player",tgt) then
buffcmd = UnitDebuff
end
local buff = buffcmd(tgt,cnt)
while buff ~= nil do
buffstr = buffstr..buff.."/"
cnt = cnt + 1
buff = buffcmd(tgt,cnt)
end
return string.gsub(buffstr, "(%()(.)(%))", "%2")
end
function CD(skillname)
local firstskill = GetSkillDetail(2,1)
if (g_skill[firstskill] == nil) or (g_skill[firstskill].page ~= 2) then
ReadSkills()
end
if g_skill[skillname] ~= nil then
local tt,cd = GetSkillCooldown(g_skill[skillname].page,g_skill[skillname].slot)
return cd==0
elseif skillname == nil then
return false
else
Msg("Skill not available: "..skillname)
return false
end
end
function MyCombat(Skill, arg1)
local spell_name = UnitCastingTime("player")
local talktome = ((arg1 == "v1") or (arg1 == "v2"))
local action,actioncd,actiondef,actioncnt
if spell_name ~= nil then
if (arg1 == "v2") then Msg("- ['..spell_name..']", 0, 1, 1) end
return true
end
for x,tbl in ipairs(Skill) do
if Skill[x].use then
if string.find(Skill[x].name, "Action:") then
action = tonumber((string.gsub(Skill[x].name, "(Action:)( *)(%d+)(.*)", "%3")))
_1,actioncd = GetActionCooldown(action)
actiondef,_1,actioncnt = GetActionInfo(action)
if GetActionUsable(action) and (actioncd == 0) and (actiondef ~= nil) and (actioncnt > 0) then
if talktome then Msg("- "..Skill[x].name) end
UseAction(action)
return true
end
elseif string.find(Skill[x].name, "Item:") then
action = string.gsub(Skill[x].name, "(Item:)( *)(.*)", "%3")
if talktome then Msg("- "..Skill[x].name) end
UseItemByName(action)
return true
elseif CD(Skill[x].name) then
if talktome then Msg("- "..Skill[x].name) end
CastSpellByName(Skill[x].name)
return true
end
end
end
if (arg1 == "v2") then Msg("- [IDLE]", 0, 1, 1) end
return false
end
function ScoutPriest(arg1)
local Skill = {}
local i = 0
local focus = UnitMana("player")
local friendly = (not UnitCanAttack("player","target"))
-- i=i+1; Skill[i] = { name = "Frost Arrow", use = (not ChkBuff("player","Frost Arrow")) }
-- i=i+1; Skill[i] = { name = "Combo Shot", use = (not friendly) }
i=i+1; Skill[i] = { name = "Shot", use = (not friendly) }
-- i=i+1; Skill[i] = { name = "Piercing Arrow", use = (not friendly) }
-- i=i+1; Skill[i] = { name = "Vampire Arrows", use = ((not friendly) and (focus >= 20)) }
i=i+1; Skill[i] = { name = "Wind Arrows", use = ((not friendly) and (focus >= 15)) }
-- i=i+1; Skill[i] = { name = "Snipe", use = (not friendly) }
i=i+1; Skill[i] = { name = "Urgent Heal", use = (health <= .50) }
i=i+1; Skill[i] = { name = "Regenerate", use = ((health <= .95) and (not string.find(buffs, "Regenerate"))) }
MyCombat(Skill,arg1)
end
|
|
|
Source code |
1 2 |
local health = PctH("player")
local buffs = BuffList("player")
|