eluna-scripts-ornfelt/lua/WowEmulationScriptPack/Lua/AddOns/RemorseView.lua
2024-09-23 07:59:23 +02:00

278 lines
No EOL
8.6 KiB
Lua

local AIO = AIO or require("AIO")
if AIO.AddAddon() then
return
end
local RemorseviewHandlers = AIO.AddHandlers("RV", {})
local function GetItemInfoTexture(name)
local _, _, _, _, _, _, _, _, _, texture = GetItemInfo(name);
return texture
end
-- ========== Containers ==========
local function ContainerFrame_Update_Hook(frame)
local id = frame:GetID();
local name = frame:GetName();
local itemButton;
local texture, itemCount, locked, quality, readable;
for i=1, frame.size, 1 do
itemButton = getglobal(name.."Item"..i);
local itemLink = GetContainerItemLink(id, itemButton:GetID());
if (itemLink) then
texture = GetItemInfoTexture(itemLink);
else
texture = nil;
end
_, itemCount, locked, quality, readable = GetContainerItemInfo(id, itemButton:GetID());
SetItemButtonTexture(itemButton, texture);
SetItemButtonCount(itemButton, itemCount);
SetItemButtonDesaturated(itemButton, locked, 0.5, 0.5, 0.5);
if ( texture ) then
ContainerFrame_UpdateCooldown(id, itemButton);
itemButton.hasItem = 1;
itemButton.locked = locked;
itemButton.readable = readable;
else
getglobal(name.."Item"..i.."Cooldown"):Hide();
itemButton.hasItem = nil;
end
end
end
-- ========== Action Buttons ==========
local function ActionButton_Update_Hook()
-- Special case code for bonus bar buttons
-- Prevents the button from updating if the bonusbar is still in an animation transition
if ( this.isBonus and this.inTransition ) then
return;
end
local action = this.action;
local icon = getglobal(this:GetName().."Icon");
local texture = GetActionTexture(action);
local name = this:GetName();
local type, id, subType = GetActionInfo(action);
if (texture == "Interface\\Icons\\INV_Misc_QuestionMark") and (type == "item") then
texture = GetItemInfoTexture(id);
elseif (texture == "Interface\\Icons\\INV_Misc_QuestionMark") and (type == "spell") then
local spellName = GetSpellName(id, "General");
if (spellName == "Attack") then
texture = GetInventoryItemTexture("player",16);
elseif (spellName == "Auto Shot") then
texture = GetInventoryItemTexture("player",18);
end
end
-- Update icon
if ( texture ) then
icon:SetTexture(texture);
icon:Show();
else
icon:Hide();
end
end
local function ActionButton_OnEvent_Hook(event)
if (event == "PLAYER_AURAS_CHANGED") then
ActionButton_Update();
end
end
-- ========== Spellbook Attack Button ==========
local function SpellButton_UpdateButton_Hook()
local id = SpellBook_GetSpellID(this:GetID());
local name = this:GetName();
local iconTexture = getglobal(name.."IconTexture");
local spellString = getglobal(name.."SpellName");
local subSpellString = getglobal(name.."SubSpellName");
if (SpellBookFrame.bookType == BOOKTYPE_PET) then
return;
end
local spellName, subSpellName = GetSpellName(id, SpellBookFrame.bookType);
local texture = GetSpellTexture(id, SpellBookFrame.bookType);
if (texture == "Interface\\Icons\\INV_Misc_QuestionMark") then
if (spellName == "Attack") then
-- Texture for main hand weapon
texture = GetInventoryItemTexture("player",16);
elseif (spellName == "Auto Shot") then
-- Texture for ranged weapon
texture = GetInventoryItemTexture("player",18);
end
local highlightTexture = getglobal(name.."Highlight");
local normalTexture = getglobal(name.."NormalTexture");
-- If no spell, hide everything and return
if ( not texture or (strlen(texture) == 0) ) then
iconTexture:Hide();
spellString:Hide();
subSpellString:Hide();
cooldown:Hide();
autoCastableTexture:Hide();
autoCastModel:Hide();
highlightTexture:SetTexture("Interface\\Buttons\\ButtonHilight-Square");
this:SetChecked(0);
normalTexture:SetVertexColor(1.0, 1.0, 1.0);
return;
end
iconTexture:SetTexture(texture);
iconTexture:Show();
SpellButton_UpdateSelection();
end
end
local function SpellButton_OnShow_Hook()
this:RegisterEvent("PLAYER_AURAS_CHANGED");
end
local function SpellButton_OnHide_Hook()
this:UnregisterEvent("PLAYER_AURAS_CHANGED");
end
local function SpellButton_OnEvent_Hook(event)
if (event == "PLAYER_AURAS_CHANGED" ) then
SpellButton_UpdateButton();
end
end
-- ========== Bank buttons ==========
local function BankFrameItemButton_Update_Hook(button)
local texture = getglobal(button:GetName().."IconTexture");
local inventoryID = button:GetInventorySlot();
local textureName = GetInventoryItemTexture("player",inventoryID);
local slotName = button:GetName();
local id;
local slotTextureName;
button.hasItem = nil;
if( button.isBag ) then
id, slotTextureName = GetInventorySlotInfo(strsub(slotName,10));
local itemLink = GetInventoryItemLink("player",id)
if (itemLink) then
slotTextureName = GetItemInfoTexture(itemLink);
end
end
local itemLink = GetInventoryItemLink("player",inventoryID)
if (itemLink) then
textureName = GetItemInfoTexture(itemLink);
end
if ( textureName ) then
texture:SetTexture(textureName);
texture:Show();
SetItemButtonCount(button,GetInventoryItemCount("player",inventoryID));
button.hasItem = 1;
elseif ( slotTextureName and button.isBag ) then
texture:SetTexture(slotTextureName);
SetItemButtonCount(button,0);
texture:Show();
else
texture:Hide();
SetItemButtonCount(button,0);
end
BankFrameItemButton_UpdateLocked(button);
end
-- ========== Bag Slot Buttons ==========
local f = CreateFrame("Frame", nil, UIParent);
local nextUpdate = 1;
local function SetBagButtonTexture(id)
local frame = getglobal("CharacterBag"..(id - 1).."SlotIconTexture");
local name = GetBagName(id);
if (name) and (frame) then
local texture = GetItemInfoTexture(name);
if (frame:GetTexture() ~= texture) then
frame:SetTexture(texture);
end
end
end
local function BagSlotButton_UpdateChecked_Hook()
for i=1, NUM_CONTAINER_FRAMES, 1 do
SetBagButtonTexture(i);
end
end
function BagSlotButton_OnModifiedClick()
if ( IsModifiedClick("OPENALLBAGS") ) then
OpenAllBags();
end
BagSlotButton_UpdateChecked();
end
f:SetScript("OnUpdate", function (self, elapsed)
nextUpdate = nextUpdate - elapsed;
if (nextUpdate < 0) then
BagSlotButton_UpdateChecked_Hook();
nextUpdate = 1;
end
end);
-- =========== Autoequip custom items on right-clicks to bag slots ==========
local origItemLink;
local function ContainerFrameItemButton_OnEnter_Hook(self)
-- DEFAULT_CHAT_FRAME:AddMessage("(ContainerFrameItemButton_OnEnter) "..tostring(self), 1.0, 1.0, 0.2, 1);
origItemLink = GetContainerItemLink(this:GetParent():GetID(), this:GetID());
end
local function ContainerFrameItemButton_OnClick_Hook(button)
local bagID = this:GetParent():GetID();
local slot = this:GetID();
itemLink = GetContainerItemLink(bagID, slot);
-- DEFAULT_CHAT_FRAME:AddMessage("(ContainerFrameItemButton_OnClick) "..tostring(itemLink)..", "..tostring(origItemLink), 1.0, 1.0, 0.2, 1);
if (button == "RightButton") and (itemLink == origItemLink) then
local _, _, _, _, _, itemType = GetItemInfo(itemLink);
if (itemType == "Armor") or (itemType == "Weapon") then
PickupContainerItem(bagID,slot)
AutoEquipCursorItem();
-- origItemLink = GetContainerItemLink(this:GetParent():GetID(), this:GetID());
end
end
origItemLink = itemLink;
end
-- Secure Hooks
hooksecurefunc("ActionButton_OnEvent", ActionButton_OnEvent_Hook);
hooksecurefunc("ActionButton_Update", ActionButton_Update_Hook);
hooksecurefunc("BankFrameItemButton_Update", BankFrameItemButton_Update_Hook);
hooksecurefunc("BagSlotButton_UpdateChecked", BagSlotButton_UpdateChecked_Hook);
hooksecurefunc("ContainerFrame_Update", ContainerFrame_Update_Hook);
hooksecurefunc("ContainerFrameItemButton_OnEnter", ContainerFrameItemButton_OnEnter_Hook);
hooksecurefunc("ContainerFrameItemButton_OnClick", ContainerFrameItemButton_OnClick_Hook);
hooksecurefunc("SpellButton_OnEvent", SpellButton_OnEvent_Hook);
hooksecurefunc("SpellButton_OnHide", SpellButton_OnHide_Hook);
hooksecurefunc("SpellButton_OnShow", SpellButton_OnShow_Hook);
-- hooksecurefunc("SpellButton_UpdateButton", SpellButton_UpdateButton_Hook);
if( DEFAULT_CHAT_FRAME ) then
DEFAULT_CHAT_FRAME:AddMessage("|cffff8000Remorse View has loaded.|r");
end
WOW_GetContainerItemInfo = GetContainerItemInfo;
function GetContainerItemInfo(index, id)
local texture, itemCount, locked, quality, readable;
texture, itemCount, locked, quality, readable = WOW_GetContainerItemInfo(index, id);
if( texture and string.find(texture,"INV_Misc_QuestionMark") ) then
local itemlink = GetContainerItemLink(index, id);
local itemid = 0;
local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount,
itemEquipLoc, itemTexture = GetItemInfo(itemlink)
if( itemlink ) then
_, _, itemid = string.find(itemlink, "Hitem:(%d+):");
texture = itemTexture;
end
end
return texture, itemCount, locked, quality, readable;
end