Add job for farming trees and object physics
This commit is contained in:
@@ -131,6 +131,7 @@ class GatherWoodStates:
|
||||
return None
|
||||
|
||||
def init(self):
|
||||
self.g.chopped_tree = False
|
||||
self.state = self.find_new_tree
|
||||
|
||||
def find_new_tree(self):
|
||||
@@ -141,9 +142,14 @@ class GatherWoodStates:
|
||||
trees = w.find_trees(p, 100)
|
||||
print('Found trees:', trees)
|
||||
|
||||
while trees[0] in self.bad_trees:
|
||||
trees.pop(0)
|
||||
self.tree = trees[0]
|
||||
try:
|
||||
while trees[0] in self.bad_trees:
|
||||
trees.pop(0)
|
||||
self.tree = trees[0]
|
||||
except IndexError:
|
||||
print('No good tress left, aborting.')
|
||||
self.state = self.cleanup
|
||||
return
|
||||
|
||||
self.openings = w.find_tree_openings(self.tree)
|
||||
self.state = self.choose_opening
|
||||
@@ -241,6 +247,7 @@ class GatherWoodStates:
|
||||
if self.wait_time > 0:
|
||||
self.wait_time -= utils.TICK
|
||||
else:
|
||||
self.g.chopped_tree = True
|
||||
self.state = self.cleanup
|
||||
|
||||
def cleanup(self):
|
||||
@@ -428,7 +435,8 @@ class SleepWithBedStates:
|
||||
if self.g.time >= 12542:
|
||||
print('Sleeping')
|
||||
self.g.game.place_block(self.area, BlockFace.TOP)
|
||||
self.g.chat.send('zzz')
|
||||
if not self.silent:
|
||||
self.g.chat.send('zzz')
|
||||
self.state = self.sleep_bed
|
||||
|
||||
def sleep_bed(self):
|
||||
@@ -465,6 +473,8 @@ class SleepWithBedStates:
|
||||
self.g = global_state
|
||||
self.state = self.idle
|
||||
|
||||
self.silent = False
|
||||
|
||||
self.area = None
|
||||
self.opening = None
|
||||
self.bad_areas = []
|
||||
@@ -507,7 +517,7 @@ class CacheItemsStates:
|
||||
self.state = self.cleanup
|
||||
return
|
||||
|
||||
openings = w.find_bed_openings(self.area)
|
||||
openings = w.find_cache_openings(self.area)
|
||||
|
||||
for o in openings:
|
||||
navpath = w.path_to_place(p, o)
|
||||
@@ -612,6 +622,115 @@ class CacheItemsStates:
|
||||
self.state()
|
||||
|
||||
|
||||
class PlantTreeStates:
|
||||
def idle(self):
|
||||
return None
|
||||
|
||||
# TODO: maybe add a "plant deficit" so we know when to plant or not
|
||||
|
||||
def init(self):
|
||||
if self.g.chopped_tree:
|
||||
self.state = self.check_feet
|
||||
else:
|
||||
print('Aborting planting, did not plant')
|
||||
self.state = self.cleanup
|
||||
|
||||
def check_feet(self):
|
||||
p = utils.pint(self.g.pos)
|
||||
|
||||
# check for air at feet
|
||||
if self.g.chunks.get_block_at(*p) in [0]:
|
||||
self.state = self.select_sapling
|
||||
else:
|
||||
print('Aborting planting, feet not air')
|
||||
self.state = self.cleanup
|
||||
|
||||
def select_sapling(self):
|
||||
p = utils.pint(self.g.pos)
|
||||
|
||||
if self.g.game.select_random_item(items.SAPLING_IDS):
|
||||
self.g.look_at = utils.padd(p, path.BLOCK_BELOW)
|
||||
self.state = self.wait_select
|
||||
self.wait_time = 1
|
||||
else:
|
||||
print('Aborting planting, no saplings')
|
||||
self.state = self.cleanup
|
||||
|
||||
def wait_select(self):
|
||||
# wait a bit to look down
|
||||
if self.wait_time > 0:
|
||||
self.wait_time -= utils.TICK
|
||||
else:
|
||||
self.state = self.place_sapling
|
||||
|
||||
def place_sapling(self):
|
||||
p = utils.pint(self.g.pos)
|
||||
self.g.game.place_block(p, BlockFace.TOP)
|
||||
print('Placed sapling')
|
||||
self.state = self.wait_place
|
||||
self.wait_time = 1
|
||||
|
||||
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.find_open_spot
|
||||
|
||||
def find_open_spot(self):
|
||||
print('Finding an open spot to stand...')
|
||||
w = self.g.world
|
||||
p = utils.pint(self.g.pos)
|
||||
|
||||
areas = w.find_cache_areas(p, 20)
|
||||
print('Found areas:', areas)
|
||||
|
||||
try:
|
||||
while areas[0] in self.bad_areas:
|
||||
areas.pop(0)
|
||||
self.area = areas[0]
|
||||
except IndexError:
|
||||
print('No good areas left, aborting.')
|
||||
self.bad_areas = []
|
||||
self.state = self.cleanup
|
||||
return
|
||||
|
||||
navpath = w.path_to_place(p, self.area)
|
||||
|
||||
if not navpath:
|
||||
print('Unable to get to open area', self.area)
|
||||
self.bad_areas.append(self.area)
|
||||
self.state = self.cleanup
|
||||
return
|
||||
|
||||
self.g.path = navpath
|
||||
self.state = self.going_to_area
|
||||
print('Going to area', self.area)
|
||||
|
||||
def going_to_area(self):
|
||||
if utils.pint(self.g.pos) == self.area:
|
||||
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.wait_time = 0
|
||||
self.area = None
|
||||
self.bad_areas = []
|
||||
|
||||
def run(self):
|
||||
self.state()
|
||||
|
||||
|
||||
class JobStates:
|
||||
def idle(self):
|
||||
return None
|
||||
@@ -676,12 +795,47 @@ class JobStates:
|
||||
|
||||
s1.run()
|
||||
|
||||
def farm_wood(self):
|
||||
self.sleep_with_bed_states.silent = True
|
||||
|
||||
s1 = self.gather_wood_states
|
||||
s2 = self.plant_tree_states
|
||||
s3 = self.sleep_with_bed_states
|
||||
s4 = self.cache_items_states
|
||||
|
||||
if s1.state == s1.idle:
|
||||
s1.state = s1.init
|
||||
s2.state = s2.init
|
||||
s3.state = s3.init
|
||||
s4.state = s4.init
|
||||
elif s1.state == s1.done:
|
||||
if s2.state != s2.done:
|
||||
s2.run()
|
||||
return
|
||||
|
||||
if s3.state != s3.done:
|
||||
s3.run()
|
||||
return
|
||||
|
||||
if s4.state != s4.done:
|
||||
s4.run()
|
||||
return
|
||||
|
||||
s1.state = s1.init
|
||||
s2.state = s2.init
|
||||
s3.state = s3.init
|
||||
s4.state = s4.init
|
||||
return
|
||||
|
||||
s1.run()
|
||||
|
||||
def stop(self):
|
||||
self.gather_wood_states = GatherWoodStates(self.g)
|
||||
self.gather_sand_states = GatherSandStates(self.g)
|
||||
self.sleep_with_bed_states = SleepWithBedStates(self.g)
|
||||
self.cache_items_states = CacheItemsStates(self.g)
|
||||
self.find_gapple_states = FindGappleStates(self.g)
|
||||
self.plant_tree_states = PlantTreeStates(self.g)
|
||||
self.state = self.idle
|
||||
|
||||
def __init__(self, global_state):
|
||||
@@ -694,6 +848,7 @@ class JobStates:
|
||||
self.sleep_with_bed_states = SleepWithBedStates(self.g)
|
||||
self.cache_items_states = CacheItemsStates(self.g)
|
||||
self.find_gapple_states = FindGappleStates(self.g)
|
||||
self.plant_tree_states = PlantTreeStates(self.g)
|
||||
|
||||
def tick(self):
|
||||
self.state()
|
||||
|
||||
Reference in New Issue
Block a user