Add a job for farming nether wart

master
Tanner Collin 3 years ago
parent 6c0688b759
commit 6c9f228862
  1. 5
      blocks.py
  2. 3
      game.py
  3. 4
      items.py
  4. 118
      jobs.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']:

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

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

@ -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,

Loading…
Cancel
Save