2 A modern, Python3-compatible, well-documented library for communicating
3 with a MineCraft server.
6 from collections
import OrderedDict
, namedtuple
9 # The version number of the most recent pyCraft release.
12 # This bit occurs in the protocol numbers of pre-release versions after 1.16.3.
15 # A record representing a Minecraft version in the following list.
16 Version
= namedtuple('Version', ('id', 'protocol', 'supported'))
18 # A list of Minecraft versions known to pyCraft, including all supported
19 # versions as well as some unsupported versions (used by certain forward-
20 # compatible code: e.g. when comparing the current protocol version with that
21 # of an unsupported version), in chronological order of publication.
23 # The ID string of a version is the key used to identify it in
24 # <https://launchermeta.mojang.com/mc/game/version_manifest.json>, or the 'id'
25 # key in "version.json" in the corresponding ".jar" file distributed by Mojang.
26 KNOWN_MINECRAFT_VERSION_RECORDS
= [
27 # id protocol supported
28 Version('13w41a', 0, False),
29 Version('13w41b', 0, False),
30 Version('13w42a', 1, False),
31 Version('13w42b', 1, False),
32 Version('13w43a', 2, False),
33 Version('1.7-pre', 3, False),
34 Version('1.7.1-pre', 3, False),
35 Version('1.7.2', 4, True),
36 Version('13w47a', 4, False),
37 Version('13w47b', 4, False),
38 Version('13w47c', 4, False),
39 Version('13w47d', 4, False),
40 Version('13w47e', 4, False),
41 Version('13w48a', 4, False),
42 Version('13w48b', 4, False),
43 Version('13w49a', 4, False),
44 Version('1.7.3-pre', 4, False),
45 Version('1.7.4', 4, True),
46 Version('1.7.5', 4, True),
47 Version('1.7.6-pre1', 5, False),
48 Version('1.7.6-pre2', 5, False),
49 Version('1.7.6', 5, True),
50 Version('1.7.7', 5, True),
51 Version('1.7.8', 5, True),
52 Version('1.7.9', 5, True),
53 Version('1.7.10-pre1', 5, False),
54 Version('1.7.10-pre2', 5, False),
55 Version('1.7.10-pre3', 5, False),
56 Version('1.7.10-pre4', 5, False),
57 Version('1.7.10', 5, True),
58 Version('14w02a', 5, False),
59 Version('14w02b', 5, False),
60 Version('14w02c', 5, False),
61 Version('14w03a', 6, False),
62 Version('14w03b', 6, False),
63 Version('14w04a', 7, False),
64 Version('14w04b', 8, False),
65 Version('14w05a', 9, False),
66 Version('14w05b', 9, False),
67 Version('14w06a', 10, False),
68 Version('14w06b', 10, False),
69 Version('14w07a', 11, False),
70 Version('14w08a', 12, False),
71 Version('14w10a', 13, False),
72 Version('14w10b', 13, False),
73 Version('14w10c', 13, False),
74 Version('14w11a', 14, False),
75 Version('14w11b', 14, False),
76 Version('14w17a', 15, False),
77 Version('14w18a', 16, False),
78 Version('14w18b', 16, False),
79 Version('14w19a', 17, False),
80 Version('14w20a', 18, False),
81 Version('14w20b', 18, False),
82 Version('14w21a', 19, False),
83 Version('14w21b', 20, False),
84 Version('14w25a', 21, False),
85 Version('14w25b', 22, False),
86 Version('14w26a', 23, False),
87 Version('14w26b', 24, False),
88 Version('14w26c', 25, False),
89 Version('14w27a', 26, False),
90 Version('14w27b', 26, False),
91 Version('14w28a', 27, False),
92 Version('14w28b', 28, False),
93 Version('14w29a', 29, False),
94 Version('14w29a', 29, False),
95 Version('14w30a', 30, False),
96 Version('14w30b', 30, False),
97 Version('14w30c', 31, False),
98 Version('14w31a', 32, False),
99 Version('14w32a', 33, False),
100 Version('14w32b', 34, False),
101 Version('14w32c', 35, False),
102 Version('14w32d', 36, False),
103 Version('14w33a', 37, False),
104 Version('14w33b', 38, False),
105 Version('14w33c', 39, False),
106 Version('14w34a', 40, False),
107 Version('14w34b', 41, False),
108 Version('14w34c', 42, False),
109 Version('14w34d', 43, False),
110 Version('1.8-pre1', 44, False),
111 Version('1.8-pre2', 45, False),
112 Version('1.8-pre3', 46, False),
113 Version('1.8', 47, True),
114 Version('1.8.1-pre1', 47, False),
115 Version('1.8.1-pre2', 47, False),
116 Version('1.8.1-pre3', 47, False),
117 Version('1.8.1-pre4', 47, False),
118 Version('1.8.1-pre5', 47, False),
119 Version('1.8.1', 47, True),
120 Version('1.8.2-pre1', 47, False),
121 Version('1.8.2-pre2', 47, False),
122 Version('1.8.2-pre3', 47, False),
123 Version('1.8.2-pre4', 47, False),
124 Version('1.8.2-pre5', 47, False),
125 Version('1.8.2-pre6', 47, False),
126 Version('1.8.2-pre7', 47, False),
127 Version('1.8.2', 47, True),
128 Version('1.8.3', 47, True),
129 Version('1.8.4', 47, True),
130 Version('1.8.5', 47, True),
131 Version('1.8.6', 47, True),
132 Version('1.8.7', 47, True),
133 Version('1.8.8', 47, True),
134 Version('1.8.9', 47, True),
135 Version('15w14a', 48, False),
136 Version('15w31a', 49, False),
137 Version('15w31b', 50, False),
138 Version('15w31c', 51, False),
139 Version('15w32a', 52, False),
140 Version('15w32b', 53, False),
141 Version('15w32c', 54, False),
142 Version('15w33a', 55, False),
143 Version('15w33b', 56, False),
144 Version('15w33c', 57, False),
145 Version('15w34a', 58, False),
146 Version('15w34b', 59, False),
147 Version('15w34c', 60, False),
148 Version('15w34d', 61, False),
149 Version('15w35a', 62, False),
150 Version('15w35b', 63, False),
151 Version('15w35c', 64, False),
152 Version('15w35d', 65, False),
153 Version('15w35e', 66, False),
154 Version('15w36a', 67, False),
155 Version('15w36b', 68, False),
156 Version('15w36c', 69, False),
157 Version('15w36d', 70, False),
158 Version('15w37a', 71, False),
159 Version('15w38a', 72, False),
160 Version('15w38b', 73, False),
161 Version('15w39a', 74, False),
162 Version('15w39b', 74, False),
163 Version('15w39c', 74, False),
164 Version('15w40a', 75, False),
165 Version('15w40b', 76, False),
166 Version('15w41a', 77, False),
167 Version('15w41b', 78, False),
168 Version('15w42a', 79, False),
169 Version('15w43a', 80, False),
170 Version('15w43b', 81, False),
171 Version('15w43c', 82, False),
172 Version('15w44a', 83, False),
173 Version('15w44b', 84, False),
174 Version('15w45a', 85, False),
175 Version('15w46a', 86, False),
176 Version('15w47a', 87, False),
177 Version('15w47b', 88, False),
178 Version('15w47c', 89, False),
179 Version('15w49a', 90, False),
180 Version('15w49b', 91, False),
181 Version('15w50a', 92, False),
182 Version('15w51a', 93, False),
183 Version('15w51b', 94, False),
184 Version('16w02a', 95, False),
185 Version('16w03a', 96, False),
186 Version('16w04a', 97, False),
187 Version('16w05a', 98, False),
188 Version('16w05b', 99, False),
189 Version('16w06a', 100, False),
190 Version('16w07a', 101, False),
191 Version('16w07b', 102, False),
192 Version('1.9-pre1', 103, False),
193 Version('1.9-pre2', 104, False),
194 Version('1.9-pre3', 105, False),
195 Version('1.9-pre4', 106, False),
196 Version('1.9', 107, True),
197 Version('1.9.1-pre1', 107, False),
198 Version('1.9.1-pre2', 108, False),
199 Version('1.9.1-pre3', 108, False),
200 Version('1.9.1', 108, True),
201 Version('1.RV-Pre1', 108, False),
202 Version('1.9.2', 109, True),
203 Version('16w14a', 109, False),
204 Version('16w15a', 109, False),
205 Version('16w15b', 109, False),
206 Version('1.9.3-pre1', 109, False),
207 Version('1.9.3-pre2', 110, False),
208 Version('1.9.3-pre3', 110, False),
209 Version('1.9.3', 110, True),
210 Version('1.9.4', 110, True),
211 Version('16w20a', 201, False),
212 Version('16w21a', 202, False),
213 Version('16w21b', 203, False),
214 Version('1.10-pre1', 204, False),
215 Version('1.10-pre2', 205, False),
216 Version('1.10', 210, True),
217 Version('1.10.1', 210, True),
218 Version('1.10.2', 210, True),
219 Version('16w32a', 301, True),
220 Version('16w32b', 302, True),
221 Version('16w33a', 303, True),
222 Version('16w35a', 304, True),
223 Version('16w36a', 305, True),
224 Version('16w38a', 306, True),
225 Version('16w39a', 307, True),
226 Version('16w39b', 308, True),
227 Version('16w39c', 309, True),
228 Version('16w40a', 310, True),
229 Version('16w41a', 311, True),
230 Version('16w42a', 312, True),
231 Version('16w43a', 313, True),
232 Version('16w44a', 313, True),
233 Version('1.11-pre1', 314, True),
234 Version('1.11', 315, True),
235 Version('16w50a', 316, True),
236 Version('1.11.1', 316, True),
237 Version('1.11.2', 316, True),
238 Version('17w06a', 317, True),
239 Version('17w13a', 318, True),
240 Version('17w13b', 319, True),
241 Version('17w14a', 320, True),
242 Version('17w15a', 321, True),
243 Version('17w16a', 322, True),
244 Version('17w16b', 323, True),
245 Version('17w17a', 324, True),
246 Version('17w17b', 325, True),
247 Version('17w18a', 326, True),
248 Version('17w18b', 327, True),
249 Version('1.12-pre1', 328, True),
250 Version('1.12-pre2', 329, True),
251 Version('1.12-pre3', 330, True),
252 Version('1.12-pre4', 331, True),
253 Version('1.12-pre5', 332, True),
254 Version('1.12-pre6', 333, True),
255 Version('1.12-pre7', 334, True),
256 Version('1.12', 335, True),
257 Version('17w31a', 336, True),
258 Version('1.12.1-pre1', 337, True),
259 Version('1.12.1', 338, True),
260 Version('1.12.2-pre1', 339, True),
261 Version('1.12.2-pre2', 339, True),
262 Version('1.12.2', 340, True),
263 Version('17w43a', 341, True),
264 Version('17w43b', 342, True),
265 Version('17w45a', 343, True),
266 Version('17w45b', 344, True),
267 Version('17w46a', 345, True),
268 Version('17w47a', 346, True),
269 Version('17w47b', 347, True),
270 Version('17w48a', 348, True),
271 Version('17w49a', 349, True),
272 Version('17w49b', 350, True),
273 Version('17w50a', 351, True),
274 Version('18w01a', 352, True),
275 Version('18w02a', 353, True),
276 Version('18w03a', 354, True),
277 Version('18w03b', 355, True),
278 Version('18w05a', 356, True),
279 Version('18w06a', 357, True),
280 Version('18w07a', 358, True),
281 Version('18w07b', 359, True),
282 Version('18w07c', 360, True),
283 Version('18w08a', 361, True),
284 Version('18w08b', 362, True),
285 Version('18w09a', 363, True),
286 Version('18w10a', 364, True),
287 Version('18w10b', 365, True),
288 Version('18w10c', 366, True),
289 Version('18w10d', 367, True),
290 Version('18w11a', 368, True),
291 Version('18w14a', 369, True),
292 Version('18w14b', 370, True),
293 Version('18w15a', 371, True),
294 Version('18w16a', 372, True),
295 Version('18w19a', 373, True),
296 Version('18w19b', 374, True),
297 Version('18w20a', 375, True),
298 Version('18w20b', 376, True),
299 Version('18w20c', 377, True),
300 Version('18w21a', 378, True),
301 Version('18w21b', 379, True),
302 Version('18w22a', 380, True),
303 Version('18w22b', 381, True),
304 Version('18w22c', 382, True),
305 Version('1.13-pre1', 383, True),
306 Version('1.13-pre2', 384, True),
307 Version('1.13-pre3', 385, True),
308 Version('1.13-pre4', 386, True),
309 Version('1.13-pre5', 387, True),
310 Version('1.13-pre6', 388, True),
311 Version('1.13-pre7', 389, True),
312 Version('1.13-pre8', 390, True),
313 Version('1.13-pre9', 391, True),
314 Version('1.13-pre10', 392, True),
315 Version('1.13', 393, True),
316 Version('18w30a', 394, True),
317 Version('18w30b', 395, True),
318 Version('18w31a', 396, True),
319 Version('18w32a', 397, True),
320 Version('18w33a', 398, True),
321 Version('1.13.1-pre1', 399, True),
322 Version('1.13.1-pre2', 400, True),
323 Version('1.13.1', 401, True),
324 Version('1.13.2-pre1', 402, True),
325 Version('1.13.2-pre2', 403, True),
326 Version('1.13.2', 404, True),
327 Version('18w43a', 441, True),
328 Version('18w43b', 441, True),
329 Version('18w43c', 442, True),
330 Version('18w44a', 443, True),
331 Version('18w45a', 444, True),
332 Version('18w46a', 445, True),
333 Version('18w47a', 446, True),
334 Version('18w47b', 447, True),
335 Version('18w48a', 448, True),
336 Version('18w48b', 449, True),
337 Version('18w49a', 450, True),
338 Version('18w50a', 451, True),
339 Version('19w02a', 452, True),
340 Version('19w03a', 453, True),
341 Version('19w03b', 454, True),
342 Version('19w03c', 455, True),
343 Version('19w04a', 456, True),
344 Version('19w04b', 457, True),
345 Version('19w05a', 458, True),
346 Version('19w06a', 459, True),
347 Version('19w07a', 460, True),
348 Version('19w08a', 461, True),
349 Version('19w08b', 462, True),
350 Version('19w09a', 463, True),
351 Version('19w11a', 464, True),
352 Version('19w11b', 465, True),
353 Version('19w12a', 466, True),
354 Version('19w12b', 467, True),
355 Version('19w13a', 468, True),
356 Version('19w13b', 469, True),
357 Version('19w14a', 470, True),
358 Version('19w14b', 471, True),
359 Version('1.14 Pre-Release 1', 472, True),
360 Version('1.14 Pre-Release 2', 473, True),
361 Version('1.14 Pre-Release 3', 474, True),
362 Version('1.14 Pre-Release 4', 475, True),
363 Version('1.14 Pre-Release 5', 476, True),
364 Version('1.14', 477, True),
365 Version('1.14.1 Pre-Release 1', 478, True),
366 Version('1.14.1 Pre-Release 2', 479, True),
367 Version('1.14.1', 480, True),
368 Version('1.14.2 Pre-Release 1', 481, True),
369 Version('1.14.2 Pre-Release 2', 482, True),
370 Version('1.14.2 Pre-Release 3', 483, True),
371 Version('1.14.2 Pre-Release 4', 484, True),
372 Version('1.14.2', 485, True),
373 Version('1.14.3-pre1', 486, True),
374 Version('1.14.3-pre2', 487, True),
375 Version('1.14.3-pre3', 488, True),
376 Version('1.14.3-pre4', 489, True),
377 Version('1.14.3', 490, True),
378 Version('1.14.4-pre1', 491, True),
379 Version('1.14.4-pre2', 492, True),
380 Version('1.14.4-pre3', 493, True),
381 Version('1.14.4-pre4', 494, True),
382 Version('1.14.4-pre5', 495, True),
383 Version('1.14.4-pre6', 496, True),
384 Version('1.14.4-pre7', 497, True),
385 Version('1.14.4', 498, True),
386 Version('19w34a', 550, True),
387 Version('19w35a', 551, True),
388 Version('19w36a', 552, True),
389 Version('19w37a', 553, True),
390 Version('19w38a', 554, True),
391 Version('19w38b', 555, True),
392 Version('19w39a', 556, True),
393 Version('19w40a', 557, True),
394 Version('19w41a', 558, True),
395 Version('19w42a', 559, True),
396 Version('19w44a', 560, True),
397 Version('19w45a', 561, True),
398 Version('19w45b', 562, True),
399 Version('19w46a', 563, True),
400 Version('19w46b', 564, True),
401 Version('1.15-pre1', 565, True),
402 Version('1.15-pre2', 566, True),
403 Version('1.15-pre3', 567, True),
404 Version('1.15-pre4', 569, True),
405 Version('1.15-pre5', 570, True),
406 Version('1.15-pre6', 571, True),
407 Version('1.15-pre7', 572, True),
408 Version('1.15', 573, True),
409 Version('1.15.1-pre1', 574, True),
410 Version('1.15.1', 575, True),
411 Version('1.15.2-pre1', 576, True),
412 Version('1.15.2-pre2', 577, True),
413 Version('1.15.2', 578, True),
414 Version('20w06a', 701, True),
415 Version('20w07a', 702, True),
416 Version('20w08a', 703, True),
417 Version('20w09a', 704, True),
418 Version('20w10a', 705, True),
419 Version('20w11a', 706, True),
420 Version('20w12a', 707, True),
421 Version('20w13a', 708, True),
422 Version('20w13b', 709, True),
423 Version('20w14a', 710, True),
424 Version('20w15a', 711, True),
425 Version('20w16a', 712, True),
426 Version('20w17a', 713, True),
427 Version('20w18a', 714, True),
428 Version('20w19a', 715, True),
429 Version('20w20a', 716, True),
430 Version('20w20b', 717, True),
431 Version('20w21a', 718, True),
432 Version('20w22a', 719, True),
433 Version('1.16-pre1', 721, True),
434 Version('1.16-pre2', 722, True),
435 Version('1.16-pre3', 725, True),
436 Version('1.16-pre4', 727, True),
437 Version('1.16-pre5', 729, True),
438 Version('1.16-pre6', 730, True),
439 Version('1.16-pre7', 732, True),
440 Version('1.16-pre8', 733, True),
441 Version('1.16-rc1', 734, True),
442 Version('1.16', 735, True),
443 Version('1.16.1', 736, True),
444 Version('20w27a', 738, True),
445 Version('20w28a', 740, True),
446 Version('20w29a', 741, True),
447 Version('20w30a', 743, True),
448 Version('1.16.2-pre1', 744, True),
449 Version('1.16.2-pre2', 746, True),
450 Version('1.16.2-pre3', 748, True),
451 Version('1.16.2-rc1', 749, True),
452 Version('1.16.2-rc2', 750, True),
453 Version('1.16.2', 751, True),
454 Version('1.16.3-rc1', 752, True),
455 Version('1.16.3', 753, True),
456 Version('1.16.4-pre1', PRE |
1, True),
457 Version('1.16.4-pre2', PRE |
2, True),
458 Version('1.16.4-rc1', PRE |
3, True),
459 Version('1.16.4', 754, True),
460 Version('20w45a', PRE |
5, True),
461 Version('20w46a', PRE |
6, True),
462 Version('20w48a', PRE |
7, True),
463 Version('20w49a', PRE |
8, False),
464 Version('20w51a', PRE |
9, False),
465 Version('1.16.5', 754, True),
466 Version('21w03a', PRE |
11, False),
467 Version('21w05a', PRE |
12, False),
468 Version('21w05b', PRE |
13, False),
469 Version('21w06a', PRE |
14, False),
470 Version('21w07a', PRE |
15, False),
471 Version('1.17-rc2', PRE |
35, False),
472 Version('1.17', 755, True),
473 Version('1.17.1', 756, True),
474 Version('21w44a', PRE |
48, False),
475 Version('1.18-rc4', PRE |
60, False),
476 Version('1.18', 757, True),
477 Version('1.18.1', 757, True),
480 # An OrderedDict mapping the id string of each known Minecraft version to its
481 # protocol version number, in chronological order of release.
482 KNOWN_MINECRAFT_VERSIONS
= OrderedDict()
484 # As KNOWN_MINECRAFT_VERSIONS, but only contains versions supported by pyCraft.
485 SUPPORTED_MINECRAFT_VERSIONS
= OrderedDict()
487 # As SUPPORTED_MINECRAFT_VERSIONS, but only contains release versions.
488 RELEASE_MINECRAFT_VERSIONS
= OrderedDict()
490 # A list of the protocol version numbers in KNOWN_MINECRAFT_VERSIONS
491 # in the same order (chronological) but without duplicates.
492 KNOWN_PROTOCOL_VERSIONS
= []
494 # A list of the protocol version numbers in SUPPORTED_MINECRAFT_VERSIONS
495 # in the same order (chronological) but without duplicates.
496 SUPPORTED_PROTOCOL_VERSIONS
= []
498 # A list of the protocol version numbers in RELEASE_MINECRAFT_VERSIONS
499 # in the same order (chronological) but without duplicates.
500 RELEASE_PROTOCOL_VERSIONS
= []
502 # A dict mapping each protocol version number in KNOWN_PROTOCOL_VERSIONS to
503 # its index within this list (used for efficient comparison of protocol
504 # versions according to chronological release order).
505 PROTOCOL_VERSION_INDICES
= {}
508 def initglobals(use_known_records
=False):
509 '''Initialise the above global variables, using
510 'SUPPORTED_MINECRAFT_VERSIONS' as the source if 'use_known_records' is
511 False (for backward compatibility, this is the default behaviour), or
512 otherwise using 'KNOWN_MINECRAFT_VERSION_RECORDS' as the source.
514 This allows 'SUPPORTED_MINECRAFT_VERSIONS' or, respectively,
515 'KNOWN_MINECRAFT_VERSION_RECORDS' to be updated by the library user
516 during runtime and then the derived data to be updated as well, to allow
517 for dynamic version support. All updates are done by reference to allow
518 this to work elsewhere in the code.
520 if use_known_records
:
521 # Update the variables that depend on KNOWN_MINECRAFT_VERSION_RECORDS.
522 KNOWN_MINECRAFT_VERSIONS
.clear()
523 KNOWN_PROTOCOL_VERSIONS
.clear()
524 SUPPORTED_MINECRAFT_VERSIONS
.clear()
525 PROTOCOL_VERSION_INDICES
.clear()
526 for version
in KNOWN_MINECRAFT_VERSION_RECORDS
:
527 KNOWN_MINECRAFT_VERSIONS
[version
.id] = version
.protocol
528 if version
.protocol
not in KNOWN_PROTOCOL_VERSIONS
:
529 PROTOCOL_VERSION_INDICES
[version
.protocol
] \
530 = len(KNOWN_PROTOCOL_VERSIONS
)
531 KNOWN_PROTOCOL_VERSIONS
.append(version
.protocol
)
532 if version
.supported
:
533 SUPPORTED_MINECRAFT_VERSIONS
[version
.id] = version
.protocol
535 # Update the variables that depend on SUPPORTED_MINECRAFT_VERSIONS.
536 SUPPORTED_PROTOCOL_VERSIONS
.clear()
537 RELEASE_MINECRAFT_VERSIONS
.clear()
538 RELEASE_PROTOCOL_VERSIONS
.clear()
539 for (version_id
, protocol
) in SUPPORTED_MINECRAFT_VERSIONS
.items():
540 if re
.match(r
'\d+(\.\d+)+$', version_id
):
541 RELEASE_MINECRAFT_VERSIONS
[version_id
] = protocol
542 if protocol
not in RELEASE_PROTOCOL_VERSIONS
:
543 RELEASE_PROTOCOL_VERSIONS
.append(protocol
)
544 if protocol
not in SUPPORTED_PROTOCOL_VERSIONS
:
545 SUPPORTED_PROTOCOL_VERSIONS
.append(protocol
)
548 initglobals(use_known_records
=True)