def pack_chat(cls, msg: Chat) -> bytes: """Packs a Minecraft chat message into bytes.""" if isinstance(msg, Chat): return cls.pack_json(msg.msg) return cls.pack_json(Chat(msg).msg)
async def broadcast_player_info(player: Player) -> None: display_name = player.get("CustomName") if not player.get("CustomNameVisible"): display_name = None # Unsure whether these should broadcast to all clients or not # Also unsure whether they should include all player data or just that for the connecting player await server.broadcast_packet( packets.play.player.PlayPlayerInfo( 0, # the action, add player [ { "uuid": player.uuid, "name": player.name, "properties": player.props, "gamemode": player["playerGameType"], "ping": 0, "display_name": Chat(display_name), } ], ) ) # I don't know why latency isn't just updated in the first packet broadcasted, mc do be weird await server.broadcast_packet( packets.play.player.PlayPlayerInfo( 2, # the action, update latency [{"uuid": player.uuid, "ping": 0}], ) )
def encode(self) -> bytes: out = ( Buffer.pack_varint(self.map_id) + Buffer.pack("b", self.scale) + Buffer.pack("?", self.tracking_pos) + Buffer.pack("?", self.locked) + Buffer.pack_varint(len(self.icons)) ) for icon in self.icons: out += Buffer.pack_varint(icon["type"]) + Buffer.pack("b", icon["x"]) + Buffer.pack("b", icon["z"]) display_name = icon.get("display_name") if display_name is not None: out += Buffer.pack("?", True) + Buffer.pack_chat(Chat(display_name)) else: out += Buffer.pack("?", False) out += ( Buffer.pack("B", self.cols) + Buffer.pack_optional((lambda x: Buffer.pack("B", x)), self.rows) + Buffer.pack_optional((lambda x: Buffer.pack("b", x)), self.x) + Buffer.pack_optional((lambda z: Buffer.pack("b", z)), self.z) ) if self.data is not None: out += Buffer.pack("?", True) + Buffer.pack_varint(len(self.data)) + Buffer.pack("?", True) + self.data else: out += Buffer.pack("?", False) + Buffer.pack("?", False) return out
async def send_status(stream: Stream, packet: Packet) -> tuple: data = { "version": { "name": server.meta.version, "protocol": server.meta.protocol }, "players": { "max": server.conf["max_players"], "online": len(server.cache.states), "sample": [ { "name": "Iapetus11", "id": "cbcfa252-867d-4bda-a214-776c881cf370" }, { "name": "Sh_wayz", "id": "cbcfa252-867d-4bda-a214-776c881cf370" }, { "name": "emeralddragonmc", "id": "eb86dc19-c3f5-4aef-a50e-a4bf435a7528" }, ], }, "description": Chat(server.conf["motd"]).msg, # a Chat } if server.favicon: data["favicon"] = server.favicon await server.send_packet(stream, status_packets.StatusStatusResponse(data), -1)
def encode(self) -> bytes: out = Buffer.pack_varint(self.action) if 2 >= self.action >= 0: out += Buffer.pack_chat(Chat(self.data)) elif self.action == 3: out += b"".join([Buffer.pack("i", i) for i in self.data]) return out
def encode(self) -> bytes: out = Buffer.pack_string(self.team_name) + Buffer.pack("b", self.mode) if self.mode == 0: # create team out += (Buffer.pack_chat(Chat(self.data["team_display_name"])) + Buffer.pack("b", self.data["friendly_flags"]) + Buffer.pack_string(self.data["name_tag_visibility"]) + Buffer.pack_string(self.data["collision_rule"]) + Buffer.pack_varint(self.data["team_color"]) + Buffer.pack_chat(Chat(self.data["team_prefix"])) + Buffer.pack_chat(Chat(self.data["team_suffix"])) + Buffer.pack_varint(len(self.data["entities"])) + b"".join( [Buffer.pack_string(e) for e in self.data["entities"]])) elif self.mode == 2: # update team info out += (Buffer.pack_chat(Chat(self.data["team_display_name"])) + Buffer.pack("b", self.data["friendly_flags"]) + Buffer.pack_string(self.data["name_tag_visibility"]) + Buffer.pack_string(self.data["collision_rule"]) + Buffer.pack_varint(self.data["team_color"]) + Buffer.pack_chat(Chat(self.data["team_prefix"])) + Buffer.pack_chat(Chat(self.data["team_suffix"]))) elif self.mode == 3: # add entities to team out += Buffer.pack_varint(len(self.data["entities"])) + b"".join( [Buffer.pack_string(e) for e in self.data["entities"]]) elif self.mode == 4: # remove entities from team out += Buffer.pack_varint(len(self.data["entities"])) + b"".join( [Buffer.pack_string(e) for e in self.data["entities"]]) return out
def encode(self) -> bytes: out = (Buffer.pack_varint(self.id) + Buffer.pack_varint(self.start) + Buffer.pack_varint(self.length) + Buffer.pack_varint(len(self.matches))) for m in self.matches: out += Buffer.pack_string(m[0]) if len(m) > 1: out += Buffer.pack("?", True) + Buffer.pack_chat(Chat(m[1])) else: out += Buffer.pack("?", False) return out
async def send_status(stream: Stream, packet: Packet) -> tuple: data = { "version": { "name": server.meta.version, "protocol": server.meta.protocol }, "players": { "max": server.conf["max_players"], "online": len(server.playerio.cache), "sample": [{ "name": p.username, "id": str(p.uuid) } for p in server.playerio.cache.values()], }, "description": Chat(server.conf["motd"]).msg, # a Chat } if server.favicon: data["favicon"] = server.favicon await server.send_packet(stream, status_packets.StatusStatusResponse(data), -1)
def unpack_chat(self) -> Chat: """Unpacks a Minecraft chat message from the buffer.""" return Chat(self.unpack_json())
def encode(self) -> bytes: return Buffer.pack_chat(Chat(self.reason))
def encode(self) -> bytes: return (Buffer.pack_string(self.objective_name) + Buffer.pack("b", self.mode) + Buffer.pack_optional( Buffer.pack_chat, Chat(self.objective_value)) + Buffer.pack_optional(Buffer.pack_varint, self.type_))