本站文本內容除另有聲明外,轉載時均必須註明出處。(詳情…)本站文本內容除另有聲明外,轉載時均必須註明出處。(詳情…)中文Minecraft Wiki是完全公開的。請勇於擴充與修正內容!中文Minecraft Wiki是完全公開的。請勇於擴充與修正內容!Minecraft中文Wiki微博正在更新!或許有興趣去看看?Minecraft中文Wiki微博正在更新!或許有興趣去看看?想與其他用戶進行編輯上的溝通?社區專頁正是為此創建的。想與其他用戶進行編輯上的溝通?社區專頁正是為此創建的。翻譯或創建頁面之前,不妨看看譯名標準化與Wiki條例頁面。翻譯或創建頁面之前,不妨看看譯名標準化與Wiki條例頁面。需要管理員的協助?在管理員告示板留言也許可以幫到您。需要管理員的協助?在管理員告示板留言也許可以幫到您。
各位用戶:為了讓我們能更好了解您的需求,提供更優良的服務,請幫助我們填寫一份問卷。編者問卷、讀者問卷(需要花費7分鐘左右)
Classic伺服器協議
該頁面的內容不受Mojang AB、Minecraft Wiki與Minecraft論壇的官方支持。 |
此特性為Java版獨有。 |
此頁面在英文Wiki中被建議拆分。 討論 原因:在這個過時的伺服器協議頁面中,過時和未過時的內容被混合在了一起。註:這是「Classic」協議,而不是「當前」。
注意: 中文Wiki的拆分頁面需要在討論批准後進行。 |
此條目的(部分)內容需要被翻譯。 你可以幫助我們來翻譯此條目,但請勿使用機器翻譯。
|
這是有關Minecraft Classic創造伺服器使用的伺服器協議的文檔
目錄
Minecraft.net交流[編輯 | 編輯原始碼]
心跳[編輯 | 編輯原始碼]
為了能從伺服器列表連接到Minecraft Classic中的伺服器,伺服器必須每隔幾分鐘向minecraft.net廣播一個所謂的「心跳」。
庫存伺服器會每隔45秒廣播一次心跳。
「心跳」使用了對https://minecraft.net/heartbeat.jsp發送HTTP請求的形式。發送心跳後,將返回伺服器的URL。
成功心跳的關鍵是你應該在HTTP請求中省略「www」,因為你要將它定位為URI,而不是URL。
它可以是GET或POST請求。下面表格是所需要的參數:
Name | Details |
---|---|
port | 伺服器的端口號,通常為25565 |
max | 伺服器上的最大玩家數量 |
name | 伺服器的名稱 |
public | Whether the server is public (i.e. appears in the lobby) or not. Can be True or False, in that capitalization. |
version | Minecraft version, this should be 7 |
salt | A random, 16-character base-62 salt |
users | Number of users connected to the server |
The simplest way to send a heartbeat is to open a TCP socket to port 80 on minecraft.net, and send the following (with the values changed, obviously):
GET /heartbeat.jsp?port=25565&max=32&name=My%20Server&public=True&version=7&salt=wo6kVAHjxoJcInKx&users=0, plus a CRLF(Carriage-return and Line feed).
Make sure any strings, like name, are escaped.
If everything goes well, in the response body you'll receive a URL to the server. Otherwise you'll get a nice HTML error message. There aren't any HTML headers to parse, as the HTTP version is not specified so HTTP/0.9 is used, which does not have headers.
用戶認證[編輯 | 編輯原始碼]
The "key" provided when a user joins the server can be compared to the MD5 checksum of the server's "salt" plus the username to verify that the user is logged in to minecraft.net with that username. This is useful for establishing enough trust of the name provided to ban or op the player by name.
if( player.key == md5( server.salt + player.name ) ) { // player is logged in via minecraft.net } else { // player is forging the username }
This is also the way that Notch prevents "cracked," or pirated, clients from accessing online servers. When a cracked client tries to connect to an online server, an error will come up at the connection screen saying, "Failed to Connect: User Not Premium"
Note: This means that you should make sure your "salt" is kept a secret and shared only with heartbeat.jsp. If your server's "salt" is visible anywhere to users, it is trivial for users to produce valid-looking "key"s without being logged in to minecraft.net.
資料包協議[編輯 | 編輯原始碼]
Every packet starts with a byte representing the Packet ID.
協議數據類型[編輯 | 編輯原始碼]
Type | Size [bytes] | Description |
---|---|---|
Byte | 1 | Single byte integer (0 to 255) |
SByte | 1 | Single byte signed integer (-128 to 127) |
Short | 2 | Signed integer, network order (-32768 to 32767) |
String | 64 | US-ASCII/ISO646-US encoded string padded with spaces (0x20) |
Byte array | 1024 | Binary data padded with null bytes (0x00) |
客戶端→服務端資料包[編輯 | 編輯原始碼]
Packet ID | Purpose | Field Description | Field Type | Notes |
---|---|---|---|---|
0x00 | Player Identification | Packet ID | Byte | Sent by a player joining a server with relevant information. Current protocol version is 0x07. |
Protocol version | Byte | |||
Username | String | |||
Verification key | String | |||
Unused | Byte | |||
0x05 | Set Block | Packet ID | Byte | Sent when a user changes a block. The mode field indicates whether a block was created (0x01) or destroyed (0x00).
Block type is always the type player is holding, (even when deleting). Client assumes that this command packet always succeeds, and so draws the new block immediately. To disallow block creation, server must send back Set Block packet with the old block type. The XYZ coordinates of the block are just integers representing the coordinate of the block. (As opposed to player coordinates where the lower 5 bits are fractional coordinates) |
X | Short | |||
Y | Short | |||
Z | Short | |||
Mode | Byte | |||
Block type | Byte | |||
0x08 | Position and Orientation | Packet ID | Byte | Sent frequently (even while not moving) by the player with the player's current location and orientation. Player ID is always 255, referring to itself. Player coordinates are fixed-point values with the lowest 5 bits representing the fractional position (i.e. divide by 32 to get actual position in terms of block coordinates). The angle parameters are scaled such that a value of 256 would correspond to 360 degrees. |
Player ID | Byte | |||
X | Short | |||
Y | Short | |||
Z | Short | |||
Yaw (Heading) | Byte | |||
Pitch | Byte | |||
0x0d | Message | Packet ID | Byte | Contain chat messages sent by player. |
Unused, maybe message color | Byte (0xFF) | |||
Message | String |
服務端→客戶端資料包[編輯 | 編輯原始碼]
Packet ID | Purpose | Field Description | Field Type | Notes |
---|---|---|---|---|
0x00 | Server Identification | Packet ID | Byte | Response to a joining player. The user type indicates whether a player is an op (0x64) or not (0x00) Current protocol version is 0x07. |
Protocol version | Byte | |||
Server name | String | |||
Server MOTD | String | |||
User type | Byte | |||
0x01 | Ping | Packet ID | Byte | Sent to clients periodically. The only way a client can disconnect at the moment is to force it closed, which does not let the server know. The ping packet is used to determine if the connection is still open. |
0x02 | Level Initialize | Packet ID | Byte | Notifies player of incoming level data. |
0x03 | Level Data Chunk | Packet ID | Byte | Contains a chunk of gzipped map (not level.dat file). After decompression the map consists of an int(4 bytes) containing number of blocks + raw map array. (chunk is up to 1024 bytes, padded with 0x00s if less). |
Chunk Length | Short | |||
Chunk Data | Byte Array | |||
Percent Complete | Byte | |||
0x04 | Level Finalize | Packet ID | Byte | Sent after level data is complete and gives map dimensions. The y coordinate is how tall the map is. |
X Size | Short | |||
Y Size | Short | |||
Z Size | Short | |||
0x06 | Set Block | Packet ID | Byte | Sent to indicate a block change by physics or by players. In the case of a player change, the server will also echo the block change back to the player who initiated it. |
X | Short | |||
Y | Short | |||
Z | Short | |||
Block Type | Byte | |||
0x07 | Spawn Player | Packet ID | Byte | Sent to indicate where a new player is spawning in the world. Position and orientation are encoded the same as for packet 0x08 below. |
Player ID | SByte | |||
Player Name | String | |||
X | Short | |||
Y | Short | |||
Z | Short | |||
Yaw (Heading) | Byte | |||
Pitch | Byte | |||
0x08 | Position and Orientation (Player Teleport) | Packet ID | Byte | Sent with changes in player position and rotation. Teleports player it's sent to if player ID < 0 (For sending initial position in map, and /tp) |
Player ID | SByte | |||
X | Short | |||
Y | Short | |||
Z | Short | |||
Yaw (Heading) | Byte | |||
Pitch | Byte | |||
0x09 | Position and Orientation Update | Packet ID | Byte | Sent with changes in player position and rotation. Sent when both position and orientation is changed at the same time.
Not required for server operation. |
Player ID | SByte | |||
Change in X | SByte | |||
Change in Y | SByte | |||
Change in Z | SByte | |||
Yaw (Heading) | Byte | |||
Pitch | Byte | |||
0x0a | Position Update | Packet ID | Byte | Sent with changes in player position.
Not required for server operation. |
Player ID | SByte | |||
Change in X | SByte | |||
Change in Y | SByte | |||
Change in Z | SByte | |||
0x0b | Orientation Update | Packet ID | Byte | Sent with changes in player rotation.
Not required for server operation. |
Player ID | SByte | |||
Yaw (Heading) | Byte | |||
Pitch | Byte | |||
0x0c | Despawn Player | Packet ID | Byte | Sent when player disconnects. |
Player ID | SByte | |||
0x0d | Message | Packet ID | Byte | Messages sent by chat or from the console. |
Player ID | SByte | |||
Message | String | |||
0x0e | Disconnect player | Packet ID | Byte | Sent to a player when they're disconnected from the server.
|
Disconnect reason | String | |||
0x0f | Update user type | Packet ID | Byte | Sent when a player is opped/deopped
Will give or remove the client's ability of breaking Bedrock blocks
|
User type | Byte |
玩家位置[編輯 | 編輯原始碼]
固定點[編輯 | 編輯原始碼]
Player position is represented via X, Y, and Z fixed-point coordinates. The fractional portion is 5 bits, so dividing the short integers received in position update packets by 32, you will have floating point coordinates for the player. This position corresponds to the center of the client viewport.
站在東西上[編輯 | 編輯原始碼]
The bottom of the player's feet is located 1.59375 (fixed-point: 51) units below the center of the viewport, so to position the player on top of a particular block you could send a teleport (0x08) packet specifying a Y value based on the block position as: (Y x 32 + 51)
朝向[編輯 | 編輯原始碼]
A yaw value of 0 means the player is facing in the Z- (negative Z) direction. This value increases in a clockwise direction as seen from above. If we call the negative Z direction "North", then a yaw of 64 means "East", 128 means "South", and 192 means "West".
A pitch value of 0 means level and this value increases in a downward direction. 64 is down, and 192 is up. Values of 65 to 191 should never occur because the player cannot look further up or down than the 64 → 0, 255 → 192 range. However, the Minecraft Classic client does not ignore invalid values, so it is possible to make players' heads "upside-down".
顏色代碼[編輯 | 編輯原始碼]
Messages sent from the server to the client can contain color codes, which allow coloring of text for various purposes.
An ampersand symbol (&) followed by a hex digit in the message tells the client to switch colors while displaying text. The current version of the game uses a section (§) symbol, but the 0.30 version uses ampersands. For the formatting codes for the current version of the game, see Formatting codes.
Color coding at the start of the message will only work if the player ID byte is less than 127. If it's 127 or higher, the game automatically adds &e before the message, making it yellow. However, color codes after the first character still work. If you use an ID below 127, it doesn't add a color code, so the ones you use will work.
Sample | Code | Common Name | Alternate Name | Foreground Color | Background Color | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
R | G | B | HEX | R | G | B | HEX | ||||
&0 | Black | Black | 0 | 0 | 0 | #000 | 0 | 0 | 0 | #000000 | |
&1 | Dark Blue | Navy | 0 | 0 | 170 | #00A | 0 | 0 | 42 | #00002A | |
&2 | Dark Green | Green | 0 | 170 | 0 | #0A0 | 0 | 42 | 0 | #002A00 | |
&3 | Teal | Teal | 0 | 170 | 170 | #0AA | 0 | 42 | 42 | #002A2A | |
&4 | Dark Red | Maroon | 170 | 0 | 0 | #A00 | 42 | 0 | 0 | #2A0000 | |
&5 | Purple | Purple | 170 | 0 | 170 | #A0A | 42 | 0 | 42 | #2A002A | |
&6 | Dark Yellow | Gold | 170 | 170 | 0 | #AA0 | 42 | 42 | 0 | #2A2A00 | |
&7 | Gray | Silver | 170 | 170 | 170 | #AAA | 42 | 42 | 42 | #2A2A2A | |
&8 | Dark Gray | Gray | 85 | 85 | 85 | #555 | 21 | 21 | 21 | #151515 | |
&9 | Indigo | Blue | 85 | 85 | 255 | #55F | 21 | 21 | 63 | #15153F | |
&a | Bright Green | Lime | 85 | 255 | 85 | #5F5 | 21 | 63 | 21 | #153F15 | |
&b | Cyan | Aqua | 85 | 255 | 255 | #5FF | 21 | 63 | 63 | #153F3F | |
&c | Red | Red | 255 | 85 | 85 | #F55 | 63 | 21 | 21 | #3F1515 | |
&d | Pink | Pink | 255 | 85 | 255 | #F5F | 63 | 21 | 63 | #3F153F | |
&e | Yellow | Yellow | 255 | 255 | 85 | #FF5 | 63 | 63 | 21 | #3F3F15 | |
&f | White | White | 255 | 255 | 255 | #FFF | 63 | 63 | 63 | #3F3F3F |
版本 |
| ||||
---|---|---|---|---|---|
開發周期 |
| ||||
技術 |
| ||||
多人遊戲 | |||||
遊戲訂製 |