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.
912 lines
32 KiB
912 lines
32 KiB
local WIT, core = ...
|
|
|
|
local AceGUI = LibStub("AceGUI-3.0")
|
|
|
|
local ITEM_LINK_REGEX = "(.+)"
|
|
local ITEM_ID_REGEX = "(.+)Hitem:([0-9]+):(.+)"
|
|
local LOOT_ITEM_SELF_REGEX = LOOT_ITEM_SELF:gsub("%%s", ITEM_LINK_REGEX)
|
|
local LOOT_ITEM_SELF_MULTIPLE_REGEX = LOOT_ITEM_SELF_MULTIPLE:gsub("%%s", ITEM_LINK_REGEX):gsub("%%d", "(%%d+)")
|
|
local LOOT_ITEM_SELF_ITEMID_REGEX = LOOT_ITEM_SELF:gsub("%%s", ITEM_ID_REGEX)
|
|
local LOOT_ITEM_SELF_ITEMID_MULTIPLE_REGEX = LOOT_ITEM_SELF_MULTIPLE:gsub("%%s", ITEM_ID_REGEX):gsub("%%d", "(%%d+)")
|
|
local LOOT_ITEM_REGEX = LOOT_ITEM:gsub("%%s", ITEM_LINK_REGEX)
|
|
local LOOT_ITEM_MULTIPLE_REGEX = LOOT_ITEM_MULTIPLE:gsub("%%s", ITEM_LINK_REGEX):gsub("%%d", "(%%d+)")
|
|
local LOOT_ITEM_ITEMID_REGEX = LOOT_ITEM:gsub("%%s", ITEM_LINK_REGEX, 1):gsub("%%s", ITEM_ID_REGEX)
|
|
local LOOT_ITEM_ITEMID_MULTIPLE_REGEX = LOOT_ITEM_MULTIPLE:gsub("%%s", ITEM_LINK_REGEX, 1):gsub("%%s", ITEM_ID_REGEX):gsub("%%d", "(%%d+)")
|
|
local BPET_ID_REGEX = "Hbattlepet:(%d+):"
|
|
|
|
local GOLD_AMOUNT_REGEX = GOLD_AMOUNT:gsub("%%d", "(%%d+)")
|
|
local SILVER_AMOUNT_REGEX = SILVER_AMOUNT:gsub("%%d", "(%%d+)")
|
|
local COPPER_AMOUNT_REGEX = COPPER_AMOUNT:gsub("%%d", "(%%d+)")
|
|
|
|
local self = nil
|
|
local UpdateUI = nil
|
|
|
|
function core.NewCustomFarmId()
|
|
return "C" .. string.format("%06d", math.random(1, 999999)) .. time()
|
|
end
|
|
|
|
local function NewSession()
|
|
return {
|
|
Id = core.NewCustomFarmId(),
|
|
StartTime = nil,
|
|
Time = 0,
|
|
CurrentTime = nil,
|
|
IsRunning = false,
|
|
IsPaused = false,
|
|
NameMapId = core.LocationHelper.GetPlayerCurrentMapId(),
|
|
Mode = "location",
|
|
MapId = core.LocationHelper.GetPlayerCurrentMapId(),
|
|
Money = 0,
|
|
IsCustom = true,
|
|
Results = {}
|
|
}
|
|
end
|
|
|
|
local function GetCurrentDuration()
|
|
local seconds = self.Session.Time
|
|
|
|
if self.Session.IsRunning then
|
|
seconds = seconds + time() - self.Session.StartTime
|
|
end
|
|
|
|
return seconds
|
|
end
|
|
|
|
local function ResumeSession()
|
|
if not self.Session.IsRunning then
|
|
self.Session.IsRunning = true
|
|
self.Session.IsPaused = false
|
|
|
|
self.Session.StartTime = time()
|
|
self.Session.CurrentTime = self.Session.StartTime
|
|
end
|
|
|
|
UpdateUI()
|
|
end
|
|
|
|
local function PauseSession()
|
|
if self.Session.IsRunning then
|
|
self.Session.IsRunning = false
|
|
self.Session.IsPaused = true
|
|
|
|
self.Session.Time = self.Session.Time + time() - self.Session.StartTime
|
|
self.Session.StartTime = nil
|
|
end
|
|
|
|
UpdateUI()
|
|
end
|
|
|
|
local function StopSession()
|
|
self.Session.IsPaused = false
|
|
|
|
if self.Session.IsRunning then
|
|
self.Session.IsRunning = false
|
|
|
|
self.Session.Time = self.Session.Time + time() - self.Session.StartTime
|
|
self.Session.StartTime = nil
|
|
end
|
|
|
|
UpdateUI()
|
|
end
|
|
|
|
UpdateUI = function()
|
|
local seconds = GetCurrentDuration()
|
|
local isFarmEnded = false
|
|
if self.Session.IsRunning and self.Session.Timer and self.Session.Timer <= seconds then
|
|
StopSession()
|
|
PlaySound(15757, "master")
|
|
return
|
|
end
|
|
|
|
if self.Session.Timer then
|
|
seconds = self.Session.Timer - seconds
|
|
if seconds <= 0 then
|
|
isFarmEnded = true
|
|
seconds = GetCurrentDuration()
|
|
end
|
|
end
|
|
|
|
local hours = math.floor(seconds / 60 / 60)
|
|
seconds = seconds - hours * 60 * 60
|
|
local minutes = math.floor(seconds / 60)
|
|
seconds = seconds - minutes * 60
|
|
|
|
local timeResource = isFarmEnded and "FarmEndedFormat" or self.Session.Timer and "TimeLeftFormat" or "TimeLabelFormat"
|
|
|
|
self.UI.TimeLabel:SetText(string.format(core.GetString(timeResource), hours, minutes, seconds))
|
|
self.UI.TimeLabel:SetWidth(self.UI.TimeLabel.label:GetStringWidth() + 5)
|
|
self.UI.ButtonsPanel:DoLayout()
|
|
|
|
local location = ""
|
|
|
|
if self.Session.MapId then
|
|
location = core.LocationHelper.GetMapName(self.Session.MapId)
|
|
end
|
|
|
|
local name = self.Session.Mode == "location" and core.LocationHelper.GetMapName(self.Session.NameMapId)
|
|
or self.Session.Mode == "item" and (self.Session.ItemLink or core.TSMHelper.GetItemLink(self.Session.ItemId))
|
|
or self.Session.Name
|
|
|
|
self.UI.TitleLabel:SetText(string.format(core.GetString("NameLabelFormat"), name))
|
|
|
|
self.UI.LocationLabel:SetText(string.format(core.GetString("LocationLabelFormat"), location))
|
|
|
|
self.UI.MoneyLabel:SetText(string.format(core.GetString("RawGoldLabelFormat"), core.TSMHelper.ToMoneyString(self.Session.Money)))
|
|
|
|
local itemValue = 0
|
|
|
|
for _, item in pairs(self.Session.Results) do
|
|
local unitPrice = core.TSMHelper.GetItemPrice(item.Id == core.TSMHelper.PetCageItemId and 'p:'.. item.PetId or item.Id) or 0
|
|
itemValue = itemValue + unitPrice * item.Quantity
|
|
end
|
|
|
|
self.UI.ItemValueLabel:SetText(string.format(core.GetString("ItemsValueLabelFormat"), core.TSMHelper.ToMoneyString(itemValue)))
|
|
self.UI.TotalValueLabel:SetText(string.format(core.GetString(self.Mode == "Compact" and "TotalValueLabelFormatCompact" or "TotalValueLabelFormat"), core.TSMHelper.ToMoneyString(itemValue + self.Session.Money)))
|
|
self.UI.IsGroupFarmCheckBox:SetValue(self.Session.IsGroupFarm or false)
|
|
self.UI.IsGroupFarmCheckBox:SetLabel(string.format(core.GetString(self.Session.IsGroupFarm and "TrackGroupLootPlayers" or "TrackGroupLoot"), self.Session.NumberOfPlayers or 1))
|
|
|
|
local route = self.Session.RouteZone ~= nil and {
|
|
Name = self.Session.RouteName,
|
|
Data = self.Session.RouteData,
|
|
Zone = { Id = self.Session.RouteZone, Name = C_Map.GetMapInfo(self.Session.RouteZone).name }
|
|
} or nil
|
|
self.UI.RoutePicker:SetValue(route)
|
|
|
|
self.UI.PlayButton:Toggle(not self.Session.IsRunning and not isFarmEnded)
|
|
self.UI.PauseButton:Toggle(self.Session.IsRunning)
|
|
self.UI.StopButton:Toggle(self.Session.IsRunning or self.Session.IsPaused)
|
|
|
|
self.LastUpdated = time()
|
|
end
|
|
|
|
local function ResetSession()
|
|
self.Session = NewSession()
|
|
core.Config.SetCurrentRecorderSession(self.Session)
|
|
|
|
if self.UI.LootGrid then
|
|
self.UI.LootGrid.Show(self.Session.Results)
|
|
end
|
|
|
|
UpdateUI()
|
|
end
|
|
|
|
local function NormaliseSession(session, createCopy)
|
|
session = createCopy and core.TableHelper.DeepCopy(session) or session
|
|
session.Mode = session.Mode or session.ItemId and "item" or session.NameMapId and "location" or "text"
|
|
|
|
if session.Mode == "location" then
|
|
session.Name = nil
|
|
session.ItemId = nil
|
|
elseif session.Mode == "item" then
|
|
session.Name = nil
|
|
session.NameMapId = nil
|
|
else
|
|
session.ItemId = nil
|
|
session.NameMapId = nil
|
|
session.Name = session.Name or ""
|
|
end
|
|
|
|
if session.Routes and #session.Routes == 1 then
|
|
session.RouteZone = session.Routes[1].RouteZone
|
|
session.RouteKey = session.Routes[1].RouteKey
|
|
session.RouteName = session.Routes[1].RouteName
|
|
session.RouteData = session.Routes[1].RouteData
|
|
session.Routes = nil
|
|
end
|
|
|
|
return session
|
|
end
|
|
|
|
local function SetCurrentLocation()
|
|
self.Session.MapId = core.LocationHelper.GetPlayerCurrentMapId()
|
|
UpdateUI()
|
|
end
|
|
|
|
local function SetNameAsCurrentLocation()
|
|
self.Session.NameMapId = core.LocationHelper.GetPlayerCurrentMapId()
|
|
self.Session.ItemId = nil
|
|
self.Session.PetId = nil
|
|
self.Session.ItemLink = nil
|
|
self.Session.Name = nil
|
|
self.Session.Mode = "location"
|
|
UpdateUI()
|
|
end
|
|
|
|
local function SetFarmName()
|
|
local type, id, itemLink = GetCursorInfo()
|
|
if type == 'item' then
|
|
if id == core.TSMHelper.PetCageItemId then
|
|
self.Session.PetId = tonumber(itemLink:match(BPET_ID_REGEX))
|
|
self.Session.ItemLink = itemLink
|
|
else
|
|
self.Session.PetId = nil
|
|
self.Session.ItemLink = nil
|
|
end
|
|
self.Session.ItemId = id
|
|
self.Session.Name = nil
|
|
self.Session.NameMapId = nil
|
|
self.Session.Mode = "item"
|
|
UpdateUI()
|
|
else
|
|
if IsShiftKeyDown() and self.Session.Mode == "item" and self.Session.ItemId then
|
|
ChatEdit_InsertLink(self.Session.ItemLink or core.TSMHelper.GetItemLink(self.Session.ItemId))
|
|
return
|
|
end
|
|
|
|
local onAccept = function(dialog)
|
|
local name = dialog.editBox:GetText()
|
|
|
|
if strlen(name) > 0 then
|
|
self.Session.Name = name
|
|
self.Session.ItemId = nil
|
|
self.Session.PetId = nil
|
|
self.Session.ItemLink = nil
|
|
self.Session.NameMapId = nil
|
|
self.Session.Mode = "text"
|
|
UpdateUI()
|
|
end
|
|
end
|
|
|
|
core.UI.ShowDialog({
|
|
Text = core.GetString("SetFarmNameMessage"),
|
|
Button1 = core.GetString("Set"),
|
|
Button2 = core.GetString("Cancel"),
|
|
Button3 = core.GetString("UseLocation"),
|
|
HasEditBox = true,
|
|
TextBoxValue = self.Session.Name or "",
|
|
OnAccept = onAccept,
|
|
OnAlt = SetNameAsCurrentLocation
|
|
})
|
|
end
|
|
end
|
|
|
|
local function SetRawGold()
|
|
core.UI.InputDialog({ Text = core.GetString("ChangeRawGoldMessage"), HasEditBox = true, IsNumeric = true, TextBoxValue = tostring(self.Session.Money), OnAccept = function(dialog)
|
|
local value = tonumber(dialog.editBox:GetText())
|
|
if value ~= nil then
|
|
self.Session.Money = value
|
|
UpdateUI()
|
|
end
|
|
end })
|
|
end
|
|
|
|
local function SetTime()
|
|
if self.Session.IsRunning then
|
|
print(core.GetString("RecordingInProgress"))
|
|
return
|
|
end
|
|
local currentTime = math.ceil(GetCurrentDuration() / 60)
|
|
|
|
core.UI.InputDialog({ Text = core.GetString("SetTimeMessage"), HasEditBox = true, IsNumeric = true, TextBoxValue = tostring(currentTime), OnAccept = function(dialog)
|
|
local value = tonumber(dialog.editBox:GetText())
|
|
if value ~= nil then
|
|
self.Session.Time = value * 60
|
|
UpdateUI()
|
|
end
|
|
end })
|
|
end
|
|
|
|
local function SetTimer()
|
|
if self.Session.IsRunning then
|
|
print(core.GetString("RecordingInProgress"))
|
|
return
|
|
end
|
|
local currentTimer = self.Session.Timer and math.ceil(self.Session.Timer / 60) or 60
|
|
local onAccept = function(dialog)
|
|
local value = tonumber(dialog.editBox:GetText())
|
|
if value ~= nil and value ~= 0 then
|
|
self.Session.Timer = value * 60
|
|
UpdateUI()
|
|
end
|
|
end
|
|
local onAlt = function(dialog)
|
|
self.Session.Timer = nil
|
|
UpdateUI()
|
|
end
|
|
|
|
core.UI.InputDialog({
|
|
Text = core.GetString("SetTimerMessage"),
|
|
Button3 = core.GetString("ClearTimer"),
|
|
HasEditBox = true,
|
|
IsNumeric = true,
|
|
TextBoxValue = tostring(currentTimer),
|
|
OnAccept = onAccept,
|
|
OnAlt = onAlt
|
|
})
|
|
end
|
|
|
|
function SortJunk(row)
|
|
for _, item in pairs(core.TableHelper.ShallowCopy(self.Session.Results)) do
|
|
if not item.PetId and core.ScrapHelper.IsJunk(item.Id) then
|
|
local itemSellPrice = nil
|
|
if item.ItemLink then
|
|
_, _, _, _, _, _, _, _, _, _, itemSellPrice = GetItemInfo(item.ItemLink)
|
|
end
|
|
itemSellPrice = itemSellPrice or core.TSMHelper.GetItemVendorSellPrice(item.Id)
|
|
self.Session.Money = self.Session.Money + (itemSellPrice or 0) * (item.Quantity or 0)
|
|
core.TableHelper.RemoveValue(self.Session.Results, item)
|
|
end
|
|
end
|
|
|
|
self.UI.LootGrid.ClearCache()
|
|
self.UI.LootGrid.Reload()
|
|
UpdateUI()
|
|
end
|
|
|
|
local function SetIsGroupFarm(isGroup)
|
|
if isGroup then
|
|
self.UI.IsGroupFarmCheckBox:SetValue(false)
|
|
core.UI.InputDialog({ Text = core.GetString("SetNumberOfPlayers"), HasEditBox = true, IsNumeric = true, TextBoxValue = self.Session.NumberOfPlayers or "5", OnAccept = function(dialog)
|
|
local value = tonumber(dialog.editBox:GetText())
|
|
if value ~= nil and value > 0 and value <= 50 then
|
|
self.Session.NumberOfPlayers = value
|
|
self.Session.IsGroupFarm = true
|
|
UpdateUI()
|
|
end
|
|
end })
|
|
else
|
|
self.Session.IsGroupFarm = false
|
|
end
|
|
|
|
UpdateUI()
|
|
end
|
|
|
|
local function SetupRoute(session)
|
|
if session.RouteZone and session.RouteKey and session.RouteName and session.RouteData then
|
|
local route = {
|
|
RouteZone = session.RouteZone,
|
|
RouteKey = session.RouteKey,
|
|
RouteName = session.RouteName,
|
|
RouteData = session.RouteData
|
|
}
|
|
|
|
session.Routes = { route }
|
|
session.RouteZone = nil
|
|
session.RouteKey = nil
|
|
session.RouteName = nil
|
|
session.RouteData = nil
|
|
end
|
|
end
|
|
|
|
local function Save()
|
|
local farms = core.Config.GetUserFarms()
|
|
local data = NormaliseSession(self.Session, true)
|
|
SetupRoute(data)
|
|
|
|
for i, farm in pairs(farms) do
|
|
if farm.Id == data.Id then
|
|
tremove(farms, i)
|
|
end
|
|
end
|
|
|
|
table.insert(farms, data)
|
|
|
|
core.UserDataModule.ClearCache()
|
|
core.DashboardModule.ClearCache()
|
|
|
|
if core.UI.MainWindow.CurrentModule() == core.UserDataModule then
|
|
core.UI.MainWindow.ShowModule(core.UserDataModule)
|
|
elseif core.UI.MainWindow.CurrentModule() == core.DashboardModule then
|
|
core.UI.MainWindow.ShowModule(core.DashboardModule)
|
|
end
|
|
end
|
|
|
|
local function OnRouteChanged(s, event, route)
|
|
self.Session.RouteZone = route and route.Zone.Id or nil
|
|
self.Session.RouteKey = route and route.Name:gsub("%s", "\255") or nil
|
|
self.Session.RouteName = route and route.Name or nil
|
|
self.Session.RouteData = route and route.Data or nil
|
|
end
|
|
|
|
local function ClearRoute()
|
|
self.Session.RouteZone = nil
|
|
self.Session.RouteKey = nil
|
|
self.Session.RouteName = nil
|
|
self.Session.RouteData = nil
|
|
|
|
self.ImportedRouteLabel:SetText(GetRouteName())
|
|
end
|
|
|
|
local function ProcessItem(itemId, quantity, itemLink, itemRarity, bindType, itemSellPrice)
|
|
local addItem = (bindType ~= 1 or core.TSMHelper.HasCustomPrice(itemId)) and not core.ScrapHelper.IsJunk(itemId) and itemRarity >= core.Config.GetRecorderMinQuality() and (core.TSMHelper.GetItemPrice(itemId) or -1) >= core.Config.GetRecorderMinPrice()
|
|
|
|
if addItem then
|
|
local item
|
|
for _, i in pairs(self.Session.Results) do
|
|
if i.Id == itemId then
|
|
item = i
|
|
end
|
|
end
|
|
|
|
if item then
|
|
item.Quantity = item.Quantity + quantity
|
|
else
|
|
table.insert(self.Session.Results, { Id = itemId, Quantity = quantity, ItemLink = itemLink })
|
|
end
|
|
else
|
|
self.Session.Money = self.Session.Money + (itemSellPrice or 0) * quantity
|
|
end
|
|
|
|
self.UI.LootGrid.ClearCache()
|
|
self.UI.LootGrid.Reload()
|
|
UpdateUI()
|
|
end
|
|
|
|
local function OnEvent(_, event, arg)
|
|
if self.Session.IsPaused and (event == "CHAT_MSG_MONEY" or (event == "CHAT_MSG_LOOT" and arg:match(LOOT_ITEM_SELF_REGEX))) then
|
|
ResumeSession()
|
|
end
|
|
|
|
if not self.Session.IsRunning then return end
|
|
|
|
if event == "CHAT_MSG_LOOT" then
|
|
local itemId, quantity, itemLink
|
|
|
|
_, itemId, _, quantity = arg:match(LOOT_ITEM_SELF_ITEMID_MULTIPLE_REGEX)
|
|
itemLink = arg:match(LOOT_ITEM_SELF_MULTIPLE_REGEX)
|
|
|
|
if not itemId then
|
|
_, itemId = arg:match(LOOT_ITEM_SELF_ITEMID_REGEX)
|
|
itemLink, sss = arg:match(LOOT_ITEM_SELF_REGEX)
|
|
quantity = 1
|
|
end
|
|
|
|
if not itemId and self.Session.IsGroupFarm then
|
|
_, _, itemId, _, quantity = arg:match(LOOT_ITEM_ITEMID_MULTIPLE_REGEX)
|
|
_, itemLink = arg:match(LOOT_ITEM_MULTIPLE_REGEX)
|
|
|
|
if not itemId then
|
|
_, _, itemId = arg:match(LOOT_ITEM_ITEMID_REGEX)
|
|
_, itemLink, sss = arg:match(LOOT_ITEM_REGEX)
|
|
quantity = 1
|
|
end
|
|
end
|
|
|
|
if itemId then
|
|
itemId = tonumber(itemId)
|
|
|
|
if type(quantity) == "string" then quantity = tonumber(quantity) end
|
|
|
|
local itemName, _, itemRarity, _, _, _, _, _, _, _, itemSellPrice, _, _, bindType = GetItemInfo(itemLink)
|
|
|
|
if itemName ~= nil then
|
|
ProcessItem(itemId, quantity, itemLink, itemRarity, bindType, itemSellPrice)
|
|
else
|
|
local queuedItem = {}
|
|
|
|
for i, item in pairs(self.ItemQueue) do
|
|
if item.Id == itemId then
|
|
queuedItem = tremove(farms, i)
|
|
end
|
|
end
|
|
|
|
queuedItem.Id = itemId
|
|
queuedItem.Quantity = (queuedItem.Quantity or 0) + quantity
|
|
queuedItem.ItemLink = itemLink
|
|
|
|
table.insert(self.ItemQueue, queuedItem)
|
|
end
|
|
end
|
|
|
|
UpdateUI()
|
|
elseif event == "GET_ITEM_INFO_RECEIVED" then
|
|
for i, item in pairs(self.ItemQueue) do
|
|
if item.Id == arg then
|
|
local itemName, _, itemRarity, _, _, _, _, _, _, _, itemSellPrice, _, _, bindType = GetItemInfo(item.ItemLink)
|
|
|
|
if itemName ~= nil then
|
|
ProcessItem(item.Id, item.Quantity, item.ItemLink, itemRarity, bindType, itemSellPrice)
|
|
tremove(self.ItemQueue, i)
|
|
end
|
|
end
|
|
end
|
|
elseif event == "CHAT_MSG_MONEY" then
|
|
local gold = arg:match(GOLD_AMOUNT_REGEX)
|
|
local silver = arg:match(SILVER_AMOUNT_REGEX)
|
|
local copper = arg:match(COPPER_AMOUNT_REGEX)
|
|
|
|
local sum = ((gold or 0)*100 + (silver or 0))*100 + (copper or 0)
|
|
|
|
self.Session.Money = self.Session.Money + sum
|
|
|
|
UpdateUI()
|
|
end
|
|
end
|
|
|
|
local function LoadSession(session)
|
|
self.Session = NormaliseSession(session, true)
|
|
core.Config.SetCurrentRecorderSession(self.Session)
|
|
self.UI.LootGrid.Show(self.Session.Results)
|
|
UpdateUI()
|
|
end
|
|
|
|
local function OnUpdate()
|
|
if self.Session.IsRunning and self.LastUpdated ~= time() then
|
|
UpdateUI()
|
|
end
|
|
end
|
|
|
|
local function AddItem()
|
|
local type, id, itemLink = GetCursorInfo()
|
|
if type == 'item' then
|
|
local item
|
|
local petId = (id == core.TSMHelper.PetCageItemId and tonumber(itemLink:match(BPET_ID_REGEX))) or nil
|
|
|
|
for _, i in pairs(self.Session.Results) do
|
|
if i.Id == id and i.PetId == petId then
|
|
item = i
|
|
end
|
|
end
|
|
|
|
if item then
|
|
item.Quantity = item.Quantity + 1
|
|
else
|
|
item = { Id = id, Quantity = 1, ItemLink = itemLink }
|
|
if petId then
|
|
item.PetId = petId
|
|
end
|
|
table.insert(self.Session.Results, item)
|
|
end
|
|
|
|
self.UI.LootGrid.ClearCache()
|
|
self.UI.LootGrid.Reload()
|
|
end
|
|
end
|
|
|
|
local function SetMode(mode)
|
|
self.Mode = mode
|
|
WITDB.Settings.Recorder.Mode = mode
|
|
|
|
self.UI.CompactModeButton:Enable()
|
|
self.UI.DetailsModeButton:Enable()
|
|
self.UI.EditModeButton:Enable()
|
|
|
|
if mode == "Compact" then
|
|
self.UI.CompactModeButton:Disable()
|
|
self.UI.Frame:SetWidth(155)
|
|
self.UI.Frame:SetHeight(130)
|
|
elseif mode == "Details" then
|
|
self.UI.DetailsModeButton:Disable()
|
|
self.UI.Frame:SetWidth(285)
|
|
self.UI.Frame:SetHeight(155)
|
|
elseif mode == "Edit" then
|
|
self.UI.EditModeButton:Disable()
|
|
self.UI.Frame:SetWidth(420)
|
|
self.UI.Frame:SetHeight(536)
|
|
end
|
|
|
|
if WITDB.Settings.Recorder.Top then
|
|
self.UI.Frame:ClearAllPoints()
|
|
self.UI.Frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", WITDB.Settings.Recorder.Left, WITDB.Settings.Recorder.Top)
|
|
end
|
|
|
|
wipe(self.UI.Frame.children)
|
|
wipe(self.UI.Hidden.children)
|
|
|
|
local compactTarget = self.UI.Frame
|
|
local detailsTarget = mode == "Compact" and self.UI.Hidden or self.UI.Frame
|
|
local editTarget = mode == "Edit" and self.UI.Frame or self.UI.Hidden
|
|
|
|
compactTarget:AddChild(self.UI.ButtonsPanel)
|
|
|
|
detailsTarget:AddChild(self.UI.TitleLabel)
|
|
|
|
detailsTarget:AddChild(self.UI.LocationLabel)
|
|
editTarget:AddChild(self.UI.RoutePicker)
|
|
detailsTarget:AddChild(self.UI.MoneyLabel)
|
|
detailsTarget:AddChild(self.UI.ItemValueLabel)
|
|
compactTarget:AddChild(self.UI.TotalValueLabel)
|
|
editTarget:AddChild(self.UI.IsGroupFarmCheckBox)
|
|
|
|
editTarget:AddChild(self.UI.AddItemIcon)
|
|
editTarget:AddChild(self.UI.LootFrame)
|
|
self.UI.LootFrame:DoLayout()
|
|
|
|
editTarget:AddChild(self.UI.SortJunkButton)
|
|
|
|
compactTarget:AddChild(self.UI.ResetInstancesButton)
|
|
|
|
UpdateUI()
|
|
end
|
|
|
|
local function SetFrameTooltip(frame, text)
|
|
frame:SetScript("OnEnter", function()
|
|
GameTooltip:SetOwner(frame, "ANCHOR_PRESERVE")
|
|
GameTooltip:ClearAllPoints()
|
|
GameTooltip:SetPoint("TOP", frame, "BOTTOM")
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:AddLine(text)
|
|
GameTooltip:Show()
|
|
end)
|
|
frame:SetScript("OnLeave", function()
|
|
GameTooltip:Hide()
|
|
end)
|
|
end
|
|
|
|
local function lootContextMenu(module, row)
|
|
return {
|
|
{
|
|
Name = "SetQuantity",
|
|
DisplayName = core.GetString("SetQuantity"),
|
|
Action = function(row)
|
|
core.UI.InputDialog({ Text = core.GetString("SetQuantityMessage"), HasEditBox = true, IsNumeric = true, Data = row.Data, TextBoxValue = tostring(row.Data.Quantity), OnAccept = function(dialog, data)
|
|
local value = tonumber(dialog.editBox:GetText())
|
|
if value ~= nil and value > 0 then
|
|
data.Quantity = value
|
|
self.UI.LootGrid.ClearCache()
|
|
self.UI.LootGrid.Reload()
|
|
UpdateUI()
|
|
end
|
|
end })
|
|
end,
|
|
ActionArg = row,
|
|
},
|
|
{
|
|
Name = "Vendor",
|
|
DisplayName = core.GetString("Vendor"),
|
|
Action = function(row)
|
|
local itemSellPrice = nil
|
|
|
|
if row.Data.ItemLink then
|
|
_, _, _, _, _, _, _, _, _, _, itemSellPrice = GetItemInfo(row.Data.ItemLink)
|
|
end
|
|
|
|
itemSellPrice = itemSellPrice or core.TSMHelper.GetItemVendorSellPrice(row.Data.Id)
|
|
self.Session.Money = self.Session.Money + (itemSellPrice or 0) * (row.Data.Quantity or 0)
|
|
core.TableHelper.RemoveValue(self.Session.Results, row.Data)
|
|
self.UI.LootGrid.ClearCache()
|
|
self.UI.LootGrid.Reload()
|
|
UpdateUI()
|
|
end,
|
|
ActionArg = row,
|
|
},
|
|
{
|
|
Name = "Remove",
|
|
DisplayName = core.GetString("Remove"),
|
|
Action = function(row)
|
|
core.TableHelper.RemoveValue(self.Session.Results, row.Data)
|
|
self.UI.LootGrid.ClearCache()
|
|
self.UI.LootGrid.Reload()
|
|
UpdateUI()
|
|
end,
|
|
ActionArg = row,
|
|
},
|
|
}
|
|
end
|
|
|
|
local function timerMenu()
|
|
return {
|
|
Children =
|
|
{
|
|
{
|
|
Name = "Change",
|
|
DisplayName = core.GetString("Change"),
|
|
Action = SetTime
|
|
},
|
|
{
|
|
Name = "SetTimer",
|
|
DisplayName = core.GetString("SetTimer"),
|
|
Action = SetTimer
|
|
},
|
|
}
|
|
}
|
|
end
|
|
|
|
local function Init()
|
|
self.UI = {}
|
|
|
|
self.UI.Frame = AceGUI:Create("Window")
|
|
self.UI.Frame:SetTitle(core.GetString("Recorder"))
|
|
self.UI.Frame.titletext:SetJustifyH("LEFT")
|
|
self.UI.Frame:EnableResize(false)
|
|
|
|
if WITDB.Settings.Recorder.Top then
|
|
self.UI.Frame:ClearAllPoints()
|
|
self.UI.Frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", WITDB.Settings.Recorder.Left, WITDB.Settings.Recorder.Top)
|
|
end
|
|
|
|
self.UI.Frame.title:HookScript("OnMouseUp", function()
|
|
WITDB.Settings.Recorder.Top = self.UI.Frame.frame:GetTop()
|
|
WITDB.Settings.Recorder.Left = self.UI.Frame.frame:GetLeft()
|
|
end)
|
|
|
|
self.UI.EditModeButton = CreateFrame("Button", nil, self.UI.Frame.frame, "UIPanelButtonTemplate")
|
|
self.UI.EditModeButton:SetPoint("TOPRIGHT", self.UI.Frame.closebutton, "TOPLEFT", 4, -4)
|
|
self.UI.EditModeButton:SetWidth(24)
|
|
self.UI.EditModeButton:SetNormalTexture("Interface\\AddOns\\WIT\\Images\\Icons\\mode_edit")
|
|
self.UI.EditModeButton:SetScript("OnClick", function() SetMode("Edit") end)
|
|
SetFrameTooltip(self.UI.EditModeButton, core.GetString("EditMode"))
|
|
|
|
self.UI.DetailsModeButton = CreateFrame("Button", nil, self.UI.Frame.frame, "UIPanelButtonTemplate")
|
|
self.UI.DetailsModeButton:SetPoint("TOPRIGHT", self.UI.EditModeButton, "TOPLEFT")
|
|
self.UI.DetailsModeButton:SetWidth(24)
|
|
self.UI.DetailsModeButton:SetNormalTexture("Interface\\AddOns\\WIT\\Images\\Icons\\mode_details")
|
|
self.UI.DetailsModeButton:SetScript("OnClick", function() SetMode("Details") end)
|
|
SetFrameTooltip(self.UI.DetailsModeButton, core.GetString("StandardMode"))
|
|
|
|
self.UI.CompactModeButton = CreateFrame("Button", nil, self.UI.Frame.frame, "UIPanelButtonTemplate")
|
|
self.UI.CompactModeButton:SetPoint("TOPRIGHT", self.UI.DetailsModeButton, "TOPLEFT")
|
|
self.UI.CompactModeButton:SetWidth(24)
|
|
self.UI.CompactModeButton:SetNormalTexture("Interface\\AddOns\\WIT\\Images\\Icons\\mode_compact")
|
|
self.UI.CompactModeButton:SetScript("OnClick", function() SetMode("Compact") end)
|
|
SetFrameTooltip(self.UI.CompactModeButton, core.GetString("CompactMode"))
|
|
|
|
self.UI.Frame.title:SetPoint("BOTTOMRIGHT", self.UI.CompactModeButton, "BOTTOMLEFT")
|
|
|
|
self.UI.NewButton = core.UI.ActionIcon({ Icon = "Interface\\AddOns\\WIT\\Images\\Icons\\new" })
|
|
self.UI.NewButton:OnClick(function()
|
|
core.UI.ConfirmableDialog({ Text = core.GetString("NewSessionConfirmationMessage"), OnAccept = function()
|
|
ResetSession()
|
|
end })
|
|
end)
|
|
self.UI.SaveButton = core.UI.ActionIcon({ Icon = "Interface\\AddOns\\WIT\\Images\\Icons\\save" })
|
|
self.UI.SaveButton:OnClick(Save)
|
|
self.UI.PlayButton = core.UI.ActionIcon({ Icon = "Interface\\AddOns\\WIT\\Images\\Icons\\play" })
|
|
self.UI.PlayButton:OnClick(ResumeSession)
|
|
self.UI.PauseButton = core.UI.ActionIcon({ Icon = "Interface\\AddOns\\WIT\\Images\\Icons\\pause" })
|
|
self.UI.PauseButton:OnClick(PauseSession)
|
|
self.UI.StopButton = core.UI.ActionIcon({ Icon = "Interface\\AddOns\\WIT\\Images\\Icons\\stop" })
|
|
self.UI.StopButton:OnClick(StopSession)
|
|
|
|
self.UI.RoutePicker = core.UI.RoutePicker()
|
|
self.UI.RoutePicker:SetCallback("OnValueChanged", OnRouteChanged)
|
|
|
|
self.UI.TimeLabel = AceGUI:Create("InteractiveLabel")
|
|
core.UI.ApplyContextMenuToFrame(self.UI.TimeLabel, timerMenu())
|
|
|
|
self.UI.TitleLabel = AceGUI:Create("InteractiveLabel")
|
|
self.UI.TitleLabel:SetFullWidth(true)
|
|
self.UI.TitleLabel:SetCallback("OnClick", SetFarmName)
|
|
self.UI.TitleLabel:SetCallback("OnEnter", function()
|
|
GameTooltip:SetOwner(self.UI.TitleLabel.frame, "ANCHOR_PRESERVE")
|
|
GameTooltip:ClearAllPoints()
|
|
if self.Session.Mode == "item" and self.Session.ItemId then
|
|
local x = self.UI.TitleLabel.label:GetStringWidth() + 5
|
|
GameTooltip:SetPoint("LEFT", self.UI.TitleLabel.frame, "LEFT", x, 0)
|
|
if self.Session.PetId then
|
|
BattlePetToolTip_ShowLink(self.Session.ItemLink)
|
|
else
|
|
GameTooltip:SetHyperlink("item:" .. self.Session.ItemId)
|
|
GameTooltip:Show()
|
|
end
|
|
else
|
|
GameTooltip:SetPoint("TOP", self.UI.TitleLabel.frame, "BOTTOM")
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:AddLine(core.GetString("SetFarmNameTooltip"))
|
|
GameTooltip:Show()
|
|
end
|
|
end)
|
|
self.UI.TitleLabel:SetCallback("OnLeave", function()
|
|
if self.Session.PetId then
|
|
BattlePetTooltip:Hide()
|
|
else
|
|
GameTooltip:Hide()
|
|
end
|
|
end)
|
|
|
|
self.UI.LocationLabel = AceGUI:Create("InteractiveLabel")
|
|
self.UI.LocationLabel:SetFullWidth(true)
|
|
self.UI.LocationLabel:SetCallback("OnClick", function() core.UI.ConfirmableDialog({ Text = core.GetString("SessionSetCurrentLocationConfirmationMessage"), OnAccept = SetCurrentLocation }) end)
|
|
|
|
self.UI.MoneyLabel = AceGUI:Create("InteractiveLabel")
|
|
self.UI.MoneyLabel:SetFullWidth(true)
|
|
self.UI.MoneyLabel:SetCallback("OnClick", SetRawGold)
|
|
self.UI.ItemValueLabel = AceGUI:Create("Label")
|
|
self.UI.ItemValueLabel:SetFullWidth(true)
|
|
self.UI.TotalValueLabel = AceGUI:Create("Label")
|
|
self.UI.TotalValueLabel:SetFullWidth(true)
|
|
|
|
self.UI.IsGroupFarmCheckBox = AceGUI:Create("CheckBox")
|
|
self.UI.IsGroupFarmCheckBox:SetLabel(core.GetString("TrackGroupLoot"))
|
|
self.UI.IsGroupFarmCheckBox:SetCallback("OnValueChanged", function(_, _, isChecked) SetIsGroupFarm(isChecked) end)
|
|
SetFrameTooltip(self.UI.IsGroupFarmCheckBox.frame, core.GetString("TrackGroupLootTooltip"))
|
|
|
|
self.UI.ResetInstancesButton = AceGUI:Create("Button")
|
|
self.UI.ResetInstancesButton:SetText(core.GetString("ResetAllInstances"))
|
|
self.UI.ResetInstancesButton:SetFullWidth(true)
|
|
self.UI.ResetInstancesButton:SetCallback("OnClick", ResetInstances)
|
|
|
|
self.UI.SortJunkButton = AceGUI:Create("Button")
|
|
self.UI.SortJunkButton:SetText(core.GetString("SortJunk"))
|
|
self.UI.SortJunkButton:SetFullWidth(true)
|
|
self.UI.SortJunkButton:SetCallback("OnClick", SortJunk)
|
|
self.UI.SortJunkButton:SetCallback("OnEnter", function()
|
|
GameTooltip:SetOwner(self.UI.SortJunkButton.frame, "ANCHOR_PRESERVE")
|
|
GameTooltip:ClearAllPoints()
|
|
GameTooltip:SetPoint("LEFT", self.UI.SortJunkButton.frame, "RIGHT")
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:AddLine(core.GetString("SortJunkTooltip"))
|
|
GameTooltip:Show()
|
|
end)
|
|
self.UI.SortJunkButton:SetCallback("OnLeave", function()
|
|
GameTooltip:Hide()
|
|
end)
|
|
self.UI.SortJunkButton:SetDisabled(not core.ScrapHelper.IsScrapAvailable())
|
|
|
|
self.UI.ButtonsPanel = AceGUI:Create("SimpleGroup")
|
|
self.UI.ButtonsPanel:SetLayout("Flow")
|
|
self.UI.ButtonsPanel:SetFullWidth(true)
|
|
|
|
self.UI.ButtonsPanel:AddChild(self.UI.NewButton)
|
|
self.UI.ButtonsPanel:AddChild(self.UI.SaveButton)
|
|
self.UI.ButtonsPanel:AddChild(self.UI.PlayButton)
|
|
self.UI.ButtonsPanel:AddChild(self.UI.PauseButton)
|
|
self.UI.ButtonsPanel:AddChild(self.UI.StopButton)
|
|
self.UI.ButtonsPanel:AddChild(self.UI.TimeLabel)
|
|
|
|
self.UI.AddItemIcon = AceGUI:Create("Icon")
|
|
self.UI.AddItemIcon:SetLabel(core.GetString("AddItem"))
|
|
self.UI.AddItemIcon:SetImageSize(48, 48)
|
|
self.UI.AddItemIcon:SetFullWidth(true)
|
|
self.UI.AddItemIcon:SetImage("Interface\\BUTTONS\\UI-EmptySlot")
|
|
self.UI.AddItemIcon:SetCallback("OnClick", AddItem)
|
|
|
|
self.UI.LootFrame = AceGUI:Create("SimpleGroup")
|
|
self.UI.LootFrame:SetFullWidth(true)
|
|
self.UI.LootFrame:SetHeight(250)
|
|
self.UI.LootFrame:SetLayout("Fill")
|
|
|
|
local scrollFrame = AceGUI:Create("WITScrollFrame")
|
|
scrollFrame:SetLayout("WITList")
|
|
|
|
local columns = {
|
|
core.GridColumns.ContextMenuColumn({ GetMenu = lootContextMenu }),
|
|
core.GridColumns.ItemNameColumn({ ItemIdProperty = "Id" }),
|
|
core.GridColumns.ItemValueColumn()
|
|
}
|
|
local options = {
|
|
MinWidth = 390,
|
|
Columns = columns,
|
|
Sort = { Column = columns[2], Direction = "ASC" }
|
|
}
|
|
self.UI.LootGrid = core.UI.Grid(options)
|
|
self.UI.LootGrid.Show(self.Session.Results)
|
|
self.UI.LootGrid:SetCallback("OnReload", function() scrollFrame:DoLayout() scrollFrame:FixScroll() end)
|
|
|
|
scrollFrame:AddChild(self.UI.LootGrid)
|
|
self.UI.LootFrame:AddChild(scrollFrame)
|
|
|
|
self.UI.Hidden = AceGUI:Create("SimpleGroup")
|
|
self.UI.Hidden.frame:Hide()
|
|
end
|
|
|
|
function core.ResetRecorderPosition()
|
|
wipe(WITDB.Settings.Recorder)
|
|
|
|
if self then
|
|
self.UI.Frame:ClearAllPoints()
|
|
self.UI.Frame:SetPoint("CENTER",UIParent,"CENTER")
|
|
end
|
|
end
|
|
|
|
function core.Recorder()
|
|
if self then return self end
|
|
self = {}
|
|
|
|
self.ItemQueue = {}
|
|
self.Session = NormaliseSession(core.Config.GetCurrentRecorderSession() or NewSession())
|
|
core.Config.SetCurrentRecorderSession(self.Session)
|
|
|
|
if self.Session.IsRunning and self.Session.CurrentTime ~= nil then
|
|
self.Session.Time = self.Session.Time + self.Session.CurrentTime - self.Session.StartTime
|
|
self.Session.IsRunning = false
|
|
end
|
|
|
|
Init()
|
|
|
|
SetMode(WITDB.Settings.Recorder.Mode or "Details")
|
|
|
|
self.UI.Frame.frame:RegisterEvent("CHAT_MSG_LOOT")
|
|
self.UI.Frame.frame:RegisterEvent("CHAT_MSG_MONEY")
|
|
self.UI.Frame.frame:RegisterEvent("GET_ITEM_INFO_RECEIVED")
|
|
self.UI.Frame.frame:SetScript("OnEvent", OnEvent)
|
|
self.UI.Frame.frame:SetScript("OnUpdate", OnUpdate)
|
|
|
|
self.Show = function(mode)
|
|
self.UI.Frame:Show()
|
|
end
|
|
|
|
self.LoadSession = LoadSession
|
|
|
|
return self
|
|
end
|