Finish executing the villager trade

This commit is contained in:
2021-02-24 01:02:00 +00:00
parent 1d8d473e26
commit 28ca442a46
5 changed files with 120 additions and 10 deletions
+82 -9
View File
@@ -1777,6 +1777,7 @@ class SellToVillagerStates:
return None
def init(self):
self.trade = None
self.state = self.find_villager
def find_villager(self):
@@ -1784,17 +1785,18 @@ class SellToVillagerStates:
w = self.g.world
p = utils.pint(self.g.pos)
for villager in w.find_villagers(p, 100):
print('Found villager:', villager)
if villager not in self.bad_villagers:
for v in w.find_villagers(p, 100):
print('Found villager:', v)
if v not in self.bad_villagers and v not in self.spent_villagers:
break
else: # for
print('No good villagers left, aborting.')
self.spent_villagers = []
self.state = self.cleanup
return
self.villager = villager
self.villager_pos = utils.pint((villager.x, villager.y, villager.z))
self.villager = v
self.villager_pos = utils.pint((v.x, v.y, v.z))
self.state = self.find_openings
def find_openings(self):
@@ -1841,14 +1843,83 @@ class SellToVillagerStates:
print('Interacting with villager')
self.g.game.interact(self.villager.entity_id)
self.g.game.animate()
self.state = self.select_trade
self.state = self.choose_trade
def choose_trade(self):
g = self.g.game
def select_trade(self):
if not self.g.window or not self.g.trades:
return
print('Got trades window')
self.state = self.freeze
for trade_num, trade in enumerate(self.g.trades):
in_id = trade.input_item_1.item_id
in_num = trade.input_item_1.item_count
out_id = trade.output_item.item_id
if g.count_items([in_id]) < in_num:
continue
if trade.trade_disabled:
continue
if out_id != items.EMERALD_ID:
continue
print('Found trade: #', trade_num, trade)
self.trade = trade
self.trade_num = trade_num
self.state = self.click_trade
break
else:
print('Villager has been spent, aborting')
self.spent_villagers.append(self.villager)
self.state = self.cleanup
return
def click_trade(self):
self.g.item_lock = True
self.g.game.select_trade(self.trade_num)
self.state = self.execute_trade
def execute_trade(self):
if self.g.item_lock:
return
w = self.g.window
w_info = mcdata.WINDOWS[w.data.window_type]
slot_num = w_info.output
slot = w.contents[slot_num]
self.g.item_lock = True
self.g.game.click_window(slot_num, 0, 1, slot)
self.g.game.close_window()
self.state = self.end_trade
def end_trade(self):
if self.g.item_lock:
return
print('Trade completed.')
self.state = self.interact_villager
#def grab_stack(self):
# g = self.g.game
# in_id = self.trade.input_item_1.item_id
# slot_num, slot = g.get_window_slot(in_id)
# if not slot:
# print('Item not found, aborting')
# self.state = self.cleanup
# return
# print('Grabbing:', slot)
# self.g.item_lock = True
# # double click stack to grab max
# self.g.game.click_window(slot_num, 0, 6, slot)
# self.state = self.freeze
def freeze(self):
return
@@ -1874,7 +1945,9 @@ class SellToVillagerStates:
self.villager_pos = None
self.bad_villagers = []
self.good_villagers = []
self.spent_villagers = []
self.openings = []
self.trade = None
self.wait_time = 0
def run(self):