Port over job sleeping

This commit is contained in:
Tanner Collin 2020-09-16 20:11:42 -06:00
parent 58458a561f
commit f2e0b162f9
4 changed files with 85 additions and 19 deletions

43
game.py
View File

@ -8,7 +8,7 @@ from panda3d.core import LPoint3f
from minecraft.networking.packets import Packet, clientbound, serverbound from minecraft.networking.packets import Packet, clientbound, serverbound
from protocol.packets import TimeUpdatePacket, SetSlotPacket, PlayerDiggingPacket, BlockBreakAnimationPacket, AcknowledgePlayerDiggingPacket from protocol.packets import TimeUpdatePacket, SetSlotPacket, PlayerDiggingPacket, BlockBreakAnimationPacket, AcknowledgePlayerDiggingPacket, HeldItemChangePacket, PickItemPacket
import utils import utils
importlib.reload(utils) importlib.reload(utils)
@ -16,6 +16,8 @@ import path
importlib.reload(path) importlib.reload(path)
import blocks import blocks
importlib.reload(blocks) importlib.reload(blocks)
import items
importlib.reload(items)
class MCWorld: class MCWorld:
def __init__(self, global_state): def __init__(self, global_state):
@ -97,7 +99,7 @@ class MCWorld:
def find_bed_areas(self, center, distance): def find_bed_areas(self, center, distance):
air = [] air = []
for i in range(5): for i in range(5):
check = utils.padd(center, alternate(i, 1)) check = utils.padd(center, utils.alternate(i, 1))
air.extend(self.find_blocks(check, distance, [0], 200)) air.extend(self.find_blocks(check, distance, [0], 200))
areas = [] areas = []
@ -128,7 +130,7 @@ class MCWorld:
def find_sand(self, center, distance, origin): def find_sand(self, center, distance, origin):
sand = [] sand = []
for i in range(10): for i in range(10):
check = utils.padd(center, alternate(i, 1)) check = utils.padd(center, utils.alternate(i, 1))
sand.extend(self.find_blocks(check, distance, [66], 20)) sand.extend(self.find_blocks(check, distance, [66], 20))
safe_sand = [] safe_sand = []
@ -267,6 +269,22 @@ class Game:
self.g.job.state = self.g.job.lumberjack self.g.job.state = self.g.job.lumberjack
reply = 'ok' reply = 'ok'
if reply:
for i in self.g.inv.values():
print(i.item_id)
if i.item_id in items.BED_IDS:
break
else:
reply += ', I need a bed'
if command == 'inv':
for i in self.g.inv.values():
if i.present:
print(items.ITEM_NAMES[i.item_id], 'x', i.item_count)
if command == 'time':
reply = str(self.g.time)
if reply: if reply:
print(reply) print(reply)
self.g.chat.send(reply) self.g.chat.send(reply)
@ -316,7 +334,7 @@ class Game:
def place_block(self, location, face): def place_block(self, location, face):
packet = serverbound.play.PlayerBlockPlacementPacket() packet = serverbound.play.PlayerBlockPlacementPacket()
packet.hand = 0 packet.hand = 0
packet.location = pos packet.location = location
packet.face = face packet.face = face
packet.x = 0.5 packet.x = 0.5
packet.y = 0.5 packet.y = 0.5
@ -324,6 +342,23 @@ class Game:
packet.inside_block = False packet.inside_block = False
self.g.connection.write_packet(packet) self.g.connection.write_packet(packet)
def pick(self, slot):
packet = PickItemPacket()
packet.slot_to_use = slot
self.g.connection.write_packet(packet)
def hold(self, slot):
packet = HeldItemChangePacket()
packet.slot = slot
self.g.connection.write_packet(packet)
def choose_slot(self, slot):
if slot >= 36:
slot -= 36
self.hold(slot)
else:
self.pick(slot)
def tick(self): def tick(self):
if self.g.breaking: if self.g.breaking:
self.animate() self.animate()

31
items.py Normal file
View File

