You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
4.5 KiB

local SLE, T, E, L, V, P, G = unpack(select(2, ...))
local Pr = SLE.Professions
local FL = LibStub("LibFishing-1.0-SLE")
-- GLOBALS: hooksecurefunc, CreateFrame
local _G = _G
local format = format
local GetTime = GetTime
local SavedWFOnMouseDown
local IsMounted = IsMounted
local IsMouselooking = IsMouselooking
local MouselookStop = MouselookStop
local UnitChannelInfo = UnitChannelInfo
function Pr:HijackFishingCheck()
if ( not Pr.AddingLure and not InCombatLockdown() and (not IsMounted() or E.private.sle.professions.fishing.FromMount) and
E.private.sle.professions.fishing.EasyCast and FL:IsFishingReady(E.private.sle.professions.fishing.IgnorePole)) then
return true
end
end
local function HideAwayAll(self, button, down)
Pr.FishingUpdateFrame:Show()
end
function Pr:GetUpdateLure()
if E.private.sle.professions.fishing.UseLures then
-- only apply a lure if we're actually fishing with a "real" pole
if (FL:IsFishingPole()) then
-- Let's wait a bit so that the enchant can show up before we lure again
if ( Pr.LastLure and Pr.LastLure.time and ((Pr.LastLure.time - GetTime()) > 0) ) then
SLE:Print(format(L["SLE_Prof_Relure_Error"], Pr.LastLure.time - GetTime()))
return false
end
if ( Pr.LastLure ) then
Pr.LastLure.time = nil
Pr.LureState = 0
end
local skill, _, _, _ = FL:GetCurrentSkill()
if (skill > 0) then
local NextLure, NextState
local tempenchant = FL:GetPoleBonus()
local state, bestlure = FL:FindBestLure(tempenchant, Pr.LureState)
if ( state and bestlure and tempenchant == 0 ) then
NextState = state
NextLure = bestlure
else
NextLure = nil
end
local DoLure = NextLure
if ( DoLure and DoLure.id ) then
-- if the pole has an enchantment, we can assume it's got a lure on it (so far, anyway)
-- remove the main hand enchantment (since it's a fishing pole, we know what it is)
local startTime, duration, enable = GetItemCooldown(DoLure.id)
if (startTime == 0) then
Pr.AddingLure = true
Pr.LastLure = DoLure
Pr.LureState = NextState
Pr.LastLure.time = GetTime() + E.private.sle.professions.fishing.relureThreshold
local id = DoLure.id
local name = DoLure.n
return true, id, name
elseif ( Pr.LastLure and not Pr.LastLure.time ) then
Pr.LastLure = nil
Pr.LastState = 0
Pr.AddingLure = false
end
end
end
end
end
return false
end
function Pr:FishCasting()
-- put on a lure if we need to
local key = Pr.FishingKey
if (key == "None" and FL:IsFishingReady(false)) or (key ~= "None" and _G["Is"..key.."KeyDown"]()) then
local update, id, n = Pr:GetUpdateLure()
if (update and id) then
FL:InvokeLuring(id)
else
Pr.LastCastTime = GetTime()
FL:InvokeFishing()
end
FL:OverrideClick(HideAwayAll)
end
end
-- handle mouse up and mouse down in the WorldFrame so that we can steal the hardware events to implement 'Easy Cast'
-- Thanks to the Cosmos team for figuring this one out
local function WF_OnMouseDown(...)
-- Only steal 'right clicks' (self is arg #1!)
local button = select(2, ...)
if FL:CheckForDoubleClick(button) and Pr:HijackFishingCheck() then
-- We're stealing the mouse-up event, make sure we exit MouseLook
if ( IsMouselooking() ) then
MouselookStop()
end
Pr:FishCasting()
end
if ( SavedWFOnMouseDown ) then
SavedWFOnMouseDown(...)
end
end
local function TrapWorldMouse()
if ( _G["WorldFrame"].OnMouseDown ) then
hooksecurefunc(_G["WorldFrame"], "OnMouseDown", WF_OnMouseDown)
else
SavedWFOnMouseDown = T.SafeHookScript(_G["WorldFrame"], "OnMouseDown", WF_OnMouseDown)
end
end
function Pr:FishingInitialize()
Pr.FishingKey = E.private.sle.professions.fishing.CastButton
Pr.AddingLure = false
Pr.LastLure = nil
Pr.LureState = 0
Pr.LastCastTime = nil
Pr.FishingUpdateFrame = CreateFrame("Frame", "SLE_FishingUpdateFrame", E.UIParent)
Pr.FishingUpdateFrame:SetScript("OnUpdate", function(self)
local stop = true
if ( not InCombatLockdown() ) then
FL:ResetOverride()
if ( Pr.AddingLure ) then
-- TODO: Clean up as a bunch of unused variables
local sp, sub, txt, tex, st, et, trade, int = UnitChannelInfo("player")
local lure = FL:GetPoleBonus()
if ( not sp or not Pr.LastLure or (lure and lure == Pr.LastLure.b) ) then
Pr.AddingLure = false
FL:UpdateLureInventory()
else
stop = false
end
end
if ( stop ) then
Pr.FishingUpdateFrame:Hide()
end
end
end)
Pr.FishingUpdateFrame:Hide()
FL:GetPoleType()
FL:CreateSAButton()
FL:SetSAMouseEvent()
TrapWorldMouse()
end