Improve labeled chest caching interactions
This commit is contained in:
@@ -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 = []
|
||||
|
||||
Reference in New Issue
Block a user