|
|
|
@ -121,8 +121,9 @@ HALF_PARKOUR = { |
|
|
|
|
BLOCK_CACHE_SIZE = 2**14 |
|
|
|
|
|
|
|
|
|
class Pathfinder(AStar): |
|
|
|
|
def __init__(self, chunks): |
|
|
|
|
self.chunks = chunks |
|
|
|
|
def __init__(self, g): |
|
|
|
|
self.g = g |
|
|
|
|
self.chunks = g.chunks |
|
|
|
|
self.start_time = time.time() |
|
|
|
|
|
|
|
|
|
@functools.lru_cache(maxsize=BLOCK_CACHE_SIZE) |
|
|
|
@ -133,6 +134,23 @@ class Pathfinder(AStar): |
|
|
|
|
def bavoid(self, p): |
|
|
|
|
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): |
|
|
|
|
dest = utils.padd(node, offset) |
|
|
|
|
|
|
|
|
@ -254,27 +272,32 @@ class Pathfinder(AStar): |
|
|
|
|
def neighbors(self, node): |
|
|
|
|
results = [] |
|
|
|
|
|
|
|
|
|
for offset in TRAVERSE: |
|
|
|
|
if self.check_traverse(node, offset): |
|
|
|
|
results.append(utils.padd(node, offset)) |
|
|
|
|
for offset in DIAGONAL: |
|
|
|
|
if self.check_diagonal(node, offset): |
|
|
|
|
results.append(utils.padd(node, offset)) |
|
|
|
|
for offset in ASCEND: |
|
|
|
|
if self.check_ascend(node, offset): |
|
|
|
|
results.append(utils.padd(node, offset)) |
|
|
|
|
for offset in DESCEND: |
|
|
|
|
if self.check_descend(node, offset): |
|
|
|
|
results.append(utils.padd(node, offset)) |
|
|
|
|
for offset in DESCEND2: |
|
|
|
|
if self.check_descend2(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 self.g.crawling: |
|
|
|
|
for offset in TRAVERSE: |
|
|
|
|
if self.check_traverse_crawling(node, offset): |
|
|
|
|
results.append(utils.padd(node, offset)) |
|
|
|
|
else: |
|
|
|
|
for offset in TRAVERSE: |
|
|
|
|
if self.check_traverse(node, offset): |
|
|
|
|
results.append(utils.padd(node, offset)) |
|
|
|
|
for offset in DIAGONAL: |
|
|
|
|
if self.check_diagonal(node, offset): |
|
|
|
|
results.append(utils.padd(node, offset)) |
|
|
|
|
for offset in ASCEND: |
|
|
|
|
if self.check_ascend(node, offset): |
|
|
|
|
results.append(utils.padd(node, offset)) |
|
|
|
|
for offset in DESCEND: |
|
|
|
|
if self.check_descend(node, offset): |
|
|
|
|
results.append(utils.padd(node, offset)) |
|
|
|
|
for offset in DESCEND2: |
|
|
|
|
if self.check_descend2(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 time.time() - self.start_time > 2.0: |
|
|
|
|