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.

162 lines
4.6 KiB

local _, addon = ...
local Gemma = {};
addon.Gemma = Gemma;
Gemma.dataProviders = {};
local GetItemCount = C_Item.GetItemCount;
local IsSpellKnownOrOverridesKnown = IsSpellKnownOrOverridesKnown;
local GetActionInfo = GetActionInfo;
local HasExtraActionBar = HasExtraActionBar;
local GetContainerNumFreeSlots = C_Container.GetContainerNumFreeSlots;
local GetExistingSocketInfo = GetExistingSocketInfo;
local GetNewSocketInfo = GetNewSocketInfo;
local GemData = {};
function Gemma:AddDataProvider(name, dataProvider)
self.dataProviders[name] = dataProvider;
end
function Gemma:GetDataProviderByName(name)
return self.dataProviders[name]
end
function Gemma:SetDataProvider(dataProvider)
self.activeDataProvider = dataProvider;
return dataProvider
end
function Gemma:SetDataProviderByName(name)
return self:SetDataProvider(self.dataProviders[name])
end
function Gemma:GetActiveSchematic()
return self.activeDataProvider.schematic
end
function Gemma:GetActiveTabData()
return self.activeDataProvider.schematic.tabData
end
function Gemma:GetSortedItemList()
return self.activeDataProvider:GetSortedItemList();
end
function Gemma:GetActiveMethods()
return self.activeDataProvider.GemManagerMixin
end
function Gemma:GetGemSpell(itemID)
if self.activeDataProvider.GetGemSpell then
return self.activeDataProvider:GetGemSpell(itemID)
end
end
function Gemma:GetActionButtonMethod(itemID)
if self.activeDataProvider.GetActionButtonMethod then
return self.activeDataProvider:GetActionButtonMethod(itemID)
end
end
function Gemma:GetActiveGems()
return self.activeDataProvider:GetActiveGems();
end
function Gemma:GetNumAvailableGemForStat(statType)
return self.activeDataProvider:GetNumAvailableGemForStat(statType)
end
function Gemma:GetBestStatGemForAction(statType, direction)
return self.activeDataProvider:GetBestStatGemForAction(statType, direction)
end
function Gemma:CanSwapGemInOneStep(itemID)
return self.activeDataProvider:CanSwapGemInOneStep(itemID)
end
function Gemma:GetGemInventorySlotAndIndex(itemID)
return self.activeDataProvider:GetGemInventorySlotAndIndex(itemID)
end
function Gemma:GetGemPositionInBagEquipment(itemID)
return self.activeDataProvider:GetGemPositionInBagEquipment(itemID)
end
function Gemma:GetBestSlotToPlaceGem(itemID)
return self.activeDataProvider:GetBestSlotToPlaceGem(itemID)
end
function Gemma:SetGemRemovalTool(gemItemID, tool)
--tool = {type, id}; {"spell", spellID}, {"item", itemID}
if not GemData[gemItemID] then
GemData[gemItemID] = {};
end
GemData[gemItemID].removalTool = tool;
end
function Gemma:GetGemRemovalTool(gemItemID)
return GemData[gemItemID] and GemData[gemItemID].removalTool
end
function Gemma:IsGemRemovable(gemItemID)
local tool = self:GetGemRemovalTool(gemItemID);
local canRemove, requirementMet;
if tool then
canRemove = true;
local type = tool[1];
if type == "spell" then
local spellID = tool[2];
requirementMet = IsSpellKnownOrOverridesKnown(spellID);
if not requirementMet then
if HasExtraActionBar() then
local actionType, id, subType = GetActionInfo(217); --ExtraActionButton
if actionType == "spell" and id == spellID then
requirementMet = true;
end
end
end
elseif type == "item" then
local count = GetItemCount(tool[2]);
requirementMet = count and count > 0;
end
else
canRemove = false;
requirementMet = false;
end
return canRemove, requirementMet
end
function Gemma:DoesBagHaveFreeSlot()
for bagIndex = 0, 4 do
local numFreeSlots, bagType = GetContainerNumFreeSlots(bagIndex);
if (numFreeSlots and numFreeSlots > 0) and (bagType == 0 or bagType == 10) then
return true
end
end
end
function Gemma:DoesBagHaveEnoughSpace(requiredBagSpace)
local totalFree = 0;
for bagIndex = 0, 4 do
local numFreeSlots, bagType = GetContainerNumFreeSlots(bagIndex);
if (bagType == 0 or bagType == 10) then
totalFree = totalFree + numFreeSlots;
end
end
return totalFree >= requiredBagSpace
end
function Gemma.IsSocketOccupied(socketIndex)
local a = GetExistingSocketInfo(socketIndex);
local b = GetNewSocketInfo(socketIndex);
return a or b
end