Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
c66ee28
generate new item model definitions
SpecialBuilder32 Jan 26, 2025
01614cf
item-model merge policy
SpecialBuilder32 Jan 26, 2025
d147ca5
Generate 1.21.3 RP models into an overlay
SpecialBuilder32 Feb 11, 2025
ea3aebd
Add CMD range padding into new item_def files
SpecialBuilder32 Feb 11, 2025
1e21a42
Replace manual predicate-entry into model data config (for end fishin…
SpecialBuilder32 Mar 14, 2025
dde3e24
Manually provide end fishing elytra item model in overlay
SpecialBuilder32 Mar 14, 2025
35a4105
Update shamir model/texture generation code for 1.21.4
SpecialBuilder32 Mar 27, 2025
3dd7d91
Add backwards compatibility for 1.21.3 metallurgy textures
SpecialBuilder32 Mar 28, 2025
d343c93
Fix references to item references that only exist as block references
SpecialBuilder32 Apr 17, 2025
217b561
Add support for special-case vanilla tempates
SpecialBuilder32 Apr 17, 2025
1cba6c7
Add rename for guidebook broken elytra texture
SpecialBuilder32 Apr 17, 2025
03d6562
[Incomplete] fixing missing advancement icon model forwarding
SpecialBuilder32 Apr 17, 2025
a4437fa
[Incomplete] Move item-def handling to Templates
SpecialBuilder32 Apr 24, 2025
d22f0bd
VanillaTemplate pulls in default model settings
SpecialBuilder32 Apr 24, 2025
2317b6c
[Incomplete] progress from desktop
SpecialBuilder32 Apr 24, 2025
edc07b1
Advancement models inherit from VanillaTemplate
SpecialBuilder32 May 6, 2025
b09bc2b
Fix shield models being invisible
SpecialBuilder32 May 20, 2025
a7447e8
Sunken treasure chests and metallurgy elytra
SpecialBuilder32 May 21, 2025
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
2 changes: 1 addition & 1 deletion beet-dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ pipeline:
directory: resource_pack
pipeline:
- resource_pack.dev_description
- gm4.plugins.resource_pack.pad_model_overrides
- gm4.plugins.resource_pack.pad_item_def_range_dispatch
- gm4.plugins.resource_pack.link_resource_pack
- gm4.plugins.output.resource_pack
- gm4.plugins.resource_pack.dump_registry
Expand Down
2 changes: 1 addition & 1 deletion beet-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ pipeline:
- gm4.plugins.output.release_resource_pack
- gm4.plugins.write_mcmeta
- gm4.plugins.manifest.update_patch
- gm4.plugins.resource_pack.pad_model_overrides
- gm4.plugins.resource_pack.pad_item_def_range_dispatch
meta:
pack_scan: resource_pack

Expand Down
1 change: 1 addition & 0 deletions gm4/plugins/autoload.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ def beet_default(ctx: Context):
ctx.require(
"beet.contrib.default",
"beet.contrib.model_merging",
"gm4.plugins.resource_pack.merge_policy",
"gm4_metallurgy.shamir_model_template.merge_policy"
)
19 changes: 19 additions & 0 deletions gm4/plugins/backwards.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from typing import Any, Tuple, Callable
from beet import Context, Pack, TextFileBase, Recipe, Function, NamespaceFile
from beet.core.utils import SupportedFormats
from gm4.plugins.resource_pack import GM4ResourcePack

logger = logging.getLogger("gm4.backwards")

Expand All @@ -18,6 +19,24 @@ def beet_default(ctx: Context):
backport(ctx.data, 48, rewrite_attributes)
backport(ctx.data, 48, rewrite_recipe)

yield from resource_pack(ctx) # bypass the yield clause, since we're already in the exit phase

# Create old resource pack assets for 1.21.3, used standalone for libraries
def resource_pack(ctx: Context):
yield
rp = ctx.inject(GM4ResourcePack)

# use a draft generator to ensure merge rules are followed
with ctx.generate.draft() as draft:
overlay = draft.assets.overlays[f"backport_57"]
overlay.supported_formats = { "min_inclusive": 0, "max_inclusive": 57 }
rp.generate_model_overrides_1_21_3(overlay)

# TODO NOTE
# call the old RP code from here, for clarity and sense - requires handling for
# sub packs AKA libraries. Wrap 1.21.3- rp code in a generate.draft to ensure proper
# merge rules apply. Note outdated methods of rp-plugin.


FURNACE_RENAMES = {
"cooking_time_spent": "CookTime",
Expand Down
94 changes: 88 additions & 6 deletions gm4/plugins/resource_pack.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
Cache,
Context,
Font,
ItemModel,
InvalidOptions,
JsonFile,
Language,
Expand All @@ -24,7 +25,8 @@
NamespaceProxy,
PluginOptions,
WrappedException,
YamlFile
YamlFile,
ResourcePack
)
from beet.contrib.link import LinkManager
from beet.contrib.optifine import OptifineProperties
Expand Down Expand Up @@ -341,7 +343,7 @@ def build(ctx: Context):
rp.update_modeldata_registry()
rp.generate_model_files()
rp.process_optifine()
rp.generate_model_overrides()
rp.generate_item_definitions()

if not ctx.assets.extra.get("pack.png") and ctx.data.extra.get("pack.png"):
ctx.assets.icon = ctx.data.icon
Expand Down Expand Up @@ -382,13 +384,29 @@ def dump_registry(ctx: Context):
JsonFile(registry).dump(origin="", path="gm4/modeldata_registry.json")
ctx.cache["modeldata_registry"].delete()

def pad_model_overrides(ctx: Context):
def pad_item_def_range_dispatch(ctx: Context):
"""Adds entries to vanilla item definitions range_dispach, filling in gaps between CMD values"""
pad_model_overrides_1_21_3(ctx, ctx.assets.overlays["backport_57"]) # call legacy pad function

for item_def in ctx.assets["minecraft"].item_models.values():
vanilla_item_def = item_def.data["model"]["fallback"]
entries: list[Any] = item_def.data["model"]["entries"]
prior_cmd = 1e8
for i, entry in reversed(list(enumerate(entries))):
if prior_cmd-(prior_cmd:=entry["threshold"]) > 1: # theres a gap to fill
entries.insert(i+1, {
"threshold": prior_cmd+1,
"model": vanilla_item_def
})

# NOTE legacy code called by plugins.backwards. Remove in 1.22 update
def pad_model_overrides_1_21_3(ctx: Context, assets: ResourcePack):
"""Adds overrides for the vanilla model, filling in gaps between CMD values"""
vanilla = ctx.inject(Vanilla)
vanilla.minecraft_version = '1.21.3'
vanilla_models_jar = vanilla.mount("assets/minecraft/models/item")

for name, model in ctx.assets["minecraft"].models.items():
for name, model in assets["minecraft"].models.items():
vanilla_overrides = [{"predicate":{},"model": f"minecraft:{name}"}] + vanilla_models_jar.assets["minecraft"].models[name].data.get("overrides", [])
overrides: list[Any] = model.data["overrides"]
prior_cmd = 1e8
Expand All @@ -400,6 +418,8 @@ def pad_model_overrides(ctx: Context):
for vanilla_override in reversed(vanilla_overrides):
overrides.insert(i+1, deepcopy(vanilla_override))

def merge_policy(ctx: Context):
ctx.assets.merge_policy.extend_namespace(ItemModel, item_definition_merging)

def link_resource_pack(ctx: Context):
"""manually links the combined resource pack to minecraft's RP folder when using 'beet dev'"""
Expand Down Expand Up @@ -469,7 +489,48 @@ def update_modeldata_registry(self):
self.logger.info(f"Removing undefined custom_model_data from {item_id} registry: '{ref}'")
del reg[ref]

def generate_model_overrides(self):
def generate_item_definitions(self):
"""Generates item-model-definition files in the 'minecraft' namespace, adding range_dispatch entries for each custom_model_data value"""
vanilla = self.ctx.inject(Vanilla)
vanilla.minecraft_version = '1.21.4'
vanilla_item_defs_jar = vanilla.mount("assets/minecraft/items")
# group models by item id
for item_id in {i for m in self.opts.model_data for i in m.item.entries()}:
models = filter(lambda m: item_id in m.item.entries(), self.opts.model_data) # with this item_id
models = sorted(models, key=lambda m: self.retrieve_index(m.reference)[0])

vanilla_itemdef = vanilla_item_defs_jar.assets.item_models[f"minecraft:{item_id}"].data["model"]

new_itemdef: dict[str, Any] = {
"model": {
"type": "minecraft:range_dispatch",
"property": "minecraft:custom_model_data",
"entries": [],
"fallback": vanilla_itemdef
}
}
itemdef_entries: list[Any] = new_itemdef["model"]["entries"]

for model in models:
m = model.model[item_id] # model string, or predicate settings, for this particular item id
# NOTE only end fishing elytra utlize predicate specification here.
# TODO handle predicate format?

itemdef_entries.append({
"threshold": self.cmd_prefix+self.retrieve_index(model.reference)[0],
"model": {
"type": "minecraft:model",
"model": m # TODO this is where select customs settings will be moved!
}
})

itemdef_entries.sort(key=lambda entry: entry["threshold"]) # sort entries ascending
self.ctx.assets.item_models[f"minecraft:{item_id}"] = ItemModel(new_itemdef)



# NOTE legacy code called by plugins.backwards. Remove in 1.22 update
def generate_model_overrides_1_21_3(self, pack: ResourcePack):
"""Generates item model overrides in the 'minecraft' namespace, adding predicates for custom_model_data"""
vanilla = self.ctx.inject(Vanilla)
vanilla.minecraft_version = '1.21.3'
Expand Down Expand Up @@ -503,7 +564,7 @@ def generate_model_overrides(self):
} | pred.get("predicate", {}),
"model": pred["model"] if pred.get("user_defined") else m # type:ignore , user-defined model predicates use their own model reference. m is a string in all other cases
})
self.ctx.assets.models[f"minecraft:item/{item_id}"] = Model(vanilla_model)
pack.models[f"minecraft:item/{item_id}"] = Model(vanilla_model)

