Example #1
0
    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)
Example #2
0
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}],
        )
    )
Example #3
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
Example #4
0
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)
Example #5
0
    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
Example #6
0
    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
Example #7
0
    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
Example #8
0
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)
Example #9
0
    def unpack_chat(self) -> Chat:
        """Unpacks a Minecraft chat message from the buffer."""

        return Chat(self.unpack_json())
Example #10
0
 def encode(self) -> bytes:
     return Buffer.pack_chat(Chat(self.reason))
Example #11
0
 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_))