413 lines
12 KiB
Lua
413 lines
12 KiB
Lua
LOOTFRAME_NUMBUTTONS = 4;
|
|
NUM_GROUP_LOOT_FRAMES = 4;
|
|
MASTER_LOOT_THREHOLD = 4;
|
|
|
|
function LootFrame_OnLoad(self)
|
|
self:RegisterEvent("LOOT_OPENED");
|
|
self:RegisterEvent("LOOT_SLOT_CLEARED");
|
|
self:RegisterEvent("LOOT_SLOT_CHANGED");
|
|
self:RegisterEvent("LOOT_CLOSED");
|
|
self:RegisterEvent("OPEN_MASTER_LOOT_LIST");
|
|
self:RegisterEvent("UPDATE_MASTER_LOOT_LIST");
|
|
end
|
|
|
|
function LootFrame_OnEvent(self, event, ...)
|
|
if ( event == "LOOT_OPENED" ) then
|
|
local autoLoot = ...;
|
|
|
|
self.page = 1;
|
|
LootFrame_Show(self);
|
|
if ( not self:IsShown()) then
|
|
CloseLoot(autoLoot == 0); -- The parameter tells code that we were unable to open the UI
|
|
end
|
|
elseif ( event == "LOOT_SLOT_CLEARED" ) then
|
|
local arg1 = ...;
|
|
|
|
if ( not self:IsShown() ) then
|
|
return;
|
|
end
|
|
|
|
local numLootToShow = LOOTFRAME_NUMBUTTONS;
|
|
if ( self.numLootItems > LOOTFRAME_NUMBUTTONS ) then
|
|
numLootToShow = numLootToShow - 1;
|
|
end
|
|
local slot = arg1 - ((self.page - 1) * numLootToShow);
|
|
if ( (slot > 0) and (slot < (numLootToShow + 1)) ) then
|
|
local button = _G["LootButton"..slot];
|
|
if ( button ) then
|
|
button:Hide();
|
|
end
|
|
end
|
|
-- try to move second page of loot items to the first page
|
|
local button;
|
|
local allButtonsHidden = 1;
|
|
|
|
for index = 1, LOOTFRAME_NUMBUTTONS do
|
|
button = _G["LootButton"..index];
|
|
if ( button:IsShown() ) then
|
|
allButtonsHidden = nil;
|
|
end
|
|
end
|
|
if ( allButtonsHidden and LootFrameDownButton:IsShown() ) then
|
|
LootFrame_PageDown();
|
|
end
|
|
return;
|
|
elseif ( event == "LOOT_SLOT_CHANGED" ) then
|
|
local arg1 = ...;
|
|
|
|
if ( not self:IsShown() ) then
|
|
return;
|
|
end
|
|
|
|
local numLootToShow = LOOTFRAME_NUMBUTTONS;
|
|
if ( self.numLootItems > LOOTFRAME_NUMBUTTONS ) then
|
|
numLootToShow = numLootToShow - 1;
|
|
end
|
|
local slot = arg1 - ((self.page - 1) * numLootToShow);
|
|
if ( (slot > 0) and (slot < (numLootToShow + 1)) ) then
|
|
local button = _G["LootButton"..slot];
|
|
if ( button ) then
|
|
LootFrame_UpdateButton(slot);
|
|
end
|
|
end
|
|
elseif ( event == "LOOT_CLOSED" ) then
|
|
StaticPopup_Hide("LOOT_BIND");
|
|
HideUIPanel(self);
|
|
return;
|
|
elseif ( event == "OPEN_MASTER_LOOT_LIST" ) then
|
|
ToggleDropDownMenu(1, nil, GroupLootDropDown, LootFrame.selectedLootButton, 0, 0);
|
|
return;
|
|
elseif ( event == "UPDATE_MASTER_LOOT_LIST" ) then
|
|
UIDropDownMenu_Refresh(GroupLootDropDown);
|
|
end
|
|
end
|
|
|
|
function LootFrame_UpdateButton(index)
|
|
local numLootItems = LootFrame.numLootItems;
|
|
--Logic to determine how many items to show per page
|
|
local numLootToShow = LOOTFRAME_NUMBUTTONS;
|
|
if ( numLootItems > LOOTFRAME_NUMBUTTONS ) then
|
|
numLootToShow = numLootToShow - 1;
|
|
end
|
|
|
|
local button = _G["LootButton"..index];
|
|
local slot = (numLootToShow * (LootFrame.page - 1)) + index;
|
|
if ( slot <= numLootItems ) then
|
|
if ( (LootSlotIsItem(slot) or LootSlotIsCoin(slot)) and index <= numLootToShow ) then
|
|
local texture, item, quantity, quality, locked = GetLootSlotInfo(slot);
|
|
local color = ITEM_QUALITY_COLORS[quality];
|
|
_G["LootButton"..index.."IconTexture"]:SetTexture(texture);
|
|
local text = _G["LootButton"..index.."Text"];
|
|
text:SetText(item);
|
|
if( locked ) then
|
|
SetItemButtonNameFrameVertexColor(button, 1.0, 0, 0);
|
|
SetItemButtonTextureVertexColor(button, 0.9, 0, 0);
|
|
SetItemButtonNormalTextureVertexColor(button, 0.9, 0, 0);
|
|
else
|
|
SetItemButtonNameFrameVertexColor(button, 0.5, 0.5, 0.5);
|
|
SetItemButtonTextureVertexColor(button, 1.0, 1.0, 1.0);
|
|
SetItemButtonNormalTextureVertexColor(button, 1.0, 1.0, 1.0);
|
|
end
|
|
text:SetVertexColor(color.r, color.g, color.b);
|
|
local countString = _G["LootButton"..index.."Count"];
|
|
if ( quantity > 1 ) then
|
|
countString:SetText(quantity);
|
|
countString:Show();
|
|
else
|
|
countString:Hide();
|
|
end
|
|
button.slot = slot;
|
|
button.quality = quality;
|
|
button:Show();
|
|
else
|
|
button:Hide();
|
|
end
|
|
else
|
|
button:Hide();
|
|
end
|
|
end
|
|
|
|
function LootFrame_Update()
|
|
for index = 1, LOOTFRAME_NUMBUTTONS do
|
|
LootFrame_UpdateButton(index);
|
|
end
|
|
if ( LootFrame.page == 1 ) then
|
|
LootFrameUpButton:Hide();
|
|
LootFramePrev:Hide();
|
|
else
|
|
LootFrameUpButton:Show();
|
|
LootFramePrev:Show();
|
|
end
|
|
local numItemsPerPage = LOOTFRAME_NUMBUTTONS;
|
|
if ( LootFrame.numLootItems > LOOTFRAME_NUMBUTTONS ) then
|
|
numItemsPerPage = numItemsPerPage - 1;
|
|
end
|
|
if ( LootFrame.page == ceil(LootFrame.numLootItems / numItemsPerPage) or LootFrame.numLootItems == 0 ) then
|
|
LootFrameDownButton:Hide();
|
|
LootFrameNext:Hide();
|
|
else
|
|
LootFrameDownButton:Show();
|
|
LootFrameNext:Show();
|
|
end
|
|
end
|
|
|
|
function LootFrame_PageDown()
|
|
LootFrame.page = LootFrame.page + 1;
|
|
LootFrame_Update();
|
|
end
|
|
|
|
function LootFrame_PageUp()
|
|
LootFrame.page = LootFrame.page - 1;
|
|
LootFrame_Update();
|
|
end
|
|
|
|
function LootFrame_Show(self)
|
|
ShowUIPanel(self);
|
|
self.numLootItems = GetNumLootItems();
|
|
|
|
if ( GetCVar("lootUnderMouse") == "1" ) then
|
|
-- position loot window under mouse cursor
|
|
local x, y = GetCursorPosition();
|
|
x = x / self:GetEffectiveScale();
|
|
y = y / self:GetEffectiveScale();
|
|
|
|
local posX = x - 175;
|
|
local posY = y + 25;
|
|
|
|
if (self.numLootItems > 0) then
|
|
posX = x - 40;
|
|
posY = y + 55;
|
|
posY = posY + 40;
|
|
end
|
|
|
|
if( posY < 350 ) then
|
|
posY = 350;
|
|
end
|
|
|
|
self:ClearAllPoints();
|
|
self:SetPoint("TOPLEFT", nil, "BOTTOMLEFT", posX, posY);
|
|
self:GetCenter();
|
|
self:Raise();
|
|
end
|
|
|
|
LootFrame_Update();
|
|
LootFramePortraitOverlay:SetTexture("Interface\\TargetingFrame\\TargetDead");
|
|
end
|
|
|
|
function LootFrame_OnShow(self)
|
|
if( self.numLootItems == 0 ) then
|
|
PlaySound("LOOTWINDOWOPENEMPTY");
|
|
elseif( IsFishingLoot() ) then
|
|
PlaySound("FISHING REEL IN");
|
|
LootFramePortraitOverlay:SetTexture("Interface\\LootFrame\\FishingLoot-Icon");
|
|
end
|
|
end
|
|
|
|
function LootFrame_OnHide()
|
|
CloseLoot();
|
|
-- Close any loot distribution confirmation windows
|
|
StaticPopup_Hide("CONFIRM_LOOT_DISTRIBUTION");
|
|
end
|
|
|
|
function LootButton_OnClick(self, button)
|
|
-- Close any loot distribution confirmation windows
|
|
StaticPopup_Hide("CONFIRM_LOOT_DISTRIBUTION");
|
|
|
|
LootFrame.selectedLootButton = self:GetName();
|
|
LootFrame.selectedSlot = self.slot;
|
|
LootFrame.selectedQuality = self.quality;
|
|
LootFrame.selectedItemName = _G[self:GetName().."Text"]:GetText();
|
|
|
|
LootSlot(self.slot);
|
|
end
|
|
|
|
function LootItem_OnEnter(self)
|
|
local slot = ((LOOTFRAME_NUMBUTTONS - 1) * (LootFrame.page - 1)) + self:GetID();
|
|
if ( LootSlotIsItem(slot) ) then
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
GameTooltip:SetLootItem(slot);
|
|
CursorUpdate(self);
|
|
end
|
|
end
|
|
|
|
function GroupLootDropDown_OnLoad(self)
|
|
UIDropDownMenu_Initialize(self, GroupLootDropDown_Initialize, "MENU");
|
|
end
|
|
|
|
function GroupLootDropDown_Initialize()
|
|
local candidate;
|
|
local info = UIDropDownMenu_CreateInfo();
|
|
|
|
if ( UIDROPDOWNMENU_MENU_LEVEL == 2 ) then
|
|
local lastIndex = UIDROPDOWNMENU_MENU_VALUE + 5 - 1;
|
|
for i=UIDROPDOWNMENU_MENU_VALUE, lastIndex do
|
|
candidate = GetMasterLootCandidate(i);
|
|
if ( candidate ) then
|
|
-- Add candidate button
|
|
info.text = candidate;
|
|
info.fontObject = GameFontNormalLeft;
|
|
info.value = i;
|
|
info.notCheckable = 1;
|
|
info.func = GroupLootDropDown_GiveLoot;
|
|
UIDropDownMenu_AddButton(info,UIDROPDOWNMENU_MENU_LEVEL);
|
|
end
|
|
end
|
|
return;
|
|
end
|
|
|
|
if ( GetNumRaidMembers() > 0 ) then
|
|
-- In a raid
|
|
info.isTitle = 1;
|
|
info.text = GIVE_LOOT;
|
|
info.fontObject = GameFontNormalLeft;
|
|
info.notCheckable = 1;
|
|
UIDropDownMenu_AddButton(info);
|
|
|
|
for i=1, 40, 5 do
|
|
for j=i, i+4 do
|
|
candidate = GetMasterLootCandidate(j);
|
|
if ( candidate ) then
|
|
-- Add raid group
|
|
info.isTitle = nil;
|
|
info.text = GROUP.." "..ceil(i/5);
|
|
info.fontObject = GameFontNormalLeft;
|
|
info.hasArrow = 1;
|
|
info.notCheckable = 1;
|
|
info.value = j;
|
|
info.func = nil;
|
|
UIDropDownMenu_AddButton(info);
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
else
|
|
-- In a party
|
|
for i=1, MAX_PARTY_MEMBERS+1, 1 do
|
|
candidate = GetMasterLootCandidate(i);
|
|
if ( candidate ) then
|
|
-- Add candidate button
|
|
info.text = candidate;
|
|
info.fontObject = GameFontNormalLeft;
|
|
info.value = i;
|
|
info.notCheckable = 1;
|
|
info.value = i;
|
|
info.func = GroupLootDropDown_GiveLoot;
|
|
UIDropDownMenu_AddButton(info);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function GroupLootDropDown_GiveLoot(self)
|
|
if ( LootFrame.selectedQuality >= MASTER_LOOT_THREHOLD ) then
|
|
local dialog = StaticPopup_Show("CONFIRM_LOOT_DISTRIBUTION", ITEM_QUALITY_COLORS[LootFrame.selectedQuality].hex..LootFrame.selectedItemName..FONT_COLOR_CODE_CLOSE, self:GetText());
|
|
if ( dialog ) then
|
|
dialog.data = self.value;
|
|
end
|
|
else
|
|
GiveMasterLoot(LootFrame.selectedSlot, self.value);
|
|
end
|
|
CloseDropDownMenus();
|
|
end
|
|
|
|
function GroupLootFrame_OpenNewFrame(id, rollTime)
|
|
local frame;
|
|
for i=1, NUM_GROUP_LOOT_FRAMES do
|
|
frame = _G["GroupLootFrame"..i];
|
|
if ( not frame:IsShown() ) then
|
|
frame.rollID = id;
|
|
frame.rollTime = rollTime;
|
|
_G["GroupLootFrame"..i.."Timer"]:SetMinMaxValues(0, rollTime);
|
|
frame:Show();
|
|
return;
|
|
end
|
|
end
|
|
end
|
|
|
|
function GroupLootFrame_EnableLootButton(button)
|
|
button:Enable();
|
|
button:SetAlpha(1.0);
|
|
SetDesaturation(button:GetNormalTexture(), false);
|
|
end
|
|
|
|
function GroupLootFrame_DisableLootButton(button)
|
|
button:Disable();
|
|
button:SetAlpha(0.35);
|
|
SetDesaturation(button:GetNormalTexture(), true);
|
|
end
|
|
|
|
function GroupLootFrame_OnShow(self)
|
|
AlertFrame_FixAnchors();
|
|
local texture, name, count, quality, bindOnPickUp, canNeed, canGreed, canDisenchant, reasonNeed, reasonGreed, reasonDisenchant, deSkillRequired = GetLootRollItemInfo(self.rollID);
|
|
if (name == nil) then
|
|
self:Hide();
|
|
return;
|
|
end
|
|
if ( bindOnPickUp ) then
|
|
self:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Gold-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Gold-Border", tile = true, tileSize = 32, edgeSize = 32, insets = { left = 11, right = 12, top = 12, bottom = 11 } } );
|
|
_G[self:GetName().."Corner"]:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Gold-Corner");
|
|
_G[self:GetName().."Decoration"]:Show();
|
|
else
|
|
self:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 32, edgeSize = 32, insets = { left = 11, right = 12, top = 12, bottom = 11 } } );
|
|
_G[self:GetName().."Corner"]:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Corner");
|
|
_G[self:GetName().."Decoration"]:Hide();
|
|
end
|
|
|
|
local id = self:GetID();
|
|
_G["GroupLootFrame"..id.."IconFrameIcon"]:SetTexture(texture);
|
|
_G["GroupLootFrame"..id.."Name"]:SetText(name);
|
|
local color = ITEM_QUALITY_COLORS[quality];
|
|
_G["GroupLootFrame"..id.."Name"]:SetVertexColor(color.r, color.g, color.b);
|
|
if ( count > 1 ) then
|
|
_G["GroupLootFrame"..id.."IconFrameCount"]:SetText(count);
|
|
_G["GroupLootFrame"..id.."IconFrameCount"]:Show();
|
|
else
|
|
_G["GroupLootFrame"..id.."IconFrameCount"]:Hide();
|
|
end
|
|
|
|
if ( canNeed ) then
|
|
GroupLootFrame_EnableLootButton(self.needButton);
|
|
self.needButton.reason = nil;
|
|
else
|
|
GroupLootFrame_DisableLootButton(self.needButton);
|
|
self.needButton.reason = _G["LOOT_ROLL_INELIGIBLE_REASON"..reasonNeed];
|
|
end
|
|
if ( canGreed) then
|
|
GroupLootFrame_EnableLootButton(self.greedButton);
|
|
self.greedButton.reason = nil;
|
|
else
|
|
GroupLootFrame_DisableLootButton(self.greedButton);
|
|
self.greedButton.reason = _G["LOOT_ROLL_INELIGIBLE_REASON"..reasonGreed];
|
|
end
|
|
if ( canDisenchant) then
|
|
GroupLootFrame_EnableLootButton(self.disenchantButton);
|
|
self.disenchantButton.reason = nil;
|
|
else
|
|
GroupLootFrame_DisableLootButton(self.disenchantButton);
|
|
self.disenchantButton.reason = format(_G["LOOT_ROLL_INELIGIBLE_REASON"..reasonDisenchant], deSkillRequired);
|
|
end
|
|
end
|
|
|
|
function GroupLootFrame_OnHide (self)
|
|
AlertFrame_FixAnchors();
|
|
end
|
|
|
|
function GroupLootFrame_OnEvent(self, event, ...)
|
|
if ( event == "CANCEL_LOOT_ROLL" ) then
|
|
local arg1 = ...;
|
|
if ( arg1 == self.rollID ) then
|
|
self:Hide();
|
|
StaticPopup_Hide("CONFIRM_LOOT_ROLL", self.rollID);
|
|
end
|
|
end
|
|
end
|
|
|
|
function GroupLootFrame_OnUpdate(self, elapsed)
|
|
local left = GetLootRollTimeLeft(self:GetParent().rollID);
|
|
local min, max = self:GetMinMaxValues();
|
|
if ( (left < min) or (left > max) ) then
|
|
left = min;
|
|
end
|
|
self:SetValue(left);
|
|
end
|