def retrieve_index(self, reference: str) -> tuple[int, KeyError|None]:
"""retrieves the CMD value for the given reference"""
Expand Down Expand Up @@ -649,6 +710,27 @@ def generate_gui_fonts(self):
"providers": providers
}))

def item_definition_merging(pack: ResourcePack, path: str, current: ItemModel, conflict: ItemModel) -> bool:
"""ItemModel beet merge rule for combining range_dispatch properly"""
if current.data["model"].get("type") != "minecraft:range_dispatch" or conflict.data["model"].get("type") != "minecraft:range_dispatch":
parent_logger.warning(f"item model {path} was sent to merging but only one file uses 'range_dispatch'")
return False

merged_entries: list[Any] = current.data["model"]["entries"]
merged_entries.extend(conflict.data["model"]["entries"])
merged_entries.sort(key=lambda entry: entry["threshold"])

# remove duplicate entries - relying on each CMD to be unique already
seen_values: set[int] = set()
for entry in merged_entries.copy():
if (v:=entry["threshold"]) not in seen_values:
seen_values.add(v)
else: # otherwise its a duplicate
merged_entries.remove(entry)

return True


class TranslationLinter(Reducer):
"""Mecha linter ensuring all translation keys are registered in translations.csv"""
def __init__(self, ctx: Context):
Expand Down
1 change: 1 addition & 0 deletions lib_custom_crafters/beet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ resource_pack:

require:
- gm4.plugins.resource_pack
- gm4.plugins.backwards.resource_pack
- gm4_guidebook.generate_guidebooks.load_page_data
- gm4_guidebook.generate_guidebooks.load_custom_recipes
- gm4.plugins.player_heads
Expand Down
Loading