0

私は、IT コースワークの小さな Minecraft 実装プロジェクトに取り組んでいます。より多くの機能などを可能にする「クラシック拡張プロトコル」を実装しています

私の問題ではなく、単なる質問です。パケットのパディング バイトを確認するにはどうすればよいでしょうか。(プレーヤーが標準クライアントから接続しているか、拡張クライアントから接続しているかを判断する必要があります)。乾杯。

4

1 に答える 1

0

FemtoCraftソースを使用して理解できます。クライアントに送信する ExtAddPlayerName パケットのコーディング例を次に示します。

public static Packet ExtAddPlayerName(short nameid, string name, string ListName, string group, byte perm)
        {
            Packet packet = new Packet(OpCode.ExtAddPlayerName);
            ToNetOrder(nameid, packet.Bytes, 1);
            Encoding.ASCII.GetBytes(name.PadRight(64), 0, 64, packet.Bytes, 3);
            Encoding.ASCII.GetBytes(ListName.PadRight(64), 0, 64, packet.Bytes, 67);
            Encoding.ASCII.GetBytes(group.PadRight(64), 0, 64, packet.Bytes, 131);
            packet.Bytes[132] = perm;
            return packet;
        }

internal static void ToNetOrder( short number, byte[] arr, int offset ) {
            arr[offset] = (byte)( ( number & 0xff00 ) >> 8 );
            arr[offset + 1] = (byte)( number & 0x00ff );
        }

マップのように、送信するバイトの正確な場所を設定します。このページで説明されているように、バイトの場所があり、設定するだけです。byte[] をクライアントに送信すると、新しいパケットを設定することにより、byte[0] がパケットを決定します yourpack = new Packet(PacketName) あなたの byte[0] は、fCraft / femtocraft で自動的にパケット名を取得します。クライアントからのパケットの取得については、OpCode 変数を使用できます。

OpCode opcode = reader.ReadOpCode();
                        switch( opcode ) {

                            case OpCode.Message:
                                if( !ProcessMessagePacket() ) return;
                                break;
于 2013-11-01T12:41:46.860 に答える