|
|
|
@ -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): |
|
|
|
|