マイクラ(Java版):パケットのデータの種類
データの種類はhttps://wiki.vg/Protocol#Data_typesで
VarInt,VarLongのデータの読み書きは、そのサイトに書いてあります
特殊じゃない型(int,shortなど)はそのまま送ります
Boolean(真偽値)
true(真)は0x01
false(偽)は0x00
になる(byte)
String(文字列)
まずStringをbyteの配列(UTF-8として)に変換して
その配列の長さをVarIntで送って
その次にbyte配列を送る
UUID
128bit(符号なし)を送る
128bitを一気に送るのが難しいなら初めの64bit(符号なし)を送ってから最後の64bit(符号なし)を送る
NBT
Chat及びIdentifier(名前空間ID)
両方ともStringとして認識させる
Chatはjson
Identifier(名前空間ID)はminecraft:voidとか:で二つに分けるもの
minecraft:voidとかはvoidと書いてもいけるが(暗黙的にminecraftが名前空間になる(名前空間がminecraftの場合だけ省略はできる))
しかし、名前空間を省略するのは非推奨です
IdentifierはPlugin channelsとかでも使う
配列
長さがいくつかはどこかでわかっているはず(パケットのどこかに書いているか、すでに分かっている、パケットの長さから推測する必要が出てくるときもある)
配列の中身は配列の中身の型(例:Byte,Stringなど)と同じ読み方で読み込む(これを配列の長さぶん)
NodeまたはCommand Data
dataコマンドのことではありません
参考にしたサイト
名前 | タイプ | メモ |
---|---|---|
Flag | Byte | フラグ |
子(下の配列)の数 | VarInt | 下の配列の長さ |
子 | VarIntの配列 | 子のNodeのインデクスがある |
リダイレクトするノード | オプションのVarInt | Flag&0x08の時のみ |
名前 | オプションのString (32767) | argumentノードとliteralノードにしかない |
Parser | オプションのIdentifier | argumentノードにしかない |
Properties | Parserによる | argumentノードにしかなく、Parserの中身によって中身が違う |
提案タイプ | オプションのIdentifier | Flag&0x10の時のみ |
wiki.vgを一部改変
Bit mask | 名前 | メモ |
---|---|---|
0x03 | ノードのタイプ | 0: root , 1: literal , 2: argument . 3 は使わない |
0x04 | 実行可能か | この時点で実行可能か |
0x08 | リダイレクトするか | ほかのノードにリダイレクトするか |
0x10 | 提案タイプがあるか | argument ノードにしかない |
これもwiki.vgのを一部改変
Bit maskとは二進数や16進数上で特定の部分の値を取得したいときに使います
「Flagの中身」の「実行可能か」を例にすると
Flag&0x08の結果が0x08だったら実行可能です(&はビット演算のANDです)
Javaだと (Flag&0x08)==0x08です
提案タイプは
召喚可能なすべてのエンティティ(minecraft:summonable_entities)
利用可能なすべてのバイオーム(minecraft:available_biomes)
利用可能なすべてのレシピ(minecraft:all_recipes)
利用可能なすべてのサウンド(minecraft:available_sounds)
がありますが
“minecraft:ask_server"だけ特別でTab-Completeパケットを送る必要があるみたいです
ディスカッション
コメント一覧
まだ、コメントがありません