minecraft-datapack-language 15.4.32__py3-none-any.whl → 15.4.34__py3-none-any.whl
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.
- minecraft_datapack_language/_version.py +2 -2
- minecraft_datapack_language/cli.py +22 -7
- minecraft_datapack_language/mdl_compiler.py +124 -39
- {minecraft_datapack_language-15.4.32.dist-info → minecraft_datapack_language-15.4.34.dist-info}/METADATA +1 -1
- {minecraft_datapack_language-15.4.32.dist-info → minecraft_datapack_language-15.4.34.dist-info}/RECORD +9 -9
- {minecraft_datapack_language-15.4.32.dist-info → minecraft_datapack_language-15.4.34.dist-info}/WHEEL +0 -0
- {minecraft_datapack_language-15.4.32.dist-info → minecraft_datapack_language-15.4.34.dist-info}/entry_points.txt +0 -0
- {minecraft_datapack_language-15.4.32.dist-info → minecraft_datapack_language-15.4.34.dist-info}/licenses/LICENSE +0 -0
- {minecraft_datapack_language-15.4.32.dist-info → minecraft_datapack_language-15.4.34.dist-info}/top_level.txt +0 -0
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
28
28
|
commit_id: COMMIT_ID
|
29
29
|
__commit_id__: COMMIT_ID
|
30
30
|
|
31
|
-
__version__ = version = '15.4.
|
32
|
-
__version_tuple__ = version_tuple = (15, 4,
|
31
|
+
__version__ = version = '15.4.34'
|
32
|
+
__version_tuple__ = version_tuple = (15, 4, 34)
|
33
33
|
|
34
34
|
__commit_id__ = commit_id = None
|
@@ -26,6 +26,8 @@ Examples:
|
|
26
26
|
mdl new my_project # Create a new project
|
27
27
|
"""
|
28
28
|
)
|
29
|
+
# Global options
|
30
|
+
parser.add_argument('--version', action='store_true', help='Show version and exit')
|
29
31
|
|
30
32
|
subparsers = parser.add_subparsers(dest='command', help='Available commands')
|
31
33
|
|
@@ -34,6 +36,7 @@ Examples:
|
|
34
36
|
build_parser.add_argument('--mdl', required=True, help='MDL file(s) or directory to build')
|
35
37
|
build_parser.add_argument('-o', '--output', required=True, help='Output directory for the datapack')
|
36
38
|
build_parser.add_argument('--verbose', action='store_true', help='Show detailed output')
|
39
|
+
build_parser.add_argument('--wrapper', help='Optional wrapper directory name for the datapack output')
|
37
40
|
|
38
41
|
# Check command
|
39
42
|
check_parser = subparsers.add_parser('check', help='Check MDL files for syntax errors')
|
@@ -45,9 +48,19 @@ Examples:
|
|
45
48
|
new_parser.add_argument('project_name', help='Name of the new project')
|
46
49
|
new_parser.add_argument('--pack-name', help='Custom name for the datapack')
|
47
50
|
new_parser.add_argument('--pack-format', type=int, default=82, help='Pack format number (default: 82)')
|
51
|
+
new_parser.add_argument('--output', help='Directory to create the project in (defaults to current directory)')
|
48
52
|
|
49
53
|
args = parser.parse_args()
|
50
54
|
|
55
|
+
if args.version and not args.command:
|
56
|
+
# Print version and exit
|
57
|
+
try:
|
58
|
+
from . import __version__
|
59
|
+
except Exception:
|
60
|
+
__version__ = "0.0.0"
|
61
|
+
print(__version__)
|
62
|
+
return 0
|
63
|
+
|
51
64
|
if not args.command:
|
52
65
|
parser.print_help()
|
53
66
|
return 1
|
@@ -133,6 +146,7 @@ def build_command(args):
|
|
133
146
|
print(f"Compiling to {output_dir}...")
|
134
147
|
|
135
148
|
compiler = MDLCompiler()
|
149
|
+
# Note: --wrapper is currently accepted for compatibility but not required by compiler
|
136
150
|
output_path = compiler.compile(final_ast, str(output_dir))
|
137
151
|
|
138
152
|
print(f"Successfully built datapack: {output_path}")
|
@@ -193,9 +207,10 @@ def new_command(args):
|
|
193
207
|
project_name = args.project_name
|
194
208
|
pack_name = args.pack_name or project_name
|
195
209
|
pack_format = args.pack_format
|
210
|
+
base_dir = Path(args.output) if getattr(args, 'output', None) else Path('.')
|
211
|
+
project_dir = base_dir / project_name
|
196
212
|
|
197
213
|
# Create project directory
|
198
|
-
project_dir = Path(project_name)
|
199
214
|
if project_dir.exists():
|
200
215
|
print(f"Error: Project directory '{project_name}' already exists")
|
201
216
|
return 1
|
@@ -213,7 +228,7 @@ var num counter<@s> = 0;
|
|
213
228
|
var num global_timer<@a> = 0;
|
214
229
|
|
215
230
|
// Main function
|
216
|
-
function {project_name}:main
|
231
|
+
function {project_name}:main {{
|
217
232
|
say "Hello from {project_name}!";
|
218
233
|
|
219
234
|
// Variable example
|
@@ -228,13 +243,13 @@ function {project_name}:main<@s> {{
|
|
228
243
|
}}
|
229
244
|
}}
|
230
245
|
|
231
|
-
//
|
232
|
-
function {project_name}:
|
233
|
-
say "Datapack
|
246
|
+
// Init function (avoid reserved names like 'load' or 'tick')
|
247
|
+
function {project_name}:init {{
|
248
|
+
say "Datapack initialized successfully!";
|
234
249
|
}}
|
235
250
|
|
236
251
|
// Hook to run on load
|
237
|
-
on_load {project_name}:
|
252
|
+
on_load {project_name}:init;
|
238
253
|
'''
|
239
254
|
|
240
255
|
with open(mdl_file, 'w', encoding='utf-8') as f:
|
@@ -281,7 +296,7 @@ For more information, visit: https://www.mcmdl.com
|
|
281
296
|
with open(readme_file, 'w', encoding='utf-8') as f:
|
282
297
|
f.write(readme_content)
|
283
298
|
|
284
|
-
print(f"Created new MDL project: {
|
299
|
+
print(f"Created new MDL project: {project_dir}/")
|
285
300
|
print(f" - {mdl_file}")
|
286
301
|
print(f" - {readme_file}")
|
287
302
|
print(f"\nNext steps:")
|
@@ -16,6 +16,7 @@ from .ast_nodes import (
|
|
16
16
|
)
|
17
17
|
from .dir_map import get_dir_map, DirMap
|
18
18
|
from .mdl_errors import MDLCompilerError
|
19
|
+
from .mdl_lexer import TokenType
|
19
20
|
|
20
21
|
|
21
22
|
class MDLCompiler:
|
@@ -164,15 +165,6 @@ class MDLCompiler:
|
|
164
165
|
for temp_cmd in self.temp_commands:
|
165
166
|
lines.append(temp_cmd)
|
166
167
|
|
167
|
-
# Add any generated functions that were created during compilation
|
168
|
-
if hasattr(self, 'generated_functions') and self.generated_functions:
|
169
|
-
lines.append("")
|
170
|
-
lines.append("# Generated functions:")
|
171
|
-
for func_name, func_lines in self.generated_functions.items():
|
172
|
-
lines.append(f"# {func_name}:")
|
173
|
-
lines.extend(func_lines)
|
174
|
-
lines.append("")
|
175
|
-
|
176
168
|
return "\n".join(lines)
|
177
169
|
|
178
170
|
def _compile_hooks(self, hooks: List[HookDeclaration], namespace_dir: Path):
|
@@ -239,6 +231,12 @@ class MDLCompiler:
|
|
239
231
|
load_file = functions_dir / "load.mcfunction"
|
240
232
|
with open(load_file, 'w') as f:
|
241
233
|
f.write(load_content)
|
234
|
+
# Ensure minecraft load tag points to namespace:load
|
235
|
+
tags_fn_dir = self.output_dir / "data" / "minecraft" / self.dir_map.tags_function
|
236
|
+
tags_fn_dir.mkdir(parents=True, exist_ok=True)
|
237
|
+
load_tag_file = tags_fn_dir / "load.json"
|
238
|
+
with open(load_tag_file, 'w') as f:
|
239
|
+
json.dump({"values": [f"{self.current_namespace}:load"]}, f, indent=2)
|
242
240
|
|
243
241
|
# Create tick function if needed
|
244
242
|
tick_hooks = [h for h in hooks if h.hook_type == "on_tick"]
|
@@ -247,6 +245,10 @@ class MDLCompiler:
|
|
247
245
|
tick_file = functions_dir / "tick.mcfunction"
|
248
246
|
with open(tick_file, 'w') as f:
|
249
247
|
f.write(tick_content)
|
248
|
+
# Ensure minecraft tick tag points to namespace:tick
|
249
|
+
tick_tag_file = tags_fn_dir / "tick.json"
|
250
|
+
with open(tick_tag_file, 'w') as f:
|
251
|
+
json.dump({"values": [f"{self.current_namespace}:tick"]}, f, indent=2)
|
250
252
|
|
251
253
|
def _generate_load_function(self, hooks: List[HookDeclaration]) -> str:
|
252
254
|
"""Generate the content of load.mcfunction."""
|
@@ -380,19 +382,19 @@ class MDLCompiler:
|
|
380
382
|
|
381
383
|
def _if_statement_to_command(self, if_stmt: IfStatement) -> str:
|
382
384
|
"""Convert if statement to proper Minecraft execute if commands."""
|
383
|
-
condition = self.
|
385
|
+
condition, invert_then = self._build_condition(if_stmt.condition)
|
384
386
|
lines = []
|
385
387
|
|
386
|
-
#
|
387
|
-
|
388
|
-
|
389
|
-
|
388
|
+
# Prepare function name for the then branch
|
389
|
+
if_function_name = self._generate_if_function_name()
|
390
|
+
# Generate condition command
|
391
|
+
if invert_then:
|
392
|
+
lines.append(f"execute unless {condition} run function {self.current_namespace}:{if_function_name}")
|
390
393
|
else:
|
391
|
-
|
392
|
-
lines.append(f"execute if {condition} run function {self.current_namespace}:{self._generate_if_function_name()}")
|
394
|
+
lines.append(f"execute if {condition} run function {self.current_namespace}:{if_function_name}")
|
393
395
|
|
394
|
-
# Generate the if body function
|
395
|
-
if_body_lines = [f"# Function: {self.current_namespace}:{
|
396
|
+
# Generate the if body function content
|
397
|
+
if_body_lines = [f"# Function: {self.current_namespace}:{if_function_name}"]
|
396
398
|
for stmt in if_stmt.then_body:
|
397
399
|
if isinstance(stmt, VariableAssignment):
|
398
400
|
cmd = self._variable_assignment_to_command(stmt)
|
@@ -415,18 +417,26 @@ class MDLCompiler:
|
|
415
417
|
# Handle else body if it exists
|
416
418
|
if if_stmt.else_body:
|
417
419
|
if isinstance(if_stmt.else_body, list) and len(if_stmt.else_body) == 1 and isinstance(if_stmt.else_body[0], IfStatement):
|
418
|
-
#
|
419
|
-
|
420
|
-
|
420
|
+
# Else-if: create an else function wrapper that contains the nested if
|
421
|
+
else_function_name = self._generate_else_function_name()
|
422
|
+
if invert_then:
|
423
|
+
lines.append(f"execute if {condition} run function {self.current_namespace}:{else_function_name}")
|
424
|
+
else:
|
425
|
+
lines.append(f"execute unless {condition} run function {self.current_namespace}:{else_function_name}")
|
426
|
+
else_body_lines = [f"# Function: {self.current_namespace}:{else_function_name}"]
|
427
|
+
nested_cmd = self._if_statement_to_command(if_stmt.else_body[0])
|
428
|
+
for nested_line in nested_cmd.split('\n'):
|
429
|
+
if nested_line:
|
430
|
+
else_body_lines.append(nested_line)
|
431
|
+
self._store_generated_function(else_function_name, else_body_lines)
|
421
432
|
else:
|
422
|
-
#
|
423
|
-
|
424
|
-
|
433
|
+
# Regular else: compile its body into its own function
|
434
|
+
else_function_name = self._generate_else_function_name()
|
435
|
+
if invert_then:
|
436
|
+
lines.append(f"execute if {condition} run function {self.current_namespace}:{else_function_name}")
|
425
437
|
else:
|
426
|
-
lines.append(f"execute unless {condition} run function {self.current_namespace}:{
|
427
|
-
|
428
|
-
# Generate the else body function
|
429
|
-
else_body_lines = [f"# Function: {self.current_namespace}:{self._generate_else_function_name()}"]
|
438
|
+
lines.append(f"execute unless {condition} run function {self.current_namespace}:{else_function_name}")
|
439
|
+
else_body_lines = [f"# Function: {self.current_namespace}:{else_function_name}"]
|
430
440
|
for stmt in if_stmt.else_body:
|
431
441
|
if isinstance(stmt, VariableAssignment):
|
432
442
|
cmd = self._variable_assignment_to_command(stmt)
|
@@ -445,12 +455,10 @@ class MDLCompiler:
|
|
445
455
|
elif isinstance(stmt, FunctionCall):
|
446
456
|
cmd = self._function_call_to_command(stmt)
|
447
457
|
else_body_lines.append(cmd)
|
448
|
-
|
449
|
-
# Store the else function for later generation
|
450
|
-
self._store_generated_function(self._generate_else_function_name(), else_body_lines)
|
458
|
+
self._store_generated_function(else_function_name, else_body_lines)
|
451
459
|
|
452
|
-
# Store the if function
|
453
|
-
self._store_generated_function(
|
460
|
+
# Store the if function as its own file
|
461
|
+
self._store_generated_function(if_function_name, if_body_lines)
|
454
462
|
|
455
463
|
return "\n".join(lines)
|
456
464
|
|
@@ -494,7 +502,7 @@ class MDLCompiler:
|
|
494
502
|
else:
|
495
503
|
loop_body_lines.append(f"execute if {condition} run function {self.current_namespace}:{loop_function_name}")
|
496
504
|
|
497
|
-
# Store the loop function
|
505
|
+
# Store the loop function as its own file
|
498
506
|
self._store_generated_function(loop_function_name, loop_body_lines)
|
499
507
|
|
500
508
|
return "\n".join(lines)
|
@@ -529,10 +537,15 @@ class MDLCompiler:
|
|
529
537
|
return f"while_{self.while_counter}"
|
530
538
|
|
531
539
|
def _store_generated_function(self, name: str, lines: List[str]):
|
532
|
-
"""Store a generated function
|
533
|
-
if
|
534
|
-
self.
|
535
|
-
|
540
|
+
"""Store a generated function as a separate file under the same namespace."""
|
541
|
+
if self.dir_map:
|
542
|
+
functions_dir = self.output_dir / "data" / self.current_namespace / self.dir_map.function
|
543
|
+
else:
|
544
|
+
functions_dir = self.output_dir / "data" / self.current_namespace / "functions"
|
545
|
+
functions_dir.mkdir(parents=True, exist_ok=True)
|
546
|
+
func_file = functions_dir / f"{name}.mcfunction"
|
547
|
+
with open(func_file, 'w') as f:
|
548
|
+
f.write("\n".join(lines) + "\n")
|
536
549
|
|
537
550
|
def _function_call_to_command(self, func_call: FunctionCall) -> str:
|
538
551
|
"""Convert function call to execute command."""
|
@@ -544,6 +557,15 @@ class MDLCompiler:
|
|
544
557
|
def _expression_to_value(self, expression: Any) -> str:
|
545
558
|
"""Convert expression to a value string."""
|
546
559
|
if isinstance(expression, LiteralExpression):
|
560
|
+
# Format numbers as integers if possible
|
561
|
+
if isinstance(expression.value, (int, float)):
|
562
|
+
try:
|
563
|
+
v = float(expression.value)
|
564
|
+
if v.is_integer():
|
565
|
+
return str(int(v))
|
566
|
+
return str(v)
|
567
|
+
except Exception:
|
568
|
+
return str(expression.value)
|
547
569
|
return str(expression.value)
|
548
570
|
elif isinstance(expression, VariableSubstitution):
|
549
571
|
objective = self.variables.get(expression.name, expression.name)
|
@@ -560,13 +582,76 @@ class MDLCompiler:
|
|
560
582
|
return str(expression)
|
561
583
|
|
562
584
|
def _expression_to_condition(self, expression: Any) -> str:
|
563
|
-
"""Convert expression to a condition string."""
|
585
|
+
"""Legacy: Convert expression to a naive condition string (internal use)."""
|
564
586
|
if isinstance(expression, BinaryExpression):
|
565
587
|
left = self._expression_to_value(expression.left)
|
566
588
|
right = self._expression_to_value(expression.right)
|
567
589
|
return f"{left} {expression.operator} {right}"
|
568
590
|
else:
|
569
591
|
return self._expression_to_value(expression)
|
592
|
+
|
593
|
+
def _build_condition(self, expression: Any) -> (str, bool):
|
594
|
+
"""Build a valid Minecraft execute condition.
|
595
|
+
Returns (condition_string, invert_then) where invert_then True means the THEN branch should use 'unless'.
|
596
|
+
"""
|
597
|
+
# Default: generic expression string, no inversion
|
598
|
+
invert_then = False
|
599
|
+
|
600
|
+
if isinstance(expression, BinaryExpression):
|
601
|
+
left = expression.left
|
602
|
+
right = expression.right
|
603
|
+
op = expression.operator
|
604
|
+
# Variable vs literal
|
605
|
+
if isinstance(left, VariableSubstitution) and isinstance(right, LiteralExpression) and isinstance(right.value, (int, float)):
|
606
|
+
objective = self.variables.get(left.name, left.name)
|
607
|
+
scope = left.scope.strip("<>")
|
608
|
+
# Normalize number
|
609
|
+
try:
|
610
|
+
v = float(right.value)
|
611
|
+
except Exception:
|
612
|
+
v = None
|
613
|
+
if v is not None:
|
614
|
+
n = int(v) if float(v).is_integer() else v
|
615
|
+
if op == TokenType.GREATER:
|
616
|
+
rng = f"{int(n)+1}.." if isinstance(n, int) else f"{v+1}.."
|
617
|
+
return (f"score {scope} {objective} matches {rng}", False)
|
618
|
+
if op == TokenType.GREATER_EQUAL:
|
619
|
+
rng = f"{int(n)}.."
|
620
|
+
return (f"score {scope} {objective} matches {rng}", False)
|
621
|
+
if op == TokenType.LESS:
|
622
|
+
rng = f"..{int(n)-1}"
|
623
|
+
return (f"score {scope} {objective} matches {rng}", False)
|
624
|
+
if op == TokenType.LESS_EQUAL:
|
625
|
+
rng = f"..{int(n)}"
|
626
|
+
return (f"score {scope} {objective} matches {rng}", False)
|
627
|
+
if op == TokenType.EQUAL:
|
628
|
+
rng = f"{int(n)}"
|
629
|
+
return (f"score {scope} {objective} matches {rng}", False)
|
630
|
+
if op == TokenType.NOT_EQUAL:
|
631
|
+
rng = f"{int(n)}"
|
632
|
+
return (f"score {scope} {objective} matches {rng}", True)
|
633
|
+
# Variable vs variable
|
634
|
+
if isinstance(left, VariableSubstitution) and isinstance(right, VariableSubstitution):
|
635
|
+
lobj = self.variables.get(left.name, left.name)
|
636
|
+
lscope = left.scope.strip("<>")
|
637
|
+
robj = self.variables.get(right.name, right.name)
|
638
|
+
rscope = right.scope.strip("<>")
|
639
|
+
if op in (TokenType.GREATER, TokenType.GREATER_EQUAL, TokenType.LESS, TokenType.LESS_EQUAL, TokenType.EQUAL):
|
640
|
+
comp_map = {
|
641
|
+
TokenType.GREATER: ">",
|
642
|
+
TokenType.GREATER_EQUAL: ">=",
|
643
|
+
TokenType.LESS: "<",
|
644
|
+
TokenType.LESS_EQUAL: "<=",
|
645
|
+
TokenType.EQUAL: "="
|
646
|
+
}
|
647
|
+
comp = comp_map[op]
|
648
|
+
return (f"score {lscope} {lobj} {comp} {rscope} {robj}", False)
|
649
|
+
if op == TokenType.NOT_EQUAL:
|
650
|
+
# Use equals with inversion
|
651
|
+
return (f"score {lscope} {lobj} = {rscope} {robj}", True)
|
652
|
+
|
653
|
+
# Fallback: treat as generic condition string
|
654
|
+
return (self._expression_to_condition(expression), False)
|
570
655
|
|
571
656
|
def _compile_expression_to_temp(self, expression: BinaryExpression, temp_var: str):
|
572
657
|
"""Compile a complex expression to a temporary variable using valid Minecraft commands."""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: minecraft-datapack-language
|
3
|
-
Version: 15.4.
|
3
|
+
Version: 15.4.34
|
4
4
|
Summary: Compile MDL language with explicit scoping into a Minecraft datapack (1.21+ ready). Features variables, control flow, error handling, and VS Code extension.
|
5
5
|
Project-URL: Homepage, https://www.mcmdl.com
|
6
6
|
Project-URL: Documentation, https://www.mcmdl.com/docs
|
@@ -1,17 +1,17 @@
|
|
1
1
|
minecraft_datapack_language/__init__.py,sha256=YoTmZWZVH6POAVYMvOTEBKdC-cxQsWi2VomSWZDgYFw,1158
|
2
|
-
minecraft_datapack_language/_version.py,sha256=
|
2
|
+
minecraft_datapack_language/_version.py,sha256=AX5FvjEPvDBWIH6kE1FoeWiGRzaIAu7H64ji0BuRH1s,708
|
3
3
|
minecraft_datapack_language/ast_nodes.py,sha256=nbWrRz137MGMRpmnq8QkXNzrtlaCgyPEknytbkrS_M8,3899
|
4
|
-
minecraft_datapack_language/cli.py,sha256
|
4
|
+
minecraft_datapack_language/cli.py,sha256=-TMAL1HCCtwf0aG46x88MVBsYUswPRCVhy854li7X9c,9780
|
5
5
|
minecraft_datapack_language/dir_map.py,sha256=HmxFkuvWGkzHF8o_GFb4BpuMCRc6QMw8UbmcAI8JVdY,1788
|
6
|
-
minecraft_datapack_language/mdl_compiler.py,sha256=
|
6
|
+
minecraft_datapack_language/mdl_compiler.py,sha256=9wNQRZizlXqdIJcG5TQPtmAULz77hwCaPoXN9bvUo9o,35310
|
7
7
|
minecraft_datapack_language/mdl_errors.py,sha256=r0Gu3KhoX1YLPAVW_iO7Q_fPgaf_Dv9tOGSOdKNSzmw,16114
|
8
8
|
minecraft_datapack_language/mdl_lexer.py,sha256=CjbEUpuuF4eU_ucA_WIhw6wSMcHGk2BchtQ0bLAGvwg,22033
|
9
9
|
minecraft_datapack_language/mdl_linter.py,sha256=z85xoAglENurCh30bR7kEHZ_JeMxcYaLDcGNRAl-RAI,17253
|
10
10
|
minecraft_datapack_language/mdl_parser.py,sha256=aQPKcmATM9BOMzO7vCXmMdxU1qjOJNLCSAKJopu5h3g,23429
|
11
11
|
minecraft_datapack_language/utils.py,sha256=Aq0HAGlXqj9BUTEjaEilpvzEW0EtZYYMMwOqG9db6dE,684
|
12
|
-
minecraft_datapack_language-15.4.
|
13
|
-
minecraft_datapack_language-15.4.
|
14
|
-
minecraft_datapack_language-15.4.
|
15
|
-
minecraft_datapack_language-15.4.
|
16
|
-
minecraft_datapack_language-15.4.
|
17
|
-
minecraft_datapack_language-15.4.
|
12
|
+
minecraft_datapack_language-15.4.34.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
13
|
+
minecraft_datapack_language-15.4.34.dist-info/METADATA,sha256=A8QcpemF22cVUa-5UYxStXPZiN62FDyXEOSdGET0ffU,8360
|
14
|
+
minecraft_datapack_language-15.4.34.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
15
|
+
minecraft_datapack_language-15.4.34.dist-info/entry_points.txt,sha256=c6vjBeCiyQflvPHBRyBk2nJCSfYt3Oc7Sc9V87ySi_U,108
|
16
|
+
minecraft_datapack_language-15.4.34.dist-info/top_level.txt,sha256=ADtFI476tbKLLxEAA-aJQAfg53MA3k_DOb0KTFiggfw,28
|
17
|
+
minecraft_datapack_language-15.4.34.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|