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.
108 lines
2.7 KiB
108 lines
2.7 KiB
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 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) |
|
|
|
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() |
|
|
|
|