|
|
|
|
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
|