マイクラ(Java版):パケットのデータの種類

2022-03-01Minecraft_Protocol

データの種類は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コマンドのことではありません
参考にしたサイト

名前タイプメモ
FlagByteフラグ
子(下の配列)の数VarInt下の配列の長さ
VarIntの配列子のNodeのインデクスがある
リダイレクトするノードオプションのVarIntFlag&0x08の時のみ
名前オプションのString (32767)argumentノードとliteralノードにしかない
ParserオプションのIdentifierargumentノードにしかない
PropertiesParserによるargumentノードにしかなく、Parserの中身によって中身が違う
提案タイプオプションのIdentifierFlag&0x10の時のみ
Nodeのフォーマット
wiki.vgを一部改変
Bit mask名前メモ
0x03ノードのタイプ0: root, 1: literal, 2: argument. 3 は使わない
0x04実行可能かこの時点で実行可能か
0x08リダイレクトするかほかのノードにリダイレクトするか
0x10提案タイプがあるかargumentノードにしかない
Flagの中身
これも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パケットを送る必要があるみたいです

広告

2022-03-01Minecraft_Protocol

Posted by koufu193