From d03c02547cf3fa4dd342976f5c820f101c531f86 Mon Sep 17 00:00:00 2001 From: RitikShah Date: Sat, 19 Apr 2025 23:02:52 -0700 Subject: [PATCH 1/2] feat: beet.contrib.bake_overlays --- beet/contrib/bake_overlays.py | 93 +++++++++++++++++++ examples/load_overlay_baked/beet.yml | 8 ++ .../src/data/demo/functions/foo.mcfunction | 1 + .../data/demo/functions/foo.mcfunction | 1 + .../data/demo/functions/foo.mcfunction | 1 + .../data/demo/functions/foo.mcfunction | 1 + examples/load_overlay_baked/src/pack.mcmeta | 18 ++++ .../data/demo/function/foo.mcfunction | 1 + .../pack.mcmeta | 6 ++ .../pack.mcmeta | 6 ++ 10 files changed, 136 insertions(+) create mode 100644 beet/contrib/bake_overlays.py create mode 100644 examples/load_overlay_baked/beet.yml create mode 100644 examples/load_overlay_baked/src/data/demo/functions/foo.mcfunction create mode 100644 examples/load_overlay_baked/src/overlay1/data/demo/functions/foo.mcfunction create mode 100644 examples/load_overlay_baked/src/overlay2/data/demo/functions/foo.mcfunction create mode 100644 examples/load_overlay_baked/src/overlay_extra/data/demo/functions/foo.mcfunction create mode 100644 examples/load_overlay_baked/src/pack.mcmeta create mode 100644 tests/snapshots/examples__build_load_overlay_baked__0.data_pack/data/demo/function/foo.mcfunction create mode 100644 tests/snapshots/examples__build_load_overlay_baked__0.data_pack/pack.mcmeta create mode 100644 tests/snapshots/examples__build_load_overlay_baked__1.resource_pack/pack.mcmeta diff --git a/beet/contrib/bake_overlays.py b/beet/contrib/bake_overlays.py new file mode 100644 index 000000000..4c3386b11 --- /dev/null +++ b/beet/contrib/bake_overlays.py @@ -0,0 +1,93 @@ +import logging +from dataclasses import replace +from typing import TypeVar + +from beet import Context + +from ..core.utils import SupportedFormats +from ..library.data_pack import DataPack +from ..library.resource_pack import ResourcePack +from ..toolchain.context import PluginOptions, configurable + +logger = logging.getLogger(__name__) + +T = TypeVar("T", DataPack, ResourcePack) + + +class BakeOverlayOptions(PluginOptions): + selected_data_format: int | None = None + selected_assets_format: int | None = None + + +def bake_overlay(pack: T, overlay: T): + """Bake an overlay onto an original pack.""" + + original_policy = pack.merge_policy + pack.merge_policy = replace( + pack.merge_policy, + namespace={namespace: [] for namespace in pack.get_file_types()}, + ) + + pack.merge(overlay) + + pack.merge_policy = original_policy + + +def bake_overlays_for_pack_format(pack: T, pack_format: int): + """Procedurally bake overlays conditionally based on a specific pack format that is supported. + + All overlays are then cleared from the original pack. + """ + + for name, overlay in pack.overlays.items(): + if overlay.supported_formats is None: + continue + + if check_formats(overlay.supported_formats, pack_format): + logger.info(f"Baking overlay '{name}'") + bake_overlay(pack, overlay) + + pack.overlays.clear() + + +@configurable(validator=BakeOverlayOptions) +def bake_overlays(ctx: Context, opts: BakeOverlayOptions): + """This plugin will bake overlays based upon a selected pack format for both + data and resource packs (if they have files). + + If a format is not presented, the default will be chosen from the latest pack format available. + """ + + if opts.selected_data_format is None: + opts.selected_data_format = ctx.data.pack_format + + if opts.selected_assets_format is None: + opts.selected_assets_format = ctx.assets.pack_format + + if len(ctx.data) > 0: + bake_overlays_for_pack_format(ctx.data, opts.selected_data_format) + + if len(ctx.assets) > 0: + bake_overlays_for_pack_format(ctx.assets, opts.selected_assets_format) + + +def check_formats(supported: SupportedFormats, pack_format: int) -> bool: + """Checks whether a pack format is supported for a pack + + Originally adapted from: + https://github.com/Gamemode4Dev/GM4_Datapacks/blob/master/gm4/plugins/backwards.py#L168-L177 + """ + + match supported: + case int(value): + return value == pack_format + case [min, max]: + return min <= pack_format <= max + case {"min_inclusive": min, "max_inclusive": max}: + return min <= pack_format <= max + case _: + raise ValueError(f"Unknown supported formats structure {supported}") + + +def beet_default(ctx: Context): + ctx.require(bake_overlays) diff --git a/examples/load_overlay_baked/beet.yml b/examples/load_overlay_baked/beet.yml new file mode 100644 index 000000000..5f89bec6a --- /dev/null +++ b/examples/load_overlay_baked/beet.yml @@ -0,0 +1,8 @@ +data_pack: + load: "src" + +pipeline: [beet.contrib.bake_overlays] + +meta: + bake_overlays: + selected_data_format: 18 diff --git a/examples/load_overlay_baked/src/data/demo/functions/foo.mcfunction b/examples/load_overlay_baked/src/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..fe057d83a --- /dev/null +++ b/examples/load_overlay_baked/src/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +say hello base diff --git a/examples/load_overlay_baked/src/overlay1/data/demo/functions/foo.mcfunction b/examples/load_overlay_baked/src/overlay1/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..75c82ac79 --- /dev/null +++ b/examples/load_overlay_baked/src/overlay1/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +say hello overlay-17-18 diff --git a/examples/load_overlay_baked/src/overlay2/data/demo/functions/foo.mcfunction b/examples/load_overlay_baked/src/overlay2/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..b8df8ce0d --- /dev/null +++ b/examples/load_overlay_baked/src/overlay2/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +say hello overlay-19-20 diff --git a/examples/load_overlay_baked/src/overlay_extra/data/demo/functions/foo.mcfunction b/examples/load_overlay_baked/src/overlay_extra/data/demo/functions/foo.mcfunction new file mode 100644 index 000000000..afce1e9a2 --- /dev/null +++ b/examples/load_overlay_baked/src/overlay_extra/data/demo/functions/foo.mcfunction @@ -0,0 +1 @@ +say extra diff --git a/examples/load_overlay_baked/src/pack.mcmeta b/examples/load_overlay_baked/src/pack.mcmeta new file mode 100644 index 000000000..c72b40fe4 --- /dev/null +++ b/examples/load_overlay_baked/src/pack.mcmeta @@ -0,0 +1,18 @@ +{ + "overlays": { + "entries": [ + { + "formats": {"min_inclusive": 17, "max_inclusive": 18}, + "directory": "overlay1" + }, + { + "formats": {"min_inclusive": 19, "max_inclusive": 20}, + "directory": "overlay2" + }, + { + "formats": 21, + "directory": "overlay_missing" + } + ] + } +} diff --git a/tests/snapshots/examples__build_load_overlay_baked__0.data_pack/data/demo/function/foo.mcfunction b/tests/snapshots/examples__build_load_overlay_baked__0.data_pack/data/demo/function/foo.mcfunction new file mode 100644 index 000000000..75c82ac79 --- /dev/null +++ b/tests/snapshots/examples__build_load_overlay_baked__0.data_pack/data/demo/function/foo.mcfunction @@ -0,0 +1 @@ +say hello overlay-17-18 diff --git a/tests/snapshots/examples__build_load_overlay_baked__0.data_pack/pack.mcmeta b/tests/snapshots/examples__build_load_overlay_baked__0.data_pack/pack.mcmeta new file mode 100644 index 000000000..8b4f4d20a --- /dev/null +++ b/tests/snapshots/examples__build_load_overlay_baked__0.data_pack/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 48, + "description": "" + } +} diff --git a/tests/snapshots/examples__build_load_overlay_baked__1.resource_pack/pack.mcmeta b/tests/snapshots/examples__build_load_overlay_baked__1.resource_pack/pack.mcmeta new file mode 100644 index 000000000..7320a68ba --- /dev/null +++ b/tests/snapshots/examples__build_load_overlay_baked__1.resource_pack/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 34, + "description": "" + } +} From 1f01650956f581720f706a9aa9910efba7d2e0ba Mon Sep 17 00:00:00 2001 From: RitikShah Date: Sat, 19 Apr 2025 23:09:39 -0700 Subject: [PATCH 2/2] test: add test case for tags to ensure tags don't merge when baked --- .../src/data/demo/minecraft/tags/functions/load.json | 5 +++++ .../src/overlay1/data/minecraft/tags/functions/load.json | 5 +++++ .../data/minecraft/tags/function/load.json | 5 +++++ 3 files changed, 15 insertions(+) create mode 100644 examples/load_overlay_baked/src/data/demo/minecraft/tags/functions/load.json create mode 100644 examples/load_overlay_baked/src/overlay1/data/minecraft/tags/functions/load.json create mode 100644 tests/snapshots/examples__build_load_overlay_baked__0.data_pack/data/minecraft/tags/function/load.json diff --git a/examples/load_overlay_baked/src/data/demo/minecraft/tags/functions/load.json b/examples/load_overlay_baked/src/data/demo/minecraft/tags/functions/load.json new file mode 100644 index 000000000..dd310ac5a --- /dev/null +++ b/examples/load_overlay_baked/src/data/demo/minecraft/tags/functions/load.json @@ -0,0 +1,5 @@ +{ + "values": [ + "demo:foo" + ] +} \ No newline at end of file diff --git a/examples/load_overlay_baked/src/overlay1/data/minecraft/tags/functions/load.json b/examples/load_overlay_baked/src/overlay1/data/minecraft/tags/functions/load.json new file mode 100644 index 000000000..2d94ee414 --- /dev/null +++ b/examples/load_overlay_baked/src/overlay1/data/minecraft/tags/functions/load.json @@ -0,0 +1,5 @@ +{ + "values": [ + "demo:foo2" + ] +} \ No newline at end of file diff --git a/tests/snapshots/examples__build_load_overlay_baked__0.data_pack/data/minecraft/tags/function/load.json b/tests/snapshots/examples__build_load_overlay_baked__0.data_pack/data/minecraft/tags/function/load.json new file mode 100644 index 000000000..2d94ee414 --- /dev/null +++ b/tests/snapshots/examples__build_load_overlay_baked__0.data_pack/data/minecraft/tags/function/load.json @@ -0,0 +1,5 @@ +{ + "values": [ + "demo:foo2" + ] +} \ No newline at end of file