Port over job sleeping
This commit is contained in:
		
							
								
								
									
										43
									
								
								game.py
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								game.py
									
									
									
									
									
								
							@@ -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
									
								
							
							
						
						
									
										31
									
								
								items.py
									
									
									
									
									
										Normal 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:', '')
 | 
				
			||||||
							
								
								
									
										15
									
								
								jobs.py
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								jobs.py
									
									
									
									
									
								
							@@ -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,7 +401,6 @@ 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
 | 
				
			||||||
@@ -414,7 +415,6 @@ 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
 | 
				
			||||||
@@ -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()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								utils.py
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								utils.py
									
									
									
									
									
								
							@@ -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']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user