Use built in BlockChangePacket and MultiBlockChangePacket

This commit is contained in:
Tanner Collin 2020-09-09 15:58:19 -06:00
parent 34dbe0e99e
commit e8998a0428
6 changed files with 38 additions and 123 deletions

27
bot.py
View File

@ -20,7 +20,7 @@ from minecraft.networking.connection import Connection
from minecraft.networking.packets import Packet, clientbound, serverbound from minecraft.networking.packets import Packet, clientbound, serverbound
from protocol.managers import DataManager, ChunksManager, ChatManager, ChunkNotLoadedException from protocol.managers import DataManager, ChunksManager, ChatManager, ChunkNotLoadedException
from protocol.packets import BlockChangePacket from protocol.packets import TimeUpdatePacket, SetSlotPacket
from bunch import Bunch from bunch import Bunch
from panda3d.core import LPoint3f, LVector3f from panda3d.core import LPoint3f, LVector3f
@ -185,18 +185,27 @@ def bot(global_state):
g.chunks.register(g.connection) g.chunks.register(g.connection)
h1 = packet_wrapper(packet_handlers.handle_join_game) def x(p):
g.connection.register_packet_listener(h1, clientbound.play.JoinGamePacket) print(p)
h2 = packet_wrapper(packet_handlers.handle_position_and_look) h = packet_wrapper(packet_handlers.handle_block_change)
g.connection.register_packet_listener(h2, clientbound.play.PlayerPositionAndLookPacket) g.connection.register_packet_listener(h, clientbound.play.BlockChangePacket)
h3 = packet_wrapper(packet_handlers.handle_block_change) h = packet_wrapper(packet_handlers.handle_join_game)
g.connection.register_packet_listener(h3, BlockChangePacket) g.connection.register_packet_listener(h, clientbound.play.JoinGamePacket)
h = packet_wrapper(packet_handlers.handle_position_and_look)
g.connection.register_packet_listener(h, clientbound.play.PlayerPositionAndLookPacket)
g.chat = ChatManager(g) g.chat = ChatManager(g)
h4 = packet_wrapper(packet_handlers.handle_chat) h = packet_wrapper(packet_handlers.handle_chat)
g.chat.set_handler(h4) g.chat.set_handler(h)
h = packet_wrapper(packet_handlers.handle_time_update)
g.connection.register_packet_listener(h, TimeUpdatePacket)
h = packet_wrapper(packet_handlers.handle_set_slot)
g.connection.register_packet_listener(h, SetSlotPacket)
try: try:
while not g.pos: while not g.pos:

View File

@ -18,6 +18,7 @@ g.local_state = False
g.connection = False g.connection = False
g.mcdata = False g.mcdata = False
g.pos = False g.pos = False
g.inv = {}
@app.route('/') @app.route('/')
def hello_world(): def hello_world():
@ -54,6 +55,7 @@ def main():
print('Locking...') print('Locking...')
while g.running: while g.running:
time.sleep(1) time.sleep(1)
importlib.reload(bot)
except KeyboardInterrupt: except KeyboardInterrupt:
observer.stop() observer.stop()
observer.join() observer.join()

View File

@ -8,8 +8,6 @@ def get_packets(old_get_packets):
# add any custom packets here # add any custom packets here
mc_packets.add(packets.ChunkDataPacket) mc_packets.add(packets.ChunkDataPacket)
mc_packets.add(packets.BlockChangePacket)
mc_packets.add(packets.MultiBlockChangePacket)
mc_packets.add(packets.AcknowledgePlayerDiggingPacket) mc_packets.add(packets.AcknowledgePlayerDiggingPacket)
mc_packets.add(packets.BlockBreakAnimationPacket) mc_packets.add(packets.BlockBreakAnimationPacket)
mc_packets.add(packets.SetSlotPacket) mc_packets.add(packets.SetSlotPacket)

View File

@ -97,3 +97,15 @@ def handle_chat(message, g):
if reply: if reply:
print(reply) print(reply)
g.chat.send(reply) g.chat.send(reply)
def handle_time_update(packet, g):
l = g.local_state
l.time = packet.time_of_day % 24000
def handle_set_slot(packet, g):
print(packet)
if packet.window_id == 0:
g.inv[packet.slot] = packet.slot_data

View File

