-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathindex.html
More file actions
10157 lines (9717 loc) · 481 KB
/
index.html
File metadata and controls
10157 lines (9717 loc) · 481 KB
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 lang="zh-Hans-CN">
<head>
<meta charset="utf-8" />
<title>Minecraft 原版模组入门教程</title>
<meta name='author' content='ruhuasiyu@mcbbs' />
<meta name='keywords' content='minecraft, 原版模组, vanilla mod, datapacks' />
<meta name='description' content='Minecraft 原版模组入门教程' />
<meta name='revised' content='ruhuasiyu@mcbbs' />
<base href="" />
<link rel="shortcut icon" href="https://zhangshenxing.gitee.io/favicon.ico" />
<link rel="stylesheet" href="items/style.css" />
<script>
function hidecomment(thiselement){
var classElements = document.getElementsByClassName('comment');
for (var i=0; i<classElements.length; i++) {
classElements[i].style.display = 'none';
}
thiselement.style.display='none';
thiselement.nextElementSibling.style.display='block';
}
function showcomment(thiselement){
var classElements = document.getElementsByClassName('comment');
for (var i=0; i<classElements.length; i++) {
classElements[i].style.display = 'inline';
}
thiselement.previousElementSibling.style.display='block';
thiselement.style.display='none';
}
function content_level_1(thiselement){
var i;
var navall = document.getElementsByTagName('nav')[0].childNodes[1].getElementsByTagName('li');
for (i=0; i<navall.length; i++) navall[i].style.display = 'none';
var navsec = document.getElementsByTagName('nav')[0].childNodes[1].childNodes;
for (i=1; i<navsec.length; i+=2) navsec[i].style.display = 'block';
thiselement.style.display='none';
thiselement.nextElementSibling.style.display='block';
}
function content_level_2(thiselement){
var i,j;
var navall = document.getElementsByTagName('nav')[0].childNodes[1].getElementsByTagName('li');
for (i=0; i<navall.length; i++) {
navall[i].style.display = 'none';
}
var navsec = document.getElementsByTagName('nav')[0].childNodes[1].childNodes;
var navsubsec;
navsec[1].style.display = 'block';
navsec[3].style.display = 'block';
navsubsec = navsec[3].childNodes[2].childNodes;
for (j=1; j<navsubsec.length; j+=2) navsubsec[j].style.display = 'block';
for (i=5; i<navsec.length; i+=2) {
navsec[i].style.display = 'block';
if(navsec[i].childNodes.length>=2){
navsubsec = navsec[i].childNodes[1].childNodes;
for (j=1; j<navsubsec.length; j+=2) navsubsec[j].style.display = 'block';
}
}
thiselement.style.display='none';
thiselement.nextElementSibling.style.display='block';
}
function content_level_3(thiselement){
var i;
var navall = document.getElementsByTagName('nav')[0].childNodes[1].getElementsByTagName('li');
for (i=0; i<navall.length; i++) navall[i].style.display = 'block';
thiselement.style.display='none';
thiselement.previousElementSibling.previousElementSibling.style.display='block';
}
</script>
</head>
<body>
<nav>
<ul>
<li><a href="#引言" style="font-weight: bold; text-align: center;">理论篇</a></li>
<li>
<a href="#引言">§1. 引言</a><ul>
<li><a href="#命令基础">§1.1. 命令基础</a></li>
<li><a href="#工具准备">§1.2. 工具准备</a><ul>
<li><a href="#文本编辑器">§1.2.1. 文本编辑器</a></li>
<li><a href="#压缩工具">§1.2.2. 压缩工具</a></li>
<li><a href="#NBT_编辑器">§1.2.3. NBT 编辑器</a></li>
<li><a href="#绘图工具">§1.2.4. 绘图工具</a></li>
</ul></li>
<li><a href="#文件结构">§1.3. 游戏文件夹</a></li>
<li><a href="#JSON文件">§1.4. JSON文件</a></li>
</ul></li>
<li><a href="#数据包">§2 数据包</a><ul>
<li><a href="#数据包元信息和图标">§2.1 元信息和图标</a></li>
<li><a href="#命名空间">§2.2 命名空间</a></li>
<li><a href="#函数">§2.3 函数</a></li>
<li><a href="#2.4_进度">§2.4 进度</a></li>
<li><a href="#2.5_战利品表">§2.5 战利品表</a></li>
<li><a href="#战利品表谓词">§2.6 断言</a></li>
<li><a href="#配方">§2.7 配方</a><ul>
<li><a href="#有序合成">§2.7.1 有序合成</a></li>
<li><a href="#无序合成">§2.7.2 无序合成</a></li>
<li><a href="#切石机配方">§2.7.3 切石机配方</a></li>
<li><a href="#烧炼配方">§2.7.4 烧炼配方</a></li>
<li><a href="#锻造台配方">§2.7.5 锻造台配方</a></li>
<li><a href="#工作台特殊配方">§2.7.6 工作台特殊配方</a></li>
<li><a href="#覆盖原版配方">§2.7.7 覆盖原版配方</a></li>
<li><a href="#配方获取">§2.7.8 配方获取</a></li>
</ul></li>
<li><a href="#2.8_结构">§2.8 结构</a></li>
<li><a href="#标签">§2.9 标签</a><ul>
<li><a href="#方块标签">§2.9.1 方块标签</a></li>
<li><a href="#物品标签">§2.9.2 物品标签</a></li>
<li><a href="#函数标签">§2.9.3 函数标签</a></li>
<li><a href="#实体类型标签">§2.9.4 实体类型标签</a></li>
<li><a href="#流体标签">§2.9.5 流体标签</a></li>
<li><a href="#游戏事件标签">§2.9.6 游戏事件标签</a></li>
</ul></li>
<li><a href="#维度和维度类型">§2.10 维度和维度类型</a><img src="https://www.mcbbs.net/template/mcbbs/image/hot_1.gif" alt="hot" /><ul>
<li><a href="#维度">§2.10.1 维度</a></li>
<li><a href="#维度类型">§2.10.2 维度类型</a><ul>
<li><a href="#维度类型JSON格式">JSON格式</a></li>
<li><a href="#可用的维度类型">可用的维度类型</a></li>
</ul></li>
<li><a href="#维度实例">§2.10.3 实例</a></li>
<li><a href="#自定义世界">§2.10.4 自定义世界</a></li>
</ul></li>
<li><a href="#世界生成">§2.11 世界生成</a><img src="https://www.mcbbs.net/template/mcbbs/image/hot_1.gif" alt="hot" /><ul>
<li><a href="#噪声设置">§2.11.1 噪声设置</a><ul>
<li><a href="#噪声设置JSON格式">JSON格式</a></li>
<li><a href="#可用的噪声设置">可用的噪声设置</a></li>
<li><a href="#默认世界结构参数">默认世界结构参数</a></li>
</ul></li>
<li><a href="#生物群系">§2.11.2 生物群系</a><ul>
<li><a href="#生物群系JSON格式">JSON格式</a></li>
<li><a href="#可用的生物群系">可用的生物群系</a></li>
</ul></li>
<li><a href="#地形雕刻器">§2.11.3 地形雕刻器</a><ul>
<li><a href="#地形雕刻器JSON格式">JSON格式</a></li>
<li><a href="#可用的地形雕刻器">可用的地形雕刻器</a></li>
</ul></li>
<li><a href="#地表生成器">§2.11.4 地表生成器</a><ul>
<li><a href="#地表生成器JSON格式">JSON格式</a></li>
<li><a href="#可用的地表生成器">可用的地表生成器</a></li>
</ul></li>
<li><a href="#地物">§2.11.5 地物</a><ul>
<li><a href="#地物JSON格式">JSON格式</a></li>
<li><a href="#可用的地物">可用的地物</a></li>
<li><a href="#装饰物">装饰物</a></li>
<li><a href="#可用的装饰物">可用的装饰物</a></li>
</ul></li>
<li><a href="#结构地物">§2.11.6 结构地物</a><ul>
<li><a href="#结构地物JSON格式">JSON格式</a></li>
<li><a href="#可用的结构地物">可用的结构地物</a></li>
</ul></li>
<li><a href="#拼图模板池">§2.11.7 拼图模板池</a></li>
<li><a href="#方块处理器">§2.11.8 方块处理器</a><ul>
<li><a href="#方块处理器JSON格式">JSON格式</a></li>
<li><a href="#可用的方块处理器">可用的方块处理器</a></li>
</ul></li>
</ul></li>
</ul></li>
<li><a href="#3_资源包">§3 资源包</a><ul>
<li><a href="#资源包元信息和图标">§3.1 元信息和图标</a></li>
<li><a href="#3.2_命名空间">§3.2 命名空间</a></li>
<li><a href="#3.3_语言文件">§3.3 语言文件</a></li>
<li><a href="#3.4_自定义物品模型">§3.4 自定义物品模型</a></li>
<li><a href="#3.5_模型">§3.5 模型</a></li>
<li><a href="#材质">§3.6 材质</a></li>
<li><a href="#音效">§3.7 音效</a></li>
<li><a href="#3.8_字体">§3.8 字体</a></li>
<li><a href="#3.9_着色器">§3.9 着色器</a></li>
</ul></li>
<li><a href="#规划" style="font-weight: bold; text-align: center;">实践篇</a></li>
<li><a href="#规划">§4. 规划</a><ul>
<li><a href="#4.1_名称设计">§4.1 名称设计</a></li>
<li><a href="#4.2_调试">§4.2 调试</a></li>
<li><a href="#4.3_前置与附属">§4.3 前置与附属</a></li>
<li><a href="#4.4_发布">§4.4 发布</a></li>
</ul></li>
<li><a href="#5_物品设计">§5 物品设计</a><ul>
<li><a href="#5.1_通用处理">§5.1 通用处理</a></li>
<li><a href="#5.2_右键交互">§5.2 右键交互</a></li>
<li><a href="#5.3_食物">§5.3 食物</a></li>
<li><a href="#5.4_药水">§5.4 药水</a></li>
<li><a href="#5.5_自定义状态效果">§5.5 自定义状态效果</a></li>
<li><a href="#5.6_头饰">§5.6 头饰</a></li>
<li><a href="#5.7_盔甲">§5.7 盔甲</a></li>
<li><a href="#5.8_工具和武器">§5.8 工具和武器</a></li>
<li><a href="#5.9_画">§5.9 画</a></li>
</ul></li>
<li><a href="#6_方块设计">§6 方块设计</a><ul>
<li><a href="#6.1_视线追踪法">§6.1 视线追踪法</a></li>
<li><a href="#6.2_计算交点法">§6.2 计算交点法</a></li>
<li><a href="#6.3_命令方块替换法">§6.3 命令方块替换法</a></li>
<li><a href="#6.4_破坏事件">§6.4 破坏事件</a></li>
<li><a href="#6.5_模型设置">§6.5 模型设置</a></li>
</ul></li>
<li><a href="#8_机器设计">§7 机器设计</a><ul>
<li><a href="#8.1_GUI材质模型">§7.1 GUI材质模型</a></li>
<li><a href="#8.2_GUI背景处理">§7.2 GUI背景处理</a></li>
<li><a href="#8.3_GUI命令">§7.3 GUI命令</a></li>
<li><a href="#8.4_物品输出">§7.4 物品输出</a></li>
<li><a href="#8.5_配方处理">§7.5 配方处理</a></li>
<li><a href="#8.6_插件">§7.6 插件</a></li>
<li><a href="#8.7_容器扩展">§7.7 容器扩展</a></li>
<li><a href="#8.8_接口">§7.8 接口</a></li>
<li><a href="#8.9_管道">§7.9 管道</a><ul>
<li><a href="#8.9.1_无线传输">§7.9.1 无线传输</a></li>
<li><a href="#8.9.2_管道式">§7.9.2 管道式</a></li>
<li><a href="#8.9.3_激光式">§7.9.3 激光式</a></li>
<li><a href="#8.9.4_载体式">§7.9.4 载体式</a></li>
<li><a href="#8.9.5_管道设计">§7.9.5 管道设计</a></li>
</ul></li>
</ul></li>
<li><a href="#NBT合成与烧炼">§8 NBT合成与烧炼</a><ul>
<li><a href="#9.1_地板合成">§8.1 地板合成</a></li>
<li><a href="#9.2_实体背包合成">§8.2 实体背包合成</a></li>
<li><a href="#9.3_容器合成">§8.3 容器合成</a></li>
<li><a href="#9.4_NBT烧炼">§8.4 NBT烧炼</a><ul>
<li><a href="#9.4.1_替换产物法">§8.4.1 替换产物法</a></li>
<li><a href="#9.4.2_记分板模拟">§8.4.2 记分板模拟</a></li>
</ul></li>
<li><a href="#9.5_NBT酿造">§8.5 NBT酿造</a></li>
</ul></li>
<li><a href="#10_植物">§9 植物</a><ul>
<li><a href="#10.1_作物">§9.1 作物</a></li>
<li><a href="#10.2_花草">§9.2 花草</a></li>
<li><a href="#10.3_树">§9.3 树</a></li>
</ul></li>
<li><a href="#11_物品与实体处理">§10 物品与实体处理</a><ul>
<li><a href="#修改玩家背包">§10.1 修改玩家背包</a></li>
<li><a href="#耐久处理">§10.2 耐久处理</a></li>
<li><a href="#红石信号">§10.3 红石信号</a></li>
<li><a href="#方块交互">§10.4 方块交互</a></li>
<li><a href="#生物移动">§10.5 生物移动</a></li>
<li><a href="#交易">§10.6 交易</a></li>
<li><a href="#清理特定物品">§10.7 清理特定物品</a></li>
<li><a href="#连锁">§10.8 连锁</a></li>
</ul></li>
<li><a href="#12_算法">§11 算法</a><ul>
<li><a href="#随机数">§11.1 随机数</a><ul>
<li><a href="#不定长均匀分布">§11.1.1 不定长均匀分布</a></li>
<li><a href="#定长均匀分布">§11.1.2 定长均匀分布</a></li>
<li><a href="#非均匀分布">§11.1.3 非均匀分布</a></li>
<li><a href="#二项分布和泊松分布">§11.1.4 二项分布</a></li>
</ul></li>
<li><a href="#世界生成结构">§11.2 世界生成结构</a><ul>
<li><a href="#类原版小型结构">§11.2.1 类原版小型结构</a></li>
<li><a href="#任意纯方块结构">§11.2.2 任意纯方块结构</a></li>
<li><a href="#含实体结构">§11.2.3 含实体结构</a></li>
<li><a href="#区块标记法">§11.2.4 区块标记法</a></li>
</ul></li>
<li><a href="#绘制图案">§11.3 绘制图案</a></li>
<li><a href="#循环与递归">§11.4 循环与递归</a></li>
<li><a href="#字符操作">§11.5 字符操作</a></li>
<li><a href="#位运算与种子">§11.6 位运算与种子</a></li>
<li><a></a></li>
</ul></li>
</ul>
<footer id="options">
<div style="background-color: rgb(0,0,129);" onclick="content_level_1(this);" title="显示目录全部层次">全</div>
<div style="background-color: rgb(0,0,129);display:none;" onclick="content_level_2(this)" title="显示目录节">节</div>
<div style="background-color: rgb(0,0,129);display:none;" onclick="content_level_3(this);" title="显示目录小节">小</div>
<div style="background-color: rgb(0,129,0);" onclick="hidecomment(this);" title="显示JSON注释">显</div>
<div style="background-color: rgb(0,129,0);display:none;" onclick="showcomment(this)" title="隐藏JSON注释">隐</div>
</footer>
<footer id="sign">
<p class="noindent" style="font-size:100%;margin:0; text-align:right;color: hsl(220, 90%, 90%);">ruhuasiyu</p>
</footer>
</nav>
<div id="main_part">
<img id="banner" src="items/banner.png" alt="原版模组入门教程" style="width:100%;"/>
<article>
<h1 id="引言">§1 引言</h1>
<p>原版模组指在不修改 Minecraft 游戏本体的前提下,通过命令方块、一键命令、数据包、资源包等方式对游戏的可玩性做出修改。之所以称之为原版模组,乃是为了和使用 Mod Loader/API 环境基于 Java 开发的 Mod 作区分,这些 Mod Loader/API 包括 Forge,Liteloader,Fabric 等。自 Minecraft Java 版 1.13 起的数据包概念问世之后,原版模组的制作已变得十分便捷。本文内的原版模组便是指利用数据包和可能的配套资源包对游戏的可玩性做出修改。</p>
<p>本文内容适用于 Minecraft Java 版 1.16 版本,但大部分内容也适合 1.13-1.15 版本,请读者自行区分。系统环境为 Windows 10,其它环境下有较小的差异。本文参考和吸取了大量其他玩家的意见、建议、教程等,无法一一列出,在此一并表示感谢。</p>
<p>本文更侧重教程而非开发手册,因此很多内容的完整格式并没有列出,此时请读者自行查阅相关的 wiki 链接。由于国内访问 <a href="https://minecraft-zh.gamepedia.com/">Minecraft Wiki</a> 速度较慢,因此本文中 wiki 页面链接均使用 <a href="https://wiki.biligame.com/mc/">biligame 的镜像</a>。由于 <a href="https://minecraft.gamepedia.com/">Minecraft 英文 Wiki</a> 内容往往更准确,因此有英文阅读能力和访问能力的可直接查看英文 wiki 的相关内容。</p>
<p>本文中<code><i>青铜色楷体</i></code>表示其应当被替换为合适的字符串,<code style="color: rgb(0,129,0);">绿色楷体</code>表示JSON文件中的注释,点击左下角<span style="color:white;background-color: rgb(0,129,0);font-weight: bold;">显</span>/<span style="color:white;background-color: rgb(0,129,0);font-weight: bold;">隐</span>可切换显示或隐藏注释。</p>
<p>进度:§2.11 by ruhuasiyu 2020/08/08</p>
<h2 id="命令基础">§1.1 命令基础</h2>
<p>本文不会介绍命令的基础知识,相关内容请读者通过如下链接自行了解。</p>
<ul>
<li><strong><a href="https://wiki.biligame.com/mc/命令" class="wiki"><ruby>命令<rt>command</rt></ruby></a></strong>为官方 wiki 的命令页面,其中包括了命令的基本参数介绍:坐标、目标选择器、数据标签(NBT 格式)、原始JSON文本、命名空间ID等内容。读者需在学习命令过程中逐步了解这些概念。</li>
<li class="noindent"><strong><a href="https://wiki.biligame.com/mc/记分板" class="wiki"><ruby>记分板<rt>scoreboard</rt></ruby></a></strong>为官方 wiki 的记分板页面,其中包括了记分板的所有准则和相关命令格式,也包含了<ruby>标签<rt>tag</rt></ruby>和<ruby>组<rt>team</rt></ruby>的相关内容。</li>
<li class="noindent"><strong><a href="https://wiki.biligame.com/mc/区块格式">区块格式</a>,<a href="https://wiki.biligame.com/mc/Player.dat格式" class="wiki">player.dat格式</a></strong>两个页面给出了所有物品和实体(含方块实体)的 NBT。在游戏中,实体的 NBT 可通过命令 <code>data get entity/block</code> 来获取,物品的 NBT 可通过手持并输入命令 <code>data get entity @s SelectedItem</code> 来获取,以避免记忆大量的 NBT。</li>
<li class="noindent"><strong><a href="https://commandtutorials.neocities.org/">新人手册-MC命令方块资源</a></strong>包含了很多基础的教程,不过很多内容会有些过时。还包含少量进阶的内容,对于初学者可能较为复杂,请以理解其逻辑为主。</li>
<li class="noindent"><strong><a href="http://mc-command.oschina.io/command-tutorial/">命令进阶</a></strong> 名为命令进阶,实际上比前一项页面更为初等,不过更为系统。</li>
</ul>
<p>若你已对 1.16 之前版本的命令较为熟悉,可在<a href="https://wiki.biligame.com/mc/Java版版本记录" class="wiki">Java版版本记录</a>中查看各版本间差异。</p>
<h2 id="工具准备">§1.2 工具准备</h2>
<h3 id="文本编辑器">§1.2.1 文本编辑器</h3>
<p>原版模组涉及的文本文件,包括文本文档(.txt)、函数文件(.mcfunction)、JSON文件(.json, .mcmeta),均需使用 <code>UTF-8</code> 编码格式。以下列出的文本编辑器均默认为 <code>UTF-8</code> 编码,可以在编辑器页面的右下角状态栏看到。</p>
<ul>
<li><strong><a href="https://code.visualstudio.com/">Visual Studio Code</a></strong> 为功能较丰富的编辑器。下载安装后,可以安装如下插件:
<ul>
<li><em>Chinese (Simplified) Language Pack for Visual Studio Code</em> 用于支持中文语言</li>
<li><em>Datapack Helper Plus (JSON)</em> 用于JSON语法补全和纠错</li>
<li><em>Datapack Helper Plus (MCF)</em> 用于函数语法补全和纠错</li>
<li><em>language-mcfunction</em> 用于函数语法高亮</li>
</ul>
</li>
<li><strong>记事本</strong>为 Windows 系统自带的极简编辑器。Windows10 的记事本已经默认是 <code>UTF-8</code> 编码了。点击<code>查看->状态栏</code>可以在右下角状态栏看到,因此可以正常使用。旧版本 Windows 的记事本仍然不是,请勿使用。</li>
<li><strong><a href="https://notepad-plus-plus.org/">Notepad++</a></strong>复杂程度介于二者之间。可从 <a href="http://www.mcbbs.net/thread-806816-1-1.html">mcfunction 的语言样式和自动补全</a>帖中下载相关文件并导入以支持语法高亮和补全。另外请将 Notepad++ 中<code>设置->首选项->其它->自动检测字符编码</code>选项关闭。</li>
</ul>
<p>编辑器右下角可以看到 <code>LF</code> 或 <code>CRLF</code>,分别表示两种换行符,二者均可正常使用,建议使用 <code>LF</code>。</p>
<p>注意编码不要误选了 <code>UTF-8 with BOM</code> 格式。</p>
<p>由于编辑器插件相比 Minecraft 版本更新具有延后性,因此上述语法补全/高亮/纠错等未必准确。</p>
<p>除 <code>txt</code> 以外的文本文件均可通过新建文本文件后修改后缀得到。为便于查看文件后缀,请将<code>文件->文件夹选项->查看->隐藏已知文件类型的扩展名</code>选项去掉勾选。</p>
<h3 id="压缩工具">§1.2.2 压缩工具</h3>
<p>数据包和资源包均可以为文件夹或 zip 压缩文件格式。游戏本体和模组本体的 jar 文件也需要压缩工具来打开。</p>
<ul>
<li><strong>Windows 资源管理器</strong> Windows10 系统自带 zip 格式的压缩和解压缩。zip 格式可如文件夹般直接打开,压缩则用<code>选择->右键->发送到->压缩文件夹</code>。</li>
<li><strong><a href="http://www.7-zip.org/">7-Zip</a></strong> 免费软件。</li>
<li><strong><a href="http://www.winrar.com.cn/">WinRAR</a></strong> 付费软件。</li>
</ul>
<p>jar 文件可以通过重命名为 zip 文件直接用 Windows 资源管理器打开。显然,这不如<code>右键->7-zip->打开压缩包</code>方便。</p>
<h3 id="NBT_编辑器">§1.2.3 NBT 编辑器</h3>
<p>推荐使用 <a href="https://github.com/jaquadro/NBTExplorer/releases">NBTExplorer</a> 来打开 dat 文件和其它 NBT 格式文件。汉化版本可<a href="https://www.mcbbs.net/thread-735265-1-1.html">由此下载</a>。</p>
<h3 id="绘图工具">§1.2.4 绘图工具</h3>
<p>推荐使用 <a href="https://www.adobe.com/cn/products/photoshop.html">Adobe Photoshop</a> 或其它绘图工具来绘制材质。Windows 自带的画图由于无法生成透明背景,因此不推荐使用。</p>
<h2 id="文件结构">§1.3 游戏文件夹</h2>
<p>本节中我们将对游戏文件夹的结构做简单的介绍,我们只介绍原版模组开发中涉及的内容。<code>.minecraft</code> 文件夹是 Minecraft 创建的并用于游戏运行的文件夹,它包含了游戏的所有内容。在第一次启动启动器时,会自动创建 <code>.minecraft</code> 文件夹。参考 <a href="https://wiki.biligame.com/mc/.minecraft" class="wiki">.minecraft</a>。</p>
<p><code>.minecraft</code> 文件夹通常位于你的启动器目录下。如果启动器中设置为各版本独立,则位于 <code>versions/<i>版本号</i></code>下。另一种方式是在游戏内点击<code>选项->资源包->打开压缩包文件夹</code>并返回上级目录,或者点击<code>单人游戏->选中世界->编辑->打开世界文件夹</code>并返回上上级目录。</p>
<p class="noindent"><strong>游戏本体</strong>位于 <code>versions/<i>版本号</i>/<i>版本号</i>.jar</code>。该文件包含了对应版本的游戏资源和数据文件,使用压缩工具打开后,可以看到</p>
<ul>
<li>原版<a href="#资源包">资源包</a>位于 <code>assets</code> 文件夹内,其中 <code>minecraft</code> 文件夹为命名空间 <code>minecraft</code> 下的资源文件。</li>
<li>原版<a href="#数据包">数据包</a>位于 <code>data</code> 文件夹内,其中 <code>minecraft</code> 文件夹为命名空间 <code>minecraft</code> 下的数据文件。</li>
<li><code>pack.mcmeta</code> 为原版资源包和数据包的<a href="#数据包元信息和图标">元信息</a>。</li>
<li><code>pack.png</code> 为原版资源包和数据包的<a href="#数据包元信息和图标">图标</a>。</li>
</ul>
<figure>
<img src="items/游戏本体文件结构.png" alt="游戏本体文件结构" />
<figcaption>图1.1 游戏本体文件结构</figcaption>
</figure>
<p class="noindent"><strong>资源包文件夹</strong>位于<code>resourcepacks</code>,其下方子文件夹或 <code>zip</code> 压缩文件即为一个资源包,具体结构见 <a href="#资源包">§3 资源包</a>。服务器下载的资源包位于 <code>server-resource-packs/<i>服务器</i></code>,可使用压缩工具打开。</p>
<p class="noindent"><strong>资源文件</strong> 部分资源文件不被包含在原版资源包内,而是位于资源文件夹下,这主要包括各种语言文本和音效文件。资源文件索引位于 <code>assets/indexes/<i>版本号</i>.json</code>,打开后通过键值可知相应资源的 hash 值,对应的资源位于 <code>assets/objects/<i>hash开头</i>/<i>hash</i></code>。例如打开 <code>>assets/indexes/1.16.json</code>,找到键 <code>minecraft/lang/zh_cn.json</code> 的 <code>hash</code> 为 <code>74f282093eaa509909f04fa3311757320445a27f</code>,因此简体中文的语言文本位于文件夹 <code>assets/objects/74/74f282093eaa509909f04fa3311757320445a27f</code>,使用文本编辑器打开即可看到游戏内的所有名称的中文译名。注意该文件中的中文均被转化为相应的 Unicode 表达方式,参考<a href="#字体">字体</a>。</p>
<p class="noindent"><strong>日志</strong>位于 <code>logs/latest.log</code>,可由此实时查看游戏内加载资源包和数据包时的错误信息,包括错误的文件名称、位置、错误的行列数等,因此这对于我们调试非常重要。简体中文下需要设置文件编码为 Simplified Chinese (GBK),否则除 ASCII 外的字符会显示乱码。历史日志位于 <code>logs/<i>年-月-日-序号</i>.log.gz</code>,使用压缩工具打开后使用文本编辑器打开。崩溃报告位于 <code>crash-reports/<i>crash-年-月-日_时.分.秒-server</i>.txt</code>,如果是由于资源包或数据包引起的崩溃,可以在该文件中看到原因。</p>
<p class="noindent"><strong>存储的物品栏</strong> 位于 <code>hotbar.nbt</code>,存储了游戏内使用<code>C+<i>数字</i></code>存储、<code>X+<i>数字</i></code>取出的创造模式物品快捷栏。</p>
<p class="noindent"><strong>存档文件</strong>位于 <code>saves/<i>世界名称</i></code>,由于<a href="https://wiki.biligame.com/mc/世界格式">世界格式</a>上该内容已较为详尽且与原版模组联系甚远,因此我们仅提及部分内容。该文件夹包含的区块文件、地图文件等不建议使用 NBT 编辑器来编辑,而是用 MCEdit、地图文件生成工具等专门的工具来编辑。存档的备份文件位于 <code>backups/<i>年-月-日_时-分-秒_世界名称</i>.zip</code>,为存档的备份文件,解压后复制到 <code>saves</code> 即可使用。</p>
<ul>
<li><strong>进度</strong>位于 <code>advancements/<i>玩家 UUID</i>.json</code>,记录了玩家已完成的进度和进度判据的完成时间。对于需要完成多个判据才能达成的进度,该文件中记录了已完成的那些判据的完成时间。</li>
<li><strong>区块、村民兴趣点、袭击、常加载区块</strong>等信息分维度存储,主世界、下界、末地、自定义维度的相应文件分别位于根文件夹、<code>DIM-1</code>、<code>DIM1</code>、<code>dimensions/<i>命名空间</i>/<i>路径</i></code>下。</li>
<li><strong>世界信息</strong>文件 <code>level.dat</code> 中 <code>WorldGenSettings</code> 包含了世界生成时的所有维度的生成信息,这和<code>创建新的世界->更多世界的选项->导入设置</code>所使用的JSON文件有关,而和数据包中自定义的维度无关,格式见<a href="#自定义世界">自定义世界</a>。</li>
<li><strong>数据包文件夹</strong>位于<code>datapacks</code>,其下方子文件夹或 <code>zip</code> 压缩文件即为一个数据包,具体结构见 <a href="#数据包">§3 数据包</a>。</li>
<li><strong>结构</strong>位于<code>generated/<i>命名空间</i>/structures/<i>文件</i>.nbt</code>,其记录了游戏内使用结构方块保存的结构,将其移动至数据包内方可使用。</li>
</ul>
<h3 id="JSON文件">§1.4 JSON文件</h3>
<p>参考<a href="https://wiki.biligame.com/mc/JSON" class="wiki">JSON</a>。数据包的进度、战利品表、标签、断言(谓词)、配方、维度、维度类型、世界生成,资源包的语言文件、模型等文件均为JSON格式文件。<code>.mcmeta</code> 文件也是JSON文件,因此格式也是相同的。编写时,使用空格或制表符(Tab)缩进,以便于查看括号匹配和层次。wiki 上有关页面使用了 NBT 的数据类型标注,但其实并不适用于JSON格式。</p>
<p>JSON文件通常包含用于封装文件数据的一对大括号<code>{}</code>(<a href="#断言">断言</a>文件的根数据类型可以为数组),包含类似 <code>"abc":"def"</code> (<code>"键":值</code>)的对,一般使用单引号也可以。同一个文件中如果允许有相同的键,则后者会覆盖前者。JSON数据类型有</p>
<p class="noindent"><strong>布尔型</strong>,值为<code>true</code>和<code>false</code>。</p>
<pre>{
"is_on_fire": false,
"is_baby": true
}
</pre>
<p class="noindent"><strong>数值</strong>,值为任何数字。<code>2</code>和<code>2.0</code>没有差异。</p>
<pre>{
"count": 2,
"chance": 0.025
}
</pre>
<p class="noindent"><strong>字符串</strong>,值使用双引号/单引号圈住,可以使用颜色代码如§6、换行符\n。</p>
<pre>{
"item": "minecraft:shears",
"condition": "minecraft:match_tool",
"layer0": "ex:crop/bauhinia_seeds",
"description": "§6更多的合成 1.10\n§6by ruhuasiyu"
}
</pre>
<p class="noindent"><strong>数组</strong>,值使用中括号圈住。</p>
<pre>{
"chances": [0.05, 0.0625, 0.083333336, 0.1],
"items": [
{"item": "minecraft:zombie_head"},
{"item": "minecraft:skeleton_skull"},
{"item": minecraft:wither_skeleton_skull"},
{"item": "minecraft:creeper_head"}
],
"requirements":[
[
"wing_of_sky",
"heart_of_crystal",
"nova_of_fire"
]
]
}
</pre>
<p class="noindent"><strong>对象</strong>,使用大括号圈住。整个JSON文件内容本身就是一个JSON对象。</p>
<pre>{
"count": { "type": "minecraft:uniform", "min": 1, "max": 2 },
"modifiers": [
{
"name": "legs_armor",
"attribute": "generic.armor",
"operation": "addition",
"amount": 4,
"slot": "legs"
}
]
}
</pre>
<p>我们常常在JSON中用RGB颜色的整数形式,值为: <code>65536×R+256×G+B</code>。</p>
<h1 id="数据包">§2 数据包</h1>
<p>参考<a href="https://wiki.biligame.com/mc/数据包">数据包</a>,<a href="https://wiki.biligame.com/mc/教程/安装数据包">教程/安装数据包</a>,<a href="https://wiki.biligame.com/mc/教程/制作数据包" class="wiki">教程/制作数据包</a>。<ruby>数据包<rt>datapacks</rt></ruby>可用于覆盖或添加新的函数、进度、战利品表、断言、配方、结构、标签、维度。数据包文件夹位于 <code>.minecraft/saves/<i>世界名称</i>/datapacks</code>,其下方子文件夹或 <code>zip</code> 压缩文件即为一个数据包。</p>
<p></p>
<p class="noindent"><strong>安装数据包</strong> 单人游戏中,对于新创建的世界,在创建时点击<code>创建新的世界->世界预设->数据包</code>,将数据包拖入并选择至右侧即可。对于已生成的世界,选择你需要安装数据包的世界,点击<code>编辑->打开世界文件夹->打开文件夹 datapacks</code>,并将数据包 <code>.zip</code> 文件或文件夹放入其中。</p>
<p>多人游戏中,打开<code>服务器文件夹->worlds->datapacks</code>文件夹,并将数据包 <code>.zip</code> 文件或文件夹放入其中。</p>
<p>数据包放置好后,将在重新进入该世界/下次服务器启动时为该世界启用该数据包。如果世界已经被打开并且你已经开启作弊,请键入 <code>/reload</code> 以加载数据包;若无法开启作弊,你可以使用F3+T加载数据包。注意该做法不能重新加载数据包定义的<a href="#维度">维度</a>和<a href="#世界生成">世界生成</a>。</p>
<p>对于创建世界时添加的数据包,可以在数据包选择页面调整加载次序。其它情形添加的数据包优先级最高,即最后加载。同时加入的数据包优先级则和文件名顺序相关。数据包的优先级顺序储存在文件 <code>level.dat</code> 中,可以通过 <code>/datapack</code> 命令查看或修改。在游戏中通过命令 <code>/datapack</code> 可以禁用/启用数据包,最后启用的优先级最高。由于数据包记载顺序不定,因此在制作数据包的过程中,尽量不要依赖数据包的加载顺序。</p>
<p>使用 <code>/datapack list</code> 命令显示数据包名称时,原版数据包为 <code>[vanilla]</code>,玩家自定义的数据包应该是 <code>[file/<i>数据包名称</i>]</code>。</p>
<p class="noindent"><strong>文件夹结构</strong></p>
<pre class="file">datapacks/<i>数据包名称</i>或<i>数据包名称</i>.zip/</pre>
<pre>
pack.mcmeta
pack.png
data
<i>命名空间</i>
advancements
<i>进度名称</i>.json
functions
<i>函数名称</i>.mcfunction
loot_tables
<i>战利品表名称</i>.json
predicates
<i>谓词名称</i>.json
structures
<i>结构名称</i>.nbt
recipes
<i>配方名称</i>.json
tags
functions
<i>函数标签名称</i>.json
blocks
<i>方块标签名称</i>.json
items
<i>物品标签名称</i>.json
entity_types
<i>实体类型标签名称</i>.json
fluids
<i>流体标签名称</i>.json
game_events
<i>游戏事件标签名称</i>.json
dimension
<i>维度名称</i>.json
dimension_type
<i>维度类型名称</i>.json
worldgen
biome
<i>生物群系名称</i>.json
configured_carver
<i>地形雕刻器名称</i>.json
configured_feature
<i>地物名称</i>.json
configured_structure_feature
<i>结构地物名称</i>.json
configured_surface_builder
<i>地表生成器名称</i>.json
noise_settings
<i>噪声设置名称</i>.json
processor_list
<i>方块处理器名称</i>.json
template_pool
<i>拼图模板池名称</i>.json
</pre>
<p>由于命名空间ID的命名要求,<code>data</code> 下所有文件和文件夹需使用小写英文、数字或-(折线),_(下划线),.(点)来命名,<strong>不可使用大写字母</strong>,所有文本文件使用 <code>UTF-8</code> 编码。数据包可以为文件夹格式或 <code>zip</code> 格式,发布时可将所有内容压缩为一个 <code>zip</code> 文件。压缩和解压的时候,注意文件层次,应当打开 <code>zip</code> 文件就可以看到数据包的 <code>pack.mcmeta</code> 和 <code>data</code> 文件夹。稳妥的做法是<code>打开文件夹->全选->右键->发送到->压缩文件夹</code>。</p>
<p class="noindent"><strong id="原版数据包"><ruby>原版数据包<rt>vanilla</rt></ruby></strong>是 Minecraft 自带的一个默认开启的数据包,其 <code>data</code> 文件夹位于 <code>.minecraft/versions/<i>版本号</i>/<i>版本号</i>.jar/data</code>,其中包含的原版进度、配方、结构、战利品表等内容,是制作数据包的文件样板。</p>
<h2 id="数据包元信息和图标">§2.1 元信息和图标</h2>
<p>Minecraft 通过文件 <code>pack.mcmeta</code> 来识别数据包,因此该文件是不可或缺的。例如:</p>
<pre class="file">pack.mcmeta</pre>
<pre>
{
"pack": {
"pack_format": 6, <span class="comment">数据包版本,1.13-1.14 版本为 4,1.15-1.16.1 版本为 5,1.16.2-1.16.4 版本为 6,1.17 版本为 7</span>
"description": "§6数据包名称\n§a简要介绍 6by 某某作者" <span class="comment">数据包描述</span>
}
}
</pre>
<p class="noindent">其中数据包描述为单个字符串或一个<a href="https://wiki.biligame.com/mc/命令#.E5.8E.9F.E5.A7.8BJSON.E6.96.87.E6.9C.AC">原始JSON文本</a>。创建新的世界时,它会显示在数据包菜单中数据包名称下方。在数据包列表下,光标移动到对应的数据包时会显示此处填写的描述。</p>
<p>原版数据包里的 <code>pack.mcmeta</code> 文件为</p>
<pre class="file"><a href="files/vanilla/pack.mcmeta"><code>pack.mcmeta</code></a></pre>
<pre>
{
"pack": {
"pack_format": 6,
"description": "The default data for Minecraft"
}
}
</pre>
<p>数据包可以包含一个 <a href="files/vanilla/pack.png"><code>pack.png</code></a>,它是大小为 <code>16×16</code> 的图片,用于创建新的世界时在数据包菜单中显示。</p>
<h2 id="命名空间">§2.2 命名空间</h2>
<p>参考<a href="https://wiki.biligame.com/mc/命名空间" class="wiki">命名空间</a>。<ruby>命名空间<rt>namespace</rt></ruby>为玩家自定义的、可操作的空间。使用独立的命名空间也有利于解决和他人的冲突。数据包下可以有多个命名空间,如果不同数据包中有相同的命名空间,则其中相同的文件名内容会根据加载先后顺序被覆盖。特别地,原版内容被保存在 <code>minecraft</code> 命名空间,想要修改和替换原版的内容只需在你的数据包内建立 <code>minecraft</code> 命名空间和相应的同名文件并修改即可。</p>
<p><a href="#2.9_标签">标签</a>文件,即 <code>tags</code> 中的文件内容默认追加而不是覆盖。因此标签文件是解决数据包冲突和联动的有力工具。</p>
<table><thead><tr><th>类型</th><th>调用格式(命名空间ID)</th><th>文件路径</th></tr></thead><tbody>
<tr>
<th>函数</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/functions/<i>路径</i>/<i>文件名</i>.mcfunction</code></td>
</tr>
<tr>
<th>进度</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/advancements/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>战利品表</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/loot_tables/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>断言</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/predicates/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>配方</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/recipes/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>结构</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/strutures/<i>路径</i>/<i>文件名</i>.nbt</code></td>
</tr>
<tr>
<th>标签-函数</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/tags/functions/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>标签-方块</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/tags/blocks/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>标签-物品</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/tags/items/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>标签-实体类型</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/tags/entity_types/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>标签-游戏事件</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/tags/game_events/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>维度</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/dimension/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>维度类型</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/dimension_type/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>世界生成-噪声设置</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/worldgen/noise_settings/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>世界生成-生物群系</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/worldgen/biome/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>世界生成-地形雕刻器</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/worldgen/configured_carver/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>世界生成-地表生成器</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/worldgen/configured_surface_builder/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>世界生成-地物</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/worldgen/configured_feature/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>世界生成-结构地物</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/worldgen/configured_structure_feature/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>世界生成-拼图模板池</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/worldgen/template_pool/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
<tr>
<th>世界生成-方块处理器</th>
<td><code><i>命名空间</i>:<i>路径</i>/<i>文件名</i></code></td>
<td><code><i>命名空间</i>/worldgen/processor_list/<i>路径</i>/<i>文件名</i>.json</code></td>
</tr>
</tbody></table>
<p>1.16-1.16.1 版本的维度、维度类型和世界生成文件位置为 <code>minecraft/<i>类型</i>/<i>命名空间</i>/<i>路径</i>/<i>文件名</i>.json</code> 而不是 <code><i>命名空间</i>/<i>类型</i>/<i>路径</i>/<i>文件名</i>.json</code>。</p>
<p>若命名空间为 <code>minecraft</code>,则可直接省略 <code>minecraft:</code>。本文中我们会混用两种写法,注意区分。除此之外,如战利品表JSON的 <code>type</code>、战利品表条件JSON的 <code>condition</code> 等诸多情形的值也是 <code>minecraft</code> 命名空间下的命名空间ID,因此此时也可以省略 <code>minecraft:</code>。</p>
<h2 id="函数">§2.3 函数</h2>
<p>参考<a href="https://wiki.biligame.com/mc/函数(Java版)" class="wiki">函数</a>。<ruby>函数<rt>functions</rt></ruby>是一系列顺次执行的命令。函数文件为纯文本文件,后缀为 <code>mcfunction</code>,每一行表示一个单独的命令,无需/开头。执行时会按顺序依次执行,使用 <code>#</code> 开头的行为注释行。游戏内或函数内使用 <code>function <i>命名空间</i>:<i>路径</i></code>命令来依次执行函数的每一条命令。函数还可用于完成进度时的奖励函数。</p>
<p>如果函数被另一个函数执行,则默认无执行者,执行地点为出生点,除非在执行时继承上一层命令的执行者和执行位置。如果函数被命令方块执行,则无执行者,执行地点为命令方块位置。如果函数被玩家手动执行,则执行者为玩家自身,执行地点为玩家位置。更多的说明请查看<a href="https://wiki.biligame.com/mc/命令/execute" class="wiki">命令/execute</a>的各项子命令。</p>
<p>如果需要函数在游戏加载/每刻执行,则需要将其加入函数标签中,参考<a href="#函数标签">函数标签</a>。</p>
<h2 id="2.4_进度">§2.4 <ruby>进度<rt>advancements</rt></ruby></h2>
<p>参考<a href="https://wiki.biligame.com/mc/进度/JSON格式" class="wiki">进度/JSON格式</a>。进度为游戏内检测玩家行为,触发后完成进度并执行奖励的系统,游戏内按 L 即可查看。进度文件为JSON文件。我们先通过两个例子来看进度文件的格式。</p>
<p class="noindent"><strong>显示效果</strong> 当一个进度没有 <code>parent</code> 时,称之为根进度,即它没有上游进度。此时我们一般会指定 <code>display</code> 来规定显示效果,例如</p>
<pre class="file">ex/advancements/root.json</pre>
<pre>
{
"display": {
"icon": {
"item": "minecraft:carrot_on_a_stick",
"nbt": "{CustomModelData:12970010}"
},
"title":{
"translate": "advancements.ex.root.title"
},
"description": {
"translate": "advancements.ex.root.description"
},
"frame": "goal",
"background": "ex:bg.png"
},
"criteria": {
"dream_wand": {
"trigger": "minecraft:inventory_changed",
"conditions":{
"items":[
{
"nbt":"{id:\"ex:dream_wand\"}"
}
]
}
}
}
}
</pre>
<p class="noindent">其中各个键的含义为</p>
<table><thead><tr><th style="width:7em;">含义</th><th style="width:6em;">层次和键</th><th>说明</th></tr></thead><tbody>
<tr>
<th rowspan="3">图标</th>
<td><code>display.icon</code></td>
<td>图标,这里为胡萝卜钓竿的自定义物品模型。</td>
</tr>
<tr>
<td><code>display.icon.item</code></td>
<td>图标物品 ID,这里为胡萝卜钓竿。</td>
</tr>
<tr>
<td><code>display.icon.nbt</code></td>
<td>图标物品 NBT,物品的材质模型可能会根据 NBT 不同而不同。</td>
</tr>
<tr>
<th>标题</th>
<td><code>display.title</code></td>
<td>进度的名称,可以是单个字符串或一个<a href="https://wiki.biligame.com/mc/原始JSON文本格式">原始JSON文本格式</a>,样例中 <code>translate</code> 文本是会随着语言改变的文本,参考 <a href="资源包">§3 资源包</a>。</td>
</tr>
<tr>
<th>描述</th>
<td><code>display.description</code></td>
<td>格式同上。</td>
</tr>
<tr>
<th>边框</th>
<td><code>display.frame</code></td>
<td>分为 <code>task</code>(任务 方形边框),<code>challenge</code>(挑战 尖形边框),<code>goal</code>(目标 圆形边框)。</td>
</tr>
<tr>
<th>选项卡背景</th>
<td><code>display.background</code></td>
<td>仅根进度有,决定该选项卡的背景图,为资源包内图片引用,参考 <a href="#texture">§3.6 材质</a>,这里为资源包中图片文件 <code>ex/textures/bg.png</code>。</td>
</tr>
<tr>
<th rowspan="3">其它显示开关</th>
<td><code>display.show_toast</code></td>
<td>为true或false。是否在完成此进度后显示提示信息。默认为true,若无显示效果则无效。一般可省略。</td>
</tr>
<tr>
<td><code>display.announce_to_chat</code></td>
<td>为true或false。是否在完成此进度时在聊天窗口提示。默认为true,若无显示效果则无效。一般可省略。</td>
</tr>
<tr>
<td><code>display.hidden</code></td>
<td>可以为true或false。是否在进度屏幕隐藏此进度,直到完成进度。会影响其子进度。当父进度值为true后便无法覆盖。默认为false。一般仅用于隐藏的进度。</td>
</tr>
</tbody></table>
<p>若一个进度没有 <code>display</code> 或其根进度无选项卡,则该进度不会出现在进度页面。</p>
<p class="noindent"><strong><ruby>触发条件<rt>criteria</rt></ruby></strong> 进度通过 <code>criteria</code> 来指定触发条件,默认其列出的所有条件均需满足才会完成进度,但我们可以通过 <code>requirements</code> 来指定其它格式。<code>requirements</code> 的格式为或的与(合取范式),即其列表中的每一个项(该项还是一个列表)中的均有一个列出的触发条件满足。例如 <code>"requirements": [["a","b"],["c","d"]]</code> 表示当 <code>a</code> 和 <code>b</code> 至少有一个满足且 <code>c</code> 和 <code>d</code> 至少有一个满足时,进度会完成。例如下例中两个判据 <code>sealing_wand</code>, <code>dream_wand</code> 分别表示玩家获取了相应 NBT 物品的触发器,只要其中有一个满足即可完成进度。</p>
<pre class="file">ex/advancements/wand.json</pre>
<pre>{
"parent": "ex:root",
"display": {
"icon": {
"item": "minecraft:carrot_on_a_stick",
"nbt":"{CustomModelData:12970062}"
},
"title":{
"translate": "advancements.ex.wand.title"
},
"description": {
"translate": "advancements.ex.wand.description"
},
"frame": "challenge"
},
"criteria": {
"sealing_wand": {
"trigger": "minecraft:inventory_changed",
"conditions":{
"items":[
{
"nbt":"{id:\"ex:sealing_wand\"}"
}
]
}
},
"dream_wand": {
"trigger": "minecraft:inventory_changed",
"conditions":{
"items":[
{
"nbt":"{id:\"ex:dream_wand\"}"
}
]
}
}
},
"rewards": {
"function": "ex:foo",
"loot": ["ex:bar"],
"recipes": ["minecraft:crafting_table","ex:strange_block"],
"experience": 200
},
"requirements": [
[
"mahoushoujo",
"dream_wand"
]
]
}</pre>
<p>触发条件下为触发条件的名称、触发器和触发器的条件,完整的触发器和触发器的条件请查看<a href="https://wiki.biligame.com/mc/进度/JSON格式#触发器列表">进度/JSON格式#触发器列表</a>。我们简要列出常见的触发器:</p>
<table><thead><tr><th>触发器</th><th>触发器的条件</th></tr></thead><tbody>
<tr>
<td><code>minecraft:impossible</code></td>
<td>仅可使用命令触发,例如使用触发器以外的条件来触发的进度。</td>
</tr>
<tr>
<td><code>minecraft:tick</code></td>
<td>每个游戏刻触发。</td>
</tr>
<tr>
<td><code>minecraft:location</code></td>
<td>检查玩家的位置,例如玩家进入某个维度或生物群系等。</td>
</tr>
<tr>
<td><code>minecraft:enter_block</code></td>
<td>玩家进入方块时触发,例如水、传送门、花等。</td>
</tr>
<tr>
<td><code>minecraft:placed_block</code></td>
<td>玩家放置方块时触发,例如玩家放置了木桶、熔炉、树苗等。</td>
</tr>
<tr>
<td><code>minecraft:inventory_changed</code></td>
<td>玩家物品栏变化时触发,例如玩家获取物品。</td>
</tr>
<tr>
<td><code>minecraft:consume_item</code></td>
<td>玩家消耗了相应物品,例如食用食物、饮用药水等。</td>
</tr>
<tr>
<td><code>minecraft:entity_hurt_player</code></td>
<td>实体伤害玩家时触发。</td>
</tr>
<tr>
<td><code>minecraft:entity_killed_player</code></td>
<td>实体杀死玩家时触发。</td>
</tr>
<tr>
<td><code>minecraft:player_killed_entity</code></td>
<td>玩家杀死实体时触发。</td>
</tr>
<tr>
<td><code>minecraft:player_hurt_entity</code></td>
<td>玩家伤害实体(包括自己)时触发。</td>
</tr>
<tr>
<td><code>minecraft:player_interacted_with_entity</code></td>
<td>玩家用手中物品与实体互动时触发,例如驯服、喂养、上鞍、交易、剪羊毛、旋转物品展示框、收集龙息、与猪灵换物、桶装牛奶、桶装鱼、碗装蘑菇煲、碗装迷之炖菜等。</td>
</tr>
<tr>
<td><code>minecraft:item_durability_changed</code></td>
<td>物品栏中任何物品以任何形式损害时触发,例如使用工具消耗了耐久。</td>
</tr>
<tr>
<td><code>minecraft:item_used_on_block</code></td>
<td>玩家对方块使用物品时触发,例如对着篝火放置食物、斧给木头剥皮等。</td>
</tr>
</tbody></table>
<p>所有的触发器条件均有 <code>player</code> 字段用于判断玩家是否满足相应的断言。例如</p>
<pre class="file">ex:fatness</pre>
<pre>{
"display": {
"icon": {
"item": "minecraft:enchanted_golden_apple"
},
"title":{
"translate": "advancements.ex.fatness.title"
},
"description": {
"translate": "advancements.ex.fatness.description"
},
"frame": "challenge"
},
"parent": "ex:dream_wand",
"criteria": {
"fatness": {
"trigger": "minecraft:tick",
"conditions": {
"player": [
{
"condition": "minecraft:entity_scores",
"entity": "this",
"scores": {
"exHealth": {
"min": 40,
"max": 2147483647
}
}
}
]
}
}
}
}</pre>
<p class="noindent"><strong><ruby>奖励<rt>rewards</rt></ruby></strong> 完成进度后的奖励可以为:</p>
<table><thead><tr><th style="width:7em;">触发器</th><th style="width:6em;">触发器的条件</th><th>说明</th></tr></thead><tbody>
<tr>
<th>函数</th>
<td><code>rewards.function</code></td>
<td>为函数引用格式。完成进度时执行之,不可为函数标签。</td>
</tr>
<tr>
<th>战利品表</th>
<td><code>rewards.loot</code></td>
<td>为战利品表引用格式列表。完成进度时给予玩家列表中的所有战利品。</td>
</tr>
<tr>
<th>解锁配方</th>
<td><code>rewards.recipes</code></td>
<td>为配方引用格式列表。数据包添加的配方也应当有相应进度来解锁,参考<a href="recipe">§2.7 配方</a>。</td>
</tr>
<tr>
<th>经验</th>
<td><code>rewards.experience</code></td>
<td>为数值。建议仅在高难度进度完成时给予。</td>
</tr>
</tbody></table>
<p class="noindent">上例中进度完成后会执行函数 <code>ex:foo</code>,给予玩家战利品表 <code>ex:bar</code> 的物品,解锁玩家配方 <code>minecraft:crafting_table</code> 和 <code>ex:strange_block</code>,并给予玩家 <code>200</code> 点经验。</p>
<p>游戏内或函数内使用 <code>advancement</code> 命令可以手动给予或剥夺进度。进度配合奖励函数剥夺玩家该进度,则该进度可反复触发,可用于诸如检测玩家生物群系、饮食等需要循环检测的情形。此时我们通常缺省进度的 <code>display</code> 以对玩家隐藏,例如:</p>
<pre class="file">ex/advancements/food/citrus.json</pre>
<pre>{
"criteria": {
"citrus": {
"trigger": "minecraft:consume_item",
"conditions": {
"item": {
"nbt": "{id:\"ex:citrus\"}"
}
}
}
},
"rewards":{
"function": "ex:food/citrus"
}
}</pre>
<pre class="file">ex/functions/food/citrus.mcfunction</pre>
<pre>effect give @s saturation 1 1 true
advancement revoke @s only ex:food/citrus
</pre>
<h2 id="2.5_战利品表">§2.5 <ruby>战利品表<rt>loot_tables</rt></ruby></h2>
<h3 id="2.5.1_语法">§2.5.1 语法</h3>
<p>可参考<a href="https://wiki.biligame.com/mc/战利品表#标签">战利品表</a>和<a href="http://www.mcbbs.net/thread-831542-1-1.html">战利品表:从入门到重新入门</a>。战利品表用于实体的掉落物、方块的掉落物、钓鱼、箱子的随机物品等。战利品表文件为JSON文件。例如:</p>
<pre class="file">minecraft/loot_tables/entities/cow.json</pre>
<pre>
{
"type": "minecraft:entity",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:leather",
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 0,
"max": 2
}
},
{
"function": "minecraft:looting_enchant",
"count": {
"type": "minecraft:uniform",
"min": 0,
"max": 1
}
}
]
}
]
},
{
"rolls": 1,
"entries": [
{
"type": "minecraft:alternatives",
"children": [
{
"conditions": [
{
"condition": "minecraft:entity_properties",
"entity": "this",
"predicate": {
"flags": {
"is_on_fire": false
}
}
}
],
"type": "minecraft:item",
"name": "minecraft:beef",
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 1,
"max": 3
}
},
{
"function": "minecraft:looting_enchant",
"count": {
"type": "minecraft:uniform",
"min": 0,
"max": 1
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:cooked_beef",
"functions": [