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.
268 lines
6.6 KiB
268 lines
6.6 KiB
|
3 years ago
|
local _, addonTable = ...
|
||
|
|
|
||
|
|
-- Upvalues
|
||
|
|
local pairs = pairs
|
||
|
|
local CONSTANTS = addonTable.constants
|
||
|
|
|
||
|
|
local Item = {
|
||
|
|
expectedFields = {
|
||
|
|
isToy = false,
|
||
|
|
-- Required ItemDB fields
|
||
|
|
name = true,
|
||
|
|
cat = false, -- This should be true, but the property doesn't exist for custom items?
|
||
|
|
type = true,
|
||
|
|
method = true,
|
||
|
|
chance = true,
|
||
|
|
itemId = true,
|
||
|
|
-- arbitraryRequiredTestField = true,
|
||
|
|
|
||
|
|
-- todo if requiresCovenant then requiredCovenantID must be set also
|
||
|
|
|
||
|
|
-- Optional ItemDB fields
|
||
|
|
requiredCovenantID = false,
|
||
|
|
requiresCovenant = false,
|
||
|
|
questId = false,
|
||
|
|
groupSize = false,
|
||
|
|
equalOdds = false,
|
||
|
|
coords = false,
|
||
|
|
sourceText = false,
|
||
|
|
tooltipNpcs = false,
|
||
|
|
tooltipModifier = false,
|
||
|
|
statisticId = false,
|
||
|
|
lockoutDetails = false,
|
||
|
|
instanceDifficulties = false,
|
||
|
|
unique = false,
|
||
|
|
worldQuestId = false,
|
||
|
|
pickpocket = false,
|
||
|
|
requiresCompletedQuestId = false,
|
||
|
|
-- Populated fields (SavedVariables)
|
||
|
|
attempts = false,
|
||
|
|
lastAttempts = false,
|
||
|
|
realAttempts = false,
|
||
|
|
enabled = false,
|
||
|
|
dates = false,
|
||
|
|
holidayTexture = false,
|
||
|
|
known = false,
|
||
|
|
finds = false,
|
||
|
|
found = false,
|
||
|
|
totalFinds = false,
|
||
|
|
time = false,
|
||
|
|
lastTime = false,
|
||
|
|
items = false,
|
||
|
|
excludedMaps = false,
|
||
|
|
npcs = false,
|
||
|
|
christmasOnly = false,
|
||
|
|
requiresPool = false,
|
||
|
|
creatureId = false,
|
||
|
|
zones = false,
|
||
|
|
repeatable = false,
|
||
|
|
spellId = false,
|
||
|
|
lockDungeonId = false,
|
||
|
|
lockBossName = false,
|
||
|
|
defeatSteps = false,
|
||
|
|
bonusSatchel = false,
|
||
|
|
wasGuaranteed = false,
|
||
|
|
requiresAlliance = false,
|
||
|
|
requiresHorde = false,
|
||
|
|
worldBossFactionless = false,
|
||
|
|
blackMarket = false,
|
||
|
|
obtain = false,
|
||
|
|
raceId = false,
|
||
|
|
defeatAllQuests = false,
|
||
|
|
enableCoin = false,
|
||
|
|
collectedItemId = false,
|
||
|
|
doNotUpdateToHighestStat = false,
|
||
|
|
disableForClass = false,
|
||
|
|
holidayReminder = false,
|
||
|
|
achievementId = false,
|
||
|
|
showTooltipCondition = false,
|
||
|
|
-- These are only set sometimes, via the Options UI. Super inconsistent?
|
||
|
|
import = false,
|
||
|
|
export = false,
|
||
|
|
obtainedQuestId = false,
|
||
|
|
enableAnnouncements = false, -- This is actually wrong, but since the import is bugged it'll exist in all imports (I think)... Doesn't do anything though :/
|
||
|
|
announce = false, -- This should be used instead
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
function Item:HasAllRequiredFields(entry)
|
||
|
|
-- The most basic check: Make sure all required fields are set
|
||
|
|
for key, isRequiredField in pairs(self.expectedFields) do
|
||
|
|
if isRequiredField and not entry[key] then
|
||
|
|
Rarity:Print(format("%s is a required field and must be set", key))
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsPersonalLoot(entry)
|
||
|
|
-- equalOdds and groupSize usually go together since everything is Personal Loot nowadays
|
||
|
|
if entry.groupSize and not entry.equalOdds then
|
||
|
|
Rarity:Print("Found setting for groupSize but equalOdds is not set")
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
if entry.equalOdds and not entry.groupSize then
|
||
|
|
Rarity:Print("Found setting for equalOdds but groupSize is not set")
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Solo-able items don't need either setting
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:HasOnlyValidFields(entry)
|
||
|
|
for key, value in pairs(entry) do
|
||
|
|
if self.expectedFields[key] == nil then
|
||
|
|
Rarity:Print(format("%s is an invalid field and should'nt be set", key))
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
-- TODO: Type checking, validation etc. here (if ever implemented)
|
||
|
|
end
|
||
|
|
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsHolidayItem(entry)
|
||
|
|
return entry.cat == CONSTANTS.ITEM_CATEGORIES.HOLIDAY
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsValidHolidayItem(entry)
|
||
|
|
-- All holiday items should have holidayTexture set to represent which holiday it belongs to.
|
||
|
|
if not entry.holidayTexture then
|
||
|
|
Rarity:Print("Found holiday item without a holidayTexture property")
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsUsingHolidayProperties(entry)
|
||
|
|
return entry.holidayTexture ~= nil or entry.christmasOnly ~= nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsPet(entry)
|
||
|
|
return entry.type == CONSTANTS.ITEM_TYPES.PET
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsMount(entry)
|
||
|
|
return entry.type == CONSTANTS.ITEM_TYPES.MOUNT
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsCollectionItem(entry)
|
||
|
|
return entry.method == CONSTANTS.DETECTION_METHODS.COLLECTION
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsValidCollectionItem(entry)
|
||
|
|
return entry.collectedItemId ~= nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsArchaeologyItem(entry)
|
||
|
|
return entry.method == CONSTANTS.DETECTION_METHODS.ARCH
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsValidArchaeologyItem(entry)
|
||
|
|
if not entry.raceId then
|
||
|
|
Rarity:Print("Found archaeology item without raceID property")
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
for _, raceID in pairs(CONSTANTS.ARCHAEOLOGY_RACES) do
|
||
|
|
if raceID == entry.raceId then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
Rarity:Print("Found archaeology item with invalid raceID")
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:HasUseMethod(entry)
|
||
|
|
return entry.method == CONSTANTS.DETECTION_METHODS.USE
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsValidUseMethodItem(entry)
|
||
|
|
return entry.items ~= nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsCovenantSpecificItem(entry)
|
||
|
|
return entry.requiresCovenant == true
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsValidCovenantItem(entry)
|
||
|
|
if not entry.requiredCovenantID then
|
||
|
|
Rarity:Print("Found covenant item without a covenantID property")
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
for _, covenantID in pairs(CONSTANTS.COVENANT_IDS) do
|
||
|
|
if covenantID == entry.requiredCovenantID then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
Rarity:Print("Found covenant item with invalid covenantID")
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsZoneItem(entry)
|
||
|
|
return entry.method == CONSTANTS.DETECTION_METHODS.ZONE
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsValidZoneItem(entry)
|
||
|
|
return entry.zones ~= nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsFishingItem(entry)
|
||
|
|
return entry.method == CONSTANTS.DETECTION_METHODS.FISHING
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsValidFishingItem(entry)
|
||
|
|
if not Item:IsValidZoneItem(entry) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
return entry.requiresPool ~= nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:HasNPCMethod(entry)
|
||
|
|
return entry.method == CONSTANTS.DETECTION_METHODS.NPC
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:HasBossMethod(entry)
|
||
|
|
return entry.method == CONSTANTS.DETECTION_METHODS.BOSS
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:IsValidNPCItem(entry)
|
||
|
|
return entry.npcs ~= nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:HasWaypointData(entry)
|
||
|
|
return entry.coords ~= nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function Item:HasValidWaypoints(entry)
|
||
|
|
for _, waypoint in pairs(entry.coords) do
|
||
|
|
if not Rarity:IsValidWaypoint(waypoint) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
function Rarity:IsValidWaypoint(waypointData)
|
||
|
|
if type(waypointData) == "table" then
|
||
|
|
if not waypointData.m then
|
||
|
|
Rarity:Print("Waypoint data is missing a mapID")
|
||
|
|
return false
|
||
|
|
elseif (waypointData.y and not waypointData.x) or (waypointData.x and not waypointData.y) then
|
||
|
|
Rarity:Print("Waypoint data has incomplete map coordinates")
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
Rarity.Item = Item
|