📄 sheepwatch.lua
字号:
-- The idea of SheepWatch is orginally based on StunWatch by Vector.---- The actual version got a rewrite in all relevant parts by-- Andreas 'zapi' Broecking (Asmodean on Turalyon & Ania on Darksorrow)---- Credits:-- I hereby want to thank the authors of StunWatch, CastTime, MezHelper-- and CTRA for some hints I got from their codes. The first version of-- SheepWatch was released by Veighflo who resigned from developing it-- after version 1.5---- Version: 11000.1-- Date: 2006-03-38---------------------------------------------------------- myAddOns support--------------------------------------------------------SheepWatchDetails = { name = "SheepWatch", version = "11000.1", releaseDate = "March 28, 2006", author = "zapi", email = "wow@gzipped.org", website = "http://www.curse-gaming.com/", category = MYADDONS_CATEGORY_CLASS, optionsframe = "SheepWatchConfig"};SheepWatchHelp = {};---------------------------------------------------------- Initialization functions--------------------------------------------------------function SheepWatch_OnLoad() SheepWatch_Initialize(); SheepWatch_EventRegister();endfunction SheepWatch_Initialize() SLASH_SHEEPWATCH1 = "/sheepwatch"; SLASH_SHEEPWATCH2 = "/sheep"; SLASH_SHEEPWATCH3 = "/sw"; SlashCmdList["SHEEPWATCH"] = function(msg) SheepWatch_SlashCommandHandler(msg); endend---------------------------------------------------------- Register the necessary UI API events.--------------------------------------------------------function SheepWatch_EventRegister()-- this:RegisterEvent("ADDON_LOADED"); this:RegisterEvent("PLAYER_LOGIN"); this:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE");-- this:RegisterEvent("UNIT_AURA"); this:RegisterEvent("CHAT_MSG_SPELL_BREAK_AURA"); this:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_OTHER");-- this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE");-- this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE");-- this:RegisterEvent("CHAT_MSG_COMBAT_HOSTILE_DEATH"); this:RegisterEvent("PLAYER_REGEN_ENABLED"); this:RegisterEvent("PLAYER_DEAD"); this:RegisterEvent("SPELLCAST_START"); this:RegisterEvent("SPELLCAST_STOP"); this:RegisterEvent("SPELLCAST_FAILED"); this:RegisterEvent("SPELLCAST_INTERUPTED"); this:RegisterEvent("PLAYER_TARGET_CHANGED"); this:RegisterEvent("VARIABLES_LOADED");end---------------------------------------------------------- DEBUG Logging--------------------------------------------------------function SheepWatch_DebugLog(message) message = GetTime() .. " " .. message; DEFAULT_CHAT_FRAME:AddMessage("SW LOG: " .. message); local nn = table.getn(SheepWatch_Log); SheepWatch_Log[nn+1] = message;end---------------------------------------------------------- Handler for /sheepwatch--------------------------------------------------------function SheepWatch_SlashCommandHandler(msg) local a, b, command = string.find( msg, "(%w+)" ); if( command == nil ) then SheepWatchConfig:Show(); return; else command = string.lower( msg ); end if( command == "unlock" ) then SHEEPWATCH.STATUS = 3; SheepWatch:Show(); SheepWatchCounterText:SetText( "00.0s" ); SheepWatchCounterText:Show(); DEFAULT_CHAT_FRAME:AddMessage(SHEEPWATCH_TEXT_UNLOCKED); elseif( command == "lock" ) then SHEEPWATCH.STATUS = 1; SheepWatch:Hide(); SheepWatchCounterText:Hide(); DEFAULT_CHAT_FRAME:AddMessage(SHEEPWATCH_TEXT_LOCKED); elseif( command == "clear" ) then local pn = UnitName("player"); if(pn ~= nil and pn ~= UNKNOWNBEING and pn ~= UKNOWNBEING and pn ~= UNKNOWNOBJECT) then SheepWatch_ClearProfile(); else DEFAULT_CHAT_FRAME:AddMessage("SheepWatch: " .. SHEEPWATCH_TEXT_WORLD_NOT_LOADED); end elseif( command == "resetpos" ) then SHEEPWATCH.ALPHA = 1; SheepWatch_Settings.alpha = SHEEPWATCH.ALPHA; SheepWatch:ClearAllPoints(); SheepWatch:SetPoint("CENTER", 0, 120); DEFAULT_CHAT_FRAME:AddMessage( SHEEPWATCH_TEXT_RESETPOS ); elseif( command == "status" ) then SheepWatch_PrintStatus(); elseif( command == "debug" ) then SHEEPWATCH.DEBUG = true; DEFAULT_CHAT_FRAME:AddMessage("SheepWatch: Debugging enabled for this session."); else SheepWatchConfig:Show(); endend---------------------------------------------------------- Event handling-- (Event handling rewritten and inspired by StunWatch)--------------------------------------------------------function SheepWatch_OnEvent(event) -- Don't do anything if SheepWatch isn't enabled if( SHEEPWATCH.STATUS == 0 and event ~= "PLAYER_LOGIN") then return end -- DEBUG --DEFAULT_CHAT_FRAME:AddMessage("SheepWatch: Event "..event); --SheepWatch_EventHandler[event](arg1, arg2, arg3, arg4, arg5); SheepWatch_EventHandler[event](arg1, arg2);endSheepWatch_EventHandler = {}SheepWatch_EventHandler["PLAYER_LOGIN"] = function() -- Register in myAddons if(myAddOnsFrame_Register) then myAddOnsFrame_Register(SheepWatchDetails, SheepWatchHelp); end -- Load the saved config SheepWatch_LoadVariables();endSheepWatch_EventHandler["VARIABLES_LOADED"] = function() SW_Register();endSheepWatch_EventHandler["UNIT_AURA"] = function() DEFAULT_CHAT_FRAME:AddMessage("UNIT_AURA triggered. Arg1: "..arg1);endSheepWatch_EventHandler["CHAT_MSG_SPELL_SELF_DAMAGE"] = function() local _, _, spell, mobname = string.find(arg1, SHEEPWATCH_EVENT_CAST); if ( (spell ~= nil) and (mobname ~= nil) and (not string.find(spell, SHEEPWATCH_SPELL)) and string.find(mobname, SHEEPWATCH_SPELL) ) then local temp = mobname; mobname = spell; spell = temp; end if( (mobname ~= nil and string.find(spell, SHEEPWATCH_SPELL) ) and ( UnitName("target") == mobname or ( SHEEPWATCH_TARGETCHANGED and SHEEPWATCH_POLYCASTED ) ) ) then SHEEPWATCH_TARGETCHANGED = nil; SHEEPWATCH_POLYCASTED = nil; -- DEBUG if( SHEEPWATCH.DEBUG ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug:\nEvent CHAT_MSG_SPELL_SELF_DAMAGE triggered\nArgument: " .. arg1); SheepWatch_DebugLog("Event CHAT_MSG_SPELL_SELF_DAMAGE triggered. Argument: " .. arg1); end -- END DEBUG if( SHEEPWATCH.VERBOSE ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch: 你对" .. mobname .. SHEEPWATCH_TEXT_ANNOUNCE_CAST .. SHEEPWATCH_SPELL .. "(" .. SHEEPWATCH.RANK .. ")。"); end if( SHEEPWATCH.ANNOUNCE and SHEEPWATCH.ANNOUNCE_TIME_ID == 2) then SheepWatch_SendAnnounce(mobname, UnitLevel("target")); end if( GetTime() > SHEEPWATCH.TIMER_END + 15 or mobname ~= SHEEPWATCH.MOBNAME ) then SHEEPWATCH.DIMINISH = 1; if( SHEEPWATCH.DEBUG ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug: Diminish set to: " .. SHEEPWATCH.DIMINISH); end end SHEEPWATCH.MOBNAME = mobname; SHEEPWATCH.PLAYER = UnitIsPlayer("target"); SHEEPWATCH.ACTIVE = 1; if( SHEEPWATCH.STATUS == 1 ) then SheepWatch:Show(); else SheepWatch_OnShow(); end endendSheepWatch_EventHandler["CHAT_MSG_SPELL_BREAK_AURA"] = function() local currentTime = GetTime(); local _, _, mobname, spell = string.find(arg1, SHEEPWATCH_EVENT_BREAK); if( (mobname ~= nil and string.find(spell, SHEEPWATCH_SPELL) ) and mobname == SHEEPWATCH.MOBNAME ) then if ( SHEEPWATCH_TARGETCHANGED and SHEEPWATCH_POLYCASTED ) then SHEEPWATCH_TARGETCHANGED = nil; SHEEPWATCH_POLYCASTED = nil; return end -- DEBUG if( SHEEPWATCH.DEBUG ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug:\nEvent CHAT_MSG_SPELL_BREAK_AURA triggered\nArgument: " .. arg1); end -- END DEBUG if( SHEEPWATCH.VERBOSE ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch: " .. mobname .. "的" .. SHEEPWATCH_TEXT_ANNOUNCE_BREAK); end SHEEPWATCH.TIMER_END = currentTime; if( SHEEPWATCH.PLAYER ) then SHEEPWATCH.DIMINISH = SHEEPWATCH.DIMINISH * 2; if( SHEEPWATCH.DEBUG ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug: Diminish set to: " .. SHEEPWATCH.DIMINISH); end end if( SHEEPWATCH.ACTIVE == 1 ) then SHEEPWATCH.ACTIVE = 0; end endendSheepWatch_EventHandler["CHAT_MSG_SPELL_AURA_GONE_OTHER"] = function() local currentTime = GetTime(); local _, spell, mobname = string.find(arg1, SHEEPWATCH_EVENT_FADE); if( (mobname ~= nil and string.find(spell, SHEEPWATCH_SPELL) ) and mobname == SHEEPWATCH.MOBNAME ) then -- DEBUG if( SHEEPWATCH.DEBUG ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug:\nEvent CHAT_MSG_SPELL_AURA_GONE_OTHER triggered\nArgument: " .. arg1); end -- END DEBUG if( SHEEPWATCH.VERBOSE ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch: " .. SHEEPWATCH_TEXT_ANNOUNCE_FADE .. mobname .. "身上消失了。"); end SHEEPWATCH.TIMER_END = currentTime; if( SHEEPWATCH.PLAYER ) then SHEEPWATCH.DIMINISH = SHEEPWATCH.DIMINISH * 2; if( SHEEPWATCH.DEBUG ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug: Diminish set to: " .. SHEEPWATCH.DIMINISH); end end if( SHEEPWATCH.ACTIVE == 1 ) then SHEEPWATCH.ACTIVE = 0; end endendSheepWatch_EventHandler["PLAYER_REGEN_ENABLED"] = function() -- DEBUG if( SHEEPWATCH.DEBUG ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug:\nEvent PLAYER_REGEN_ENABLED triggered"); end -- END DEBUG if( SHEEPWATCH.PLAYER and SHEEPWATCH.ACTIVE == 1 ) then -- DEBUG if( SHEEPWATCH.DEBUG ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug: Target is PLAYER. Not resetting.."); end -- END DEBUG -- Returning, as we most likely didn't leave combat return; end if( SHEEPWATCH.ACTIVE == 1 ) then SHEEPWATCH.ACTIVE = 0; SHEEPWATCH.TIMER_END = GetTime(); if( SHEEPWATCH.VERBOSE ) then DEFAULT_CHAT_FRAME:AddMessage( SHEEPWATCH_TEXT_ANNOUNCE_LEAVECOMBAT ); end endendSheepWatch_EventHandler["PLAYER_DEAD"] = function() -- DEBUG if( SHEEPWATCH.DEBUG ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug:\nEvent PLAYER_DEAD triggered"); end -- END DEBUG if( SHEEPWATCH.ACTIVE == 1 ) then SHEEPWATCH.ACTIVE = 0; SHEEPWATCH.TIMER_END = GetTime(); if( SHEEPWATCH.VERBOSE ) then DEFAULT_CHAT_FRAME:AddMessage( SHEEPWATCH_TEXT_ANNOUNCE_LEAVECOMBAT ); end endendSheepWatch_EventHandler["SPELLCAST_START"] = function() local spell = arg1; if( SHEEPWATCH.DEBUG ) then DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug:\nEvent SPELLCAST_START triggered"); DEFAULT_CHAT_FRAME:AddMessage("Arg1: "..spell.." Arg2: "..arg2.."Spell: " .. SHEEPWATCH_SPELL ); end if ( string.find(spell, SHEEPWATCH_SPELL) ) then SHEEPWATCH_CASTING = true; SHEEPWATCH_POLYCASTED = true; SHEEPWATCH.SHEEPTYPE = spell; if ( SHEEPWATCH.ANNOUNCE and SHEEPWATCH.ANNOUNCE_TIME_ID == 1 ) then SheepWatch_SendAnnounce(UnitName("target"), UnitLevel("target")); end endendSheepWatch_EventHandler["PLAYER_TARGET_CHANGED"] = function() SHEEPWATCH_TARGETCHANGED = true;endSheepWatch_EventHandler["SPELLCAST_STOP"] = function() SHEEPWATCH_CASTING = nil;endSheepWatch_EventHandler["SPELLCAST_FAILED"] = SheepWatch_EventHandler["SPELLCAST_STOP"];SheepWatch_EventHandler["SPELLCAST_INTERRUPTED"] = SheepWatch_EventHandler["SPELLCAST_STOP"];---------------------------------------------------------- Shows the statusbar--------------------------------------------------------function SheepWatch_OnShow() local isPlayer = "" local Status = GetTime() if( SHEEPWATCH.ACTIVE ~= 0 ) then SHEEPWATCH.TIMER_START = Status; if( SHEEPWATCH.PLAYER ) then SHEEPWATCH.TIMER_END = SHEEPWATCH.TIMER_START + (SHEEPWATCH.PVPLENGTH / SHEEPWATCH.DIMINISH); else SHEEPWATCH.TIMER_END = SHEEPWATCH.TIMER_START + (SHEEPWATCH.LENGTH / SHEEPWATCH.DIMINISH); end if( SHEEPWATCH.DEBUG ) then if ( SHEEPWATCH.PLAYER ) then isPlayer="Yes" else isPlayer="No" end DEFAULT_CHAT_FRAME:AddMessage("SheepWatch Debug:\nPlayer: "..isPlayer.."\nStart: "..SHEEPWATCH.TIMER_START.."\nLength: "..SHEEPWATCH.LENGTH.."\nEnd: "..SHEEPWATCH.TIMER_END); end end if( SHEEPWATCH.STATUS ~= 3 ) then SHEEPWATCH.STATUS = 2; end SheepWatch:SetScale(UIParent:GetScale() * SHEEPWATCH.SCALE); SheepWatch:SetAlpha( SHEEPWATCH.ALPHA ); SheepWatchFrameStatusBar:SetStatusBarColor(SheepWatch_Settings["barcolor"].r, SheepWatch_Settings["barcolor"].g, SheepWatch_Settings["barcolor"].b); SheepWatchSpark:SetPoint("CENTER", "SheepWatchFrameStatusBar", "LEFT", 0, 0); SheepWatchText:SetText( SHEEPWATCH.SHEEPTYPE ); if( SHEEPWATCH.COUNTER ) then SheepWatchCounterText:Show(); endend---------------------------------------------------------- Update handler--------------------------------------------------------function SheepWatch_OnUpdate() if( SHEEPWATCH.STATUS == 3 ) then return; end local Status = GetTime(); local Elapsed = SHEEPWATCH.TIMER_END - Status; if( SHEEPWATCH.DECIMALS ) then decimalcut = 0; else decimalcut = 2; end local subto = 4 - decimalcut; if (Elapsed < 10) then subto = 3 - decimalcut; end local seconds = string.sub(math.max(Elapsed,0)+0.001, 1, subto); if( SHEEPWATCH.ACTIVE > 0 and Status < SHEEPWATCH.TIMER_END ) then SheepWatchFrameStatusBar:SetMinMaxValues(SHEEPWATCH.TIMER_START, SHEEPWATCH.TIMER_END); if( SHEEPWATCH.COUNTER ) then SheepWatchCounterText:SetText( seconds .. "s"); end local sparkPosition = ((Status - SHEEPWATCH.TIMER_START) / (SHEEPWATCH.TIMER_END - SHEEPWATCH.TIMER_START)) * 195; if( SHEEPWATCH.DIRECTION == 2 )then sparkPosition = 195 - sparkPosition; SheepWatchFrameStatusBar:SetValue(SHEEPWATCH.TIMER_START + SHEEPWATCH.TIMER_END - Status); else SheepWatchFrameStatusBar:SetValue(Status); end if( sparkPosition < 1 ) then sparkPosition = 1; end SheepWatchSpark:SetPoint("CENTER", "SheepWatchFrameStatusBar", "LEFT", sparkPosition, 0); elseif( this:GetAlpha() > 0 ) then if( SHEEPWATCH.STATUS == 2 ) then SHEEPWATCH.STATUS = 1; SHEEPWATCH.ACTIVE = 0; SheepWatchText:SetText("Timeout"); end local alpha = this:GetAlpha() - SHEEPWATCH.ALPHA_STEP; if( alpha > 0 ) then this:SetAlpha(alpha); else this.fadeOut = nil; this:Hide(); SheepWatchCounterText:Hide(); end else this:Hide(); SHEEPWATCH.STATUS = 1; SHEEPWATCH.ACTIVE = 0; SHEEPWATCH.MOBNAME = ""; SHEEPWATCH.PLAYER = nil; end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -