|
|
|
@ -1772,6 +1772,114 @@ class EatFoodStates: |
|
|
|
|
self.state() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SellToVillagerStates: |
|
|
|
|
def idle(self): |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
def init(self): |
|
|
|
|
self.state = self.find_villager |
|
|
|
|
|
|
|
|
|
def find_villager(self): |
|
|
|
|
print('Finding new villager...') |
|
|
|
|
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: |
|
|
|
|
break |
|
|
|
|
else: # for |
|
|
|
|
print('No good villagers left, aborting.') |
|
|
|
|
self.state = self.cleanup |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
self.villager = villager |
|
|
|
|
self.villager_pos = utils.pint((villager.x, villager.y, villager.z)) |
|
|
|
|
self.state = self.find_openings |
|
|
|
|
|
|
|
|
|
def find_openings(self): |
|
|
|
|
w = self.g.world |
|
|
|
|
self.openings = w.find_villager_openings(self.villager_pos) |
|
|
|
|
self.state = self.choose_opening |
|
|
|
|
|
|
|
|
|
def choose_opening(self): |
|
|
|
|
w = self.g.world |
|
|
|
|
p = utils.pint(self.g.pos) |
|
|
|
|
|
|
|
|
|
print('openings:', self.openings) |
|
|
|
|
|
|
|
|
|
if not len(self.openings): |
|
|
|
|
print('Unable to get to villager:', self.villager) |
|
|
|
|
if self.villager not in self.good_villagers: |
|
|
|
|
self.bad_villagers.append(self.villager) |
|
|
|
|
print('Added to bad villager list') |
|
|
|
|
self.state = self.cleanup |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
navpath = w.path_to_place(p, self.openings[0]) |
|
|
|
|
|
|
|
|
|
if navpath: |
|
|
|
|
self.g.path = navpath |
|
|
|
|
self.state = self.going_to_villager |
|
|
|
|
else: |
|
|
|
|
self.openings.pop(0) |
|
|
|
|
|
|
|
|
|
def going_to_villager(self): |
|
|
|
|
if utils.pint(self.g.pos) == self.openings[0]: |
|
|
|
|
print('Arrived at villager') |
|
|
|
|
self.g.look_at = self.villager_pos |
|
|
|
|
self.wait_time = 0.5 |
|
|
|
|
self.state = self.wait_to_interact |
|
|
|
|
|
|
|
|
|
def wait_to_interact(self): |
|
|
|
|
if self.wait_time > 0: |
|
|
|
|
self.wait_time -= utils.TICK |
|
|
|
|
else: |
|
|
|
|
self.state = self.interact_villager |
|
|
|
|
|
|
|
|
|
def interact_villager(self): |
|
|
|
|
print('Interacting with villager') |
|
|
|
|
self.g.game.interact(self.villager.entity_id) |
|
|
|
|
self.g.game.animate() |
|
|
|
|
self.state = self.select_trade |
|
|
|
|
|
|
|
|
|
def select_trade(self): |
|
|
|
|
if not self.g.window or not self.g.trades: |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
print('Got trades window') |
|
|
|
|
self.state = self.freeze |
|
|
|
|
|
|
|
|
|
def freeze(self): |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
def wait(self): |
|
|
|
|
if self.wait_time > 0: |
|
|
|
|
self.wait_time -= utils.TICK |
|
|
|
|
else: |
|
|
|
|
self.state = self.cleanup |
|
|
|
|
|
|
|
|
|
def cleanup(self): |
|
|
|
|
self.state = self.done |
|
|
|
|
|
|
|
|
|
def done(self): |
|
|
|
|
# never gets ran, placeholder |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
def __init__(self, global_state): |
|
|
|
|
self.g = global_state |
|
|
|
|
self.state = self.idle |
|
|
|
|
|
|
|
|
|
self.villager = None |
|
|
|
|
self.villager_pos = None |
|
|
|
|
self.bad_villagers = [] |
|
|
|
|
self.good_villagers = [] |
|
|
|
|
self.openings = [] |
|
|
|
|
self.wait_time = 0 |
|
|
|
|
|
|
|
|
|
def run(self): |
|
|
|
|
self.state() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class JobStates: |
|
|
|
|
def idle(self): |
|
|
|
@ -1793,6 +1901,7 @@ class JobStates: |
|
|
|
|
self.gather_wart_states = GatherWartStates(self.g) |
|
|
|
|
self.gather_crop_states = GatherCropStates(self.g) |
|
|
|
|
self.eat_food_states = EatFoodStates(self.g) |
|
|
|
|
self.sell_to_villager = SellToVillagerStates(self.g) |
|
|
|
|
|
|
|
|
|
def run_machines(self, machines): |
|
|
|
|
for m in machines: |
|
|
|
@ -1922,6 +2031,21 @@ class JobStates: |
|
|
|
|
self.sleep_with_bed_states.silent = True |
|
|
|
|
return machines |
|
|
|
|
|
|
|
|
|
def trade(self): |
|
|
|
|
machines = [ |
|
|
|
|
#self.grab_supplies_states, |
|
|
|
|
self.sell_to_villager, |
|
|
|
|
#self.sleep_with_bed_states, |
|
|
|
|
#self.eat_food_states, |
|
|
|
|
#self.cache_items_states, |
|
|
|
|
] |
|
|
|
|
self.sleep_with_bed_states.silent = True |
|
|
|
|
self.cache_items_states.silent = True |
|
|
|
|
self.grab_supplies_states.supplies = { |
|
|
|
|
tuple(items.AXE_IDS): 9, |
|
|
|
|
} |
|
|
|
|
return machines |
|
|
|
|
|
|
|
|
|
def stop(self): |
|
|
|
|
self.init_machines() |
|
|
|
|
self.state = self.idle |
|
|
|
|