Fix jobstate bugs
This commit is contained in:
parent
c30ac5aefc
commit
58458a561f
7
bot.py
7
bot.py
|
@ -32,6 +32,8 @@ import utils
|
||||||
importlib.reload(utils)
|
importlib.reload(utils)
|
||||||
import path
|
import path
|
||||||
importlib.reload(path)
|
importlib.reload(path)
|
||||||
|
import jobs
|
||||||
|
importlib.reload(jobs)
|
||||||
|
|
||||||
last_tick = time.time()
|
last_tick = time.time()
|
||||||
|
|
||||||
|
@ -133,6 +135,7 @@ def tick(global_state):
|
||||||
g.connection.write_packet(packet, force=True)
|
g.connection.write_packet(packet, force=True)
|
||||||
|
|
||||||
g.game.tick()
|
g.game.tick()
|
||||||
|
g.job.tick()
|
||||||
|
|
||||||
|
|
||||||
def init(global_state):
|
def init(global_state):
|
||||||
|
@ -150,8 +153,7 @@ def init(global_state):
|
||||||
g.breaking = None
|
g.breaking = None
|
||||||
g.break_time = 0
|
g.break_time = 0
|
||||||
|
|
||||||
#g.jobstate = JobStates(connection, player_info)
|
g.job = jobs.JobStates(g)
|
||||||
#g.jobstate.run()
|
|
||||||
|
|
||||||
def bot(global_state):
|
def bot(global_state):
|
||||||
g = global_state
|
g = global_state
|
||||||
|
@ -191,6 +193,7 @@ def bot(global_state):
|
||||||
print('Chunks loaded.')
|
print('Chunks loaded.')
|
||||||
|
|
||||||
init(g)
|
init(g)
|
||||||
|
print('Initialized.')
|
||||||
|
|
||||||
while g.running:
|
while g.running:
|
||||||
tick(g)
|
tick(g)
|
||||||
|
|
30
game.py
30
game.py
|
@ -2,6 +2,7 @@ import re
|
||||||
import time
|
import time
|
||||||
import importlib
|
import importlib
|
||||||
from math import hypot
|
from math import hypot
|
||||||
|
from itertools import count
|
||||||
|
|
||||||
from panda3d.core import LPoint3f
|
from panda3d.core import LPoint3f
|
||||||
|
|
||||||
|
@ -40,7 +41,7 @@ class MCWorld:
|
||||||
def find_trees(self, center, distance):
|
def find_trees(self, center, distance):
|
||||||
logs = []
|
logs = []
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
check = utils.padd(center, alternate(i, 3))
|
check = utils.padd(center, utils.alternate(i, 3))
|
||||||
logs.extend(self.find_blocks(check, distance, blocks.LOG_IDS, 50))
|
logs.extend(self.find_blocks(check, distance, blocks.LOG_IDS, 50))
|
||||||
|
|
||||||
trees = []
|
trees = []
|
||||||
|
@ -66,26 +67,26 @@ class MCWorld:
|
||||||
log = utils.padd(log, path.BLOCK_BELOW)
|
log = utils.padd(log, path.BLOCK_BELOW)
|
||||||
trees.append(log)
|
trees.append(log)
|
||||||
|
|
||||||
trees.sort(key=lambda x: phyp(center, x))
|
trees.sort(key=lambda x: utils.phyp(center, x))
|
||||||
return trees
|
return trees
|
||||||
|
|
||||||
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 = MazeSolver(self.g.chunks)
|
maze_solver = path.Pathfinder(self.g.chunks)
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
# TODO: make sure only non-solid and leaves between
|
# TODO: make sure only non-solid and leaves between
|
||||||
# make sure traversable too
|
# make sure traversable too
|
||||||
|
|
||||||
for distance in range(5):
|
for distance in range(5):
|
||||||
for direction in CHECK_DIRECTIONS:
|
for direction in path.CHECK_DIRECTIONS:
|
||||||
offset = pmul(direction, distance+1)
|
offset = utils.pmul(direction, distance+1)
|
||||||
if maze_solver.check_traverse(tree, offset):
|
if maze_solver.check_traverse(tree, offset):
|
||||||
result.append(utils.padd(tree, offset))
|
result.append(utils.padd(tree, offset))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def path_to_place(self, start, place):
|
def path_to_place(self, start, place):
|
||||||
maze_solver = MazeSolver(self.g.chunks)
|
maze_solver = path.Pathfinder(self.g.chunks)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
s = maze_solver.astar(start, place)
|
s = maze_solver.astar(start, place)
|
||||||
|
@ -115,11 +116,11 @@ class MCWorld:
|
||||||
|
|
||||||
areas.append(a)
|
areas.append(a)
|
||||||
|
|
||||||
areas.sort(key=lambda x: phyp(center, x))
|
areas.sort(key=lambda x: utils.phyp(center, x))
|
||||||
return areas
|
return areas
|
||||||
|
|
||||||
def sand_adjacent_safe(self, sand):
|
def sand_adjacent_safe(self, sand):
|
||||||
for direction in CHECK_DIRECTIONS:
|
for direction in path.CHECK_DIRECTIONS:
|
||||||
if self.block_at(*utils.padd(sand, direction)) in blocks.AVOID_IDS:
|
if self.block_at(*utils.padd(sand, direction)) in blocks.AVOID_IDS:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
@ -155,7 +156,7 @@ class MCWorld:
|
||||||
# returns coords in a cardinal direction where we can stand by bed
|
# returns coords in a cardinal direction where we can stand by bed
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
for direction in CHECK_DIRECTIONS:
|
for direction in path.CHECK_DIRECTIONS:
|
||||||
result.append(utils.padd(area, direction))
|
result.append(utils.padd(area, direction))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@ -188,7 +189,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(g.goal))
|
solution = path.Pathfinder(self.g.chunks).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
|
||||||
|
@ -261,6 +262,11 @@ class Game:
|
||||||
self.break_block((616, 78, 496))
|
self.break_block((616, 78, 496))
|
||||||
reply = 'ok'
|
reply = 'ok'
|
||||||
|
|
||||||
|
if command == 'gather' and data:
|
||||||
|
if data == 'wood':
|
||||||
|
self.g.job.state = self.g.job.lumberjack
|
||||||
|
reply = 'ok'
|
||||||
|
|
||||||
if reply:
|
if reply:
|
||||||
print(reply)
|
print(reply)
|
||||||
self.g.chat.send(reply)
|
self.g.chat.send(reply)
|
||||||
|
@ -291,6 +297,7 @@ class Game:
|
||||||
packet.location = self.g.breaking
|
packet.location = self.g.breaking
|
||||||
packet.face = 1
|
packet.face = 1
|
||||||
self.g.connection.write_packet(packet)
|
self.g.connection.write_packet(packet)
|
||||||
|
self.g.chunks.set_block_at(*self.g.breaking, 0)
|
||||||
self.g.breaking = None
|
self.g.breaking = None
|
||||||
|
|
||||||
|
|
||||||
|
@ -298,7 +305,8 @@ class Game:
|
||||||
print(packet)
|
print(packet)
|
||||||
|
|
||||||
def handle_break_ack(self, packet):
|
def handle_break_ack(self, packet):
|
||||||
print(packet)
|
#print(packet)
|
||||||
|
return
|
||||||
|
|
||||||
def animate(self):
|
def animate(self):
|
||||||
packet = serverbound.play.AnimationPacket()
|
packet = serverbound.play.AnimationPacket()
|
||||||
|
|
46
jobs.py
46
jobs.py
|
@ -55,10 +55,10 @@ class LumberjackStates:
|
||||||
self.state = self.cleanup
|
self.state = self.cleanup
|
||||||
return
|
return
|
||||||
|
|
||||||
path = w.path_to_place(p, self.openings[0])
|
navpath = w.path_to_place(p, self.openings[0])
|
||||||
|
|
||||||
if path:
|
if navpath:
|
||||||
self.g.path = path
|
self.g.path = navpath
|
||||||
self.state = self.going_to_tree
|
self.state = self.going_to_tree
|
||||||
else:
|
else:
|
||||||
self.openings.pop(0)
|
self.openings.pop(0)
|
||||||
|
@ -71,10 +71,10 @@ class LumberjackStates:
|
||||||
def clear_leaves(self):
|
def clear_leaves(self):
|
||||||
if not self.g.breaking:
|
if not self.g.breaking:
|
||||||
p = utils.pint(self.g.pos)
|
p = utils.pint(self.g.pos)
|
||||||
diff = psub(self.tree, p)
|
diff = utils.psub(self.tree, p)
|
||||||
|
|
||||||
for x in diffrange(diff[0]):
|
for x in utils.diffrange(diff[0]):
|
||||||
for z in diffrange(diff[2]):
|
for z in utils.diffrange(diff[2]):
|
||||||
for y in range(2):
|
for y in range(2):
|
||||||
check = utils.padd(p, (x, y, z))
|
check = utils.padd(p, (x, y, z))
|
||||||
if check == self.tree:
|
if check == self.tree:
|
||||||
|
@ -100,10 +100,10 @@ class LumberjackStates:
|
||||||
else:
|
else:
|
||||||
w = self.g.world
|
w = self.g.world
|
||||||
p = utils.pint(self.g.pos)
|
p = utils.pint(self.g.pos)
|
||||||
path = w.path_to_place(p, self.tree)
|
navpath = w.path_to_place(p, self.tree)
|
||||||
|
|
||||||
if path:
|
if navpath:
|
||||||
self.g.path = path
|
self.g.path = navpath
|
||||||
self.state = self.going_to_trunk_base
|
self.state = self.going_to_trunk_base
|
||||||
else:
|
else:
|
||||||
self.openings.pop(0)
|
self.openings.pop(0)
|
||||||
|
@ -134,7 +134,7 @@ class LumberjackStates:
|
||||||
def wait(self):
|
def wait(self):
|
||||||
# wait for the last log to fall
|
# wait for the last log to fall
|
||||||
if self.wait_time > 0:
|
if self.wait_time > 0:
|
||||||
self.wait_time -= TICK
|
self.wait_time -= utils.TICK
|
||||||
else:
|
else:
|
||||||
self.state = self.cleanup
|
self.state = self.cleanup
|
||||||
|
|
||||||
|
@ -149,7 +149,6 @@ class LumberjackStates:
|
||||||
|
|
||||||
def __init__(self, global_state):
|
def __init__(self, global_state):
|
||||||
self.g = global_state
|
self.g = global_state
|
||||||
self.l = self.g.local_state
|
|
||||||
self.state = self.idle
|
self.state = self.idle
|
||||||
|
|
||||||
self.tree = None
|
self.tree = None
|
||||||
|
@ -193,11 +192,11 @@ class GatherSandStates:
|
||||||
p = utils.pint(self.g.pos)
|
p = utils.pint(self.g.pos)
|
||||||
|
|
||||||
w.chunks.set_block_at(*self.sand, 0)
|
w.chunks.set_block_at(*self.sand, 0)
|
||||||
path = w.path_to_place(p, self.sand)
|
navpath = w.path_to_place(p, self.sand)
|
||||||
w.chunks.set_block_at(*self.sand, 66)
|
w.chunks.set_block_at(*self.sand, 66)
|
||||||
|
|
||||||
if path:
|
if navpath:
|
||||||
self.g.path = path[:-1]
|
self.g.path = navpath[:-1]
|
||||||
self.state = self.going_to_sand
|
self.state = self.going_to_sand
|
||||||
else:
|
else:
|
||||||
self.bad_sand.append(self.sand)
|
self.bad_sand.append(self.sand)
|
||||||
|
@ -219,10 +218,10 @@ class GatherSandStates:
|
||||||
def get_sand(self):
|
def get_sand(self):
|
||||||
w = self.g.world
|
w = self.g.world
|
||||||
p = utils.pint(self.g.pos)
|
p = utils.pint(self.g.pos)
|
||||||
path = w.path_to_place(p, self.sand)
|
navpath = w.path_to_place(p, self.sand)
|
||||||
|
|
||||||
if path:
|
if navpath:
|
||||||
self.g.path = path
|
self.g.path = navpath
|
||||||
self.state = self.going_to_item
|
self.state = self.going_to_item
|
||||||
else:
|
else:
|
||||||
self.bad_sand.append(self.sand)
|
self.bad_sand.append(self.sand)
|
||||||
|
@ -244,7 +243,6 @@ class GatherSandStates:
|
||||||
|
|
||||||
def __init__(self, global_state):
|
def __init__(self, global_state):
|
||||||
self.g = global_state
|
self.g = global_state
|
||||||
self.l = self.g.local_state
|
|
||||||
self.state = self.idle
|
self.state = self.idle
|
||||||
|
|
||||||
self.origin = utils.pint(self.g.pos)
|
self.origin = utils.pint(self.g.pos)
|
||||||
|
@ -289,16 +287,16 @@ class SleepWithBedStates:
|
||||||
openings = w.find_bed_openings(self.area)
|
openings = w.find_bed_openings(self.area)
|
||||||
|
|
||||||
for o in openings:
|
for o in openings:
|
||||||
path = w.path_to_place(p, o)
|
navpath = w.path_to_place(p, o)
|
||||||
self.opening = o
|
self.opening = o
|
||||||
if path: break
|
if navpath: break
|
||||||
else: # for
|
else: # for
|
||||||
print('Unable to get to bed area', self.area)
|
print('Unable to get to bed area', self.area)
|
||||||
self.bad_areas.append(self.area)
|
self.bad_areas.append(self.area)
|
||||||
self.state = self.cleanup
|
self.state = self.cleanup
|
||||||
return
|
return
|
||||||
|
|
||||||
self.g.path = path
|
self.g.path = navpath
|
||||||
self.state = self.going_to_area
|
self.state = self.going_to_area
|
||||||
self.last_area = self.area
|
self.last_area = self.area
|
||||||
|
|
||||||
|
@ -348,7 +346,7 @@ class SleepWithBedStates:
|
||||||
def wait(self):
|
def wait(self):
|
||||||
# wait to pick up bed
|
# wait to pick up bed
|
||||||
if self.wait_time > 0:
|
if self.wait_time > 0:
|
||||||
self.wait_time -= TICK
|
self.wait_time -= utils.TICK
|
||||||
else:
|
else:
|
||||||
self.state = self.cleanup
|
self.state = self.cleanup
|
||||||
|
|
||||||
|
@ -362,7 +360,6 @@ class SleepWithBedStates:
|
||||||
|
|
||||||
def __init__(self, global_state):
|
def __init__(self, global_state):
|
||||||
self.g = global_state
|
self.g = global_state
|
||||||
self.l = self.g.local_state
|
|
||||||
self.state = self.idle
|
self.state = self.idle
|
||||||
|
|
||||||
self.area = None
|
self.area = None
|
||||||
|
@ -432,7 +429,6 @@ class JobStates:
|
||||||
|
|
||||||
def __init__(self, global_state):
|
def __init__(self, global_state):
|
||||||
self.g = global_state
|
self.g = global_state
|
||||||
self.l = self.g.local_state
|
|
||||||
|
|
||||||
self.state = self.idle
|
self.state = self.idle
|
||||||
self.prev_state = None
|
self.prev_state = None
|
||||||
|
@ -441,5 +437,5 @@ class JobStates:
|
||||||
self.sleep_with_bed_states = SleepWithBedStates(self.g)
|
self.sleep_with_bed_states = SleepWithBedStates(self.g)
|
||||||
self.survive = False
|
self.survive = False
|
||||||
|
|
||||||
def run(self):
|
def tick(self):
|
||||||
self.state()
|
self.state()
|
||||||
|
|
34
utils.py
34
utils.py
|
@ -1,5 +1,5 @@
|
||||||
import importlib
|
import importlib
|
||||||
from math import floor, ceil
|
from math import floor, ceil, sqrt, hypot
|
||||||
|
|
||||||
import blocks
|
import blocks
|
||||||
importlib.reload(blocks)
|
importlib.reload(blocks)
|
||||||
|
@ -31,6 +31,38 @@ def cap(x, amount):
|
||||||
sign = 1 if x >= 0 else -1
|
sign = 1 if x >= 0 else -1
|
||||||
return sign * min(abs(x), amount)
|
return sign * min(abs(x), amount)
|
||||||
|
|
||||||
|
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
|
||||||
|
m = t**2
|
||||||
|
t = t - 1
|
||||||
|
if n >= m-t:
|
||||||
|
return k-(m-n), 0, -k
|
||||||
|
else:
|
||||||
|
m = m-t
|
||||||
|
if n >= m-t:
|
||||||
|
return -k, 0, -k+(m-n)
|
||||||
|
else:
|
||||||
|
m = m-t
|
||||||
|
if n >= m-t:
|
||||||
|
return -k+(m-n), 0, k
|
||||||
|
else:
|
||||||
|
return k, 0, k-(m-n-t)
|
||||||
|
|
||||||
|
def alternate(n, amount):
|
||||||
|
# return 0, y, 0 where y alternates +/- by amount
|
||||||
|
# example: 0, 2, -2, 4, -4, 6, -6 for amount = 2
|
||||||
|
sign = 1 if n % 2 else -1
|
||||||
|
return (0, ceil(n/2) * sign * amount, 0)
|
||||||
|
|
||||||
|
def diffrange(n):
|
||||||
|
# same as range(n+1) but can go negative
|
||||||
|
sign = 1 if n >= 0 else -1
|
||||||
|
return range(0, n+sign, sign)
|
||||||
|
|
||||||
def break_time(block_id, held_item=0, in_water=False, on_ground=True, enchantments=[], effects={}):
|
def break_time(block_id, held_item=0, in_water=False, on_ground=True, enchantments=[], effects={}):
|
||||||
# from PrismarineJS/prismarine-block
|
# from PrismarineJS/prismarine-block
|
||||||
data = blocks.get(block_id)
|
data = blocks.get(block_id)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user