Skip to content

Commit

Permalink
Updated to retail codebase with Classic Changes
Browse files Browse the repository at this point in the history
Full update to the retail codebase with additional changes to work with the WOTLK Classic clients.  Lots of improvements, too many to mention here.
  • Loading branch information
Softrix committed May 20, 2023
1 parent 4da6fa4 commit 44cf2db
Show file tree
Hide file tree
Showing 28 changed files with 5,335 additions and 6,930 deletions.
Binary file added Icons/Envoker.tga
Binary file not shown.
20 changes: 20 additions & 0 deletions Libs/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"Lua.diagnostics.globals": [
"LibStub",
"LibStub",
"SMARTBUFF_TITLE",
"SMARTBUFF_TITLE",
"SMARTBUFF_Options",
"SMARTBUFF_Options",
"SMARTBUFF_OToggleBuff",
"SMARTBUFF_OToggleBuff",
"SMARTDEBUFF_ToggleSF",
"SMARTDEBUFF_ToggleSF",
"SMARTBUFF_OptionsFrame_Toggle",
"SMARTBUFF_OptionsFrame_Toggle",
"SMARTBUFF_TITAN_TT",
"SMARTBUFF_TITAN_TT",
"SMARTBUFF_OToggle",
"SMARTBUFF_OToggle"
]
}
45 changes: 45 additions & 0 deletions Libs/Broker_SmartBuff/Broker_SmartBuff.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
-------------------------------------------------------------------------------
-- Broker: SmartBuff
-- Created by Aeldra (EU-Proudmoore)
--
-- Data Broker support
-------------------------------------------------------------------------------

if (not SMARTBUFF_TITLE) then return end

local F = CreateFrame("Frame", "Broker_SmartBuff");

function SMARTBUFF_BROKER_SetIcon()
if (not F.LS) then return end
if (SMARTBUFF_Options and SMARTBUFF_Options.Toggle) then
F.LS.icon = "Interface\\AddOns\\SmartBuff\\Icons\\IconEnabled";
else
F.LS.icon = "Interface\\AddOns\\SmartBuff\\Icons\\IconDisabled";
end
end

F.LS = LibStub:GetLibrary("LibDataBroker-1.1"):NewDataObject("SmartBuff", {
type = "launcher",
label = SMARTBUFF_TITLE,
OnClick = function(_, msg)
if (msg == "RightButton") then
SMARTBUFF_OToggle();
SMARTBUFF_BROKER_SetIcon(); -- bug fix, credit: SunNova
elseif (msg == "LeftButton" and IsAltKeyDown()) then
if (IsAddOnLoaded("SmartDebuff")) then
SMARTDEBUFF_ToggleSF();
end
elseif (msg == "LeftButton") then
SMARTBUFF_OptionsFrame_Toggle();
end
end,
icon = "Interface\\AddOns\\SmartBuff\\Icons\\IconDisabled",
OnTooltipShow = function(tooltip)
if (not tooltip or not tooltip.AddLine) then return end
tooltip:AddLine("|cffffffff"..SMARTBUFF_TITLE.."|r");
tooltip:AddLine(SMARTBUFF_TITAN_TT);
end,
});

F:Hide();
--print("Borker - SmartBuff loaded");
10 changes: 10 additions & 0 deletions Libs/Broker_SmartBuff/Broker_SmartBuff.toc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
## Interface: 90207
## Title: Broker: Smart|cffffffffBuff|r
## Version: 1.90207
## Notes: SmartBuff support for Data Broker
## Author: |cff20d2ffAeldra|r (EU-Proudmoore)
## Dependencies: SmartBuff
## X-Category: Miscellaneous

LibDataBroker-1.1.lua
Broker_SmartBuff.lua
90 changes: 90 additions & 0 deletions Libs/Broker_SmartBuff/LibDataBroker-1.1.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@

assert(LibStub, "LibDataBroker-1.1 requires LibStub")
assert(LibStub:GetLibrary("CallbackHandler-1.0", true), "LibDataBroker-1.1 requires CallbackHandler-1.0")

