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.

399 lines
13 KiB

local PA = _G.ProjectAzilroka
if PA.Classic then return end
local SRF = PA:NewModule('SunsongRanchFarmer', 'AceEvent-3.0')
PA.SRF, _G.SunsongRanchFarmer = SRF, SRF
SRF.Title = PA.ACL['|cFF16C3F2Sunsong|r |cFFFFFFFFRanch Farmer|r']
SRF.Description = PA.ACL['A farm tool for Sunsong Ranch.']
SRF.Authors = 'Azilroka'
SRF.isEnabled = false
local _G = _G
local select = select
local tinsert = tinsert
local unpack = unpack
local pairs = pairs
local GetItemInfo = GetItemInfo
local GetItemInfoInstant = GetItemInfoInstant
local GetSubZoneText = GetSubZoneText
local GetItemCount = GetItemCount
local InCombatLockdown = InCombatLockdown
local NUM_BAG_SLOTS = NUM_BAG_SLOTS
local GetContainerNumSlots = GetContainerNumSlots
local GetContainerItemID = GetContainerItemID
local PickupContainerItem = PickupContainerItem
local DeleteCursorItem = DeleteCursorItem
local CreateFrame = CreateFrame
local Locale = PA.Locale
if Locale == 'esMX' then Locale = 'esES' end
if Locale == 'enGB' then Locale = 'enUS' end
local Locales = {
enUS = { Ranch = 'Sunsong Ranch', Market = 'The Halfhill Market' },
esES = { Ranch = 'Rancho Cantosol', Market = 'El Mercado del Alcor' },
ptBR = { Ranch = 'Fazenda Sol Cantante', Market = 'Mercado da Meia Colina' },
frFR = { Ranch = 'Ferme Chant du Soleil', Market = 'Marché de Micolline' },
deDE = { Ranch = 'Gehöft Sonnensang', Market = 'Der Halbhügelmarkt' },
itIT = { Ranch = 'Tenuta Cantasole', Market = 'Mercato di Mezzocolle' },
koKR = { Ranch = '태양노래 농장', Market = '언덕골 시장' },
zhCN = { Ranch = '日歌农场', Market = '半山市集' },
zhTW = { Ranch = '日歌農莊', Market = '半丘市集' },
ruRU = { Ranch = 'Ферма Солнечной Песни', Market = 'Рынок Полугорья' },
}
SRF.Ranch, SRF.Market = Locales[Locale].Ranch, Locales[Locale].Market
SRF.Events = {'PLAYER_ENTERING_WORLD', 'ZONE_CHANGED', 'ZONE_CHANGED_NEW_AREA', 'ZONE_CHANGED_INDOORS', 'BAG_UPDATE'}
SRF.Tools = { 79104, 80513, 89880, 89815 }
SRF.Seeds = {
[1] = { Seed = 79102, Bag = 80809 }, -- Green Cabbage
[2] = { Seed = 89328, Bag = 89848 }, -- Jade Squash
[3] = { Seed = 80590, Bag = 84782 }, -- Juicycrunch Carrot
[4] = { Seed = 80592, Bag = 85153 }, -- Mogu Pumpkin
[5] = { Seed = 80594, Bag = 85162 }, -- Pink Turnip
[6] = { Seed = 80593, Bag = 85158 }, -- Red Blossom Leek
[7] = { Seed = 80591, Bag = 84783 }, -- Scallion
[8] = { Seed = 89329, Bag = 89849 }, -- Striped Melon
[9] = { Seed = 80595, Bag = 85163 }, -- White Turnip
[10] = { Seed = 89326, Bag = 89847 }, -- Witchberry
[11] = { Seed = 85216, Bag = 95449 }, -- Enigma
[12] = { Seed = 85217, Bag = 95451 }, -- Magebulb
[13] = { Seed = 89202, Bag = 95457 }, -- Raptorleaf
[14] = { Seed = 85215, Bag = 95447 }, -- Snakeroot
[15] = { Seed = 89233, Bag = 95445 }, -- Songbell
[16] = { Seed = 89197, Bag = 95454 }, -- Windshear Cactus
[17] = { Seed = 85219 }, -- Ominous
[18] = { Seed = 85267 }, -- Autumn Blossom
[19] = { Seed = 85268 }, -- Spring Blossom
[20] = { Seed = 85269 }, -- Winter Blossom
}
SRF.Quests = {
--Tillers counsil
[31945] = { 80591, 84783}, -- Gina, Scallion
[31946] = {80590, 84782}, -- Mung-Mung, Juicycrunch Carrot
[31947] = {79102, 80809}, -- Farmer Fung, Green Cabbage
[31949] = {89326, 89847}, -- Nana, Witchberry
[30527] = {89329, 89849}, -- Haohan, Striped Melon
--Farmer Yoon
[31943] = {89326, 89847}, -- Witchberry
[31942] = {89329, 89849}, -- Striped Melon
[31941] = {89328, 89848}, -- Jade Squash
[31669] = {79102, 80809}, -- Green Cabbage
[31670] = {80590, 84782}, -- Juicycrunch Carrot
[31672] = {80592, 85153}, -- Mogu Pumpkin
[31673] = {80593, 85158}, -- Red Blossom Leek
[31674] = {80594, 85162}, -- Pink Turnip
[31675] = {80595, 85163}, -- White Turnip
[31671] = {80591, 84783}, -- Scallion
--Work Orders
[32645] = {89326, 89847}, -- Witchberry (Alliance Only)
[32653] = {89329, 89849}, -- Striped Melon
--[31941] = {89328, 89848}, -- Jade Squash
[32649] = {79102, 80809}, -- Green Cabbage
--[31670] = {80590, 84782}, -- Juicycrunch Carrot
[32658] = {80592, 85153}, -- Mogu Pumpkin
[32642] = {80593, 85158}, -- Red Blossom Leek (Horde Only)
--[31674] = {80594, 85162}, -- Pink Turnip
[32647] = {80595, 85163}, -- White Turnip
--[31671] = {80591, 84783}, -- Scallion
}
--local function QuestItems(itemID)
-- for i = 1, GetNumQuestLogEntries() do
-- for qid, sid in pairs(FarmQuests) do
-- if qid == select(9, GetQuestLogTitle(i)) then
-- if itemID == sid[1] or itemID == sid[2] then
-- return true
-- end
-- end
-- end
-- end
-- return false
--end
-- for i = 1, SeedAnchor.NumBars do
-- local seedBar = CreateFrame("Frame", SeedAnchor.BarsName..i, SeedAnchor)
-- seedBar:SetFrameStrata("BACKGROUND")
-- if i == 1 or i == 3 then
-- seedBar.Autotarget = function(button)
-- if not E.db.sle.legacy.farm.autotarget then return end
-- local container, slot = SLE:BagSearch(button.itemId)
-- if container and slot then
-- button:SetAttribute("type", "macro")
-- button:SetAttribute("macrotext", format("/targetexact %s \n/use %s %s", L["Tilled Soil"], container, slot))
-- end
-- end
-- end
function SRF:Update()
if not SRF.Bar then return end
local PrevButton, NumShown = nil, 0
for _, Button in pairs(SRF.Bar.Buttons) do
if Button:IsShown() then
Button:ClearAllPoints()
Button:SetPoint(unpack(PrevButton and {'LEFT', PrevButton, 'RIGHT', (PA.ElvUI and _G.ElvUI[1].PixelMode and 1 or 3), 0} or {'LEFT', SRF.Bar, 'LEFT', 0, 0}))
PrevButton = Button
NumShown = NumShown + 1
end
end
if NumShown == 0 then NumShown = 1 end
SRF.Bar:SetSize(NumShown * (50 + (PA.ElvUI and _G.ElvUI[1].PixelMode and 1 or 3)), 50)
end
function SRF:InSeedZone()
local SubZone = GetSubZoneText()
if SubZone == SRF.Ranch or SubZone == SRF.Market then
return true
else
return false
end
end
function SRF:InFarmZone()
return GetSubZoneText() == SRF.Ranch
end
function SRF:CreateBigButton(ItemID)
local Button = CreateFrame('Button', nil, SRF.Bar, 'SecureActionButtonTemplate, ActionButtonTemplate')
Button:Hide()
PA:SetTemplate(Button)
Button:SetSize(50, 50)
Button:SetFrameLevel(1)
Button:SetAttribute('type', 'item')
Button:SetAttribute('item', GetItemInfo(ItemID))
Button.ItemID = ItemID
Button.icon:SetTexture(select(5, GetItemInfoInstant(ItemID)))
Button.icon:SetTexCoord(unpack(PA.TexCoords))
PA:SetInside(Button.icon)
Button.icon:SetDrawLayer('ARTWORK')
Button:SetNormalTexture('')
Button:SetPushedTexture('')
Button:SetHighlightTexture('')
PA:CreateShadow(Button)
for _, event in pairs(SRF.Events) do
Button:RegisterEvent(event)
end
Button:SetScript('OnShow', function()
if Button:GetAttribute('item') ~= GetItemInfo(ItemID) then
Button:SetAttribute('item', GetItemInfo(ItemID))
end
end)
Button:SetScript('OnEvent', function()
if not InCombatLockdown() then
if SRF:InFarmZone() and GetItemCount(ItemID) == 1 then
Button:Show()
SRF:Update()
end
Button:UnregisterEvent('PLAYER_REGEN_ENABLED')
else
Button:RegisterEvent('PLAYER_REGEN_ENABLED')
end
end)
tinsert(SRF.Bar.Buttons, Button)
end
local SeedX, SeedY = 0, 1
function SRF:CreateSeedButton(ItemID)
SeedX = SeedX + 1
if SeedX > 10 then
SeedX, SeedY = 1, 2
end
local Button = CreateFrame('Button', nil, SRF.Bar.SeedsFrame, 'SecureActionButtonTemplate, ActionButtonTemplate')
PA:SetTemplate(Button)
Button:SetSize(30, 30)
Button:SetAttribute('type', 'item')
Button:SetAttribute('item', GetItemInfo(ItemID))
Button.ItemID = ItemID
Button.icon:SetTexture(select(5, GetItemInfoInstant(ItemID)))
Button.icon:SetTexCoord(unpack(PA.TexCoords))
Button.icon:SetPoint('TOPLEFT', 1, -1)
Button.icon:SetPoint('BOTTOMRIGHT', -1, 1)
Button.icon:SetDrawLayer('ARTWORK')
Button:SetNormalTexture('')
Button:SetPushedTexture('')
Button:SetHighlightTexture('')
Button:HookScript('OnEnter', function(button)
_G.GameTooltip:SetOwner(button, 'ANCHOR_TOPRIGHT', 2, 4)
_G.GameTooltip:ClearLines()
_G.GameTooltip:SetItemByID(ItemID)
_G.GameTooltip:Show()
end)
Button:HookScript('OnLeave', _G.GameTooltip_Hide)
local function Update(button)
if not InCombatLockdown() then
if button:GetAttribute('item') ~= GetItemInfo(button.ItemID) then
button:SetAttribute('item', GetItemInfo(button.ItemID))
end
local Count = GetItemCount(button.ItemID)
button:EnableMouse(Count > 0)
button.Count:SetText(Count > 0 and Count or '')
button.icon:SetDesaturated(Count == 0)
button:UnregisterEvent('PLAYER_REGEN_ENABLED')
else
button:RegisterEvent('PLAYER_REGEN_ENABLED')
end
end
for _, event in pairs(SRF.Events) do
Button:RegisterEvent(event)
end
Button:SetScript('OnEvent', Update)
Button:SetScript('OnShow', Update)
local yTable = {
[1] = { point = 'TOPLEFT', offset = -4 },
[2] = { point = 'BOTTOMLEFT', offset = 4 },
}
local xOffset = 4 + (34*(SeedX-1))
Button:ClearAllPoints()
Button:SetPoint(yTable[SeedY].point, xOffset, yTable[SeedY].offset)
PA:CreateShadow(Button)
tinsert(SRF.Bar.SeedsFrame.Buttons, Button)
end
function SRF:DropTools()
if not SRF:InSeedZone() and SRF.db.DropTools then
for _, ItemID in pairs(SRF.Tools) do
for container = 0, NUM_BAG_SLOTS do
for slot = 1, GetContainerNumSlots(container) do
if ItemID == GetContainerItemID(container, slot) then
PickupContainerItem(container, slot)
DeleteCursorItem()
end
end
end
end
end
end
function SRF:GetOptions()
local SunsongRanchFarmer = PA.ACH:Group(SRF.Title, SRF.Description, nil, nil, function(info) return SRF.db[info[#info]] end)
PA.Options.args.SunsongRanchFarmer = SunsongRanchFarmer
SunsongRanchFarmer.args.Description = PA.ACH:Description(SRF.Description, 0)
SunsongRanchFarmer.args.Enable = PA.ACH:Toggle(PA.ACL['Enable'], nil, 1, nil, nil, nil, nil, function(info, value) SRF.db[info[#info]] = value if not SRF.isEnabled then SRF:Initialize() else _G.StaticPopup_Show('PROJECTAZILROKA_RL') end end)
SunsongRanchFarmer.args.General = PA.ACH:Group(PA.ACL['General'], nil, 2, nil, nil, function(info, value) SRF.db[info[#info]] = value SRF:Update() end)
SunsongRanchFarmer.args.General.inline = true
SunsongRanchFarmer.args.General.args.DropTools = PA.ACH:Toggle(PA.ACL['Drop Farm Tools'], nil, 1)
SunsongRanchFarmer.args.General.args.ToolSize = PA.ACH:Range(PA.ACL['Farm Tool Size'], nil, 2, { min = 16, max = 64, step = 1 })
SunsongRanchFarmer.args.General.args.SeedSize = PA.ACH:Range(PA.ACL['Seed Size'], nil, 3, { min = 16, max = 64, step = 1 })
SunsongRanchFarmer.args.AuthorHeader = PA.ACH:Header(PA.ACL['Authors:'], -2)
SunsongRanchFarmer.args.Authors = PA.ACH:Description(SRF.Authors, -1, 'large')
end
function SRF:BuildProfile()
PA.Defaults.profile.SunsongRanchFarmer = { Enable = true, DropTools = false, ToolSize = 36, SeedSize = 24 }
end
function SRF:UpdateSettings()
SRF.db = PA.db.SunsongRanchFarmer
end
function SRF:Initialize()
SRF:UpdateSettings()
if SRF.db.Enable ~= true then
return
end
SRF.isEnabled = true
local Bar = CreateFrame('Frame', 'SunsongRanchFarmerBar', _G.UIParent, "SecureHandlerStateTemplate")
SRF.Bar = Bar
Bar:Hide()
Bar:SetFrameStrata('MEDIUM')
Bar:SetFrameLevel(0)
Bar:SetSize(36, 36)
Bar:ClearAllPoints()
Bar:SetPoint('TOP', _G.UIParent, 'TOP', 0, -250)
Bar.Buttons = {}
Bar.SeedsFrame = CreateFrame('Frame', 'SunsongRanchFarmerSeedBar', _G.UIParent)
Bar.SeedsFrame:SetFrameStrata('MEDIUM')
Bar.SeedsFrame:SetFrameLevel(0)
Bar.SeedsFrame:SetSize(344, 72)
Bar.SeedsFrame:SetPoint('TOP', _G.UIParent, 'TOP', 0, -300)
Bar.SeedsFrame.Buttons = {}
for _, ItemID in pairs(SRF.Tools) do
SRF:CreateBigButton(ItemID)
end
for i = 1, 20 do
SRF:CreateSeedButton(SRF.Seeds[i].Seed)
end
for _, event in pairs(SRF.Events) do
Bar:RegisterEvent(event)
Bar.SeedsFrame:RegisterEvent(event)
end
Bar:SetScript('OnEvent', function(frame)
if not InCombatLockdown() then
if SRF:InFarmZone() then
frame:Show()
UIFrameFadeIn(frame, 0.5, 0, 1)
else
SRF:DropTools()
frame:Hide()
end
end
end)
Bar.SeedsFrame:SetScript('OnEvent', function(frame)
if not InCombatLockdown() then
if SRF:InSeedZone() then
frame:Show()
UIFrameFadeIn(frame, 0.5, 0, 1)
else
frame:Hide()
end
end
end)
if PA.Tukui then
_G.Tukui[1]['Movers']:RegisterFrame(SRF.Bar)
_G.Tukui[1]['Movers']:RegisterFrame(SRF.Bar.SeedsFrame)
elseif PA.ElvUI then
_G.ElvUI[1]:CreateMover(SRF.Bar, 'SunsongRanchFarmerFarmBar', 'Sunsong Ranch Framer Farm Bar Anchor', nil, nil, nil, 'ALL,GENERAL', nil, 'ProjectAzilroka,SunsongRanchFarmer')
_G.ElvUI[1]:CreateMover(SRF.Bar.SeedsFrame, 'SunsongRanchFarmerSeedBarMover', 'Sunsong Ranch Framer Seed Bar Anchor', nil, nil, nil, 'ALL,GENERAL', nil, 'ProjectAzilroka,SunsongRanchFarmer')
end
PA:CreateShadow(Bar.SeedsFrame)
PA:SetTemplate(Bar.SeedsFrame)
Bar.SeedsFrame.BorderColor = { Bar.SeedsFrame:GetBackdropBorderColor() }
end