You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.4 KiB
131 lines
3.4 KiB
import re |
|
import time |
|
import importlib |
|
import random |
|
from itertools import count |
|
from math import floor |
|
|
|
from minecraft.networking.types import BlockFace |
|
|
|
from mosfet.protocol.managers import ChunkNotLoadedException |
|
|
|
from mosfet import utils |
|
from mosfet import path |
|
from mosfet.info import blocks |
|
from mosfet.info import items |
|
from mosfet.info import mcdata |
|
from mosfet.info 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, True): |
|
if crop not in self.bad_crops: |
|
break |
|
else: # for |
|
print('No good crops left, aborting.') |
|
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 |
|
|
|
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: |
|
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') |
|
time.sleep(0.1) |
|
self.bad_crops.append(self.crop) |
|
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.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, |
|
} |
|
self.target_seed = crop_seeds[self.type_id] |
|
|
|
if self.g.game.select_item([self.target_seed]): |
|
self.state = self.wait_select |
|
else: |
|
print('Havent picked up seed yet') |
|
return |
|
|
|
def wait_select(self): |
|
if self.target_seed != self.g.holding: |
|
return |
|
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 |
|
|
|
def wait_place(self): |
|
w = self.g.world |
|
if w.block_at(*self.crop) == blocks.AIR: |
|
return |
|
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.target_seed = None |
|
self.bad_crops = [] |
|
|
|
def run(self): |
|
self.state()
|
|
|