Fix lumberjack bugs
This commit is contained in:
parent
4e2efeb604
commit
d37f55a2db
140
bot.py
140
bot.py
|
@ -217,8 +217,11 @@ def padd(p1, p2):
|
|||
def psub(p1, p2):
|
||||
return (p1[0] - p2[0], p1[1] - p2[1], p1[2] - p2[2])
|
||||
|
||||
def phyp(p1, p2):
|
||||
return hypot(p1[0] - p2[0], p1[1] - p2[1], p1[2] - p2[2])
|
||||
|
||||
def pint(p):
|
||||
return (int(p[0]), int(p[1]), int(p[2]))
|
||||
return (floor(p[0]), floor(p[1]), floor(p[2]))
|
||||
|
||||
# larger started being slower
|
||||
BLOCK_CACHE_SIZE = 2**14
|
||||
|
@ -296,9 +299,6 @@ class MazeSolver(AStar):
|
|||
if not self.bair(padd(node, BLOCK_ABOVE2)):
|
||||
return False
|
||||
|
||||
if not self.bair(padd(dest, BLOCK_ABOVE2)):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def check_descend(self, node, offset):
|
||||
|
@ -346,6 +346,9 @@ class MazeSolver(AStar):
|
|||
if not self.check_ascend(node, offset):
|
||||
return False
|
||||
|
||||
if not self.bair(padd(dest, BLOCK_ABOVE2)):
|
||||
return False
|
||||
|
||||
if not self.bair(padd(middle, BLOCK_ABOVE)):
|
||||
return False
|
||||
|
||||
|
@ -398,6 +401,7 @@ class MazeSolver(AStar):
|
|||
|
||||
def spiral(n):
|
||||
# return x, 0, z coords along a spiral at step n
|
||||
# I forget where I found this
|
||||
n += 1
|
||||
k = ceil((sqrt(n)-1)/2)
|
||||
t = 2 * k + 1
|
||||
|
@ -442,6 +446,7 @@ def break_block(connection, coords, time):
|
|||
s['break_finished_packet'].face = 1
|
||||
|
||||
s['break_time'] = time
|
||||
s['break_timeout'] = 0.25
|
||||
|
||||
|
||||
BLOCK_ABOVE = (0, +1, 0)
|
||||
|
@ -480,14 +485,21 @@ class MCWorld:
|
|||
if offset[0] > distance:
|
||||
return result
|
||||
|
||||
def find_tree(self, center, distance):
|
||||
def find_trees(self, center, distance):
|
||||
logs = []
|
||||
for i in range(5):
|
||||
check = padd(center, alternate(i, 4))
|
||||
logs.extend(self.find_blocks(center, distance, blocks.LOG_IDS, 5))
|
||||
check = padd(center, alternate(i, 3))
|
||||
logs.extend(self.find_blocks(check, distance, blocks.LOG_IDS, 50))
|
||||
|
||||
print(logs)
|
||||
|
||||
trees = []
|
||||
for log in logs:
|
||||
# crawl to the top log
|
||||
# crawl to the bottom log
|
||||
while self.block_at(*padd(log, BLOCK_BELOW)) in blocks.LOG_IDS:
|
||||
log = padd(log, BLOCK_BELOW)
|
||||
|
||||
# crawl to the top log to count
|
||||
log_count = 1
|
||||
while self.block_at(*padd(log, BLOCK_ABOVE)) in blocks.LOG_IDS:
|
||||
log = padd(log, BLOCK_ABOVE)
|
||||
|
@ -495,15 +507,16 @@ class MCWorld:
|
|||
|
||||
# make sure it's a good tree
|
||||
if self.block_at(*padd(log, BLOCK_ABOVE)) in blocks.LEAF_IDS and log_count > 2:
|
||||
break
|
||||
else: # for
|
||||
return None
|
||||
# crawl back to the bottom log
|
||||
while self.block_at(*padd(log, BLOCK_BELOW)) in blocks.LOG_IDS:
|
||||
log = padd(log, BLOCK_BELOW)
|
||||
trees.append(log)
|
||||
|
||||
# crawl to the bottom log
|
||||
while self.block_at(*padd(log, BLOCK_BELOW)) in blocks.LOG_IDS:
|
||||
log = padd(log, BLOCK_BELOW)
|
||||
print('before', trees)
|
||||
trees.sort(key=lambda x: phyp(center, x))
|
||||
print('after', trees)
|
||||
|
||||
return log
|
||||
return trees
|
||||
|
||||
def find_tree_openings(self, tree):
|
||||
# returns coords in a cardinal direction where we can stand by tree
|
||||
|
@ -553,8 +566,12 @@ class LumberjackStates:
|
|||
w = MCWorld(self.player_info.chunks)
|
||||
p = pint(self.player_info.pos)
|
||||
|
||||
self.tree = w.find_tree(p, 100)
|
||||
print('Found tree at:', self.tree)
|
||||
trees = w.find_trees(p, 100)
|
||||
print('Found trees:', trees)
|
||||
|
||||
while trees[0] in self.bad_trees:
|
||||
trees.pop(0)
|
||||
self.tree = trees[0]
|
||||
|
||||
openings = w.find_tree_openings(self.tree)
|
||||
|
||||
|
@ -563,8 +580,10 @@ class LumberjackStates:
|
|||
self.opening = o
|
||||
if path: break
|
||||
else: # for
|
||||
print('Unable to get to tree')
|
||||
print('Unable to get to tree', self.tree)
|
||||
self.bad_trees.append(self.tree)
|
||||
self.state = self.finished
|
||||
return
|
||||
|
||||
s['path'] = path
|
||||
self.state = self.going_to_tree
|
||||
|
@ -572,11 +591,11 @@ class LumberjackStates:
|
|||
def going_to_tree(self):
|
||||
d = self.player_info.pos - LPoint3f(*self.opening)
|
||||
if d.length() < 1:
|
||||
s['look_at'] = LPoint3f(*self.tree)
|
||||
s['look_at'] = self.tree
|
||||
self.state = self.clear_leaves
|
||||
|
||||
def clear_leaves(self):
|
||||
if not s['break_finished_packet']:
|
||||
if not s['break_timeout']:
|
||||
p = pint(self.player_info.pos)
|
||||
diff = psub(self.tree, p)
|
||||
|
||||
|
@ -592,16 +611,16 @@ class LumberjackStates:
|
|||
return
|
||||
|
||||
def clear_trunk_base(self):
|
||||
if not s['break_finished_packet']:
|
||||
if not s['break_timeout']:
|
||||
base = self.tree
|
||||
above = padd(self.tree, BLOCK_ABOVE)
|
||||
|
||||
if self.blog(base):
|
||||
s['break'] = (base, 2)
|
||||
return
|
||||
s['break'] = (base, 3)
|
||||
print('breaking base')
|
||||
elif self.blog(above):
|
||||
s['break'] = (above, 2)
|
||||
return
|
||||
s['break'] = (above, 3)
|
||||
print('breaking above')
|
||||
else:
|
||||
w = MCWorld(self.player_info.chunks)
|
||||
p = pint(self.player_info.pos)
|
||||
|
@ -613,11 +632,11 @@ class LumberjackStates:
|
|||
def going_to_trunk_base(self):
|
||||
d = self.player_info.pos - LPoint3f(*self.opening)
|
||||
if d.length() < 1:
|
||||
s['pitch'] = -90
|
||||
s['look_at'] = padd(self.tree, BLOCK_ABOVE2)
|
||||
self.state = self.clear_trunk
|
||||
|
||||
def clear_trunk(self):
|
||||
if not s['break_finished_packet']:
|
||||
if not s['break_timeout']:
|
||||
check = self.tree
|
||||
|
||||
count = 0
|
||||
|
@ -626,14 +645,22 @@ class LumberjackStates:
|
|||
count += 1
|
||||
|
||||
if self.blog(check):
|
||||
s['break'] = (check, 2)
|
||||
print('breaking log', check)
|
||||
s['break'] = (check, 3)
|
||||
else:
|
||||
print('Finished clearing tree')
|
||||
self.state = self.finished
|
||||
self.wait_time = 0.5
|
||||
s['look_at'] = None
|
||||
self.state = self.wait
|
||||
|
||||
def wait(self):
|
||||
# wait for the last log to fall
|
||||
if self.wait_time > 0:
|
||||
self.wait_time -= TICK
|
||||
else:
|
||||
self.state = self.finished
|
||||
|
||||
def finished(self):
|
||||
s['pitch'] = 0 # todo, calc with look_at
|
||||
s['look_at'] = None
|
||||
return None
|
||||
|
||||
|
||||
|
@ -643,6 +670,8 @@ class LumberjackStates:
|
|||
|
||||
self.tree = None
|
||||
self.opening = None
|
||||
self.bad_trees = []
|
||||
self.wait_time = 0
|
||||
|
||||
def run(self):
|
||||
self.state()
|
||||
|
@ -659,6 +688,10 @@ class JobStates:
|
|||
l = self.lumberjack_states
|
||||
if l.state == l.idle:
|
||||
l.state = l.find_new_tree
|
||||
elif l.state == l.finished:
|
||||
# check time, etc
|
||||
l.state = l.find_new_tree
|
||||
|
||||
l.run()
|
||||
|
||||
def __init__(self, player_info):
|
||||
|
@ -671,8 +704,11 @@ class JobStates:
|
|||
|
||||
|
||||
TICK = 0.05
|
||||
ANGLE_DIR = LVector3f(x=0, y=0, z=-1)
|
||||
ANGLE_REF = LVector3f(x=0, y=1, z=0)
|
||||
last_tick = time.time()
|
||||
|
||||
PITCH_ANGLE_DIR = LVector3f(x=0, y=1, z=0)
|
||||
YAW_ANGLE_DIR = LVector3f(x=0, y=0, z=-1)
|
||||
YAW_ANGLE_REF = LVector3f(x=0, y=1, z=0)
|
||||
YAW_LOOK_AHEAD = 4
|
||||
|
||||
running = True
|
||||
|
@ -684,7 +720,6 @@ last_mod_time = get_mod_time()
|
|||
s = dict()
|
||||
|
||||
|
||||
pitch = 0
|
||||
|
||||
|
||||
|
||||
|
@ -700,7 +735,7 @@ def tick(connection, player_info):
|
|||
|
||||
p = player_info.pos
|
||||
|
||||
if len(s['path']):
|
||||
if s['path'] and len(s['path']):
|
||||
target = LPoint3f(s['path'][0])
|
||||
target.x += 0.5
|
||||
target.z += 0.5
|
||||
|
@ -710,7 +745,7 @@ def tick(connection, player_info):
|
|||
|
||||
# jump up block
|
||||
if d.y < -0.9 and not s['y_v']:
|
||||
s['y_v'] = 10.0
|
||||
s['y_v'] = 8.5
|
||||
s['y_a'] = -36.0
|
||||
|
||||
# jump gap
|
||||
|
@ -729,7 +764,7 @@ def tick(connection, player_info):
|
|||
p.y += s['y_v'] * TICK
|
||||
s['y_v'] += s['y_a'] * TICK
|
||||
|
||||
if player_info.chunks.get_block_at(int(p.x), ceil(p.y-1), int(p.z)) not in blocks.NON_SOLID_IDS:
|
||||
if player_info.chunks.get_block_at(floor(p.x), ceil(p.y-1), floor(p.z)) not in blocks.NON_SOLID_IDS:
|
||||
p.y = ceil(p.y)
|
||||
s['y_v'] = 0
|
||||
s['y_a'] = 0
|
||||
|
@ -739,9 +774,9 @@ def tick(connection, player_info):
|
|||
|
||||
if s['look_at']:
|
||||
look_at = LPoint3f(s['look_at'])
|
||||
elif len(s['path']) > YAW_LOOK_AHEAD:
|
||||
elif s['path'] and len(s['path']) > YAW_LOOK_AHEAD:
|
||||
look_at = LPoint3f(s['path'][YAW_LOOK_AHEAD])
|
||||
elif len(s['path']):
|
||||
elif s['path'] and len(s['path']):
|
||||
look_at = LPoint3f(s['path'][-1])
|
||||
else:
|
||||
look_at = None
|
||||
|
@ -752,11 +787,19 @@ def tick(connection, player_info):
|
|||
look_at_d = p - look_at
|
||||
|
||||
if look_at_d.length() > 0.6:
|
||||
target_yaw = look_at_d.normalized().signedAngleDeg(other=ANGLE_DIR, ref=ANGLE_REF)
|
||||
target_yaw = look_at_d.normalized().signedAngleDeg(other=YAW_ANGLE_DIR, ref=YAW_ANGLE_REF)
|
||||
target_yaw_d = target_yaw - s['yaw']
|
||||
target_yaw_d = (target_yaw_d + 180) % 360 - 180
|
||||
s['yaw'] += cap(target_yaw_d, 30)
|
||||
|
||||
target_pitch = look_at_d.normalized().angleDeg(PITCH_ANGLE_DIR)
|
||||
target_pitch = (target_pitch - 90) * -1
|
||||
target_pitch_d = target_pitch - s['pitch']
|
||||
s['pitch'] += cap(target_pitch_d, 10)
|
||||
else:
|
||||
target_pitch_d = 0 - s['pitch']
|
||||
s['pitch'] += cap(target_pitch_d, 10)
|
||||
|
||||
|
||||
|
||||
packet = serverbound.play.PositionAndLookPacket(x=p.x, feet_y=p.y, z=p.z, pitch=s['pitch'], yaw=s['yaw'], on_ground=True)
|
||||
|
@ -771,10 +814,17 @@ def tick(connection, player_info):
|
|||
packet.hand = packet.HAND_MAIN
|
||||
connection.write_packet(packet)
|
||||
|
||||
#print(s['break_time'])
|
||||
s['break_time'] -= TICK
|
||||
elif s['break_finished_packet']:
|
||||
print('break finished')
|
||||
connection.write_packet(s['break_finished_packet'])
|
||||
s['break_finished_packet'] = None
|
||||
elif s['break_timeout'] > 0:
|
||||
s['break_timeout'] -= TICK
|
||||
|
||||
if s['break_timeout'] < 0:
|
||||
s['break_timeout'] = 0
|
||||
|
||||
|
||||
|
||||
|
@ -791,6 +841,7 @@ def init(connection, player_info):
|
|||
|
||||
s['break'] = None
|
||||
s['break_time'] = 0
|
||||
s['break_timeout'] = 0
|
||||
s['break_finished_packet'] = None
|
||||
|
||||
s['jobstate'] = JobStates(player_info)
|
||||
|
@ -828,6 +879,7 @@ def main(connection, player_info):
|
|||
solution = list(solution)
|
||||
s['path'] = solution
|
||||
print(len(solution))
|
||||
print(solution)
|
||||
print(round(time.time() - start, 3), 'seconds')
|
||||
else:
|
||||
packet = serverbound.play.ChatPacket()
|
||||
|
@ -964,7 +1016,13 @@ def main(connection, player_info):
|
|||
|
||||
while running:
|
||||
tick(connection, player_info)
|
||||
time.sleep(TICK)
|
||||
|
||||
global last_tick
|
||||
sleep_time = TICK + last_tick - time.time()
|
||||
if sleep_time < 0: sleep_time = 0
|
||||
|
||||
time.sleep(sleep_time)
|
||||
last_tick = time.time()
|
||||
|
||||
if get_mod_time() != last_mod_time:
|
||||
break
|
||||
|
|
Loading…
Reference in New Issue
Block a user