From 23891066c00e36f441fd69e865c280d19353ae5c Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Fri, 23 Apr 2021 01:25:44 +0000 Subject: [PATCH] Improve searching for crops --- mosfet/bot.py | 3 +- mosfet/jobs/gather_crop.py | 6 ++- mosfet/jobs/gather_wart.py | 14 ++++++- mosfet/utils.py | 75 +++++++++++++++----------------------- mosfet/world.py | 25 +++++++++++-- 5 files changed, 69 insertions(+), 54 deletions(-) diff --git a/mosfet/bot.py b/mosfet/bot.py index 2b77a85..ef58d39 100644 --- a/mosfet/bot.py +++ b/mosfet/bot.py @@ -26,7 +26,6 @@ from munch import Munch from mosfet import blocks from mosfet import game -from mosfet import world from mosfet import items from mosfet import job from mosfet import mcdata @@ -35,6 +34,7 @@ from mosfet import path from mosfet import print_help from mosfet import utils from mosfet import vector +from mosfet import world for module in [ blocks, @@ -47,6 +47,7 @@ for module in [ print_help, utils, vector, + world, ]: importlib.reload(module) diff --git a/mosfet/jobs/gather_crop.py b/mosfet/jobs/gather_crop.py index c643015..c0d3662 100644 --- a/mosfet/jobs/gather_crop.py +++ b/mosfet/jobs/gather_crop.py @@ -35,8 +35,7 @@ class GatherCropStates: blocks.MATURE_BEETROOT_ID, ] - for crop in w.find_blocks_3d(p, mature_crops, 50, 20): - print('Found crop:', crop) + for crop in w.find_blocks_3d(p, mature_crops, 50, 20, True): if crop not in self.bad_crops: break else: # for @@ -44,6 +43,7 @@ class GatherCropStates: self.state = self.cleanup return + print('Found crop:', crop) self.crop = crop self.type_id = w.block_at(*crop) self.state = self.nav_to_crop @@ -55,10 +55,12 @@ class GatherCropStates: navpath = w.path_to_place(p, self.crop) if navpath: + print('Going to crop', self.crop) self.g.path = navpath self.g.look_at = utils.padd(self.crop, path.BLOCK_BELOW) self.state = self.going_to_crop else: + print('Cant get to it, blacklisting') self.bad_crops.append(self.crop) self.wait_time = 0.5 self.state = self.wait_to_restart diff --git a/mosfet/jobs/gather_wart.py b/mosfet/jobs/gather_wart.py index 827c18c..e552ec5 100644 --- a/mosfet/jobs/gather_wart.py +++ b/mosfet/jobs/gather_wart.py @@ -29,8 +29,7 @@ class GatherWartStates: p = utils.pint(self.g.pos) mature_wart = max(blocks.NETHERWART_IDS) - for wart in w.find_blocks_3d(p, [mature_wart], 50, 20): - print('Found wart:', wart) + for wart in w.find_blocks_3d(p, [mature_wart], 50, 20, True): if wart not in self.bad_warts: break else: # for @@ -38,6 +37,7 @@ class GatherWartStates: self.state = self.cleanup return + print('Found wart:', wart) self.wart = wart self.state = self.nav_to_wart @@ -48,11 +48,21 @@ class GatherWartStates: navpath = w.path_to_place(p, self.wart) if navpath: + print('Going to wart', self.crop) self.g.path = navpath self.g.look_at = utils.padd(self.wart, path.BLOCK_BELOW) self.state = self.going_to_wart else: + print('Cant get to it, blacklisting') self.bad_warts.append(wart) + self.wait_time = 0.5 + self.state = self.wait_to_restart + + def wait_to_restart(self): + # prevent timeouts + if self.wait_time > 0: + self.wait_time -= utils.TICK + else: self.state = self.find_new_wart def going_to_wart(self): diff --git a/mosfet/utils.py b/mosfet/utils.py index 48e3130..ba04f87 100644 --- a/mosfet/utils.py +++ b/mosfet/utils.py @@ -133,49 +133,32 @@ def search_2d(distance=0): visited.add(cur) yield cur -def search_3d(distance=0, y_limit=0): - def get_neighbors(x,y,z): - return [ - (x+1, y+1, z+0), - (x+1, y-1, z+0), - (x+1, y+1, z+1), - (x+1, y+0, z+1), - (x+1, y-1, z+1), - (x+1, y+1, z-1), - (x+1, y+0, z-1), - (x+1, y-1, z-1), - (x+1, y+0, z+0), - (x+0, y+1, z+0), - (x+0, y-1, z+0), - (x+0, y+1, z+1), - (x+0, y+0, z+1), - (x+0, y-1, z+1), - (x+0, y+1, z-1), - (x+0, y+0, z-1), - (x+0, y-1, z-1), - (x-1, y+1, z+0), - (x-1, y-1, z+0), - (x-1, y+1, z+1), - (x-1, y+0, z+1), - (x-1, y-1, z+1), - (x-1, y+1, z-1), - (x-1, y+0, z-1), - (x-1, y-1, z-1), - (x-1, y+0, z+0), - ] - - to_visit = collections.deque([(0, 0, 0)]) - visited = set() - - while to_visit: - cur = to_visit.pop() - if cur in visited: - continue - if y_limit and abs(cur[1]) > y_limit: - continue - if distance and hypot(*cur) > distance: - continue - for neighbor in get_neighbors(*cur): - to_visit.appendleft(neighbor) - visited.add(cur) - yield cur +def get_neighbors_3d(x,y,z): + return [ + #(x+1, y+1, z+0), + #(x+1, y-1, z+0), + #(x+1, y+1, z+1), + #(x+1, y+0, z+1), + #(x+1, y-1, z+1), + #(x+1, y+1, z-1), + #(x+1, y+0, z-1), + #(x+1, y-1, z-1), + (x+1, y+0, z+0), + (x+0, y+1, z+0), + (x+0, y-1, z+0), + #(x+0, y+1, z+1), + (x+0, y+0, z+1), + #(x+0, y-1, z+1), + #(x+0, y+1, z-1), + (x+0, y+0, z-1), + #(x+0, y-1, z-1), + #(x-1, y+1, z+0), + #(x-1, y-1, z+0), + #(x-1, y+1, z+1), + #(x-1, y+0, z+1), + #(x-1, y-1, z+1), + #(x-1, y+1, z-1), + #(x-1, y+0, z-1), + #(x-1, y-1, z-1), + (x-1, y+0, z+0), + ] diff --git a/mosfet/world.py b/mosfet/world.py index 4612fb9..4db6ae8 100644 --- a/mosfet/world.py +++ b/mosfet/world.py @@ -1,3 +1,4 @@ +import collections import re import time import random @@ -24,9 +25,27 @@ class World: return False return True - def find_blocks_3d(self, center, block_ids, distance=0, y_limit=0): - for offset in utils.search_3d(distance, y_limit): - check = utils.padd(center, offset) + def find_blocks_3d(self, center, block_ids, distance=0, y_limit=0, thru_air=False): + to_visit = collections.deque([(0, 0, 0)]) + visited = set() + + while to_visit: + cur = to_visit.pop() + if cur in visited: + continue + if y_limit and abs(cur[1]) > y_limit: + continue + if distance and hypot(*cur) > distance: + continue + + check = utils.padd(center, cur) + + if not thru_air or self.block_at(*check) in blocks.NON_SOLID_IDS: + for neighbor in utils.get_neighbors_3d(*cur): + to_visit.appendleft(neighbor) + + visited.add(cur) + if self.block_at(*check) in block_ids: yield check