@ -0,0 +1,31 @@
import json
with open('mcdata/registries.json') as f:
ITEMS = json.load(f)['minecraft:item']['entries']
BEDS = [
'white_bed',
'orange_bed',
'magenta_bed',
'light_blue_bed',
'yellow_bed',
'lime_bed',
'pink_bed',
'gray_bed',
'light_gray_bed',
'cyan_bed',
'purple_bed',
'blue_bed',
'brown_bed',
'green_bed',
'red_bed',
'black_bed',
]
BED_IDS = set()
for item_name in BEDS:
BED_IDS.add(ITEMS['minecraft:'+item_name]['protocol_id'])
ITEM_NAMES = {}
for item_name, item in ITEMS.items():
ITEM_NAMES[ITEMS[item_name]['protocol_id']] = item_name.replace('minecraft:', '')

27
jobs.py
View File

@ -13,6 +13,8 @@ import path
importlib.reload(path) importlib.reload(path)
import blocks import blocks
importlib.reload(blocks) importlib.reload(blocks)
import items
importlib.reload(items)
class LumberjackStates: class LumberjackStates:
@ -310,22 +312,22 @@ class SleepWithBedStates:
if item.item_id in items.BED_IDS: if item.item_id in items.BED_IDS:
print('Found bed in slot', slot) print('Found bed in slot', slot)
self.g.look_at = utils.padd(self.area, path.BLOCK_BELOW) self.g.look_at = utils.padd(self.area, path.BLOCK_BELOW)
choose_slot(self.connection, slot) self.g.game.choose_slot(slot)
self.state = self.place_bed self.state = self.place_bed
break break
else: # for else: # for
say(self.connection, 'I need a bed') self.g.chat.send('I need a bed')
self.state = self.cleanup self.state = self.cleanup
def place_bed(self): def place_bed(self):
place_block(self.connection, self.area, BlockFace.TOP) self.g.game.place_block(self.area, BlockFace.TOP)
self.state = self.use_bed self.state = self.use_bed
def use_bed(self): def use_bed(self):
if self.g.time >= 12542: if self.g.time >= 12542:
print('Sleeping') print('Sleeping')
place_block(self.connection, self.area, BlockFace.TOP) self.g.game.place_block(self.area, BlockFace.TOP)
say(self.connection, 'zzz') self.g.chat.send('zzz')
self.state = self.sleep_bed self.state = self.sleep_bed
def sleep_bed(self): def sleep_bed(self):
@ -399,10 +401,9 @@ class JobStates:
s.state = s.init s.state = s.init
# check time, etc # check time, etc
if self.survive: self.prev_state = self.gather_sand
self.prev_state = self.gather_sand self.state = self.sleep_with_bed
self.state = self.sleep_with_bed return
return
s.run() s.run()
@ -414,10 +415,9 @@ class JobStates:
s.state = s.init s.state = s.init
# check time, etc # check time, etc
if self.survive: self.prev_state = self.lumberjack
self.prev_state = self.lumberjack self.state = self.sleep_with_bed
self.state = self.sleep_with_bed return
return
s.run() s.run()
@ -435,7 +435,6 @@ class JobStates:
self.lumberjack_states = LumberjackStates(self.g) self.lumberjack_states = LumberjackStates(self.g)
self.gather_sand_states = GatherSandStates(self.g) self.gather_sand_states = GatherSandStates(self.g)
self.sleep_with_bed_states = SleepWithBedStates(self.g) self.sleep_with_bed_states = SleepWithBedStates(self.g)
self.survive = False
def tick(self): def tick(self):
self.state() self.state()

View File

@ -68,7 +68,8 @@ def break_time(block_id, held_item=0, in_water=False, on_ground=True, enchantmen
data = blocks.get(block_id) data = blocks.get(block_id)
can_harvest = 'harvestTools' not in data or str(held_item) in data['harvestTools'] can_harvest = 'harvestTools' not in data or str(held_item) in data['harvestTools']
tool_multipliers = blocks.mcd.materials.get(data['material'], []) material = data.get('material', 'n/a')
tool_multipliers = blocks.mcd.materials.get(material, [])
is_best_tool = held_item in tool_multipliers is_best_tool = held_item in tool_multipliers
time = data['hardness'] time = data['hardness']