Add job for farming trees and object physics

This commit is contained in:
2020-10-13 20:26:50 -06:00
parent c6c0def867
commit f328f3443a
9 changed files with 361 additions and 38 deletions
+160 -5
View File
@@ -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()