local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 4)
if not lib then return end
oldminor = oldminor or 0


lib.callbacks = lib.callbacks or LibStub:GetLibrary("CallbackHandler-1.0"):New(lib)
lib.attributestorage, lib.namestorage, lib.proxystorage = lib.attributestorage or {}, lib.namestorage or {}, lib.proxystorage or {}
local attributestorage, namestorage, callbacks = lib.attributestorage, lib.namestorage, lib.callbacks

if oldminor < 2 then
lib.domt = {
__metatable = "access denied",
__index = function(self, key) return attributestorage[self] and attributestorage[self][key] end,
}
end

if oldminor < 3 then
lib.domt.__newindex = function(self, key, value)
if not attributestorage[self] then attributestorage[self] = {} end
if attributestorage[self][key] == value then return end
attributestorage[self][key] = value
local name = namestorage[self]
if not name then return end
callbacks:Fire("LibDataBroker_AttributeChanged", name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged_"..name, name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged_"..name.."_"..key, name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged__"..key, name, key, value, self)
end
end

if oldminor < 2 then
function lib:NewDataObject(name, dataobj)
if self.proxystorage[name] then return end

if dataobj then
assert(type(dataobj) == "table", "Invalid dataobj, must be nil or a table")
self.attributestorage[dataobj] = {}
for i,v in pairs(dataobj) do
self.attributestorage[dataobj][i] = v
dataobj[i] = nil
end
end
dataobj = setmetatable(dataobj or {}, self.domt)
self.proxystorage[name], self.namestorage[dataobj] = dataobj, name
self.callbacks:Fire("LibDataBroker_DataObjectCreated", name, dataobj)
return dataobj
end
end

if oldminor < 1 then
function lib:DataObjectIterator()
return pairs(self.proxystorage)
end

function lib:GetDataObjectByName(dataobjectname)
return self.proxystorage[dataobjectname]
end

function lib:GetNameByDataObject(dataobject)
return self.namestorage[dataobject]
end
end

if oldminor < 4 then
local next = pairs(attributestorage)
function lib:pairs(dataobject_or_name)
local t = type(dataobject_or_name)
assert(t == "string" or t == "table", "Usage: ldb:pairs('dataobjectname') or ldb:pairs(dataobject)")

local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name
assert(attributestorage[dataobj], "Data object not found")

return next, attributestorage[dataobj], nil
end

local ipairs_iter = ipairs(attributestorage)
function lib:ipairs(dataobject_or_name)
local t = type(dataobject_or_name)
assert(t == "string" or t == "table", "Usage: ldb:ipairs('dataobjectname') or ldb:ipairs(dataobject)")

local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name
assert(attributestorage[dataobj], "Data object not found")

return ipairs_iter, attributestorage[dataobj], 0
end
end
212 changes: 212 additions & 0 deletions Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
--[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]]
local MAJOR, MINOR = "CallbackHandler-1.0", 7
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)

if not CallbackHandler then return end -- No upgrade needed

local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}

-- Lua APIs
local tconcat = table.concat
local assert, error, loadstring = assert, error, loadstring
local setmetatable, rawset, rawget = setmetatable, rawset, rawget
local next, select, pairs, type, tostring = next, select, pairs, type, tostring

-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: geterrorhandler

local xpcall = xpcall

local function errorhandler(err)
return geterrorhandler()(err)
end

local function Dispatch(handlers, ...)
local index, method = next(handlers)
if not method then return end
repeat
xpcall(method, errorhandler, ...)
index, method = next(handlers, index)
until not method
end

--------------------------------------------------------------------------
-- CallbackHandler:New
--
-- target - target object to embed public APIs in
-- RegisterName - name of the callback registration API, default "RegisterCallback"
-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.

function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName)

RegisterName = RegisterName or "RegisterCallback"
UnregisterName = UnregisterName or "UnregisterCallback"
if UnregisterAllName==nil then -- false is used to indicate "don't want this method"
UnregisterAllName = "UnregisterAllCallbacks"
end

