import re import time import importlib import random from itertools import count from math import hypot, floor from minecraft.networking.types import BlockFace from protocol.managers import ChunkNotLoadedException import utils import path import blocks import items import mcdata import mobs class GatherCropStates: def idle(self): return None def init(self): self.state = self.find_new_crop def find_new_crop(self): print('Finding new crop...') w = self.g.world p = utils.pint(self.g.pos) mature_crops = [ blocks.MATURE_WHEAT_ID, blocks.MATURE_POTATO_ID, blocks.MATURE_CARROT_ID, blocks.MATURE_BEETROOT_ID, ] for crop in w.find_blocks_3d(p, mature_crops, 50, 20): print('Found crop:', crop) if crop not in self.bad_crops: break else: # for print('No good crops left, aborting.') self.state = self.cleanup return self.crop = crop self.type_id = w.block_at(*crop) self.state = self.nav_to_crop def nav_to_crop(self): w = self.g.world p = utils.pint(self.g.pos) navpath = w.path_to_place(p, self.crop) if navpath: self.g.path = navpath self.g.look_at = utils.padd(self.crop, path.BLOCK_BELOW) self.state = self.going_to_crop else: self.bad_crops.append(self.crop) 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_crop def going_to_crop(self): if utils.pint(self.g.pos) == self.crop: print('At the crop') self.state = self.break_crop def break_crop(self): self.g.game.break_block(self.crop) self.wait_time = 0.5 self.state = self.wait def wait(self): # wait for the item if self.wait_time > 0: self.wait_time -= utils.TICK else: self.state = self.select_seed def select_seed(self): p = utils.pint(self.g.pos) crop_seeds = { blocks.MATURE_WHEAT_ID: items.WHEAT_SEEDS_ID, blocks.MATURE_POTATO_ID: items.POTATO_ID, blocks.MATURE_CARROT_ID: items.CARROT_ID, blocks.MATURE_BEETROOT_ID: items.BEETROOT_SEEDS_ID, } if self.g.game.select_item([crop_seeds[self.type_id]]): self.state = self.wait_select self.wait_time = 0.5 else: print('Aborting planting, no crop') self.state = self.cleanup def wait_select(self): # wait a bit to select if self.wait_time > 0: self.wait_time -= utils.TICK else: self.state = self.place_crop def place_crop(self): p = utils.pint(self.g.pos) self.g.game.place_block(p, BlockFace.TOP) print('Placed crop') self.state = self.wait_place self.wait_time = 0.5 def wait_place(self): # wait a bit for chunk data to update if self.wait_time > 0: self.wait_time -= utils.TICK else: self.state = self.cleanup def cleanup(self): self.g.look_at = None self.state = self.done def done(self): # never gets ran, placeholder return None def __init__(self, global_state): self.g = global_state self.state = self.idle self.crop = None self.type_id = None self.bad_crops = [] self.wait_time = 0 def run(self): self.state()