Quantcast

Farm module

Darthpred [02-17-13 - 11:15]
Farm module
Filename
ElvUI_SLE/config/profile.lua
ElvUI_SLE/config/sle_private.lua
ElvUI_SLE/modules/farm/farm.lua
ElvUI_SLE/modules/farm/options.lua
diff --git a/ElvUI_SLE/config/profile.lua b/ElvUI_SLE/config/profile.lua
index cc94caa..9cd6951 100644
--- a/ElvUI_SLE/config/profile.lua
+++ b/ElvUI_SLE/config/profile.lua
@@ -161,6 +161,11 @@ P['sle'] = {

 	--Error messages
 	['errors'] = false,
+
+	['farm'] = {
+		['active'] = true,
+		['size'] = 30,
+	},
 }

 --For some reason datatext settings refuses to work if there is no general setting block here O_o
diff --git a/ElvUI_SLE/config/sle_private.lua b/ElvUI_SLE/config/sle_private.lua
index 471a084..14e075c 100644
--- a/ElvUI_SLE/config/sle_private.lua
+++ b/ElvUI_SLE/config/sle_private.lua
@@ -36,4 +36,5 @@ V['sle'] = {
 		["bottomhide"] = false,
 		["dp6hide"] = false,
 	},
-}
\ No newline at end of file
+	['farm'] = false,
+}
diff --git a/ElvUI_SLE/modules/farm/farm.lua b/ElvUI_SLE/modules/farm/farm.lua
index b67b98c..9d32e4c 100644
--- a/ElvUI_SLE/modules/farm/farm.lua
+++ b/ElvUI_SLE/modules/farm/farm.lua
@@ -1,5 +1,356 @@
 local E, L, V, P, G, _ = unpack(ElvUI); --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
 local B = LibStub("LibBabble-SubZone-3.0")
 local BL = B:GetLookupTable()
+local F = E:NewModule('Farm', 'AceHook-3.0', 'AceEvent-3.0');

