import re import time import importlib import random from itertools import count from math import hypot, 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 CheckThreatsStates: def idle(self): return None def init(self): self.state = self.find_threats print('Checking for threats') def find_threats(self): w = self.g.world p = utils.pint(self.g.pos) threats = w.find_threats(p, 40) if threats: print('Found', len(threats), 'threats, fleeing:') print(threats) self.state = self.find_safety else: print('Aborting, no threats') self.state = self.cleanup def find_safety(self): w = self.g.world p = utils.pint(self.g.pos) safety = w.find_blocks_indexed(p, [blocks.EMERALD_BLOCK]) if not safety: print('No emerald blocks found, aborting') self.state = self.cleanup return safety.sort(key=lambda s: utils.phyp(p, s)) print('Found emerald blocks:', safety) for s in safety: s = utils.padd(s, path.BLOCK_ABOVE) navpath = w.path_to_place(p, s) if navpath: self.g.path = navpath self.state = self.going_to_safety self.safety = s print('Going to safety', self.safety) return else: print('Cant get to safety', self.safety) time.sleep(0.1) print('Cant get to safety, aborting') self.state = self.cleanup def going_to_safety(self): if utils.pint(self.g.pos) == self.safety: print('At safety spot, waiting to be moved') self.state = self.wait_for_move def wait_for_move(self): # wait for the server to move the bot when it's safe # ie. a piston + daylight sensor if utils.pint(self.g.pos) != self.safety: print('Moved, resuming job') self.state = self.wait self.wait_time = 3 def wait(self): # wait to land, etc 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.safety = None self.wait_time = 0 def run(self): self.state()