vanilla-wow-addons – Rev 1
?pathlinks?
DYKey = nil;
local pre_UseAction;
DYVar = { init, attack, once, combat, hate, shot = true, crazy = true, cast = true, target, dead, friend, yellow, class, mount, buff, debuff, use = true, aiminit, dk = true, invul = true, panic, usetimer = 0; };
function DefendYourself_OnLoad()
SlashCmdList["DEFENDSLASH"] = DefendYourself_Main_ChatCommandHandler;
SLASH_DEFENDSLASH1 = "/defendyourself";
SLASH_DEFENDSLASH2 = "/dy";
this:RegisterEvent("VARIABLES_LOADED");
this:RegisterEvent("PLAYER_ENTER_COMBAT");
this:RegisterEvent("PLAYER_LEAVE_COMBAT");
this:RegisterEvent("PLAYER_REGEN_ENABLED");
this:RegisterEvent("PLAYER_REGEN_DISABLED");
this:RegisterEvent("PLAYER_TARGET_CHANGED");
this:RegisterEvent("START_AUTOREPEAT_SPELL");
this:RegisterEvent("STOP_AUTOREPEAT_SPELL");
this:RegisterEvent("PLAYER_CONTROL_LOST");
this:RegisterEvent("PLAYER_CONTROL_GAINED");
this:RegisterEvent("SPELLCAST_START");
this:RegisterEvent("SPELLCAST_STOP");
this:RegisterEvent("INSTANCE_BOOT_START");
this:RegisterEvent("INSTANCE_BOOT_STOP");
this:RegisterEvent("UI_ERROR_MESSAGE");
this:RegisterEvent("CHAT_MSG_COMBAT_PARTY_HITS");
this:RegisterEvent("CHAT_MSG_COMBAT_PARTY_MISSES");
this:RegisterEvent("CHAT_MSG_COMBAT_CREATURE_VS_PARTY_HITS");
this:RegisterEvent("CHAT_MSG_COMBAT_CREATURE_VS_PARTY_MISSES");
this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS");
this:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_SELF");
end
function UUIToggleDY()
if( DYmenu:IsVisible() ) then
DYmenu:Hide();
else
DYmenu:Show();
end
end
function DY_RegisterUltimateUI()
if(UltimateUI_RegisterButton) then
UltimateUI_RegisterButton (
"DefendYourself",
"Options",
"|cFF00CC00DefendYourself|r\nHelps with automated combat actions such as\nauto-attacking, ignoring enemies with debuffs like\nsheep, etc.",
"Interface\\Icons\\Ability_Defend",
UUIToggleDY
);
end
end
function DefendYourself_OnEvent(event, arg1, arg2, arg3)
if (not DYVar.class and UnitClass("player")) then
local _, tempclassname = UnitClass("player");
DYVar.class = strlower(tempclassname);
end
if event == "VARIABLES_LOADED" then
DYVar.init = true;
DefendYourself_UnitSave();
DY_RegisterUltimateUI();
if(myAddOnsList) then
myAddOnsList.DefendYourself = {name = DEFEND_CONFIG_HEADER, description = DEFEND_CONFIG_HEADER_INFO, version = DEFEND_CONFIG_VERSION, category = MYADDONS_CATEGORY_COMBAT, frame = "DefendYourselfFrame", optionsframe = "DYmenu"};
end
if not DYKey.On and DYKey.ReOn then DYKey.On = true; DYKey.ReOn = nil; elseif DYKey.ReOn then DYKey.ReOn = nil; end
elseif DYKey and DYKey.On then
if DYturn_Event then DYturn_Event(event, arg1, arg2, arg3); end
if event == "PLAYER_TARGET_CHANGED" then
DYVar.once = true;
elseif event == "PLAYER_ENTER_COMBAT" then
DYVar.combat = true;
elseif event == "PLAYER_LEAVE_COMBAT" then
DYVar.combat = nil;
if DYVar.attack then DYVar.once = true; end
elseif event == "PLAYER_REGEN_ENABLED" or event == "INSTANCE_BOOT_START" or event == "INSTANCE_BOOT_STOP" then
if not DYKey.Safe then DYVar.hate = nil; end
elseif event == "PLAYER_REGEN_DISABLED" then
DYVar.hate = true;
elseif event == "START_AUTOREPEAT_SPELL" then
DYVar.shot = nil;
elseif event == "STOP_AUTOREPEAT_SPELL" then
DYVar.shot = true;
elseif event == "PLAYER_CONTROL_LOST" then
DYVar.crazy = nil;
elseif event == "PLAYER_CONTROL_GAINED" then
if not DYVar.crazy then
TargetLastEnemy();
end
DYVar.crazy = true;
elseif event == "SPELLCAST_START" then
DYVar.spell = nil;
elseif event == "SPELLCAST_STOP" then
DYVar.spell = true;
if not DYVar.aiminit then
if DYVar.class and strfind(DYVar.class, "hunter") or strfind(DYVar.class, "rogue") then
pre_UseAction = UseAction;
UseAction = DefendYourself_checkUse;
end
DYVar.aiminit = true;
end
if not DYVar.combat and not DYVar.once then DYVar.once = true; end
elseif event == "UI_ERROR_MESSAGE" then
if (arg1 == ERR_NO_ATTACK_TARGET or arg1 == ERR_INVALID_ATTACK_TARGET) then
DYVar.target = nil;
DYVar.once = nil;
elseif (arg1 == ERR_WRONG_DIRECTION_FOR_ATTACK or arg1 == ERR_BADATTACKFACING) then
DYVar.once = nil;
elseif (arg1 == SPELL_FAILED_TOO_CLOSE) then
DYVar.use = true;
DYVar.shot = true;
end
elseif event == "CHAT_MSG_COMBAT_PARTY_HITS" or event == "CHAT_MSG_COMBAT_PARTY_MISSES" then
if DefendYourself_Panic and DefendYourself_Panic(0) then return; end
if DYKey.Assist then
local pname;
for i = 1, GetNumPartyMembers() do
if (strfind(arg1, UnitName("party"..i))) then
pname = i;
break;
end
end
if pname and not UnitExists("target") and DYVar.buff then
TargetUnit("party"..pname.."target");
end
end
elseif event == "CHAT_MSG_COMBAT_CREATURE_VS_PARTY_HITS" or event == "CHAT_MSG_COMBAT_CREATURE_VS_PARTY_MISSES" then
if DefendYourself_Panic and DefendYourself_Panic(0) then return; end
if DYKey.Assist then
local index = strfind(arg1, "hits");
if index and not UnitExists("target") and DYVar.buff then
local command = strsub(arg1, 1, index-2);
TargetByName(command);
if (UnitIsDead("target")) then
TargetNearestEnemy();
end
end
end
elseif event == "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS" and arg1 == "You gain Self Invulnerability." then
DYVar.invul = nil;
elseif event == "CHAT_MSG_SPELL_AURA_GONE_SELF" and arg1 == "Self Invulnerability fades from you." then
DYVar.invul = true;
end
DefendYourself_Check();
DefendYourself_Trip();
end
end
function DefendYourself_checkUse(arg1, arg2, arg3)
if (GetActionText(arg1)) then
local a, b, c = GetMacroInfo(GetMacroIndexByName(GetActionText(arg1)));
if c and (strfind(strlower(c), "aimed shot")) then
DYVar.use = nil;
elseif c and ((strfind(strlower(c), strlower(DefendYourself_noattack[1])) or strfind(strlower(c), strlower(DefendYourself_noattack[2])) or strfind(strlower(c), strlower(DefendYourself_noattack[13])))) then
DYVar.use = nil;
end
end
local tex = GetActionTexture(arg1);
if tex == "Interface\\Icons\\INV_Spear_07" or tex == "Interface\\Icons\\Ability_Gouge" or tex == "Interface\\Icons\\Ability_Sap" or tex == "Interface\\Icons\\Spell_Shadow_MindSteal" then
DYVar.use = nil;
end
if not DYVar.use then
DYVar.attack = nil;
DYVar.once = nil;
DYVar.usetimer = 3
end
pre_UseAction(arg1,arg2,arg3);
end
function DefendYourself_OnUpdate(elapsed)
if not DYKey or not DYKey.On then DYStuff:Hide(); DefendYourselfFrame:EnableMouse(0); DefendYourselfFrame:SetBackdropColor(0,0,0,0); DefendYourselfFrame:SetBackdropBorderColor(0,0,0,0); return end
if DYKey.On then
if DYturn_Update then DYturn_Update(elapsed); end
if DefendYourself_Panic and DefendYourself_Panic(elapsed) then return; end
if DYVar.usetimer > 1 then DYVar.usetimer = DYVar.usetimer - elapsed; return; elseif DYVar.usetimer > 0 and not DYVar.use then DYVar.use = true; DYVar.usetimer = 0 return; end
DY_MoneyToggle();
DefendYourself_buff();
if DYKey.Debuff then DefendYourself_debuff(); else DYVar.debuff = true; end
DefendYourself_DK();
DY_MoneyToggle();
DefendYourself_Check();
if DYKey.Safe then DefendYourself_GetBloody(); end
DefendYourself_Trip();
DefendYourself_Attack();
DefendYourself_Stuff();
end
end
function DefendYourself_Check()
if UnitExists("target") then DYVar.target = true; else DYVar.target = nil; end
if UnitIsDead("target") then DYVar.dead = nil; else DYVar.dead = true; end
if UnitCanAttack("player", "target") then DYVar.friend = true; else DYVar.friend = nil; end
if DYKey.Yellow then DefendYourself_Yellow(); else DYVar.yellow = true; end
if DYKey.Faction then DefendYourself_Faction(); else DYVar.faction = true; end
end
function DefendYourself_Yellow()
if UnitIsEnemy("target", "player") then
DYVar.yellow = true;
elseif not UnitIsFriend("target", "player") and UnitExists("target") then
DYVar.yellow = nil;
else
DYVar.yellow = true;
end
end
function DefendYourself_Stuff()
if DYKey.Debug then
DYStuff:Show();
DefendYourselfFrame:EnableMouse(1);
DefendYourselfFrame:SetBackdropColor(0,0,0,0.5);
DefendYourselfFrame:SetBackdropBorderColor(1,1,1,1);
DYStuff:SetText("Attacking:"..dycol(DYVar.attack).."\nNeed to attack:"..dycol(DYVar.once).."\nIn Combat:"..dycol(DYVar.combat).."\nOn Hate List:"..dycol(DYVar.hate)
.."\nNot Shooting:"..dycol(DYVar.shot).."\nNot Crazy:"..dycol(DYVar.crazy).."\nNot Casting:"..dycol(DYVar.cast).."\nHave a Target?:"..dycol(DYVar.target)
.."\nIt's not Dead?:"..dycol(DYVar.dead).."\nNot a Friend?:"..dycol(DYVar.friend).."\nNot Unhostile/Yellow?:"..dycol(DYVar.yellow).."\nOn a Mount?:"..dycol(DYVar.mount)
.."\nNo special Buffs?:"..dycol(DYVar.buff).."\nNo Debuffs on it?:"..dycol(DYVar.debuff).."\nNot using a certain skill?:"..dycol(DYVar.use));
else
DYStuff:Hide();
DefendYourselfFrame:EnableMouse(0);
DefendYourselfFrame:SetBackdropColor(0,0,0,0);
DefendYourselfFrame:SetBackdropBorderColor(0,0,0,0);
end
end
function DefendYourself_Faction()
if UnitIsPlayer("target") and UnitFactionGroup("target") ~= UnitFactionGroup("player") then
if UnitIsPVP("player") and UnitIsPVP("target") then
DYVar.faction = true;
else
DYVar.faction = nil;
end
else
DYVar.faction = true;
end
end
function DefendYourself_Trip()
if DYVar.hate and DYVar.target then
if DYVar.shot and DYVar.crazy and DYVar.dead and DYVar.friend and DYVar.yellow and DYVar.buff and DYVar.debuff and DYVar.dk and not DYVar.mount and DYVar.invul and DYVar.use then
DYVar.attack = true;
else
DYVar.attack = nil;
end
else
DYVar.attack = nil;
end
end
--Handles all the lovely person-related saves. Yeah, saved by player name and server. T.T thx rowne!
function DefendYourself_UnitSave(x)
if (DYVar.init) then
local info = UnitName("player").." of "..GetCVar("realmName");
--[[ if (x == 1) then
info = Fetch_PlayerInfo;
end]]
local _, tempclassname = UnitClass("player");
DYVar.class = strlower(tempclassname);
if not DefendYourselfKey or not DefendYourselfKey.Version then
DefendYourselfKey = {};
DefendYourselfKey.Version = DEFEND_CONFIG_VERSION;
elseif DefendYourselfKey.Version ~= DEFEND_CONFIG_VERSION then
DefendYourselfKey.Version = DEFEND_CONFIG_VERSION;
end
if DefendYourselfKey.default then
info = "Default Class";
end
if (not DefendYourselfKey[info]) then
DefendYourselfKey[info] = {
["On"] = true,
["ReOn"] = nil,
["Yellow"] = true,
["Faction"] = true,
["Debuff"] = true,
["HP"] = nil,
["Safe"] = nil,
["Assist"] = true,
["Civilian"] = true,
["Debug"] = nil,
["PanicTimer"] = 30,
["PanicTime"] = 0,
["Bar"] = 1,
["blvl"] = 1
};
end
DYKey = DefendYourselfKey[info];
-- DefendYourself_Fetch_Frame:Hide();
-- DefendYourself_Print("Defend Yourself! v."..DEFEND_CONFIG_VERSION.." is Loaded and "..dycol(DYKey.On));
end
end
function DefendYourself_Print(msg,r,g,b,frame,id)
if ( Print ) then
Print(msg, r, g, b, frame, id);
return;
end
if (not r) then r = 1.0; end
if (not g) then g = 1.0; end
if (not b) then b = 0.0; end
if ( frame ) then
frame:AddMessage(msg,r,g,b,id);
else
if ( DEFAULT_CHAT_FRAME ) then
DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b,id);
end
end
end
function DefendYourself_Toggle(tog, str)
if tog then
DefendYourself_Print(str.." |CFFFF0000Off|r");
return nil;
else
DefendYourself_Print(str.." |CFF00FF00On|r");
return true;
end
end
function DefendYourself_Main_ChatCommandHandler(msg)
local msg = TextParse(msg);
msg[1] = strlower(msg[1])
if strfind(msg[1], "toggle") then
DYKey.On = DefendYourself_Toggle(DYKey.On, "DefendYourself! is");
elseif strfind(msg[1], "defaultprofile") then
DefendYourselfKey.default = DefendYourself_Toggle(DefendYourselfKey.default, "Using an overall profile is");
elseif strfind(msg[1], "yellow") then
DYKey.Yellow = DefendYourself_Toggle(DYKey.Yellow, "Ignoring Yellow Creatures is");
elseif strfind(msg[1], "faction") then
DYKey.Faction = DefendYourself_Toggle(DYKey.Faction, "Ignoring Faction Members is");
elseif strfind(msg[1], "debuff") then
DYKey.Debuff = DefendYourself_Toggle(DYKey.Debuff, "Ignoring debuffed creatures is");
elseif strfind(msg[1], "tlhp") then
DefendYourself_tlhp();
DefendYourself_Print("Aquiring target with lowest hp...",1,1,1);
elseif strfind(msg[1], "blood") then
DYKey.Safe = DefendYourself_Toggle(DYKey.Safe, "Bloodlust is");
DYVar.hate = nil;
elseif strfind(msg[1], "blvl") then
local x = tonumber(msg[2])
if x and x >= 0 and x <= 3 then DYKey.blvl = x; else DefendYourself_Print("What level is that?"); end
if x == 0 then
DefendYourself_Print("|CFFFFFFFFCurrent level is 0. As good as having the toggle off. Snore!|r");
elseif x == 1 then
DefendYourself_Print("|CFFFFFF00Current level is 1. Standard. You'll autoattack stuff you target, only if it meets the right criteria. Kinda bloody.|r");
elseif x == 2 then
DefendYourself_Print("|CFFFF8800Current level is 2. Yeep. You'll find and attack anything that comes across your path, but only if it meets your high standards. Only dining on virgin blood tonight, sir?|r");
elseif x == 3 then
DefendYourself_Print("|CFFFF0000OH CRAP CURRENT LEVEL IS 3!! RIP AND TEAR AND RIP AND TEAR YOUR GUTS! YOU ARE HUGE! THAT MEANS YOU HAVE HUGE GUTS! HERE IT COMES! BLOODY RAGE!!|r (Sanity: You'll target anything in your range if you have no target, and you'll beat on it indiscriminantly!! careful of faction and DK's!)",1,1,1);
end
elseif strfind(msg[1], "assist") then
DYKey.Assist = DefendYourself_Toggle(DYKey.Assist, "Smart Assist is");
elseif strfind(msg[1], "debug") then
DYKey.Debug = DefendYourself_Toggle(DYKey.Debug, "Debug options are");
elseif strfind(msg[1], "dk") then
DYKey.Civilian = DefendYourself_Toggle(DYKey.Civilian, "Dishonorable Kill Prevention is");
elseif strfind(msg[1], "help") then
DefendYourself_Help();
elseif strfind(msg[1], "menu") and DYmenu then
DYmenu:Show();
elseif strfind(msg[1], "button") then
if DefendYourselfPanicButtonClick then
if msg[2] == "off" then DYKey.PanicState = 5 else DefendYourselfPanicButtonClick(); end
end
elseif strfind(msg[1], "bar") then
if DefendYourselfBar then
if msg[2] == "off" then DYKey.Bar = nil; elseif not DYKey.Bar then DYKey.Bar = 1; elseif DYKey.Bar == 1 then DYKey.Bar = 2; elseif DYKey.Bar == 2 then DYKey.Bar = nil; end
end
elseif strfind(msg[1], "defaultpanic") then
DYKey.PanicTimer = tonumber(msg[2]);
elseif strfind(msg[1], "panic") then
if DefendYourself_StartPanic then DefendYourself_StartPanic(tonumber(msg[2])); end
elseif strfind(msg[1], "turn") then
if DefendYourself_Turn then DYKey.Turn = DefendYourself_Toggle(DYKey.Turn, "Turn functionability is"); end
elseif strfind(msg[1], "on") then
DefendYourself_Print("DefendYourself! is on"); DYKey.On = true; DYKey.ReOn = nil;
elseif strfind(msg[1], "off") then
local output = "DefendYourself! is off"
if msg[2] and strfind(msg[2], "s") then
output = output.." and will be restarted on your next reload";
DYKey.ReOn = true;
end
DefendYourself_Print(output);
DYKey.On = nil;
else
if DYmenu then DYmenu:Show(); else
DefendYourself_Print(DEFEND_CHAT_COMMAND_USAGE,1,1,0);
DefendYourself_Help();
end
end
msg = nil;
end
function DefendYourself_Help()
DefendYourself_Print("Defend Yourself! v."..DEFEND_CONFIG_VERSION.." Parameters and their states");
DefendYourself_Print("Toggle is:"..dycol(DYKey.On));
DefendYourself_Print("Yellow is:"..dycol(DYKey.Yellow));
DefendYourself_Print("Faction is:"..dycol(DYKey.Faction));
DefendYourself_Print("Debuff is:"..dycol(DYKey.Debuff));
DefendYourself_Print("Bloodlust is:"..dycol(DYKey.Safe));
DefendYourself_Print("DK Prevention is:"..dycol(DYKey.Civilian));
DefendYourself_Print("Assist is:"..dycol(DYKey.Assist));
DefendYourself_Print("Using Default profiles is:"..dycol(DefendYourselfKey.default));
DefendYourself_Print("Use /dy help to see this, /dy on turns it on, /dy off turns it off, and /dy toggle turns it between the two. /dy menu handles the menu! /dy defaultprofile toggles using an overall profile or a per-character-per-server profile.");
end
function dycol(tog)
if tog then
return "|CFF00FF00Yes|r";
else
return "|CFFFF0000No|r";
end
end
function TextParse(InputString)
--[[ By FERNANDO!
This function should take a string and return a table with each word from the string in
each entry. IE, "Linoleum is teh awesome" returns {"Linoleum", "is", "teh", "awesome"}
Some good should come of this, I've been avoiding writing a text parser for a while, and
I need one I understand completely. ^_^
If you want to gank this function and use it for whatever, feel free. Just give me props
somewhere. This function, as far as I can tell, is fairly foolproof. It's hard to get it
to screw up. It's also completely self-contained. Just cut and paste.]]
local Text = InputString;
local TextLength = 1;
local OutputTable = {};
local OTIndex = 1;
local StartAt = 1;
local StopAt = 1;
local TextStart = 1;
local TextStop = 1;
local TextRemaining = 1;
local NextSpace = 1;
local Chunk = "";
local Iterations = 1;
local EarlyError = false;
if ((Text ~= nil) and (Text ~= "")) then
-- ... Yeah. I'm not even going to begin without checking to make sure Im not getting
-- invalid data. The big ol crashes I got with my color functions taught me that. ^_^
-- First, it's time to strip out any extra spaces, ie any more than ONE space at a time.
while (string.find(Text, " ") ~= nil) do
Text = string.gsub(Text, " ", " ");
end
-- Now, what if text consisted of only spaces, for some ungodly reason? Well...
if (string.len(Text) <= 1) then
EarlyError = true;
end
-- Now, if there is a leading or trailing space, we nix them.
if EarlyError ~= true then
TextStart = 1;
TextStop = string.len(Text);
if (string.sub(Text, TextStart, TextStart) == " ") then
TextStart = TextStart+1;
end
if (string.sub(Text, TextStop, TextStop) == " ") then
TextStop = TextStop-1;
end
Text = string.sub(Text, TextStart, TextStop);
end
-- Finally, on to breaking up the goddamn string.
OTIndex = 1;
TextRemaining = string.len(Text);
while (StartAt <= TextRemaining) and (EarlyError ~= true) do
-- NextSpace is the index of the next space in the string...
NextSpace = string.find(Text, " ",StartAt);
-- if there isn't another space, then StopAt is the length of the rest of the
-- string, otherwise it's just before the next space...
if (NextSpace ~= nil) then
StopAt = (NextSpace - 1);
else
StopAt = string.len(Text);
LetsEnd = true;
end
Chunk = string.sub(Text, StartAt, StopAt);
OutputTable[OTIndex] = Chunk;
OTIndex = OTIndex + 1;
StartAt = StopAt + 2;
end
else
OutputTable[1] = "Error: Bad value passed to TextParse!";
end
if (EarlyError ~= true) then
return OutputTable;
else
return {"Error: Bad value passed to TextParse!"};
end
end
local lOriginal_GameTooltip_ClearMoney;
function DY_MoneyToggle()
if( lOriginal_GameTooltip_ClearMoney ) then
GameTooltip_ClearMoney = lOriginal_GameTooltip_ClearMoney;
lOriginal_GameTooltip_ClearMoney = nil;
else
lOriginal_GameTooltip_ClearMoney = GameTooltip_ClearMoney;
GameTooltip_ClearMoney = DY_GameTooltip_ClearMoney;
end
end
function DY_GameTooltip_ClearMoney()
end
--[[This is similar to the above, but it checks your current buffs.
(List:DefendYourself_selfbuff)
returns true if it finds a buff that will get removed if you attack something(like stealth)
For reference, this one is run all the time, the previous one only runs if you have
debuff support toggled on.]]
function DefendYourself_buff()
local pow = 0;
DYVar.mount = nil;
DefendYourselfTip:ClearLines();
for i = 1, getn(DefendYourself_selfbuff), 1 do
if pow == 1 then break; end
local j = 1;
while UnitBuff("player", j) do
DefendYourselfTip:SetUnitBuff("player", j);
local msg = DefendYourselfTipTextLeft1:GetText();
local texture = UnitBuff("player", j);
if (string.find(texture,"Spell_Nature_Swiftness") or -- Summon Felsteed, Summon Warhorse
string.find(texture,"Ability_Mount") or string.find(texture,"INV_Misc_Foot_Kodo")) then
DYVar.mount = true;
end
if (msg == DefendYourself_selfbuff[i]) then
pow = 1;
break;
end
j = j + 1;
end
end
if pow == 0 then
if (not DYVar.buff) then
DYVar.buff = true;
DYVar.once = true;
end
elseif pow == 1 then
if DYVar.buff then
DYVar.buff = nil;
DYVar.once = nil;
end
end
end
function DefendYourself_debuff()
local pow = 0;
DefendYourselfTip:ClearLines();
for i = 1, getn(DefendYourself_noattack), 1 do
if pow == 1 then break; end
local j = 1;
while UnitDebuff("target", j) do
DefendYourselfTip:SetUnitDebuff("target", j);
local msg = DefendYourselfTipTextLeft1:GetText();
if (msg == DefendYourself_noattack[i]) then
pow = 1;
break;
end
j = j + 1;
end
end
if pow == 0 then
if (not DYVar.debuff) then
DYVar.debuff = true;
DYVar.once = true;
DYVar.use = true;
end
elseif pow == 1 then
if DYVar.debuff then
DYVar.debuff = nil;
DYVar.once = nil;
end
end
end
function DefendYourself_DK()
DefendYourselfTip:ClearLines();
DefendYourselfTip:SetUnit("target");
DYVar.dk = true;
for i = 1, 6 do
local msg = tostring(getglobal("DefendYourselfTipTextLeft"..i):GetText());
if strfind(msg, "Civilian") then
DYVar.dk = nil;
break;
end
end
end
local escapetlhp = nil;
function DefendYourself_tlhp()
if escapetlhp and escapetlhp > GetTime() then return; end
escapetlhp = GetTime()+5;
local maxHP, curHP, retry;
maxHP = 101;
retry = 0;
if UnitExists("target") then maxHP = UnitHealth("target"); end
TargetNearestEnemy();
curHP = UnitHealth("target");
while (curHP ~= maxHP and UnitExists("target") and retry <= 10) do
if (curHP < maxHP) then
maxHP = curHP;
retry = 0;
else
retry = retry + 1;
end
TargetNearestEnemy();
if UnitExists("target") then curHP = UnitHealth("target"); end
end
DY_MoneyToggle();
DefendYourself_debuff();
DY_MoneyToggle();
DefendYourself_Check();
DefendYourself_Trip();
if not DYVar.attack or (UnitIsTapped("target") and not UnitIsTappedByPlayer("target")) then ClearTarget(); end
escapetlhp = nil;
end
function DefendYourself_Attack()
if DYKey.On then
if DYVar.attack then
DYBattle();
else
DYEscape();
end
end
end
function DYBattle()
if DYVar.once then
if DYVar.combat then
DYVar.once = nil;
else
AttackTarget();
DYVar.once = nil;
end
end
end
function DYEscape()
if not DYVar.crazy and not UnitOnTaxi("player") then return; end
if DYVar.combat and (not DYVar.buff or not DYVar.debuff) then AttackTarget(); DYVar.once = nil; return; end
end
function DefendYourself_GetBloody()
--I apologize in advance. I couldn't help myself. lol!
--(rage3 level indicator stolen from the doom comic. HERE COMES THE NIGHT TRAIN!)
if not DYKey.blvl then DYKey.blvl = 1; end
if DYKey.blvl == 0 then
return;
elseif DYKey.blvl == 1 then
DYVar.hate = true;
elseif DYKey.blvl == 2 then
DYVar.hate = true;
if not UnitExists("target") then TargetNearestEnemy(); end
elseif DYKey.blvl == 3 then
DYVar.hate = true;
DYVar.yellow = true;
DYVar.debuff = true;
DYVar.faction = true;
if not UnitExists("target") then TargetNearestEnemy(); end
end
end
Generated by GNU Enscript 1.6.5.90.