Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions packages/mecha/examples/basic_snapshot/beet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@



data_pack:
load: .

minecraft: "26.1-snapshot-10"

require:
- beet.contrib.snapshot

pipeline:
- mecha

output: build
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

swing @s mainhand
13 changes: 13 additions & 0 deletions packages/mecha/examples/basic_wildcard/beet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@



data_pack:
load: .

minecraft: "1.21.x"


pipeline:
- mecha

output: build
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

say BASIC
11 changes: 4 additions & 7 deletions packages/mecha/src/mecha/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from beet import ErrorMessage
from beet.core.utils import FileSystemPath, JsonDict, VersionNumber, split_version
from pydantic import BaseModel
from beet.resources.pack_format_registry import search_version


class CommandTree(BaseModel):
Expand Down Expand Up @@ -38,16 +39,12 @@ def load_from(
for filename in args:
sources.append(Path(filename).read_text())

version = split_version(version) if version is not None else None

if version and not patch_only:
version_name = "_".join(map(str, version))
try:
sources.append(
files("mecha.resources")
.joinpath(f"{version_name}.json")
.read_text()
filename = (
f"{'_'.join(map(str, split_version(search_version(version))))}.json"
)
sources.append(files("mecha.resources").joinpath(filename).read_text())
except FileNotFoundError as exc:
raise ErrorMessage(f"Invalid minecraft version {version!r}.") from exc

Expand Down
8 changes: 7 additions & 1 deletion packages/mecha/src/mecha/parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@
from nbtlib import Byte, Double, Float, Int, Long, OutOfRange, Short, String
from tokenstream import InvalidSyntax, SourceLocation, TokenStream, set_location

from beet.resources.pack_format_registry import search_version

from .ast import (
AstAdvancementPredicate,
AstBlock,
Expand Down Expand Up @@ -583,7 +585,11 @@ def get_default_parsers() -> Dict[str, Parser]:

def get_parsers(version: VersionNumber = LATEST_MINECRAFT_VERSION) -> Dict[str, Parser]:
"""Return parsers for a specific version."""
version = split_version(version)
resolved = search_version(version)
try:
version = split_version(resolved)
except ValueError:
version = split_version(LATEST_MINECRAFT_VERSION)

parsers = get_default_parsers()

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Lectern snapshot

## Data pack

`@data_pack pack.mcmeta`

```json
{
"pack": {
"min_format": [
99,
3
],
"max_format": [
99,
3
],
"description": ""
}
}
```

### name

`@function name:test`

```mcfunction
swing @s mainhand
```

## Resource pack

`@resource_pack pack.mcmeta`

```json
{
"pack": {
"min_format": [
82,
0
],
"max_format": [
82,
0
],
"description": ""
}
}
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Lectern snapshot

## Data pack

`@data_pack pack.mcmeta`

```json
{
"pack": {
"min_format": [
94,
1
],
"max_format": [
94,
1
],
"description": ""
}
}
```

### name

`@function name:test`

```mcfunction
say BASIC
```
41 changes: 41 additions & 0 deletions src/beet/contrib/snapshot.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""
Plugin to load snapshot pack formats and command trees from misode/mcmeta (or custom).
"""

from beet import Context, DataPack, ResourcePack
from beet.resources.pack_format_registry import (
PackFormatRegistry,
all_versions,
pack_format_registry,
)
from beet.toolchain.context import PluginOptions
from beet import configurable


class SnapshotOptions(PluginOptions):
"""Plugin options for the snapshot plugin."""

url_versions: str = "https://raw.githubusercontent.com/misode/mcmeta/refs/tags/{version}-summary/version.json"
"""URL template to download the version manifest from. The {version} placeholder will be replaced with the Minecraft version."""

url_command_tree: str = "https://raw.githubusercontent.com/misode/mcmeta/refs/tags/{version}-summary/commands/data.json"
"""URL template to download the command tree from. The {version} placeholder will be replaced with the Minecraft version."""


@configurable("snapshot", validator=SnapshotOptions)
def beet_default(ctx: Context, opts: SnapshotOptions):
cache = ctx.cache["snapshot"]
path = cache.download(opts.url_versions.format(version=ctx.minecraft_version))

all_versions.append(ctx.minecraft_version)

pack_format = PackFormatRegistry.model_validate_json(path.open("r").read())
pack_format_registry.append(pack_format)
for pack in ctx.packs:
pack.pack_format_registry.add_format(pack_format)
pack.assign_format(ctx.minecraft_version)
DataPack.pack_format_registry.add_format(pack_format)
ResourcePack.pack_format_registry.add_format(pack_format)

path = cache.download(opts.url_command_tree.format(version=ctx.minecraft_version))
ctx.meta.setdefault("mecha", {}).setdefault("commands", []).insert(0, path)
19 changes: 12 additions & 7 deletions src/beet/library/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -1240,22 +1240,27 @@ def copy(self, *, shallow: bool = False) -> Self:

return pack_copy

def assign_format(self):
def assign_format(self, minecraft_version: str | None = None):
if (
self.pack_format is None
and self.min_format is None
and self.max_format is None
):
if isinstance(self.latest_pack_format, int):
if self.latest_pack_format < self.pack_format_switch_format:
self.pack_format = self.latest_pack_format
) or minecraft_version:
format = (
self.pack_format_registry.get(minecraft_version)
if minecraft_version
else self.latest_pack_format
)
if isinstance(format, int):
if format < self.pack_format_switch_format:
self.pack_format = format
self.min_format = None
self.max_format = None
else:
self.pack_format = None
self.min_format = self.max_format = self.latest_pack_format
self.min_format = self.max_format = format
else:
self.min_format = self.max_format = self.latest_pack_format
self.min_format = self.max_format = format

def clear(self):
self.extra.clear()
Expand Down
Loading