diff --git a/blocks.py b/blocks.py index 000ab4a..52c631c 100644 --- a/blocks.py +++ b/blocks.py @@ -279,6 +279,11 @@ for block_name in ['trapped_chest']: for state in JSON_BLOCKS['minecraft:' + block_name]['states']: TRAPPED_CHEST_IDS.add(state['id']) +NETHERWART_IDS = set() +for block_name in ['nether_wart']: + for state in JSON_BLOCKS['minecraft:' + block_name]['states']: + NETHERWART_IDS.add(state['id']) + INDEXED_IDS = set() for block_name in INDEXED: for state in JSON_BLOCKS['minecraft:' + block_name]['states']: diff --git a/game.py b/game.py index d1b9bc4..7a93f1b 100644 --- a/game.py +++ b/game.py @@ -639,6 +639,9 @@ class Game: elif data == 'sand': self.g.job.state = self.g.job.farm_sand reply = 'ok' + elif data == 'wart': + self.g.job.state = self.g.job.farm_wart + reply = 'ok' if reply: for i in self.g.inv.values(): diff --git a/items.py b/items.py index a2bd6e1..f0b18ef 100644 --- a/items.py +++ b/items.py @@ -62,5 +62,7 @@ GAPPLE_ID = set([ITEMS['minecraft:enchanted_golden_apple']['protocol_id']]) SAND_ID = set([ITEMS['minecraft:sand']['protocol_id']]) +NETHERWART_ID = set([ITEMS['minecraft:nether_wart']['protocol_id']]) + NEEDED_ITEMS = BED_IDS | CHEST_ID -WANTED_ITEMS = SAPLING_IDS +WANTED_ITEMS = SAPLING_IDS | NETHERWART_ID diff --git a/jobs.py b/jobs.py index 64fb3e6..fcf2a9d 100644 --- a/jobs.py +++ b/jobs.py @@ -124,6 +124,113 @@ class FindGappleStates: self.state() +class GatherWartStates: + def idle(self): + return None + + def init(self): + self.g.chopped_tree = False + self.state = self.find_new_wart + + def find_new_wart(self): + print('Finding new tree...') + w = self.g.world + p = utils.pint(self.g.pos) + + mature_wart = max(blocks.NETHERWART_IDS) + for wart in w.find_blocks_3d(p, [mature_wart], 100): + print('Found wart:', wart) + if wart not in self.bad_warts: + break + else: # for + print('No good warts left, aborting.') + self.state = self.cleanup + return + + self.wart = wart + self.state = self.nav_to_wart + + def nav_to_wart(self): + w = self.g.world + p = utils.pint(self.g.pos) + + navpath = w.path_to_place(p, self.wart) + + if navpath: + self.g.path = navpath + self.g.look_at = utils.padd(self.wart, path.BLOCK_BELOW) + self.state = self.going_to_wart + else: + self.bad_warts.append(wart) + self.state = self.find_new_wart + + def going_to_wart(self): + if utils.pint(self.g.pos) == self.wart: + print('At the wart') + self.state = self.break_wart + + def break_wart(self): + self.g.game.break_block(self.wart) + self.wait_time = 0.5 + self.state = self.wait + + def wait(self): + # wait for the item + if self.wait_time > 0: + self.wait_time -= utils.TICK + else: + self.state = self.select_wart + + def select_wart(self): + p = utils.pint(self.g.pos) + + if self.g.game.select_item(items.NETHERWART_ID): + self.state = self.wait_select + self.wait_time = 0.5 + else: + print('Aborting planting, no wart') + self.state = self.cleanup + + def wait_select(self): + # wait a bit to select + if self.wait_time > 0: + self.wait_time -= utils.TICK + else: + self.state = self.place_wart + + def place_wart(self): + p = utils.pint(self.g.pos) + self.g.game.place_block(p, BlockFace.TOP) + print('Placed wart') + self.state = self.wait_place + self.wait_time = 0.5 + + def wait_place(self): + # wait a bit for chunk data to update + if self.wait_time > 0: + self.wait_time -= utils.TICK + else: + self.state = self.cleanup + + def cleanup(self): + self.g.look_at = None + 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.wart = None + self.bad_warts = [] + self.wait_time = 0 + + def run(self): + self.state() + class GatherWoodStates: def bair(self, p): return self.g.chunks.get_block_at(*p) in blocks.NON_SOLID_IDS @@ -1325,6 +1432,7 @@ class JobStates: self.grab_sand_states = GrabSandStates(self.g) self.fill_blocks_states = FillBlocksStates(self.g) self.check_threats_states = CheckThreatsStates(self.g) + self.gather_wart_states = GatherWartStates(self.g) def run_machines(self, machines): for m in machines: @@ -1393,6 +1501,16 @@ class JobStates: self.cache_items_states.silent = True return machines + def farm_wart(self): + machines = [ + self.gather_wart_states, + self.sleep_with_bed_states, + self.cache_items_states, + ] + self.sleep_with_bed_states.silent = True + self.cache_items_states.silent = True + return machines + def fill_blocks(self): machines = [ self.fill_blocks_states,