-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathClassic_Protocol_Extension.html
2583 lines (2546 loc) · 124 KB
/
Classic_Protocol_Extension.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html class="client-nojs" lang="en" dir="ltr">
<head>
<meta charset="UTF-8"/>
<title>Classic Protocol Extension - wiki.vg</title>
<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>
<script>(window.RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Classic_Protocol_Extension","wgTitle":"Classic Protocol Extension","wgCurRevisionId":13624,"wgRevisionId":13624,"wgArticleId":255,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Minecraft Classic"],"wgBreakFrames":false,"wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgMonthNamesShort":["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"wgRelevantPageName":"Classic_Protocol_Extension","wgRelevantArticleId":255,"wgRequestId":"13ff27dbdd3407d60b74d487","wgIsProbablyEditable":false,"wgRestrictionEdit":[],"wgRestrictionMove":[]});mw.loader.state({"site.styles":"ready","noscript":"ready","user.styles":"ready","user.cssprefs":"ready","user":"ready","user.options":"loading","user.tokens":"loading","mediawiki.legacy.shared":"ready","mediawiki.legacy.commonPrint":"ready","mediawiki.sectionAnchor":"ready","mediawiki.skinning.interface":"ready","skins.vector.styles":"ready"});mw.loader.implement("user.options@0j3lz3q",function($,jQuery,require,module){mw.user.options.set({"variant":"en"});});mw.loader.implement("user.tokens@12oj1re",function ( $, jQuery, require, module ) {
mw.user.tokens.set({"editToken":"+\\","patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"});/*@nomin*/;
});mw.loader.load(["mediawiki.page.startup","skins.vector.js"]);});</script>
<link rel="stylesheet" href="https://wiki.vg/load.php?debug=false&lang=en&modules=mediawiki.legacy.commonPrint%2Cshared%7Cmediawiki.sectionAnchor%7Cmediawiki.skinning.interface%7Cskins.vector.styles&only=styles&skin=vector"/>
<script async="" src="https://wiki.vg/load.php?debug=false&lang=en&modules=startup&only=scripts&skin=vector"></script>
<meta name="ResourceLoaderDynamicStyles" content=""/>
<link rel="stylesheet" href="https://wiki.vg/load.php?debug=false&lang=en&modules=site.styles&only=styles&skin=vector"/>
<meta name="generator" content="MediaWiki 1.28.2"/>
<link rel="shortcut icon" href="https://wiki.vg/favicon.ico"/>
<link rel="search" type="application/opensearchdescription+xml" href="https://wiki.vg/opensearch_desc.php" title="wiki.vg (en)"/>
<link rel="EditURI" type="application/rsd+xml" href="http://wiki.vg/api.php?action=rsd"/>
<link rel="copyright" href="http://creativecommons.org/licenses/by-sa/3.0/"/>
<link rel="alternate" type="application/atom+xml" title="wiki.vg Atom feed" href="https://wiki.vg/index.php?title=Special:RecentChanges&feed=atom"/>
</head>
<body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Classic_Protocol_Extension rootpage-Classic_Protocol_Extension skin-vector action-view"> <div id="mw-page-base" class="noprint"></div>
<div id="mw-head-base" class="noprint"></div>
<div id="content" class="mw-body" role="main">
<a id="top"></a>
<div class="mw-indicators">
</div>
<h1 id="firstHeading" class="firstHeading" lang="en">Classic Protocol Extension</h1>
<div id="bodyContent" class="mw-body-content">
<div id="siteSub">From wiki.vg</div>
<div id="contentSub"></div>
<div id="jump-to-nav" class="mw-jump">
Jump to: <a href="Classic_Protocol_Extension.html#mw-head">navigation</a>, <a href="Classic_Protocol_Extension.html#p-search">search</a>
</div>
<div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr"><p><b>Classic Protocol Extension</b> (CPE) is a project to augment the Minecraft Classic network protocol with new and improved functionality.
</p><p>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.
</p>
<table class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #f28500;background:#fbfbfb;width:80%;font-size:110%">
<tr>
<td style="padding:10px"><b>This specification has not yet been finalized, and is subject to change.</b>
<p>Last revision: 19 Nov 2017.
Keep an eye on <a href="Classic_Protocol_Extension/History.html" title="Classic Protocol Extension/History">the history subpage</a> for a chronology of changes.
</p>
</td></tr></table>
<table class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #3dc238;background:#fbfbfb;width:80%;font-size:110%">
<tr>
<td style="padding:10px"><b>Do you have an idea for an extension? Please post it on the <a href="Classic_Protocol_Extension/Proposals.html" title="Classic Protocol Extension/Proposals">Proposals</a> subpage.</b>
</td></tr></table>
<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="Classic_Protocol_Extension.html#Support"><span class="tocnumber">1</span> <span class="toctext">Support</span></a></li>
<li class="toclevel-1 tocsection-2"><a href="Classic_Protocol_Extension.html#Negotiation"><span class="tocnumber">2</span> <span class="toctext">Negotiation</span></a>
<ul>
<li class="toclevel-2"><a href="Classic_Protocol_Extension.html#ExtInfo_Packet"><span class="tocnumber">2.1</span> <span class="toctext">ExtInfo Packet</span></a></li>
<li class="toclevel-2"><a href="Classic_Protocol_Extension.html#ExtEntry_Packet"><span class="tocnumber">2.2</span> <span class="toctext">ExtEntry Packet</span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-3"><a href="Classic_Protocol_Extension.html#Extensions"><span class="tocnumber">3</span> <span class="toctext">Extensions</span></a>
<ul>
<li class="toclevel-2 tocsection-4"><a href="Classic_Protocol_Extension.html#ClickDistance"><span class="tocnumber">3.1</span> <span class="toctext">ClickDistance</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#SetClickDistance_packet"><span class="tocnumber">3.1.1</span> <span class="toctext">SetClickDistance packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-5"><a href="Classic_Protocol_Extension.html#CustomBlocks"><span class="tocnumber">3.2</span> <span class="toctext">CustomBlocks</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#CustomBlockSupportLevel_packet"><span class="tocnumber">3.2.1</span> <span class="toctext">CustomBlockSupportLevel packet</span></a></li>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#Blocks_in_support_level_1"><span class="tocnumber">3.2.2</span> <span class="toctext">Blocks in support level 1</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-6"><a href="Classic_Protocol_Extension.html#HeldBlock"><span class="tocnumber">3.3</span> <span class="toctext">HeldBlock</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#HoldThis_packet"><span class="tocnumber">3.3.1</span> <span class="toctext">HoldThis packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-7"><a href="Classic_Protocol_Extension.html#EmoteFix"><span class="tocnumber">3.4</span> <span class="toctext">EmoteFix</span></a></li>
<li class="toclevel-2 tocsection-8"><a href="Classic_Protocol_Extension.html#TextHotKey"><span class="tocnumber">3.5</span> <span class="toctext">TextHotKey</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#SetTextHotKey_packet"><span class="tocnumber">3.5.1</span> <span class="toctext">SetTextHotKey packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-9"><a href="Classic_Protocol_Extension.html#ExtPlayerList"><span class="tocnumber">3.6</span> <span class="toctext">ExtPlayerList</span></a>
<ul>
<li class="toclevel-3 tocsection-10"><a href="Classic_Protocol_Extension.html#Version_1_.28Deprecated_since_28_August_2014.29"><span class="tocnumber">3.6.1</span> <span class="toctext">Version 1 (Deprecated since 28 August 2014)</span></a></li>
<li class="toclevel-3 tocsection-11"><a href="Classic_Protocol_Extension.html#Version_2"><span class="tocnumber">3.6.2</span> <span class="toctext">Version 2</span></a>
<ul>
<li class="toclevel-4"><a href="Classic_Protocol_Extension.html#Client_Behavior"><span class="tocnumber">3.6.2.1</span> <span class="toctext">Client Behavior</span></a></li>
<li class="toclevel-4"><a href="Classic_Protocol_Extension.html#Server_Behavior"><span class="tocnumber">3.6.2.2</span> <span class="toctext">Server Behavior</span></a></li>
<li class="toclevel-4"><a href="Classic_Protocol_Extension.html#ExtAddPlayerName_Packet"><span class="tocnumber">3.6.2.3</span> <span class="toctext">ExtAddPlayerName Packet</span></a></li>
<li class="toclevel-4"><a href="Classic_Protocol_Extension.html#ExtAddEntity2_Packet"><span class="tocnumber">3.6.2.4</span> <span class="toctext">ExtAddEntity2 Packet</span></a></li>
<li class="toclevel-4"><a href="Classic_Protocol_Extension.html#ExtRemovePlayerName_Packet"><span class="tocnumber">3.6.2.5</span> <span class="toctext">ExtRemovePlayerName Packet</span></a></li>
</ul>
</li>
</ul>
</li>
<li class="toclevel-2 tocsection-12"><a href="Classic_Protocol_Extension.html#EnvColors"><span class="tocnumber">3.7</span> <span class="toctext">EnvColors</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#EnvSetColor_Packet"><span class="tocnumber">3.7.1</span> <span class="toctext">EnvSetColor Packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-13"><a href="Classic_Protocol_Extension.html#SelectionCuboid"><span class="tocnumber">3.8</span> <span class="toctext">SelectionCuboid</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#MakeSelection_packet"><span class="tocnumber">3.8.1</span> <span class="toctext">MakeSelection packet</span></a></li>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#RemoveSelection_packet"><span class="tocnumber">3.8.2</span> <span class="toctext">RemoveSelection packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-14"><a href="Classic_Protocol_Extension.html#BlockPermissions"><span class="tocnumber">3.9</span> <span class="toctext">BlockPermissions</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#SetBlockPermission_packet"><span class="tocnumber">3.9.1</span> <span class="toctext">SetBlockPermission packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-15"><a href="Classic_Protocol_Extension.html#ChangeModel"><span class="tocnumber">3.10</span> <span class="toctext">ChangeModel</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#Client_Behavior_2"><span class="tocnumber">3.10.1</span> <span class="toctext">Client Behavior</span></a></li>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#Server_Behavior_2"><span class="tocnumber">3.10.2</span> <span class="toctext">Server Behavior</span></a></li>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#Interaction_with_ExtPlayerList"><span class="tocnumber">3.10.3</span> <span class="toctext">Interaction with ExtPlayerList</span></a></li>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#ChangeModel_Packet"><span class="tocnumber">3.10.4</span> <span class="toctext">ChangeModel Packet</span></a></li>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#Available_models"><span class="tocnumber">3.10.5</span> <span class="toctext">Available models</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-16"><a href="Classic_Protocol_Extension.html#EnvMapAppearance"><span class="tocnumber">3.11</span> <span class="toctext">EnvMapAppearance</span></a>
<ul>
<li class="toclevel-3 tocsection-17"><a href="Classic_Protocol_Extension.html#Version_1_.28Deprecated_since_9_May_2016.29"><span class="tocnumber">3.11.1</span> <span class="toctext">Version 1 (Deprecated since 9 May 2016)</span></a></li>
<li class="toclevel-3 tocsection-18"><a href="Classic_Protocol_Extension.html#Version_2_.28Deprecated_since_21_June_2017.29"><span class="tocnumber">3.11.2</span> <span class="toctext">Version 2 (Deprecated since 21 June 2017)</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-19"><a href="Classic_Protocol_Extension.html#EnvWeatherType"><span class="tocnumber">3.12</span> <span class="toctext">EnvWeatherType</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#EnvSetWeatherType_Packet"><span class="tocnumber">3.12.1</span> <span class="toctext">EnvSetWeatherType Packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-20"><a href="Classic_Protocol_Extension.html#HackControl"><span class="tocnumber">3.13</span> <span class="toctext">HackControl</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#HackControl_Packet"><span class="tocnumber">3.13.1</span> <span class="toctext">HackControl Packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-21"><a href="Classic_Protocol_Extension.html#MessageTypes"><span class="tocnumber">3.14</span> <span class="toctext">MessageTypes</span></a></li>
<li class="toclevel-2 tocsection-22"><a href="Classic_Protocol_Extension.html#PlayerClick"><span class="tocnumber">3.15</span> <span class="toctext">PlayerClick</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#PlayerClicked_packet"><span class="tocnumber">3.15.1</span> <span class="toctext">PlayerClicked packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-23"><a href="Classic_Protocol_Extension.html#LongerMessages"><span class="tocnumber">3.16</span> <span class="toctext">LongerMessages</span></a></li>
<li class="toclevel-2 tocsection-24"><a href="Classic_Protocol_Extension.html#FullCP437"><span class="tocnumber">3.17</span> <span class="toctext">FullCP437</span></a></li>
<li class="toclevel-2 tocsection-25"><a href="Classic_Protocol_Extension.html#BlockDefinitions"><span class="tocnumber">3.18</span> <span class="toctext">BlockDefinitions</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#DefineBlock_Packet"><span class="tocnumber">3.18.1</span> <span class="toctext">DefineBlock Packet</span></a></li>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#RemoveBlockDefinition_Packet"><span class="tocnumber">3.18.2</span> <span class="toctext">RemoveBlockDefinition Packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-26"><a href="Classic_Protocol_Extension.html#BlockDefinitionsExt"><span class="tocnumber">3.19</span> <span class="toctext">BlockDefinitionsExt</span></a>
<ul>
<li class="toclevel-3 tocsection-27"><a href="Classic_Protocol_Extension.html#Version_1_.28Deprecated_since_9_May_2016.29_2"><span class="tocnumber">3.19.1</span> <span class="toctext">Version 1 (Deprecated since 9 May 2016)</span></a></li>
<li class="toclevel-3 tocsection-28"><a href="Classic_Protocol_Extension.html#Version_2_2"><span class="tocnumber">3.19.2</span> <span class="toctext">Version 2</span></a>
<ul>
<li class="toclevel-4"><a href="Classic_Protocol_Extension.html#DefineBlockExt_Packet"><span class="tocnumber">3.19.2.1</span> <span class="toctext">DefineBlockExt Packet</span></a></li>
</ul>
</li>
</ul>
</li>
<li class="toclevel-2 tocsection-29"><a href="Classic_Protocol_Extension.html#BulkBlockUpdate"><span class="tocnumber">3.20</span> <span class="toctext">BulkBlockUpdate</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#BulkBlockUpdate_packet"><span class="tocnumber">3.20.1</span> <span class="toctext">BulkBlockUpdate packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-30"><a href="Classic_Protocol_Extension.html#TextColors"><span class="tocnumber">3.21</span> <span class="toctext">TextColors</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#SetTextColor_packet"><span class="tocnumber">3.21.1</span> <span class="toctext">SetTextColor packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-31"><a href="Classic_Protocol_Extension.html#EnvMapAspect"><span class="tocnumber">3.22</span> <span class="toctext">EnvMapAspect</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#SetMapEnvUrl_packet"><span class="tocnumber">3.22.1</span> <span class="toctext">SetMapEnvUrl packet</span></a>
<ul>
<li class="toclevel-4"><a href="Classic_Protocol_Extension.html#Texture_pack_.zip_format"><span class="tocnumber">3.22.1.1</span> <span class="toctext">Texture pack .zip format</span></a></li>
<li class="toclevel-4"><a href="Classic_Protocol_Extension.html#animations.txt_format"><span class="tocnumber">3.22.1.2</span> <span class="toctext">animations.txt format</span></a></li>
</ul>
</li>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#SetMapEnvProperty_packet"><span class="tocnumber">3.22.2</span> <span class="toctext">SetMapEnvProperty packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-32"><a href="Classic_Protocol_Extension.html#EntityProperty"><span class="tocnumber">3.23</span> <span class="toctext">EntityProperty</span></a>
<ul>
<li class="toclevel-3"><a href="Classic_Protocol_Extension.html#SetEntityProperty_packet"><span class="tocnumber">3.23.1</span> <span class="toctext">SetEntityProperty packet</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-33"><a href="Classic_Protocol_Extension.html#ExtEntityPositions"><span class="tocnumber">3.24</span> <span class="toctext">ExtEntityPositions</span></a></li>
</ul>
</li>
</ul>
</div>
<h2><span class="mw-headline" id="Support">Support</span></h2>
<dl><dd><i>See <a href="Classic_Protocol_Extension/Support.html" title="Classic Protocol Extension/Support">support subpage</a> for a detailed table.</i></dd></dl>
<p>Custom servers that already support CPE: <a rel="nofollow" class="external text" href="http://femto.fcraft.net/">FemtoCraft</a>, <a rel="nofollow" class="external text" href="http://umby.d3s.co/CCD3/">D3</a>, <a rel="nofollow" class="external text" href="http://github.com/LeChosenOne/LegendCraft/">LegendCraft</a>, <a rel="nofollow" class="external text" href="http://GemsCraftMC.weebly.com/">GemsCraft</a>, <a rel="nofollow" class="external text" href="https://github.com/umby24/Hypercube">Hypercube</a>, <a rel="nofollow" class="external text" href="http://mcsong.x10.mx/forums/">MCSong</a>
</p><p>Custom servers that plan to add support: <a rel="nofollow" class="external text" href="http://800craft.net/">800Craft</a>, <a rel="nofollow" class="external text" href="http://github.com/tyteen4a03/cloudBox">cloudBox</a>, <a rel="nofollow" class="external text" href="http://www.fcraft.net/">fCraft</a>, <a rel="nofollow" class="external text" href="https://github.com/GamezGalaxy/GGS/tree/Classic-Extension">GGS</a>
</p><p>Custom clients that already support CPE: <a rel="nofollow" class="external text" href="http://classicube.net">ClassiCube Client</a>, <a rel="nofollow" class="external text" href="https://github.com/UnknownShadow200/ClassicalSharp/">ClassicalSharp</a>
</p><p>Custom clients that plan to add support: <a rel="nofollow" class="external text" href="http://charged-miners.com/">Charged Miners</a>, <a rel="nofollow" class="external text" href="http://Client.GemsCraft.net/">GemsClient</a>
</p>
<h2><span class="mw-headline" id="Negotiation">Negotiation</span></h2>
<p>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. <b>All CPE-capable software is required to support this.</b>
</p>
<div class="thumb tright"><div class="thumbinner" style="width:264px;"><a href="./File:CPE_Negotiation.png.html" class="image"><img alt="CPE Negotiation.png" src="images/8/82/CPE_Negotiation.png" width="262" height="398" class="thumbimage" /></a> <div class="thumbcaption"></div></div></div>
<p><b>Client behavior</b>: Extended clients must use magic number of <code>0x42</code> (<code>66</code> decimal) for the padding byte of the <a href="Classic_Protocol.html#Client_.E2.86.92_Server_packets" title="Classic Protocol"><i><b>PlayerIdentification</b></i></a> packet. It must then await a response. If server responds with any packet other than <i><b>ExtInfo</b></i>, client must assume that the server does NOT support CPE. If the server responds with an <i><b>ExtInfo</b></i> packet, client must parse it and any <i><b>ExtEntry</b></i> 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 <i><b>ExtInfo</b></i> packet of its own, followed by a list of zero or more client-supported extensions. After sending the last of <i><b>ExtEntry</b></i> packets, client should activate all mutually-supported extensions and resume normal login procedure.
</p><p><b>Server behavior</b>: When a client connects, server must read the <a href="Classic_Protocol.html#Client_.E2.86.92_Server_packets" title="Classic Protocol"><i><b>PlayerIdentification</b></i></a> 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.
</p><p>Server must immediately reply to CPE clients with an <i><b>ExtInfo</b></i> packet, followed by zero or more <i><b>ExtEntry</b></i> packets, and await a response from the client. Client will respond with one <i><b>ExtInfo</b></i> and zero or more <i><b>ExtEntry</b></i> 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 <i><b>ExtEntry</b></i> packets, server should activate all mutually-supported extensions and resume normal login procedure.
</p><p><b>Note 1</b>: 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.
</p><p><b>Note 2</b>: Do not make any assumptions about supported functionality based on the <i>AppName</i> field of <i><b>ExtInfo</b></i> packet. It's for logging purposes only.
</p><p><b>Note 3</b>: Do not declare support for an extension until it is FULLY implemented, except for debugging.
</p>
<dl><dd><h4><span class="mw-headline" id="ExtInfo_Packet">ExtInfo Packet</span></h4></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign" rowspan="2"> 0x10
<p>(16)
</p>
</td>
<td class="col1 centeralign"> AppName
</td>
<td class="col2 centeralign"> string
</td>
<td class="col3 centeralign"> <code>MyServer</code>
</td>
<td class="col4"> Client or server software name
</td></tr>
<tr class="row2">
<td class="col0 centeralign"> ExtensionCount
</td>
<td class="col1 centeralign"> short
</td>
<td class="col2 centeralign"> 1
</td>
<td class="col3"> Between 0 and 32767
</td></tr>
<tr class="row3">
<th class="col0"> Total Size:
</th>
<td class="col1 rightalign" colspan="4"> 67 bytes
</td></tr></table></dd></dl>
<dl><dd><h4><span class="mw-headline" id="ExtEntry_Packet">ExtEntry Packet</span></h4></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign" rowspan="2"> 0x11
<p>(17)
</p>
</td>
<td class="col1 centeralign"> ExtName
</td>
<td class="col2 centeralign"> string
</td>
<td class="col3 centeralign"> <code>MyExtension</code>
</td>
<td class="col4"> Name of a supported extension
</td></tr>
<tr class="row2">
<td class="col0 centeralign"> Version
</td>
<td class="col1 centeralign"> int
</td>
<td class="col2 centeralign"> 1
</td>
<td class="col3"> Only extensions with identical version numbers should be considered compatible.
</td></tr>
<tr class="row3">
<th class="col0"> Total Size:
</th>
<td class="col1 rightalign" colspan="4"> 69 bytes
</td></tr></table></dd></dl>
<h2><span class="mw-headline" id="Extensions">Extensions</span></h2>
<p><i><b>Note:</b></i> 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".
</p>
<table class="wikitable" style="margin:10px 10%;border: 1px solid #aaa;border-left:10px solid #3dc238;background:#fbfbfb;width:80%;font-size:110%">
<tr>
<td style="padding:10px"><b>Do you have an idea for an extension? Please post it on the <a href="Classic_Protocol_Extension/Proposals.html" title="Classic Protocol Extension/Proposals">Proposals</a> subpage.</b>
</td></tr></table>
<h3><span class="mw-headline" id="ClickDistance">ClickDistance</span></h3>
<dl><dd>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.</dd>
<dd><b>Motivation</b>: 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.</dd>
<dd><b>Client Behavior</b>: Upon receiving a <i><b>SetClickDistance</b></i> packet, client should immediately apply the change. <i>Distance</i> should persist between worlds/maps.</dd>
<dd><b>Server Behavior</b>: Server should send <i><b>SetClickDistance</b></i> 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.</dd>
<dd><h4><span class="mw-headline" id="SetClickDistance_packet">SetClickDistance packet</span></h4></dd>
<dd><i>Server to Client</i></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign"> 0x12
<p>(18)
</p>
</td>
<td class="col1 centeralign"> Distance
</td>
<td class="col2 centeralign"> short
</td>
<td class="col3 centeralign"> 160
</td>
<td class="col4">
</td></tr>
<tr class="row2">
<th class="col0"> Total Size:
</th>
<td class="col1 rightalign" colspan="4"> 3 bytes
</td></tr></table></dd></dl>
<h3><span class="mw-headline" id="CustomBlocks">CustomBlocks</span></h3>
<dl><dd>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.</dd>
<dd><b>Motivation</b>: Adding new visually distinct blocks, to enhance Classic players' experience.</dd>
<dd><b>Client behavior</b>: Client must expect a <i><b>CustomBlockSupportLevel</b></i> packet from a compatible server immediately after sending the last <i><b>ExtEntry</b></i> packet. It should then reply with its own <i><b>CustomBlockSupportLevel</b></i> 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 <a href="Classic_Protocol.html#Client_.E2.86.92_Server_packets" title="Classic Protocol"><i><b>ServerIdentification</b></i></a> packet only AFTER sending its <i><b>CustomBlockSupportLevel</b></i> packet.</dd>
<dd><b>Server behavior</b>: Server must send a <i><b>CustomBlockSupportLevel</b></i> packet to compatible clients immediately after receiving the last <i><b>ExtEntry</b></i> packet from the client. It should then wait to receive a <i><b>CustomBlockSupportLevel</b></i> packet from the client before sending the <a href="Classic_Protocol.html#Client_.E2.86.92_Server_packets" title="Classic Protocol"><i><b>ServerIdentification</b></i></a> 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.</dd></dl>
<dl><dd><h4><span class="mw-headline" id="CustomBlockSupportLevel_packet">CustomBlockSupportLevel packet</span></h4></dd>
<dd><i>Server to Client</i></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign"> 0x13
<p>(19)
</p>
</td>
<td class="col1 centeralign"> SupportLevel
</td>
<td class="col2 centeralign"> byte
</td>
<td class="col3 centeralign"> 1
</td>
<td class="col4">
</td></tr>
<tr class="row2">
<th class="col0"> Total Size:
</th>
<td class="col1 rightalign" colspan="4"> 2
</td></tr></table></dd></dl>
<dl><dd><h4><span class="mw-headline" id="Blocks_in_support_level_1">Blocks in support level 1</span></h4></dd>
<dd>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.</dd>
<dd><a href="./File:CPE_CustomBlocks_Level1.png.html" class="image"><img alt="CPE CustomBlocks Level1.png" src="images/7/7c/CPE_CustomBlocks_Level1.png" width="679" height="170" /></a></dd></dl>
<dl><dd><table class="wikitable">
<tr>
<th>Block name
</th>
<th>Block ID
</th>
<th>Fallback name
</th>
<th>Fallback ID
</th></tr>
<tr>
<td><b>CobblestoneSlab</b>
</td>
<td>0x32 (50)
</td>
<td>Slab
</td>
<td>0x2C (44)
</td></tr>
<tr>
<td><b>Rope</b>
</td>
<td>0x33 (51)
</td>
<td>BrownMushroom
</td>
<td>0x27 (39)
</td></tr>
<tr>
<td><b>Sandstone</b>
</td>
<td>0x34 (52)
</td>
<td>Sand
</td>
<td>0x0C (12)
</td></tr>
<tr>
<td><b>Snow</b>
</td>
<td>0x35 (53)
</td>
<td>Air
</td>
<td>0x00 (0)
</td></tr>
<tr>
<td><b>Fire</b>
</td>
<td>0x36 (54)
</td>
<td>Lava
</td>
<td>0x0A (10)
</td></tr>
<tr>
<td><b>LightPinkWool</b>
</td>
<td>0x37 (55)
</td>
<td>Pink
</td>
<td>0x21 (33)
</td></tr>
<tr>
<td><b>ForestGreenWool</b>
</td>
<td>0x38 (56)
</td>
<td>Green
</td>
<td>0x19 (25)
</td></tr>
<tr>
<td><b>BrownWool</b>
</td>
<td>0x39 (57)
</td>
<td>Dirt
</td>
<td>0x03 (3)
</td></tr>
<tr>
<td><b>DeepBlue</b>
</td>
<td>0x3A (58)
</td>
<td>Blue
</td>
<td>0x1d (29)
</td></tr>
<tr>
<td><b>Turquoise</b>
</td>
<td>0x3B (59)
</td>
<td>Cyan
</td>
<td>0x1c (28)
</td></tr>
<tr>
<td><b>Ice</b>
</td>
<td>0x3C (60)
</td>
<td>Glass
</td>
<td>0x14 (20)
</td></tr>
<tr>
<td><b>CeramicTile</b>
</td>
<td>0x3D (61)
</td>
<td>Iron
</td>
<td>0x2a (42)
</td></tr>
<tr>
<td><b>Magma</b>
</td>
<td>0x3E (62)
</td>
<td>Obsidian
</td>
<td>0x31 (49)
</td></tr>
<tr>
<td><b>Pillar</b>
</td>
<td>0x3F (63)
</td>
<td>White
</td>
<td>0x24 (36)
</td></tr>
<tr>
<td><b>Crate</b>
</td>
<td>0x40 (64)
</td>
<td>WoodenPlanks
</td>
<td>0x05 (5)
</td></tr>
<tr>
<td><b>StoneBrick</b>
</td>
<td>0x41 (65)
</td>
<td>Stone
</td>
<td>0x01 (1)
</td></tr></table></dd></dl>
<dl><dd>Block IDs for future support levels are guaranteed to be assigned monotonically, incrementally, and permanently.</dd></dl>
<h3><span class="mw-headline" id="HeldBlock">HeldBlock</span></h3>
<dl><dd>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. </dd>
<dd><b>Motivation</b>: 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 <a rel="nofollow" class="external text" href="http://www.fcraft.net/wiki//Spectate">/Spectate</a> to show what block a spectated player is holding.</dd>
<dd><b>Client behavior</b>: When this extension is mutually supported, client should use the <i>PlayerID</i> field of the <i><b><a href="Classic_Protocol.html#Client_.E2.86.92_Server_packets" title="Classic Protocol">PositionAndOrientation</a></b></i> packet (currently unused) to indicate which blocktype the client is currently holding. It should be ready to accept <i><b>HoldThis</b></i> packets to change the block that the player is holding. If <code>0</code> is given for <i>BlockToHold</i>, 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.</dd>
<dd><b>Server behavior</b>: The server can use <i><b>HoldThis</b></i> packet to force the client to hold the desired block type. It should be done sparingly.</dd></dl>
<dl><dd><h4><span class="mw-headline" id="HoldThis_packet">HoldThis packet</span></h4></dd>
<dd><i>Server to Client</i></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign" rowspan="2"> 0x14
<p>(20)
</p>
</td>
<td class="col1 centeralign"> BlockToHold
</td>
<td class="col2 centeralign"> byte
</td>
<td class="col3 centeralign"> <code>49</code>
</td>
<td class="col4"> Standard block type
</td></tr>
<tr class="row2">
<td class="col1 centeralign"> PreventChange
</td>
<td class="col2 centeralign"> byte
</td>
<td class="col3 centeralign"> 0
</td>
<td class="col4">0 = Allow player to change blocktype
<p>1 = Prevent player from changing blocktype
</p>
</td></tr>
<tr class="row3">
<th class="col0"> Total Size:
</th>
<td class="col1 rightalign" colspan="4"> 3 bytes
</td></tr></table></dd></dl>
<h3><span class="mw-headline" id="EmoteFix">EmoteFix</span></h3>
<dl><dd>This extension indicates that the client can render <a rel="nofollow" class="external text" href="http://fcraft.net/wiki/Emotes">emotes</a> (ASCII control characters) in chat properly, without padding or suffixes that are required for vanilla client. This extension does not define any new packets.</dd>
<dd><b>Motivation</b>: To improve appearance of emotes in chat.</dd>
<dd><b>Client behavior</b>: Client should not emulate vanilla client's quirks.</dd>
<dd><b>Server behavior</b>: Server should not pad or suffix emotes in chat.</dd></dl>
<h3><span class="mw-headline" id="TextHotKey">TextHotKey</span></h3>
<dl><dd>This extension allows the server to define "hotkeys" for certain commands.</dd>
<dd><b>Motivation</b>: To speed up and simplify access to commonly-used commands and command macros by providing server-defined client-side hotkeys.</dd>
<dd><b>Client behavior:</b> 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 <i>Action</i> field. A newline character (<code>\n</code>) in the <i>Action</i> field indicates that whatever is currently typed-in should be sent to the server. If <i>Action</i> 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.</dd>
<dd><b>Server behavior:</b> The server should send a definition of each hotkey (<i><b>SetTextHotKey</b></i> packet) once per connection.</dd></dl>
<dl><dd><h4><span class="mw-headline" id="SetTextHotKey_packet">SetTextHotKey packet</span></h4></dd>
<dd><i>Server to Client</i></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign" rowspan="4"> 0x15
<p>(21)
</p>
</td>
<td class="col1 centeralign"> Label
</td>
<td class="col2 centeralign"> string
</td>
<td class="col3 centeralign"> <code>Copy</code>
</td>
<td class="col4"> Readable name of the hotkey
</td></tr>
<tr class="row2">
<td class="col1 centeralign"> Action
</td>
<td class="col2 centeralign"> string
</td>
<td class="col3 centeralign"> <code>/Copy </code>
</td>
<td class="col4"> Text to type in
</td></tr>
<tr class="row2">
<td class="col1 centeralign"> KeyCode
</td>
<td class="col2 centeralign"> int
</td>
<td class="col3 centeralign"> <code>113</code>
</td>
<td class="col4"> <a rel="nofollow" class="external text" href="http://www.minecraftwiki.net/wiki/Key_Codes">LWJGL keycode</a> of the key
</td></tr>
<tr class="row3">
<td class="col1 centeralign"> KeyMods
</td>
<td class="col2 centeralign"> byte
</td>
<td class="col3 centeralign"> <code>0</code>
</td>
<td class="col4"> Key modifier <a rel="nofollow" class="external text" href="http://en.wikipedia.org/wiki/Flag_word">flags</a>, may be combined:
<ul><li> 0 = None</li>
<li> 1 = Ctrl</li>
<li> 2 = Shift</li>
<li> 4 = Alt</li></ul>
</td></tr>
<tr class="row4">
<th class="col0"> Total Size:
</th>
<td class="col1 rightalign" colspan="4"> 134 bytes
</td></tr></table></dd></dl>
<h3><span class="mw-headline" id="ExtPlayerList">ExtPlayerList</span></h3>
<dl><dd><b>Motivation</b>: 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. <i><b>ExtAddPlayerName</b></i>/<i><b>ExtRemovePlayerName</b></i> packets take over managing the player names list (tab-list), and <i><b>ExtAddEntity2</b></i>/<i><b><a href="Classic_Protocol.html#Server_.E2.86.92_Client_packets" title="Classic Protocol">DespawnPlayer</a></b></i> packets are used only to manage in-game entities.</dd></dl>
<h4><span class="mw-headline" id="Version_1_.28Deprecated_since_28_August_2014.29">Version 1 (Deprecated since 28 August 2014)</span></h4>
<dl><dd>This version of the extension has been deprecated and replaced with version 2. See <a href="Classic_Protocol_Extension/Old_Extensions.html" title="Classic Protocol Extension/Old Extensions">old extensions subpage</a>.</dd></dl>
<h4><span class="mw-headline" id="Version_2">Version 2</span></h4>
<p>Version 2 of this extension replaces <i><b>ExtAddEntity</b></i> packet with <i><b>ExtAddEntity2</b></i>, allows using full URLs for <i>SkinName</i>, and clarifies interaction with <a href="Classic_Protocol_Extension.html#ChangeModel"><b>ChangeModel</b></a> extension.
</p>
<dl><dd><h5><span class="mw-headline" id="Client_Behavior">Client Behavior</span></h5></dd>
<dd>When <i><b>ExtAddPlayerName</b></i> packet is received for an unrecognized <i>NameID</i>, a new name must be added to the player-name list. When receiving <i><b>ExtAddPlayerName</b></i> packet for an already-listed <i>NameID</i>, client must update its <i>ListName</i>, <i>GroupName</i>, and <i>GroupRank</i>. Player-name list must persist when client changes worlds/maps.</dd></dl>
<dl><dd>When an <i><b>ExtAddEntity2</b></i> packet is received, it must be treated as the <i><b><a href="Classic_Protocol.html#Server_.E2.86.92_Client_packets" title="Classic Protocol">SpawnPlayer</a></b></i> packet. A player model must be spawned in-game at the given location, with <i>InGameName</i> text drawn above it. Skin should be loaded using the given <i>SkinName</i> for a player name. When client receives <i><b>ExtAddEntity2</b></i> packet for an already-spawned player, a duplicate entity must not be spawned and existing entity's position must not be changed. Instead their <i>InGameName</i> and <i>SkinName</i> must be updated. If a negative <i>EntityID</i> is given for <i><b>ExtAddEntity2</b></i>, client must update player's own spawn point, <i>InGameName</i>, and <i>SkinName</i>. The client must ignore regular <i><b><a href="Classic_Protocol.html#Server_.E2.86.92_Client_packets" title="Classic Protocol">SpawnPlayer</a></b></i> packets, if any are received.</dd></dl>
<dl><dd>Player entity's skin should be loaded using the given <i>SkinName</i>. If <i>SkinName</i> appears to be a player name, skin should be downloaded from the default skin server. If <i>SkinName</i> 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 <i>SkinName</i>, or if given image could not be downloaded or used, then the default skin should be used.</dd></dl>
<dl><dd>Names on the player-name list should be grouped by <i>GroupName</i> in the player-name list. Names within a <i>GroupName</i> should be sorted by <i>GroupRank</i> (in ascending order). Names with the same <i>GroupName</i> and <i>GroupRank</i> should be sorted alphabetically by <i>ListName</i>. Color codes may be either drawn or stripped from <i>ListName</i>, <i>GroupName</i>, and <i>InGameName</i>.</dd></dl>
<dl><dd>When a standard <i><b><a href="Classic_Protocol.html#Server_.E2.86.92_Client_packets" title="Classic Protocol">DespawnPlayer</a></b></i> packet is received for a recognized <i>EntityID</i>, player model must be removed from a world. When <i><b>ExtRemovePlayerName</b></i> packet is received for a recognized <i>NameID</i>, their name must be removed from player-name list. Packets with out-of-range or unrecognized <i>NameID</i>s must be ignored.</dd></dl>
<dl><dd>In-game entities must never be affected by <i><b>ExtAddPlayerName</b></i> or <i><b>ExtRemovePlayerName</b></i> packets. Player name list must never be affected by <i><b>ExtAddEntity2</b></i> or <i><b><a href="Classic_Protocol.html#Server_.E2.86.92_Client_packets" title="Classic Protocol">DespawnPlayer</a></b></i> packets.</dd></dl>
<dl><dd><h5><span class="mw-headline" id="Server_Behavior">Server Behavior</span></h5></dd></dl>
<table class="wikitable" style="float:right">
<tr>
<th>Event
</th>
<th>Packet to send
</th></tr>
<tr>
<td>Player connects to server
</td>
<td><i><b>ExtAddPlayerName</b></i>
</td></tr>
<tr>
<td>Player enters map
</td>
<td><i><b>ExtAddEntity2</b></i>
</td></tr>
<tr>
<td>Player leaves map
</td>
<td><i><b>DespawnPlayer</b></i>
</td></tr>
<tr>
<td>Player disconnects from server
</td>
<td><i><b>ExtRemovePlayerName</b></i>
</td></tr></table>
<dl><dd>Unique <i>NameID</i> between 0 and 255 should be assigned to every online player. When a new player connects to the server, <i><b>ExtAddPlayerName</b></i> must be sent. <i>GroupName</i> and <i>GroupRank</i> can be used in any way, for example to group players by map/world or rank/class/faction. Server must use <i><b>ExtAddEntity2</b></i> in place of standard <i><b><a href="Classic_Protocol.html#Server_.E2.86.92_Client_packets" title="Classic Protocol">SpawnPlayer</a></b></i> packet. Server should re-send <i><b>ExtAddPlayerName</b></i> packet, using the identical <i>NameID</i>, when player's <i>ListName</i>, <i>GroupName</i>, or <i>GroupRank</i> change. Server must reliably send an <i><b>ExtRemovePlayerName</b></i> packet when the player disconnects. Color codes are permitted in <i>ListName</i>, <i>GroupName</i>, and <i>InGameName</i>.</dd></dl>
<dl><dd><h5><span class="mw-headline" id="ExtAddPlayerName_Packet">ExtAddPlayerName Packet</span></h5></dd>
<dd><i>Server to Client</i></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign" rowspan="5"> 0x16
<p>(22)
</p>
</td>
<td class="col1 centeralign"> NameID
</td>
<td class="col2 centeralign"> short
</td>
<td class="col3 centeralign"> <code>5</code>
</td>
<td class="col4"> Between 0 and 255
</td></tr>
<tr class="row2">
<td class="col1 centeralign"> PlayerName
</td>
<td class="col2 centeralign"> string
</td>
<td class="col3 centeralign"> <code>Notch</code>
</td>
<td class="col4"> Player name used for autocompletion.
<p>May be left empty (to exclude from autocompletion).
</p>
</td></tr>
<tr class="row3">
<td class="col1 centeralign"> ListName
</td>
<td class="col2 centeralign"> string
</td>
<td class="col3 centeralign"> <code>&c[Op]Notch</code>
</td>
<td class="col4">Name displayed in the in-game list.
</td></tr>
<tr class="row4">
<td class="col1 centeralign"> GroupName
</td>
<td class="col2 centeralign"> string
</td>
<td class="col3 centeralign"> <code>Staff</code>
</td>
<td class="col4">May be left blank.
</td></tr>
<tr class="row5">
<td class="col1 centeralign"> GroupRank
</td>
<td class="col2 centeralign"> byte
</td>
<td class="col3 centeralign"> <code>0</code>
</td>
<td class="col4"> Rank of a player within the group.
<p>Lower-number ranks are listed before higher-number ranks.
</p>
</td></tr>
<tr class="row6">
<th class="col0"> Total Size:
</th>
<td class="col1 rightalign" colspan="4"> 196 bytes
</td></tr></table></dd></dl>
<dl><dd><h5><span class="mw-headline" id="ExtAddEntity2_Packet">ExtAddEntity2 Packet</span></h5></dd>
<dd><i>Server to Client</i></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign" rowspan="8"> 0x21
<p>(33)
</p>
</td>
<td class="col1 centeralign"> EntityID
</td>
<td class="col2 centeralign"> byte
</td>
<td class="col3 centeralign"> <code>5</code>
</td>
<td class="col4"> Between 0 and 127
</td></tr>
<tr class="row2">
<td class="col1 centeralign"> InGameName
</td>
<td class="col2 centeralign"> string
</td>
<td class="col3 centeralign"> <code>&cNotch</code>
</td>
<td class="col4"> Player name to be shown in-game, hovering above player model.
</td></tr>
<tr class="row3">
<td class="col1 centeralign"> SkinName
</td>
<td class="col2 centeralign"> string
</td>
<td class="col3 centeralign"> <code>Notch</code>
</td>
<td class="col4"> Player name whose skin should be used by the client.
</td></tr>
<tr class="row4">
<td class="col1 centeralign"> SpawnX
</td>
<td class="col2 centeralign"> short
</td>
<td class="col3 centeralign"> <code>1</code>
</td>
<td class="col4"> X coordinate (32 units per block) of entity's spawn location.
</td></tr>
<tr class="row5">
<td class="col1 centeralign"> SpawnY
</td>
<td class="col2 centeralign"> short
</td>
<td class="col3 centeralign"> <code>2</code>
</td>
<td class="col4"> Y coordinate (32 units per block) of entity's spawn location.
</td></tr>
<tr class="row6">
<td class="col1 centeralign"> SpawnZ
</td>
<td class="col2 centeralign"> short
</td>
<td class="col3 centeralign"> <code>3</code>
</td>
<td class="col4"> Z coordinate (32 units per block) of entity's spawn location.
</td></tr>
<tr class="row7">
<td class="col1 centeralign"> SpawnYaw
</td>
<td class="col2 centeralign"> byte
</td>
<td class="col3 centeralign"> <code>4</code>
</td>
<td class="col4"> Orientation (left-right) at the entity's spawn location.
</td></tr>
<tr class="row8">
<td class="col1 centeralign"> SpawnPitch
</td>
<td class="col2 centeralign"> byte
</td>
<td class="col3 centeralign"> <code>5</code>
</td>
<td class="col4"> Orientation (up-down) at the entity's spawn location.
</td></tr>
<tr class="row9">
<th class="col0"> Total Size:
</th>
<td class="col1 rightalign" colspan="4"> 138 bytes
</td></tr></table></dd></dl>
<dl><dd><h5><span class="mw-headline" id="ExtRemovePlayerName_Packet">ExtRemovePlayerName Packet</span></h5></dd>
<dd><i>Server to Client</i></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign"> 0x18
<p>(24)
</p>
</td>
<td class="col1 centeralign"> NameID
</td>
<td class="col2 centeralign"> short
</td>
<td class="col3 centeralign"> <code>5</code>
</td>
<td class="col4"> Between 0 and 255
<p>Matches NameID of the ExtAddPlayerName packet
</p>
</td></tr>
<tr class="row2">
<th class="col0"> Total Size:
</th>
<td class="col1 rightalign" colspan="4"> 3 bytes
</td></tr></table></dd></dl>
<h3><span class="mw-headline" id="EnvColors">EnvColors</span></h3>
<dl><dd>This extension allows server to alter some of the colors used by the client in environment rendering.</dd>
<dd><b>Motivation</b>: To allow the server to give worlds/maps a unique feel: time-of-day, weather/climate, lighting effect, etc.</dd>
<dd><b>Client behavior</b>: Client must check for <i><b>EnvSetColor</b></i> packets right before <i><b><a href="Classic_Protocol.html#Server_.E2.86.92_Client_packets" title="Classic Protocol">LevelFinalize</a></b></i> 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 <i>Variable</i> field is given, no action is needed. If an out-of-range color is given by the server (i.e. if any of <i>Red</i>, <i>Green</i>, or <i>Blue</i> is less than <code>0</code> or greater than <code>255</code>), then the specified <i>Variable</i> should be reset to its default value.</dd>
<dd><b>Server behavior</b>: Server should normally only use <i><b>EnvSetColor</b></i> packets right before the <i><b><a href="Classic_Protocol.html#Server_.E2.86.92_Client_packets" title="Classic Protocol">LevelFinalize</a></b></i> packet. To reset a variable to its default value, the server should send a packet with value <code>-1</code> for <i>Red</i>, <i>Green</i>, and <i>Blue</i>.</dd></dl>
<dl><dd><h4><span class="mw-headline" id="EnvSetColor_Packet">EnvSetColor Packet</span></h4></dd>
<dd><i>Server to Client</i></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign" rowspan="4"> 0x19
<p>(25)
</p>
</td>
<td class="col1 centeralign"> Variable
</td>
<td class="col2 centeralign"> byte
</td>
<td class="col3 centeralign"> <code>1</code>
</td>
<td class="col4"> Enumeration of environmental variables
<ul><li>0 = sky color</li>
<li>1 = cloud color</li>
<li>2 = fog color</li>
<li>3 = ambient light (blocks in shadow) color</li>
<li>4 = diffuse light (sunlight) color</li></ul>
</td></tr>
<tr class="row2">
<td class="col1 centeralign"> Red
</td>
<td class="col2 centeralign"> short
</td>
<td class="col3 centeralign"> <code>25</code>
</td>
<td class="col4"> Between 0 and 255
</td></tr>
<tr class="row3">
<td class="col1 centeralign"> Green
</td>
<td class="col2 centeralign"> short
</td>
<td class="col3 centeralign"> <code>128</code>
</td>
<td class="col4"> Between 0 and 255
</td></tr>
<tr class="row4">
<td class="col1 centeralign"> Blue
</td>
<td class="col2 centeralign"> short
</td>
<td class="col3 centeralign"> <code>0</code>
</td>
<td class="col4"> Between 0 and 255
</td></tr>
<tr class="row5">
<th class="col0"> Total Size:
</th>
<td class="col1 rightalign" colspan="4"> 8 bytes
</td></tr></table></dd></dl>
<h3><span class="mw-headline" id="SelectionCuboid">SelectionCuboid</span></h3>
<dl><dd><b>Motivation</b>: Allows the server to highlight parts of a world. Applications include zoning, previewing draw commands, previewing undo commands.</dd>
<dd><b>Coordinates</b>: {<i>StartX</i>,<i>StartY</i>,<i>StartZ</i>} are coordinates of the block inside the selection that is closest to the map origin. {<i>EndX</i>,<i>EndY</i>,<i>EndZ</i>} are coordinates of the block inside the selection that is furthest from the map origin. Therefore, the resulting selection has dimensions {<i>EndX</i>-<i>StartX</i>+1, <i>EndY</i>-<i>StartY</i>+1, <i>EndZ</i>-<i>StartZ</i>+1).</dd>
<dd><b>Client behavior</b>: Client should be ready to receive <i><b>MakeSelection</b></i> packets any time after <i><b><a href="Classic_Protocol.html#Server_.E2.86.92_Client_packets" title="Classic Protocol">LevelFinalize</a></b></i> 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 <i>StartX</i><<i>EndX</i>) may either be ignored or re-ordered. Out-of-range values for <i>Red</i>, <i>Green</i>, <i>Blue</i>, and <i>Opacity</i> should be clipped to fit the valid range. Supporting <i>Opacity</i> is optional: the client may opt to provide fixed opacity instead. When map changes (i.e. when <i><b><a href="Classic_Protocol.html#Server_.E2.86.92_Client_packets" title="Classic Protocol">LevelInitialize</a></b></i> packet is received), all existing selections should be removed. <i><b>RemoveSelection</b></i> packets that refer to non-existent <i>SelectionID</i>s should be ignored.</dd>
<dd><b>Server behavior</b>: All given coordinates must be contained within the map. End coordinates should be higher or equal than start coordinates.</dd></dl>
<dl><dd><h4><span class="mw-headline" id="MakeSelection_packet">MakeSelection packet</span></h4></dd>
<dd><i>Server to Client</i></dd></dl>
<dl><dd><table class="wikitable">
<tr class="row0">
<th class="col0"> Packet ID
</th>
<th class="col1"> Field Name
</th>
<th class="col2"> Field Type
</th>
<th class="col3"> Example
</th>
<th class="col4"> Notes
</th></tr>
<tr class="row1">
<td class="col0 centeralign" rowspan="12"> 0x1A
<p>(26)
</p>
</td>
<td class="col1 centeralign"> SelectionID
</td>