redscript-mc 1.2.29 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/build-test.md +10 -0
- package/.claude/commands/deploy-demo.md +12 -0
- package/.claude/commands/stage-status.md +13 -0
- package/.claude/settings.json +12 -0
- package/.github/workflows/ci.yml +1 -0
- package/CLAUDE.md +231 -0
- package/README.md +29 -28
- package/README.zh.md +28 -28
- package/demo.gif +0 -0
- package/dist/cli.js +2 -554
- package/dist/compile.js +2 -266
- package/dist/index.js +2 -159
- package/dist/lexer/index.js +9 -1
- package/dist/lowering/index.js +22 -5
- package/dist/src/__tests__/cli.test.d.ts +1 -0
- package/dist/src/__tests__/cli.test.js +104 -0
- package/dist/src/__tests__/codegen.test.d.ts +1 -0
- package/dist/src/__tests__/codegen.test.js +152 -0
- package/dist/src/__tests__/compile-all.test.d.ts +10 -0
- package/dist/src/__tests__/compile-all.test.js +108 -0
- package/dist/src/__tests__/dce.test.d.ts +1 -0
- package/dist/src/__tests__/dce.test.js +102 -0
- package/dist/src/__tests__/diagnostics.test.d.ts +4 -0
- package/dist/src/__tests__/diagnostics.test.js +177 -0
- package/dist/src/__tests__/e2e.test.d.ts +6 -0
- package/dist/src/__tests__/e2e.test.js +1789 -0
- package/dist/src/__tests__/entity-types.test.d.ts +1 -0
- package/dist/src/__tests__/entity-types.test.js +203 -0
- package/dist/src/__tests__/formatter.test.d.ts +1 -0
- package/dist/src/__tests__/formatter.test.js +40 -0
- package/dist/src/__tests__/lexer.test.d.ts +1 -0
- package/dist/src/__tests__/lexer.test.js +343 -0
- package/dist/src/__tests__/lowering.test.d.ts +1 -0
- package/dist/src/__tests__/lowering.test.js +1015 -0
- package/dist/src/__tests__/macro.test.d.ts +8 -0
- package/dist/src/__tests__/macro.test.js +306 -0
- package/dist/src/__tests__/mc-integration.test.d.ts +12 -0
- package/dist/src/__tests__/mc-integration.test.js +817 -0
- package/dist/src/__tests__/mc-syntax.test.d.ts +1 -0
- package/dist/src/__tests__/mc-syntax.test.js +124 -0
- package/dist/src/__tests__/nbt.test.d.ts +1 -0
- package/dist/src/__tests__/nbt.test.js +82 -0
- package/dist/src/__tests__/optimizer-advanced.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer-advanced.test.js +124 -0
- package/dist/src/__tests__/optimizer.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer.test.js +149 -0
- package/dist/src/__tests__/parser.test.d.ts +1 -0
- package/dist/src/__tests__/parser.test.js +807 -0
- package/dist/src/__tests__/repl.test.d.ts +1 -0
- package/dist/src/__tests__/repl.test.js +27 -0
- package/dist/src/__tests__/runtime.test.d.ts +1 -0
- package/dist/src/__tests__/runtime.test.js +289 -0
- package/dist/src/__tests__/stdlib-advanced.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib-advanced.test.js +374 -0
- package/dist/src/__tests__/stdlib-bigint.test.d.ts +7 -0
- package/dist/src/__tests__/stdlib-bigint.test.js +426 -0
- package/dist/src/__tests__/stdlib-math.test.d.ts +7 -0
- package/dist/src/__tests__/stdlib-math.test.js +351 -0
- package/dist/src/__tests__/stdlib-vec.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib-vec.test.js +263 -0
- package/dist/src/__tests__/structure-optimizer.test.d.ts +1 -0
- package/dist/src/__tests__/structure-optimizer.test.js +33 -0
- package/dist/src/__tests__/typechecker.test.d.ts +1 -0
- package/dist/src/__tests__/typechecker.test.js +552 -0
- package/dist/src/__tests__/var-allocator.test.d.ts +1 -0
- package/dist/src/__tests__/var-allocator.test.js +69 -0
- package/dist/src/ast/types.d.ts +515 -0
- package/dist/src/ast/types.js +9 -0
- package/dist/src/builtins/metadata.d.ts +36 -0
- package/dist/src/builtins/metadata.js +1014 -0
- package/dist/src/cli.d.ts +11 -0
- package/dist/src/cli.js +443 -0
- package/dist/src/codegen/cmdblock/index.d.ts +26 -0
- package/dist/src/codegen/cmdblock/index.js +45 -0
- package/dist/src/codegen/mcfunction/index.d.ts +40 -0
- package/dist/src/codegen/mcfunction/index.js +606 -0
- package/dist/src/codegen/structure/index.d.ts +24 -0
- package/dist/src/codegen/structure/index.js +279 -0
- package/dist/src/codegen/var-allocator.d.ts +45 -0
- package/dist/src/codegen/var-allocator.js +104 -0
- package/dist/src/compile.d.ts +37 -0
- package/dist/src/compile.js +165 -0
- package/dist/src/diagnostics/index.d.ts +44 -0
- package/dist/src/diagnostics/index.js +140 -0
- package/dist/src/events/types.d.ts +35 -0
- package/dist/src/events/types.js +59 -0
- package/dist/src/formatter/index.d.ts +1 -0
- package/dist/src/formatter/index.js +26 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.js +45 -0
- package/dist/src/ir/builder.d.ts +33 -0
- package/dist/src/ir/builder.js +99 -0
- package/dist/src/ir/types.d.ts +132 -0
- package/dist/src/ir/types.js +15 -0
- package/dist/src/lexer/index.d.ts +37 -0
- package/dist/src/lexer/index.js +569 -0
- package/dist/src/lowering/index.d.ts +188 -0
- package/dist/src/lowering/index.js +3405 -0
- package/dist/src/mc-test/client.d.ts +128 -0
- package/dist/src/mc-test/client.js +174 -0
- package/dist/src/mc-test/runner.d.ts +28 -0
- package/dist/src/mc-test/runner.js +151 -0
- package/dist/src/mc-test/setup.d.ts +11 -0
- package/dist/src/mc-test/setup.js +98 -0
- package/dist/src/mc-validator/index.d.ts +17 -0
- package/dist/src/mc-validator/index.js +322 -0
- package/dist/src/nbt/index.d.ts +86 -0
- package/dist/src/nbt/index.js +250 -0
- package/dist/src/optimizer/commands.d.ts +38 -0
- package/dist/src/optimizer/commands.js +451 -0
- package/dist/src/optimizer/dce.d.ts +34 -0
- package/dist/src/optimizer/dce.js +639 -0
- package/dist/src/optimizer/passes.d.ts +34 -0
- package/dist/src/optimizer/passes.js +243 -0
- package/dist/src/optimizer/structure.d.ts +9 -0
- package/dist/src/optimizer/structure.js +356 -0
- package/dist/src/parser/index.d.ts +93 -0
- package/dist/src/parser/index.js +1687 -0
- package/dist/src/repl.d.ts +16 -0
- package/dist/src/repl.js +165 -0
- package/dist/src/runtime/index.d.ts +107 -0
- package/dist/src/runtime/index.js +1409 -0
- package/dist/src/typechecker/index.d.ts +61 -0
- package/dist/src/typechecker/index.js +1034 -0
- package/dist/src/types/entity-hierarchy.d.ts +29 -0
- package/dist/src/types/entity-hierarchy.js +107 -0
- package/dist/src2/__tests__/e2e/basic.test.d.ts +8 -0
- package/dist/src2/__tests__/e2e/basic.test.js +140 -0
- package/dist/src2/__tests__/e2e/macros.test.d.ts +9 -0
- package/dist/src2/__tests__/e2e/macros.test.js +182 -0
- package/dist/src2/__tests__/e2e/migrate.test.d.ts +13 -0
- package/dist/src2/__tests__/e2e/migrate.test.js +2739 -0
- package/dist/src2/__tests__/hir/desugar.test.d.ts +1 -0
- package/dist/src2/__tests__/hir/desugar.test.js +234 -0
- package/dist/src2/__tests__/lir/lower.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/lower.test.js +559 -0
- package/dist/src2/__tests__/lir/types.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/types.test.js +185 -0
- package/dist/src2/__tests__/lir/verify.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/verify.test.js +221 -0
- package/dist/src2/__tests__/mir/arithmetic.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/arithmetic.test.js +130 -0
- package/dist/src2/__tests__/mir/control-flow.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/control-flow.test.js +205 -0
- package/dist/src2/__tests__/mir/verify.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/verify.test.js +223 -0
- package/dist/src2/__tests__/optimizer/block_merge.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/block_merge.test.js +78 -0
- package/dist/src2/__tests__/optimizer/branch_simplify.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/branch_simplify.test.js +58 -0
- package/dist/src2/__tests__/optimizer/constant_fold.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/constant_fold.test.js +131 -0
- package/dist/src2/__tests__/optimizer/copy_prop.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/copy_prop.test.js +91 -0
- package/dist/src2/__tests__/optimizer/dce.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/dce.test.js +76 -0
- package/dist/src2/__tests__/optimizer/pipeline.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/pipeline.test.js +102 -0
- package/dist/src2/emit/compile.d.ts +19 -0
- package/dist/src2/emit/compile.js +80 -0
- package/dist/src2/emit/index.d.ts +17 -0
- package/dist/src2/emit/index.js +172 -0
- package/dist/src2/hir/lower.d.ts +15 -0
- package/dist/src2/hir/lower.js +378 -0
- package/dist/src2/hir/types.d.ts +373 -0
- package/dist/src2/hir/types.js +16 -0
- package/dist/src2/lir/lower.d.ts +15 -0
- package/dist/src2/lir/lower.js +453 -0
- package/dist/src2/lir/types.d.ts +136 -0
- package/dist/src2/lir/types.js +11 -0
- package/dist/src2/lir/verify.d.ts +14 -0
- package/dist/src2/lir/verify.js +113 -0
- package/dist/src2/mir/lower.d.ts +9 -0
- package/dist/src2/mir/lower.js +1030 -0
- package/dist/src2/mir/macro.d.ts +22 -0
- package/dist/src2/mir/macro.js +168 -0
- package/dist/src2/mir/types.d.ts +183 -0
- package/dist/src2/mir/types.js +11 -0
- package/dist/src2/mir/verify.d.ts +16 -0
- package/dist/src2/mir/verify.js +216 -0
- package/dist/src2/optimizer/block_merge.d.ts +12 -0
- package/dist/src2/optimizer/block_merge.js +84 -0
- package/dist/src2/optimizer/branch_simplify.d.ts +9 -0
- package/dist/src2/optimizer/branch_simplify.js +28 -0
- package/dist/src2/optimizer/constant_fold.d.ts +10 -0
- package/dist/src2/optimizer/constant_fold.js +85 -0
- package/dist/src2/optimizer/copy_prop.d.ts +9 -0
- package/dist/src2/optimizer/copy_prop.js +113 -0
- package/dist/src2/optimizer/dce.d.ts +8 -0
- package/dist/src2/optimizer/dce.js +155 -0
- package/dist/src2/optimizer/pipeline.d.ts +10 -0
- package/dist/src2/optimizer/pipeline.js +42 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/compiler-pipeline-redesign.md +2243 -0
- package/docs/optimization-ideas.md +1076 -0
- package/editors/vscode/package-lock.json +3 -3
- package/editors/vscode/package.json +1 -1
- package/examples/readme-demo.mcrs +44 -66
- package/jest.config.js +1 -1
- package/package.json +6 -5
- package/scripts/postbuild.js +15 -0
- package/src/__tests__/cli.test.ts +8 -220
- package/src/__tests__/dce.test.ts +11 -56
- package/src/__tests__/diagnostics.test.ts +59 -38
- package/src/__tests__/mc-integration.test.ts +1 -2
- package/src/ast/types.ts +6 -1
- package/src/cli.ts +29 -156
- package/src/compile.ts +6 -162
- package/src/index.ts +14 -178
- package/src/lexer/index.ts +9 -1
- package/src/mc-test/runner.ts +4 -3
- package/src/parser/index.ts +1 -1
- package/src/repl.ts +1 -1
- package/src/runtime/index.ts +1 -1
- package/src2/__tests__/e2e/basic.test.ts +154 -0
- package/src2/__tests__/e2e/macros.test.ts +199 -0
- package/src2/__tests__/e2e/migrate.test.ts +3008 -0
- package/src2/__tests__/hir/desugar.test.ts +263 -0
- package/src2/__tests__/lir/lower.test.ts +619 -0
- package/src2/__tests__/lir/types.test.ts +207 -0
- package/src2/__tests__/lir/verify.test.ts +249 -0
- package/src2/__tests__/mir/arithmetic.test.ts +156 -0
- package/src2/__tests__/mir/control-flow.test.ts +242 -0
- package/src2/__tests__/mir/verify.test.ts +254 -0
- package/src2/__tests__/optimizer/block_merge.test.ts +84 -0
- package/src2/__tests__/optimizer/branch_simplify.test.ts +64 -0
- package/src2/__tests__/optimizer/constant_fold.test.ts +145 -0
- package/src2/__tests__/optimizer/copy_prop.test.ts +99 -0
- package/src2/__tests__/optimizer/dce.test.ts +83 -0
- package/src2/__tests__/optimizer/pipeline.test.ts +116 -0
- package/src2/emit/compile.ts +99 -0
- package/src2/emit/index.ts +222 -0
- package/src2/hir/lower.ts +428 -0
- package/src2/hir/types.ts +216 -0
- package/src2/lir/lower.ts +556 -0
- package/src2/lir/types.ts +109 -0
- package/src2/lir/verify.ts +129 -0
- package/src2/mir/lower.ts +1160 -0
- package/src2/mir/macro.ts +167 -0
- package/src2/mir/types.ts +106 -0
- package/src2/mir/verify.ts +218 -0
- package/src2/optimizer/block_merge.ts +93 -0
- package/src2/optimizer/branch_simplify.ts +27 -0
- package/src2/optimizer/constant_fold.ts +88 -0
- package/src2/optimizer/copy_prop.ts +106 -0
- package/src2/optimizer/dce.ts +133 -0
- package/src2/optimizer/pipeline.ts +44 -0
- package/tsconfig.json +2 -2
- package/src/__tests__/codegen.test.ts +0 -161
- package/src/__tests__/e2e.test.ts +0 -2039
- package/src/__tests__/entity-types.test.ts +0 -236
- package/src/__tests__/lowering.test.ts +0 -1185
- package/src/__tests__/macro.test.ts +0 -343
- package/src/__tests__/nbt.test.ts +0 -58
- package/src/__tests__/optimizer-advanced.test.ts +0 -144
- package/src/__tests__/optimizer.test.ts +0 -162
- package/src/__tests__/runtime.test.ts +0 -305
- package/src/__tests__/stdlib-advanced.test.ts +0 -379
- package/src/__tests__/stdlib-bigint.test.ts +0 -427
- package/src/__tests__/stdlib-math.test.ts +0 -374
- package/src/__tests__/stdlib-vec.test.ts +0 -259
- package/src/__tests__/structure-optimizer.test.ts +0 -38
- package/src/__tests__/var-allocator.test.ts +0 -75
- package/src/codegen/cmdblock/index.ts +0 -63
- package/src/codegen/mcfunction/index.ts +0 -662
- package/src/codegen/structure/index.ts +0 -346
- package/src/codegen/var-allocator.ts +0 -104
- package/src/ir/builder.ts +0 -116
- package/src/ir/types.ts +0 -134
- package/src/lowering/index.ts +0 -3860
- package/src/optimizer/commands.ts +0 -534
- package/src/optimizer/dce.ts +0 -679
- package/src/optimizer/passes.ts +0 -250
- package/src/optimizer/structure.ts +0 -450
|
@@ -0,0 +1,1014 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RedScript Builtin Metadata
|
|
4
|
+
*
|
|
5
|
+
* Comprehensive metadata for all builtin functions, used by:
|
|
6
|
+
* - generate-dts CLI command (produces builtins.d.mcrs)
|
|
7
|
+
* - VSCode extension hover docs
|
|
8
|
+
* - Type checker documentation
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.BUILTIN_METADATA = void 0;
|
|
12
|
+
exports.builtinToDeclaration = builtinToDeclaration;
|
|
13
|
+
exports.generateDts = generateDts;
|
|
14
|
+
exports.BUILTIN_METADATA = {
|
|
15
|
+
// -------------------------------------------------------------------------
|
|
16
|
+
// Chat & Display
|
|
17
|
+
// -------------------------------------------------------------------------
|
|
18
|
+
say: {
|
|
19
|
+
name: 'say',
|
|
20
|
+
params: [
|
|
21
|
+
{ name: 'message', type: 'string', required: true, doc: 'Message to broadcast to all players', docZh: '向所有玩家广播的消息' },
|
|
22
|
+
],
|
|
23
|
+
returns: 'void',
|
|
24
|
+
doc: 'Displays a message to all players in chat as the server.',
|
|
25
|
+
docZh: '以服务器名义向所有玩家发送聊天消息。',
|
|
26
|
+
examples: ['say("Hello, world!");', 'say("Game has started!");'],
|
|
27
|
+
compilesTo: 'say <message>',
|
|
28
|
+
category: 'chat',
|
|
29
|
+
},
|
|
30
|
+
tell: {
|
|
31
|
+
name: 'tell',
|
|
32
|
+
params: [
|
|
33
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player or entity selector', docZh: '目标玩家或实体选择器' },
|
|
34
|
+
{ name: 'message', type: 'string', required: true, doc: 'Message to send privately', docZh: '私信内容' },
|
|
35
|
+
],
|
|
36
|
+
returns: 'void',
|
|
37
|
+
doc: 'Sends a private message to a player or selector using tellraw.',
|
|
38
|
+
docZh: '使用 tellraw 向玩家或选择器发送私信。',
|
|
39
|
+
examples: ['tell(@s, "You won!");', 'tell(@a[tag=vip], "Welcome, VIP!");'],
|
|
40
|
+
compilesTo: 'tellraw <target> {"text":"<message>"}',
|
|
41
|
+
category: 'chat',
|
|
42
|
+
},
|
|
43
|
+
tellraw: {
|
|
44
|
+
name: 'tellraw',
|
|
45
|
+
params: [
|
|
46
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player or entity selector', docZh: '目标玩家或实体选择器' },
|
|
47
|
+
{ name: 'message', type: 'string', required: true, doc: 'Message text (supports f-string interpolation)', docZh: '消息文本(支持格式化字符串插值)' },
|
|
48
|
+
],
|
|
49
|
+
returns: 'void',
|
|
50
|
+
doc: 'Alias for tell(). Sends a raw text message using tellraw.',
|
|
51
|
+
docZh: 'tell() 的别名,使用 tellraw 发送原始文本消息。',
|
|
52
|
+
examples: ['tellraw(@s, "Hello!");'],
|
|
53
|
+
compilesTo: 'tellraw <target> {"text":"<message>"}',
|
|
54
|
+
category: 'chat',
|
|
55
|
+
},
|
|
56
|
+
announce: {
|
|
57
|
+
name: 'announce',
|
|
58
|
+
params: [
|
|
59
|
+
{ name: 'message', type: 'string', required: true, doc: 'Message to broadcast', docZh: '广播消息内容' },
|
|
60
|
+
],
|
|
61
|
+
returns: 'void',
|
|
62
|
+
doc: 'Sends a message to all players in chat (@a).',
|
|
63
|
+
docZh: '向所有玩家(@a)发送聊天消息。',
|
|
64
|
+
examples: ['announce("Round 1 starts in 3 seconds!");'],
|
|
65
|
+
compilesTo: 'tellraw @a {"text":"<message>"}',
|
|
66
|
+
category: 'chat',
|
|
67
|
+
},
|
|
68
|
+
title: {
|
|
69
|
+
name: 'title',
|
|
70
|
+
params: [
|
|
71
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player(s)', docZh: '目标玩家' },
|
|
72
|
+
{ name: 'message', type: 'string', required: true, doc: 'Title text to display', docZh: '标题文字' },
|
|
73
|
+
],
|
|
74
|
+
returns: 'void',
|
|
75
|
+
doc: 'Shows a large title on screen for target players.',
|
|
76
|
+
docZh: '为目标玩家在屏幕上显示大标题。',
|
|
77
|
+
examples: ['title(@a, "Round 1");', 'title(@s, "You Win!");'],
|
|
78
|
+
compilesTo: 'title <target> title {"text":"<message>"}',
|
|
79
|
+
category: 'chat',
|
|
80
|
+
},
|
|
81
|
+
subtitle: {
|
|
82
|
+
name: 'subtitle',
|
|
83
|
+
params: [
|
|
84
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player(s)', docZh: '目标玩家' },
|
|
85
|
+
{ name: 'message', type: 'string', required: true, doc: 'Subtitle text (appears below title)', docZh: '副标题文字(显示在主标题下方)' },
|
|
86
|
+
],
|
|
87
|
+
returns: 'void',
|
|
88
|
+
doc: 'Shows subtitle text below the main title on screen.',
|
|
89
|
+
docZh: '在屏幕主标题下方显示副标题文字。',
|
|
90
|
+
examples: ['subtitle(@a, "Fight!");'],
|
|
91
|
+
compilesTo: 'title <target> subtitle {"text":"<message>"}',
|
|
92
|
+
category: 'chat',
|
|
93
|
+
},
|
|
94
|
+
actionbar: {
|
|
95
|
+
name: 'actionbar',
|
|
96
|
+
params: [
|
|
97
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player(s)', docZh: '目标玩家' },
|
|
98
|
+
{ name: 'message', type: 'string', required: true, doc: 'Action bar text (above hotbar)', docZh: '动作栏文字(快捷栏上方)' },
|
|
99
|
+
],
|
|
100
|
+
returns: 'void',
|
|
101
|
+
doc: 'Displays text in the action bar (above the hotbar).',
|
|
102
|
+
docZh: '在动作栏(快捷栏上方)显示文字。',
|
|
103
|
+
examples: ['actionbar(@a, "⏱ ${time}s remaining");'],
|
|
104
|
+
compilesTo: 'title <target> actionbar {"text":"<message>"}',
|
|
105
|
+
category: 'chat',
|
|
106
|
+
},
|
|
107
|
+
title_times: {
|
|
108
|
+
name: 'title_times',
|
|
109
|
+
params: [
|
|
110
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player(s)', docZh: '目标玩家' },
|
|
111
|
+
{ name: 'fadeIn', type: 'int', required: true, doc: 'Fade-in duration in ticks', docZh: '淡入时长(tick)' },
|
|
112
|
+
{ name: 'stay', type: 'int', required: true, doc: 'Stay duration in ticks', docZh: '停留时长(tick)' },
|
|
113
|
+
{ name: 'fadeOut', type: 'int', required: true, doc: 'Fade-out duration in ticks', docZh: '淡出时长(tick)' },
|
|
114
|
+
],
|
|
115
|
+
returns: 'void',
|
|
116
|
+
doc: 'Sets title display timing in ticks. 20 ticks = 1 second.',
|
|
117
|
+
docZh: '设置标题显示时间(以 tick 为单位),20 tick = 1 秒。',
|
|
118
|
+
examples: ['title_times(@a, 10, 40, 10);', '// Show for 2 seconds\ntitle_times(@a, 5, 40, 5);'],
|
|
119
|
+
compilesTo: 'title <target> times <fadeIn> <stay> <fadeOut>',
|
|
120
|
+
category: 'chat',
|
|
121
|
+
},
|
|
122
|
+
// -------------------------------------------------------------------------
|
|
123
|
+
// Player
|
|
124
|
+
// -------------------------------------------------------------------------
|
|
125
|
+
give: {
|
|
126
|
+
name: 'give',
|
|
127
|
+
params: [
|
|
128
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player(s)', docZh: '目标玩家' },
|
|
129
|
+
{ name: 'item', type: 'item', required: true, doc: 'Item ID (e.g. "minecraft:diamond")', docZh: '物品 ID(如 "minecraft:diamond")' },
|
|
130
|
+
{ name: 'count', type: 'int', required: false, default: '1', doc: 'Number of items to give', docZh: '给予物品数量' },
|
|
131
|
+
{ name: 'nbt', type: 'nbt', required: false, doc: 'Optional NBT data for the item', docZh: '可选的 NBT 数据' },
|
|
132
|
+
],
|
|
133
|
+
returns: 'void',
|
|
134
|
+
doc: 'Gives item(s) to a player.',
|
|
135
|
+
docZh: '给予玩家物品。',
|
|
136
|
+
examples: [
|
|
137
|
+
'give(@s, "minecraft:diamond", 5);',
|
|
138
|
+
'give(@a, "minecraft:apple");',
|
|
139
|
+
'give(@s, "minecraft:diamond_sword", 1, "{Enchantments:[{id:\\"minecraft:sharpness\\",lvl:5s}]}");',
|
|
140
|
+
],
|
|
141
|
+
compilesTo: 'give <target> <item>[nbt] [count]',
|
|
142
|
+
category: 'player',
|
|
143
|
+
},
|
|
144
|
+
kill: {
|
|
145
|
+
name: 'kill',
|
|
146
|
+
params: [
|
|
147
|
+
{ name: 'target', type: 'selector', required: false, default: '@s', doc: 'Target to kill (default: @s)', docZh: '击杀目标(默认:@s)' },
|
|
148
|
+
],
|
|
149
|
+
returns: 'void',
|
|
150
|
+
doc: 'Kills the target entity. Defaults to the executing entity (@s).',
|
|
151
|
+
docZh: '击杀目标实体,默认击杀当前执行实体(@s)。',
|
|
152
|
+
examples: ['kill(@e[type=minecraft:zombie]);', 'kill(@s);', 'kill(@e[tag=enemy]);'],
|
|
153
|
+
compilesTo: 'kill [target]',
|
|
154
|
+
category: 'player',
|
|
155
|
+
},
|
|
156
|
+
effect: {
|
|
157
|
+
name: 'effect',
|
|
158
|
+
params: [
|
|
159
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target entity or player', docZh: '目标实体或玩家' },
|
|
160
|
+
{ name: 'effect', type: 'effect', required: true, doc: 'Effect ID (e.g. "minecraft:speed")', docZh: '药水效果 ID(如 "minecraft:speed")' },
|
|
161
|
+
{ name: 'duration', type: 'int', required: false, default: '30', doc: 'Duration in seconds', docZh: '持续时间(秒)' },
|
|
162
|
+
{ name: 'amplifier', type: 'int', required: false, default: '0', doc: 'Effect level (0-255, where 0 = level 1)', docZh: '效果等级(0-255,0 代表等级 1)' },
|
|
163
|
+
],
|
|
164
|
+
returns: 'void',
|
|
165
|
+
doc: 'Applies a status effect to an entity.',
|
|
166
|
+
docZh: '为实体应用药水状态效果。',
|
|
167
|
+
examples: [
|
|
168
|
+
'effect(@s, "minecraft:speed", 60, 1);',
|
|
169
|
+
'effect(@a, "minecraft:regeneration", 10);',
|
|
170
|
+
'effect(@e[type=minecraft:zombie], "minecraft:slowness", 20, 2);',
|
|
171
|
+
],
|
|
172
|
+
compilesTo: 'effect give <target> <effect> [duration] [amplifier]',
|
|
173
|
+
category: 'player',
|
|
174
|
+
},
|
|
175
|
+
effect_clear: {
|
|
176
|
+
name: 'effect_clear',
|
|
177
|
+
params: [
|
|
178
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target entity or player', docZh: '目标实体或玩家' },
|
|
179
|
+
{ name: 'effect', type: 'effect', required: false, doc: 'Effect to remove (omit to clear all)', docZh: '要清除的效果(省略则清除所有)' },
|
|
180
|
+
],
|
|
181
|
+
returns: 'void',
|
|
182
|
+
doc: 'Removes a status effect from an entity, or clears all effects.',
|
|
183
|
+
docZh: '移除实体的药水效果,省略 effect 参数则清除所有效果。',
|
|
184
|
+
examples: ['effect_clear(@s, "minecraft:poison");', 'effect_clear(@a);'],
|
|
185
|
+
compilesTo: 'effect clear <target> [effect]',
|
|
186
|
+
category: 'player',
|
|
187
|
+
},
|
|
188
|
+
clear: {
|
|
189
|
+
name: 'clear',
|
|
190
|
+
params: [
|
|
191
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player', docZh: '目标玩家' },
|
|
192
|
+
{ name: 'item', type: 'item', required: false, doc: 'Specific item to remove (omit to clear all)', docZh: '要清除的物品(省略则清除所有)' },
|
|
193
|
+
],
|
|
194
|
+
returns: 'void',
|
|
195
|
+
doc: 'Removes items from a player\'s inventory.',
|
|
196
|
+
docZh: '清除玩家背包中的物品。',
|
|
197
|
+
examples: ['clear(@s, "minecraft:dirt");', 'clear(@a);'],
|
|
198
|
+
compilesTo: 'clear <target> [item]',
|
|
199
|
+
category: 'player',
|
|
200
|
+
},
|
|
201
|
+
kick: {
|
|
202
|
+
name: 'kick',
|
|
203
|
+
params: [
|
|
204
|
+
{ name: 'player', type: 'selector', required: true, doc: 'Target player to kick', docZh: '要踢出的玩家' },
|
|
205
|
+
{ name: 'reason', type: 'string', required: false, doc: 'Kick message shown to the player', docZh: '踢出原因(显示给玩家)' },
|
|
206
|
+
],
|
|
207
|
+
returns: 'void',
|
|
208
|
+
doc: 'Kicks a player from the server with an optional reason.',
|
|
209
|
+
docZh: '将玩家踢出服务器,可附加原因。',
|
|
210
|
+
examples: ['kick(@s, "You lost!");', 'kick(@p, "AFK too long");'],
|
|
211
|
+
compilesTo: 'kick <player> [reason]',
|
|
212
|
+
category: 'player',
|
|
213
|
+
},
|
|
214
|
+
xp_add: {
|
|
215
|
+
name: 'xp_add',
|
|
216
|
+
params: [
|
|
217
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player', docZh: '目标玩家' },
|
|
218
|
+
{ name: 'amount', type: 'int', required: true, doc: 'Amount of XP to add', docZh: '增加的经验值数量' },
|
|
219
|
+
{ name: 'type', type: 'string', required: false, default: 'points', doc: '"points" or "levels"', docZh: '"points"(经验点)或 "levels"(等级)' },
|
|
220
|
+
],
|
|
221
|
+
returns: 'void',
|
|
222
|
+
doc: 'Adds experience points or levels to a player.',
|
|
223
|
+
docZh: '给玩家增加经验点或等级。',
|
|
224
|
+
examples: ['xp_add(@s, 100);', 'xp_add(@s, 5, "levels");'],
|
|
225
|
+
compilesTo: 'xp add <target> <amount> [type]',
|
|
226
|
+
category: 'player',
|
|
227
|
+
},
|
|
228
|
+
xp_set: {
|
|
229
|
+
name: 'xp_set',
|
|
230
|
+
params: [
|
|
231
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player', docZh: '目标玩家' },
|
|
232
|
+
{ name: 'amount', type: 'int', required: true, doc: 'New XP value', docZh: '新的经验值' },
|
|
233
|
+
{ name: 'type', type: 'string', required: false, default: 'points', doc: '"points" or "levels"', docZh: '"points"(经验点)或 "levels"(等级)' },
|
|
234
|
+
],
|
|
235
|
+
returns: 'void',
|
|
236
|
+
doc: 'Sets a player\'s experience points or levels.',
|
|
237
|
+
docZh: '设置玩家的经验点或等级。',
|
|
238
|
+
examples: ['xp_set(@s, 0, "levels");', 'xp_set(@s, 500);'],
|
|
239
|
+
compilesTo: 'xp set <target> <amount> [type]',
|
|
240
|
+
category: 'player',
|
|
241
|
+
},
|
|
242
|
+
// -------------------------------------------------------------------------
|
|
243
|
+
// Teleport
|
|
244
|
+
// -------------------------------------------------------------------------
|
|
245
|
+
tp: {
|
|
246
|
+
name: 'tp',
|
|
247
|
+
params: [
|
|
248
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Entity to teleport', docZh: '要传送的实体' },
|
|
249
|
+
{ name: 'destination', type: 'selector', required: true, doc: 'Target player or BlockPos coordinates', docZh: '目标玩家或方块坐标' },
|
|
250
|
+
],
|
|
251
|
+
returns: 'void',
|
|
252
|
+
doc: 'Teleports an entity to a player or position.',
|
|
253
|
+
docZh: '将实体传送到指定玩家或坐标。',
|
|
254
|
+
examples: ['tp(@s, (0, 64, 0));', 'tp(@a, @s);', 'tp(@s, (~0, ~10, ~0));'],
|
|
255
|
+
compilesTo: 'tp <target> <destination>',
|
|
256
|
+
category: 'world',
|
|
257
|
+
},
|
|
258
|
+
tp_to: {
|
|
259
|
+
name: 'tp_to',
|
|
260
|
+
params: [
|
|
261
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Entity to teleport', docZh: '要传送的实体' },
|
|
262
|
+
{ name: 'destination', type: 'selector', required: true, doc: 'Target player or position', docZh: '目标玩家或位置' },
|
|
263
|
+
],
|
|
264
|
+
returns: 'void',
|
|
265
|
+
doc: '@deprecated Use tp() instead. Teleports an entity to a position.',
|
|
266
|
+
docZh: '@deprecated 请使用 tp()。将实体传送到指定位置。',
|
|
267
|
+
examples: ['tp(@s, (0, 64, 0)); // use tp instead'],
|
|
268
|
+
compilesTo: 'tp <target> <destination>',
|
|
269
|
+
category: 'world',
|
|
270
|
+
},
|
|
271
|
+
// -------------------------------------------------------------------------
|
|
272
|
+
// World & Block
|
|
273
|
+
// -------------------------------------------------------------------------
|
|
274
|
+
setblock: {
|
|
275
|
+
name: 'setblock',
|
|
276
|
+
params: [
|
|
277
|
+
{ name: 'pos', type: 'BlockPos', required: true, doc: 'Block position, e.g. (0, 64, 0) or (~1, ~0, ~0)', docZh: '方块坐标,例如 (0, 64, 0) 或 (~1, ~0, ~0)' },
|
|
278
|
+
{ name: 'block', type: 'block', required: true, doc: 'Block ID (e.g. "minecraft:stone")', docZh: '方块 ID(如 "minecraft:stone")' },
|
|
279
|
+
],
|
|
280
|
+
returns: 'void',
|
|
281
|
+
doc: 'Places a block at the specified coordinates.',
|
|
282
|
+
docZh: '在指定坐标放置方块。',
|
|
283
|
+
examples: ['setblock((0, 64, 0), "minecraft:stone");', 'setblock((~1, ~0, ~0), "minecraft:air");'],
|
|
284
|
+
compilesTo: 'setblock <x> <y> <z> <block>',
|
|
285
|
+
category: 'world',
|
|
286
|
+
},
|
|
287
|
+
fill: {
|
|
288
|
+
name: 'fill',
|
|
289
|
+
params: [
|
|
290
|
+
{ name: 'from', type: 'BlockPos', required: true, doc: 'Start corner of the region', docZh: '区域起始角落' },
|
|
291
|
+
{ name: 'to', type: 'BlockPos', required: true, doc: 'End corner of the region', docZh: '区域结束角落' },
|
|
292
|
+
{ name: 'block', type: 'block', required: true, doc: 'Block to fill with', docZh: '用于填充的方块' },
|
|
293
|
+
],
|
|
294
|
+
returns: 'void',
|
|
295
|
+
doc: 'Fills a cuboid region with a specified block.',
|
|
296
|
+
docZh: '用指定方块填充一个立方体区域。',
|
|
297
|
+
examples: [
|
|
298
|
+
'fill((0, 64, 0), (10, 64, 10), "minecraft:grass_block");',
|
|
299
|
+
'fill((~-5, ~-1, ~-5), (~5, ~-1, ~5), "minecraft:bedrock");',
|
|
300
|
+
],
|
|
301
|
+
compilesTo: 'fill <x1> <y1> <z1> <x2> <y2> <z2> <block>',
|
|
302
|
+
category: 'world',
|
|
303
|
+
},
|
|
304
|
+
clone: {
|
|
305
|
+
name: 'clone',
|
|
306
|
+
params: [
|
|
307
|
+
{ name: 'from', type: 'BlockPos', required: true, doc: 'Source region start corner', docZh: '源区域起始角落' },
|
|
308
|
+
{ name: 'to', type: 'BlockPos', required: true, doc: 'Source region end corner', docZh: '源区域结束角落' },
|
|
309
|
+
{ name: 'dest', type: 'BlockPos', required: true, doc: 'Destination corner', docZh: '目标角落' },
|
|
310
|
+
],
|
|
311
|
+
returns: 'void',
|
|
312
|
+
doc: 'Clones a region of blocks to a new location.',
|
|
313
|
+
docZh: '将一个区域的方块复制到新的位置。',
|
|
314
|
+
examples: ['clone((0,64,0), (10,64,10), (20,64,0));'],
|
|
315
|
+
compilesTo: 'clone <x1> <y1> <z1> <x2> <y2> <z2> <dx> <dy> <dz>',
|
|
316
|
+
category: 'world',
|
|
317
|
+
},
|
|
318
|
+
summon: {
|
|
319
|
+
name: 'summon',
|
|
320
|
+
params: [
|
|
321
|
+
{ name: 'type', type: 'entity', required: true, doc: 'Entity type ID (e.g. "minecraft:zombie")', docZh: '实体类型 ID(如 "minecraft:zombie")' },
|
|
322
|
+
{ name: 'x', type: 'coord', required: false, default: '~', doc: 'X coordinate (default: ~)', docZh: 'X 坐标(默认:~)' },
|
|
323
|
+
{ name: 'y', type: 'coord', required: false, default: '~', doc: 'Y coordinate (default: ~)', docZh: 'Y 坐标(默认:~)' },
|
|
324
|
+
{ name: 'z', type: 'coord', required: false, default: '~', doc: 'Z coordinate (default: ~)', docZh: 'Z 坐标(默认:~)' },
|
|
325
|
+
{ name: 'nbt', type: 'nbt', required: false, doc: 'Optional NBT data for the entity', docZh: '可选的实体 NBT 数据' },
|
|
326
|
+
],
|
|
327
|
+
returns: 'void',
|
|
328
|
+
doc: 'Summons an entity at the specified position.',
|
|
329
|
+
docZh: '在指定位置生成实体。',
|
|
330
|
+
examples: [
|
|
331
|
+
'summon("minecraft:zombie", ~0, ~0, ~0);',
|
|
332
|
+
'summon("minecraft:armor_stand", (0, 64, 0));',
|
|
333
|
+
'summon("minecraft:zombie", ~0, ~0, ~0, "{CustomName:\\"Boss\\"}");',
|
|
334
|
+
],
|
|
335
|
+
compilesTo: 'summon <type> <x> <y> <z> [nbt]',
|
|
336
|
+
category: 'world',
|
|
337
|
+
},
|
|
338
|
+
particle: {
|
|
339
|
+
name: 'particle',
|
|
340
|
+
params: [
|
|
341
|
+
{ name: 'name', type: 'string', required: true, doc: 'Particle type ID (e.g. "minecraft:flame")', docZh: '粒子类型 ID(如 "minecraft:flame")' },
|
|
342
|
+
{ name: 'x', type: 'coord', required: false, default: '~', doc: 'X coordinate', docZh: 'X 坐标' },
|
|
343
|
+
{ name: 'y', type: 'coord', required: false, default: '~', doc: 'Y coordinate', docZh: 'Y 坐标' },
|
|
344
|
+
{ name: 'z', type: 'coord', required: false, default: '~', doc: 'Z coordinate', docZh: 'Z 坐标' },
|
|
345
|
+
],
|
|
346
|
+
returns: 'void',
|
|
347
|
+
doc: 'Spawns a particle effect at the specified position.',
|
|
348
|
+
docZh: '在指定位置生成粒子效果。',
|
|
349
|
+
examples: ['particle("minecraft:flame", (~0, ~1, ~0));', 'particle("minecraft:explosion", (0, 100, 0));'],
|
|
350
|
+
compilesTo: 'particle <name> <x> <y> <z>',
|
|
351
|
+
category: 'world',
|
|
352
|
+
},
|
|
353
|
+
playsound: {
|
|
354
|
+
name: 'playsound',
|
|
355
|
+
params: [
|
|
356
|
+
{ name: 'sound', type: 'sound', required: true, doc: 'Sound event ID (e.g. "entity.experience_orb.pickup")', docZh: '音效事件 ID(如 "entity.experience_orb.pickup")' },
|
|
357
|
+
{ name: 'source', type: 'string', required: true, doc: 'Sound category: "master", "music", "record", "weather", "block", "hostile", "neutral", "player", "ambient", "voice"', docZh: '音效分类:master/music/record/weather/block/hostile/neutral/player/ambient/voice' },
|
|
358
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target player to hear the sound', docZh: '接收音效的目标玩家' },
|
|
359
|
+
{ name: 'x', type: 'coord', required: false, doc: 'X origin position', docZh: 'X 起源坐标' },
|
|
360
|
+
{ name: 'y', type: 'coord', required: false, doc: 'Y origin position', docZh: 'Y 起源坐标' },
|
|
361
|
+
{ name: 'z', type: 'coord', required: false, doc: 'Z origin position', docZh: 'Z 起源坐标' },
|
|
362
|
+
{ name: 'volume', type: 'float', required: false, default: '1.0', doc: 'Volume (default: 1.0)', docZh: '音量(默认:1.0)' },
|
|
363
|
+
{ name: 'pitch', type: 'float', required: false, default: '1.0', doc: 'Pitch (default: 1.0)', docZh: '音调(默认:1.0)' },
|
|
364
|
+
{ name: 'minVolume', type: 'float', required: false, doc: 'Minimum volume for distant players', docZh: '远处玩家的最小音量' },
|
|
365
|
+
],
|
|
366
|
+
returns: 'void',
|
|
367
|
+
doc: 'Plays a sound effect for target players.',
|
|
368
|
+
docZh: '为目标玩家播放音效。',
|
|
369
|
+
examples: [
|
|
370
|
+
'playsound("entity.experience_orb.pickup", "player", @s);',
|
|
371
|
+
'playsound("ui.toast.challenge_complete", "master", @a);',
|
|
372
|
+
],
|
|
373
|
+
compilesTo: 'playsound <sound> <source> <target> [x] [y] [z] [volume] [pitch] [minVolume]',
|
|
374
|
+
category: 'world',
|
|
375
|
+
},
|
|
376
|
+
weather: {
|
|
377
|
+
name: 'weather',
|
|
378
|
+
params: [
|
|
379
|
+
{ name: 'type', type: 'string', required: true, doc: '"clear", "rain", or "thunder"', docZh: '"clear"(晴天)、"rain"(下雨)或 "thunder"(雷暴)' },
|
|
380
|
+
],
|
|
381
|
+
returns: 'void',
|
|
382
|
+
doc: 'Sets the weather condition.',
|
|
383
|
+
docZh: '设置天气状态。',
|
|
384
|
+
examples: ['weather("clear");', 'weather("thunder");'],
|
|
385
|
+
compilesTo: 'weather <type>',
|
|
386
|
+
category: 'world',
|
|
387
|
+
},
|
|
388
|
+
time_set: {
|
|
389
|
+
name: 'time_set',
|
|
390
|
+
params: [
|
|
391
|
+
{ name: 'value', type: 'string', required: true, doc: 'Time in ticks, or "day"/"night"/"noon"/"midnight"', docZh: '时间(tick)或 "day"/"night"/"noon"/"midnight"' },
|
|
392
|
+
],
|
|
393
|
+
returns: 'void',
|
|
394
|
+
doc: 'Sets the world time.',
|
|
395
|
+
docZh: '设置世界时间。',
|
|
396
|
+
examples: ['time_set(0); // dawn\ntime_set("noon");', 'time_set("midnight");'],
|
|
397
|
+
compilesTo: 'time set <value>',
|
|
398
|
+
category: 'world',
|
|
399
|
+
},
|
|
400
|
+
time_add: {
|
|
401
|
+
name: 'time_add',
|
|
402
|
+
params: [
|
|
403
|
+
{ name: 'ticks', type: 'int', required: true, doc: 'Number of ticks to advance', docZh: '推进的 tick 数' },
|
|
404
|
+
],
|
|
405
|
+
returns: 'void',
|
|
406
|
+
doc: 'Advances the world time by a number of ticks.',
|
|
407
|
+
docZh: '将世界时间推进指定的 tick 数。',
|
|
408
|
+
examples: ['time_add(6000); // advance by half a day'],
|
|
409
|
+
compilesTo: 'time add <ticks>',
|
|
410
|
+
category: 'world',
|
|
411
|
+
},
|
|
412
|
+
gamerule: {
|
|
413
|
+
name: 'gamerule',
|
|
414
|
+
params: [
|
|
415
|
+
{ name: 'rule', type: 'string', required: true, doc: 'Gamerule name (e.g. "keepInventory")', docZh: '游戏规则名称(如 "keepInventory")' },
|
|
416
|
+
{ name: 'value', type: 'string', required: true, doc: 'New value (true/false for boolean rules, integer for numeric)', docZh: '新值(布尔规则为 true/false,数值规则为整数)' },
|
|
417
|
+
],
|
|
418
|
+
returns: 'void',
|
|
419
|
+
doc: 'Sets a gamerule value.',
|
|
420
|
+
docZh: '设置游戏规则的值。',
|
|
421
|
+
examples: ['gamerule("keepInventory", true);', 'gamerule("randomTickSpeed", 3);'],
|
|
422
|
+
compilesTo: 'gamerule <rule> <value>',
|
|
423
|
+
category: 'world',
|
|
424
|
+
},
|
|
425
|
+
difficulty: {
|
|
426
|
+
name: 'difficulty',
|
|
427
|
+
params: [
|
|
428
|
+
{ name: 'level', type: 'string', required: true, doc: '"peaceful", "easy", "normal", or "hard"', docZh: '"peaceful"(和平)、"easy"(简单)、"normal"(普通)或 "hard"(困难)' },
|
|
429
|
+
],
|
|
430
|
+
returns: 'void',
|
|
431
|
+
doc: 'Sets the game difficulty.',
|
|
432
|
+
docZh: '设置游戏难度。',
|
|
433
|
+
examples: ['difficulty("hard");', 'difficulty("peaceful");'],
|
|
434
|
+
compilesTo: 'difficulty <level>',
|
|
435
|
+
category: 'world',
|
|
436
|
+
},
|
|
437
|
+
// -------------------------------------------------------------------------
|
|
438
|
+
// Tags
|
|
439
|
+
// -------------------------------------------------------------------------
|
|
440
|
+
tag_add: {
|
|
441
|
+
name: 'tag_add',
|
|
442
|
+
params: [
|
|
443
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target entity', docZh: '目标实体' },
|
|
444
|
+
{ name: 'tag', type: 'string', required: true, doc: 'Tag name to add', docZh: '要添加的标签名' },
|
|
445
|
+
],
|
|
446
|
+
returns: 'void',
|
|
447
|
+
doc: 'Adds a scoreboard tag to an entity.',
|
|
448
|
+
docZh: '为实体添加计分板标签。',
|
|
449
|
+
examples: ['tag_add(@s, "hasKey");', 'tag_add(@e[type=minecraft:zombie], "boss");'],
|
|
450
|
+
compilesTo: 'tag <target> add <tag>',
|
|
451
|
+
category: 'entities',
|
|
452
|
+
},
|
|
453
|
+
tag_remove: {
|
|
454
|
+
name: 'tag_remove',
|
|
455
|
+
params: [
|
|
456
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target entity', docZh: '目标实体' },
|
|
457
|
+
{ name: 'tag', type: 'string', required: true, doc: 'Tag name to remove', docZh: '要移除的标签名' },
|
|
458
|
+
],
|
|
459
|
+
returns: 'void',
|
|
460
|
+
doc: 'Removes a scoreboard tag from an entity.',
|
|
461
|
+
docZh: '从实体身上移除计分板标签。',
|
|
462
|
+
examples: ['tag_remove(@s, "hasKey");'],
|
|
463
|
+
compilesTo: 'tag <target> remove <tag>',
|
|
464
|
+
category: 'entities',
|
|
465
|
+
},
|
|
466
|
+
// -------------------------------------------------------------------------
|
|
467
|
+
// Scoreboard
|
|
468
|
+
// -------------------------------------------------------------------------
|
|
469
|
+
scoreboard_get: {
|
|
470
|
+
name: 'scoreboard_get',
|
|
471
|
+
params: [
|
|
472
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Player, entity, or fake player name (e.g. "#counter")', docZh: '玩家、实体或虚拟玩家名(如 "#counter")' },
|
|
473
|
+
{ name: 'objective', type: 'string', required: true, doc: 'Scoreboard objective name', docZh: '计分板目标名称' },
|
|
474
|
+
],
|
|
475
|
+
returns: 'int',
|
|
476
|
+
doc: 'Reads a value from a vanilla MC scoreboard objective.',
|
|
477
|
+
docZh: '从原版 MC 计分板目标读取数值。',
|
|
478
|
+
examples: ['let hp: int = scoreboard_get(@s, "health");', 'let kills: int = scoreboard_get(@s, "kills");'],
|
|
479
|
+
compilesTo: 'scoreboard players get <target> <objective>',
|
|
480
|
+
category: 'scoreboard',
|
|
481
|
+
},
|
|
482
|
+
score: {
|
|
483
|
+
name: 'score',
|
|
484
|
+
params: [
|
|
485
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Player, entity, or fake player name', docZh: '玩家、实体或虚拟玩家名' },
|
|
486
|
+
{ name: 'objective', type: 'string', required: true, doc: 'Scoreboard objective name', docZh: '计分板目标名称' },
|
|
487
|
+
],
|
|
488
|
+
returns: 'int',
|
|
489
|
+
doc: 'Alias for scoreboard_get(). Reads a value from a scoreboard.',
|
|
490
|
+
docZh: 'scoreboard_get() 的别名,从计分板读取数值。',
|
|
491
|
+
examples: ['let kills: int = score(@s, "kills");'],
|
|
492
|
+
compilesTo: 'scoreboard players get <target> <objective>',
|
|
493
|
+
category: 'scoreboard',
|
|
494
|
+
},
|
|
495
|
+
scoreboard_set: {
|
|
496
|
+
name: 'scoreboard_set',
|
|
497
|
+
params: [
|
|
498
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Player, entity, or fake player', docZh: '玩家、实体或虚拟玩家' },
|
|
499
|
+
{ name: 'objective', type: 'string', required: true, doc: 'Objective name', docZh: '计分板目标名称' },
|
|
500
|
+
{ name: 'value', type: 'int', required: true, doc: 'New score value', docZh: '新的分数值' },
|
|
501
|
+
],
|
|
502
|
+
returns: 'void',
|
|
503
|
+
doc: 'Sets a value in a vanilla MC scoreboard objective.',
|
|
504
|
+
docZh: '设置原版 MC 计分板目标中的数值。',
|
|
505
|
+
examples: ['scoreboard_set("#game", "timer", 300);', 'scoreboard_set(@s, "lives", 3);'],
|
|
506
|
+
compilesTo: 'scoreboard players set <target> <objective> <value>',
|
|
507
|
+
category: 'scoreboard',
|
|
508
|
+
},
|
|
509
|
+
scoreboard_display: {
|
|
510
|
+
name: 'scoreboard_display',
|
|
511
|
+
params: [
|
|
512
|
+
{ name: 'slot', type: 'string', required: true, doc: '"list", "sidebar", or "belowName"', docZh: '"list"(列表)、"sidebar"(侧边栏)或 "belowName"(名字下方)' },
|
|
513
|
+
{ name: 'objective', type: 'string', required: true, doc: 'Objective name to display', docZh: '要显示的计分板目标名称' },
|
|
514
|
+
],
|
|
515
|
+
returns: 'void',
|
|
516
|
+
doc: 'Displays a scoreboard objective in a display slot.',
|
|
517
|
+
docZh: '在指定显示位置展示计分板目标。',
|
|
518
|
+
examples: ['scoreboard_display("sidebar", "kills");'],
|
|
519
|
+
compilesTo: 'scoreboard objectives setdisplay <slot> <objective>',
|
|
520
|
+
category: 'scoreboard',
|
|
521
|
+
},
|
|
522
|
+
scoreboard_hide: {
|
|
523
|
+
name: 'scoreboard_hide',
|
|
524
|
+
params: [
|
|
525
|
+
{ name: 'slot', type: 'string', required: true, doc: '"list", "sidebar", or "belowName"', docZh: '"list"、"sidebar" 或 "belowName"' },
|
|
526
|
+
],
|
|
527
|
+
returns: 'void',
|
|
528
|
+
doc: 'Clears the display in a scoreboard slot.',
|
|
529
|
+
docZh: '清除计分板显示位置的内容。',
|
|
530
|
+
examples: ['scoreboard_hide("sidebar");'],
|
|
531
|
+
compilesTo: 'scoreboard objectives setdisplay <slot>',
|
|
532
|
+
category: 'scoreboard',
|
|
533
|
+
},
|
|
534
|
+
scoreboard_add_objective: {
|
|
535
|
+
name: 'scoreboard_add_objective',
|
|
536
|
+
params: [
|
|
537
|
+
{ name: 'name', type: 'string', required: true, doc: 'Objective name', docZh: '目标名称' },
|
|
538
|
+
{ name: 'criteria', type: 'string', required: true, doc: 'Criteria (e.g. "dummy", "playerKillCount")', docZh: '标准类型(如 "dummy"、"playerKillCount")' },
|
|
539
|
+
{ name: 'displayName', type: 'string', required: false, doc: 'Optional display name', docZh: '可选的显示名称' },
|
|
540
|
+
],
|
|
541
|
+
returns: 'void',
|
|
542
|
+
doc: 'Creates a new scoreboard objective.',
|
|
543
|
+
docZh: '创建新的计分板目标。',
|
|
544
|
+
examples: ['scoreboard_add_objective("kills", "playerKillCount");', 'scoreboard_add_objective("timer", "dummy", "Game Timer");'],
|
|
545
|
+
compilesTo: 'scoreboard objectives add <name> <criteria> [displayName]',
|
|
546
|
+
category: 'scoreboard',
|
|
547
|
+
},
|
|
548
|
+
scoreboard_remove_objective: {
|
|
549
|
+
name: 'scoreboard_remove_objective',
|
|
550
|
+
params: [
|
|
551
|
+
{ name: 'name', type: 'string', required: true, doc: 'Objective name to remove', docZh: '要删除的目标名称' },
|
|
552
|
+
],
|
|
553
|
+
returns: 'void',
|
|
554
|
+
doc: 'Removes a scoreboard objective.',
|
|
555
|
+
docZh: '删除计分板目标。',
|
|
556
|
+
examples: ['scoreboard_remove_objective("kills");'],
|
|
557
|
+
compilesTo: 'scoreboard objectives remove <name>',
|
|
558
|
+
category: 'scoreboard',
|
|
559
|
+
},
|
|
560
|
+
// -------------------------------------------------------------------------
|
|
561
|
+
// Random
|
|
562
|
+
// -------------------------------------------------------------------------
|
|
563
|
+
random: {
|
|
564
|
+
name: 'random',
|
|
565
|
+
params: [
|
|
566
|
+
{ name: 'min', type: 'int', required: true, doc: 'Minimum value (inclusive)', docZh: '最小值(包含)' },
|
|
567
|
+
{ name: 'max', type: 'int', required: true, doc: 'Maximum value (inclusive)', docZh: '最大值(包含)' },
|
|
568
|
+
],
|
|
569
|
+
returns: 'int',
|
|
570
|
+
doc: 'Generates a random integer in range [min, max] using scoreboard arithmetic. Compatible with all MC versions.',
|
|
571
|
+
docZh: '使用计分板运算生成 [min, max] 范围内的随机整数,兼容所有 MC 版本。',
|
|
572
|
+
examples: ['let roll: int = random(1, 6);', 'let chance: int = random(0, 99);'],
|
|
573
|
+
compilesTo: 'scoreboard players random <dst> rs <min> <max>',
|
|
574
|
+
category: 'random',
|
|
575
|
+
},
|
|
576
|
+
random_native: {
|
|
577
|
+
name: 'random_native',
|
|
578
|
+
params: [
|
|
579
|
+
{ name: 'min', type: 'int', required: true, doc: 'Minimum value (inclusive)', docZh: '最小值(包含)' },
|
|
580
|
+
{ name: 'max', type: 'int', required: true, doc: 'Maximum value (inclusive)', docZh: '最大值(包含)' },
|
|
581
|
+
],
|
|
582
|
+
returns: 'int',
|
|
583
|
+
doc: 'Generates a random integer using /random command (MC 1.20.3+). Faster and more reliable than random().',
|
|
584
|
+
docZh: '使用 /random 命令(MC 1.20.3+)生成随机整数,比 random() 更快更可靠。',
|
|
585
|
+
examples: ['let n: int = random_native(1, 100);'],
|
|
586
|
+
compilesTo: 'execute store result score <dst> rs run random value <min> <max>',
|
|
587
|
+
category: 'random',
|
|
588
|
+
},
|
|
589
|
+
random_sequence: {
|
|
590
|
+
name: 'random_sequence',
|
|
591
|
+
params: [
|
|
592
|
+
{ name: 'sequence', type: 'string', required: true, doc: 'Sequence name (namespaced, e.g. "mypack:loot")', docZh: '序列名称(带命名空间,如 "mypack:loot")' },
|
|
593
|
+
{ name: 'seed', type: 'int', required: false, default: '0', doc: 'Seed value', docZh: '种子值' },
|
|
594
|
+
],
|
|
595
|
+
returns: 'void',
|
|
596
|
+
doc: 'Resets a random sequence with an optional seed (MC 1.20.3+).',
|
|
597
|
+
docZh: '重置随机序列,可指定种子(MC 1.20.3+)。',
|
|
598
|
+
examples: ['random_sequence("mypack:loot", 42);'],
|
|
599
|
+
compilesTo: 'random reset <sequence> <seed>',
|
|
600
|
+
category: 'random',
|
|
601
|
+
},
|
|
602
|
+
// -------------------------------------------------------------------------
|
|
603
|
+
// Data (NBT)
|
|
604
|
+
// -------------------------------------------------------------------------
|
|
605
|
+
data_get: {
|
|
606
|
+
name: 'data_get',
|
|
607
|
+
params: [
|
|
608
|
+
{ name: 'targetType', type: 'string', required: true, doc: '"entity", "block", or "storage"', docZh: '"entity"(实体)、"block"(方块)或 "storage"(存储)' },
|
|
609
|
+
{ name: 'target', type: 'string', required: true, doc: 'Target selector or storage path', docZh: '目标选择器或存储路径' },
|
|
610
|
+
{ name: 'path', type: 'string', required: true, doc: 'NBT path (e.g. "Health")', docZh: 'NBT 路径(如 "Health")' },
|
|
611
|
+
{ name: 'scale', type: 'float', required: false, default: '1', doc: 'Scale factor', docZh: '缩放因子' },
|
|
612
|
+
],
|
|
613
|
+
returns: 'int',
|
|
614
|
+
doc: 'Reads NBT data from an entity, block, or storage into an integer variable.',
|
|
615
|
+
docZh: '从实体、方块或存储读取 NBT 数据到整型变量。',
|
|
616
|
+
examples: [
|
|
617
|
+
'let hp: int = data_get("entity", "@s", "Health");',
|
|
618
|
+
'let val: int = data_get("storage", "mypack:data", "myKey");',
|
|
619
|
+
],
|
|
620
|
+
compilesTo: 'execute store result score <dst> rs run data get <targetType> <target> <path> [scale]',
|
|
621
|
+
category: 'data',
|
|
622
|
+
},
|
|
623
|
+
data_merge: {
|
|
624
|
+
name: 'data_merge',
|
|
625
|
+
params: [
|
|
626
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Target entity selector or block position', docZh: '目标实体选择器或方块坐标' },
|
|
627
|
+
{ name: 'nbt', type: 'nbt', required: true, doc: 'NBT data to merge (struct literal or string)', docZh: '要合并的 NBT 数据(结构体字面量或字符串)' },
|
|
628
|
+
],
|
|
629
|
+
returns: 'void',
|
|
630
|
+
doc: 'Merges NBT data into an entity, block, or storage.',
|
|
631
|
+
docZh: '将 NBT 数据合并到实体、方块或存储中。',
|
|
632
|
+
examples: ['data_merge(@s, { Invisible: 1b, Silent: 1b });'],
|
|
633
|
+
compilesTo: 'data merge entity/block/storage <target> <nbt>',
|
|
634
|
+
category: 'data',
|
|
635
|
+
},
|
|
636
|
+
// -------------------------------------------------------------------------
|
|
637
|
+
// Bossbar
|
|
638
|
+
// -------------------------------------------------------------------------
|
|
639
|
+
bossbar_add: {
|
|
640
|
+
name: 'bossbar_add',
|
|
641
|
+
params: [
|
|
642
|
+
{ name: 'id', type: 'string', required: true, doc: 'Boss bar ID (namespaced, e.g. "minecraft:health")', docZh: '血条 ID(带命名空间,如 "minecraft:health")' },
|
|
643
|
+
{ name: 'name', type: 'string', required: true, doc: 'Display name', docZh: '显示名称' },
|
|
644
|
+
],
|
|
645
|
+
returns: 'void',
|
|
646
|
+
doc: 'Creates a new boss bar.',
|
|
647
|
+
docZh: '创建新的 Boss 血条。',
|
|
648
|
+
examples: ['bossbar_add("mymod:timer", "Time Left");'],
|
|
649
|
+
compilesTo: 'bossbar add <id> {"text":"<name>"}',
|
|
650
|
+
category: 'bossbar',
|
|
651
|
+
},
|
|
652
|
+
bossbar_set_value: {
|
|
653
|
+
name: 'bossbar_set_value',
|
|
654
|
+
params: [
|
|
655
|
+
{ name: 'id', type: 'string', required: true, doc: 'Boss bar ID', docZh: '血条 ID' },
|
|
656
|
+
{ name: 'value', type: 'int', required: true, doc: 'Current value', docZh: '当前值' },
|
|
657
|
+
],
|
|
658
|
+
returns: 'void',
|
|
659
|
+
doc: 'Sets the current value of a boss bar.',
|
|
660
|
+
docZh: '设置 Boss 血条的当前值。',
|
|
661
|
+
examples: ['bossbar_set_value("mymod:timer", 60);'],
|
|
662
|
+
compilesTo: 'bossbar set <id> value <value>',
|
|
663
|
+
category: 'bossbar',
|
|
664
|
+
},
|
|
665
|
+
bossbar_set_max: {
|
|
666
|
+
name: 'bossbar_set_max',
|
|
667
|
+
params: [
|
|
668
|
+
{ name: 'id', type: 'string', required: true, doc: 'Boss bar ID', docZh: '血条 ID' },
|
|
669
|
+
{ name: 'max', type: 'int', required: true, doc: 'Maximum value', docZh: '最大值' },
|
|
670
|
+
],
|
|
671
|
+
returns: 'void',
|
|
672
|
+
doc: 'Sets the maximum value of a boss bar.',
|
|
673
|
+
docZh: '设置 Boss 血条的最大值。',
|
|
674
|
+
examples: ['bossbar_set_max("mymod:timer", 300);'],
|
|
675
|
+
compilesTo: 'bossbar set <id> max <max>',
|
|
676
|
+
category: 'bossbar',
|
|
677
|
+
},
|
|
678
|
+
bossbar_set_color: {
|
|
679
|
+
name: 'bossbar_set_color',
|
|
680
|
+
params: [
|
|
681
|
+
{ name: 'id', type: 'string', required: true, doc: 'Boss bar ID', docZh: '血条 ID' },
|
|
682
|
+
{ name: 'color', type: 'string', required: true, doc: '"blue", "green", "pink", "purple", "red", "white", or "yellow"', docZh: '"blue"/"green"/"pink"/"purple"/"red"/"white"/"yellow"' },
|
|
683
|
+
],
|
|
684
|
+
returns: 'void',
|
|
685
|
+
doc: 'Sets the color of a boss bar.',
|
|
686
|
+
docZh: '设置 Boss 血条的颜色。',
|
|
687
|
+
examples: ['bossbar_set_color("mymod:timer", "red");'],
|
|
688
|
+
compilesTo: 'bossbar set <id> color <color>',
|
|
689
|
+
category: 'bossbar',
|
|
690
|
+
},
|
|
691
|
+
bossbar_set_style: {
|
|
692
|
+
name: 'bossbar_set_style',
|
|
693
|
+
params: [
|
|
694
|
+
{ name: 'id', type: 'string', required: true, doc: 'Boss bar segmentation style', docZh: '血条分段样式' },
|
|
695
|
+
{ name: 'style', type: 'string', required: true, doc: '"notched_6", "notched_10", "notched_12", "notched_20", or "progress"', docZh: '"notched_6"/"notched_10"/"notched_12"/"notched_20"/"progress"' },
|
|
696
|
+
],
|
|
697
|
+
returns: 'void',
|
|
698
|
+
doc: 'Sets the style (segmentation) of a boss bar.',
|
|
699
|
+
docZh: '设置 Boss 血条的样式(分段方式)。',
|
|
700
|
+
examples: ['bossbar_set_style("mymod:timer", "notched_10");'],
|
|
701
|
+
compilesTo: 'bossbar set <id> style <style>',
|
|
702
|
+
category: 'bossbar',
|
|
703
|
+
},
|
|
704
|
+
bossbar_set_visible: {
|
|
705
|
+
name: 'bossbar_set_visible',
|
|
706
|
+
params: [
|
|
707
|
+
{ name: 'id', type: 'string', required: true, doc: 'Boss bar ID', docZh: '血条 ID' },
|
|
708
|
+
{ name: 'visible', type: 'bool', required: true, doc: 'Visibility state (true = show, false = hide)', docZh: '可见状态(true = 显示,false = 隐藏)' },
|
|
709
|
+
],
|
|
710
|
+
returns: 'void',
|
|
711
|
+
doc: 'Shows or hides a boss bar.',
|
|
712
|
+
docZh: '显示或隐藏 Boss 血条。',
|
|
713
|
+
examples: ['bossbar_set_visible("mymod:timer", true);'],
|
|
714
|
+
compilesTo: 'bossbar set <id> visible <visible>',
|
|
715
|
+
category: 'bossbar',
|
|
716
|
+
},
|
|
717
|
+
bossbar_set_players: {
|
|
718
|
+
name: 'bossbar_set_players',
|
|
719
|
+
params: [
|
|
720
|
+
{ name: 'id', type: 'string', required: true, doc: 'Boss bar ID', docZh: '血条 ID' },
|
|
721
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Players who should see the boss bar', docZh: '能看到血条的玩家' },
|
|
722
|
+
],
|
|
723
|
+
returns: 'void',
|
|
724
|
+
doc: 'Sets which players can see the boss bar.',
|
|
725
|
+
docZh: '设置哪些玩家能看到 Boss 血条。',
|
|
726
|
+
examples: ['bossbar_set_players("mymod:timer", @a);'],
|
|
727
|
+
compilesTo: 'bossbar set <id> players <target>',
|
|
728
|
+
category: 'bossbar',
|
|
729
|
+
},
|
|
730
|
+
bossbar_remove: {
|
|
731
|
+
name: 'bossbar_remove',
|
|
732
|
+
params: [
|
|
733
|
+
{ name: 'id', type: 'string', required: true, doc: 'Boss bar ID to remove', docZh: '要移除的血条 ID' },
|
|
734
|
+
],
|
|
735
|
+
returns: 'void',
|
|
736
|
+
doc: 'Removes a boss bar.',
|
|
737
|
+
docZh: '移除 Boss 血条。',
|
|
738
|
+
examples: ['bossbar_remove("mymod:timer");'],
|
|
739
|
+
compilesTo: 'bossbar remove <id>',
|
|
740
|
+
category: 'bossbar',
|
|
741
|
+
},
|
|
742
|
+
bossbar_get_value: {
|
|
743
|
+
name: 'bossbar_get_value',
|
|
744
|
+
params: [
|
|
745
|
+
{ name: 'id', type: 'string', required: true, doc: 'Boss bar ID', docZh: '血条 ID' },
|
|
746
|
+
],
|
|
747
|
+
returns: 'int',
|
|
748
|
+
doc: 'Gets the current value of a boss bar.',
|
|
749
|
+
docZh: '获取 Boss 血条的当前值。',
|
|
750
|
+
examples: ['let v: int = bossbar_get_value("mymod:timer");'],
|
|
751
|
+
compilesTo: 'execute store result score <dst> rs run bossbar get <id> value',
|
|
752
|
+
category: 'bossbar',
|
|
753
|
+
},
|
|
754
|
+
// -------------------------------------------------------------------------
|
|
755
|
+
// Teams
|
|
756
|
+
// -------------------------------------------------------------------------
|
|
757
|
+
team_add: {
|
|
758
|
+
name: 'team_add',
|
|
759
|
+
params: [
|
|
760
|
+
{ name: 'name', type: 'string', required: true, doc: 'Team name', docZh: '队伍名称' },
|
|
761
|
+
{ name: 'displayName', type: 'string', required: false, doc: 'Optional display name', docZh: '可选的显示名称' },
|
|
762
|
+
],
|
|
763
|
+
returns: 'void',
|
|
764
|
+
doc: 'Creates a new team.',
|
|
765
|
+
docZh: '创建新的队伍。',
|
|
766
|
+
examples: ['team_add("red");', 'team_add("blue", "Blue Team");'],
|
|
767
|
+
compilesTo: 'team add <name> [displayName]',
|
|
768
|
+
category: 'teams',
|
|
769
|
+
},
|
|
770
|
+
team_remove: {
|
|
771
|
+
name: 'team_remove',
|
|
772
|
+
params: [
|
|
773
|
+
{ name: 'name', type: 'string', required: true, doc: 'Team name to remove', docZh: '要移除的队伍名称' },
|
|
774
|
+
],
|
|
775
|
+
returns: 'void',
|
|
776
|
+
doc: 'Removes a team.',
|
|
777
|
+
docZh: '移除队伍。',
|
|
778
|
+
examples: ['team_remove("red");'],
|
|
779
|
+
compilesTo: 'team remove <name>',
|
|
780
|
+
category: 'teams',
|
|
781
|
+
},
|
|
782
|
+
team_join: {
|
|
783
|
+
name: 'team_join',
|
|
784
|
+
params: [
|
|
785
|
+
{ name: 'name', type: 'string', required: true, doc: 'Team name to join', docZh: '要加入的队伍名称' },
|
|
786
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Entities to add to the team', docZh: '要加入队伍的实体' },
|
|
787
|
+
],
|
|
788
|
+
returns: 'void',
|
|
789
|
+
doc: 'Adds entities to a team.',
|
|
790
|
+
docZh: '将实体加入队伍。',
|
|
791
|
+
examples: ['team_join("red", @s);', 'team_join("blue", @a[tag=blue_team]);'],
|
|
792
|
+
compilesTo: 'team join <name> <target>',
|
|
793
|
+
category: 'teams',
|
|
794
|
+
},
|
|
795
|
+
team_leave: {
|
|
796
|
+
name: 'team_leave',
|
|
797
|
+
params: [
|
|
798
|
+
{ name: 'target', type: 'selector', required: true, doc: 'Entities to remove from their team', docZh: '要离开队伍的实体' },
|
|
799
|
+
],
|
|
800
|
+
returns: 'void',
|
|
801
|
+
doc: 'Removes entities from their current team.',
|
|
802
|
+
docZh: '将实体从当前队伍中移除。',
|
|
803
|
+
examples: ['team_leave(@s);'],
|
|
804
|
+
compilesTo: 'team leave <target>',
|
|
805
|
+
category: 'teams',
|
|
806
|
+
},
|
|
807
|
+
team_option: {
|
|
808
|
+
name: 'team_option',
|
|
809
|
+
params: [
|
|
810
|
+
{ name: 'name', type: 'string', required: true, doc: 'Team name', docZh: '队伍名称' },
|
|
811
|
+
{ name: 'option', type: 'string', required: true, doc: 'Option name (e.g. "color", "friendlyFire", "prefix")', docZh: '选项名(如 "color"、"friendlyFire"、"prefix")' },
|
|
812
|
+
{ name: 'value', type: 'string', required: true, doc: 'Option value', docZh: '选项值' },
|
|
813
|
+
],
|
|
814
|
+
returns: 'void',
|
|
815
|
+
doc: 'Sets a team option/property.',
|
|
816
|
+
docZh: '设置队伍选项/属性。',
|
|
817
|
+
examples: ['team_option("red", "color", "red");', 'team_option("blue", "friendlyFire", "false");'],
|
|
818
|
+
compilesTo: 'team modify <name> <option> <value>',
|
|
819
|
+
category: 'teams',
|
|
820
|
+
},
|
|
821
|
+
// -------------------------------------------------------------------------
|
|
822
|
+
// Sets (NBT-backed unique collections)
|
|
823
|
+
// -------------------------------------------------------------------------
|
|
824
|
+
set_new: {
|
|
825
|
+
name: 'set_new',
|
|
826
|
+
params: [],
|
|
827
|
+
returns: 'string',
|
|
828
|
+
doc: 'Creates a new unique set backed by NBT storage. Returns the set ID.',
|
|
829
|
+
docZh: '创建新的基于 NBT 存储的唯一集合,返回集合 ID。',
|
|
830
|
+
examples: ['let enemies: string = set_new();', 'set_add(enemies, "@s");'],
|
|
831
|
+
compilesTo: 'data modify storage rs:sets <setId> set value []',
|
|
832
|
+
category: 'collections',
|
|
833
|
+
},
|
|
834
|
+
set_add: {
|
|
835
|
+
name: 'set_add',
|
|
836
|
+
params: [
|
|
837
|
+
{ name: 'setId', type: 'string', required: true, doc: 'Set ID returned by set_new()', docZh: 'set_new() 返回的集合 ID' },
|
|
838
|
+
{ name: 'value', type: 'string', required: true, doc: 'Value to add', docZh: '要添加的值' },
|
|
839
|
+
],
|
|
840
|
+
returns: 'void',
|
|
841
|
+
doc: 'Adds a value to a set (no-op if already present).',
|
|
842
|
+
docZh: '向集合添加值(若已存在则不操作)。',
|
|
843
|
+
examples: ['set_add(enemies, "@s");'],
|
|
844
|
+
compilesTo: 'execute unless data storage rs:sets <setId>[{value:<v>}] run data modify ...',
|
|
845
|
+
category: 'collections',
|
|
846
|
+
},
|
|
847
|
+
set_contains: {
|
|
848
|
+
name: 'set_contains',
|
|
849
|
+
params: [
|
|
850
|
+
{ name: 'setId', type: 'string', required: true, doc: 'Set ID', docZh: '集合 ID' },
|
|
851
|
+
{ name: 'value', type: 'string', required: true, doc: 'Value to check', docZh: '要检查的值' },
|
|
852
|
+
],
|
|
853
|
+
returns: 'int',
|
|
854
|
+
doc: 'Returns 1 if the set contains the value, 0 otherwise.',
|
|
855
|
+
docZh: '若集合包含该值返回 1,否则返回 0。',
|
|
856
|
+
examples: ['if set_contains(enemies, "@s") { kill(@s); }'],
|
|
857
|
+
compilesTo: 'execute store result score <dst> rs if data storage rs:sets <setId>[{value:<v>}]',
|
|
858
|
+
category: 'collections',
|
|
859
|
+
},
|
|
860
|
+
set_remove: {
|
|
861
|
+
name: 'set_remove',
|
|
862
|
+
params: [
|
|
863
|
+
{ name: 'setId', type: 'string', required: true, doc: 'Set ID', docZh: '集合 ID' },
|
|
864
|
+
{ name: 'value', type: 'string', required: true, doc: 'Value to remove', docZh: '要移除的值' },
|
|
865
|
+
],
|
|
866
|
+
returns: 'void',
|
|
867
|
+
doc: 'Removes a value from a set.',
|
|
868
|
+
docZh: '从集合中移除一个值。',
|
|
869
|
+
examples: ['set_remove(enemies, "@s");'],
|
|
870
|
+
compilesTo: 'data remove storage rs:sets <setId>[{value:<v>}]',
|
|
871
|
+
category: 'collections',
|
|
872
|
+
},
|
|
873
|
+
set_clear: {
|
|
874
|
+
name: 'set_clear',
|
|
875
|
+
params: [
|
|
876
|
+
{ name: 'setId', type: 'string', required: true, doc: 'Set ID to clear', docZh: '要清空的集合 ID' },
|
|
877
|
+
],
|
|
878
|
+
returns: 'void',
|
|
879
|
+
doc: 'Removes all values from a set.',
|
|
880
|
+
docZh: '清空集合中的所有值。',
|
|
881
|
+
examples: ['set_clear(enemies);'],
|
|
882
|
+
compilesTo: 'data modify storage rs:sets <setId> set value []',
|
|
883
|
+
category: 'collections',
|
|
884
|
+
},
|
|
885
|
+
// -------------------------------------------------------------------------
|
|
886
|
+
// Timers
|
|
887
|
+
// -------------------------------------------------------------------------
|
|
888
|
+
setTimeout: {
|
|
889
|
+
name: 'setTimeout',
|
|
890
|
+
params: [
|
|
891
|
+
{ name: 'delay', type: 'int', required: true, doc: 'Delay in ticks before executing the callback', docZh: '执行回调前的延迟(tick)' },
|
|
892
|
+
{ name: 'callback', type: 'string', required: true, doc: 'Lambda function to execute after delay', docZh: '延迟后执行的 lambda 函数' },
|
|
893
|
+
],
|
|
894
|
+
returns: 'void',
|
|
895
|
+
doc: 'Executes a callback function after a delay (in ticks).',
|
|
896
|
+
docZh: '在指定延迟(tick)后执行回调函数。',
|
|
897
|
+
examples: ['setTimeout(100, () => { say("5 seconds passed!"); });'],
|
|
898
|
+
compilesTo: 'schedule function <ns>:<callback> <delay>t',
|
|
899
|
+
category: 'timers',
|
|
900
|
+
},
|
|
901
|
+
setInterval: {
|
|
902
|
+
name: 'setInterval',
|
|
903
|
+
params: [
|
|
904
|
+
{ name: 'interval', type: 'int', required: true, doc: 'Interval in ticks between executions', docZh: '每次执行之间的间隔(tick)' },
|
|
905
|
+
{ name: 'callback', type: 'string', required: true, doc: 'Lambda function to execute repeatedly', docZh: '重复执行的 lambda 函数' },
|
|
906
|
+
],
|
|
907
|
+
returns: 'int',
|
|
908
|
+
doc: 'Executes a callback function repeatedly at a fixed interval. Returns an interval ID.',
|
|
909
|
+
docZh: '以固定间隔重复执行回调函数,返回间隔 ID。',
|
|
910
|
+
examples: ['let timer: int = setInterval(20, () => { say("Every second!"); });'],
|
|
911
|
+
compilesTo: 'schedule function <ns>:<callback> <interval>t',
|
|
912
|
+
category: 'timers',
|
|
913
|
+
},
|
|
914
|
+
clearInterval: {
|
|
915
|
+
name: 'clearInterval',
|
|
916
|
+
params: [
|
|
917
|
+
{ name: 'id', type: 'int', required: true, doc: 'Interval ID returned by setInterval()', docZh: 'setInterval() 返回的间隔 ID' },
|
|
918
|
+
],
|
|
919
|
+
returns: 'void',
|
|
920
|
+
doc: 'Cancels a repeating interval created by setInterval().',
|
|
921
|
+
docZh: '取消由 setInterval() 创建的重复间隔。',
|
|
922
|
+
examples: ['clearInterval(timer);'],
|
|
923
|
+
compilesTo: 'schedule clear <ns>:<intervalFn>',
|
|
924
|
+
category: 'timers',
|
|
925
|
+
},
|
|
926
|
+
};
|
|
927
|
+
/**
|
|
928
|
+
* Returns the .d.mcrs declaration file signature for a builtin function.
|
|
929
|
+
*/
|
|
930
|
+
function builtinToDeclaration(def) {
|
|
931
|
+
const lines = [];
|
|
932
|
+
// Doc comments (English only)
|
|
933
|
+
lines.push(`/// ${def.doc}`);
|
|
934
|
+
// Param docs
|
|
935
|
+
for (const p of def.params) {
|
|
936
|
+
const optTag = p.required ? '' : ' (optional)';
|
|
937
|
+
lines.push(`/// @param ${p.name} ${p.doc}${optTag}`);
|
|
938
|
+
}
|
|
939
|
+
// Returns
|
|
940
|
+
if (def.returns !== 'void') {
|
|
941
|
+
lines.push(`/// @returns ${def.returns}`);
|
|
942
|
+
}
|
|
943
|
+
// Examples
|
|
944
|
+
for (const ex of def.examples) {
|
|
945
|
+
lines.push(`/// @example ${ex.split('\n')[0]}`);
|
|
946
|
+
}
|
|
947
|
+
// Signature - use default value syntax instead of ? for optional params
|
|
948
|
+
const paramStrs = def.params.map(p => {
|
|
949
|
+
let type = p.type;
|
|
950
|
+
if (type === 'effect')
|
|
951
|
+
type = 'string';
|
|
952
|
+
if (type === 'sound')
|
|
953
|
+
type = 'string';
|
|
954
|
+
if (type === 'block')
|
|
955
|
+
type = 'string';
|
|
956
|
+
if (type === 'item')
|
|
957
|
+
type = 'string';
|
|
958
|
+
if (type === 'entity')
|
|
959
|
+
type = 'string';
|
|
960
|
+
if (type === 'dimension')
|
|
961
|
+
type = 'string';
|
|
962
|
+
if (type === 'nbt')
|
|
963
|
+
type = 'string';
|
|
964
|
+
if (!p.required && p.default !== undefined) {
|
|
965
|
+
return `${p.name}: ${type} = ${p.default}`;
|
|
966
|
+
}
|
|
967
|
+
return `${p.name}: ${type}`;
|
|
968
|
+
});
|
|
969
|
+
const retType = def.returns;
|
|
970
|
+
lines.push(`declare fn ${def.name}(${paramStrs.join(', ')}): ${retType};`);
|
|
971
|
+
return lines.join('\n');
|
|
972
|
+
}
|
|
973
|
+
/**
|
|
974
|
+
* Generates the full builtins.d.mcrs content.
|
|
975
|
+
*/
|
|
976
|
+
function generateDts() {
|
|
977
|
+
const sections = {};
|
|
978
|
+
for (const def of Object.values(exports.BUILTIN_METADATA)) {
|
|
979
|
+
if (!sections[def.category]) {
|
|
980
|
+
sections[def.category] = [];
|
|
981
|
+
}
|
|
982
|
+
sections[def.category].push(builtinToDeclaration(def));
|
|
983
|
+
}
|
|
984
|
+
const categoryTitles = {
|
|
985
|
+
chat: 'Chat & Display',
|
|
986
|
+
player: 'Player',
|
|
987
|
+
world: 'World & Block',
|
|
988
|
+
entities: 'Entities & Tags',
|
|
989
|
+
scoreboard: 'Scoreboard',
|
|
990
|
+
random: 'Random',
|
|
991
|
+
data: 'Data (NBT)',
|
|
992
|
+
bossbar: 'Boss Bar',
|
|
993
|
+
teams: 'Teams',
|
|
994
|
+
collections: 'Collections (Set)',
|
|
995
|
+
timers: 'Timers',
|
|
996
|
+
};
|
|
997
|
+
const output = [
|
|
998
|
+
'// builtins.d.mcrs',
|
|
999
|
+
'// RedScript builtin function declarations',
|
|
1000
|
+
'// Auto-generated by: redscript generate-dts',
|
|
1001
|
+
'// DO NOT EDIT — regenerate with: redscript generate-dts',
|
|
1002
|
+
'',
|
|
1003
|
+
];
|
|
1004
|
+
for (const [cat, decls] of Object.entries(sections)) {
|
|
1005
|
+
const title = categoryTitles[cat] ?? cat;
|
|
1006
|
+
output.push(`// ${'─'.repeat(70)}`);
|
|
1007
|
+
output.push(`// ${title}`);
|
|
1008
|
+
output.push(`// ${'─'.repeat(70)}`);
|
|
1009
|
+
output.push('');
|
|
1010
|
+
output.push(...decls.map(d => d + '\n'));
|
|
1011
|
+
}
|
|
1012
|
+
return output.join('\n');
|
|
1013
|
+
}
|
|
1014
|
+
//# sourceMappingURL=metadata.js.map
|