https://wiki.vg/api.php?action=feedcontributions&user=727021&feedformat=atomwiki.vg - User contributions [en]2024-03-28T22:39:29ZUser contributionsMediaWiki 1.34.4https://wiki.vg/index.php?title=Classic_Protocol_Extension&diff=15299Classic Protocol Extension2020-02-13T20:20:13Z<p>727021: </p>
<hr />
<div>'''Classic Protocol Extension''' (CPE) is a project to augment the Minecraft Classic network protocol with new and improved functionality.<br />
<br />
Extensions are designed to keep extended clients and servers compatible with standard clients and servers. Standard clients and extended clients can play on the same server side-by-side. Extensions are designed to be modular: custom clients and servers can selectively implement any subset of extensions, and only mutually-supported extensions will be used.<br />
<br />
{| class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #f28500;background:#fbfbfb;width:80%;font-size:110%"<br />
|style="padding:10px"|'''This specification has not yet been finalized, and is subject to change.'''<br />
Last revision: 19 Nov 2017.<br />
Keep an eye on [[Classic Protocol Extension/History|the history subpage]] for a chronology of changes.<br />
|}<br />
{| class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #3dc238;background:#fbfbfb;width:80%;font-size:110%"<br />
|style="padding:10px"|'''Do you have an idea for an extension? Please post it on the [[Classic_Protocol_Extension/Proposals|Proposals]] subpage.'''<br />
|}<br />
<br />
==Support==<br />
:''See [[Classic Protocol Extension/Support|support subpage]] for a detailed table.''<br />
Custom servers that already support CPE: [http://femto.fcraft.net/ FemtoCraft], [http://umby.d3s.co/CCD3/ D3], [http://github.com/LeChosenOne/LegendCraft/ LegendCraft], [http://GemsCraftMC.weebly.com/ GemsCraft], [https://github.com/umby24/Hypercube Hypercube], [https://github.com/727021/MCSong MCSong]<br />
<br />
Custom servers that plan to add support: [http://800craft.net/ 800Craft], [http://github.com/tyteen4a03/cloudBox cloudBox], [http://www.fcraft.net/ fCraft], [https://github.com/GamezGalaxy/GGS/tree/Classic-Extension GGS]<br />
<br />
Custom clients that already support CPE: [http://classicube.net ClassiCube Client], [https://github.com/UnknownShadow200/ClassicalSharp/ ClassicalSharp]<br />
<br />
Custom clients that plan to add support: [http://charged-miners.com/ Charged Miners], [http://Client.GemsCraft.net/ GemsClient]<br />
<br />
==Negotiation==<br />
When CPE-capable client connects to a CPE-capable server, a brief negotiation needs to happen before any extensions are used. Client and server declare their capabilities and determine which extensions are mutually supported. '''All CPE-capable software is required to support this.'''<br />
<br />
[[File:CPE_Negotiation.png|frame|right]]<br />
'''Client behavior''': Extended clients must use magic number of <code>0x42</code> (<code>66</code> decimal) for the padding byte of the [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''PlayerIdentification''''']] packet. It must then await a response. If server responds with any packet other than '''''ExtInfo''''', client must assume that the server does NOT support CPE. If the server responds with an '''''ExtInfo''''' packet, client must parse it and any '''''ExtEntry''''' packets that follow. Client must then compare its locally-supported set of extensions with the list of extensions provided by the server, and find an intersection of these sets. These are the mutually-supported extensions. Client must now send '''''ExtInfo''''' packet of its own, followed by a list of zero or more client-supported extensions. After sending the last of '''''ExtEntry''''' packets, client should activate all mutually-supported extensions and resume normal login procedure.<br />
<br />
'''Server behavior''': When a client connects, server must read the [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''PlayerIdentification''''']] packet and check its padding byte. If this byte is set to <code>0x42</code> (<code>66</code> decimal), assume that the client supports CPE. If this byte is set to any other value, assume that the client does NOT support CPE.<br />
<br />
Server must immediately reply to CPE clients with an '''''ExtInfo''''' packet, followed by zero or more '''''ExtEntry''''' packets, and await a response from the client. Client will respond with one '''''ExtInfo''''' and zero or more '''''ExtEntry''''' packets. Server must then compare its locally-supported set of extensions with the list of extensions provided by the client, and find an intersection of these sets. These are the mutually-supported extensions. After receiving the last of '''''ExtEntry''''' packets, server should activate all mutually-supported extensions and resume normal login procedure. <br />
<br />
'''Note 1''': All standard/non-extended clients use <code>0x00</code> for the padding byte. All standard servers ignore this padding byte. Therefore, this negotiation process does not affect compatibility with standard software.<br />
<br />
'''Note 2''': Do not make any assumptions about supported functionality based on the ''AppName'' field of '''''ExtInfo''''' packet. It's for logging purposes only.<br />
<br />
'''Note 3''': Do not declare support for an extension until it is FULLY implemented, except for debugging.<br />
<br />
:<h4>ExtInfo Packet</h4><br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x10<br />
(16)<br />
| class="col1 centeralign" | AppName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>MyServer</code><br />
| class="col4" | Client or server software name<br />
|- class="row2"<br />
| class="col0 centeralign" | ExtensionCount<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | 1<br />
| class="col3" | Between 0 and 32767<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 67 bytes<br />
|}<br />
<br />
:<h4>ExtEntry Packet</h4><br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x11<br />
(17)<br />
| class="col1 centeralign" | ExtName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>MyExtension</code><br />
| class="col4" | Name of a supported extension<br />
|- class="row2"<br />
| class="col0 centeralign" | Version<br />
| class="col1 centeralign" | int<br />
| class="col2 centeralign" | 1<br />
| class="col3" | Only extensions with identical version numbers should be considered compatible.<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 69 bytes<br />
|}<br />
<br />
==Extensions==<br />
'''''Note:''''' The section heading is the name of the extension. Packet names are not same as extension names. For example, the first extension listed here is named "ClickDistance" and not "SetClickDistance".<br />
{| class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #3dc238;background:#fbfbfb;width:80%;font-size:110%"<br />
|style="padding:10px"|'''Do you have an idea for an extension? Please post it on the [[Classic_Protocol_Extension/Proposals|Proposals]] subpage.'''<br />
|}<br />
<br />
===ClickDistance===<br />
:Used to extend or restrict the distance at which client may click blocks, controlled by the server. Click range is given in player-space units (32 units per block). In Minecraft Classic, the default range is 160.<br />
:'''Motivation''': This extension allows trusted players to have a wider or virtually-unlimited reach. It may simplify operation of certain bots. Restricting the reach may allow new games/mini-games.<br />
:'''Client Behavior''': Upon receiving a '''''SetClickDistance''''' packet, client should immediately apply the change. ''Distance'' should persist between worlds/maps. If <code>0</code> is given for ''Distance'', client should not be able to click blocks at all.<br />
:'''Server Behavior''': Server should send '''''SetClickDistance''''' packet when the server connects, or whenever their permitted click distance changes. Server should allow for some margin-of-error (+/- 1 block) when enforcing click distance restrictions.<br />
:<h4>SetClickDistance packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x12<br />
(18)<br />
| class="col1 centeralign" | Distance<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | 160<br />
| class="col4" |<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===CustomBlocks===<br />
:Used to add support for custom block types. Custom block IDs start at 50 (0x32). New block types will be added in batches, a few at a time. Both client and server declare which batch they support, and use the lower of the two versions. Claiming to support a batch implies fully implementing all the batches that came before it. If either server or client do not support this extension, only the standard 50 block types should be used.<br />
:'''Motivation''': Adding new visually distinct blocks, to enhance Classic players' experience.<br />
:'''Client behavior''': Client must expect a '''''CustomBlockSupportLevel''''' packet from a compatible server immediately after sending the last '''''ExtEntry''''' packet. It should then reply with its own '''''CustomBlockSupportLevel''''' packet, containing its actual support level. Client must then use the lower of the two levels in operation. Client must not send any block types that are not defined by the current support level. Client should expect [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''ServerIdentification''''']] packet only AFTER sending its '''''CustomBlockSupportLevel''''' packet.<br />
:'''Server behavior''': Server must send a '''''CustomBlockSupportLevel''''' packet to compatible clients immediately after receiving the last '''''ExtEntry''''' packet from the client. It should then wait to receive a '''''CustomBlockSupportLevel''''' packet from the client before sending the [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''ServerIdentification''''']] packet. Server must then use the lower of the two levels in operation. If this level is lower than the server's, it has to filter data sent to the client, to make sure that the client never receives any block types that it does not support. Each level will define what substitutions to use.<br />
<br />
:<h4>CustomBlockSupportLevel packet</h4><br />
:''Bidirectional''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x13<br />
(19)<br />
| class="col1 centeralign" | SupportLevel<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | 1<br />
| class="col4" |<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 2<br />
|}<br />
<br />
:<h4>Blocks in support level 1</h4><br />
:Client must be able to receive/render all 16 custom blocks to claim support. Server must be able to receive/store all 16 custom blocks to claim support.<br />
:[[File:CPE_CustomBlocks_Level1.png]]<br />
:{| class="wikitable"<br />
!Block name<br />
!Block ID<br />
!Fallback name<br />
!Fallback ID<br />
|-<br />
|'''CobblestoneSlab'''<br />
|0x32 (50)<br />
|Slab<br />
|0x2C (44)<br />
|-<br />
|'''Rope'''<br />
|0x33 (51)<br />
|BrownMushroom<br />
|0x27 (39)<br />
|-<br />
|'''Sandstone'''<br />
|0x34 (52)<br />
|Sand<br />
|0x0C (12)<br />
|-<br />
|'''Snow'''<br />
|0x35 (53)<br />
|Air<br />
|0x00 (0)<br />
|-<br />
|'''Fire'''<br />
|0x36 (54)<br />
|Lava<br />
|0x0A (10)<br />
|-<br />
|'''LightPinkWool'''<br />
|0x37 (55)<br />
|Pink<br />
|0x21 (33)<br />
|-<br />
|'''ForestGreenWool'''<br />
|0x38 (56)<br />
|Green<br />
|0x19 (25)<br />
|-<br />
|'''BrownWool'''<br />
|0x39 (57)<br />
|Dirt<br />
|0x03 (3)<br />
|-<br />
|'''DeepBlue'''<br />
|0x3A (58)<br />
|Blue<br />
|0x1d (29)<br />
|-<br />
|'''Turquoise'''<br />
|0x3B (59)<br />
|Cyan<br />
|0x1c (28)<br />
|-<br />
|'''Ice'''<br />
|0x3C (60)<br />
|Glass<br />
|0x14 (20)<br />
|-<br />
|'''CeramicTile'''<br />
|0x3D (61)<br />
|Iron<br />
|0x2a (42)<br />
|-<br />
|'''Magma'''<br />
|0x3E (62)<br />
|Obsidian<br />
|0x31 (49)<br />
|-<br />
|'''Pillar'''<br />
|0x3F (63)<br />
|White<br />
|0x24 (36)<br />
|-<br />
|'''Crate'''<br />
|0x40 (64)<br />
|WoodenPlanks<br />
|0x05 (5)<br />
|-<br />
|'''StoneBrick'''<br />
|0x41 (65)<br />
|Stone<br />
|0x01 (1)<br />
|}<br />
<br />
:Block IDs for future support levels are guaranteed to be assigned monotonically, incrementally, and permanently.<br />
<br />
===HeldBlock===<br />
:Provides a way for the client to notify the server about the blocktype that it is currently holding, and for the server to change the currently-held block type. <br />
:'''Motivation''': This allows server to know which block player is holding, for example for drawing commands, without needing to wait for the player's click. It also allows for features like [http://www.fcraft.net/wiki//Spectate /Spectate] to show what block a spectated player is holding.<br />
:'''Client behavior''': When this extension is mutually supported, client should use the ''PlayerID'' field of the '''''[[Classic_Protocol#Client_.E2.86.92_Server_packets|PositionAndOrientation]]''''' packet (currently unused) to indicate which blocktype the client is currently holding. It should be ready to accept '''''HoldThis''''' packets to change the block that the player is holding. If an unrecognized blocktype is given, no action is needed.<br />
:'''Server behavior''': The server can use '''''HoldThis''''' packet to force the client to hold the desired block type. It should be done sparingly.<br />
<br />
:<h4>HoldThis packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x14<br />
(20)<br />
| class="col1 centeralign" | BlockToHold<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>49</code><br />
| class="col4" | Standard block type<br />
|- class="row2"<br />
| class="col1 centeralign" | PreventChange<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | 0<br />
| class="col4" |0 = Allow player to change blocktype<br />
1 = Prevent player from changing blocktype<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===EmoteFix===<br />
:This extension indicates that the client can render [http://fcraft.net/wiki/Emotes emotes] (ASCII control characters) in chat properly, without padding or suffixes that are required for vanilla client. This extension does not define any new packets.<br />
:'''Motivation''': To improve appearance of emotes in chat.<br />
:'''Client behavior''': Client should not emulate vanilla client's quirks.<br />
:'''Server behavior''': Server should not pad or suffix emotes in chat.<br />
<br />
===TextHotKey===<br />
:This extension allows the server to define "hotkeys" for certain commands.<br />
:'''Motivation''': To speed up and simplify access to commonly-used commands and command macros by providing server-defined client-side hotkeys.<br />
:'''Client behavior:''' Client should not try to persist previously-defined hotkeys between sessions. When a defined hotkey is activated by the user, client should open up a text prompt and type in contents of the ''Action'' field. A newline character (<code>\n</code>) in the ''Action'' field indicates that whatever is currently typed-in should be sent to the server. If ''Action'' does not end with a newline, text prompt should be left open, for the user to complete. Client may provide a way for the user to see a list of currently-defined hotkeys, and a way to notify the user when a hotkey was activated.<br />
:'''Server behavior:''' The server should send a definition of each hotkey ('''''SetTextHotKey''''' packet) once per connection.<br />
<br />
:<h4>SetTextHotKey packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x15<br />
(21)<br />
| class="col1 centeralign" | Label<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Copy</code><br />
| class="col4" | Readable name of the hotkey<br />
|- class="row2"<br />
| class="col1 centeralign" | Action<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>/Copy </code><br />
| class="col4" | Text to type in<br />
|- class="row2"<br />
| class="col1 centeralign" | KeyCode<br />
| class="col2 centeralign" | int<br />
| class="col3 centeralign" | <code>113</code><br />
| class="col4" | [http://www.minecraftwiki.net/wiki/Key_Codes LWJGL keycode] of the key<br />
|- class="row3"<br />
| class="col1 centeralign" | KeyMods<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Key modifier [http://en.wikipedia.org/wiki/Flag_word flags], may be combined:<br />
* 0 = None<br />
* 1 = Ctrl<br />
* 2 = Shift<br />
* 4 = Alt<br />
|- class="row4"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 134 bytes<br />
|}<br />
<br />
===ExtPlayerList===<br />
:'''Motivation''': Provides more flexibility in naming of players and loading of skins, autocompletion, and player tab-list display. Separates tracking of in-game entities (spawned player models) and names on the player list. '''''ExtAddPlayerName'''''/'''''ExtRemovePlayerName''''' packets take over managing the player names list (tab-list), and '''''ExtAddEntity2'''''/'''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|DespawnPlayer]]''''' packets are used only to manage in-game entities.<br />
<br />
====Version 1 (Deprecated since 28 August 2014)====<br />
:This version of the extension has been deprecated and replaced with version 2. See [[Classic Protocol Extension/Old Extensions|old extensions subpage]].<br />
<br />
====Version 2====<br />
Version 2 of this extension replaces '''''ExtAddEntity''''' packet with '''''ExtAddEntity2''''', allows using full URLs for ''SkinName'', and clarifies interaction with [[#ChangeModel|'''ChangeModel''']] extension.<br />
:<h5>Client Behavior</h5><br />
:When '''''ExtAddPlayerName''''' packet is received for an unrecognized ''NameID'', a new name must be added to the player-name list. When receiving '''''ExtAddPlayerName''''' packet for an already-listed ''NameID'', client must update its ''ListName'', ''GroupName'', and ''GroupRank''. Player-name list must persist when client changes worlds/maps.<br />
<br />
:When an '''''ExtAddEntity2''''' packet is received, it must be treated as the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SpawnPlayer]]''''' packet. A player model must be spawned in-game at the given location, with ''InGameName'' text drawn above it. Skin should be loaded using the given ''SkinName'' for a player name. When client receives '''''ExtAddEntity2''''' packet for an already-spawned player, a duplicate entity must not be spawned and existing entity's position must not be changed. Instead their ''InGameName'' and ''SkinName'' must be updated. If a negative ''EntityID'' is given for '''''ExtAddEntity2''''', client must update player's own spawn point, ''InGameName'', and ''SkinName''. The client must ignore regular '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SpawnPlayer]]''''' packets, if any are received.<br />
<br />
:Player entity's skin should be loaded using the given ''SkinName''. If ''SkinName'' appears to be a player name, skin should be downloaded from the default skin server. If ''SkinName'' appears to be a full URL to a PNG image (starts with <code>http://</code> or <code>https://</code> and ends with <code>.png</code>) then skin should be downloaded from that URL. If image is correctly sized/proportioned to use as a skin for the current model, it should be used. If a blank or unrecognized value is given for ''SkinName'', or if given image could not be downloaded or used, then the default skin should be used.<br />
<br />
:Names on the player-name list should be grouped by ''GroupName'' in the player-name list. Names within a ''GroupName'' should be sorted by ''GroupRank'' (in ascending order). Names with the same ''GroupName'' and ''GroupRank'' should be sorted alphabetically by ''ListName''. Color codes may be either drawn or stripped from ''ListName'', ''GroupName'', and ''InGameName''.<br />
<br />
:When a standard '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|DespawnPlayer]]''''' packet is received for a recognized ''EntityID'', player model must be removed from a world. When '''''ExtRemovePlayerName''''' packet is received for a recognized ''NameID'', their name must be removed from player-name list. Packets with out-of-range or unrecognized ''NameID''s must be ignored.<br />
<br />
:In-game entities must never be affected by '''''ExtAddPlayerName''''' or '''''ExtRemovePlayerName''''' packets. Player name list must never be affected by '''''ExtAddEntity2''''' or '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|DespawnPlayer]]''''' packets.<br />
<br />
:<h5>Server Behavior</h5><br />
{| class="wikitable" style="float:right"<br />
!Event<br />
!Packet to send<br />
|-<br />
|Player connects to server<br />
|'''''ExtAddPlayerName'''''<br />
|-<br />
|Player enters map<br />
|'''''ExtAddEntity2'''''<br />
|-<br />
|Player leaves map<br />
|'''''DespawnPlayer'''''<br />
|-<br />
|Player disconnects from server<br />
|'''''ExtRemovePlayerName'''''<br />
|}<br />
:Unique ''NameID'' between 0 and 255 should be assigned to every online player. When a new player connects to the server, '''''ExtAddPlayerName''''' must be sent. ''GroupName'' and ''GroupRank'' can be used in any way, for example to group players by map/world or rank/class/faction. Server must use '''''ExtAddEntity2''''' in place of standard '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SpawnPlayer]]''''' packet. Server should re-send '''''ExtAddPlayerName''''' packet, using the identical ''NameID'', when player's ''ListName'', ''GroupName'', or ''GroupRank'' change. Server must reliably send an '''''ExtRemovePlayerName''''' packet when the player disconnects. Color codes are permitted in ''ListName'', ''GroupName'', and ''InGameName''.<br />
<br />
:<h5>ExtAddPlayerName Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="5" | 0x16<br />
(22)<br />
| class="col1 centeralign" | NameID<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row2"<br />
| class="col1 centeralign" | PlayerName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Notch</code><br />
| class="col4" | Player name used for autocompletion.<br />
May be left empty (to exclude from autocompletion).<br />
|- class="row3"<br />
| class="col1 centeralign" | ListName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>&c[Op]Notch</code><br />
| class="col4" |Name displayed in the in-game list.<br />
|- class="row4"<br />
| class="col1 centeralign" | GroupName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Staff</code><br />
| class="col4" |May be left blank.<br />
|- class="row5"<br />
| class="col1 centeralign" | GroupRank<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Rank of a player within the group.<br />
Lower-number ranks are listed before higher-number ranks.<br />
|- class="row6"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 196 bytes<br />
|}<br />
<br />
:<h5>ExtAddEntity2 Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="8" | 0x21<br />
(33)<br />
| class="col1 centeralign" | EntityID<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Between 0 and 127<br />
|- class="row2"<br />
| class="col1 centeralign" | InGameName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>&cNotch</code><br />
| class="col4" | Player name to be shown in-game, hovering above player model.<br />
|- class="row3"<br />
| class="col1 centeralign" | SkinName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Notch</code><br />
| class="col4" | Player name whose skin should be used by the client.<br />
|- class="row4"<br />
| class="col1 centeralign" | SpawnX<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | X coordinate (32 units per block) of entity's spawn location.<br />
|- class="row5"<br />
| class="col1 centeralign" | SpawnY<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>2</code><br />
| class="col4" | Y coordinate (32 units per block) of entity's spawn location.<br />
|- class="row6"<br />
| class="col1 centeralign" | SpawnZ<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>3</code><br />
| class="col4" | Z coordinate (32 units per block) of entity's spawn location.<br />
|- class="row7"<br />
| class="col1 centeralign" | SpawnYaw<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>4</code><br />
| class="col4" | Orientation (left-right) at the entity's spawn location.<br />
|- class="row8"<br />
| class="col1 centeralign" | SpawnPitch<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Orientation (up-down) at the entity's spawn location.<br />
|- class="row9"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 138 bytes<br />
|}<br />
<br />
:<h5>ExtRemovePlayerName Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x18<br />
(24)<br />
| class="col1 centeralign" | NameID<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Between 0 and 255<br />
Matches NameID of the ExtAddPlayerName packet<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===EnvColors===<br />
:This extension allows server to alter some of the colors used by the client in environment rendering.<br />
:'''Motivation''': To allow the server to give worlds/maps a unique feel: time-of-day, weather/climate, lighting effect, etc.<br />
:'''Client behavior''': Client must check for '''''EnvSetColor''''' packets right before '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet, and apply these changes before the map is displayed. Client must be able to read this packet at other times, but it is not required to then apply the changes immediately. If an unrecognized or unsupported ''Variable'' field is given, no action is needed. If an out-of-range color is given by the server (i.e. if any of ''Red'', ''Green'', or ''Blue'' is less than <code>0</code> or greater than <code>255</code>), then the specified ''Variable'' should be reset to its default value.<br />
:'''Server behavior''': Server should normally only use '''''EnvSetColor''''' packets right before the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet. To reset a variable to its default value, the server should send a packet with value <code>-1</code> for ''Red'', ''Green'', and ''Blue''.<br />
<br />
:<h4>EnvSetColor Packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x19<br />
(25)<br />
| class="col1 centeralign" | Variable<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | Enumeration of environmental variables<br />
*0 = sky color<br />
*1 = cloud color<br />
*2 = fog color<br />
*3 = ambient light (blocks in shadow) color<br />
*4 = diffuse light (sunlight) color<br />
|- class="row2"<br />
| class="col1 centeralign" | Red<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>25</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row3"<br />
| class="col1 centeralign" | Green<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>128</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row4"<br />
| class="col1 centeralign" | Blue<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row5"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 8 bytes<br />
|}<br />
<br />
===SelectionCuboid===<br />
:'''Motivation''': Allows the server to highlight parts of a world. Applications include zoning, previewing draw commands, previewing undo commands.<br />
:'''Coordinates''': {''StartX'',''StartY'',''StartZ''} are coordinates of the block inside the selection that is closest to the map origin. {''EndX'',''EndY'',''EndZ''} are coordinates of the block inside the selection that is furthest from the map origin. Therefore, the resulting selection has dimensions {''EndX''-''StartX''+1, ''EndY''-''StartY''+1, ''EndZ''-''StartZ''+1).<br />
:'''Client behavior''': Client should be ready to receive '''''MakeSelection''''' packets any time after '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet. Upon receiving the packet, a translucent cuboid should appear in the world. The cuboid may feature a plain or "grid" texture. Selections that extend outside the map may be either ignored or clipped to fit. Selections with inconsistent coordinates (e.g. where ''StartX''<''EndX'') may either be ignored or re-ordered. Out-of-range values for ''Red'', ''Green'', ''Blue'', and ''Opacity'' should be clipped to fit the valid range. Supporting ''Opacity'' is optional: the client may opt to provide fixed opacity instead. When map changes (i.e. when '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelInitialize]]''''' packet is received), all existing selections should be removed. '''''RemoveSelection''''' packets that refer to non-existent ''SelectionID''s should be ignored.<br />
:'''Server behavior''': All given coordinates must be contained within the map. End coordinates should be higher or equal than start coordinates.<br />
<br />
:<h4>MakeSelection packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="12" | 0x1A<br />
(26)<br />
| class="col1 centeralign" | SelectionID<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Numeric ID of the selection. Between 0 and 127.<br />
|- class="row2"<br />
| class="col1 centeralign" | Label<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>SomeZone</code><br />
| class="col4" | Text label associated with the selection<br />
|- class="row3"<br />
| class="col1 centeralign" | StartX<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | X coordinate of the starting point<br />
|- class="row4"<br />
| class="col1 centeralign" | StartY<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>2</code><br />
| class="col4" | Y coordinate of the starting point<br />
|- class="row5"<br />
| class="col1 centeralign" | StartZ<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>3</code><br />
| class="col4" | Z coordinate of the starting point<br />
|- class="row6"<br />
| class="col1 centeralign" | EndX<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | X coordinate of the ending point<br />
|- class="row7"<br />
| class="col1 centeralign" | EndY<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>6</code><br />
| class="col4" | Y coordinate of the ending point<br />
|- class="row8"<br />
| class="col1 centeralign" | EndZ<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>7</code><br />
| class="col4" | Z coordinate of the ending point<br />
|- class="row9"<br />
| class="col1 centeralign" | Red<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>255</code><br />
| class="col4" |Between 0 and 255.<br />
|- class="row10"<br />
| class="col1 centeralign" | Green<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>34</code><br />
| class="col4" |Between 0 and 255.<br />
|- class="row11"<br />
| class="col1 centeralign" | Blue<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>128</code><br />
| class="col4" |Between 0 and 255.<br />
|- class="row12"<br />
| class="col1 centeralign" | Opacity<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>255</code><br />
| class="col4" | 0 = fully transparent<br />
255 = fully opaque<br />
|- class="row4"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 86 bytes<br />
|}<br />
<br />
:<h4>RemoveSelection packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x1B<br />
(27)<br />
| class="col1 centeralign" | SelectionID<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 2 bytes<br />
|}<br />
<br />
===BlockPermissions===<br />
:This extension allows the server to instruct the player that certain block types are allowed/disallowed to be placed or deleted.<br />
:'''Motivation''': To prevent players from inadvertently placing or removing prohibited block types (e.g. water, lava, grass, admincrete), before it even reaches the server.<br />
:'''Client behavior:''' Client should prevent placement of prohibited block types (by graying out or hiding blocks in block-selection screen, or any other effective means). Client should prevent player from deleting prohibited block types. Client must be ready to receive '''''SetBlockPermission''''' packet after map load ('''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet). Permission changes should take effect as soon as packet is received. Admincrete (solid block) permissions set by '''''SetBlockPermission''''' must always override permission set by '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|ServerIdentification]]''''' and '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|UpdateUserType]]''''' packets. If ''BlockType'' is set to <code>0</code>, the client behaviour is undefined. Permissions must persist between map changes. Client may optionally warn the player attempting to place/delete prohibited blocks via sound effect, visual effect, chat message, etc.<br />
:'''Server behavior:''' Server may send '''''SetBlockPermission''''' packets any time after map load ('''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet). Any valid block ID may be specified for ''BlockType'', including custom blocks (if [[#CustomBlocks|CustomBlocks extension]] is mutually supported). Server must not assume that client is compliant/obedient, and server must still verify each '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SetBlock]]''''' packet coming from the client. What to do with non-complying clients (kick or warn) is up to you.<br />
<br />
:<h4>SetBlockPermission packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1C<br />
(28)<br />
| class="col1 centeralign" | BlockType<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>8</code><br />
| class="col4" | Block's numeric ID (anything between 1 and max defined block).<br />
|- class="row2"<br />
| class="col1 centeralign" | AllowPlacement<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | 0 = Prohibited<br />
1 or any other value = Allowed<br />
|- class="row2"<br />
| class="col1 centeralign" | AllowDeletion<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | 0 = Prohibited<br />
1 or any other value = Allowed<br />
|- class="row4"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 4 bytes<br />
|}<br />
<br />
===ChangeModel===<br />
:Allows changing appearance of player models in supporting clients.<br />
<h5>Client Behavior</h5><br />
:The client will receive an ''EntityID'' and a string value containing the model name. The client will then change the model of the player whose ID is the same as the received '''''AddEntity''''', '''''ExtAddEntity''''', or '''''ExtAddEntity2''''' packet. The model name will be parsed by the model manager and the model changed in game. If the model does not exists in the model manager or is 0-length, change the model back to humanoid. Alternatively, you can send the client an int converted to a string which represents a valid Block ID. An ''EntityID'' of -1 (255 unsigned) indicates the player's own model. If model is set to <code>humanoid</code>, player-specific skin should be used. For all other models, default model-specific textures should be used.<br />
<br />
<h5>Server Behavior</h5><br />
:The server may send an ''EntityID'' and then a ''ModelName'' to the client for a desired entity. The model name must be chosen from the list below. To reset the model to default, server should set ''ModelName'' to <code>humanoid</code> or to an empty string.<br />
<br />
<h5>Interaction with ExtPlayerList</h5><br />
:If an '''''ExtAddEntity2''''' packet is received for a non-<code>humanoid</code> entity and ''SkinName'' specifies a full URL, that image should be downloaded and used as a texture for the currently model. Receiving another '''''ExtAddEntity2''''' packet should either update this texture (if ''SkinName'' is a full URL) or reset it back to default (if ''SkinName'' is anything else). Receiving another '''''ChangeModel''''' packet with a non-<code>humanoid</code> ''ModelName'' should reset texture back to model-specific default. <br />
<br />
:<h4>ChangeModel Packet</h4><br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x1D<br />
(29)<br />
| class="col0 centeralign" | EntityID<br />
| class="col1 centeralign" | byte<br />
| class="col2 centeralign" | 5<br />
| class="col3" | Between 0 and 127. <br />
|- class="row2"<br />
| class="col1 centeralign" | ModelName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>spider</code><br />
| class="col4" | The name of the model to be used OR a valid Block ID as a string.<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 66 bytes<br />
|}<br />
<br />
:<h4>Available models</h4><br />
:Client can render any or none of the below, but it is down to the client to handle what can and cannot be rendered if the packet is received<br />
:{| class="wikitable"<br />
!Model Name<br />
!Model String<br />
|-<br />
|'''Chicken'''<br />
|<code>chicken</code><br />
|-<br />
|'''Block Model'''<br />
|A valid block ID as a string<br />
|-<br />
|'''Creeper'''<br />
|<code>creeper</code><br />
|-<br />
|'''Crocodile'''<br />
|<code>croc</code><br />
|-<br />
|'''Humanoid'''<br />
|<code>humanoid</code> (or an invalid model name)<br />
|-<br />
|'''Pig'''<br />
|<code>pig</code><br />
|-<br />
|'''Printer'''<br />
|<code>printer</code><br />
|-<br />
|'''Sheep'''<br />
|<code>sheep</code><br />
|-<br />
|'''Skeleton Archer'''<br />
|<code>skeleton</code><br />
|-<br />
|'''Spider'''<br />
|<code>spider</code><br />
|-<br />
|'''Zombie'''<br />
|<code>zombie</code><br />
|-<br />
|'''Head'''<br />
|<code>head</code><br />
|-<br />
|'''Sitting'''<br />
|<code>sitting</code><br />
|-<br />
|'''Chibi'''<br />
|<code>chibi</code><br />
|-<br />
|}<br />
<br />
===EnvMapAppearance===<br />
:This extension allows the server to specify custom terrain textures, and tweak appearance of map edges.<br />
:'''Motivation''': To provide more ways to customize map appearance, including functionality that's currently provided by [http://files.worldofminecraft.com/texturing/ World of Minecraft's scheme].<br />
<br />
====Version 1 (Deprecated since 9 May 2016)====<br />
:This version of the extension has been deprecated and replaced with version 2. See [[Classic Protocol Extension/Old Extensions|old extensions subpage]].<br />
<br />
====Version 2 (Deprecated since 21 June 2017)====<br />
:This version of the extension has been deprecated and replaced with '''''EnvMapAspect'''''. See [[Classic Protocol Extension/Old Extensions|old extensions subpage]].<br />
<br />
===EnvWeatherType===<br />
:This extension allows the server to trigger special weather conditions (like rain and snow) on demand.<br />
:'''Motivation''': To allow the server to give worlds/maps a unique feel with weather effects, e.g. for adventure maps.<br />
:'''Client behavior''': Client must be able to receive '''''EnvWeather''''' packets at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is received, and apply these changes immediately. If an unrecognized or unsupported ''WeatherType'' field is given, no action is needed.<br />
:'''Server behavior''': Server may send '''''EnvSetColor''''' packets to connected clients at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is sent.<br />
<br />
:<h4>EnvSetWeatherType Packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1F<br />
(31)<br />
| class="col1 centeralign" | WeatherType<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | Enumeration of weather types<br />
*0 = sunny<br />
*1 = raining<br />
*2 = snowing<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 2 bytes<br />
|}<br />
<br />
===HackControl===<br />
:This extension allows the server to control cheats/hacks in the client.<br />
:'''Motivation''': To allow fine-grained control over cheats/hacks on multi-world servers.<br />
:'''Client behavior''': Client must be able to receive '''''HackControl''''' packets at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is received, and apply these changes immediately. Unrecognized or unsupported values for any field should be ignored. Clients may approximate ''JumpHeight'' by rounding down to the nearest half-block (i.e. nearest multiple of 16), if needed. If a negative value is given for ''JumpHeight'', client should reset jump height to its default setting (around <code>40</code> in vanilla Minecraft).<br />
:'''Server behavior''': Server may send '''''HackControl''''' packets to connected clients at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is sent.<br />
<br />
:<h4>HackControl Packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="6" | 0x20<br />
(32)<br />
| class="col1 centeralign" | Flying<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
*0 = Prevent player from flying<br />
*1 = Allow flying<br />
|-<br />
| class="col1 centeralign" | NoClip<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
*0 = Prevent player from no-clipping (passing through solid blocks)<br />
*1 = Allow no-clipping<br />
|-<br />
| class="col1 centeralign" | Speeding<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
*0 = Only allow normal walking speed.<br />
*1 = Allow moving at any speeds.<br />
|-<br />
| class="col1 centeralign" | SpawnControl<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" |<br />
*0 = Prevent player from pressing [R] to respawn, or using [Enter] to change spawn.<br />
*1 = Allow player to respawn / change spawn.<br />
|-<br />
| class="col1 centeralign" | ThirdPersonView<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" |<br />
*0 = Disallow third-person view (only first-person view allowed).<br />
*1 = Allow third-person view.<br />
|-<br />
| class="col1 centeralign" | JumpHeight<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>40</code><br />
| class="col4" | Maximum height, in terms of player movement units (1/32<sup>nd</sup>s of a block), to which the player is allowed to jump.<br />
Negative value (e.g. <code>-1</code>) means that the client should use its default jump height.<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 8 bytes<br />
|}<br />
<br />
===MessageTypes===<br />
[[Image:Messagetypes.PNG|right|700px|Examples of all possible MessageTypes.]]<br />
:This extension adds new ways of presenting messages in the client.<br />
:'''Motivation''': To enhance the display of announcements and status information, and to reduce chat clutter.<br />
:'''Client behavior''': When this extension is mutually supported, the ''PlayerID'' field of the standard server-to-client [[Classic_Protocol#Server_.E2.86.92_Client_packets|'''''Message''''']] packet should be treated as a ''MessageType'' code. Unrecognized or unsupported codes may be ignored (in which case the message should be presented as a regular chat message). When connected to non-supporting servers, this field should be ignored.<br />
:'''Server behavior''': Server may use the ''PlayerID'' field of the [[Classic_Protocol#Server_.E2.86.92_Client_packets|'''''Message''''']] packet to set a ''MessageType''. For non-supporting clients, this field should always be set to <code>0</code>.<br />
<br />
:{| class="wikitable"<br />
!MessageType<br />
!Meaning<br />
!Suggested Implementation<br />
|-<br />
|<code>0</code><br />
|Chat<br />
|Normal message, shown in the chat area.<br />
|-<br />
|<code>1</code><br />
|Status1<br />
|Shown persistently in the top-right corner of the screen, in regular font.<br />
|-<br />
|<code>2</code><br />
|Status2<br />
|Shown persistently just below Status1<br />
|-<br />
|<code>3</code><br />
|Status3<br />
|Shown persistently just below Status2<br />
|-<br />
|<code>11</code><br />
|BottomRight1<br />
|Shown persistently in the bottom-right corner of the screen, in regular font.<br />
|-<br />
|<code>12</code><br />
|BottomRight2<br />
|Shown persistently just above BottomRight1<br />
|-<br />
|<code>13</code><br />
|BottomRight3<br />
|Shown persistently just above BottomRight2<br />
|-<br />
|<code>100</code><br />
|Announcement<br />
|Pops up in larger font near the top-center of the screen. Fades out after a few seconds.<br />
|}<br />
<br />
:This extension does not define any new packets.<br />
<br />
===PlayerClick===<br />
:This extension lets the server receive details of every mouse click a player makes, including targeting information.<br />
:'''Motivation''': To allow for the creation of more interactive maps: interactive buttons, cannons, ability to "tag" or "shoot" other players, ability to drag-to-draw at a distance, etc.<br />
:'''Client Behavior''': When this extension is mutually supported, a '''''PlayerClicked''''' packet should be sent to the server, as soon as reasonably possible, every time the user presses or releases a mouse button. Mouse interactions that happen while player is interacting with chat, with GUI menus, or with any other application must NOT be sent. A matching "released" event must be sent for every "pressed" event.<br />
<br />
:High resolution up-to-date ''Yaw'' and ''Pitch'' for the player should be transmitted with every packet. If player is currently targeting another entity/player ''TargetEntityID'' fields should be set. If player is currently targeting a block (within permitted [[Classic_Protocol_Extension#ClickDistance|ClickDistance]]) ''TargetBlockX'', ''TargetBlockY'', ''TargetBlockZ'', and ''TargetBlockFace'' should be set. An out-of-range value should be used for these fields when they are not in use. These packets should not be sent during level transitions (after receiving '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelInitialize]]''''' and until receiving '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packets).<br />
:'''Server Behavior''': Server must be ready to accept any number of '''''PlayerClicked''''' packets at any time after level sending has completed. What to do with this information is entirely up to the server.<br />
<h4>PlayerClicked packet</h4><br />
:''Client to Server''<br />
:{| class="wikitable"<br />
|-<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Example<br />
! Notes<br />
|-<br />
| class="centeralign" rowspan="9" | 0x22<br />
(34)<br />
| class="centeralign" | Button<br />
| class="centeralign" | byte<br />
| class="centeralign" | 0<br />
| class="centeralign" | 0 = Left click, 1 = Right Click, 2 = Middle click<br />
|-<br />
| class="centeralign" | Action<br />
| class="centeralign" | byte<br />
| class="centeralign" | 0<br />
| class="centeralign" | 0 = Pressed, 1 = Released<br />
|-<br />
| class="centeralign" | Yaw<br />
| class="centeralign" | short<br />
| class="centeralign" | 0<br />
| class="centeralign" | Yaw (heading) of the player.<br />
Same function as ''Yaw'' field of '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|PositionAndOrientation]]''''' packet, but with more precision. <br />
|-<br />
| class="centeralign" | Pitch<br />
| class="centeralign" | short<br />
| class="centeralign" | 0<br />
| class="centeralign" | Pitch (head angle) of the player.<br />
Same function as ''Pitch'' field of '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|PositionAndOrientation]]''''' packet, but with more precision.<br />
|-<br />
| class="centeralign" | TargetEntityID<br />
| class="centeralign" | byte<br />
| class="centeralign" | 0<br />
| class="centeralign" | ID of an entity currently targeted by the player, between 0 and 127.<br />
Any out-of-range value means "no entity is targeted."<br />
|-<br />
| class="centeralign" | TargetBlockX<br />
| class="centeralign" | short<br />
| class="centeralign" | 64<br />
| class="centeralign" | X coordinate of a targeted block, between 0 and 2048.<br />
Any out-of-range value for any of the coordinates means "no block is targeted."<br />
|-<br />
| class="centeralign" | TargetBlockY<br />
| class="centeralign" | short<br />
| class="centeralign" | 64<br />
| class="centeralign" | Y coordinate of a targeted block, between 0 and 2048.<br />
|-<br />
| class="centeralign" | TargetBlockZ<br />
| class="centeralign" | short<br />
| class="centeralign" | 64<br />
| class="centeralign" | Z coordinate of a targeted block, between 0 and 2048.<br />
|-<br />
| class="centeralign" | TargetBlockFace<br />
| class="centeralign" | byte<br />
| class="centeralign" | 1<br />
| class="centeralign" | Index of the block face that the player is targeting. Block faces are numbered as follows:<br />
0. Away from X-origin<br />
<br />
1. Towards X-origin<br />
<br />
2. Away from Y-origin (up)<br />
<br />
3. Towards Y-origin (down)<br />
<br />
4. Away from Z-origin<br />
<br />
5. Towards Z-origin<br />
<br />
Any out-of-range value for ''TargetBlockFace'' mean "no block is targeted."<br />
|-<br />
! Total Size:<br />
| class="rightalign" colspan="4" | 15 bytes<br />
|}<br />
<br />
===LongerMessages===<br />
:This extension allows clients to accept messages longer than 64 characters, and send them to the server in parts.<br />
:'''Motivation''': To allow players to write longer messages!<br />
:'''Client Behavior''': When a regular-length message is sent, a single [[Classic_Protocol#Server_.E2.86.92_Client_packets|'''''Message''''']] packet is sent, with the unused ''PlayerID'' (aka ''MessageType'') byte set to <code>0</code>. When an extra-long message is sent, multiple [[Classic_Protocol#Server_.E2.86.92_Client_packets|'''''Message''''']] packets are sent. All packets except the last one should have the unused byte set to <code>1</code>, meaning "this message continues in the next Message packet".<br />
:'''Server Behavior''': Server should check the unused ''PlayerID'' (aka ''MessageType'') byte of every incoming [[Classic_Protocol#Server_.E2.86.92_Client_packets|'''''Message''''']] packet. If the value is non-zero, it should treat it as a partial message. Partial messages should be stored and prepended to the next message received from this player, until a message with a <code>0</code> byte is received. Server should preserve leading and trailing whitespace in message packets with a <code>1</code> byte. Server should preserve leading whitespace, but trim trailing whitespace from the last packet of a partial message.<br />
<br />
:No new packets are defined, but treatment of [[Classic_Protocol#Server_.E2.86.92_Client_packets|'''''Message''''']] packet is altered.<br />
<br />
===FullCP437===<br />
:This extension allows players to send and receive chat with all characters in code page 437, rather than just the 0 to 127 characters.<br />
:'''Motivation''': To allow players to use more characters for different purposes.<br />
:'''Client Behavior''': When a message packet is received, clients '''must''' treat all characters in that message as unsigned bytes that represent indices into code page 437. Clients may optionally provide a way of directly entering code page 437 characters into chat.<br />
:'''Server Behavior''': Servers '''must''' support being able to '''send and receive''' chat message packets which include unsigned byte values ranging from 0 to 255. Servers '''must''' also provide a fallback mechanism for converting unsigned bytes in the 128-255 range into the 0 to 127 range for clients that do not support this extension. (e.g converting all unsigned bytes in the 128 to 255 range to a '?' symbol)<br />
<br />
'''Note:''' Ideally, servers should also provide some method of escaping that allows users to enter a token that is then converted into a code page 437 index, but that is not required to claim support for this extension.<br />
<br />
As an example of an escaping mechanism, when "{infinity}" is entered by the player, it becomes a single unsigned byte with a value of '236' after being processed by the server.<br />
When the chat message packet is later received by the client, it renders the unsigned byte with the value of '236' as ∞.<br />
<br />
===BlockDefinitions===<br />
:This extension allows servers to define new block types with custom IDs and appearance, as well as the ability to redefine the properties of standard block types.<br />
:'''Motivation''': To allow defining block types without client modifications. To make full use of custom textures.<br />
:'''Client Behavior''': Client must be able to receive any number of '''''DefineBlock''''' and '''''RemoveBlockDefinition''''' packets at any time. Servers should prefer to send these packets during level loading (after sending'''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelInitialize]]''''' and before sending '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]'''''), as sending these after level loading may cause the client to perform expensive operations such as redrawing the map. Client must keep track of all defined blocks between level changes or until they are individually removed with '''''RemoveBlockDefinition'''''.<br />
:Client must be able to accept and render blocks as specified in '''''DefineBlock''''' packets. Clients must accept any valid definitions with ''BlockID'' between 1 and 255, inclusive. If a new definition is accepted for an already-defined ''BlockID'', the old definition should be replaced. If '''''RemoveBlockDefinition''''' is received for a non-defined ''BlockID'', it should be ignored. Otherwise, the properties of that block should be reset to their defaults.<br />
<br />
:'''Server Behavior''': Server may send any number of '''''DefineBlock''''' packets at any time. Server should only use IDs of currently-defined blocks in block data sent in '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packets, '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SetBlock]]''''' packets, or any other packets that expect block IDs.<br />
<br />
:'''Texturing''': New textures are defined by altering <code>terrain.png</code> and specifying it with '''''[[Classic_Protocol_Extension#EnvSetMapAppearance_packet|EnvSetMapAppearance]]''''' packet. '''''DefineBlock''''' fields ''TopTextureID'', ''SideTextureID'', and ''BottomTextureID'' refer to a tile number within <code>terrain.png</code>. Tiles are numbered 0 (top-left corner) through 255 (bottom-right corner), increasing left-to-right within each row. Refer to [http://123dmwm.tk/ID-Overlay.png this] image for a list of standard tiles, and a graphical list of tile indices.<br />
<br />
:'''Compatibility''': For non-supporting clients, the server must convert custom block ids into fallback block ids (e.g. 'lamp' fallbacks to lava) that lie within the client's set of supported blocks. (TODO: Define how the client should store map files with block definitions. Maybe integrate this with ClassicWorld definition?) 0 is not allowed to be redefined.<br />
<br />
:<h5>DefineBlock Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|-<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Example<br />
! Notes<br />
|-<br />
| class="centeralign" rowspan="16" | 0x23<br />
(35)<br />
| class="centeralign" | BlockID<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>128</code><br />
| Between 1 and 255 (unsigned).<br />
|-<br />
| class="centeralign" | Name<br />
| class="centeralign" | String<br />
| class="centeralign" | <code>Cactus</code><br />
| Short, unique, player-friendly name for the block.<br />
|- <br />
| class="centeralign" | Solidity<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>1</code><br />
| Specified collision mode for this block type.<br />
Blocks may be walk-through (0), swim-through (1), or solid (2).<br />
* Walk-through blocks do not collide with the player, and do not interfere with jumping. Players fall through these blocks.<br />
* Swim-through blocks allow the player to descend or ascend slowly (at ''WalkSpeed''), as if they were swimming.<br />
* Solid blocks collide with the player. Players may walk on these.<br />
|-<br />
| class="centeralign" | MovementSpeed<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>1</code><br />
| Player movement speed modifier, defined relative to regular walk speed. Ratio to normal speed is computed with this formula:<br />
y = 2<sup>(x-128)/64</sup><br />
Thus a value of <code>0</code> translates to 0.25 ratio (25% speed), <code>128</code> to 1.00 ratio (100% speed), and <code>255</code> to 3.96 (396% speed).<br />
* If ''Solidity'' is set to 0 or 1, speed is modified while player is inside (i.e. colliding with) the block.<br />
* If ''Solidity'' is set to 2, speed is modified while player is standing on the block.<br />
If player is affected by several tiles, the ''lowest'' of all modifiers is used.<br />
|-<br />
| class="centeralign" | TopTextureID<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>1</code><br />
| Refers to a <code>terrain.png</code> tile.<br />
Between 0 and 255 (unsigned).<br />
Can be same as other texture IDs.<br />
|-<br />
| class="centeralign" | SideTextureID<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>2</code><br />
| Refers to a <code>terrain.png</code> tile.<br />
Between 0 and 255 (unsigned).<br />
Can be same as other texture IDs. This is also the texture ID used for drawing sprite blocks (i.e. when Shape is 0).<br />
|-<br />
| class="centeralign" | BottomTextureID<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>3</code><br />
| Refers to a <code>terrain.png</code> tile.<br />
Between 0 and 255 (unsigned).<br />
Can be same as other texture IDs.<br />
|-<br />
| class="centeralign" | TransmitsLight<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
| Whether this block allows the sunlight to go through, for level-lighting purposes.<br />
|-<br />
| class="centeralign" | WalkSound<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
| ID of a sound that client may play when player "steps" on, "walks" through, or "swims" through this tile.<br />
0 = no sound, 1 = wood, 2 = gravel, 3 = grass, 4 = stone, 5 = metal, 6 = glass, 7 = wool, 8 = sand, 9 = snow.<br />
|-<br />
| class="centeralign" | FullBright<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
| Whether or not the block/liquid is affected by shadows (such as lava).<br />
* 0 = Affected (darkened when in shadow)<br />
* 1 = Not affected (always bright).<br />
|-<br />
| class="centeralign" | Shape<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
| Shape of the block model:<br />
* Sprite = 0,<br />
* Cube with height = 1-16 <br />
(e.g. slab would have a shape of '8', snow would have '2', dirt would have '16')<br />
|-<br />
| class="centeralign" | BlockDraw<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
| Can be:<br />
* 0 = fully opaque<br />
* 1 = transparent (e.g. like glass)<br />
* 2 = transparent but with no face culling of same neighbours (e.g. like leaves)<br />
* 3 = translucent, where texture's alpha is blended (e.g. like ice or water)<br />
* 4 = gas (e.g. like air)<br />
|-<br />
| class="centeralign" | FogDensity<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
| Density of fog while client's camera is inside this block.<br />
Value of <code>0</code> means "do not change fog" -- level's default settings are used.<br />
Values between 1 and 255 are mapped to OpenGL's GL_FOG_DENSITY value for GL_EXP2 style fog with the following formula:<br />
<br />
GL_FOG_DENSITY = (x+1)/128<br />
<br />
Thus value of <code>1</code> means density of ~0.0156, value of <code>127</code> means 1.0000, and <code>255</code> means 2.0000<br />
|-<br />
| class="centeralign" | FogR<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>255</code><br />
| Red component of the aforementioned fog. Only applies if ''FogDensity'' is above <code>0</code>.<br />
|-<br />
| class="centeralign" | FogG<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>255</code><br />
| Green component of the aforementioned fog. Only applies if ''FogDensity'' is above <code>0</code>.<br />
|-<br />
| class="centeralign" | FogB<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>255</code><br />
| Blue component of the aforementioned fog. Only applies if ''FogDensity'' is above <code>0</code>.<br />
|-<br />
! Total Size:<br />
| class="rightalign" colspan="4" | 80 bytes<br />
|}<br />
<br />
:<h5>RemoveBlockDefinition Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|-<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Example<br />
! Notes<br />
|-<br />
| class="centeralign" | 0x24<br />
(36)<br />
| class="centeralign" | BlockID<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>128</code><br />
| Between 128 and 255<br />
|-<br />
! Total Size:<br />
| class="rightalign" colspan="4" | 2 bytes<br />
|}<br />
<br />
===BlockDefinitionsExt===<br />
:This extension allows servers to define new block types with custom IDs and appearance, as well as the ability to redefine the properties of standard block types.<br />
:'''Motivation''': To allow defining custom block types that do not have minX/Y/Z values of 0, and maxX/Z values of 1.<br />
:'''Client Behavior''': See the '''''BlockDefinitions''''' specification. This extension depends on [[Classic_Protocol_Extension#BlockDefinitions|BlockDefinitions extension]], and must only be enabled if that extension is also mutually supported.<br />
<br />
====Version 1 (Deprecated since 9 May 2016)====<br />
:This version of the extension has been deprecated and replaced with version 2. See [[Classic Protocol Extension/Old Extensions|old extensions subpage]].<br />
<br />
====Version 2====<br />
<br />
:'''Texturing''': See the '''''BlockDefinitions''''' specification. The MinX/Y/Z and MaxX/Y/Z fields also affect the location within the terrain tile for a given face that the block should sample texels from. (e.g. if minX and minZ was 8, and maxX and maxZ was 16, then for the terrain.png tile with pixels from (0, 0) to (16, 16), the top face would be drawn with the subset of pixels from (8, 8) to (16, 16))<br />
<br />
:'''Server Behavior''': See the '''''BlockDefinitions''''' specification.<br />
<br />
<br />
This packet is the same as DefineBlock packet, except the 'shape field' is replaced by 6 fields indicating the bounding box of the block in pixel coordinates, and the 'side texture' is replaced by 4 fields indicating the individual textures for each horizontal side face.<br />
Note that this packet does not support sprites, you must send a regular '''''DefineBlock''''' packet for that.<br />
:<h5>DefineBlockExt Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|-<br />
| Packet ID<br />
! Field Name<br />
! Field Type<br />
! Example<br />
! Notes<br />
|-<br />
| class="centeralign" rowspan="16" | 0x25<br />
(37)<br />
| class="leftalign" colspan="4" | Following fields from DefineBlock packet: BlockID, Name, Solidity, MovementSpeed, TopTextureID<br />
|-<br />
| class="centeralign" | LeftTextureId<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
|Refers to a terrain.png tile.<br />
Between 0 and 255 (unsigned). Can be same as other texture IDs. This is the texture ID for the X = 0 face.<br />
|-<br />
| class="centeralign" | RightTextureId<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
|Refers to a terrain.png tile.<br />
Between 0 and 255 (unsigned). Can be same as other texture IDs. This is the texture ID for the X = 1 face.<br />
|-<br />
| class="centeralign" | FrontTextureId<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
|Refers to a terrain.png tile.<br />
Between 0 and 255 (unsigned). Can be same as other texture IDs. This is the texture ID for the Z = 0 face.<br />
|-<br />
| class="centeralign" | BackTextureId<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
|Refers to a terrain.png tile.<br />
Between 0 and 255 (unsigned). Can be same as other texture IDs. This is the texture ID for the Z = 1 face.<br />
|-<br />
| class="leftalign" colspan="4" | Following fields from DefineBlock packet: BottomTextureID, TransmitsLight, WalkSound, FullBright<br />
|-<br />
| class="centeralign" | MinX<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
| Minimum X coordinate in pixels. Min allowed is 0, max allowed is 15.<br />
|-<br />
| class="centeralign" | MinY<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
| Minimum Y coordinate in pixels. Min allowed is 0, max allowed is 15.<br />
|-<br />
| class="centeralign" | MinZ<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>0</code><br />
| Minimum Z coordinate in pixels. Min allowed is 0, max allowed is 15.<br />
|-<br />
| class="centeralign" | MaxX<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>16</code><br />
| Maximum X coordinate in pixels. Min allowed is 1, max allowed is 16.<br />
|-<br />
| class="centeralign" | MaxY<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>16</code><br />
| Maximum Y coordinate in pixels. Min allowed is 1, max allowed is 16.<br />
|-<br />
| class="centeralign" | MaxZ<br />
| class="centeralign" | byte<br />
| class="centeralign" | <code>16</code><br />
| Maximum Z coordinate in pixels. Min allowed is 1, max allowed is 16.<br />
|-<br />
| class="leftalign" colspan="4" | Following fields from DefineBlock packet: BlockDraw, FogDensity, FogR, FogG, FogB<br />
|-<br />
! Total Size:<br />
| class="rightalign" colspan="4" | 88 bytes<br />
|}<br />
<br />
===BulkBlockUpdate===<br />
:Allows servers to send a single optimised packet that contains 256 block updates.<br />
:'''Motivation''': Reduce bandwidth usage and increase responsiveness to clients during times of heavy block updates, e.g. for large cuboids or lava survival servers.<br />
:'''Client Behavior''': When this extension is mutually supported, treat the packet in the same manner as a list of up to 256 [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''SetBlock''''']] packets.<br />
:'''Server Behavior''': When this extension is mutually supported, server may send '''''BlockBulkUpdate''''' packets to the client after the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet for the current level has been sent to the client.<br />
<h4>BulkBlockUpdate packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="3" | 0x26<br />
(38)<br />
| class="col1 centeralign" | Count<br />
| class="col2 centeralign" | unsigned byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4 centeralign" | The number of block updates used in this packet - 1. (e.g. a value of 0 means 1 block update is used).<br />
|- class="row2"<br />
| class="col1 centeralign" | Indices<br />
| class="col2 centeralign" | byte array[1024]<br />
| class="col3 centeralign" | [52, 3443]<br />
| class="col4 centeralign" | A packed list of the indices within the current level of the blocks that are to be updated. <br />
Each element is a 32 bit integer in big endian order.<br />
|- class="row3"<br />
| class="col1 centeralign" | Blocks<br />
| class="col2 centeralign" | byte array[256]<br />
| class="col3 centeralign" | [5, 10]<br />
| class="col4 centeralign" | A packed list of the new blocks to set at each corresponding index in the indices array.<br />
|- class="row12"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 1282 bytes<br />
|}<br />
<br />
===TextColors===<br />
:This extension allows the server to define custom text colors.<br />
:'''Motivation''': To allow parts of chat to be more distinctive, allow for more colorful chat, etc.<br />
:'''Client Behavior''': Client must be able to receive '''''SetTextColor''''' packets at any time. Client must then draw text using the color specified in the packet, when the color code specified by the packet is encountered in any '''''Message''''' packet. <br />
:An alpha/opacity of 0 is treated as '''removing''' the custom colour code from the client's list of custom color codes.<br />
:'''Server Behavior''': Server may send '''''SetTextColor''''' packets at any time.<br />
:'''Compatibility''': Clients may choose to always draw text fully opaque, even if the custom text colour specifies a non fully-opaque color. These clients shall still be considered as compliant with the specification.<br />
: For maximum compatibility, it is recommended that the color code in the ''SetTextColor'' be greater than 0x20(space) and less than 0x7F(delete). The color code '''must not''' be '&', '%', ' ', or '\0'. <br />
: Clients may support overriding /replacing the standard hex color codes, when the '''''code''''' in the range 0-9, a-f, or A-F.<br />
:<h4>SetTextColor packet</h4><br />
:''Server to client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="11" | 0x27<br />
(39)<br />
| class="col1 centeralign" | Red<br />
| class="col2 centeralign" | unsigned byte<br />
| class="col3 centeralign" | <code>255</code><br />
| class="col4 centeralign" | Red component of the text color.<br />
|- class="row2"<br />
| class="col1 centeralign" | Green<br />
| class="col2 centeralign" | unsigned byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4 centeralign" | Green component of the text color.<br />
|- class="row3"<br />
| class="col1 centeralign" | Blue<br />
| class="col2 centeralign" | unsigned byte<br />
| class="col3 centeralign" | <code>127</code><br />
| class="col4 centeralign" | Blue component of the text color.<br />
|- class="row4"<br />
| class="col1 centeralign" | Alpha<br />
| class="col2 centeralign" | unsigned byte<br />
| class="col3 centeralign" | <code>255</code><br />
| class="col4 centeralign" | Alpha/Opacity of the text colour, with 255 being fully opaque.<br />
|- class="row5"<br />
| class="col1 centeralign" | Code<br />
| class="col2 centeralign" | unsigned byte<br />
| class="col3 centeralign" | <code>63</code><br />
| class="col4 centeralign" | ASCII character colour code, case sensitive.<br />
|- class="row12"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 6 bytes<br />
|}<br />
''Example:'' Suppose the server sends a '''''SetTextColor''''' packet of color #123456 and color code 'G'. When the client receives a '''''Message''''' packet with the text ''&fFoo&GBar'', ''Foo'' is drawn using the color #FFFFFF and ''Bar'' is drawn using the color #123456.<br />
<br />
===EnvMapAspect===<br />
:This extension allows the server to specify custom texture packs, and tweak appearance of a map.<br />
:'''Client behavior:''' Client must be able to receive '''''SetMapEnvUrl''''' and '''''SetMapEnvProperty''''' packets at any time after the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelInitalise]]''''' packet is received for a level. If the ''TexturePackURL'' field in a '''''SetMapEnvUrl''''' packet is blank or if the given file could not be loaded for any reason, then the texture pack should be reset to the client's default. If an unsupported block ID is given for ''SideBlock'' or ''EdgeBlock'', it should be ignored. Client should keep using the texture pack for future maps, unless specified otherwise by the server.<br />
:'''Server behavior:''' Server may send '''''SetMapEnvUrl''''' and '''''SetMapEnvProperty''''' packets after the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelInitalise]]''''' packet is sent for a level. Server should not use any custom block IDs unless the client declared the appropriate ''CustomBlocks'' support level. To reset the texture pack to the client's default one, server should send an '''''SetMapEnvUrl''''' packet with empty string for ''TexturePackURL''. To reset other properties, server should simply use the default values (listed below).<br />
:'''Block type restrictions:''' Only solid blocks are allowed to be used for ''SideBlock'' and ''EdgeBlock'' properties. Sprites (Sapling, Dandelion, Rose, BrownMushroom, RedMushroom, Rope, Fire) partial-height blocks (Slab, CobblestoneSlab, Snow), and transparent blocks (Air, Leaves, Glass) cannot be used for those fields.<br />
<h4>SetMapEnvUrl packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="3" | 0x28<br />
(40)<br />
| class="col1 centeralign" | TexturePackURL<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>http://example.com/mypack.zip</code><br />
| class="col4" | Texture pack's full URL.<br />
Must be a HTTP/HTTPS URL, in .zip format, and served with <code>application/zip</code> mime type.<br />
If a .png is instead served, this is assumed to represent a terrain.png image.<br />
|- class="row12"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 65 bytes<br />
|}<br />
<br />
:<h5>Texture pack .zip format</h5><br />
:'''Note:''' It is up to clients which files (except for terrain.png) they support in a texture pack. These clients are still considered to be compliant with the specification.<br />
:'''Note:''' Texture packs may also contain other files not listed below. If clients recognise these other files, then they may perform whatever is desired with them.<br />
:'''Note:''' If a texture pack does not contain a certain texture, clients should continue to use the existing texture from the previous texture pack.<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | File name<br />
! class="col2" | Details<br />
|- class="row1"<br />
| class="col0 centeralign" | terrain.png<br />
| class="col2 centeralign" | Texture atlas that contains the textures that are applied to blocks.<br />
'''Note:''' Clients ''must'' support this texture to be considered compliant with the specification.<br />
|- class="row2"<br />
| class="col0 centeralign" | animations.png<br />
| class="col2 centeralign" | Texture atlas that contains the textures used for animations.<br />
|- class="row3"<br />
| class="col0 centeralign" | animations.txt<br />
| class="col2 centeralign" | File that specifies how the textures in animations.png should be applied to the terrain.png texture atlas.<br />
|- class="row3"<br />
| class="col0 centeralign" | char.png<br />
| class="col2 centeralign" | Default skin for humanoid models.<br />
|- class="row4"<br />
| class="col0 centeralign" | clouds.png<br />
| class="col2 centeralign" | Texture applied to clouds rendered by the client.<br />
|- class="row5"<br />
| class="col0 leftalign" colspan="2" | ''The following may be utilised by clients if EnvWeatherType is mutually supported:''<br />
|- class="row6"<br />
| class="col0 centeralign" | rain.png<br />
| class="col2 centeralign" | Texture applied to rain rendered by the client.<br />
|- class="row7"<br />
| class="col0 centeralign" | snow.png<br />
| class="col2 centeralign" | Texture applied to snow rendered by the client.<br />
|- class="row8"<br />
| class="col0 leftalign" colspan="2" | ''The following may be utilised by clients if ChangeModel is mutually supported:''<br />
'''Note:''' The default texture for humanoid models is specified by ''char.png''. Block models use textures from ''terrain.png''.<br />
|- class="row9"<br />
| class="col0 centeralign" | x.png<br />
| class="col2 centeralign" | Default texture applied to a model for model string ''x''.<br />
For example, the Crocodile model has the model string ''croc''. The default texture that would be applied is specified by ''croc.png''. <br />
|}<br />
<br />
:<h5>animations.txt format</h5><br />
:{| class="wikitable" style="display:block; max-width:1000px"<br />
|Each line is in the format: <TileX> <TileY> <FrameX> <FrameY> <Frame size> <Frames count> <Tick delay><br />
:- ''TileX'' and ''TileY'' indicate the coordinates of the tile in terrain.png that will be replaced by the animation frames. These range from 0 to 15. (inclusive of 15)<br />
:- ''FrameX'' and ''FrameY'' indicates the pixel coordinates of the first animation frame in animations.png. The top left pixel coordinate is (0, 0)<br />
:- ''Frame size'' indicates the size in pixels of an animation frame.<br />
:- ''Frames count'' indicates the number of used frames. The first frame is located at (FrameX, FrameY), second frame at (FrameX + FrameSize, FrameY) and so forth.<br />
:- ''Tick delay'' is the number of ticks a frame doesn't change. For instance, a value of 0 means that the frame would be changed every tick, while a value of 2 would mean 'replace with frame 1, don't change frame, don't change frame, replace with frame 2'.<br />
|}<br />
<br />
<h4>SetMapEnvProperty packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="3" | 0x29<br />
(41)<br />
| class="col1 centeralign" | Property type<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Enumeration of properties that can be changed<br />
*0 = Value is map sides block ID. Default value is 7 (Admincrete).<br />
*1 = Value is map edge/horizon block ID. Default value is 8 (Water).<br />
*2 = Value is map edge height. Default value is <code>MapDepth/2</code>.<br />
*3 = Value is map clouds height. Default value is <code>MapDepth + 2</code>.<br />
*4 = Value is max fog/view distance. Default is 0. (Client has no limit on maximum view distance.)<br />
*5 = Value is clouds speed * 256 (so divide value by 256 to get speed). Default is 256.<br />
*6 = Value is weather speed * 256. Default is 256.<br />
*7 = Value is weather fade * 128. Default is 128.<br />
*8 = Value is use exponential fog (any value other than 0 means use it). Default is 0.<br />
*9 = Value is offset of map sides height from map edge height. Default is -2.<br />
|- class="row3"<br />
| class="col1 centeralign" | Property value<br />
| class="col2 centeralign" | int<br />
| class="col3 centeralign" | 45<br />
| class="col4 centeralign" | New value for the given property.<br />
|- class="row12"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 6 bytes<br />
|}<br />
<br />
===EntityProperty===<br />
:Allows servers to change the properties of entities, beyond changing their position and yaw/pitch.<br />
:'''Motivation''': Allow for greater customisation, while also allowing for extension to more properties in the future.<br />
:'''Client Behavior''': Client must be able to receive '''''SetEntityProperty''''' packets after the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet for the current level has been received from the server.<br />
:'''Server Behavior''': Server may send '''''SetEntityProperty''''' packets to the client after the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet for the current level has been sent to the client.<br />
<h4>SetEntityProperty packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="3" | 0x2A<br />
(42)<br />
| class="col1 centeralign" | EntityID<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4 centeralign" | Between 0 and 127<br />
|- class="row2"<br />
| class="col1 centeralign" | Property type<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Enumeration of properties that can be changed<br />
*0 = Model X rotation in degrees<br />
*1 = Model Y (yaw) rotation in degrees<br />
*2 = Model Z rotation in degrees<br />
|- class="row3"<br />
| class="col1 centeralign" | Property value<br />
| class="col2 centeralign" | int<br />
| class="col3 centeralign" | 45<br />
| class="col4 centeralign" | New value for the given property.<br />
|- class="row12"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 7 bytes<br />
|}<br />
<br />
===ExtEntityPositions===<br />
:Expands entity positions from the range of [-1023, 1023] to [-6,7108,864, 67,108,864].<br />
:'''Motivation''': Allows for players to interact and see other players properly on very large/tall/long worlds.<br />
:'''Client Behavior''': Client must read 32 instead of 16 bit integers for the '''''AddEntity''''', '''''EntityTeleport''''', '''''ExtAddEntity2''''' packets. It must write 32 instead of 16 bit integers for the '''''Position and Orientation''''' packet sent to the server.<br />
:'''Server Behavior''': Server must write 32 instead of 16 bit integers for the '''''AddEntity''''', '''''EntityTeleport''''', '''''ExtAddEntity2''''' packets. It must read 32 instead of 16 bit integers for the '''''Position and Orientation''''' packet received from the client.<br />
'''Note:''' No new packets are defined by this extension, instead, the reading and writing behaviour of existing packets is modified. The behaviour change only applies to the X, Y, Z fields of the aforementioned packets.<br />
<br />
===TwoWayPing===<br />
:Allows servers and clients to send identifiable ping packets.<br />
:'''Motivation''': Allows clients and servers to calculate ping statistics.<br />
:'''Client Behavior''': Periodic '''''TwoWayPing''''' packets should be sent to the server, with a ''Direction'' of ''0''. Behavior upon receipt of a '''''TwoWayPing''''' packet depends on ''Direction'':<br />
*If 0, update ping statistics. (Typically using difference between current time and time a ping packet with a matching ''Data'' was sent)<br />
*Else, immediately send the packet back to the server.<br />
:'''Server Behavior''': Periodic '''''TwoWayPing''''' packets should be sent to the client, with a ''Direction'' of ''1''. Behavior upon receipt of a '''''TwoWayPing''''' packet depends on ''Direction'':<br />
*If 0, immediately send the packet back to the client.<br />
*Else update ping statistics. (Typically using difference between current time and time a ping packet with a matching ''Data'' was sent)<br />
<br />
:<h4>TwoWayPing packet</h4><br />
:''Bidirectional''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x2B<br />
(43)<br />
| class="col1 centeralign" | Direction<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4 centeralign" | Direction of the ping.<br />
*0 if packet is client to server ping<br />
*1 if packet is server to client ping<br />
|- class="row2"<br />
| class="col1 centeralign" | Data<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>4534</code><br />
| class="col4 centeralign" | Unique/Random data for this particular ping packet.<br />
Data is usually just from a counter that is incremented each time this packet is sent.<br />
|- class="row12"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===InventoryOrder===<br />
:Allows servers to explicitly control the inventory's layout.<br />
:'''Motivation''': Allows users greater over the inventory, such as grouping related blocks, hiding blocks, etc.<br />
:'''Client Behavior''': If ''Order'' is 0, client must remove the given block from the inventory. Otherwise, the given inventory slot must be set to the given block (''e.g. Stone by default has slot 1''). Clients must not perform any reordering or eliding of slots. As such, there may be gaps between inventory slots, or the same block put in multiple inventory slots. Clients may optionally choose to not render completely empty rows in the inventory.<br />
:'''Server Behavior''': Servers decide how to handle multiple blocks being assigned to the same inventory slot, before sending '''SetInventoryOrder''' packets to the client. For example, servers may decide to do nothing, in which case the client shows the inventory slot as the block from the last packet sent. Alternatively, server may decide to move conflicting blocks into other free inventory slots, or some other method.<br />
<br />
:<h4>SetInventoryOrder packet</h4><br />
:''Server to client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x2C<br />
(44)<br />
| class="col1 centeralign" | Order<br />
| class="col2 centeralign" | unsigned byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4 centeralign" | Order of the block.<br />
*Order of 0 completely hides the block from inventory<br />
*Else, order is the 1-based position to put the block in<br />
|- class="row2"<br />
| class="col1 centeralign" | Block ID<br />
| class="col2 centeralign" | unsigned byte<br />
| class="col3 centeralign" | <code>45</code><br />
| class="col4 centeralign" | ID of the block being removed from or put in the inventory.<br />
|- class="row12"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===InstantMOTD===<br />
:Indicates a client supports receiving '''''Server Identification''''' packets at any time, not just before a map is sent.<br />
:'''Motivation''': Sending '''''Server Identification''''' packets is useful for changing MOTD variables (such as hacks statuses). However, some clients behave unpredictably when receiving a '''''Server Identification''''' packet without the whole map being resent afterwards.<br />
:'''Client Behavior''': Clients must be prepared to receive '''''Server Identification''''' packets at any time. Do not assume that a new map will be sent after receiving this packet.<br />
:'''Server Behavior''': Server must keep track of which clients it can safely send only '''''Server Identification''''' packets to, and which clients require the whole map to be resent afterwards.<br />
'''Note:''' No new packets are defined by this extension. <br />
<br />
===FastMap===<br />
:Reduces load on clients and servers by reducing the complexity of sending the map.<br />
:'''Motivation''': Clients and servers no longer need to compute or validate a CRC32 for the map data. Clients can also pre-allocate output buffers for decompression.<br />
:'''Client Behavior''': '''''LevelInit''''' packet data is changed to consist of a 32 bit integer (instead of no data), representing the size of the map. Data in '''''LevelDataChunk''''' packets must be decompressed using DEFLATE instead of GZIP algorithm.<br />
:'''Server Behavior''': Server must write a 32 bit integer for the '''''LevelInit''''' packet data, representing the size of the map. Data in '''''LevelDataChunk''''' packets must be compressed using DEFLATE instead of GZIP algorithm.<br />
'''Note:''' The uncompressed data is no longer prefixed by the size of the map, it purely consists of the data of the map.<br />
<br />
'''Note:''' DEFLATE means raw deflate, no ZLib header or footer. Behaviour of clients when decompressed data size does not equal the size specified in '''''LevelInit''''' packet is unspecified.<br />
<br />
===ExtendedTextures===<br />
:Allows using more than 256 unique textures.<br />
:'''Motivation''': Allows for more detailed maps, since each block can use up to six different textures.<br />
:'''Client Behavior''': Clients must read unsigned 16 bit integers (instead of 8 bit) for the ''TopTextureID,SideTextureID,BottomTextureID'' fields in a '''''DefineBlock''''' packet, and the ''TopTextureID,LeftTextureId,RightTextureId,FrontTextureId,BackTextureId,BottomTextureID'' fields in a '''''DefineBlockExt''''' packet. The texture ID should be read modulo client's maximum number of supported textures. (i.e. If client supports up to 512 textures, use ''ReadU16() & 0x1FF'')<br />
:'''Server Behavior''': Servers must write unsigned 16 bit integers (instead of 8 bit) for the aforementioned fields in '''''DefineBlock''''' and '''''DefineBlockExt''''' packets. Texture IDs should be written as 8 bits modulo 256 (i.e. ''WriteU8(id & 0xFF)'') for non-supporting clients.<br />
<br />
'''Note:''' Displaying more textures is achieved by increasing ''terrain.png'' to be 256x512 instead of 256x256 in size (or a multiple of that). Hence, [[Classic_Protocol_Extension#EnvMapAppearance|EnvMapAppearance extension]] or [[Classic_Protocol_Extension#EnvMapAspect|EnvMapAspect extension]] must be mutually supported for this extension to be useful.<br />
<br />
<br />
[[Category:Minecraft Classic]]</div>727021https://wiki.vg/index.php?title=Classic_Server_List&diff=14888Classic Server List2019-08-12T18:15:05Z<p>727021: Update MCSong link</p>
<hr />
<div>{{navboxclassic}}<br /><br />
This is a rather incomplete list of Minecraft Classic servers currently in development. This page only lists servers written from scratch. For mods and wrappers, see the [[Classic Wrapper List]].<br />
<br />
{| class="wikitable" style="width: auto; text-align: center;"<br />
|-style="background:#eee"<br />
!style="width: 72px" | Name<br />
!Author(s)<br />
!style="width: 128px" | Language<br />
!style="width: 128px" | License<br />
!style="width: 72px" | Threaded<br />
!style="width: 72px" | Scripting<br />
|-<br />
! [https://github.com/corey-/x86-Minecraft x86-Minecraft]<br />
| Corey<br />
| [http://en.wikipedia.org/wiki/X86_assembly_language x86 assembly]<br />
| [http://www.opensource.org/licenses/mit-license.php MIT]<br />
| {{yes}}<br />
| {{no}}<br />
|-<br />
! [http://dreadiscool.github.io/PowerBlock/ PowerBlock]<br />
| dreadiscool, Shadowwolf97, coehlo<br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| Public Domain<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://fcraft.net/ fCraft]<br />
| fragmer, Destroyer, Redshift <br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| MIT/X11<br />
| {{yes}}<br />
| {{no}}<br />
|-<br />
! [http://www.minecraftwiki.net/wiki/OpenCraft OpenCraft]<br />
| Graham Edgecombe, Brett, Søren,<br />
Mark, Trever Fischer, Adam Liszka <br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| [http://www.opensource.org/licenses/bsd-license.php New BSD License]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://github.com/OpenClassic/OpenClassic OpenClassic]<br />
| Steveice10<br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| [http://www.opensource.org/licenses/mit-license.php MIT]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://www.minecraftwiki.net/wiki/Myne Myne]<br />
| Gdude2002, Ikjames, Goober, Varriount, AndrewPH, Antoligy, NotMeh, ntfwc, PixelEater<br />
| [http://en.wikipedia.org/wiki/Python_(programming_language) Python]<br />
| Public Domain <br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://mcdzienny.cba.pl/ MCDzienny]<br />
| Dzienny<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| [http://opensource.org/licenses/ECL-2.0 ECL-2.0]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://www.mcforge.net/ MCForge]<br />
| Dmitchell94, 501st_commander, Edh649, GamezGalaxy, EricKilla, Soccer101nic, Headdetect, Merlin33069, Jasonbay13, Cazzar, Snowl, Techjar, Nerketur, Wouto1997, BeMacized, Shade2010 (Forgeware Inc.)<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| GPL v3/ECL v2<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://umby.d3s.co/CCD3/ D3]<br />
| Dadido3, Umby24<br />
| [http://en.wikipedia.org/wiki/PureBasic Purebasic]<br />
| MIT<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [https://github.com/727021/MCSong/ MCSong]<br />
| 727021<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| [http://opensource.org/licenses/ECL-2.0 ECL-2.0]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [https://github.com/SopaXorzTaker/classic-server Classic-Server]<br />
| SopaXorzTaker<br />
| [http://en.wikipedia.org/wiki/Python_(programming_language) Python]<br />
| GPLv3<br />
| {{yes}}<br />
| {{no}}<br />
|-<br />
! [https://github.com/dazed-sheep/dazed-sheep dazed-sheep]<br />
| mhsjlw<br />
| [https://en.wikipedia.org/wiki/Node.js Node.js]<br />
| [https://opensource.org/licenses/MIT MIT]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [https://github.com/meme/certain-elephant certain-elephant]<br />
| meme<br />
| [https://en.wikipedia.org/wiki/Erlang_(programming_language) Erlang]<br />
| [http://unlicense.org/ Unlicense]<br />
| {{yes}}<br />
| {{planned}}<br />
|-<br />
! [https://github.com/AnythingTechPro/redstone-classic Redstone Classic]<br />
| AnythingTechPro<br />
| [https://en.wikipedia.org/wiki/Python_(programming_language) Python]<br />
| BSD-3-Clause<br />
| {{yes}}<br />
| {{planned}}<br />
|-<br />
! [https://github.com/maxoufox/mmcs mmcs]<br />
| maxoufox<br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| [https://www.gnu.org/licenses/gpl-3.0.en.html GNU GPL-3.0]<br />
| {{yes}}<br />
| {{yes}} (Plugins)<br />
|-<br />
! [https://github.com/vexyl/MCHawk MCHawk]<br />
| Vexyl<br />
| [https://en.wikipedia.org/wiki/C%2B%2B C++]<br />
| [http://www.opensource.org/licenses/mit-license.php MIT]<br />
| {{No}}<br />
| {{Yes}}<br />
|-<br />
|}<br />
<br />
[[Category:Minecraft Classic]]</div>727021https://wiki.vg/index.php?title=Trash:Classic_Utility_List&diff=6919Trash:Classic Utility List2015-09-10T04:01:33Z<p>727021: Added navbox. There's something on the page now.</p>
<hr />
<div>{{navboxclassic}}<br /></div>727021https://wiki.vg/index.php?title=Classic_Protocol_Extension/Support&diff=6834Classic Protocol Extension/Support2015-08-27T02:45:54Z<p>727021: /* Servers */</p>
<hr />
<div>Number inside green fields indicates the supported extension version. Currently all extensions are at version 1, except for ExtPlayerList (which is at version 2).<br />
<br />
==Clients==<br />
{| class="wikitable"<br />
|<br />
!ClickDistance<br />
!CustomBlocks<br />
!HeldBlock<br />
!EmoteFix<br />
!TextHotKey<br />
!ExtPlayerList<br />
!EnvColors<br />
!SelectionCuboid<br />
!BlockPermissions<br />
!ChangeModel<br />
!EnvMapAppearance<br />
!EnvWeatherType<br />
!HackControl<br />
!MessageType<br />
!PlayerClick<br />
|-<br />
! [http://www.classicube.net/ ClassiCube Client]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{yes|2}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
|-<br />
! [http://github.com/xtreme8000/Mineshaft Mineshaft]<br />
| {{planned}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
|-<br />
! [https://github.com/UnknownShadow200/ClassicalSharp/ ClassicalSharp]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{yes|2}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
|}<br />
<br />
==Servers==<br />
{| class="wikitable"<br />
|<br />
!ClickDistance<br />
!CustomBlocks<br />
!HeldBlock<br />
!EmoteFix<br />
!TextHotKey<br />
!ExtPlayerList<br />
!EnvColors<br />
!SelectionCuboid<br />
!BlockPermissions<br />
!ChangeModel<br />
!EnvMapAppearance<br />
!EnvWeatherType<br />
!HackControl<br />
!MessageType<br />
!PlayerClick<br />
|-<br />
! [http://umby.d3s.co/CCD3/ D3]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://fcraft.net fCraft]<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{no}}<br />
|-<br />
! [http://femto.fcraft.net FemtoCraft]<br />
| {{no}}<br />
| {{yes|1}} (level 1)<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{no}}<br />
|-<br />
! [http://github.com/LeChosenOne/LegendCraft LegendCraft]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://gemscraft.net/ GemsCraft]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://mcforge.org/ MCForge-Redux]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [https://github.com/umby24/Hypercube Hypercube]<br />
| {{planned}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://mcsong.x10.mx/forums MCSong]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
|}</div>727021https://wiki.vg/index.php?title=Classic_Protocol_Extension/Support&diff=6811Classic Protocol Extension/Support2015-08-21T21:52:01Z<p>727021: /* Servers */</p>
<hr />
<div>Number inside green fields indicates the supported extension version. Currently all extensions are at version 1, except for ExtPlayerList (which is at version 2).<br />
<br />
==Clients==<br />
{| class="wikitable"<br />
|<br />
!ClickDistance<br />
!CustomBlocks<br />
!HeldBlock<br />
!EmoteFix<br />
!TextHotKey<br />
!ExtPlayerList<br />
!EnvColors<br />
!SelectionCuboid<br />
!BlockPermissions<br />
!ChangeModel<br />
!EnvMapAppearance<br />
!EnvWeatherType<br />
!HackControl<br />
!MessageType<br />
!PlayerClick<br />
|-<br />
! [http://www.classicube.net/ ClassiCube Client]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{yes|2}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
|-<br />
! [http://github.com/xtreme8000/Mineshaft Mineshaft]<br />
| {{planned}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
|-<br />
! [https://github.com/UnknownShadow200/ClassicalSharp/ ClassicalSharp]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{yes|2}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
|}<br />
<br />
==Servers==<br />
{| class="wikitable"<br />
|<br />
!ClickDistance<br />
!CustomBlocks<br />
!HeldBlock<br />
!EmoteFix<br />
!TextHotKey<br />
!ExtPlayerList<br />
!EnvColors<br />
!SelectionCuboid<br />
!BlockPermissions<br />
!ChangeModel<br />
!EnvMapAppearance<br />
!EnvWeatherType<br />
!HackControl<br />
!MessageType<br />
!PlayerClick<br />
|-<br />
! [http://umby.d3s.co/CCD3/ D3]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://fcraft.net fCraft]<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{no}}<br />
|-<br />
! [http://femto.fcraft.net FemtoCraft]<br />
| {{no}}<br />
| {{yes|1}} (level 1)<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{no}}<br />
|-<br />
! [http://github.com/LeChosenOne/LegendCraft LegendCraft]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://gemscraft.net/ GemsCraft]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://mcforge.org/ MCForge-Redux]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [https://github.com/umby24/Hypercube Hypercube]<br />
| {{planned}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://mcsong.x10.mx/forums MCSong]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|}</div>727021https://wiki.vg/index.php?title=Classic_Protocol_Extension/Support&diff=6703Classic Protocol Extension/Support2015-07-11T03:16:58Z<p>727021: Added MCSong to the table</p>
<hr />
<div>Number inside green fields indicates the supported extension version. Currently all extensions are at version 1, except for ExtPlayerList (which is at version 2).<br />
<br />
==Clients==<br />
{| class="wikitable"<br />
|<br />
!ClickDistance<br />
!CustomBlocks<br />
!HeldBlock<br />
!EmoteFix<br />
!TextHotKey<br />
!ExtPlayerList<br />
!EnvColors<br />
!SelectionCuboid<br />
!BlockPermissions<br />
!ChangeModel<br />
!EnvMapAppearance<br />
!EnvWeatherType<br />
!HackControl<br />
!MessageType<br />
!PlayerClick<br />
|-<br />
! [http://www.classicube.net/ ClassiCube Client]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{yes|2}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
|-<br />
! [http://github.com/xtreme8000/Mineshaft Mineshaft]<br />
| {{planned}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
|-<br />
! [https://github.com/UnknownShadow200/ClassicalSharp/ ClassicalSharp]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{yes|2}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
|}<br />
<br />
==Servers==<br />
{| class="wikitable"<br />
|<br />
!ClickDistance<br />
!CustomBlocks<br />
!HeldBlock<br />
!EmoteFix<br />
!TextHotKey<br />
!ExtPlayerList<br />
!EnvColors<br />
!SelectionCuboid<br />
!BlockPermissions<br />
!ChangeModel<br />
!EnvMapAppearance<br />
!EnvWeatherType<br />
!HackControl<br />
!MessageType<br />
!PlayerClick<br />
|-<br />
! [http://umby.d3s.co/CCD3/ D3]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://fcraft.net fCraft]<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{no}}<br />
|-<br />
! [http://femto.fcraft.net FemtoCraft]<br />
| {{no}}<br />
| {{yes|1}} (level 1)<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{no}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{no}}<br />
|-<br />
! [http://github.com/LeChosenOne/LegendCraft LegendCraft]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://gemscraft.net/ GemsCraft]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://mcforge.org/ MCForge-Redux]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{no}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [https://github.com/umby24/Hypercube Hypercube]<br />
| {{planned}}<br />
| {{yes|1}} (level 1)<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{no}}<br />
|-<br />
! [http://mcsong.x10.mx/forums MCSong]<br />
| {{yes|1}}<br />
| {{yes|1}} (level 1)<br />
| {{planned}}<br />
| {{no}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{no}}<br />
| {{planned}}<br />
| {{planned}}<br />
| {{yes|1}}<br />
| {{planned}}<br />
| {{no}}<br />
|}</div>727021https://wiki.vg/index.php?title=Classic_Protocol_Extension&diff=6702Classic Protocol Extension2015-07-11T03:12:38Z<p>727021: MCSong now supports CPE</p>
<hr />
<div>'''Classic Protocol Extension''' (CPE) is a project to augment the Minecraft Classic network protocol with new and improved functionality.<br />
<br />
Extensions are designed to keep extended clients and servers compatible with standard clients and servers. Standard clients and extended clients can play on the same server side-by-side. Extensions are designed to be modular: custom clients and servers can selectively implement any subset of extensions, and only mutually-supported extensions will be used.<br />
<br />
{| class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #f28500;background:#fbfbfb;width:80%;font-size:110%"<br />
|style="padding:10px"|'''This specification has not yet been finalized, and is subject to change.'''<br />
Last revision: 31 October 2014.<br />
Keep an eye on [[Classic Protocol Extension/History|the history subpage]] for a chronology of changes.<br />
|}<br />
{| class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #3dc238;background:#fbfbfb;width:80%;font-size:110%"<br />
|style="padding:10px"|'''Do you have an idea for an extension? Please post it on the [[Classic_Protocol_Extension/Proposals|Proposals]] subpage.'''<br />
|}<br />
<br />
==Support==<br />
:''See [[Classic Protocol Extension/Support|support subpage]] for a detailed table.''<br />
Custom servers that already support CPE: [http://femto.fcraft.net/ FemtoCraft], [http://umby.d3s.co/CCD3/ D3], [http://github.com/LeChosenOne/LegendCraft/ LegendCraft], [http://GemsCraftMC.weebly.com/ GemsCraft], [https://github.com/umby24/Hypercube Hypercube], [http://mcsong.x10.mx/forums/ MCSong]<br />
<br />
Custom servers that plan to add support: [http://800craft.net/ 800Craft], [http://github.com/tyteen4a03/cloudBox cloudBox], [http://www.fcraft.net/ fCraft], [https://github.com/GamezGalaxy/GGS/tree/Classic-Extension GGS]<br />
<br />
Custom clients that already support CPE: [http://classicube.net ClassiCube Client], [https://github.com/UnknownShadow200/ClassicalSharp/ ClassicalSharp]<br />
<br />
Custom clients that plan to add support: [http://charged-miners.com/ Charged Miners], [http://Client.GemsCraft.net/ GemsClient]<br />
<br />
==Negotiation==<br />
When CPE-capable client connects to a CPE-capable server, a brief negotiation needs to happen before any extensions are used. Client and server declare their capabilities and determine which extensions are mutually supported. '''All CPE-capable software is required to support this.'''<br />
<br />
[[File:CPE_Negotiation.png|frame|right]]<br />
'''Client behavior''': Extended clients must use magic number of <code>0x42</code> (<code>66</code> decimal) for the padding byte of the [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''ClientIdentification''''']] packet. It must then await a response. If server responds with any packet other than '''''ExtInfo''''', client must assume that the server does NOT support CPE. If the server responds with an '''''ExtInfo''''' packet, client must parse it and any '''''ExtEntry''''' packets that follow. Client must then compare its locally-supported set of extensions with the list of extensions provided by the server, and find an intersection of these sets. These are the mutually-supported extensions. Client must now send '''''ExtInfo''''' packet of its own, followed by a list of zero or more client-supported extensions. After sending the last of '''''ExtEntry''''' packets, client should activate all mutually-supported extensions and resume normal login procedure.<br />
<br />
'''Server behavior''': When a client connects, server must read the [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''ClientIdentification''''']] packet and check its padding byte. If this byte is set to <code>0x42</code> (<code>66</code> decimal), assume that the client supports CPE. If this byte is set to any other value, assume that the client does NOT support CPE.<br />
<br />
Server must immediately reply to CPE clients with an '''''ExtInfo''''' packet, followed by zero or more '''''ExtEntry''''' packets, and await a response from the client. Client will respond with one '''''ExtInfo''''' and zero or more '''''ExtEntry''''' packets. Server must then compare its locally-supported set of extensions with the list of extensions provided by the client, and find an intersection of these sets. These are the mutually-supported extensions. After receiving the last of '''''ExtEntry''''' packets, server should activate all mutually-supported extensions and resume normal login procedure. <br />
<br />
'''Note 1''': All standard/non-extended clients use <code>0x00</code> for the padding byte. All standard servers ignore this padding byte. Therefore, this negotiation process does not affect compatibility with standard software.<br />
<br />
'''Note 2''': Do not make any assumptions about supported functionality based on the ''AppName'' field of '''''ExtInfo''''' packet. It's for logging purposes only.<br />
<br />
'''Note 3''': Do not declare support for an extension until it is FULLY implemented, except for debugging.<br />
<br />
:<h4>ExtInfo Packet</h4><br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x10<br />
(16)<br />
| class="col1 centeralign" | AppName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>MyServer</code><br />
| class="col4" | Client or server software name<br />
|- class="row2"<br />
| class="col0 centeralign" | ExtensionCount<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | 1<br />
| class="col3" | Between 0 and 32767<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 67 bytes<br />
|}<br />
<br />
:<h4>ExtEntry Packet</h4><br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x11<br />
(17)<br />
| class="col1 centeralign" | ExtName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>MyExtension</code><br />
| class="col4" | Name of a supported extension<br />
|- class="row2"<br />
| class="col0 centeralign" | Version<br />
| class="col1 centeralign" | int<br />
| class="col2 centeralign" | 1<br />
| class="col3" | Only extensions with identical version numbers should be considered compatible.<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 69 bytes<br />
|}<br />
<br />
==Extensions==<br />
'''''Note:''''' The section heading is the name of the extension. Packet names are not same as extension names. For example, the first extension listed here is named "ClickDistance" and not "SetClickDistance".<br />
{| class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #3dc238;background:#fbfbfb;width:80%;font-size:110%"<br />
|style="padding:10px"|'''Do you have an idea for an extension? Please post it on the [[Classic_Protocol_Extension/Proposals|Proposals]] subpage.'''<br />
|}<br />
<br />
===ClickDistance===<br />
:Used to extend or restrict the distance at which client may click blocks, controlled by the server. Click range is given in player-space units (32 units per block). In Minecraft Classic, the default range is 160.<br />
:'''Motivation''': This extension allows trusted players to have a wider or virtually-unlimited reach. It may simplify operation of certain bots. Restricting the reach may allow new games/mini-games.<br />
:'''Client Behavior''': Upon receiving a '''''SetClickDistance''''' packet, client should immediately apply the change. ''Distance'' should persist between worlds/maps.<br />
:'''Server Behavior''': Server should send '''''SetClickDistance''''' packet when the server connects, or whenever their permitted click distance changes. Server should allow for some margin-of-error (+/- 1 block) when enforcing click distance restrictions.<br />
:<h4>SetClickDistance packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x12<br />
(18)<br />
| class="col1 centeralign" | Distance<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | 160<br />
| class="col4" |<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===CustomBlocks===<br />
:Used to add support for custom block types. Custom block IDs start at 50 (0x32). New block types will be added in batches, a few at a time. Both client and server declare which batch they support, and use the lower of the two versions. Claiming to support a batch implies fully implementing all the batches that came before it. If either server or client do not support this extension, only the standard 50 block types should be used.<br />
:'''Motivation''': Adding new visually distinct blocks, to enhance Classic players' experience.<br />
:'''Client behavior''': Client must expect a '''''CustomBlockSupportLevel''''' packet from a compatible server immediately after sending the last '''''ExtEntry''''' packet. It should then reply with its own '''''CustomBlockSupportLevel''''' packet, containing its actual support level. Client must then use the lower of the two levels in operation. Client must not send any block types that are not defined by the current support level. Client should expect [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''ServerIdentification''''']] packet only AFTER sending its '''''CustomBlockSupportLevel''''' packet.<br />
:'''Server behavior''': Server must send a '''''CustomBlockSupportLevel''''' packet to compatible clients immediately after receiving the last '''''ExtEntry''''' packet from the client. It should then wait to receive a '''''CustomBlockSupportLevel''''' packet from the client before sending the [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''ServerIdentification''''']] packet. Server must then use the lower of the two levels in operation. If this level is lower than the server's, it has to filter data sent to the client, to make sure that the client never receives any block types that it does not support. Each level will define what substitutions to use.<br />
<br />
:<h4>CustomBlockSupportLevel packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x13<br />
(19)<br />
| class="col1 centeralign" | SupportLevel<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | 1<br />
| class="col4" |<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 2<br />
|}<br />
<br />
:<h4>Blocks in support level 1</h4><br />
:Client must be able to receive/render all 16 custom blocks to claim support. Server must be able to receive/store all 16 custom blocks to claim support.<br />
:[[File:CPE_CustomBlocks_Level1.png]]<br />
:{| class="wikitable"<br />
!Block name<br />
!Block ID<br />
!Fallback name<br />
!Fallback ID<br />
|-<br />
|'''CobblestoneSlab'''<br />
|0x32 (50)<br />
|Slab<br />
|0x2C (44)<br />
|-<br />
|'''Rope'''<br />
|0x33 (51)<br />
|BrownMushroom<br />
|0x27 (39)<br />
|-<br />
|'''Sandstone'''<br />
|0x34 (52)<br />
|Sand<br />
|0x0C (12)<br />
|-<br />
|'''Snow'''<br />
|0x35 (53)<br />
|Air<br />
|0x00 (0)<br />
|-<br />
|'''Fire'''<br />
|0x36 (54)<br />
|Lava<br />
|0x0A (10)<br />
|-<br />
|'''LightPinkWool'''<br />
|0x37 (55)<br />
|Pink<br />
|0x21 (33)<br />
|-<br />
|'''ForestGreenWool'''<br />
|0x38 (56)<br />
|Green<br />
|0x19 (25)<br />
|-<br />
|'''BrownWool'''<br />
|0x39 (57)<br />
|Dirt<br />
|0x03 (3)<br />
|-<br />
|'''DeepBlue'''<br />
|0x3A (58)<br />
|Blue<br />
|0x1d (29)<br />
|-<br />
|'''Turquoise'''<br />
|0x3B (59)<br />
|Cyan<br />
|0x1c (28)<br />
|-<br />
|'''Ice'''<br />
|0x3C (60)<br />
|Glass<br />
|0x14 (20)<br />
|-<br />
|'''CeramicTile'''<br />
|0x3D (61)<br />
|Iron<br />
|0x2a (42)<br />
|-<br />
|'''Magma'''<br />
|0x3E (62)<br />
|Obsidian<br />
|0x31 (49)<br />
|-<br />
|'''Pillar'''<br />
|0x3F (63)<br />
|White<br />
|0x24 (36)<br />
|-<br />
|'''Crate'''<br />
|0x40 (64)<br />
|WoodenPlanks<br />
|0x05 (5)<br />
|-<br />
|'''StoneBrick'''<br />
|0x41 (65)<br />
|Stone<br />
|0x01 (1)<br />
|}<br />
<br />
:Block IDs for future support levels are guaranteed to be assigned monotonically, incrementally, and permanently.<br />
<br />
===HeldBlock===<br />
:Provides a way for the client to notify the server about the blocktype that it is currently holding, and for the server to change the currently-held block type. <br />
:'''Motivation''': This allows server to know which block player is holding, for example for drawing commands, without needing to wait for the player's click. It also allows for features like [http://www.fcraft.net/wiki//Spectate /Spectate] to show what block a spectated player is holding.<br />
:'''Client behavior''': When this extension is mutually supported, client should use the ''PlayerID'' field of the '''''[[Classic_Protocol#Client_.E2.86.92_Server_packets|PositionAndOrientation]]''''' packet (currently unused) to indicate which blocktype the client is currently holding. It should be ready to accept '''''HoldThis''''' packets to change the block that the player is holding. If <code>0</code> is given for ''BlockToHold'', client should hide the hand/block from the screen, and should not be able to click blocks, until they switch to a different blocktype. If an unrecognized blocktype is given, no action is needed.<br />
:'''Server behavior''': The server can use '''''HoldThis''''' packet to force the client to hold the desired block type. It should be done sparingly.<br />
<br />
:<h4>HoldThis packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x14<br />
(20)<br />
| class="col1 centeralign" | BlockToHold<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>49</code><br />
| class="col4" | Standard block type<br />
|- class="row2"<br />
| class="col1 centeralign" | PreventChange<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | 0<br />
| class="col4" |0 = Allow player to change blocktype<br />
1 = Prevent player from changing blocktype<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===EmoteFix===<br />
:This extension indicates that the client can render [http://fcraft.net/wiki/Emotes emotes] (ASCII control characters) in chat properly, without padding or suffixes that are required for vanilla client. This extension does not define any new packets.<br />
:'''Motivation''': To improve appearance of emotes in chat.<br />
:'''Client behavior''': Client should not emulate vanilla client's quirks.<br />
:'''Server behavior''': Server should not pad or suffix emotes in chat.<br />
<br />
===TextHotKey===<br />
:This extension allows the server to define "hotkeys" for certain commands.<br />
:'''Motivation''': To speed up and simplify access to commonly-used commands and command macros by providing server-defined client-side hotkeys.<br />
:'''Client behavior:''' Client should not try to persist previously-defined hotkeys between sessions. When a defined hotkey is activated by the user, client should open up a text prompt and type in contents of the ''Action'' field. A newline character (<code>\n</code>) in the ''Action'' field indicates that whatever is currently typed-in should be sent to the server. If ''Action'' does not end with a newline, text prompt should be left open, for the user to complete. Client may provide a way for the user to see a list of currently-defined hotkeys, and a way to notify the user when a hotkey was activated.<br />
:'''Server behavior:''' The server should send a definition of each hotkey ('''''SetTextHotKey''''' packet) once per connection.<br />
<br />
:<h4>SetTextHotKey packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x15<br />
(21)<br />
| class="col1 centeralign" | Label<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Copy</code><br />
| class="col4" | Readable name of the hotkey<br />
|- class="row2"<br />
| class="col1 centeralign" | Action<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>/Copy </code><br />
| class="col4" | Text to type in<br />
|- class="row2"<br />
| class="col1 centeralign" | KeyCode<br />
| class="col2 centeralign" | int<br />
| class="col3 centeralign" | <code>113</code><br />
| class="col4" | [http://www.minecraftwiki.net/wiki/Key_Codes LWJGL keycode] of the key<br />
|- class="row3"<br />
| class="col1 centeralign" | KeyMods<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Key modifier [http://en.wikipedia.org/wiki/Flag_word flags], may be combined:<br />
* 0 = None<br />
* 1 = Ctrl<br />
* 2 = Shift<br />
* 4 = Alt<br />
|- class="row4"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 134 bytes<br />
|}<br />
<br />
===ExtPlayerList===<br />
:'''Motivation''': Provides more flexibility in naming of players and loading of skins, autocompletion, and player tab-list display. Separates tracking of in-game entities (spawned player models) and names on the player list. '''''ExtAddPlayerName'''''/'''''ExtRemovePlayerName''''' packets take over managing the player names list (tab-list), and '''''ExtAddEntity2'''''/'''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|DespawnPlayer]]''''' packets are used only to manage in-game entities.<br />
<br />
====Version 1 (Deprecated since 28 August 2014)====<br />
:This version of the extension has been deprecated and replaced with version 2. See [[Classic Protocol Extension/Old Extensions|old extensions subpage]].<br />
<br />
====Version 2====<br />
Version 2 of this extension replaces '''''ExtAddEntity''''' packet with '''''ExtAddEntity2''''', allows using full URLs for ''SkinName'', and clarifies interaction with [[#ChangeModel|'''ChangeModel''']] extension.<br />
:<h5>Client Behavior</h5><br />
:When '''''ExtAddPlayerName''''' packet is received for an unrecognized ''NameID'', a new name must be added to the player-name list. When receiving '''''ExtAddPlayerName''''' packet for an already-listed ''NameID'', client must update its ''ListName'', ''GroupName'', and ''GroupRank''. Player-name list must persist when client changes worlds/maps.<br />
<br />
:When an '''''ExtAddEntity2''''' packet is received, it must be treated as the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SpawnPlayer]]''''' packet. A player model must be spawned in-game at the given location, with ''InGameName'' text drawn above it. Skin should be loaded using the given ''SkinName'' for a player name. When client receives '''''ExtAddEntity2''''' packet for an already-spawned player, a duplicate entity must not be spawned and existing entity's position must not be changed. Instead their ''InGameName'' and ''SkinName'' must be updated. If a negative ''EntityID'' is given for '''''ExtAddEntity2''''', client must update player's own spawn point, ''InGameName'', and ''SkinName''. The client must ignore regular '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SpawnPlayer]]''''' packets, if any are received.<br />
<br />
:Player entity's skin should be loaded using the given ''SkinName''. If ''SkinName'' appears to be a player name, skin should be downloaded from the default skin server. If ''SkinName'' appears to be a full URL to a PNG image (starts with <code>http://</code> or <code>https://</code> and ends with <code>.png</code>) then skin should be downloaded from that URL. If image is correctly sized/proportioned to use as a skin for the current model, it should be used. If a blank or unrecognized value is given for ''SkinName'', or if given image could not be downloaded or used, then the default skin should be used.<br />
<br />
:Names on the player-name list should be grouped by ''GroupName'' in the player-name list. Names within a ''GroupName'' should be sorted by ''GroupRank'' (in ascending order). Names with the same ''GroupName'' and ''GroupRank'' should be sorted alphabetically by ''ListName''. Color codes may be either drawn or stripped from ''ListName'', ''GroupName'', and ''InGameName''.<br />
<br />
:When a standard '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|DespawnPlayer]]''''' packet is received for a recognized ''EntityID'', player model must be removed from a world. When '''''ExtRemovePlayerName''''' packet is received for a recognized ''NameID'', their name must be removed from player-name list. Packets with out-of-range or unrecognized ''NameID''s must be ignored.<br />
<br />
:In-game entities must never be affected by '''''ExtAddPlayerName''''' or '''''ExtRemovePlayerName''''' packets. Player name list must never be affected by '''''ExtAddEntity2''''' or '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|DespawnPlayer]]''''' packets.<br />
<br />
:<h5>Server Behavior</h5><br />
{| class="wikitable" style="float:right"<br />
!Event<br />
!Packet to send<br />
|-<br />
|Player connects to server<br />
|'''''ExtAddPlayerName'''''<br />
|-<br />
|Player enters map<br />
|'''''ExtAddEntity2'''''<br />
|-<br />
|Player leaves map<br />
|'''''DespawnPlayer'''''<br />
|-<br />
|Player disconnects from server<br />
|'''''ExtRemovePlayerName'''''<br />
|}<br />
:Unique ''NameID'' between 0 and 255 should be assigned to every online player. When a new player connects to the server, '''''ExtAddPlayerName''''' must be sent. ''GroupName'' and ''GroupRank'' can be used in any way, for example to group players by map/world or rank/class/faction. Server must use '''''ExtAddEntity2''''' in place of standard '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SpawnPlayer]]''''' packet. Server should re-send '''''ExtAddPlayerName''''' packet, using the identical ''NameID'', when player's ''ListName'', ''GroupName'', or ''GroupRank'' change. Server must reliably send an '''''ExtRemovePlayerName''''' packet when the player disconnects. Color codes are permitted in ''ListName'', ''GroupName'', and ''InGameName''.<br />
<br />
:<h5>ExtAddPlayerName Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="5" | 0x16<br />
(22)<br />
| class="col1 centeralign" | NameID<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row2"<br />
| class="col1 centeralign" | PlayerName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Notch</code><br />
| class="col4" | Player name used for autocompletion.<br />
May be left empty (to exclude from autocompletion).<br />
|- class="row3"<br />
| class="col1 centeralign" | ListName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>&c[Op]Notch</code><br />
| class="col4" |Name displayed in the in-game list.<br />
|- class="row4"<br />
| class="col1 centeralign" | GroupName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Staff</code><br />
| class="col4" |May be left blank.<br />
|- class="row5"<br />
| class="col1 centeralign" | GroupRank<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Rank of a player within the group.<br />
Lower-number ranks are listed before higher-number ranks.<br />
|- class="row6"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 196 bytes<br />
|}<br />
<br />
:<h5>ExtAddEntity2 Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="8" | 0x21<br />
(33)<br />
| class="col1 centeralign" | EntityID<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Between 0 and 127<br />
|- class="row2"<br />
| class="col1 centeralign" | InGameName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>&cNotch</code><br />
| class="col4" | Player name to be shown in-game, hovering above player model.<br />
|- class="row3"<br />
| class="col1 centeralign" | SkinName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Notch</code><br />
| class="col4" | Player name whose skin should be used by the client.<br />
|- class="row4"<br />
| class="col1 centeralign" | SpawnX<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | X coordinate (32 units per block) of entity's spawn location.<br />
|- class="row5"<br />
| class="col1 centeralign" | SpawnY<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>2</code><br />
| class="col4" | Y coordinate (32 units per block) of entity's spawn location.<br />
|- class="row6"<br />
| class="col1 centeralign" | SpawnZ<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>3</code><br />
| class="col4" | Z coordinate (32 units per block) of entity's spawn location.<br />
|- class="row7"<br />
| class="col1 centeralign" | SpawnYaw<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>4</code><br />
| class="col4" | Orientation (left-right) at the entity's spawn location.<br />
|- class="row8"<br />
| class="col1 centeralign" | SpawnPitch<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Orientation (up-down) at the entity's spawn location.<br />
|- class="row9"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 138 bytes<br />
|}<br />
<br />
:<h5>ExtRemovePlayerName Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x18<br />
(24)<br />
| class="col1 centeralign" | NameID<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Between 0 and 255<br />
Matches NameID of the ExtAddPlayerName packet<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===EnvColors===<br />
:This extension allows server to alter some of the colors used by the client in environment rendering.<br />
:'''Motivation''': To allow the server to give worlds/maps a unique feel: time-of-day, weather/climate, lighting effect, etc.<br />
:'''Client behavior''': Client must check for '''''EnvSetColor''''' packets right before '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet, and apply these changes before the map is displayed. Client must be able to read this packet at other times, but it is not required to then apply the changes immediately. If an unrecognized or unsupported ''Variable'' field is given, no action is needed. If an out-of-range color is given by the server (i.e. if any of ''Red'', ''Green'', or ''Blue'' is less than <code>0</code> or greater than <code>255</code>), then the specified ''Variable'' should be reset to its default value.<br />
:'''Server behavior''': Server should normally only use '''''EnvSetColor''''' packets right before the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet. To reset a variable to its default value, the server should send a packet with value <code>-1</code> for ''Red'', ''Green'', and ''Blue''.<br />
<br />
:<h4>EnvSetColor Packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x19<br />
(25)<br />
| class="col1 centeralign" | Variable<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | Enumeration of environmental variables<br />
*0 = sky color<br />
*1 = cloud color<br />
*2 = fog color<br />
*3 = ambient light (blocks in shadow) color<br />
*4 = diffuse light (sunlight) color<br />
|- class="row2"<br />
| class="col1 centeralign" | Red<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>25</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row3"<br />
| class="col1 centeralign" | Green<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>128</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row4"<br />
| class="col1 centeralign" | Blue<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row5"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 8 bytes<br />
|}<br />
<br />
===SelectionCuboid===<br />
:'''Motivation''': Allows the server to highlight parts of a world. Applications include zoning, previewing draw commands, previewing undo commands.<br />
:'''Coordinates''': {''StartX'',''StartY'',''StartZ''} are coordinates of the block inside the selection that is closest to the map origin. {''EndX'',''EndY'',''EndZ''} are coordinates of the block inside the selection that is furthest from the map origin. Therefore, the resulting selection has dimensions {''EndX''-''StartX''+1, ''EndY''-''StartY''+1, ''EndZ''-''StartZ''+1).<br />
:'''Client behavior''': Client should be ready to receive '''''MakeSelection''''' packets any time after '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet. Upon receiving the packet, a translucent cuboid should appear in the world. The cuboid may feature a plain or "grid" texture. Selections that extend outside the map may be either ignored or clipped to fit. Selections with inconsistent coordinates (e.g. where ''StartX''<''EndX'') may either be ignored or re-ordered. Out-of-range values for ''Red'', ''Green'', ''Blue'', and ''Opacity'' should be clipped to fit the valid range. Supporting ''Opacity'' is optional: the client may opt to provide fixed opacity instead. When map changes (i.e. when '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelInitialize]]''''' packet is received), all existing selections should be removed. '''''RemoveSelection''''' packets that refer to non-existent ''SelectionID''s should be ignored.<br />
:'''Server behavior''': All given coordinates must be contained within the map. End coordinates should be higher or equal than start coordinates.<br />
<br />
:<h4>MakeSelection packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="12" | 0x1A<br />
(26)<br />
| class="col1 centeralign" | SelectionID<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Numeric ID of the selection. Between 0 and 127.<br />
|- class="row2"<br />
| class="col1 centeralign" | Label<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>SomeZone</code><br />
| class="col4" | Text label associated with the selection<br />
|- class="row3"<br />
| class="col1 centeralign" | StartX<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | X coordinate of the starting point<br />
|- class="row4"<br />
| class="col1 centeralign" | StartY<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>2</code><br />
| class="col4" | Y coordinate of the starting point<br />
|- class="row5"<br />
| class="col1 centeralign" | StartZ<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>3</code><br />
| class="col4" | Z coordinate of the starting point<br />
|- class="row6"<br />
| class="col1 centeralign" | EndX<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | X coordinate of the ending point<br />
|- class="row7"<br />
| class="col1 centeralign" | EndY<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>6</code><br />
| class="col4" | Y coordinate of the ending point<br />
|- class="row8"<br />
| class="col1 centeralign" | EndZ<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>7</code><br />
| class="col4" | Z coordinate of the ending point<br />
|- class="row9"<br />
| class="col1 centeralign" | Red<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>255</code><br />
| class="col4" |Between 0 and 255.<br />
|- class="row10"<br />
| class="col1 centeralign" | Green<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>34</code><br />
| class="col4" |Between 0 and 255.<br />
|- class="row11"<br />
| class="col1 centeralign" | Blue<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>128</code><br />
| class="col4" |Between 0 and 255.<br />
|- class="row12"<br />
| class="col1 centeralign" | Opacity<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>255</code><br />
| class="col4" | 0 = fully transparent<br />
255 = fully opaque<br />
|- class="row4"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 86 bytes<br />
|}<br />
<br />
:<h4>RemoveSelection packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x1B<br />
(27)<br />
| class="col1 centeralign" | SelectionID<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 2 bytes<br />
|}<br />
<br />
===BlockPermissions===<br />
:This extension allows the server to instruct the player that certain block types are allowed/disallowed to be placed or deleted.<br />
:'''Motivation''': To prevent players from inadvertently placing or removing prohibited block types (e.g. water, lava, grass, admincrete), before it even reaches the server.<br />
:'''Client behavior:''' Client should prevent placement of prohibited block types (by graying out or hiding blocks in block-selection screen, or any other effective means). Client should prevent player from deleting prohibited block types. Client must be ready to receive '''''SetBlockPermission''''' packet after map load ('''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet). Permission changes should take effect as soon as packet is received. Admincrete (solid block) permissions set by '''''SetBlockPermission''''' must always override permission set by '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|ServerIdentification]]''''' and '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|UpdateUserType]]''''' packets. If ''BlockType'' is set to <code>0</code>, given permissions should affect ALL block types at once, overriding permissions set by any earlier packets. Permissions must persist between map changes. Client may optionally warn the player attempting to place/delete prohibited blocks via sound effect, visual effect, chat message, etc.<br />
:'''Server behavior:''' Server may send '''''SetBlockPermission''''' packets any time after map load ('''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet). Any valid block ID may be specified for ''BlockType'', including custom blocks (if [[#CustomBlocks|CustomBlocks extension]] is mutually supported). ''BlockType'' may be set to <code>0</code> to set permissions for ALL block types at once. Server must not assume that client is compliant/obedient, and server must still verify each '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SetBlock]]''''' packet coming from the client. What to do with non-complying clients (kick or warn) is up to you.<br />
<br />
:<h4>SetBlockPermission packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1C<br />
(28)<br />
| class="col1 centeralign" | BlockType<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>8</code><br />
| class="col4" | Block's numeric ID (anything between 1 and max defined block).<br />
|- class="row2"<br />
| class="col1 centeralign" | AllowPlacement<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | 0 = Prohibited<br />
1 or any other value = Allowed<br />
|- class="row2"<br />
| class="col1 centeralign" | AllowDeletion<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | 0 = Prohibited<br />
1 or any other value = Allowed<br />
|- class="row4"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 4 bytes<br />
|}<br />
<br />
===ChangeModel===<br />
:Allows changing appearance of player models in supporting clients.<br />
<h5>Client Behavior</h5><br />
:The client will receive an ''EntityID'' and a string value containing the model name. The client will then change the model of the player whose ID is the same as the received '''''AddEntity''''', '''''ExtAddEntity''''', or '''''ExtAddEntity2''''' packet. The model name will be parsed by the model manager and the model changed in game. If the model does not exists in the model manager or is 0-length, change the model back to humanoid. Alternatively, you can send the client an int converted to a string which represents a valid Block ID. An ''EntityID'' of -1 (255 unsigned) indicates the player's own model. If model is set to <code>humanoid</code>, player-specific skin should be used. For all other models, default model-specific textures should be used.<br />
<br />
<h5>Server Behavior</h5><br />
:The server may send an ''EntityID'' and then a ''ModelName'' to the client for a desired entity. The model name must be chosen from the list below. To reset the model to default, server should set ''ModelName'' to <code>humanoid</code> or to an empty string.<br />
<br />
<h5>Interaction with ExtPlayerList</h5><br />
:If an '''''ExtAddEntity2''''' packet is received for a non-<code>humanoid</code> entity and ''SkinName'' specifies a full URL, that image should be downloaded and used as a texture for the currently model. Receiving another '''''ExtAddEntity2''''' packet should either update this texture (if ''SkinName'' is a full URL) or reset it back to default (if ''SkinName'' is anything else). Receiving another '''''ChangeModel''''' packet with a non-<code>humanoid</code> ''ModelName'' should reset texture back to model-specific default. <br />
<br />
:<h4>ChangeModel Packet</h4><br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x1D<br />
(29)<br />
| class="col0 centeralign" | EntityID<br />
| class="col1 centeralign" | byte<br />
| class="col2 centeralign" | 5<br />
| class="col3" | Between 0 and 127. <br />
|- class="row2"<br />
| class="col1 centeralign" | ModelName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>spider</code><br />
| class="col4" | The name of the model to be used OR a valid Block ID as a string.<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 66 bytes<br />
|}<br />
<br />
:<h4>Available models</h4><br />
:Client can render any or none of the below, but it is down to the client to handle what can and cannot be rendered if the packet is received<br />
:{| class="wikitable"<br />
!Model Name<br />
!Model String<br />
|-<br />
|'''Chicken'''<br />
|<code>chicken</code><br />
|-<br />
|'''Block Model'''<br />
|A valid block ID as a string<br />
|-<br />
|'''Creeper'''<br />
|<code>creeper</code><br />
|-<br />
|'''Crocodile'''<br />
|<code>croc</code><br />
|-<br />
|'''Humanoid'''<br />
|<code>humanoid</code> (or an invalid model name)<br />
|-<br />
|'''Pig'''<br />
|<code>pig</code><br />
|-<br />
|'''Printer'''<br />
|<code>printer</code><br />
|-<br />
|'''Sheep'''<br />
|<code>sheep</code><br />
|-<br />
|'''Skeleton Archer'''<br />
|<code>skeleton</code><br />
|-<br />
|'''Spider'''<br />
|<code>spider</code><br />
|-<br />
|'''Zombie'''<br />
|<code>zombie</code><br />
|-<br />
|}<br />
<br />
===EnvMapAppearance===<br />
:This extension allows the server to specify custom terrain textures, and tweak appearance of map edges.<br />
:'''Motivation''': To provide more ways to customize map appearance, including functionality that's currently provided by [http://files.worldofminecraft.com/texturing/ World of Minecraft's scheme].<br />
:'''Client behavior:''' Client must be able to receive '''''EnvSetMapAppearance''''' packets any time during level load (after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is received and until the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet is received). If the ''TextureURL'' field is blank or if the given file could not be loaded for any reason, then the texture pack should be reset to client's default. If an unsupported block ID is given for ''SideBlock'' or ''EdgeBlock'', it should be ignored. Given ''SideLevel'' value should be adjusted to fit between <code>0</code> and <code>MapDepth</code>, if necessary. Client should keep using these appearance parameters for future maps, unless specified otherwise by the server.<br />
:'''Server behavior:''' Server may send '''''EnvSetMapAppearance''''' packets after the last '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is sent for a level. Server should not use any custom block IDs unless the client declared the appropriate [[#CustomBlocks|CustomBlocks]] support level. To reset the texture pack to default value, server should send an '''''EnvMapAppearance''''' packet with empty string for ''TextureURL''. To reset other fields, server should simply use the default values (listed below).<br />
:'''Block type restrictions:''' Only solid blocks are allowed to be used for ''SideBlock'' and ''EdgeBlock''. Sprites (Sapling, Dandelion, Rose, BrownMushroom, RedMushroom, Rope, Fire) partial-height blocks (Slab, CobblestoneSlab, Snow), and transparent blocks (Air, Leaves, Glass) cannot be used for those fields.<br />
<br />
:<h4>EnvSetMapAppearance packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1E<br />
(30)<br />
| class="col1 centeralign" | TextureURL<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>http://somesite.net/terrain.png</code><br />
| class="col4" | Skin's full URL.<br />
Must be an HTTP URL, ending with .png, and served with <code>image/png</code> mime type.<br />
|- class="row2"<br />
| class="col1 centeralign" | SideBlock<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>7</code><br />
| class="col4" | Block ID. Default value is 7 (Admincrete).<br />
|- class="row3"<br />
| class="col1 centeralign" | EdgeBlock<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>8</code><br />
| class="col4" | Block ID. Default value is 8 (Water).<br />
|- class="row4"<br />
| class="col1 centeralign" | SideLevel<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>31</code><br />
| class="col4" | Elevation from bottom of the map, in blocks.<br />
Value should be between <code>0</code> and <code>MapDepth</code>.<br />
Default value is <code>MapDepth/2</code>.<br />
|- class="row5"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 69 bytes<br />
|}<br />
<br />
===EnvWeatherType===<br />
:This extension allows the server to trigger special weather conditions (like rain and snow) on demand.<br />
:'''Motivation''': To allow the server to give worlds/maps a unique feel with weather effects, e.g. for adventure maps.<br />
:'''Client behavior''': Client must be able to receive '''''EnvWeather''''' packets at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is received, and apply these changes immediately. If an unrecognized or unsupported ''WeatherType'' field is given, no action is needed.<br />
:'''Server behavior''': Server may send '''''EnvSetColor''''' packets to connected clients at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is sent.<br />
<br />
:<h4>EnvSetWeatherType Packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1F<br />
(31)<br />
| class="col1 centeralign" | WeatherType<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | Enumeration of weather types<br />
*0 = sunny<br />
*1 = raining<br />
*2 = snowing<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 2 bytes<br />
|}<br />
<br />
===HackControl===<br />
:This extension allows the server to control cheats/hacks in the client.<br />
:'''Motivation''': To allow fine-grained control over cheats/hacks on multi-world servers.<br />
:'''Client behavior''': Client must be able to receive '''''HackControl''''' packets at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is received, and apply these changes immediately. Unrecognized or unsupported values for any field should be ignored. Clients may approximate ''JumpHeight'' by rounding down to the nearest half-block (i.e. nearest multiple of 16), if needed. If a negative value is given for ''JumpHeight'', client should reset jump height to its default setting (around <code>40</code> in vanilla Minecraft).<br />
:'''Server behavior''': Server may send '''''HackControl''''' packets to connected clients at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is sent.<br />
<br />
:<h4>HackControl Packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="6" | 0x20<br />
(32)<br />
| class="col1 centeralign" | Flying<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
*0 = Prevent player from flying<br />
*1 = Allow flying<br />
|-<br />
| class="col1 centeralign" | NoClip<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
*0 = Prevent player from no-clipping (passing through solid blocks)<br />
*1 = Allow no-clipping<br />
|-<br />
| class="col1 centeralign" | Speeding<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
*0 = Only allow normal walking speed.<br />
*1 = Allow moving at any speeds.<br />
|-<br />
| class="col1 centeralign" | SpawnControl<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" |<br />
*0 = Prevent player from pressing [R] to respawn, or using [Enter] to change spawn.<br />
*1 = Allow player to respawn / change spawn.<br />
|-<br />
| class="col1 centeralign" | ThirdPersonView<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" |<br />
*0 = Disallow third-person view (only first-person view allowed).<br />
*1 = Allow third-person view.<br />
|-<br />
| class="col1 centeralign" | JumpHeight<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>40</code><br />
| class="col4" | Maximum height, in terms of player movement units (1/32<sup>nd</sup>s of a block), to which the player is allowed to jump.<br />
Negative value (e.g. <code>-1</code>) means that the client should use its default jump height.<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 8 bytes<br />
|}<br />
<br />
===MessageTypes===<br />
[[Image:Messagetypes.PNG|right|700px|Examples of all possible MessageTypes.]]<br />
:This extension adds new ways of presenting messages in the client.<br />
:'''Motivation''': To enhance the display of announcements and status information, and to reduce chat clutter.<br />
:'''Client behavior''': When this extension is mutually supported, the ''PlayerID'' field of the standard server-to-client [[Classic_Protocol#Server_.E2.86.92_Client_packets|'''''Message''''']] packet should be treated as a ''MessageType'' code. Unrecognized or unsupported codes may be ignored (in which case the message should be presented as a regular chat message). When connected to non-supporting servers, this field should be ignored.<br />
:'''Server behavior''': Server may use the ''PlayerID'' field of the [[Classic_Protocol#Server_.E2.86.92_Client_packets|'''''Message''''']] packet to set a ''MessageType''. For non-supporting clients, this field should always be set to <code>0</code>.<br />
<br />
:{| class="wikitable"<br />
!MessageType<br />
!Meaning<br />
!Suggested Implementation<br />
|-<br />
|<code>0</code><br />
|Chat<br />
|Normal message, shown in the chat area.<br />
|-<br />
|<code>1</code><br />
|Status1<br />
|Shown persistently in the top-right corner of the screen, in regular font.<br />
|-<br />
|<code>2</code><br />
|Status2<br />
|Shown persistently just below Status1<br />
|-<br />
|<code>3</code><br />
|Status3<br />
|Shown persistently just below Status2<br />
|-<br />
|<code>11</code><br />
|BottomRight1<br />
|Shown persistently in the bottom-right corner of the screen, in regular font.<br />
|-<br />
|<code>12</code><br />
|BottomRight2<br />
|Shown persistently just above BottomRight1<br />
|-<br />
|<code>13</code><br />
|BottomRight3<br />
|Shown persistently just above BottomRight2<br />
|-<br />
|<code>100</code><br />
|Announcement<br />
|Pops up in larger font near the top-center of the screen. Fades out after a few seconds.<br />
|}<br />
<br />
:This extension does not define any new packets.<br />
<br />
===PlayerClick===<br />
:This extension lets the server receive details of every mouse click a player makes, including targeting information.<br />
:'''Motivation''': To allow for the creation of more interactive maps: interactive buttons, cannons, ability to "tag" or "shoot" other players, ability to drag-to-draw at a distance, etc.<br />
:'''Client Behavior''': When this extension is mutually supported, a '''''PlayerClicked''''' packet should be sent to the server, as soon as reasonably possible, every time the user presses or releases a mouse button. Mouse interactions that happen while player is interacting with chat, with GUI menus, or with any other application must NOT be sent. A matching "released" event must be sent for every "pressed" event.<br />
<br />
:High resolution up-to-date ''Yaw'' and ''Pitch'' for the player should be transmitted with every packet. If player is currently targeting another entity/player ''TargetEntityID'' fields should be set. If player is currently targeting a block (within permitted [[Classic_Protocol_Extension#ClickDistance|ClickDistance]]) ''TargetBlockX'', ''TargetBlockY'', ''TargetBlockZ'', and ''TargetBlockFace'' should be set. An out-of-range value should be used for these fields when they are not in use. These packets should not be sent during level transitions (after receiving '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelInitialize]]''''' and until receiving '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packets).<br />
:'''Server Behavior''': Server must be ready to accept any number of '''''PlayerClicked''''' packets at any time after level sending has completed. What to do with this information is entirely up to the server.<br />
<h4>PlayerClicked packet</h4><br />
:''Client to Server''<br />
:{| class="wikitable"<br />
|-<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Example<br />
! Notes<br />
|-<br />
| class="centeralign" rowspan="9" | 0x22 (34)<br />
| class="centeralign" | Button<br />
| class="centeralign" | byte<br />
| class="centeralign" | 0<br />
| class="centeralign" | 0 = Left click, 1 = Right Click, 2 = Middle click<br />
|-<br />
| class="centeralign" | Action<br />
| class="centeralign" | byte<br />
| class="centeralign" | 0<br />
| class="centeralign" | 0 = Pressed, 1 = Released<br />
|-<br />
| class="centeralign" | Yaw<br />
| class="centeralign" | short<br />
| class="centeralign" | 0<br />
| class="centeralign" | Yaw (heading) of the player.<br />
Same function as ''Yaw'' field of '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|PositionAndOrientation]]''''' packet, but with more precision. <br />
|-<br />
| class="centeralign" | Pitch<br />
| class="centeralign" | short<br />
| class="centeralign" | 0<br />
| class="centeralign" | Pitch (head angle) of the player.<br />
Same function as ''Pitch'' field of '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|PositionAndOrientation]]''''' packet, but with more precision.<br />
|-<br />
| class="centeralign" | TargetEntityID<br />
| class="centeralign" | byte<br />
| class="centeralign" | 0<br />
| class="centeralign" | ID of an entity currently targeted by the player, between 0 and 127.<br />
Any out-of-range value means "no entity is targeted."<br />
|-<br />
| class="centeralign" | TargetBlockX<br />
| class="centeralign" | short<br />
| class="centeralign" | 64<br />
| class="centeralign" | X coordinate of a targeted block, between 0 and 2048.<br />
Any out-of-range value for any of the coordinates means "no block is targeted."<br />
|-<br />
| class="centeralign" | TargetBlockY<br />
| class="centeralign" | short<br />
| class="centeralign" | 64<br />
| class="centeralign" | Y coordinate of a targeted block, between 0 and 2048.<br />
|-<br />
| class="centeralign" | TargetBlockZ<br />
| class="centeralign" | short<br />
| class="centeralign" | 64<br />
| class="centeralign" | Z coordinate of a targeted block, between 0 and 2048.<br />
|-<br />
| class="centeralign" | TargetBlockFace<br />
| class="centeralign" | byte<br />
| class="centeralign" | 1<br />
| class="centeralign" | Index of the block face that the player is targeting. Block faces are numbered as follows:<br />
0. Away from X-origin<br />
<br />
1. Towards X-origin<br />
<br />
2. Away from Y-origin (up)<br />
<br />
3. Towards Y-origin (down)<br />
<br />
4. Away from Z-origin<br />
<br />
5. Towards Z-origin<br />
<br />
Any out-of-range value for ''TargetBlockFace'' mean "no block is targeted."<br />
|-<br />
! Total Size:<br />
| class="rightalign" colspan="4" | 15 bytes<br />
|}<br />
<br />
[[Category:Minecraft Classic]]</div>727021https://wiki.vg/index.php?title=Classic_Server_List&diff=6614Classic Server List2015-05-16T00:06:55Z<p>727021: </p>
<hr />
<div>{{navboxclassic}}<br /><br />
This is a rather incomplete list of Minecraft Classic servers currently in development. This page only lists servers written from scratch. For mods and wrappers, see the [[Classic Wrapper List]].<br />
<br />
{| class="wikitable" style="width: auto; text-align: center;"<br />
|-style="background:#eee"<br />
!style="width: 72px" | Name<br />
!Author(s)<br />
!style="width: 128px" | Language<br />
!style="width: 128px" | License<br />
!style="width: 72px" | Threaded<br />
!style="width: 72px" | Scripting<br />
|-<br />
! [http://dreadiscool.github.io/PowerBlock/ PowerBlock]<br />
| dreadiscool, Shadowwolf97, coehlo<br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| Undecided<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://fcraft.net/ fCraft]<br />
| fragmer, Destroyer, Redshift <br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| MIT/X11<br />
| {{yes}}<br />
| {{no}}<br />
|-<br />
! [http://www.minecraftwiki.net/wiki/OpenCraft OpenCraft]<br />
| Graham Edgecombe, Brett, Søren,<br />
Mark, Trever Fischer, Adam Liszka <br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| [http://www.opensource.org/licenses/bsd-license.php New BSD License]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://github.com/OpenClassic/OpenClassic OpenClassic]<br />
| Steveice10<br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| [http://www.opensource.org/licenses/mit-license.php MIT]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://www.minecraftwiki.net/wiki/Myne Myne]<br />
| Gdude2002, Ikjames, Goober, Varriount, AndrewPH, Antoligy, NotMeh, ntfwc, PixelEater<br />
| [http://en.wikipedia.org/wiki/Python_(programming_language) Python]<br />
| Public Domain <br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://mcdzienny.cba.pl/ MCDzienny]<br />
| Dzienny<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| [http://opensource.org/licenses/ECL-2.0 ECL-2.0]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://www.mcforge.net/ MCForge]<br />
| Dmitchell94, 501st_commander, Edh649, GamezGalaxy, EricKilla, Soccer101nic, Headdetect, Merlin33069, Jasonbay13, Cazzar, Snowl, Techjar, Nerketur, Wouto1997, BeMacized, Shade2010 (Forgeware Inc.)<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| GPL v3/ECL v2<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://umby.d3s.co/CCD3/ D3]<br />
| Dadido3, Umby24<br />
| [http://en.wikipedia.org/wiki/PureBasic Purebasic]<br />
| MIT<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://mcsong.x10.mx/forums/ MCSong]<br />
| 727021<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| [http://opensource.org/licenses/ECL-2.0 ECL-2.0]<br />
| {{yes}}<br />
| {{yes}}<br />
|}<br />
<br />
[[Category:Minecraft Classic]]</div>727021https://wiki.vg/index.php?title=Classic_Server_List&diff=6317Classic Server List2015-01-01T21:41:35Z<p>727021: </p>
<hr />
<div>{{navboxclassic}}<br /><br />
This is a rather incomplete list of Minecraft Classic servers currently in development. This page only lists servers written from scratch. For mods and wrappers, see the [[Classic Wrapper List]].<br />
<br />
{| class="wikitable" style="width: auto; text-align: center;"<br />
|-style="background:#eee"<br />
!style="width: 72px" | Name<br />
!Author(s)<br />
!style="width: 128px" | Language<br />
!style="width: 128px" | License<br />
!style="width: 72px" | Threaded<br />
!style="width: 72px" | Scripting<br />
|-<br />
! [http://dreadiscool.github.io/PowerBlock/ PowerBlock]<br />
| dreadiscool, Shadowwolf97, coehlo<br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| Undecided<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://fcraft.net/ fCraft]<br />
| fragmer, Destroyer, Redshift <br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| MIT/X11<br />
| {{yes}}<br />
| {{no}}<br />
|-<br />
! [http://www.minecraftwiki.net/wiki/OpenCraft OpenCraft]<br />
| Graham Edgecombe, Brett, Søren,<br />
Mark, Trever Fischer, Adam Liszka <br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| [http://www.opensource.org/licenses/bsd-license.php New BSD License]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://github.com/OpenClassic/OpenClassic OpenClassic]<br />
| Steveice10<br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| [http://www.opensource.org/licenses/mit-license.php MIT]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://www.minecraftwiki.net/wiki/Myne Myne]<br />
| Gdude2002, Ikjames, Goober, Varriount, AndrewPH, Antoligy, NotMeh, ntfwc, PixelEater<br />
| [http://en.wikipedia.org/wiki/Python_(programming_language) Python]<br />
| Public Domain <br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://mcdzienny.cba.pl/ MCDzienny]<br />
| Dzienny<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| [http://opensource.org/licenses/ECL-2.0 ECL-2.0]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://www.mcforge.net/ MCForge]<br />
| Dmitchell94, 501st_commander, Edh649, GamezGalaxy, EricKilla, Soccer101nic, Headdetect, Merlin33069, Jasonbay13, Cazzar, Snowl, Techjar, Nerketur, Wouto1997, BeMacized, Shade2010 (Forgeware Inc.)<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| GPL v3/ECL v2<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://umby.d3s.co/CCD3/ D3]<br />
| Dadido3, Umby24<br />
| [http://en.wikipedia.org/wiki/PureBasic Purebasic]<br />
| MIT<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
| [http://mcsong.x10.mx/forums/ MCSong]<br />
| 727021<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| [http://opensource.org/licenses/ECL-2.0 ECL-2.0]<br />
| {{yes}}<br />
| {{yes}}<br />
|}<br />
<br />
[[Category:Minecraft Classic]]</div>727021https://wiki.vg/index.php?title=Classic_Server_List&diff=6316Classic Server List2015-01-01T21:40:57Z<p>727021: Added MCSong to the list</p>
<hr />
<div>{{navboxclassic}}<br /><br />
This is a rather incomplete list of Minecraft Classic servers currently in development. This page only lists servers written from scratch. For mods and wrappers, see the [[Classic Wrapper List]].<br />
<br />
{| class="wikitable" style="width: auto; text-align: center;"<br />
|-style="background:#eee"<br />
!style="width: 72px" | Name<br />
!Author(s)<br />
!style="width: 128px" | Language<br />
!style="width: 128px" | License<br />
!style="width: 72px" | Threaded<br />
!style="width: 72px" | Scripting<br />
|-<br />
! [http://dreadiscool.github.io/PowerBlock/ PowerBlock]<br />
| dreadiscool, Shadowwolf97, coehlo<br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| Undecided<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://fcraft.net/ fCraft]<br />
| fragmer, Destroyer, Redshift <br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| MIT/X11<br />
| {{yes}}<br />
| {{no}}<br />
|-<br />
! [http://www.minecraftwiki.net/wiki/OpenCraft OpenCraft]<br />
| Graham Edgecombe, Brett, Søren,<br />
Mark, Trever Fischer, Adam Liszka <br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| [http://www.opensource.org/licenses/bsd-license.php New BSD License]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://github.com/OpenClassic/OpenClassic OpenClassic]<br />
| Steveice10<br />
| [http://en.wikipedia.org/wiki/Java_(programming_language) Java]<br />
| [http://www.opensource.org/licenses/mit-license.php MIT]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://www.minecraftwiki.net/wiki/Myne Myne]<br />
| Gdude2002, Ikjames, Goober, Varriount, AndrewPH, Antoligy, NotMeh, ntfwc, PixelEater<br />
| [http://en.wikipedia.org/wiki/Python_(programming_language) Python]<br />
| Public Domain <br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://mcdzienny.cba.pl/ MCDzienny]<br />
| Dzienny<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| [http://opensource.org/licenses/ECL-2.0 ECL-2.0]<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://www.mcforge.net/ MCForge]<br />
| Dmitchell94, 501st_commander, Edh649, GamezGalaxy, EricKilla, Soccer101nic, Headdetect, Merlin33069, Jasonbay13, Cazzar, Snowl, Techjar, Nerketur, Wouto1997, BeMacized, Shade2010 (Forgeware Inc.)<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| GPL v3/ECL v2<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
! [http://umby.d3s.co/CCD3/ D3]<br />
| Dadido3, Umby24<br />
| [http://en.wikipedia.org/wiki/PureBasic Purebasic]<br />
| MIT<br />
| {{yes}}<br />
| {{yes}}<br />
|-<br />
| [http://mcsong.x10.mx/forums/ MCSong]<br />
| 727021<br />
| [http://en.wikipedia.org/wiki/C_Sharp_(programming_language) C#]<br />
| {{yes}}<br />
| {{yes}}<br />
|}<br />
<br />
[[Category:Minecraft Classic]]</div>727021https://wiki.vg/index.php?title=Classic_Protocol_Extension&diff=6315Classic Protocol Extension2015-01-01T00:51:21Z<p>727021: Added MCSong to custom servers that plan to add support</p>
<hr />
<div>'''Classic Protocol Extension''' (CPE) is a project to augment the Minecraft Classic network protocol with new and improved functionality.<br />
<br />
Extensions are designed to keep extended clients and servers compatible with standard clients and servers. Standard clients and extended clients can play on the same server side-by-side. Extensions are designed to be modular: custom clients and servers can selectively implement any subset of extensions, and only mutually-supported extensions will be used.<br />
<br />
{| class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #f28500;background:#fbfbfb;width:80%;font-size:110%"<br />
|style="padding:10px"|'''This specification has not yet been finalized, and is subject to change.'''<br />
Last revision: 31 October 2014.<br />
Keep an eye on [[Classic Protocol Extension/History|the history subpage]] for a chronology of changes.<br />
|}<br />
{| class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #3dc238;background:#fbfbfb;width:80%;font-size:110%"<br />
|style="padding:10px"|'''Do you have an idea for an extension? Please post it on the [[Classic_Protocol_Extension/Proposals|Proposals]] subpage.'''<br />
|}<br />
<br />
==Support==<br />
:''See [[Classic Protocol Extension/Support|support subpage]] for a detailed table.''<br />
Custom servers that already support CPE: [http://femto.fcraft.net/ FemtoCraft], [http://umby.d3s.co/CCD3/ D3], [http://github.com/LeChosenOne/LegendCraft/ LegendCraft], [http://GemsCraftMC.weebly.com/ GemsCraft], [https://github.com/umby24/Hypercube Hypercube], [https://github.com/123DMWM/ProCraft ProCraft]<br />
<br />
Custom servers that plan to add support: [http://800craft.net/ 800Craft], [http://github.com/tyteen4a03/cloudBox cloudBox], [http://www.fcraft.net/ fCraft], [https://github.com/GamezGalaxy/GGS/tree/Classic-Extension GGS], [http://mcsong.x10.mx/forums/ MCSong]<br />
<br />
Custom clients that already support CPE: [http://classicube.net ClassiCube Client]<br />
<br />
Custom clients that plan to add support: [http://charged-miners.com/ Charged Miners]<br />
<br />
==Negotiation==<br />
When CPE-capable client connects to a CPE-capable server, a brief negotiation needs to happen before any extensions are used. Client and server declare their capabilities and determine which extensions are mutually supported. '''All CPE-capable software is required to support this.'''<br />
<br />
[[File:CPE_Negotiation.png|frame|right]]<br />
'''Client behavior''': Extended clients must use magic number of <code>0x42</code> (<code>66</code> decimal) for the padding byte of the [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''ClientIdentification''''']] packet. It must then await a response. If server responds with any packet other than '''''ExtInfo''''', client must assume that the server does NOT support CPE. If the server responds with an '''''ExtInfo''''' packet, client must parse it and any '''''ExtEntry''''' packets that follow. Client must then compare its locally-supported set of extensions with the list of extensions provided by the server, and find an intersection of these sets. These are the mutually-supported extensions. Client must now send '''''ExtInfo''''' packet of its own, followed by a list of zero or more client-supported extensions. After sending the last of '''''ExtEntry''''' packets, client should activate all mutually-supported extensions and resume normal login procedure.<br />
<br />
'''Server behavior''': When a client connects, server must read the [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''ClientIdentification''''']] packet and check its padding byte. If this byte is set to <code>0x42</code> (<code>66</code> decimal), assume that the client supports CPE. If this byte is set to any other value, assume that the client does NOT support CPE.<br />
<br />
Server must immediately reply to CPE clients with an '''''ExtInfo''''' packet, followed by zero or more '''''ExtEntry''''' packets, and await a response from the client. Client will respond with one '''''ExtInfo''''' and zero or more '''''ExtEntry''''' packets. Server must then compare its locally-supported set of extensions with the list of extensions provided by the client, and find an intersection of these sets. These are the mutually-supported extensions. After receiving the last of '''''ExtEntry''''' packets, server should activate all mutually-supported extensions and resume normal login procedure. <br />
<br />
'''Note 1''': All standard/non-extended clients use <code>0x00</code> for the padding byte. All standard servers ignore this padding byte. Therefore, this negotiation process does not affect compatibility with standard software.<br />
<br />
'''Note 2''': Do not make any assumptions about supported functionality based on the ''AppName'' field of '''''ExtInfo''''' packet. It's for logging purposes only.<br />
<br />
'''Note 3''': Do not declare support for an extension until it is FULLY implemented, except for debugging.<br />
<br />
:<h4>ExtInfo Packet</h4><br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x10<br />
(16)<br />
| class="col1 centeralign" | AppName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>MyServer</code><br />
| class="col4" | Client or server software name<br />
|- class="row2"<br />
| class="col0 centeralign" | ExtensionCount<br />
| class="col1 centeralign" | short<br />
| class="col2 centeralign" | 1<br />
| class="col3" | Between 0 and 32767<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 67 bytes<br />
|}<br />
<br />
:<h4>ExtEntry Packet</h4><br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x11<br />
(17)<br />
| class="col1 centeralign" | ExtName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>MyExtension</code><br />
| class="col4" | Name of a supported extension<br />
|- class="row2"<br />
| class="col0 centeralign" | Version<br />
| class="col1 centeralign" | int<br />
| class="col2 centeralign" | 1<br />
| class="col3" | Only extensions with identical version numbers should be considered compatible.<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 69 bytes<br />
|}<br />
<br />
==Extensions==<br />
'''''Note:''''' The section heading is the name of the extension. Packet names are not same as extension names. For example, the first extension listed here is named "ClickDistance" and not "SetClickDistance".<br />
{| class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #3dc238;background:#fbfbfb;width:80%;font-size:110%"<br />
|style="padding:10px"|'''Do you have an idea for an extension? Please post it on the [[Classic_Protocol_Extension/Proposals|Proposals]] subpage.'''<br />
|}<br />
<br />
===ClickDistance===<br />
:Used to extend or restrict the distance at which client may click blocks, controlled by the server. Click range is given in player-space units (32 units per block). In Minecraft Classic, the default range is 160.<br />
:'''Motivation''': This extension allows trusted players to have a wider or virtually-unlimited reach. It may simplify operation of certain bots. Restricting the reach may allow new games/mini-games.<br />
:'''Client Behavior''': Upon receiving a '''''SetClickDistance''''' packet, client should immediately apply the change. ''Distance'' should persist between worlds/maps.<br />
:'''Server Behavior''': Server should send '''''SetClickDistance''''' packet when the server connects, or whenever their permitted click distance changes. Server should allow for some margin-of-error (+/- 1 block) when enforcing click distance restrictions.<br />
:<h4>SetClickDistance packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x12<br />
(18)<br />
| class="col1 centeralign" | Distance<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | 160<br />
| class="col4" |<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===CustomBlocks===<br />
:Used to add support for custom block types. Custom block IDs start at 50 (0x32). New block types will be added in batches, a few at a time. Both client and server declare which batch they support, and use the lower of the two versions. Claiming to supporting a batch implies fully implementing all the batches that came before it. If either server or client do not support this extension, only the standard 50 block types should be used.<br />
:'''Motivation''': Adding new visually distinct blocks, to enhance Classic players' experience.<br />
:'''Client behavior''': Client must expect a '''''CustomBlockSupportLevel''''' packet from a compatible server immediately after sending the last '''''ExtEntry''''' packet. It should then reply with its own '''''CustomBlockSupportLevel''''' packet, containing its actual support level. Client must then use the lower of the two levels in operation. Client must not send any block types that are not defined by the current support level. Client should expect [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''ServerIdentification''''']] packet only AFTER sending its '''''CustomBlockSupportLevel''''' packet.<br />
:'''Server behavior''': Server must send a '''''CustomBlockSupportLevel''''' packet to compatible clients immediately after receiving the last '''''ExtEntry''''' packet from the client. It should then wait to receive a '''''CustomBlockSupportLevel''''' packet from the client before sending the [[Classic_Protocol#Client_.E2.86.92_Server_packets|'''''ServerIdentification''''']] packet. Server must then use the lower of the two levels in operation. If this level is lower than the server's, it has to filter data sent to the client, to make sure that the client never receives any block types that it does not support. Each level will define what substitutions to use.<br />
<br />
:<h4>CustomBlockSupportLevel packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x13<br />
(19)<br />
| class="col1 centeralign" | SupportLevel<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | 1<br />
| class="col4" |<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 2<br />
|}<br />
<br />
:<h4>Blocks in support level 1</h4><br />
:Client must be able to receive/render all 16 custom blocks to claim support. Server must be able to receive/store all 16 custom blocks to claim support.<br />
:[[File:CPE_CustomBlocks_Level1.png]]<br />
:{| class="wikitable"<br />
!Block name<br />
!Block ID<br />
!Fallback name<br />
!Fallback ID<br />
|-<br />
|'''CobblestoneSlab'''<br />
|0x32 (50)<br />
|Slab<br />
|0x2C (44)<br />
|-<br />
|'''Rope'''<br />
|0x33 (51)<br />
|BrownMushroom<br />
|0x27 (39)<br />
|-<br />
|'''Sandstone'''<br />
|0x34 (52)<br />
|Sand<br />
|0x0C (12)<br />
|-<br />
|'''Snow'''<br />
|0x35 (53)<br />
|Air<br />
|0x00 (0)<br />
|-<br />
|'''Fire'''<br />
|0x36 (54)<br />
|Lava<br />
|0x0A (10)<br />
|-<br />
|'''LightPinkWool'''<br />
|0x37 (55)<br />
|Pink<br />
|0x21 (33)<br />
|-<br />
|'''ForestGreenWool'''<br />
|0x38 (56)<br />
|Green<br />
|0x19 (25)<br />
|-<br />
|'''BrownWool'''<br />
|0x39 (57)<br />
|Dirt<br />
|0x03 (3)<br />
|-<br />
|'''DeepBlue'''<br />
|0x3A (58)<br />
|Blue<br />
|0x1d (29)<br />
|-<br />
|'''Turquoise'''<br />
|0x3B (59)<br />
|Cyan<br />
|0x1c (28)<br />
|-<br />
|'''Ice'''<br />
|0x3C (60)<br />
|Glass<br />
|0x14 (20)<br />
|-<br />
|'''CeramicTile'''<br />
|0x3D (61)<br />
|Iron<br />
|0x2a (42)<br />
|-<br />
|'''Magma'''<br />
|0x3E (62)<br />
|Obsidian<br />
|0x31 (49)<br />
|-<br />
|'''Pillar'''<br />
|0x3F (63)<br />
|White<br />
|0x24 (36)<br />
|-<br />
|'''Crate'''<br />
|0x40 (64)<br />
|WoodenPlanks<br />
|0x05 (5)<br />
|-<br />
|'''StoneBrick'''<br />
|0x41 (65)<br />
|Stone<br />
|0x01 (1)<br />
|}<br />
<br />
:Block IDs for future support levels are guaranteed to be assigned monotonically, incrementally, and permanently.<br />
<br />
===HeldBlock===<br />
:Provides a way for the client to notify the server about the blocktype that it is currently holding, and for the server to change the currently-held block type. <br />
:'''Motivation''': This allows server to know which block player is holding, for example for drawing commands, without needing to wait for the player's click. it also allows for features like [http://www.fcraft.net/wiki//Spectate /Spectate] to show what block a spectated player is holding.<br />
:'''Client behavior''': When this extension is mutually supported, client should use the ''PlayerID'' field of the '''''[[Classic_Protocol#Client_.E2.86.92_Server_packets|PositionAndOrientation]]''''' packet (currently unused) to indicate which blocktype the client is currently holding. It should be ready to accept '''''HoldThis''''' packets to change the block that the player is holding. If <code>0</code> is given for ''BlockToHold'', client should hide the hand/block from the screen, and should not be able to click blocks, until they switch to a different blocktype. If an unrecognized blocktype is given, no action is needed.<br />
:'''Server behavior''': The server can use '''''HoldThis''''' packet to force the client to hold the desired block type. It should be done sparingly.<br />
<br />
:<h4>HoldThis packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x14<br />
(20)<br />
| class="col1 centeralign" | BlockToHold<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>49</code><br />
| class="col4" | Standard block type<br />
|- class="row2"<br />
| class="col1 centeralign" | PreventChange<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | 0<br />
| class="col4" |0 = Allow player to change blocktype<br />
1 = Prevent player from changing blocktype<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===EmoteFix===<br />
:This extension indicates that the client can render [http://fcraft.net/wiki/Emotes emotes] (ASCII control characters) in chat properly, without padding or suffixes that are required for vanilla client. This extension does not define any new packets.<br />
:'''Motivation''': To improve appearance of emotes in chat.<br />
:'''Client behavior''': Client should not emulate vanilla client's quirks.<br />
:'''Server behavior''': Server should not pad or suffix emotes in chat.<br />
<br />
===TextHotKey===<br />
:This extension allows the server to define "hotkeys" for certain commands.<br />
:'''Motivation''': To speed up and simplify access to commonly-used commands and command macros by providing server-defined client-side hotkeys.<br />
:'''Client behavior:''' Client should not try to persist previously-defined hotkeys between sessions. When a defined hotkey is activated by the user, client should open up a text prompt and type in contents of the ''Action'' field. A newline character (<code>\n</code>) in the ''Action'' field indicates that whatever is currently typed-in should be sent to the server. If ''Action'' does not end with a newline, text prompt should be left open, for the user to complete. Client may provide a way for the user to see a list of currently-defined hotkeys, and a way to notify the user when a hotkey was activated.<br />
:'''Server behavior:''' The server should send a definition of each hotkey ('''''SetTextHotKey''''' packet) once per connection.<br />
<br />
:<h4>SetTextHotKey packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x15<br />
(21)<br />
| class="col1 centeralign" | Label<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Copy</code><br />
| class="col4" | Readable name of the hotkey<br />
|- class="row2"<br />
| class="col1 centeralign" | Action<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>/Copy </code><br />
| class="col4" | Text to type in<br />
|- class="row2"<br />
| class="col1 centeralign" | KeyCode<br />
| class="col2 centeralign" | int<br />
| class="col3 centeralign" | <code>113</code><br />
| class="col4" | [http://www.minecraftwiki.net/wiki/Key_Codes LWJGL keycode] of the key<br />
|- class="row3"<br />
| class="col1 centeralign" | KeyMods<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Key modifier [http://en.wikipedia.org/wiki/Flag_word flags], may be combined:<br />
* 0 = None<br />
* 1 = Ctrl<br />
* 2 = Shift<br />
* 4 = Alt<br />
|- class="row4"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 134 bytes<br />
|}<br />
<br />
===ExtPlayerList===<br />
:'''Motivation''': Provides more flexibility in naming of players and loading of skins, autocompletion, and player tab-list display. Separates tracking of in-game entities (spawned player models) and names on the player list. '''''ExtAddPlayerName'''''/'''''ExtRemovePlayerName''''' packets take over managing the player names list (tab-list), and '''''ExtAddEntity2'''''/'''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|DespawnPlayer]]''''' packets are used only to manage in-game entities.<br />
<br />
====Version 1 (Deprecated since 28 August 2014)====<br />
:This version of the extension has been deprecated and replaced with version 2. See [[Classic Protocol Extension/Old Extensions|old extensions subpage]].<br />
<br />
====Version 2====<br />
Version 2 of this extension replaces '''''ExtAddEntity''''' packet with '''''ExtAddEntity2''''', allows using full URLs for ''SkinName'', and clarifies interaction with [[#ChangeModel|'''ChangeModel''']] extension.<br />
:<h5>Client Behavior</h5><br />
:When '''''ExtAddPlayerName''''' packet is received for an unrecognized ''NameID'', a new name must be added to the player-name list. When receiving '''''ExtAddPlayerName''''' packet for an already-listed ''NameID'', client must update its ''ListName'', ''GroupName'', and ''GroupRank''. Player-name list must persist when client changes worlds/maps.<br />
<br />
:When an '''''ExtAddEntity2''''' packet is received, it must be treated as the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SpawnPlayer]]''''' packet. A player model must be spawned in-game at the given location, with ''InGameName'' text drawn above it. Skin should be loaded using the given ''SkinName'' for a player name. When client receives '''''ExtAddEntity2''''' packet for an already-spawned player, a duplicate entity must not be spawned and existing entity's position must not be changed. Instead their ''InGameName'' and ''SkinName'' must be updated. If a negative ''EntityID'' is given for '''''ExtAddEntity2''''', client must update player's own spawn point, ''InGameName'', and ''SkinName''. The client must ignore regular '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SpawnPlayer]]''''' packets, if any are received.<br />
<br />
:Player entity's skin should be loaded using the given ''SkinName''. If ''SkinName'' appears to be a player name, skin should be downloaded from the default skin server. If ''SkinName'' appears to be a full URL to a PNG image (starts with <code>http://</code> or <code>https://</code> and ends with <code>.png</code>) then skin should be downloaded from that URL. If image is correctly sized/proportioned to use as a skin for the current model, it should be used. If a blank or unrecognized value is given for ''SkinName'', or if given image could not be downloaded or used, then the default skin should be used.<br />
<br />
:Names on the player-name list should be grouped by ''GroupName'' in the player-name list. Names within a ''GroupName'' should be sorted by ''GroupRank'' (in ascending order). Names with the same ''GroupName'' and ''GroupRank'' should be sorted alphabetically by ''ListName''. Color codes may be either drawn or stripped from ''ListName'', ''GroupName'', and ''InGameName''.<br />
<br />
:When a standard '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|DespawnPlayer]]''''' packet is received for a recognized ''EntityID'', player model must be removed from a world. When '''''ExtRemovePlayerName''''' packet is received for a recognized ''NameID'', their name must be removed from player-name list. Packets with out-of-range or unrecognized ''NameID''s must be ignored.<br />
<br />
:In-game entities must never be affected by '''''ExtAddPlayerName''''' or '''''ExtRemovePlayerName''''' packets. Player name list must never be affected by '''''ExtAddEntity2''''' or '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|DespawnPlayer]]''''' packets.<br />
<br />
:<h5>Server Behavior</h5><br />
{| class="wikitable" style="float:right"<br />
!Event<br />
!Packet to send<br />
|-<br />
|Player connects to server<br />
|'''''ExtAddPlayerName'''''<br />
|-<br />
|Player enters map<br />
|'''''ExtAddEntity2'''''<br />
|-<br />
|Player leaves map<br />
|'''''DespawnPlayer'''''<br />
|-<br />
|Player disconnects from server<br />
|'''''ExtRemovePlayerName'''''<br />
|}<br />
:Unique ''NameID'' between 0 and 255 should be assigned to every online player. When a new player connects to the server, '''''ExtAddPlayerName''''' must be sent. ''GroupName'' and ''GroupRank'' can be used in any way, for example to group players by map/world or rank/class/faction. Server must use '''''ExtAddEntity2''''' in place of standard '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SpawnPlayer]]''''' packet. Server should re-send '''''ExtAddPlayerName''''' packet, using the identical ''NameID'', when player's ''ListName'', ''GroupName'', or ''GroupRank'' change. Server must reliably send an '''''ExtRemovePlayerName''''' packet when the player disconnects. Color codes are permitted in ''ListName'', ''GroupName'', and ''InGameName''.<br />
<br />
:<h5>ExtAddPlayerName Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="5" | 0x16<br />
(22)<br />
| class="col1 centeralign" | NameID<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row2"<br />
| class="col1 centeralign" | PlayerName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Notch</code><br />
| class="col4" | Player name used for autocompletion.<br />
May be left empty (to exclude from autocompletion).<br />
|- class="row3"<br />
| class="col1 centeralign" | ListName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>&c[Op]Notch</code><br />
| class="col4" |Name displayed in the in-game list.<br />
|- class="row4"<br />
| class="col1 centeralign" | GroupName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Staff</code><br />
| class="col4" |May be left blank.<br />
|- class="row5"<br />
| class="col1 centeralign" | GroupRank<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Rank of a player within the group.<br />
Lower-number ranks are listed before higher-number ranks.<br />
|- class="row6"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 196 bytes<br />
|}<br />
<br />
:<h5>ExtAddEntity2 Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="8" | 0x21<br />
(33)<br />
| class="col1 centeralign" | EntityID<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Between 0 and 127<br />
|- class="row2"<br />
| class="col1 centeralign" | InGameName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>&cNotch</code><br />
| class="col4" | Player name to be shown in-game, hovering above player model.<br />
|- class="row3"<br />
| class="col1 centeralign" | SkinName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>Notch</code><br />
| class="col4" | Player name whose skin should be used by the client.<br />
|- class="row4"<br />
| class="col1 centeralign" | SpawnX<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | X coordinate (32 units per block) of entity's spawn location.<br />
|- class="row5"<br />
| class="col1 centeralign" | SpawnY<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>2</code><br />
| class="col4" | Y coordinate (32 units per block) of entity's spawn location.<br />
|- class="row6"<br />
| class="col1 centeralign" | SpawnZ<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>3</code><br />
| class="col4" | Z coordinate (32 units per block) of entity's spawn location.<br />
|- class="row7"<br />
| class="col1 centeralign" | SpawnYaw<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>4</code><br />
| class="col4" | Orientation (left-right) at the entity's spawn location.<br />
|- class="row8"<br />
| class="col1 centeralign" | SpawnPitch<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Orientation (up-down) at the entity's spawn location.<br />
|- class="row9"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 138 bytes<br />
|}<br />
<br />
:<h5>ExtRemovePlayerName Packet</h5><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x18<br />
(24)<br />
| class="col1 centeralign" | NameID<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | Between 0 and 255<br />
Matches NameID of the ExtAddPlayerName packet<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 3 bytes<br />
|}<br />
<br />
===EnvColors===<br />
:This extension allows server to alter some of the colors used by the client in environment rendering.<br />
:'''Motivation''': To allow the server to give worlds/maps a unique feel: time-of-day, weather/climate, lighting effect, etc.<br />
:'''Client behavior''': Client must check for '''''EnvSetColor''''' packets right before '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet, and apply these changes before the map is displayed. Client must be able to read this packet at other times, but it is not required to then apply the changes immediately. If an unrecognized or unsupported ''Variable'' field is given, no action is needed. If an out-of-range color is given by the server (i.e. if any of ''Red'', ''Green'', or ''Blue'' is less than <code>0</code> or greater than <code>255</code>), then the specified ''Variable'' should be reset to its default value.<br />
:'''Server behavior''': Server should normally only use '''''EnvSetColor''''' packets right before the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet. To reset a variable to its default value, the server should send a packet with value <code>-1</code> for ''Red'', ''Green'', and ''Blue''.<br />
<br />
:<h4>EnvSetColor Packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x19<br />
(25)<br />
| class="col1 centeralign" | Variable<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | Enumeration of environmental variables<br />
*0 = sky color<br />
*1 = cloud color<br />
*2 = fog color<br />
*3 = ambient light (blocks in shadow) color<br />
*4 = diffuse light (sunlight) color<br />
|- class="row2"<br />
| class="col1 centeralign" | Red<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>25</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row3"<br />
| class="col1 centeralign" | Green<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>128</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row4"<br />
| class="col1 centeralign" | Blue<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Between 0 and 255<br />
|- class="row5"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 8 bytes<br />
|}<br />
<br />
===SelectionCuboid===<br />
:'''Motivation''': Allows the server to highlight parts of a world. Applications include zoning, previewing draw commands, previewing undo commands.<br />
:'''Coordinates''': {''StartX'',''StartY'',''StartZ''} are coordinates of the block inside the selection that is closest to the map origin. {''EndX'',''EndY'',''EndZ''} are coordinates of the block inside the selection that is furthest from the map origin. Therefore, the resulting selection has dimensions {''EndX''-''StartX''+1, ''EndY''-''StartY''+1, ''EndZ''-''StartZ''+1).<br />
:'''Client behavior''': Client should be ready to receive '''''MakeSelection''''' packets any time after '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet. Upon receiving the packet, a translucent cuboid should appear in the world. The cuboid may feature a plain or "grid" texture. Selections that extend outside the map may be either ignored or clipped to fit. Selections with inconsistent coordinates (e.g. where ''StartX''<''EndX'') may either be ignored or re-ordered. Out-of-range values for ''Red'', ''Green'', ''Blue'', and ''Opacity'' should be clipped to fit the valid range. Supporting ''Opacity'' is optional: the client may opt to provide fixed opacity instead. When map changes (i.e. when '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelInitialize]]''''' packet is received), all existing selections should be removed. '''''RemoveSelection''''' packets that refer to non-existent ''SelectionID''s should be ignored.<br />
:'''Server behavior''': All given coordinates must be contained within the map. End coordinates should be higher or equal than start coordinates.<br />
<br />
:<h4>MakeSelection packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="12" | 0x1A<br />
(26)<br />
| class="col1 centeralign" | SelectionID<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | Numeric ID of the selection. Between 0 and 127.<br />
|- class="row2"<br />
| class="col1 centeralign" | Label<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>SomeZone</code><br />
| class="col4" | Text label associated with the selection<br />
|- class="row3"<br />
| class="col1 centeralign" | StartX<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | X coordinate of the starting point<br />
|- class="row4"<br />
| class="col1 centeralign" | StartY<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>2</code><br />
| class="col4" | Y coordinate of the starting point<br />
|- class="row5"<br />
| class="col1 centeralign" | StartZ<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>3</code><br />
| class="col4" | Z coordinate of the starting point<br />
|- class="row6"<br />
| class="col1 centeralign" | EndX<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>5</code><br />
| class="col4" | X coordinate of the ending point<br />
|- class="row7"<br />
| class="col1 centeralign" | EndY<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>6</code><br />
| class="col4" | Y coordinate of the ending point<br />
|- class="row8"<br />
| class="col1 centeralign" | EndZ<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>7</code><br />
| class="col4" | Z coordinate of the ending point<br />
|- class="row9"<br />
| class="col1 centeralign" | Red<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>255</code><br />
| class="col4" |Between 0 and 255.<br />
|- class="row10"<br />
| class="col1 centeralign" | Green<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>34</code><br />
| class="col4" |Between 0 and 255.<br />
|- class="row11"<br />
| class="col1 centeralign" | Blue<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>128</code><br />
| class="col4" |Between 0 and 255.<br />
|- class="row12"<br />
| class="col1 centeralign" | Opacity<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>255</code><br />
| class="col4" | 0 = fully transparent<br />
255 = fully opaque<br />
|- class="row4"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 86 bytes<br />
|}<br />
<br />
:<h4>RemoveSelection packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" | 0x1B<br />
(27)<br />
| class="col1 centeralign" | SelectionID<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 2 bytes<br />
|}<br />
<br />
===BlockPermissions===<br />
:This extension allows the server to instruct the player that certain block types are allowed/disallowed to be placed or deleted.<br />
:'''Motivation''': To prevent players from inadvertently placing or removing prohibited block types (e.g. water, lava, grass, admincrete), before it even reaches the server.<br />
:'''Client behavior:''' Client should prevent placement of prohibited block types (by graying out or hiding blocks in block-selection screen, or any other effective means). Client should prevent player from deleting prohibited block types. Client must be ready to receive '''''SetBlockPermission''''' packet after map load ('''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet). Permission changes should take effect as soon as packet is received. Admincrete (solid block) permissions set by '''''SetBlockPermission''''' must always override permission set by '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|ServerIdentification]]''''' and '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|UpdateUserType]]''''' packets. If ''BlockType'' is set to <code>0</code>, given permissions should affect ALL block types at once, overriding permissions set by any earlier packets. Permissions must persist between map changes. Client may optionally warn the player attempting to place/delete prohibited blocks via sound effect, visual effect, chat message, etc.<br />
:'''Server behavior:''' Server may send '''''SetBlockPermission''''' packets any time after map load ('''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet). Any valid block ID may be specified for ''BlockType'', including custom blocks (if [[#CustomBlocks|CustomBlocks extension]] is mutually supported). ''BlockType'' may be set to <code>0</code> to set permissions for ALL block types at once. Server must not assume that client is compliant/obedient, and server must still verify each '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|SetBlock]]''''' packet coming from the client. What to do with non-complying clients (kick or warn) is up to you.<br />
<br />
:<h4>SetBlockPermission packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1C<br />
(28)<br />
| class="col1 centeralign" | BlockType<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>8</code><br />
| class="col4" | Block's numeric ID (anything between 1 and max defined block).<br />
|- class="row2"<br />
| class="col1 centeralign" | AllowPlacement<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | 0 = Prohibited<br />
1 or any other value = Allowed<br />
|- class="row2"<br />
| class="col1 centeralign" | AllowDeletion<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" | 0 = Prohibited<br />
1 or any other value = Allowed<br />
|- class="row4"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 4 bytes<br />
|}<br />
<br />
===ChangeModel===<br />
:Allows changing appearance of player models in supporting clients.<br />
<h5>Client Behavior</h5><br />
:The client will receive a ''EntityID'' and a string value containing the model name. The client will then change the model of the player whose ID is the same as the received '''''AddEntity''''', '''''ExtAddEntity''''', or '''''ExtAddEntity2''''' packet. The model name will be parsed by the model manager and the model changed in game. If the model does not exists in the model manager or is 0-length, change the model back to humanoid. Alternatively, you can send the client an int converted to a string which represents a valid Block ID. An ''EntityID'' of -1 (255 unsigned) indicates the player's own model. If model is set to <code>humanoid</code>, player-specific skin should be used. For all other models, default model-specific textures should be used.<br />
<br />
<h5>Server Behavior</h5><br />
:The server may send a ''EntityID'' and then a ''ModelName'' to the client for a desired entity. The model name must be chosen from the list below. To reset the model to default, server should set ''ModelName'' to <code>humanoid</code> or to an empty string.<br />
<br />
<h5>Interaction with ExtPlayerList</h5><br />
:If a '''''ExtAddEntity2''''' packet is received for a non-<code>humanoid</code> entity and ''SkinName'' specifies a full URL, that image should be downloaded and used as a texture for the currently model. Receiving another '''''ExtAddEntity2''''' packet should either update this texture (if ''SkinName'' is a full URL) or reset it back to default (if ''SkinName'' is anything else). Receiving another '''''ChangeModel''''' packet with a non-<code>humanoid</code> ''ModelName'' should reset texture back to model-specific default. <br />
<br />
:<h4>ChangeModel Packet</h4><br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="2" | 0x1D<br />
(29)<br />
| class="col0 centeralign" | EntityID<br />
| class="col1 centeralign" | byte<br />
| class="col2 centeralign" | 5<br />
| class="col3" | Between 0 and 127. <br />
|- class="row2"<br />
| class="col1 centeralign" | ModelName<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>spider</code><br />
| class="col4" | The name of the model to be used OR a valid Block ID as a string.<br />
|- class="row3"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 66 bytes<br />
|}<br />
<br />
:<h4>Available models</h4><br />
:Client can render any or none of the below, but it is down to the client to handle what can and cannot be rendered if the packet is recieved<br />
:{| class="wikitable"<br />
!Model Name<br />
!Model String<br />
|-<br />
|'''Chicken'''<br />
|<code>chicken</code><br />
|-<br />
|'''Block Model'''<br />
|A valid block ID as a string<br />
|-<br />
|'''Creeper'''<br />
|<code>creeper</code><br />
|-<br />
|'''Crocodile'''<br />
|<code>croc</code><br />
|-<br />
|'''Humanoid'''<br />
|<code>humanoid</code> (or an invalid model name)<br />
|-<br />
|'''Pig'''<br />
|<code>pig</code><br />
|-<br />
|'''Printer'''<br />
|<code>printer</code><br />
|-<br />
|'''Sheep'''<br />
|<code>sheep</code><br />
|-<br />
|'''Skeleton Archer'''<br />
|<code>skeleton</code><br />
|-<br />
|'''Spider'''<br />
|<code>spider</code><br />
|-<br />
|'''Zombie'''<br />
|<code>zombie</code><br />
|-<br />
|}<br />
<br />
===EnvMapAppearance===<br />
:This extension allows the server to specify custom terrain textures, and tweak appearance of map edges.<br />
:'''Motivation''': To provide more ways to customize map appearance, including functionality that's currently provided by [http://files.worldofminecraft.com/texturing/ World of Minecraft's scheme].<br />
:'''Client behavior:''' Client must be able to receive '''''EnvSetMapAppearance''''' packets any time during level load (after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is received and until the '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packet is received). If the ''TextureURL'' field is blank or if the given file could not be loaded for any reason, then the texture pack should be reset to client's default. If an unsupported block ID is given for ''SideBlock'' or ''EdgeBlock'', it should be ignored. Given ''SideLevel'' value should be adjusted to fit between <code>0</code> and <code>MapDepth</code>, if necessary. Client should keep using these appearance parameters for future maps, unless specified otherwise by the server.<br />
:'''Server behavior:''' Server may send '''''EnvSetMapAppearance''''' packets after the last '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is sent for a level. Server should not use any custom block IDs unless the client declared the appropriate [[#CustomBlocks|CustomBlocks]] support level. To reset the texture pack to default value, server should send an '''''EnvMapAppearance''''' packet with empty string for ''TextureURL''. To reset other fields, server should simply use the default values (listed below).<br />
:'''Block type restrictions:''' Only solid blocks are allowed to be used for ''SideBlock'' and ''EdgeBlock''. Sprites (Sapling, Dandelion, Rose, BrownMushroom, RedMushroom, Rope, Fire) partial-height blocks (Slab, CobblestoneSlab, Snow), and transparent blocks (Air, Leaves, Glass) cannot be used for those fields.<br />
<br />
:<h4>EnvSetMapAppearance packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1E<br />
(30)<br />
| class="col1 centeralign" | TextureURL<br />
| class="col2 centeralign" | string<br />
| class="col3 centeralign" | <code>http://somesite.net/terrain.png</code><br />
| class="col4" | Skin's full URL.<br />
Must be an HTTP URL, ending with .png, and served with <code>image/png</code> mime type.<br />
|- class="row2"<br />
| class="col1 centeralign" | SideBlock<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>7</code><br />
| class="col4" | Block ID. Default value is 7 (Admincrete).<br />
|- class="row3"<br />
| class="col1 centeralign" | EdgeBlock<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>8</code><br />
| class="col4" | Block ID. Default value is 8 (Water).<br />
|- class="row4"<br />
| class="col1 centeralign" | SideLevel<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>31</code><br />
| class="col4" | Elevation from bottom of the map, in blocks.<br />
Value should be between <code>0</code> and <code>MapDepth</code>.<br />
Default value is <code>MapDepth/2</code>.<br />
|- class="row5"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 69 bytes<br />
|}<br />
<br />
===EnvWeatherType===<br />
:This extension allows the server to trigger special weather conditions (like rain and snow) on demand.<br />
:'''Motivation''': To allow the server to give worlds/maps a unique feel with weather effects, e.g. for adventure maps.<br />
:'''Client behavior''': Client must be able to receive '''''EnvWeather''''' packets at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is received, and apply these changes immediately. If an unrecognized or unsupported ''WeatherType'' field is given, no action is needed.<br />
:'''Server behavior''': Server may send '''''EnvSetColor''''' packets to connected clients at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is sent.<br />
<br />
:<h4>EnvSetWeatherType Packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="4" | 0x1F<br />
(31)<br />
| class="col1 centeralign" | WeatherType<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" | Enumeration of weather types<br />
*0 = sunny<br />
*1 = raining<br />
*2 = snowing<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 2 bytes<br />
|}<br />
<br />
===HackControl===<br />
:This extension allows the server to control cheats/hacks in the client.<br />
:'''Motivation''': To allow fine-grained control over cheats/hacks on multi-world servers.<br />
:'''Client behavior''': Client must be able to receive '''''HackControl''''' packets at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is received, and apply these changes immediately. Unrecognized or unsupported values for any field should be ignored. Clients may approximate ''JumpHeight'' by rounding down to the nearest half-block (i.e. nearest multiple of 16), if needed. If a negative value is given for ''JumpHeight'', client should reset jump height to its default setting (around <code>40</code> in vanilla Minecraft).<br />
:'''Server behavior''': Server may send '''''HackControl''''' packets to connected clients at any time after the first '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelDataChunk]]''''' packet is sent.<br />
<br />
:<h4>HackControl Packet</h4><br />
:''Server to Client''<br />
:{| class="wikitable"<br />
|- class="row0"<br />
! class="col0" | Packet ID<br />
! class="col1" | Field Name<br />
! class="col2" | Field Type<br />
! class="col3" | Example<br />
! class="col4" | Notes<br />
|- class="row1"<br />
| class="col0 centeralign" rowspan="6" | 0x20<br />
(32)<br />
| class="col1 centeralign" | Flying<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
*0 = Prevent player from flying<br />
*1 = Allow flying<br />
|-<br />
| class="col1 centeralign" | NoClip<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
*0 = Prevent player from no-clipping (passing through solid blocks)<br />
*1 = Allow no-clipping<br />
|-<br />
| class="col1 centeralign" | Speeding<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>0</code><br />
| class="col4" |<br />
*0 = Only allow normal walking speed.<br />
*1 = Allow moving at any speeds.<br />
|-<br />
| class="col1 centeralign" | SpawnControl<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" |<br />
*0 = Prevent player from pressing [R] to respawn, or using [Enter] to change spawn.<br />
*1 = Allow player to respawn / change spawn.<br />
|-<br />
| class="col1 centeralign" | ThirdPersonView<br />
| class="col2 centeralign" | byte<br />
| class="col3 centeralign" | <code>1</code><br />
| class="col4" |<br />
*0 = Disallow third-person view (only first-person view allowed).<br />
*1 = Allow third-person view.<br />
|-<br />
| class="col1 centeralign" | JumpHeight<br />
| class="col2 centeralign" | short<br />
| class="col3 centeralign" | <code>40</code><br />
| class="col4" | Maximum height, in terms of player movement units (1/32<sup>nd</sup>s of a block), to which the player is allowed to jump.<br />
Negative value (e.g. <code>-1</code>) means that the client should use its default jump height.<br />
|- class="row2"<br />
! class="col0" | Total Size:<br />
| class="col1 rightalign" colspan="4" | 8 bytes<br />
|}<br />
<br />
===MessageTypes===<br />
[[Image:Messagetypes.PNG|right|700px|Examples of all possible MessageTypes.]]<br />
:This extension adds new ways of presenting messages in the client.<br />
:'''Motivation''': To enhance the display of announcements and status information, and to reduce chat clutter.<br />
:'''Client behavior''': When this extension is mutually supported, the ''PlayerID'' field of the standard server-to-client [[Classic_Protocol#Server_.E2.86.92_Client_packets|'''''Message''''']] packet should be treated as a ''MessageType'' code. Unrecognized or unsupported codes may be ignored (in which case the message should be presented as a regular chat message). When connected to non-supporting servers, this field should be ignored.<br />
:'''Server behavior''': Server may use the ''PlayerID'' field of the [[Classic_Protocol#Server_.E2.86.92_Client_packets|'''''Message''''']] packet to set a ''MessageType''. For non-supporting clients, this field should always be set to <code>0</code>.<br />
<br />
:{| class="wikitable"<br />
!MessageType<br />
!Meaning<br />
!Suggested Implementation<br />
|-<br />
|<code>0</code><br />
|Chat<br />
|Normal message, shown in the chat area.<br />
|-<br />
|<code>1</code><br />
|Status1<br />
|Shown persistently in the top-right corner of the screen, in regular font.<br />
|-<br />
|<code>2</code><br />
|Status2<br />
|Shown persistently just below Status1<br />
|-<br />
|<code>3</code><br />
|Status3<br />
|Shown persistently just below Status2<br />
|-<br />
|<code>11</code><br />
|BottomRight1<br />
|Shown persistently in the bottom-right corner of the screen, in regular font.<br />
|-<br />
|<code>12</code><br />
|BottomRight2<br />
|Shown persistently just above BottomRight1<br />
|-<br />
|<code>13</code><br />
|BottomRight3<br />
|Shown persistently just above BottomRight2<br />
|-<br />
|<code>100</code><br />
|Announcement<br />
|Pops up in larger font near the top-center of the screen. Fades out after a few seconds.<br />
|}<br />
<br />
:This extension does not define any new packets.<br />
<br />
===PlayerClick===<br />
:This extension lets the server receive details of every mouse click a player makes, including targeting information.<br />
:'''Motivation''': To allow for the creation of more interactive maps: interactive buttons, cannons, ability to "tag" or "shoot" other players, ability to drag-to-draw at a distance, etc.<br />
:'''Client Behavior''': When this extension is mutually supported, a '''''PlayerClicked''''' packet should be sent to the server, as soon as reasonably possible, every time the user presses or releases a mouse button. Mouse interactions that happen while player is interacting with chat, with GUI menus, or with any other application must NOT be sent. A matching "released" event must be sent for every "pressed" event.<br />
<br />
:High resolution up-to-date ''Yaw'' and ''Pitch'' for the player should be transmitted with every packet. If player is currently targeting another entity/player ''TargetEntityID'' fields should be set. If player is currently targeting a block (within permitted [[Classic_Protocol_Extension#ClickDistance|ClickDistance]]) ''TargetBlockX'', ''TargetBlockY'', ''TargetBlockZ'', and ''TargetBlockFace'' should be set. An out-of-range value should be used for these fields when they are not in use. These packets should not be sent during level transitions (after receiving '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelInitialize]]''''' and until receiving '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|LevelFinalize]]''''' packets).<br />
:'''Server Behavior''': Server must be ready to accept any number of '''''PlayerClicked''''' packets at any time after level sending has completed. What to do with this information is entirely up to the server.<br />
<h4>PlayerClicked packet</h4><br />
:''Client to Server''<br />
:{| class="wikitable"<br />
|-<br />
! Packet ID<br />
! Field Name<br />
! Field Type<br />
! Example<br />
! Notes<br />
|-<br />
| class="centeralign" rowspan="9" | 0x22 (34)<br />
| class="centeralign" | Button<br />
| class="centeralign" | byte<br />
| class="centeralign" | 0<br />
| class="centeralign" | 0 = Left click, 1 = Right Click, 2 = Middle click<br />
|-<br />
| class="centeralign" | Action<br />
| class="centeralign" | byte<br />
| class="centeralign" | 0<br />
| class="centeralign" | 0 = Pressed, 1 = Released<br />
|-<br />
| class="centeralign" | Yaw<br />
| class="centeralign" | short<br />
| class="centeralign" | 0<br />
| class="centeralign" | Yaw (heading) of the player.<br />
Same function as ''Yaw'' field of '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|PositionAndOrientation]]''''' packet, but with more precision. <br />
|-<br />
| class="centeralign" | Pitch<br />
| class="centeralign" | short<br />
| class="centeralign" | 0<br />
| class="centeralign" | Pitch (head angle) of the player.<br />
Same function as ''Pitch'' field of '''''[[Classic_Protocol#Server_.E2.86.92_Client_packets|PositionAndOrientation]]''''' packet, but with more precision.<br />
|-<br />
| class="centeralign" | TargetEntityID<br />
| class="centeralign" | byte<br />
| class="centeralign" | 0<br />
| class="centeralign" | ID of an entity currently targeted by the player, between 0 and 127.<br />
Any out-of-range value means "no entity is targeted."<br />
|-<br />
| class="centeralign" | TargetBlockX<br />
| class="centeralign" | short<br />
| class="centeralign" | 64<br />
| class="centeralign" | X coordinate of a targeted block, between 0 and 2048.<br />
Any out-of-range value for any of the coordinates means "no block is targeted."<br />
|-<br />
| class="centeralign" | TargetBlockY<br />
| class="centeralign" | short<br />
| class="centeralign" | 64<br />
| class="centeralign" | Y coordinate of a targeted block, between 0 and 2048.<br />
|-<br />
| class="centeralign" | TargetBlockZ<br />
| class="centeralign" | short<br />
| class="centeralign" | 64<br />
| class="centeralign" | Z coordinate of a targeted block, between 0 and 2048.<br />
|-<br />
| class="centeralign" | TargetBlockFace<br />
| class="centeralign" | byte<br />
| class="centeralign" | 1<br />
| class="centeralign" | Index of the block face that the player is targeting. Block faces are numbered as follows:<br />
0. Away from X-origin<br />
<br />
1. Towards X-origin<br />
<br />
2. Away from Y-origin (up)<br />
<br />
3. Towards Y-origin (down)<br />
<br />
4. Away from Z-origin<br />
<br />
5. Towards Z-origin<br />
<br />
Any out-of-range value for ''TargetBlockFace'' mean "no block is targeted."<br />
|-<br />
! Total Size:<br />
| class="rightalign" colspan="4" | 15 bytes<br />
|}<br />
<br />
[[Category:Minecraft Classic]]</div>727021