@ -43,12 +43,13 @@ class ChunksManager:
def handle_block(self, block_packet): def handle_block(self, block_packet):
self.set_block_at(block_packet.location.x, block_packet.location.y, block_packet.location.z, block_packet.block_state_id) self.set_block_at(block_packet.location.x, block_packet.location.y, block_packet.location.z, block_packet.block_state_id)
#self.print_chunk(self.get_chunk(floor(block_packet.location.x/16), floor(block_packet.location.y/16), floor(block_packet.location.z/16)), block_packet.location.y%16)
#print('Block %s at %s'%(blocks_states[block_packet.block_state_id], block_packet.location))
def handle_multiblock(self, multiblock_packet): def handle_multiblock(self, multiblock_packet):
dx = 16 * multiblock_packet.chunk_section_pos.x
dy = 16 * multiblock_packet.chunk_section_pos.y
dz = 16 * multiblock_packet.chunk_section_pos.z
for b in multiblock_packet.records: for b in multiblock_packet.records:
self.handle_block(b) self.set_block_at(dx+b.x, dy+b.y, dz+b.z, b.block_state_id)
def handle_chunk(self, chunk_packet): def handle_chunk(self, chunk_packet):
for i in chunk_packet.chunks: for i in chunk_packet.chunks:
@ -56,8 +57,8 @@ class ChunksManager:
self.biomes[(chunk_packet.x, None, chunk_packet.z)] = chunk_packet.biomes # FIXME self.biomes[(chunk_packet.x, None, chunk_packet.z)] = chunk_packet.biomes # FIXME
def register(self, connection): def register(self, connection):
connection.register_packet_listener(self.handle_block, packets.BlockChangePacket) connection.register_packet_listener(self.handle_block, clientbound.play.BlockChangePacket)
connection.register_packet_listener(self.handle_multiblock, packets.MultiBlockChangePacket) connection.register_packet_listener(self.handle_multiblock, clientbound.play.MultiBlockChangePacket)
connection.register_packet_listener(self.handle_chunk, packets.ChunkDataPacket) connection.register_packet_listener(self.handle_chunk, packets.ChunkDataPacket)
def get_chunk(self, x, y, z): def get_chunk(self, x, y, z):

View File

@ -10,113 +10,6 @@ from minecraft.networking.types import (
from protocol.types import Nbt, Slot from protocol.types import Nbt, Slot
class BlockChangePacket(Packet):
id = 0x0B
packet_name = 'block change'
definition = [
{'location': Position},
{'block_state_id': VarInt}]
block_state_id = 0
# For protocols < 347: an accessor for (block_state_id >> 4).
@property
def blockId(self):
return self.block_state_id >> 4
@blockId.setter
def blockId(self, block_id):
self.block_state_id = (self.block_state_id & 0xF) | (block_id << 4)
# For protocols < 347: an accessor for (block_state_id & 0xF).
@property
def blockMeta(self):
return self.block_state_id & 0xF
@blockMeta.setter
def blockMeta(self, meta):
self.block_state_id = (self.block_state_id & ~0xF) | (meta & 0xF)
# This alias is retained for backward compatibility.
blockStateId = attribute_alias('block_state_id')
class MultiBlockChangePacket(Packet):
id = 0x3B
packet_name = 'multi block change'
fields = 'chunk_x', 'chunk_z', 'records'
# Access the 'chunk_x' and 'chunk_z' fields as a tuple.
chunk_pos = multi_attribute_alias(tuple, 'chunk_x', 'chunk_z')
class Record(MutableRecord):
__slots__ = 'x', 'y', 'z', 'block_state_id', 'location'
def __init__(self, **kwds):
self.block_state_id = 0
super(MultiBlockChangePacket.Record, self).__init__(**kwds)
# Access the 'x', 'y', 'z' fields as a Vector of ints.
position = multi_attribute_alias(Vector, 'x', 'y', 'z')
# For protocols < 347: an accessor for (block_state_id >> 4).
@property
def blockId(self):
return self.block_state_id >> 4
@blockId.setter
def blockId(self, block_id):
self.block_state_id = self.block_state_id & 0xF | block_id << 4
# For protocols < 347: an accessor for (block_state_id & 0xF).
@property
def blockMeta(self):
return self.block_state_id & 0xF
@blockMeta.setter
def blockMeta(self, meta):
self.block_state_id = self.block_state_id & ~0xF | meta & 0xF
# This alias is retained for backward compatibility.
blockStateId = attribute_alias('block_state_id')
def read(self, file_object, parent):
data = VarLong.read(file_object)
self.block_state_id = int(data >> 12)
self.x = int(data >> 8 & 0xf)
self.z = int(data >> 4 & 0xf)
self.y = int(data & 0xf)
# Absolute position in world to be compatible with BlockChangePacket
self.location = Vector(self.position.x + parent.chunk_x*16, self.position.y, self.position.z + parent.chunk_z*16)
def write(self, packet_buffer):
raise
UnsignedByte.send(self.x << 4 | self.z & 0xF, packet_buffer)
UnsignedByte.send(self.y, packet_buffer)
VarInt.send(self.block_state_id, packet_buffer)
def read(self, file_object):
coords = Long.read(file_object)
self.chunk_x = int(coords >> 42 & 0x3fffff)
self.chunk_z = int(coords >> 20 & 0x3fffff)
self.chunk_y = int(coords & 0xfffff)
self.unknown = Boolean.read(file_object)
array_size = VarInt.read(file_object)
self.records = []
for i in range(array_size):
record = self.Record()
record.read(file_object, self)
self.records.append(record)
def write_fields(self, packet_buffer):
raise
Integer.send(self.chunk_x, packet_buffer)
Integer.send(self.chunk_z, packet_buffer)
VarInt.send(len(self.records), packet_buffer)
for record in self.records:
record.write(packet_buffer)
class ChunkDataPacket(Packet): class ChunkDataPacket(Packet):
id = 0x20 id = 0x20
packet_name = 'chunk data' packet_name = 'chunk data'