Skip to content

Instantly share code, notes, and snippets.

@Wetxius
Created May 7, 2019 15:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Wetxius/11ad57d607fbd7eb51f13bf69b1fa579 to your computer and use it in GitHub Desktop.
Save Wetxius/11ad57d607fbd7eb51f13bf69b1fa579 to your computer and use it in GitHub Desktop.
ShestakUI\Modules\Loot\Loot.lua
local T, C, L, _ = unpack(select(2, ...))
if C.loot.lootframe ~= true then return end
----------------------------------------------------------------------------------------
-- Loot frame(Butsu by Haste)
----------------------------------------------------------------------------------------
local _, _NS = ...
local Butsu = CreateFrame("Button", "Butsu")
local lb = CreateFrame("Button", "ButsuAdv", Butsu, "UIPanelScrollDownButtonTemplate")
local LDD = CreateFrame("Frame", "ButsuLDD", Butsu, "UIDropDownMenuTemplate")
Butsu:Hide()
Butsu:SetScript("OnEvent", function(self, event, ...)
self[event](self, event, ...)
end)
function Butsu:LOOT_OPENED()
self:Show()
lb:Show()
if not self:IsShown() then
CloseLoot(not autoLoot)
end
if IsFishingLoot() then
self.title:SetText(L_LOOT_FISH)
elseif not UnitIsFriend("player", "target") and UnitIsDead("target") then
self.title:SetText(UnitName("target"))
else
self.title:SetText(LOOT)
end
-- Blizzard uses strings here
if GetCVar("lootUnderMouse") == "1" then
local x, y = GetCursorPosition()
x = x / self:GetEffectiveScale()
y = y / self:GetEffectiveScale()
self:ClearAllPoints()
self:SetPoint("TOPLEFT", nil, "BOTTOMLEFT", x - 40, y + 20)
self:GetCenter()
self:Raise()
end
local m = 0
local items = GetNumLootItems()
if items > 0 then
for i = 1, items do
local slot = _NS.slots[i] or _NS.CreateSlot(i)
local texture, item, quantity, _, quality, _, isQuestItem, questId, isActive = GetLootSlotInfo(i)
if texture then
local color = ITEM_QUALITY_COLORS[quality]
local r, g, b = color.r, color.g, color.b
if GetLootSlotType(i) == LOOT_SLOT_MONEY then
item = item:gsub("\n", ", ")
end
if quantity and quantity > 1 then
slot.count:SetText(quantity)
slot.count:Show()
else
slot.count:Hide()
end
if questId and not isActive then
slot.quest:Show()
else
slot.quest:Hide()
end
if color or questId or isQuestItem then
if questId or isQuestItem then
r, g, b = 1, 1, 0.2
end
slot.iconFrame:SetBackdropBorderColor(r, g, b)
slot.backdrop:SetBackdropBorderColor(r, g, b)
slot.drop:SetVertexColor(r, g, b)
end
slot.drop:Show()
slot.isQuestItem = isQuestItem
slot.quality = quality
slot.name:SetText(item)
if color then
slot.name:SetTextColor(r, g, b)
end
slot.icon:SetTexture(texture)
if quality then
m = math.max(m, quality)
end
slot:Enable()
slot:Show()
end
end
else
local slot = _NS.slots[1] or _NS.CreateSlot(1)
local color = ITEM_QUALITY_COLORS[0]
slot.name:SetText(EMPTY)
slot.name:SetTextColor(color.r, color.g, color.b)
slot.icon:SetTexture("Interface\\Icons\\INV_Misc_Herb_AncientLichen")
slot.count:Hide()
slot.drop:Hide()
slot:Disable()
slot:Show()
end
self:AnchorSlots()
local color = ITEM_QUALITY_COLORS[m]
self:SetBackdropBorderColor(color.r, color.g, color.b, 0.8)
self:SetWidth(C.loot.width)
self.title:SetWidth(C.loot.width - 45)
self.title:SetHeight(C.font.loot_font_size)
end
Butsu:RegisterEvent("LOOT_OPENED")
function Butsu:LOOT_SLOT_CLEARED(_, slot)
if not self:IsShown() then return end
_NS.slots[slot]:Hide()
self:AnchorSlots()
end
Butsu:RegisterEvent("LOOT_SLOT_CLEARED")
function Butsu:LOOT_CLOSED()
StaticPopup_Hide("LOOT_BIND")
self:Hide()
lb:Hide()
for _, v in pairs(_NS.slots) do
v:Hide()
end
end
Butsu:RegisterEvent("LOOT_CLOSED")
function Butsu:OPEN_MASTER_LOOT_LIST()
ToggleDropDownMenu(nil, nil, GroupLootDropDown, LootFrame.selectedLootButton, 0, 0)
end
Butsu:RegisterEvent("OPEN_MASTER_LOOT_LIST")
function Butsu:UPDATE_MASTER_LOOT_LIST()
UIDropDownMenu_Refresh(GroupLootDropDown)
end
Butsu:RegisterEvent("UPDATE_MASTER_LOOT_LIST")
do
local title = Butsu:CreateFontString(nil, "OVERLAY")
title:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style)
title:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0)
title:SetJustifyH("LEFT")
title:SetPoint("TOPLEFT", Butsu, "TOPLEFT", 8, -7)
Butsu.title = title
end
Butsu:SetScript("OnMouseDown", function(self, button)
if IsAltKeyDown() then
self:StartMoving()
elseif IsControlKeyDown() and button == "RightButton" then
self:SetPoint(unpack(C.position.loot))
end
end)
Butsu:SetScript("OnMouseUp", function(self)
self:StopMovingOrSizing()
end)
Butsu:SetScript("OnHide", function()
StaticPopup_Hide("CONFIRM_LOOT_DISTRIBUTION")
CloseLoot()
end)
Butsu:SetMovable(true)
Butsu:RegisterForClicks("AnyUp")
Butsu:SetParent(UIParent)
Butsu:SetUserPlaced(true)
Butsu:SetPoint(unpack(C.position.loot))
Butsu:SetTemplate("Transparent")
Butsu:SetClampedToScreen(true)
Butsu:SetFrameStrata("DIALOG")
Butsu:SetToplevel(true)
Butsu:SetFrameLevel(10)
local close = CreateFrame("Button", "LootCloseButton", Butsu, "UIPanelCloseButton")
T.SkinCloseButton(close, nil, nil, true)
close:SetSize(14, 14)
close:SetScript("OnClick", function() CloseLoot() end)
----------------------------------------------------------------------------------------
-- Announce loot(lcLoot by RustamIrzaev)
----------------------------------------------------------------------------------------
local function Announce(chn)
local nums = GetNumLootItems()
if nums == 0 or (nums == 1 and GetLootSlotType(1) == LOOT_SLOT_MONEY) then return end
if UnitIsPlayer("target") or not UnitExists("target") then
SendChatMessage(">> "..LOOT..":", chn)
else
SendChatMessage(">> "..LOOT.." - '"..UnitName("target").."':", chn)
end
for i = 1, GetNumLootItems() do
if LootSlotHasItem(i) then
local link = GetLootSlotLink(i)
local messlink = "- %s"
if GetLootSlotType(i) ~= LOOT_SLOT_MONEY then
SendChatMessage(format(messlink, link), chn)
end
end
end
end
local function LDD_OnClick(self)
local val = self.value
Announce(val)
end
local function LDD_Initialize()
local info = {}
info.text = L_LOOT_ANNOUNCE
info.notCheckable = true
info.isTitle = true
UIDropDownMenu_AddButton(info)
info = {}
info.text = L_LOOT_TO_RAID
info.value = "raid"
info.notCheckable = 1
info.func = LDD_OnClick
UIDropDownMenu_AddButton(info)
info = {}
info.text = L_LOOT_TO_GUILD
info.value = "guild"
info.notCheckable = 1
info.func = LDD_OnClick
UIDropDownMenu_AddButton(info)
info = {}
info.text = L_LOOT_TO_PARTY
info.value = "party"
info.notCheckable = 1
info.func = LDD_OnClick
UIDropDownMenu_AddButton(info)
info = {}
info.text = L_LOOT_TO_SAY
info.value = "say"
info.notCheckable = 1
info.func = LDD_OnClick
UIDropDownMenu_AddButton(info)
info = nil
end
T.SkinCloseButton(lb, LootCloseButton, "-", true)
lb:SetSize(14, 14)
lb:ClearAllPoints()
lb:SetPoint("BOTTOMRIGHT", Butsu, "TOPRIGHT", -21, -18)
lb:SetFrameStrata("DIALOG")
lb:RegisterForClicks("RightButtonUp", "LeftButtonUp")
lb:SetScript("OnClick", function(_, button)
if button == "RightButton" then
ToggleDropDownMenu(nil, nil, LDD, lb, 0, 0)
else
Announce(T.CheckChat())
end
end)
lb:Hide()
UIDropDownMenu_Initialize(LDD, LDD_Initialize, "MENU")
do
local slots = {}
_NS.slots = slots
local OnEnter = function(self)
local slot = self:GetID()
if LootSlotHasItem(slot) then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetLootItem(slot)
CursorUpdate(self)
end
self.drop:Show()
if self.isQuestItem then
self.drop:SetVertexColor(0.8, 0.8, 0.2)
else
self.drop:SetVertexColor(1, 1, 0)
end
end
local OnLeave = function(self)
local color = ITEM_QUALITY_COLORS[self.quality]
if self.isQuestItem then
self.drop:SetVertexColor(1, 1, 0.2)
elseif color then
self.drop:SetVertexColor(color.r, color.g, color.b)
end
GameTooltip:Hide()
ResetCursor()
end
local OnClick = function(self)
if IsModifiedClick() then
HandleModifiedItemClick(GetLootSlotLink(self:GetID()))
else
StaticPopup_Hide("CONFIRM_LOOT_DISTRIBUTION")
LootFrame.selectedLootButton = self
LootFrame.selectedSlot = self:GetID()
LootFrame.selectedQuality = self.quality
LootFrame.selectedItemName = self.name:GetText()
LootSlot(self:GetID())
end
end
local OnUpdate = function(self)
if GameTooltip:IsOwned(self) then
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetLootItem(self:GetID())
CursorOnUpdate(self)
end
end
function _NS.CreateSlot(id)
local frame = CreateFrame("Button", "ButsuSlot"..id, Butsu)
frame:SetHeight(math.max(C.font.loot_font_size, C.loot.icon_size))
frame:SetID(id)
frame:RegisterForClicks("LeftButtonUp", "RightButtonUp")
frame:SetScript("OnEnter", OnEnter)
frame:SetScript("OnLeave", OnLeave)
frame:SetScript("OnClick", OnClick)
frame:SetScript("OnUpdate", OnUpdate)
local iconFrame = CreateFrame("Frame", nil, frame)
iconFrame:SetSize(C.loot.icon_size, C.loot.icon_size)
iconFrame:SetTemplate("Default")
iconFrame:SetPoint("LEFT", frame)
frame.iconFrame = iconFrame
local icon = iconFrame:CreateTexture(nil, "ARTWORK")
icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
icon:SetPoint("TOPLEFT", 2, -2)
icon:SetPoint("BOTTOMRIGHT", -2, 2)
frame.icon = icon
local quest = iconFrame:CreateTexture(nil, "OVERLAY")
quest:SetTexture("Interface\\Minimap\\ObjectIcons")
quest:SetTexCoord(1/8, 2/8, 1/8, 2/8)
quest:SetSize(C.loot.icon_size * 0.8, C.loot.icon_size * 0.8)
quest:SetPoint("BOTTOMLEFT", -C.loot.icon_size * 0.15, 0)
frame.quest = quest
local count = iconFrame:CreateFontString(nil, "OVERLAY")
count:SetJustifyH("RIGHT")
count:SetPoint("BOTTOMRIGHT", iconFrame, "BOTTOMRIGHT", 1, 1)
count:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style)
count:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0)
count:SetText(1)
frame.count = count
local name = frame:CreateFontString(nil, "OVERLAY")
name:SetJustifyH("LEFT")
name:SetPoint("LEFT", icon, "RIGHT", 10, 0)
name:SetNonSpaceWrap(true)
name:SetFont(C.font.loot_font, C.font.loot_font_size, C.font.loot_font_style)
name:SetShadowOffset(C.font.loot_font_shadow and 1 or 0, C.font.loot_font_shadow and -1 or 0)
name:SetWidth(C.loot.width - C.loot.icon_size - 25)
name:SetHeight(C.font.loot_font_size)
frame.name = name
local drop = frame:CreateTexture(nil, "ARTWORK")
drop:SetTexture(C.media.blank)
drop:SetPoint("TOPLEFT", C.loot.icon_size + 5, -2)
drop:SetPoint("BOTTOMRIGHT", -2, 2)
drop:SetAlpha(0.5)
frame.drop = drop
frame:CreateBackdrop("Default")
frame.backdrop:SetPoint("TOPLEFT", C.loot.icon_size + 3, 0)
frame.backdrop:SetPoint("BOTTOMRIGHT")
slots[id] = frame
return frame
end
function Butsu:AnchorSlots()
local frameSize = math.max(C.loot.icon_size, C.loot.icon_size)
local shownSlots = 0
local prevShown
for i = 1, #slots do
local frame = slots[i]
if frame:IsShown() then
frame:ClearAllPoints()
frame:SetPoint("LEFT", 8, 0)
frame:SetPoint("RIGHT", -8, 0)
if not prevShown then
frame:SetPoint("TOPLEFT", self, 8, -25)
else
frame:SetPoint("TOP", prevShown, "BOTTOM", 0, -3)
end
frame:SetHeight(frameSize)
shownSlots = shownSlots + 1
prevShown = frame
end
end
self:SetHeight((shownSlots * (frameSize + 3)) + 30)
end
end
-- Kill the default loot frame
LootFrame:UnregisterAllEvents()
-- Escape the dungeon
table.insert(UISpecialFrames, "Butsu")
----------------------------------------------------------------------------------------
-- Faster looting(Leatrix Plus by Leatrix)
----------------------------------------------------------------------------------------
do
-- Time delay
local tDelay = 0
-- Fast loot function
local function FastLoot()
if GetTime() - tDelay >= 0.3 then
tDelay = GetTime()
Butsu:SetAlpha(1)
if GetCVarBool("autoLootDefault") ~= IsModifiedClick("AUTOLOOTTOGGLE") then
Butsu:SetAlpha(0)
for i = GetNumLootItems(), 1, -1 do
LootSlot(i)
end
tDelay = GetTime()
end
end
end
-- Event frame
local faster = CreateFrame("Frame")
faster:RegisterEvent("LOOT_READY")
faster:SetScript("OnEvent", FastLoot)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment