Program the bot to crawl, fix wood farming bugs
This commit is contained in:
parent
e642e426b9
commit
2fa3044acb
3
bot.py
3
bot.py
|
@ -142,9 +142,11 @@ def tick(global_state):
|
||||||
g.y_v += g.y_a * utils.TICK
|
g.y_v += g.y_a * utils.TICK
|
||||||
|
|
||||||
block_below = g.chunks.get_block_at(floor(p.x), ceil(p.y-1), floor(p.z))
|
block_below = g.chunks.get_block_at(floor(p.x), ceil(p.y-1), floor(p.z))
|
||||||
|
block_above = g.chunks.get_block_at(floor(p.x), ceil(p.y+1), floor(p.z))
|
||||||
in_void = p.y < 0
|
in_void = p.y < 0
|
||||||
in_air = block_below in blocks.NON_SOLID_IDS or in_void
|
in_air = block_below in blocks.NON_SOLID_IDS or in_void
|
||||||
in_water = block_below in blocks.WATER_IDS
|
in_water = block_below in blocks.WATER_IDS
|
||||||
|
g.crawling = block_above not in blocks.NON_SOLID_IDS
|
||||||
|
|
||||||
if in_air:
|
if in_air:
|
||||||
g.y_a = -36.0
|
g.y_a = -36.0
|
||||||
|
@ -204,6 +206,7 @@ def init(global_state):
|
||||||
g.y_a = 0
|
g.y_a = 0
|
||||||
g.yaw = 360
|
g.yaw = 360
|
||||||
g.pitch = 0
|
g.pitch = 0
|
||||||
|
g.crawling = False
|
||||||
|
|
||||||
g.breaking = None
|
g.breaking = None
|
||||||
g.break_time = 0
|
g.break_time = 0
|
||||||
|
|
18
game.py
18
game.py
|
@ -117,10 +117,8 @@ class MCWorld:
|
||||||
log_count += 1
|
log_count += 1
|
||||||
|
|
||||||
for offset in path.CHECK_DIRECTIONS:
|
for offset in path.CHECK_DIRECTIONS:
|
||||||
if self.block_at(*utils.padd(log, offset)) not in blocks.LEAF_IDS:
|
if self.block_at(*utils.padd(log, offset)) in blocks.LEAF_IDS:
|
||||||
break
|
good_leaves = True
|
||||||
else: # for:
|
|
||||||
good_leaves = True
|
|
||||||
|
|
||||||
# make sure it's a good tree
|
# make sure it's a good tree
|
||||||
if not good_leaves or log_count < 3:
|
if not good_leaves or log_count < 3:
|
||||||
|
@ -132,7 +130,7 @@ class MCWorld:
|
||||||
|
|
||||||
def find_tree_openings(self, tree):
|
def find_tree_openings(self, tree):
|
||||||
# returns coords in a cardinal direction where we can stand by tree
|
# returns coords in a cardinal direction where we can stand by tree
|
||||||
maze_solver = path.Pathfinder(self.g.chunks)
|
maze_solver = path.Pathfinder(self.g)
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
# TODO: make sure only non-solid and leaves between
|
# TODO: make sure only non-solid and leaves between
|
||||||
|
@ -146,7 +144,7 @@ class MCWorld:
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def path_to_place(self, start, place):
|
def path_to_place(self, start, place):
|
||||||
maze_solver = path.Pathfinder(self.g.chunks)
|
maze_solver = path.Pathfinder(self.g)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
s = maze_solver.astar(start, place)
|
s = maze_solver.astar(start, place)
|
||||||
|
@ -155,8 +153,8 @@ class MCWorld:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def find_bed_areas(self, center, distance):
|
def find_bed_areas(self, center, distance):
|
||||||
bed_clearance = 25 # 5x5 area
|
bed_clearance = 9 # 5x5 area
|
||||||
clear_distance = 3
|
clear_distance = 2
|
||||||
|
|
||||||
for a in self.find_blocks_3d(center, [0], distance, 50):
|
for a in self.find_blocks_3d(center, [0], distance, 50):
|
||||||
# check for air around the area
|
# check for air around the area
|
||||||
|
@ -324,7 +322,7 @@ class MCWorld:
|
||||||
|
|
||||||
def find_villager_openings(self, villager):
|
def find_villager_openings(self, villager):
|
||||||
# returns coords in a cardinal direction where we can stand by a villager
|
# returns coords in a cardinal direction where we can stand by a villager
|
||||||
maze_solver = path.Pathfinder(self.g.chunks)
|
maze_solver = path.Pathfinder(self.g)
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
for distance in range(3):
|
for distance in range(3):
|
||||||
|
@ -398,7 +396,7 @@ class Game:
|
||||||
print('new waypoint:', self.g.goal)
|
print('new waypoint:', self.g.goal)
|
||||||
|
|
||||||
start = time.time()
|
start = time.time()
|
||||||
solution = path.Pathfinder(self.g.chunks).astar(utils.pint(self.g.pos), utils.pint(self.g.goal))
|
solution = path.Pathfinder(self.g).astar(utils.pint(self.g.pos), utils.pint(self.g.goal))
|
||||||
if solution:
|
if solution:
|
||||||
solution = list(solution)
|
solution = list(solution)
|
||||||
self.g.path = solution
|
self.g.path = solution
|
||||||
|
|
69
path.py
69
path.py
|
@ -121,8 +121,9 @@ HALF_PARKOUR = {
|
||||||
BLOCK_CACHE_SIZE = 2**14
|
BLOCK_CACHE_SIZE = 2**14
|
||||||
|
|
||||||
class Pathfinder(AStar):
|
class Pathfinder(AStar):
|
||||||
def __init__(self, chunks):
|
def __init__(self, g):
|
||||||
self.chunks = chunks
|
self.g = g
|
||||||
|
self.chunks = g.chunks
|
||||||
self.start_time = time.time()
|
self.start_time = time.time()
|
||||||
|
|
||||||
@functools.lru_cache(maxsize=BLOCK_CACHE_SIZE)
|
@functools.lru_cache(maxsize=BLOCK_CACHE_SIZE)
|
||||||
|
@ -133,6 +134,23 @@ class Pathfinder(AStar):
|
||||||
def bavoid(self, p):
|
def bavoid(self, p):
|
||||||
return self.chunks.get_block_at(*p) in blocks.AVOID_IDS or p[1] < 0
|
return self.chunks.get_block_at(*p) in blocks.AVOID_IDS or p[1] < 0
|
||||||
|
|
||||||
|
def check_traverse_crawling(self, node, offset):
|
||||||
|
dest = utils.padd(node, offset)
|
||||||
|
|
||||||
|
if not self.bair(dest):
|
||||||
|
return False
|
||||||
|
|
||||||
|
if self.bair(utils.padd(dest, BLOCK_BELOW)):
|
||||||
|
return False
|
||||||
|
|
||||||
|
if self.bavoid(dest):
|
||||||
|
return False
|
||||||
|
|
||||||
|
if self.bavoid(utils.padd(dest, BLOCK_BELOW)):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def check_traverse(self, node, offset):
|
def check_traverse(self, node, offset):
|
||||||
dest = utils.padd(node, offset)
|
dest = utils.padd(node, offset)
|
||||||
|
|
||||||
|
@ -254,27 +272,32 @@ class Pathfinder(AStar):
|
||||||
def neighbors(self, node):
|
def neighbors(self, node):
|
||||||
results = []
|
results = []
|
||||||
|
|
||||||
for offset in TRAVERSE:
|
if self.g.crawling:
|
||||||
if self.check_traverse(node, offset):
|
for offset in TRAVERSE:
|
||||||
results.append(utils.padd(node, offset))
|
if self.check_traverse_crawling(node, offset):
|
||||||
for offset in DIAGONAL:
|
results.append(utils.padd(node, offset))
|
||||||
if self.check_diagonal(node, offset):
|
else:
|
||||||
results.append(utils.padd(node, offset))
|
for offset in TRAVERSE:
|
||||||
for offset in ASCEND:
|
if self.check_traverse(node, offset):
|
||||||
if self.check_ascend(node, offset):
|
results.append(utils.padd(node, offset))
|
||||||
results.append(utils.padd(node, offset))
|
for offset in DIAGONAL:
|
||||||
for offset in DESCEND:
|
if self.check_diagonal(node, offset):
|
||||||
if self.check_descend(node, offset):
|
results.append(utils.padd(node, offset))
|
||||||
results.append(utils.padd(node, offset))
|
for offset in ASCEND:
|
||||||
for offset in DESCEND2:
|
if self.check_ascend(node, offset):
|
||||||
if self.check_descend2(node, offset):
|
results.append(utils.padd(node, offset))
|
||||||
results.append(utils.padd(node, offset))
|
for offset in DESCEND:
|
||||||
for offset in DESCEND3:
|
if self.check_descend(node, offset):
|
||||||
if self.check_descend3(node, offset):
|
results.append(utils.padd(node, offset))
|
||||||
results.append(utils.padd(node, offset))
|
for offset in DESCEND2:
|
||||||
for offset in PARKOUR:
|
if self.check_descend2(node, offset):
|
||||||
if self.check_parkour(node, offset):
|
results.append(utils.padd(node, offset))
|
||||||
results.append(utils.padd(node, offset))
|
for offset in DESCEND3:
|
||||||
|
if self.check_descend3(node, offset):
|
||||||
|
results.append(utils.padd(node, offset))
|
||||||
|
for offset in PARKOUR:
|
||||||
|
if self.check_parkour(node, offset):
|
||||||
|
results.append(utils.padd(node, offset))
|
||||||
|
|
||||||
if not results:
|
if not results:
|
||||||
if time.time() - self.start_time > 2.0:
|
if time.time() - self.start_time > 2.0:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user