-print(BL["Sunsong Ranch"])
\ No newline at end of file
+local SeedAnchor, ToolAnchor, PortalAnchor
+local tsort = table.sort
+local farmzones = { BL["Sunsong Ranch"], BL["The Halfhill Market"] }
+local size
+local unreg = 0
+
+local seedButtons = {}
+local toolButtons = {}
+local portalButtons = {}
+
+local seeds = {
+	--Seeds general
+	[79102] = { 1 }, -- Green Cabbage
+	[89328] = { 1 }, -- Jade Squash
+	[80590] = { 1 }, -- Juicycrunch Carrot
+	[80592] = { 1 }, -- Mogu Pumpkin
+	[80594] = { 1 }, -- Pink Turnip
+	[80593] = { 1 }, -- Red Blossom Leek
+	[80591] = { 1 }, -- Scallion
+	[89329] = { 1 }, -- Striped Melon
+	[80595] = { 1 }, -- White Turnip
+	[89326] = { 1 }, -- Witchberry
+	--Bags general
+	[80809] = { 2 }, -- Green Cabbage
+	[89848] = { 2 }, -- Jade Squash
+	[84782] = { 2 }, -- Juicycrunch Carrot
+	[85153] = { 2 }, -- Mogu Pumpkin
+	[85162] = { 2 }, -- Pink Turnip
+	[85158] = { 2 }, -- Red Blossom Leek
+	[84783] = { 2 }, -- Scallion
+	[89849] = { 2 }, -- Striped Melon
+	[85163] = { 2 }, -- White Turnip
+	[89847] = { 2 }, -- Witchberry
+	--Seeds special
+	[85216] = { 3 }, -- Enigma
+	[85217] = { 3 }, -- Magebulb
+	[85219] = { 3 }, -- Ominous
+	[89202] = { 3 }, -- Raptorleaf
+	[85215] = { 3 }, -- Snakeroot
+	[89233] = { 3 }, -- Songbell
+	[91806] = { 3 }, -- Unstable Portal
+	[89197] = { 3 }, -- Windshear Cactus
+	--Bags special
+	[95449] = { 4 }, -- Enigma
+	[95451] = { 4 }, -- Magebulb
+	[95457] = { 4 }, -- Raptorleaf
+	[95447] = { 4 }, -- Snakeroot
+	[95445] = { 4 }, -- Songbell
+	[95454] = { 4 }, -- Windshear Cactus
+	--Trees lol
+	[85267] = { 5 }, -- Autumn Blossom Sapling
+	[85268] = { 5 }, -- Spring Blossom Sapling
+	[85269] = { 5 }, -- Winter Blossom Sapling
+}
+
+local tools = {
+	[79104]	= { 1 }, -- Rusy Watering Can
+	[80513] = { 1 }, -- Vintage Bug Sprayer
+	[89880] = { 1 }, -- Dented Shovel
+	[89815] = { 1 }, -- Master Plow
+}
+
+local portals = {
+	[91850] = { "Horde" }, -- Orgrimmar Portal Shard
+	[91861] = { "Horde" }, -- Thunder Bluff Portal Shard
+	[91862] = { "Horde" }, -- Undercity Portal Shard
+	[91863] = { "Horde" }, -- Silvermoon Portal Shard
+
+	[91860] = { "Alliance" }, -- Stormwind Portal Shard
+	[91864] = { "Alliance" }, -- Ironforge Portal Shard
+	[91865] = { "Alliance" }, -- Darnassus Portal Shard
+	[91866] = { "Alliance" }, -- Exodar Portal Shard
+}
+
+function F:InSeedZone()
+	local subzone = GetSubZoneText()
+	for _, zone in ipairs(farmzones) do
+		if (zone == subzone) then
+			return true
+		end
+	end
+	return false
+end
+
+function F:InFarmZone()
+	return GetSubZoneText() == farmzones[1]
+end
+
+function F:FarmerInventoryUpdate()
+	if InCombatLockdown() then return end
+
+	for i = 1, 5 do
+		for _, button in ipairs(seedButtons[i]) do
+			button.items = GetItemCount(button.itemId, nil, true)
+			button.text:SetText(button.items)
+			button.icon:SetDesaturated(button.items == 0)
+			button.icon:SetAlpha(button.items == 0 and .25 or 1)
+		end
+	end
+
+	for _, button in ipairs(toolButtons) do
+		button.items = GetItemCount(button.itemId)
+		button.icon:SetDesaturated(button.items == 0)
+		button.icon:SetAlpha(button.items == 0 and .25 or 1)
+	end
+
+	for _, button in ipairs(portalButtons) do
+		button.items = GetItemCount(button.itemId)
+		button.text:SetText(button.items)
+		button.icon:SetDesaturated(button.items == 0)
+		button.icon:SetAlpha(button.items == 0 and .25 or 1)
+	end
+
+	self:UpdateLayout()
+end
+
+function F:UpdateBarLayout(bar, anchor, buttons)
+	local count = 0
+	size = E.db.sle.farm.size
+	bar:ClearAllPoints()
+	bar:Point("LEFT", anchor, "LEFT", 0, 0)
+
+	for i, button in ipairs(buttons) do
+		button:ClearAllPoints()
+		if not E.db.sle.farm.active or button.items > 0 then
+			button:Point("TOPLEFT", bar, "TOPLEFT", (count * (size+(E.PixelMode and 2 or 1)))+(E.PixelMode and 1 or 0), -1)
+			button:Show()
+			button:Size(size, size)
+			count = count + 1
+		else
+			button:Hide()
+		end
+	end
+
+	bar:Width(1)
+	bar:Height(size+2)
+
+	return count
+end
+
+function F:UpdateSeedBarLayout(seedBar, anchor, buttons, category)
+	local count = 0
+	size = E.db.sle.farm.size
+	seedBar:ClearAllPoints()
+	if category == 1 then
+		seedBar:Point("TOPLEFT", anchor, "TOPLEFT", (E.PixelMode and 0 or -2), 0)
+	else
+		seedBar:Point("TOPLEFT", anchor, "TOPLEFT", (category - 1)*(size+(E.PixelMode and 2 or 1))-(E.PixelMode and 0 or 2), 0)
+	end
+
+	for i, button in ipairs(buttons) do
+		button:ClearAllPoints()
+		if not E.db.sle.farm.active or button.items > 0 then
+			button:Point("TOPLEFT", seedBar, "TOPLEFT", E.PixelMode and 1 or 2, -(count * (size+(E.PixelMode and 2 or 1)))-(E.PixelMode and 1 or 0))
+			button:Show()
+			button:Size(size, size)
+			count = count + 1
+		else
+			button:Hide()
+		end
+	end
+
+	seedBar:Width(size+2)
+	seedBar:Height(1)
+	return count
+end
+
+function F:UpdateBar(bar, layoutfunc, zonecheck, anchor, buttons, category)
+	bar:Show()
+
+	local count = layoutfunc(self, bar, anchor, buttons, category)
+	if (E.private.sle.farm and count > 0 and zonecheck(self) and not InCombatLockdown()) then
+		bar:Show()
+	else
+		bar:Hide()
+	end
+end
+
+function F:UpdateLayout(event)
+	if InCombatLockdown() then return end
+	for i=1, 5 do
+		F:UpdateBar(_G[("FarmSeedBar%d"):format(i)], F.UpdateSeedBarLayout, F.InSeedZone, SeedAnchor, seedButtons[i], i)
+	end
+	F:UpdateBar(_G["FarmToolBar"], F.UpdateBarLayout, F.InFarmZone, ToolAnchor, toolButtons)
+	F:UpdateBar(_G["FarmPortalBar"], F.UpdateBarLayout, F.InFarmZone, PortalAnchor, portalButtons)
+	F:ResizeFrames()
+end
+
+function F:CreateFarmButton(index, owner, buttonType, name, texture, allowDrop)
+	size = E.db.sle.farm.size
+	local button = CreateFrame("Button", ("FarmerButton%d"):format(index), owner, "SecureActionButtonTemplate")
+	button:Size(size, size)
+	button:SetTemplate()
+
+	button.sortname = name
+	button.itemId = index
+
+	button.icon = button:CreateTexture(nil, "OVERLAY")
+	button.icon:SetTexture(texture)
+	button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
+	button.icon:SetInside()
+
+	button.text = button:CreateFontString(nil, "OVERLAY")
+	button.text:SetFont(E.media.normFont, 12, "OUTLINE")
+	button.text:SetPoint("BOTTOMRIGHT", button, 1, 2)
+
+	button:SetScript("OnEnter", function()
+		GameTooltip:SetOwner(button, 'ANCHOR_TOPLEFT', 2, 4)
+		GameTooltip:ClearLines()
+		GameTooltip:AddDoubleLine(name)
+		if allowDrop then
+			GameTooltip:AddLine(L['Right-click to drop the item.'])
+		end
+		GameTooltip:Show()
+	end)
+
+	button:SetScript("OnLeave", function()
+		GameTooltip:Hide()
+	end)
+
+	button:SetScript("OnMouseDown", function(self, mousebutton)
+		if mousebutton == "LeftButton" then
+			button:SetAttribute("type", buttonType)
+			button:SetAttribute(buttonType, name)
+		elseif mousebutton == "RightButton" and allowDrop then
+			button:SetAttribute("type", "click")
+			for container = 0, 4 do
+				for slot = 1, GetContainerNumSlots(container) do
+					if button.itemId == GetContainerItemID(container, slot) then
+						PickupContainerItem(container, slot)
+						DeleteCursorItem()
+						return
+					end
+				end
+			end
+		end
+	end)
+
+	return button
+end
+
+function F:ResizeFrames()
+	SeedAnchor:Size((size+(E.PixelMode and 2 or 1))*5-(E.PixelMode and 0 or 1), (size+(E.PixelMode and 2 or 1))*10-(E.PixelMode and 0 or 1))
+	ToolAnchor:Size((size+(E.PixelMode and 2 or 1))*5-(E.PixelMode and 0 or 1), size+(E.PixelMode and 2 or 1)-(E.PixelMode and 0 or 1))
+	PortalAnchor:Size((size+(E.PixelMode and 2 or 1))*5-(E.PixelMode and 0 or 1), size+(E.PixelMode and 2 or 1)-(E.PixelMode and 0 or 1))
+end
+
+function F:FramesPosition()
+	SeedAnchor:Point("LEFT", E.UIParent, "LEFT", 4, -200)
+	ToolAnchor:Point("BOTTOMLEFT", SeedAnchor, "TOPLEFT", 0, E.PixelMode and 1 or 5)
+	PortalAnchor:Point("BOTTOMLEFT", ToolAnchor, "TOPLEFT", 0, E.PixelMode and 1 or 5)
+end
+
+function F:CreateFrames()
+	size = E.db.sle.farm.size
+	SeedAnchor = CreateFrame("Frame", "SeedAnchor", E.UIParent)
+	SeedAnchor:SetFrameStrata("BACKGROUND")
+
+	ToolAnchor = CreateFrame("Frame", "ToolAnchor", E.UIParent)
+	ToolAnchor:SetFrameStrata("BACKGROUND")
+
+	PortalAnchor = CreateFrame("Frame", "PortalAnchor", E.UIParent)
+	PortalAnchor:SetFrameStrata("BACKGROUND")
+
+	F:ResizeFrames()
+	F:FramesPosition()
+
+	E:CreateMover(SeedAnchor, "FarmSeedAnchor", "Farmer Seed Bar")
+	E:CreateMover(ToolAnchor, "FarmToolAnchor", "Farmer Tool Bar")
+	E:CreateMover(PortalAnchor, "FarmPortalAnchor", "Farmer Portal Bar")
+
+	for id, v in pairs(seeds) do
+		seeds[id] = { v[1], GetItemInfo(id) }
+	end
+
+	for id, v in pairs(tools) do
+		tools[id] = { GetItemInfo(id) }
+	end
+
+	for id, v in pairs(portals) do
+		portals[id] = { v[1], GetItemInfo(id) }
+	end
+
+	for i = 1, 5 do
+		local seedBar = CreateFrame("Frame", ("FarmSeedBar%d"):format(i), UIParent)
+		seedBar:SetFrameStrata("BACKGROUND")
+		seedBar:SetPoint("CENTER", SeedAnchor, "CENTER", 0, 0)
+
+		seedButtons[i] = seedButtons[i] or {}
+
+		for id, v in pairs(seeds) do
+			if v[1] == i then
+				tinsert(seedButtons[i], F:CreateFarmButton(id, seedBar, "item", v[2], v[11], false))
+			end
+			tsort(seedButtons[i], function(a, b) return a.sortname < b.sortname end)
+		end
+	end
+
+	local toolBar = CreateFrame("Frame", "FarmToolBar", UIParent)
+	toolBar:SetFrameStrata("BACKGROUND")
+	toolBar:SetPoint("CENTER", ToolAnchor, "CENTER", 0, 0)
+	for id, v in pairs(tools) do
+		tinsert(toolButtons, F:CreateFarmButton(id, toolBar, "item", v[1], v[10], true))
+	end
+
+	local portalBar = CreateFrame("Frame", "FarmPortalBar", UIParent)
+	portalBar:SetFrameStrata("BACKGROUND")
+	portalBar:SetPoint("CENTER", PortalAnchor, "CENTER", 0, 0)
+	local playerFaction = UnitFactionGroup('player')
+	for id, v in pairs(portals) do
+		if v[1] == playerFaction then
+			tinsert(portalButtons, F:CreateFarmButton(id, portalBar, "item", v[2], v[11], false))
+		end
+	end
+
+	F:FarmerInventoryUpdate()
+	F:UpdateLayout()
+
+	F:RegisterEvent("ZONE_CHANGED", "UpdateLayout")
+	F:RegisterEvent("PLAYER_REGEN_ENABLED", "UpdateLayout")
+	F:RegisterEvent("BAG_UPDATE", "FarmerInventoryUpdate")
+end
+
+function F:StartFarmBarLoader()
+	F:UnregisterEvent("PLAYER_ENTERING_WORLD")
+
+	local noItem = false
+	-- preload item links to prevent errors
+	for id, _ in pairs(seeds) do
+		if select(2, GetItemInfo(id)) == nil then noItem = true end
+	end
+	for id, _ in pairs(tools) do
+		if select(2, GetItemInfo(id)) == nil then noItem = true end
+	end
+	for id, _ in pairs(portals) do
+		if select(2, GetItemInfo(id)) == nil then noItem = true end
+	end
+	if noItem then
+		E:Delay(5, F.StartFarmBarLoader)
+	else
+		F.CreateFrames()
+	end
+end
+
+function F:Initialize()
+	if not E.private.sle.farm then return end
+
+	self:RegisterEvent("PLAYER_ENTERING_WORLD", "StartFarmBarLoader")
+end
+
+E:RegisterModule(F:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/farm/options.lua b/ElvUI_SLE/modules/farm/options.lua
index 6dc6985..7991113 100644
--- a/ElvUI_SLE/modules/farm/options.lua
+++ b/ElvUI_SLE/modules/farm/options.lua
@@ -1 +1,39 @@
 local E, L, V, P, G, _ = unpack(ElvUI); --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
+local F = E:GetModule('Farm')
+
+E.Options.args.sle.args.farm = {
+	type = 'group',
+	name = L['Farm'],
+	args = {
+		intro = {
+			order = 1,
+			type = 'description',
+			name = L["FARM_DESC"],
+		},
+		enable = {
+			type = "toggle",
+			order = 2,
+			name = L['Enable'],
+			get = function(info) return E.private.sle.farm end,
+			set = function(info, value) E.private.sle.farm = value; E:StaticPopup_Show("PRIVATE_RL") end
+		},
+		active = {
+			order = 3,
+			type = 'toggle',
+			name = L['Only active buttons'],
+			desc = L['Only show the buttons for the seeds, portals, tools you have in your bags.'],
+			disabled = function() return not E.private.sle.farm end,
+			get = function(info) return E.db.sle.farm.active end,
+			set = function(info, value) E.db.sle.farm.active = value F:UpdateLayout() end,
+		},
+		size = {
+			order = 4,
+			type = "range",
+			name = L["Button Size"],
+			disabled = function() return not E.private.sle.farm end,
+			min = 15, max = 60, step = 1,
+			get = function(info) return E.db.sle.farm.size end,
+			set = function(info, value) E.db.sle.farm.size = value; F:UpdateLayout() end,
+		},
+	},
+}
\ No newline at end of file