-- we declare all objects and exported APIs inside this closure to quickly gain access
-- to e.g. function names, the "target" parameter, etc


-- Create the registry object
local events = setmetatable({}, meta)
local registry = { recurse=0, events=events }

-- registry:Fire() - fires the given event/message into the registry
function registry:Fire(eventname, ...)
if not rawget(events, eventname) or not next(events[eventname]) then return end
local oldrecurse = registry.recurse
registry.recurse = oldrecurse + 1

Dispatch(events[eventname], eventname, ...)

registry.recurse = oldrecurse

if registry.insertQueue and oldrecurse==0 then
-- Something in one of our callbacks wanted to register more callbacks; they got queued
for eventname,callbacks in pairs(registry.insertQueue) do
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
for self,func in pairs(callbacks) do
events[eventname][self] = func
-- fire OnUsed callback?
if first and registry.OnUsed then
registry.OnUsed(registry, target, eventname)
first = nil
end
end
end
registry.insertQueue = nil
end
end

-- Registration of a callback, handles:
-- self["method"], leads to self["method"](self, ...)
-- self with function ref, leads to functionref(...)
-- "addonId" (instead of self) with function ref, leads to functionref(...)
-- all with an optional arg, which, if present, gets passed as first argument (after self if present)
target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
if type(eventname) ~= "string" then
error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
end

method = method or eventname

local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.

if type(method) ~= "string" and type(method) ~= "function" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
end

local regfunc

if type(method) == "string" then
-- self["method"] calling style
if type(self) ~= "table" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
elseif self==target then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
elseif type(self[method]) ~= "function" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
end

if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
local arg=select(1,...)
regfunc = function(...) self[method](self,arg,...) end
else
regfunc = function(...) self[method](self,...) end
end
else
-- function ref with self=object or self="addonId" or self=thread
if type(self)~="table" and type(self)~="string" and type(self)~="thread" then
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2)
end

if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
local arg=select(1,...)
regfunc = function(...) method(arg,...) end
else
regfunc = method
end
end


if events[eventname][self] or registry.recurse<1 then
-- if registry.recurse<1 then
-- we're overwriting an existing entry, or not currently recursing. just set it.
events[eventname][self] = regfunc
-- fire OnUsed callback?
if registry.OnUsed and first then
registry.OnUsed(registry, target, eventname)
end
else
-- we're currently processing a callback in this registry, so delay the registration of this new entry!
-- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
registry.insertQueue = registry.insertQueue or setmetatable({},meta)
registry.insertQueue[eventname][self] = regfunc
end
end

-- Unregister a callback
target[UnregisterName] = function(self, eventname)
if not self or self==target then
error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
end
if type(eventname) ~= "string" then
error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
end
if rawget(events, eventname) and events[eventname][self] then
events[eventname][self] = nil
-- Fire OnUnused callback?
if registry.OnUnused and not next(events[eventname]) then
registry.OnUnused(registry, target, eventname)
end
end
if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
registry.insertQueue[eventname][self] = nil
end
end

-- OPTIONAL: Unregister all callbacks for given selfs/addonIds
if UnregisterAllName then
target[UnregisterAllName] = function(...)
if select("#",...)<1 then
error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
end
if select("#",...)==1 and ...==target then
error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
end


for i=1,select("#",...) do
local self = select(i,...)
if registry.insertQueue then
for eventname, callbacks in pairs(registry.insertQueue) do
if callbacks[self] then
callbacks[self] = nil
end
end
end
for eventname, callbacks in pairs(events) do
if callbacks[self] then
callbacks[self] = nil
-- Fire OnUnused callback?
if registry.OnUnused and not next(callbacks) then
registry.OnUnused(registry, target, eventname)
end
end
end
end
end
end

return registry
end


-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
-- try to upgrade old implicit embeds since the system is selfcontained and
-- relies on closures to work.

Loading

0 comments on commit 44cf2db

Please sign in to comment.