diff --git a/ClassicAPI.lua b/ClassicAPI.lua index 62390a9..1ceea86 100644 --- a/ClassicAPI.lua +++ b/ClassicAPI.lua @@ -119,6 +119,37 @@ function API.GetActionInfo(slot) return GetActionInfo(slot) end +-------------------------------------------------------------------------------- +-- Container +-------------------------------------------------------------------------------- + +-- Base itemID in (bagID, slot), or nil for an empty/invalid slot. Same value +-- the "item:(%d+)" parse of GetContainerItemLink yields, but resolved straight +-- from the CGItem -- no link string built, no Lua pattern match. +function API.GetContainerItemID(bagID, slot) + return C_Container.GetContainerItemID(bagID, slot) +end + +-- Base itemID equipped in `unit`'s 1-based inventory `slot` (1-19), or nil for +-- an empty slot / NPC unit. Same arg shape as GetInventoryItemLink and the same +-- value its "item:(%d+)" parse yields, resolved straight from the item instance. +function API.GetInventoryItemID(unit, slot) + return GetInventoryItemID(unit, slot) +end + +-------------------------------------------------------------------------------- +-- Spell +-------------------------------------------------------------------------------- + +-- WoW SpellMechanic enum ID for a spell, read straight from Spell.dbc -- covers +-- every spell the client knows, not just the spellbook (1=Charm, 5=Fear, +-- 7=Root, 12=Stun, 17=Polymorph, ...). Returns (mechanicID, enUS name); the ID +-- is 0 for a known spell with no mechanic, and the whole call is nil for an +-- invalid spell ID. Replaces hand-maintained spellID -> mechanic tables. +function API.GetSpellMechanicByID(spellID) + return C_Spell.GetSpellMechanicByID(spellID) +end + -------------------------------------------------------------------------------- -- State -------------------------------------------------------------------------------- @@ -133,6 +164,28 @@ function API.IsSwimming() return IsSwimming() and true or false end +-------------------------------------------------------------------------------- +-- Cursor +-------------------------------------------------------------------------------- + +function API.GetCursorInfo() + return GetCursorInfo() +end + +-- Tri-state check of whether the cursor holds the item with `itemID`: +-- true -> cursor holds exactly that item +-- false -> cursor holds a DIFFERENT item +-- nil -> can't tell (cursor empty / not an item / itemID unknown) +-- Callers should only act on an explicit `false`, leaving the nil case to the +-- existing CursorHasItem() behavior. +function API.CursorHoldsItemID(itemID) + if not itemID then return nil end + local kind, id = GetCursorInfo() + if kind ~= "item" then return nil end + if not id then return nil end + return id == itemID +end + -------------------------------------------------------------------------------- -- NamePlate -------------------------------------------------------------------------------- diff --git a/Conditionals.lua b/Conditionals.lua index a696945..ecc80f9 100644 --- a/Conditionals.lua +++ b/Conditionals.lua @@ -5187,165 +5187,6 @@ CleveRoids.CCTypesLossOfControl = { [30] = true, -- sap (now part of stun group) } --- Complete spell ID to mechanic mapping from DBC data --- Extracted from BuffLib SpellData - 785 spells with mechanics --- Mechanic IDs: 1=Charm, 2=Disorient, 3=Disarm, 5=Fear, 7=Root, 9=Silence, --- 10=Sleep, 11=Snare, 12=Stun, 13=Freeze, 14=Knockout, --- 15=Bleed, 17=Polymorph, 18=Banish, 20=Shackle, 21=Mount, --- 23=Turn, 24=Horror, 25=Invuln, 27=Daze -CleveRoids.CCSpellMechanics = { - [17] = 19, [56] = 12, [89] = 11, [113] = 7, [118] = 17, [228] = 17, - [246] = 11, [339] = 7, [408] = 12, [451] = 9, [458] = 21, [459] = 21, - [468] = 21, [470] = 21, [471] = 21, [472] = 21, [474] = 6, [498] = 25, - [507] = 6, [512] = 7, [578] = 21, [579] = 21, [580] = 21, [581] = 21, - [592] = 19, [593] = 6, [600] = 19, [605] = 1, [642] = 25, [676] = 3, - [700] = 10, [703] = 15, [710] = 18, [745] = 7, [746] = 16, [771] = 1, - [772] = 15, [835] = 12, [851] = 17, [853] = 12, [861] = 9, [867] = 6, - [998] = 6, [1020] = 25, [1022] = 25, [1062] = 7, [1079] = 15, [1090] = 10, - [1098] = 1, [1159] = 16, [1513] = 5, [1776] = 14, [1777] = 14, [1833] = 12, - [1943] = 15, [2070] = 14, [2094] = 2, [2637] = 10, [2878] = 23, [2880] = 12, - [2937] = 10, [3109] = 5, [3143] = 12, [3147] = 15, [3242] = 12, [3263] = 12, - [3267] = 16, [3268] = 16, [3355] = 13, [3363] = 21, [3409] = 11, [3410] = 11, - [3446] = 12, [3542] = 7, [3551] = 12, [3589] = 9, [3600] = 11, [3604] = 11, - [3609] = 12, [3635] = 12, [3636] = 10, [3747] = 19, [4060] = 17, [4064] = 12, - [4065] = 12, [4066] = 12, [4067] = 12, [4068] = 12, [4069] = 12, [4102] = 15, - [4244] = 15, [4962] = 7, [5106] = 12, [5116] = 11, [5134] = 5, [5159] = 11, - [5164] = 12, [5195] = 7, [5196] = 7, [5211] = 12, [5246] = 5, [5259] = 3, - [5276] = 12, [5376] = 4, [5403] = 12, [5484] = 5, [5530] = 12, [5531] = 12, - [5567] = 7, [5573] = 25, [5588] = 12, [5589] = 12, [5597] = 15, [5598] = 15, - [5599] = 25, [5627] = 23, [5648] = 12, [5649] = 12, [5703] = 12, [5708] = 12, - [5782] = 5, [5784] = 21, [5917] = 6, [5918] = 12, [6065] = 19, [6066] = 19, - [6136] = 11, [6146] = 11, [6213] = 5, [6215] = 5, [6253] = 12, [6266] = 12, - [6304] = 12, [6358] = 1, [6388] = 11, [6409] = 12, [6435] = 12, [6466] = 12, - [6524] = 12, [6533] = 7, [6546] = 15, [6547] = 15, [6548] = 15, [6605] = 5, - [6607] = 12, [6608] = 3, [6648] = 21, [6653] = 21, [6654] = 21, [6713] = 3, - [6726] = 9, [6728] = 12, [6730] = 12, [6749] = 12, [6770] = 14, [6777] = 21, - [6788] = 19, [6798] = 12, [6896] = 21, [6897] = 21, [6898] = 21, [6899] = 21, - [6927] = 12, [6942] = 9, [6945] = 12, [6982] = 12, [6984] = 11, [6985] = 11, - [7074] = 9, [7093] = 5, [7139] = 12, [7279] = 11, [7321] = 11, [7399] = 5, - [7645] = 1, [7803] = 12, [7922] = 12, [7926] = 16, [7927] = 16, [7964] = 12, - [7967] = 10, [7992] = 11, [8040] = 10, [8122] = 5, [8124] = 5, [8142] = 7, - [8150] = 12, [8208] = 12, [8225] = 5, [8242] = 12, [8281] = 9, [8285] = 12, - [8312] = 7, [8346] = 7, [8377] = 7, [8379] = 3, [8391] = 12, [8394] = 21, - [8395] = 21, [8396] = 21, [8399] = 10, [8629] = 14, [8631] = 15, [8632] = 15, - [8633] = 15, [8639] = 15, [8640] = 15, [8643] = 12, [8646] = 12, [8715] = 5, - [8716] = 11, [8818] = 15, [8901] = 10, [8902] = 10, [8980] = 21, [8983] = 12, - [8988] = 9, [8994] = 18, [9005] = 12, [9007] = 15, [9080] = 11, [9159] = 10, - [9484] = 20, [9485] = 20, [9552] = 9, [9823] = 12, [9824] = 15, [9826] = 15, - [9827] = 12, [9852] = 7, [9853] = 7, [9896] = 15, [9915] = 7, [10017] = 7, - [10234] = 10, [10253] = 17, [10266] = 15, [10278] = 25, [10308] = 12, - [10326] = 23, [10787] = 21, [10788] = 21, [10789] = 21, [10790] = 21, - [10792] = 21, [10793] = 21, [10795] = 21, [10796] = 21, [10798] = 21, - [10799] = 21, [10800] = 21, [10801] = 21, [10802] = 21, [10803] = 21, - [10804] = 21, [10838] = 16, [10839] = 16, [10851] = 3, [10852] = 7, - [10855] = 11, [10856] = 12, [10873] = 21, [10888] = 5, [10890] = 5, - [10898] = 19, [10899] = 19, [10900] = 19, [10901] = 19, [10911] = 1, - [10912] = 1, [10955] = 20, [10969] = 21, [10987] = 11, [11020] = 12, - [11201] = 11, [11264] = 7, [11273] = 15, [11274] = 15, [11275] = 15, - [11285] = 14, [11286] = 14, [11289] = 15, [11290] = 15, [11297] = 14, - [11428] = 12, [11430] = 12, [11436] = 11, [11446] = 1, [11572] = 15, - [11573] = 15, [11574] = 15, [11578] = 12, [11579] = 12, [11641] = 17, [11650] = 12, [11725] = 1, - [11726] = 1, [11820] = 7, [11831] = 7, [11836] = 12, [11876] = 12, - [11879] = 3, [11922] = 7, [11958] = 13, [11977] = 15, [12023] = 7, - [12024] = 7, [12054] = 15, [12096] = 5, [12098] = 10, [12252] = 7, - [12323] = 11, [12355] = 12, [12421] = 12, [12461] = 12, [12484] = 11, - [12485] = 11, [12486] = 11, [12494] = 7, [12528] = 9, [12531] = 11, - [12540] = 14, [12542] = 5, [12543] = 12, [12551] = 11, [12562] = 12, - [12674] = 7, [12705] = 11, [12721] = 15, [12730] = 5, [12734] = 12, - [12747] = 7, [12748] = 7, [12798] = 12, [12809] = 12, [12824] = 17, - [12825] = 17, [12826] = 17, [12946] = 9, [13005] = 12, [13099] = 7, - [13119] = 7, [13138] = 7, [13181] = 1, [13237] = 12, [13318] = 15, - [13323] = 17, [13327] = 14, [13443] = 15, [13445] = 15, [13534] = 3, - [13579] = 14, [13608] = 7, [13704] = 5, [13738] = 15, [13747] = 11, - [13808] = 12, [13810] = 11, [13819] = 21, [13902] = 12, [14030] = 7, - [14087] = 15, [14100] = 5, [14102] = 12, [14118] = 15, [14180] = 3, - [14207] = 11, [14308] = 13, [14309] = 13, [14326] = 5, [14327] = 5, - [14331] = 15, [14515] = 1, [14621] = 17, [14874] = 15, [14897] = 11, - [14902] = 12, [14903] = 15, [14907] = 7, [15063] = 7, [15091] = 14, - [15269] = 12, [15283] = 12, [15398] = 12, [15471] = 7, [15474] = 7, - [15487] = 9, [15531] = 7, [15532] = 7, [15534] = 17, [15535] = 12, - [15583] = 15, [15593] = 12, [15609] = 7, [15618] = 12, [15621] = 12, - [15652] = 12, [15655] = 12, [15744] = 14, [15752] = 3, [15753] = 12, - [15779] = 21, [15780] = 21, [15781] = 21, [15822] = 10, [15859] = 1, - [15878] = 12, [15970] = 10, [15976] = 15, [16045] = 18, [16046] = 14, - [16050] = 11, [16053] = 1, [16055] = 21, [16056] = 21, [16058] = 21, - [16059] = 21, [16060] = 21, [16075] = 12, [16080] = 21, [16081] = 21, - [16082] = 21, [16083] = 21, [16084] = 21, [16095] = 15, [16096] = 5, - [16097] = 17, [16104] = 12, [16350] = 12, [16393] = 15, [16403] = 15, - [16406] = 15, [16451] = 18, [16469] = 7, [16497] = 12, [16508] = 5, - [16509] = 15, [16566] = 7, [16568] = 11, [16600] = 12, [16707] = 17, - [16708] = 17, [16709] = 17, [16727] = 12, [16790] = 12, [16798] = 10, - [16803] = 12, [16838] = 9, [16869] = 12, [16922] = 12, [17011] = 12, - [17145] = 14, [17153] = 15, [17165] = 11, [17172] = 17, [17174] = 11, - [17229] = 21, [17276] = 12, [17277] = 14, [17286] = 12, [17293] = 12, - [17308] = 12, [17405] = 1, [17450] = 21, [17453] = 21, [17454] = 21, - [17455] = 21, [17456] = 21, [17458] = 21, [17459] = 21, [17460] = 21, - [17461] = 21, [17462] = 21, [17463] = 21, [17464] = 21, [17465] = 21, - [17481] = 21, [17500] = 12, [17504] = 15, [17738] = 17, [17928] = 5, - [18075] = 15, [18078] = 15, [18093] = 12, [18103] = 12, [18106] = 15, - [18118] = 11, [18144] = 12, [18200] = 15, [18202] = 15, [18223] = 11, - [18278] = 9, [18327] = 9, [18328] = 11, [18363] = 21, [18395] = 12, - [18425] = 9, [18431] = 5, [18469] = 9, [18498] = 9, [18503] = 17, - [18608] = 16, [18610] = 16, [18647] = 18, [18657] = 10, [18658] = 10, - [18763] = 12, [18802] = 11, [18812] = 12, [18972] = 11, [18989] = 21, - [18990] = 21, [18991] = 21, [18992] = 21, [19128] = 12, [19134] = 5, - [19136] = 12, [19137] = 11, [19185] = 7, [19229] = 7, [19364] = 12, - [19386] = 10, [19393] = 9, [19408] = 5, [19410] = 12, [19469] = 1, - [19482] = 12, [19496] = 11, [19501] = 2, [19503] = 2, [19641] = 12, - [19718] = 3, [19769] = 12, [19771] = 15, [19780] = 12, [19784] = 12, - [19821] = 9, [19970] = 7, [19971] = 7, [19972] = 7, [19973] = 7, - [19974] = 7, [19975] = 7, [20066] = 14, [20170] = 12, [20253] = 12, - [20276] = 12, [20277] = 12, [20310] = 12, [20511] = 5, [20549] = 12, - [20604] = 1, [20614] = 12, [20615] = 12, [20654] = 7, [20663] = 10, - [20669] = 10, [20683] = 12, [20685] = 12, [20699] = 7, [20706] = 19, - [20740] = 1, [20882] = 1, [20907] = 15, [20908] = 15, [20989] = 10, - [21099] = 12, [21152] = 12, [21330] = 5, [21331] = 7, [21748] = 12, - [21749] = 12, [21869] = 5, [21898] = 5, [21949] = 15, [21990] = 12, - [22127] = 7, [22274] = 17, [22289] = 12, [22356] = 11, [22415] = 7, - [22419] = 3, [22424] = 14, [22427] = 12, [22519] = 7, [22566] = 17, - [22570] = 14, [22592] = 12, [22639] = 11, [22645] = 7, [22666] = 9, - [22678] = 5, [22686] = 5, [22691] = 3, [22692] = 12, [22717] = 21, - [22718] = 21, [22719] = 21, [22720] = 21, [22721] = 21, [22722] = 21, - [22723] = 21, [22724] = 21, [22744] = 7, [22752] = 19, [22800] = 7, - [22884] = 5, [22914] = 11, [22915] = 12, [22919] = 11, [22924] = 7, - [22994] = 7, [23039] = 14, [23103] = 12, [23113] = 14, [23161] = 21, - [23207] = 9, [23214] = 21, [23219] = 21, [23220] = 21, [23221] = 21, - [23222] = 21, [23223] = 21, [23225] = 21, [23227] = 21, [23228] = 21, - [23229] = 21, [23238] = 21, [23239] = 21, [23240] = 21, [23241] = 21, - [23242] = 21, [23243] = 21, [23246] = 21, [23247] = 21, [23248] = 21, - [23249] = 21, [23250] = 21, [23251] = 21, [23252] = 21, [23275] = 5, - [23338] = 21, [23364] = 12, [23365] = 3, [23454] = 12, [23509] = 21, - [23510] = 21, [23567] = 16, [23568] = 16, [23569] = 16, [23600] = 11, - [23603] = 17, [23618] = 12, [23694] = 7, [23696] = 16, [23918] = 9, - [23919] = 12, [23953] = 11, [24004] = 10, [24053] = 17, [24110] = 7, - [24118] = 15, [24119] = 15, [24120] = 15, [24132] = 10, [24133] = 10, - [24152] = 7, [24192] = 15, [24213] = 12, [24225] = 11, [24242] = 21, - [24252] = 21, [24259] = 9, [24327] = 1, [24331] = 15, [24332] = 15, - [24333] = 12, [24335] = 10, [24360] = 10, [24375] = 12, [24394] = 12, - [24412] = 16, [24413] = 16, [24414] = 16, [24415] = 11, [24576] = 21, - [24600] = 12, [24648] = 7, [24664] = 10, [24671] = 12, [24687] = 9, - [24698] = 14, [24712] = 17, [24713] = 17, [24735] = 17, [24736] = 17, - [24778] = 10, [25022] = 11, [25049] = 14, [25056] = 12, [25057] = 3, - [25187] = 11, [25189] = 12, [25260] = 5, [25654] = 12, [25655] = 3, - [25675] = 21, [25771] = 25, [25809] = 11, [25815] = 5, [25852] = 12, - [25858] = 21, [25859] = 21, [25863] = 21, [25953] = 21, [25999] = 7, - [26042] = 5, [26054] = 21, [26055] = 21, [26056] = 21, [26069] = 9, - [26070] = 5, [26071] = 7, [26078] = 11, [26108] = 2, [26141] = 11, - [26143] = 11, [26157] = 17, [26180] = 10, [26211] = 11, [26272] = 17, - [26273] = 17, [26274] = 17, [26379] = 11, [26580] = 5, [26641] = 5, - [26655] = 21, [26740] = 1, [27555] = 15, [27556] = 15, [27559] = 9, - [27565] = 18, [27581] = 3, [27607] = 19, [27610] = 5, [27615] = 12, - [27619] = 13, [27634] = 11, [27638] = 15, [27640] = 11, [27641] = 5, - [27758] = 12, [27760] = 17, [27880] = 12, [27990] = 5, [27993] = 11, - [28270] = 17, [28271] = 17, [28272] = 17, [28314] = 12, [28315] = 5, - [28445] = 12, [28456] = 14, [28725] = 12, [28858] = 7, [28911] = 15, - [28913] = 15, [28991] = 7, [29059] = 21, [29168] = 5, [29407] = 11, - [29419] = 5, [29544] = 5, [29685] = 5, [29848] = 17, [29849] = 7, - [29915] = 15, [29943] = 9, [30001] = 5, [30002] = 5, [30020] = 16, - [30094] = 7, [30174] = 21, [30225] = 9, [30285] = 15, [31365] = 5, - [31700] = 21, -} - -- Check if BuffLib is available with full mechanic support function CleveRoids.HasBuffLib() -- Defensive: ensure BuffLib.SpellData is a table, not a function @@ -5354,7 +5195,7 @@ function CleveRoids.HasBuffLib() and BuffLib.SpellData.GetMechanic end --- Get mechanic for a spell ID (uses BuffLib if available, otherwise built-in table) +-- Get mechanic for a spell ID (uses BuffLib if available, otherwise ClassicAPI's DBC reader) function CleveRoids.GetSpellMechanic(spellID) if not spellID or spellID <= 0 then return 0 end @@ -5367,8 +5208,8 @@ function CleveRoids.GetSpellMechanic(spellID) end end - -- Fall back to built-in table - return CleveRoids.CCSpellMechanics[spellID] or 0 + -- Fall back to ClassicAPI's Spell.dbc reader (always present; covers every spell) + return CleveRoids.ClassicAPI.GetSpellMechanicByID(spellID) or 0 end -- Validate CC on a unit (target, focus, player, etc.) diff --git a/Core.lua b/Core.lua index 2d5d817..43f22b8 100644 --- a/Core.lua +++ b/Core.lua @@ -3721,6 +3721,19 @@ function CleveRoids.EquipBagItem(msg, slotOrOffhand) return false end + -- Verify the cursor holds the item we meant to pick up. The bag can shift + -- between the lookup and the pickup (item consumed/moved/reorganized), in + -- which case we'd otherwise equip whatever landed on the cursor. Only abort + -- on a definitive mismatch (false); nil = can't tell -> trust CursorHasItem. + if item.id and CleveRoids.ClassicAPI.CursorHoldsItemID(item.id) == false then + if CleveRoids.equipDebugLog then + CleveRoids.Print("|cffff8800[EquipLog] Cursor holds wrong item after pickup; aborting equip|r") + end + ClearCursor() + CleveRoids.equipInProgress = false + return false + end + EquipCursorItem(invslot) ClearCursor() diff --git a/NampowerAPI.lua b/NampowerAPI.lua index bd222e7..bb9214c 100644 --- a/NampowerAPI.lua +++ b/NampowerAPI.lua @@ -1493,15 +1493,12 @@ function API.GetEquippedItems(unitToken) local items = {} for slot = 0, 18 do - local link = GetInventoryItemLink("player", slot + 1) - if link then - local _, _, itemId = string.find(link, "item:(%d+)") - if itemId then - items[slot] = { - itemId = tonumber(itemId), - -- Other fields not available without native API - } - end + local itemId = CleveRoids.ClassicAPI.GetInventoryItemID("player", slot + 1) + if itemId then + items[slot] = { + itemId = itemId, + -- Other fields not available without native API + } end end @@ -1524,14 +1521,11 @@ function API.GetEquippedItem(unitToken, slot) return nil end - local link = GetInventoryItemLink("player", slot + 1) -- 1-indexed - if link then - local _, _, itemId = string.find(link, "item:(%d+)") - if itemId then - return { - itemId = tonumber(itemId), - } - end + local itemId = CleveRoids.ClassicAPI.GetInventoryItemID("player", slot + 1) -- 1-indexed + if itemId then + return { + itemId = itemId, + } end return nil @@ -1560,16 +1554,13 @@ function API.GetBagItems(bagIndex) local bagContents = {} local numSlots = GetContainerNumSlots(bagIndex) or 0 for slot = 1, numSlots do - local link = GetContainerItemLink(bagIndex, slot) - if link then - local _, _, itemId = string.find(link, "item:(%d+)") + local itemId = CleveRoids.ClassicAPI.GetContainerItemID(bagIndex, slot) + if itemId then local _, count = GetContainerItemInfo(bagIndex, slot) - if itemId then - bagContents[slot] = { - itemId = tonumber(itemId), - stackCount = count or 1, - } - end + bagContents[slot] = { + itemId = itemId, + stackCount = count or 1, + } end end return bagContents @@ -1582,16 +1573,13 @@ function API.GetBagItems(bagIndex) if numSlots > 0 then bags[bag] = {} for slot = 1, numSlots do - local link = GetContainerItemLink(bag, slot) - if link then - local _, _, itemId = string.find(link, "item:(%d+)") + local itemId = CleveRoids.ClassicAPI.GetContainerItemID(bag, slot) + if itemId then local _, count = GetContainerItemInfo(bag, slot) - if itemId then - bags[bag][slot] = { - itemId = tonumber(itemId), - stackCount = count or 1, - } - end + bags[bag][slot] = { + itemId = itemId, + stackCount = count or 1, + } end end end @@ -1609,16 +1597,13 @@ function API.GetBagItem(bagIndex, slot) end -- Fallback: manual lookup - local link = GetContainerItemLink(bagIndex, slot) - if link then - local _, _, itemId = string.find(link, "item:(%d+)") + local itemId = CleveRoids.ClassicAPI.GetContainerItemID(bagIndex, slot) + if itemId then local _, count = GetContainerItemInfo(bagIndex, slot) - if itemId then - return { - itemId = tonumber(itemId), - stackCount = count or 1, - } - end + return { + itemId = itemId, + stackCount = count or 1, + } end return nil @@ -1779,14 +1764,13 @@ function API.FindBagItem(itemIdOrName) for bag = 0, 4 do local numSlots = GetContainerNumSlots(bag) or 0 for slot = 1, numSlots do - local link = GetContainerItemLink(bag, slot) - if link then - if checkId then - local _, _, currentId = string.find(link, "item:(%d+)") - if currentId and tonumber(currentId) == checkId then - return bag, slot - end - elseif checkName then + if checkId then + if CleveRoids.ClassicAPI.GetContainerItemID(bag, slot) == checkId then + return bag, slot + end + elseif checkName then + local link = GetContainerItemLink(bag, slot) + if link then local _, _, currentName = string.find(link, "|h%[(.-)%]|h") if currentName and string.lower(currentName) == checkName then return bag, slot @@ -2103,26 +2087,28 @@ function API.GetTrinkets(copy) for bag = 0, 4 do local numSlots = GetContainerNumSlots(bag) or 0 for slot = 1, numSlots do - local link = GetContainerItemLink(bag, slot) - if link then - local _, _, itemId = string.find(link, "item:(%d+)") - if itemId then - local numItemId = tonumber(itemId) - local invType = API.GetItemInventoryType(numItemId) - if invType == 12 then -- Trinket - local _, _, name = string.find(link, "|h%[(.-)%]|h") - local texture = GetContainerItemInfo(bag, slot) - local itemLevel = API.GetItemLevel(numItemId) - trinkets[index] = { - itemId = numItemId, - trinketName = name or "Unknown", - texture = texture, - itemLevel = itemLevel, - bagIndex = bag, - slotIndex = slot, - } - index = index + 1 + local numItemId = CleveRoids.ClassicAPI.GetContainerItemID(bag, slot) + if numItemId then + local invType = API.GetItemInventoryType(numItemId) + if invType == 12 then -- Trinket + -- Only build the link string for actual trinkets, to read the name. + local link = GetContainerItemLink(bag, slot) + local name + if link then + local _ + _, _, name = string.find(link, "|h%[(.-)%]|h") end + local texture = GetContainerItemInfo(bag, slot) + local itemLevel = API.GetItemLevel(numItemId) + trinkets[index] = { + itemId = numItemId, + trinketName = name or "Unknown", + texture = texture, + itemLevel = itemLevel, + bagIndex = bag, + slotIndex = slot, + } + index = index + 1 end end end @@ -2183,18 +2169,13 @@ function API.GetTrinketCooldown(slot) end -- Get item ID from equipped slot - local link = GetInventoryItemLink("player", equipSlot) - if not link then - return -1 - end - - local _, _, itemId = string.find(link, "item:(%d+)") + local itemId = CleveRoids.ClassicAPI.GetInventoryItemID("player", equipSlot) if not itemId then return -1 end -- Get cooldown info - return API.GetItemCooldownInfo(tonumber(itemId)) + return API.GetItemCooldownInfo(itemId) end -- Use an equipped trinket diff --git a/Utility.lua b/Utility.lua index 97084b5..5365a28 100644 --- a/Utility.lua +++ b/Utility.lua @@ -6892,11 +6892,7 @@ CleveRoids.equipmentModifiers[9904] = { slot = 18, modifier = ripRakeIdolModifie -- Function to get equipped item ID in a specific slot function CleveRoids.GetEquippedItemID(slotID) - local itemLink = GetInventoryItemLink("player", slotID) - if not itemLink then return nil end - - local _, _, itemID = string.find(itemLink, "item:(%d+)") - return tonumber(itemID) + return CleveRoids.ClassicAPI.GetInventoryItemID("player", slotID) end -- Apply equipment modifiers to a debuff duration @@ -7080,17 +7076,13 @@ function CleveRoids.CountEquippedSetItems(items) local count = 0 -- Check all equipment slots (1-19) for slot = 1, 19 do - local itemLink = GetInventoryItemLink("player", slot) - if itemLink then - local _, _, itemID = string.find(itemLink, "item:(%d+)") - if itemID then - itemID = tonumber(itemID) - -- Check if this item is in the set - for _, setItemID in ipairs(items) do - if itemID == setItemID then - count = count + 1 - break - end + local itemID = CleveRoids.GetEquippedItemID(slot) + if itemID then + -- Check if this item is in the set + for _, setItemID in ipairs(items) do + if itemID == setItemID then + count = count + 1 + break end end end @@ -7108,14 +7100,11 @@ function CleveRoids.CountEquippedSetItemsBySetId(setId) if CleveRoids.NampowerAPI and CleveRoids.NampowerAPI.GetItemField then local count = 0 for slot = 1, 19 do - local itemLink = GetInventoryItemLink("player", slot) - if itemLink then - local _, _, itemID = string.find(itemLink, "item:(%d+)") - if itemID then - local itemSetId = CleveRoids.NampowerAPI.GetItemSetId(tonumber(itemID)) - if itemSetId == setId then - count = count + 1 - end + local itemID = CleveRoids.GetEquippedItemID(slot) + if itemID then + local itemSetId = CleveRoids.NampowerAPI.GetItemSetId(itemID) + if itemSetId == setId then + count = count + 1 end end end @@ -7241,18 +7230,15 @@ function CleveRoids.GetEquippedSetPieceCount(nameOrId) local lowerName = string.lower(nameOrId) for slot = 1, 19 do - local itemLink = GetInventoryItemLink("player", slot) - if itemLink then - local _, _, itemID = string.find(itemLink, "item:(%d+)") - if itemID then - local setId = CleveRoids.NampowerAPI.GetItemSetId(tonumber(itemID)) - if setId then - local setData = CleveRoids.NampowerAPI.GetItemSet(setId) - if setData then - local dbcName = setData.name_enUS - if dbcName and string.lower(dbcName) == lowerName then - return CleveRoids.CountEquippedSetItemsBySetId(setId), setId - end + local itemID = CleveRoids.GetEquippedItemID(slot) + if itemID then + local setId = CleveRoids.NampowerAPI.GetItemSetId(itemID) + if setId then + local setData = CleveRoids.NampowerAPI.GetItemSet(setId) + if setData then + local dbcName = setData.name_enUS + if dbcName and string.lower(dbcName) == lowerName then + return CleveRoids.CountEquippedSetItemsBySetId(setId), setId end end end @@ -7810,7 +7796,7 @@ end -- CC IMMUNITY TRACKING --- Get CC type from a spell ID using the CCSpellMechanics table from Conditionals.lua +-- Get CC type from a spell ID via DBC mechanic lookup (nampower, then ClassicAPI) -- Returns: CC type name (e.g., "stun", "fear") or nil if not a CC spell -- EffectApplyAuraName → CC type mapping (fallback when mechanics are unset) -- Uses vanilla 1.12.1 aura type enum values @@ -7864,9 +7850,11 @@ local function GetSpellCCType(spellID) end end - -- Priority 2: Hardcoded table fallback (CCSpellMechanics in Conditionals.lua) - local mechanic = CleveRoids.CCSpellMechanics and CleveRoids.CCSpellMechanics[spellID] - if mechanic and MECHANIC_TO_CC_TYPE[mechanic] then + -- Priority 2: ClassicAPI Spell.dbc reader (always present; covers every spell). + -- A subset of Priority 1's per-effect/aura checks, used when nampower's + -- GetSpellRecField is unavailable. + local mechanic = CleveRoids.ClassicAPI.GetSpellMechanicByID(spellID) + if mechanic and mechanic > 0 and MECHANIC_TO_CC_TYPE[mechanic] then return MECHANIC_TO_CC_TYPE[mechanic] end