From c600050d873cda6a1ee6fec262d9b7fb68894471 Mon Sep 17 00:00:00 2001 From: MarcelineVQ Date: Mon, 6 Apr 2026 00:57:07 -0700 Subject: [PATCH] interact: add Loot Corpse binding (single-corpse loot mode) LootAllCorpses now accepts an optional count argument to cap the queue. LootAllCorpses(1) loots the nearest corpse and stops. --- src/interact/addon/Bindings.xml | 3 +++ src/interact/interact.zig | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/interact/addon/Bindings.xml b/src/interact/addon/Bindings.xml index 58387d4..dbec6b4 100644 --- a/src/interact/addon/Bindings.xml +++ b/src/interact/addon/Bindings.xml @@ -5,6 +5,9 @@ InteractNearest(1) + + LootAllCorpses(1) + LootAllCorpses() diff --git a/src/interact/interact.zig b/src/interact/interact.zig index d738565..fcde683 100644 --- a/src/interact/interact.zig +++ b/src/interact/interact.zig @@ -300,9 +300,14 @@ fn processLootQueue() void { interactNextCorpse(); } -pub fn lootAllCorpses(_: *anyopaque) callconv(.c) u32 { +pub fn lootAllCorpses(L: *anyopaque) callconv(.c) u32 { if (!isInWorld()) return 0; + const max: usize = if (luaIsNumber(L, 1)) + @intFromFloat(luaToNumber(L, 1)) + else + MAX_LOOT_QUEUE; + // Cancel any in-progress chain loot_queue_count = 0; loot_queue_index = 0; @@ -316,7 +321,7 @@ pub fn lootAllCorpses(_: *anyopaque) callconv(.c) u32 { const p_pos = getUnitPosition(player); while (current_object != 0 and (current_object & 1) == 0) { - if (loot_queue_count >= MAX_LOOT_QUEUE) break; + if (loot_queue_count >= max) break; const guid = hook.readMem(u64, current_object + 0x30); const pointer = getObjectPointer(guid);