Improve labeled chest caching interactions

This commit is contained in:
Tanner
2026-11-07 18:23:55 +00:00
parent 34d902c46d
commit 688297e968
7 changed files with 240 additions and 25 deletions
+37 -2
View File
@@ -22,6 +22,9 @@ class CacheItemsStates:
def init(self):
self.skip_slots = []
self.skip_items = []
self.failed_transfer_slots = set()
self.pending_transfer = None
self.transferred_to_labeled_chest = False
self.is_labeled_container = False
self.container_item_ids = None
@@ -80,6 +83,10 @@ class CacheItemsStates:
if not len(self.trapped_chests):
self.is_labeled_container = False
self.container_item_ids = None
if self.transferred_to_labeled_chest:
print('Already cached items in labeled chests; skipping new chest')
self.state = self.cleanup
return
print('No labeled or trapped chests')
self.state = self.select_chest
return
@@ -166,11 +173,13 @@ class CacheItemsStates:
def place_chest(self):
support = utils.padd(self.area, path.BLOCK_BELOW)
self.g.game.place_block(support, BlockFace.TOP)
self.g.game.place_block(support, BlockFace.TOP, sneaking=True)
self.state = self.open_chest
def open_chest(self):
print('Opening chest')
self.failed_transfer_slots.clear()
self.pending_transfer = None
self.g.game.open_container(self.area)
self.wait_time = 1
self.state = self.wait
@@ -236,6 +245,21 @@ class CacheItemsStates:
self.state = self.cleanup
return
if self.pending_transfer:
pending = self.pending_transfer
if time.monotonic() < pending['confirm_after']:
return
source = w.contents.get(pending['window_slot'])
moved = (source is None or not source.present or
source.item_id != pending['item_id'] or
source.item_count < pending['item_count'])
if moved:
if pending['is_labeled']:
self.transferred_to_labeled_chest = True
else:
self.failed_transfer_slots.add(pending['window_slot'])
self.pending_transfer = None
w_container_slots = range(w.container_slots)
w_inventory_slots = range(w.container_slots, len(w.contents))
@@ -272,7 +296,8 @@ class CacheItemsStates:
elif slot.item_id in items.NEEDED_ITEMS:
continue
if slot_num in self.skip_slots:
if (slot_num in self.skip_slots or
slot_num in self.failed_transfer_slots):
continue
slot_list.append((slot_num, slot))
@@ -288,6 +313,13 @@ class CacheItemsStates:
print('moving', slot)
self.pending_transfer = {
'window_slot': slot_num,
'item_id': slot.item_id,
'item_count': slot.item_count,
'is_labeled': self.is_labeled_container,
'confirm_after': time.monotonic() + 0.15,
}
self.g.item_lock = True
self.g.game.click_window(slot_num, 0, 1, slot)
return
@@ -325,6 +357,9 @@ class CacheItemsStates:
self.silent = False
self.skip_slots = []
self.failed_transfer_slots = set()
self.pending_transfer = None
self.transferred_to_labeled_chest = False
self.skip_items = []
self.labeled_chests = []