From df526c654ea4e23d7e438a567ae235383212462b Mon Sep 17 00:00:00 2001 From: Swedz Date: Wed, 27 Nov 2024 09:32:20 -0500 Subject: [PATCH 1/7] Make machine model api more extensible and make machine casings use resource locations --- .../datagen/model/MachineCasingsProvider.java | 6 +- .../machines/MachineBlockEntityRenderer.java | 2 +- .../machines/models/MachineBakedModel.java | 63 ++++++++++------- .../machines/models/MachineModelBaker.java | 34 +++++++++ .../machines/models/MachineOverlaysJson.java | 67 ++++++++++++++++++ .../machines/models/MachineUnbakedModel.java | 70 ++++++------------- .../textures/MITextures.java | 2 +- .../model/MachineModelsToGenerate.java | 2 +- .../machines/models/MachineCasing.java | 8 ++- .../machines/models/MachineCasings.java | 28 +++++--- .../multiblocks/HatchBlockEntity.java | 11 +-- 11 files changed, 195 insertions(+), 98 deletions(-) create mode 100644 src/client/java/aztech/modern_industrialization/machines/models/MachineModelBaker.java create mode 100644 src/client/java/aztech/modern_industrialization/machines/models/MachineOverlaysJson.java diff --git a/src/client/java/aztech/modern_industrialization/datagen/model/MachineCasingsProvider.java b/src/client/java/aztech/modern_industrialization/datagen/model/MachineCasingsProvider.java index cabf5cb9f..af7196993 100644 --- a/src/client/java/aztech/modern_industrialization/datagen/model/MachineCasingsProvider.java +++ b/src/client/java/aztech/modern_industrialization/datagen/model/MachineCasingsProvider.java @@ -81,16 +81,16 @@ protected void registerModels() { } private void imitateBlock(MachineCasing casing, Block block) { - getBuilder(casing.name) + getBuilder(casing.key.toString()) .customLoader((bmb, existingFileHelper) -> new UseBlockModelModelBuilder<>(block, bmb, existingFileHelper)); } private void cubeBottomTop(MachineCasing casing, String side, String bottom, String top) { - cubeBottomTop(casing.name, MI.id(side), MI.id(bottom), MI.id(top)); + cubeBottomTop(casing.key.toString(), MI.id(side), MI.id(bottom), MI.id(top)); } private void cubeAll(MachineCasing casing, String side) { - cubeAll(casing.name, MI.id(side)); + cubeAll(casing.key.toString(), MI.id(side)); } @Override diff --git a/src/client/java/aztech/modern_industrialization/machines/MachineBlockEntityRenderer.java b/src/client/java/aztech/modern_industrialization/machines/MachineBlockEntityRenderer.java index 411d0daaa..ef31f3a4d 100644 --- a/src/client/java/aztech/modern_industrialization/machines/MachineBlockEntityRenderer.java +++ b/src/client/java/aztech/modern_industrialization/machines/MachineBlockEntityRenderer.java @@ -69,7 +69,7 @@ private BakedQuad getCachedQuad(MachineModelClientData data, Direction d) { var cachedQuads = quadCache.computeIfAbsent(casing, c -> new Object[36]); if (cachedQuads[cachedQuadIndex] == null) { - TextureAtlasSprite sprite = model == null ? null : MachineBakedModel.getSprite(model.getSprites(casing), d, facing, true); + TextureAtlasSprite sprite = model == null ? null : model.getSprite(model.getSprites(casing), d, facing, true); if (sprite != null) { var vc = new QuadBakingVertexConsumer(); cachedQuads[cachedQuadIndex] = ModelHelper.bakeSprite(vc, d, sprite, -2 * MachineBakedModel.Z_OFFSET); diff --git a/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java b/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java index 8012f6007..ce537a945 100644 --- a/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java +++ b/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java @@ -23,7 +23,6 @@ */ package aztech.modern_industrialization.machines.models; -import aztech.modern_industrialization.MI; import aztech.modern_industrialization.util.ModelHelper; import java.util.ArrayList; import java.util.List; @@ -39,6 +38,7 @@ import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; @@ -57,7 +57,8 @@ public class MachineBakedModel implements IDynamicBakedModel { public static final String CASING_FOLDER = "machine_casing"; public static ModelResourceLocation getCasingModelId(MachineCasing casing) { - return ModelResourceLocation.standalone(MI.id(CASING_FOLDER + "/" + casing.name)); + return ModelResourceLocation + .standalone(ResourceLocation.fromNamespaceAndPath(casing.key.getNamespace(), CASING_FOLDER + "/" + casing.key.getPath())); } public static BakedModel getCasingModel(MachineCasing casing) { @@ -65,14 +66,16 @@ public static BakedModel getCasingModel(MachineCasing casing) { } private final MachineCasing baseCasing; + private final int[] outputOverlayIndexes; private final TextureAtlasSprite[] defaultOverlays; - private final Map tieredOverlays; + private final Map tieredOverlays; private final MachineModelClientData defaultData; - MachineBakedModel(MachineCasing baseCasing, - TextureAtlasSprite[] defaultOverlays, - Map tieredOverlays) { + public MachineBakedModel(MachineCasing baseCasing, + int[] outputOverlayIndexes, TextureAtlasSprite[] defaultOverlays, + Map tieredOverlays) { this.baseCasing = baseCasing; + this.outputOverlayIndexes = outputOverlayIndexes; this.defaultOverlays = defaultOverlays; this.tieredOverlays = tieredOverlays; this.defaultData = new MachineModelClientData(baseCasing, Direction.NORTH); @@ -86,14 +89,14 @@ public TextureAtlasSprite[] getSprites(@Nullable MachineCasing casing) { if (casing == null) { return defaultOverlays; } - return tieredOverlays.getOrDefault(casing.name, defaultOverlays); + return tieredOverlays.getOrDefault(casing.key, defaultOverlays); } /** * Returns null if nothing should be rendered. */ @Nullable - public static TextureAtlasSprite getSprite(TextureAtlasSprite[] sprites, Direction side, Direction facingDirection, boolean isActive) { + public TextureAtlasSprite getSprite(TextureAtlasSprite[] sprites, Direction side, Direction facingDirection, boolean isActive) { int spriteId; if (side.getAxis().isHorizontal()) { spriteId = (facingDirection.get2DDataValue() - side.get2DDataValue() + 4) % 4 * 2; @@ -121,44 +124,50 @@ public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState return getCasingModel(casing).getModelData(level, pos, state, modelData); } - @Override - public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand, - @NotNull ModelData extraData, @Nullable RenderType renderType) { - var data = extraData.get(MachineModelClientData.KEY); - if (data == null) { - data = defaultData; - } - - MachineCasing casing = Objects.requireNonNullElse(data.casing, baseCasing); - var sprites = getSprites(casing); - + protected @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand, + @NotNull ModelData extraData, @Nullable RenderType renderType, + @NotNull MachineModelClientData data, @NotNull MachineCasing casing, + @NotNull TextureAtlasSprite[] sprites, @NotNull QuadBakingVertexConsumer vertexConsumer) { List quads = new ArrayList<>(); - var vc = new QuadBakingVertexConsumer(); if (side != null) { - // Casing quads.addAll(getCasingModel(casing).getQuads(state, side, rand, extraData, renderType)); - // Machine overlays + TextureAtlasSprite sprite = getSprite(sprites, side, data.frontDirection, false); if (sprite != null) { - quads.add(ModelHelper.bakeSprite(vc, side, sprite, -Z_OFFSET)); + quads.add(ModelHelper.bakeSprite(vertexConsumer, side, sprite, -Z_OFFSET)); } } - // Output overlays if (data.outputDirection != null && side == data.outputDirection) { - quads.add(ModelHelper.bakeSprite(vc, data.outputDirection, sprites[24], -3 * Z_OFFSET)); + quads.add(ModelHelper.bakeSprite(vertexConsumer, data.outputDirection, sprites[outputOverlayIndexes[0]], -3 * Z_OFFSET)); if (data.itemAutoExtract) { - quads.add(ModelHelper.bakeSprite(vc, data.outputDirection, sprites[25], -3 * Z_OFFSET)); + quads.add(ModelHelper.bakeSprite(vertexConsumer, data.outputDirection, sprites[outputOverlayIndexes[1]], -3 * Z_OFFSET)); } if (data.fluidAutoExtract) { - quads.add(ModelHelper.bakeSprite(vc, data.outputDirection, sprites[26], -3 * Z_OFFSET)); + quads.add(ModelHelper.bakeSprite(vertexConsumer, data.outputDirection, sprites[outputOverlayIndexes[2]], -3 * Z_OFFSET)); } } return quads; } + @Override + public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand, + @NotNull ModelData extraData, @Nullable RenderType renderType) { + var data = extraData.get(MachineModelClientData.KEY); + if (data == null) { + data = defaultData; + } + + MachineCasing casing = Objects.requireNonNullElse(data.casing, baseCasing); + var sprites = getSprites(casing); + + var vc = new QuadBakingVertexConsumer(); + + return getQuads(state, side, rand, extraData, renderType, data, casing, sprites, vc); + } + @Override public boolean useAmbientOcclusion() { return true; diff --git a/src/client/java/aztech/modern_industrialization/machines/models/MachineModelBaker.java b/src/client/java/aztech/modern_industrialization/machines/models/MachineModelBaker.java new file mode 100644 index 000000000..ebe775847 --- /dev/null +++ b/src/client/java/aztech/modern_industrialization/machines/models/MachineModelBaker.java @@ -0,0 +1,34 @@ +/* + * MIT License + * + * Copyright (c) 2020 Azercoco & Technici4n + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package aztech.modern_industrialization.machines.models; + +import java.util.Map; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.ResourceLocation; + +public interface MachineModelBaker { + MachineBakedModel bake(MachineCasing baseCasing, + int[] outputOverlayIndexes, TextureAtlasSprite[] defaultOverlays, + Map tieredOverlays); +} diff --git a/src/client/java/aztech/modern_industrialization/machines/models/MachineOverlaysJson.java b/src/client/java/aztech/modern_industrialization/machines/models/MachineOverlaysJson.java new file mode 100644 index 000000000..d5c508e15 --- /dev/null +++ b/src/client/java/aztech/modern_industrialization/machines/models/MachineOverlaysJson.java @@ -0,0 +1,67 @@ +/* + * MIT License + * + * Copyright (c) 2020 Azercoco & Technici4n + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package aztech.modern_industrialization.machines.models; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import java.lang.reflect.Field; +import net.minecraft.client.resources.model.Material; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.InventoryMenu; + +public interface MachineOverlaysJson { + Material[] toSpriteIds(); + + int[] getOutputSpriteIndexes(); + + Gson GSON = new GsonBuilder().registerTypeAdapter(ResourceLocation.class, new ResourceLocation.Serializer()).create(); + + static O parse(Class clazz, JsonObject json, MachineOverlaysJson defaultOverlay) { + O overlays = GSON.fromJson(json, clazz); + + if (defaultOverlay != null) { + try { + for (Field field : clazz.getDeclaredFields()) { + if (field.get(overlays) == null) { + field.set(overlays, field.get(defaultOverlay)); + } + } + } catch (IllegalAccessException ex) { + throw new RuntimeException("Failed to copy fields from default overlay", ex); + } + } + + return overlays; + } + + default Material select(ResourceLocation... candidates) { + for (ResourceLocation id : candidates) { + if (id != null) { + return new Material(InventoryMenu.BLOCK_ATLAS, id); + } + } + return null; + } +} diff --git a/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java b/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java index 15a5ddd01..3029f47a8 100644 --- a/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java +++ b/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java @@ -24,8 +24,6 @@ package aztech.modern_industrialization.machines.models; import aztech.modern_industrialization.MI; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import java.util.HashMap; import java.util.Map; @@ -38,34 +36,36 @@ import net.minecraft.client.resources.model.ModelState; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; -import net.minecraft.world.inventory.InventoryMenu; import net.neoforged.neoforge.client.model.geometry.IGeometryBakingContext; import net.neoforged.neoforge.client.model.geometry.IGeometryLoader; import net.neoforged.neoforge.client.model.geometry.IUnbakedGeometry; -import org.jetbrains.annotations.Nullable; -public class MachineUnbakedModel implements IUnbakedGeometry { +public class MachineUnbakedModel implements IUnbakedGeometry> { public static final ResourceLocation LOADER_ID = MI.id("machine"); - public static final IGeometryLoader LOADER = (jsonObject, deserializationContext) -> { - return new MachineUnbakedModel(jsonObject); + public static final IGeometryLoader> LOADER = (jsonObject, deserializationContext) -> { + return new MachineUnbakedModel(OverlaysJson.class, MachineBakedModel::new, jsonObject); }; - private static final Gson GSON = new GsonBuilder().registerTypeAdapter(ResourceLocation.class, new ResourceLocation.Serializer()).create(); - + private final MachineModelBaker modelBaker; private final MachineCasing baseCasing; + private final int[] outputOverlayIndexes; private final Material[] defaultOverlays; - private final Map tieredOverlays = new HashMap<>(); + private final Map tieredOverlays = new HashMap<>(); + + public MachineUnbakedModel(Class overlayClass, MachineModelBaker modelBaker, JsonObject obj) { + this.modelBaker = modelBaker; - private MachineUnbakedModel(JsonObject obj) { this.baseCasing = MachineCasings.get(GsonHelper.getAsString(obj, "casing")); - var defaultOverlaysJson = OverlaysJson.parse(GsonHelper.getAsJsonObject(obj, "default_overlays"), null); + var defaultOverlaysJson = MachineOverlaysJson.parse(overlayClass, GsonHelper.getAsJsonObject(obj, "default_overlays"), null); + this.outputOverlayIndexes = defaultOverlaysJson.getOutputSpriteIndexes(); this.defaultOverlays = defaultOverlaysJson.toSpriteIds(); var tieredOverlays = GsonHelper.getAsJsonObject(obj, "tiered_overlays", new JsonObject()); for (var casingTier : tieredOverlays.keySet()) { - var casingOverlaysJson = OverlaysJson.parse(GsonHelper.getAsJsonObject(tieredOverlays, casingTier), defaultOverlaysJson); - this.tieredOverlays.put(casingTier, casingOverlaysJson.toSpriteIds()); + var casingOverlaysJson = MachineOverlaysJson.parse(overlayClass, GsonHelper.getAsJsonObject(tieredOverlays, casingTier), + defaultOverlaysJson); + this.tieredOverlays.put(ResourceLocation.parse(casingTier), casingOverlaysJson.toSpriteIds()); } } @@ -73,11 +73,11 @@ private MachineUnbakedModel(JsonObject obj) { public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, ItemOverrides overrides) { var defaultOverlays = loadSprites(spriteGetter, this.defaultOverlays); - var tieredOverlays = new HashMap(); + var tieredOverlays = new HashMap(); for (var entry : this.tieredOverlays.entrySet()) { tieredOverlays.put(entry.getKey(), loadSprites(spriteGetter, entry.getValue())); } - return new MachineBakedModel(baseCasing, defaultOverlays, tieredOverlays); + return modelBaker.bake(baseCasing, outputOverlayIndexes, defaultOverlays, tieredOverlays); } private static TextureAtlasSprite[] loadSprites(Function textureGetter, Material[] ids) { @@ -90,7 +90,7 @@ private static TextureAtlasSprite[] loadSprites(Function registeredCasings = new HashMap<>(); + public static final Map registeredCasings = new HashMap<>(); public static final MachineCasing BRICKED_BRONZE = create("bricked_bronze"); public static final MachineCasing BRICKED_STEEL = create("bricked_steel"); @@ -54,22 +56,30 @@ public class MachineCasings { KubeJSProxy.instance.fireRegisterMachineCasingsEvent(); } - public static MachineCasing create(String name) { - if (registeredCasings.containsKey(name)) { - throw new IllegalArgumentException("Duplicate machine casing definition: " + name); + public static MachineCasing create(ResourceLocation key) { + if (registeredCasings.containsKey(key)) { + throw new IllegalArgumentException("Duplicate machine casing definition: " + key); } - MachineCasing casing = new MachineCasing(name); - registeredCasings.put(name, casing); + MachineCasing casing = new MachineCasing(key); + registeredCasings.put(key, casing); return casing; } - public static MachineCasing get(String name) { - MachineCasing casing = registeredCasings.get(name); + public static MachineCasing create(String name) { + return create(MI.id(name)); + } + + public static MachineCasing get(ResourceLocation key) { + MachineCasing casing = registeredCasings.get(key); if (casing != null) { return casing; } else { - throw new IllegalArgumentException("Machine casing model \"" + name + "\" does not exist."); + throw new IllegalArgumentException("Machine casing model \"" + key + "\" does not exist."); } } + + public static MachineCasing get(String name) { + return get(ResourceLocation.isValidPath(name) ? MI.id(name) : ResourceLocation.parse(name)); + } } diff --git a/src/main/java/aztech/modern_industrialization/machines/multiblocks/HatchBlockEntity.java b/src/main/java/aztech/modern_industrialization/machines/multiblocks/HatchBlockEntity.java index 43cbdbaff..8c81c74ad 100644 --- a/src/main/java/aztech/modern_industrialization/machines/multiblocks/HatchBlockEntity.java +++ b/src/main/java/aztech/modern_industrialization/machines/multiblocks/HatchBlockEntity.java @@ -39,6 +39,7 @@ import java.util.Objects; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; @@ -51,19 +52,19 @@ public HatchBlockEntity(BEP bep, MachineGuiParameters guiParams, OrientationComp @Override public void writeClientNbt(CompoundTag tag, HolderLookup.Provider registries) { if (matchedCasing != null) { - tag.putString("matchedCasing", matchedCasing); + tag.putString("matchedCasing", matchedCasing.toString()); } } @Override public void readClientNbt(CompoundTag tag, HolderLookup.Provider registries) { - matchedCasing = tag.contains("matchedCasing") ? tag.getString("matchedCasing") : null; + matchedCasing = tag.contains("matchedCasing") ? ResourceLocation.tryParse(tag.getString("matchedCasing")) : null; } }); } - private String lastSyncedMachineCasing = null; - private String matchedCasing = null; + private ResourceLocation lastSyncedMachineCasing = null; + private ResourceLocation matchedCasing = null; public abstract HatchType getHatchType(); @@ -89,7 +90,7 @@ public void unlink() { } public void link(MachineCasing casing) { - matchedCasing = casing.name; + matchedCasing = casing.key; } protected void clearMachineLock() { From f0052a6126f6109f98ece0fdc6b2a5b7616f49b6 Mon Sep 17 00:00:00 2001 From: Swedz Date: Wed, 27 Nov 2024 09:54:29 -0500 Subject: [PATCH 2/7] Add translations for machine casings --- docs/ADDING_MACHINES.md | 6 +-- .../modern_industrialization/lang/en_us.json | 23 ++++++++++ .../api/energy/CableTier.java | 2 +- .../machine/RegisterCasingsEventJS.java | 15 +++---- .../translation/TranslationProvider.java | 6 +++ .../machines/models/MachineCasing.java | 9 ++++ .../machines/models/MachineCasings.java | 44 ++++++++++--------- 7 files changed, 71 insertions(+), 34 deletions(-) diff --git a/docs/ADDING_MACHINES.md b/docs/ADDING_MACHINES.md index a3196abaa..2f1238780 100644 --- a/docs/ADDING_MACHINES.md +++ b/docs/ADDING_MACHINES.md @@ -327,12 +327,12 @@ remember that the top, side and bottom textures of a casing must be `modern_indu For example: ```js MIMachineEvents.registerCasings(event => { - // Register two casings. + // Register a casing. // This doesn't register any model! Either add models or add the top/side/bottom textures. - event.register("my_fancy_casing", "my_other_casing"); + event.register("fancy_casing", "Fancy"); // This registers a new casing with the same model as a diamond block! - event.registerBlockImitation("my_diamond_casing", "minecraft:diamond_block"); + event.registerBlockImitation("diamond_casing", "Diamond", "minecraft:diamond_block"); }) ``` diff --git a/src/generated/resources/assets/modern_industrialization/lang/en_us.json b/src/generated/resources/assets/modern_industrialization/lang/en_us.json index 69142dc08..4eea3ca3b 100644 --- a/src/generated/resources/assets/modern_industrialization/lang/en_us.json +++ b/src/generated/resources/assets/modern_industrialization/lang/en_us.json @@ -1090,6 +1090,29 @@ "key.categories.modern_industrialization.modern_industrialization": "Modern Industrialization", "key.modern_industrialization.toggle_3x3": "Toggle 3x3 Mining", "key.modern_industrialization.toggle_flight": "Toggle Flight", + "machine_casing.modern_industrialization.bricked_bronze": "Bricked Bronze", + "machine_casing.modern_industrialization.bricked_steel": "Bricked Steel", + "machine_casing.modern_industrialization.bricks": "Bricks", + "machine_casing.modern_industrialization.bronze": "Bronze", + "machine_casing.modern_industrialization.bronze_plated_bricks": "Bronze Plated Bricks", + "machine_casing.modern_industrialization.clean_stainless_steel_machine_casing": "Clean Stainless Steel", + "machine_casing.modern_industrialization.configurable_tank": "Configurable Tank", + "machine_casing.modern_industrialization.ev": "EV", + "machine_casing.modern_industrialization.firebricks": "Firebricks", + "machine_casing.modern_industrialization.frostproof_machine_casing": "Frostproof", + "machine_casing.modern_industrialization.heatproof_machine_casing": "Heatproof", + "machine_casing.modern_industrialization.hv": "HV", + "machine_casing.modern_industrialization.lv": "LV", + "machine_casing.modern_industrialization.mv": "MV", + "machine_casing.modern_industrialization.nuclear_casing": "Nuclear", + "machine_casing.modern_industrialization.plasma_handling_iridium_machine_casing": "Plasma Handling Iridium", + "machine_casing.modern_industrialization.solid_titanium_machine_casing": "Solid Titanium", + "machine_casing.modern_industrialization.stainless_steel_machine_casing_pipe": "Stainless Steel Pipe", + "machine_casing.modern_industrialization.steel": "Steel", + "machine_casing.modern_industrialization.steel_crate": "Steel Crate", + "machine_casing.modern_industrialization.superconductor": "Superconductor", + "machine_casing.modern_industrialization.titanium": "Titanium", + "machine_casing.modern_industrialization.titanium_machine_casing_pipe": "Titanium Pipe", "rei_categories.modern_industrialization.assembler": "Assembler", "rei_categories.modern_industrialization.bronze_compressor": "Compressor", "rei_categories.modern_industrialization.bronze_cutting_machine": "Cutting Machine", diff --git a/src/main/java/aztech/modern_industrialization/api/energy/CableTier.java b/src/main/java/aztech/modern_industrialization/api/energy/CableTier.java index 4f85f2f4c..6a1c12f5a 100644 --- a/src/main/java/aztech/modern_industrialization/api/energy/CableTier.java +++ b/src/main/java/aztech/modern_industrialization/api/energy/CableTier.java @@ -83,7 +83,7 @@ public CableTier(String name, String shortEnglishName, String longEnglishName, l this.longEnglishName = longEnglishName; this.eu = eu; this.itemKey = itemKey; - this.casing = MachineCasings.create(name); + this.casing = MachineCasings.create(name, shortEnglishName); this.builtin = builtin; } diff --git a/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java b/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java index 884fd2f34..0d4595442 100644 --- a/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java +++ b/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java @@ -30,22 +30,19 @@ import net.minecraft.resources.ResourceLocation; public class RegisterCasingsEventJS implements KubeEvent { - public void register(String... names) { - for (var name : names) { - if (name.contains(":")) { - throw new IllegalArgumentException("Casing name cannot contain ':'."); - } - - MachineCasings.create(name); + public void register(String name, String englishName) { + if (name.contains(":")) { + throw new IllegalArgumentException("Casing name cannot contain ':'."); } + MachineCasings.create(name, englishName); } - public void registerBlockImitation(String name, ResourceLocation block) { + public void registerBlockImitation(String name, String englishName, ResourceLocation block) { Objects.requireNonNull(block, "block may not be null"); if (name.contains(":")) { throw new IllegalArgumentException("Casing name cannot contain ':'."); } - MachineCasingImitations.imitationsToGenerate.put(MachineCasings.create(name), block); + MachineCasingImitations.imitationsToGenerate.put(MachineCasings.create(name, englishName), block); } } diff --git a/src/main/java/aztech/modern_industrialization/datagen/translation/TranslationProvider.java b/src/main/java/aztech/modern_industrialization/datagen/translation/TranslationProvider.java index dfeb2d4ec..337fd40e0 100644 --- a/src/main/java/aztech/modern_industrialization/datagen/translation/TranslationProvider.java +++ b/src/main/java/aztech/modern_industrialization/datagen/translation/TranslationProvider.java @@ -32,6 +32,7 @@ import aztech.modern_industrialization.datagen.tag.TagsToGenerate; import aztech.modern_industrialization.definition.Definition; import aztech.modern_industrialization.machines.blockentities.multiblocks.ElectricBlastFurnaceBlockEntity; +import aztech.modern_industrialization.machines.models.MachineCasings; import com.google.common.hash.Hashing; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -132,6 +133,11 @@ private void collectTranslationEntries() { addTranslation(cableTier.shortEnglishKey(), cableTier.shortEnglishName); addTranslation(cableTier.longEnglishKey(), cableTier.longEnglishName); } + + for (var casing : MachineCasings.registeredCasings.values()) { + var englishName = MachineCasings.casingNames.get(casing.key); + addTranslation(casing.getTranslationKey(), englishName); + } } @Override diff --git a/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java b/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java index df6f8f259..0c96a0b1b 100644 --- a/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java +++ b/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java @@ -23,6 +23,7 @@ */ package aztech.modern_industrialization.machines.models; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; public class MachineCasing { @@ -31,4 +32,12 @@ public class MachineCasing { MachineCasing(ResourceLocation key) { this.key = key; } + + public String getTranslationKey() { + return "machine_casing.%s.%s".formatted(key.getNamespace(), key.getPath()); + } + + public Component getDisplayName() { + return Component.translatable(getTranslationKey()); + } } diff --git a/src/main/java/aztech/modern_industrialization/machines/models/MachineCasings.java b/src/main/java/aztech/modern_industrialization/machines/models/MachineCasings.java index ae5c9a324..767b006be 100644 --- a/src/main/java/aztech/modern_industrialization/machines/models/MachineCasings.java +++ b/src/main/java/aztech/modern_industrialization/machines/models/MachineCasings.java @@ -32,42 +32,44 @@ public class MachineCasings { public static final Map registeredCasings = new HashMap<>(); + public static final Map casingNames = new HashMap<>(); - public static final MachineCasing BRICKED_BRONZE = create("bricked_bronze"); - public static final MachineCasing BRICKED_STEEL = create("bricked_steel"); - public static final MachineCasing BRICKS = create("bricks"); - public static final MachineCasing BRONZE = create("bronze"); - public static final MachineCasing BRONZE_PLATED_BRICKS = create("bronze_plated_bricks"); - public static final MachineCasing CLEAN_STAINLESS_STEEL = create("clean_stainless_steel_machine_casing"); - public static final MachineCasing CONFIGURABLE_TANK = create("configurable_tank"); - public static final MachineCasing STAINLESS_STEEL_PIPE = create("stainless_steel_machine_casing_pipe"); - public static final MachineCasing FIREBRICKS = create("firebricks"); - public static final MachineCasing FROSTPROOF = create("frostproof_machine_casing"); - public static final MachineCasing HEATPROOF = create("heatproof_machine_casing"); - public static final MachineCasing STEEL = create("steel"); - public static final MachineCasing STEEL_CRATE = create("steel_crate"); - public static final MachineCasing TITANIUM = create("titanium"); - public static final MachineCasing TITANIUM_PIPE = create("titanium_machine_casing_pipe"); - public static final MachineCasing SOLID_TITANIUM = create("solid_titanium_machine_casing"); - public static final MachineCasing NUCLEAR = create("nuclear_casing"); - public static final MachineCasing PLASMA_HANDLING_IRIDIUM = create("plasma_handling_iridium_machine_casing"); + public static final MachineCasing BRICKED_BRONZE = create("bricked_bronze", "Bricked Bronze"); + public static final MachineCasing BRICKED_STEEL = create("bricked_steel", "Bricked Steel"); + public static final MachineCasing BRICKS = create("bricks", "Bricks"); + public static final MachineCasing BRONZE = create("bronze", "Bronze"); + public static final MachineCasing BRONZE_PLATED_BRICKS = create("bronze_plated_bricks", "Bronze Plated Bricks"); + public static final MachineCasing CLEAN_STAINLESS_STEEL = create("clean_stainless_steel_machine_casing", "Clean Stainless Steel"); + public static final MachineCasing CONFIGURABLE_TANK = create("configurable_tank", "Configurable Tank"); + public static final MachineCasing STAINLESS_STEEL_PIPE = create("stainless_steel_machine_casing_pipe", "Stainless Steel Pipe"); + public static final MachineCasing FIREBRICKS = create("firebricks", "Firebricks"); + public static final MachineCasing FROSTPROOF = create("frostproof_machine_casing", "Frostproof"); + public static final MachineCasing HEATPROOF = create("heatproof_machine_casing", "Heatproof"); + public static final MachineCasing STEEL = create("steel", "Steel"); + public static final MachineCasing STEEL_CRATE = create("steel_crate", "Steel Crate"); + public static final MachineCasing TITANIUM = create("titanium", "Titanium"); + public static final MachineCasing TITANIUM_PIPE = create("titanium_machine_casing_pipe", "Titanium Pipe"); + public static final MachineCasing SOLID_TITANIUM = create("solid_titanium_machine_casing", "Solid Titanium"); + public static final MachineCasing NUCLEAR = create("nuclear_casing", "Nuclear"); + public static final MachineCasing PLASMA_HANDLING_IRIDIUM = create("plasma_handling_iridium_machine_casing", "Plasma Handling Iridium"); static { KubeJSProxy.instance.fireRegisterMachineCasingsEvent(); } - public static MachineCasing create(ResourceLocation key) { + public static MachineCasing create(ResourceLocation key, String englishName) { if (registeredCasings.containsKey(key)) { throw new IllegalArgumentException("Duplicate machine casing definition: " + key); } MachineCasing casing = new MachineCasing(key); registeredCasings.put(key, casing); + casingNames.put(key, englishName); return casing; } - public static MachineCasing create(String name) { - return create(MI.id(name)); + public static MachineCasing create(String name, String englishName) { + return create(MI.id(name), englishName); } public static MachineCasing get(ResourceLocation key) { From e8607c05fcac98c718ca6ee15388280651a9e44f Mon Sep 17 00:00:00 2001 From: Swedz Date: Wed, 27 Nov 2024 10:29:35 -0500 Subject: [PATCH 3/7] Make getDisplayName return MutableComponent --- .../machines/models/MachineCasing.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java b/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java index 0c96a0b1b..5e930e4af 100644 --- a/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java +++ b/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java @@ -24,6 +24,7 @@ package aztech.modern_industrialization.machines.models; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; public class MachineCasing { @@ -37,7 +38,7 @@ public String getTranslationKey() { return "machine_casing.%s.%s".formatted(key.getNamespace(), key.getPath()); } - public Component getDisplayName() { + public MutableComponent getDisplayName() { return Component.translatable(getTranslationKey()); } } From 81cbdfb1189ac85a801cbb08e21cc15446471af2 Mon Sep 17 00:00:00 2001 From: Swedz Date: Mon, 9 Dec 2024 05:38:35 -0500 Subject: [PATCH 4/7] Address reviews --- .../machines/MachineBlockEntityRenderer.java | 2 +- .../machines/models/MachineBakedModel.java | 55 +++++++-------- .../machines/models/MachineModelBaker.java | 34 ---------- .../machines/models/MachineOverlaysJson.java | 67 ------------------- .../machines/models/MachineUnbakedModel.java | 64 ++++++++++++------ 5 files changed, 69 insertions(+), 153 deletions(-) delete mode 100644 src/client/java/aztech/modern_industrialization/machines/models/MachineModelBaker.java delete mode 100644 src/client/java/aztech/modern_industrialization/machines/models/MachineOverlaysJson.java diff --git a/src/client/java/aztech/modern_industrialization/machines/MachineBlockEntityRenderer.java b/src/client/java/aztech/modern_industrialization/machines/MachineBlockEntityRenderer.java index ef31f3a4d..411d0daaa 100644 --- a/src/client/java/aztech/modern_industrialization/machines/MachineBlockEntityRenderer.java +++ b/src/client/java/aztech/modern_industrialization/machines/MachineBlockEntityRenderer.java @@ -69,7 +69,7 @@ private BakedQuad getCachedQuad(MachineModelClientData data, Direction d) { var cachedQuads = quadCache.computeIfAbsent(casing, c -> new Object[36]); if (cachedQuads[cachedQuadIndex] == null) { - TextureAtlasSprite sprite = model == null ? null : model.getSprite(model.getSprites(casing), d, facing, true); + TextureAtlasSprite sprite = model == null ? null : MachineBakedModel.getSprite(model.getSprites(casing), d, facing, true); if (sprite != null) { var vc = new QuadBakingVertexConsumer(); cachedQuads[cachedQuadIndex] = ModelHelper.bakeSprite(vc, d, sprite, -2 * MachineBakedModel.Z_OFFSET); diff --git a/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java b/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java index ce537a945..8ea6c87f3 100644 --- a/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java +++ b/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java @@ -57,8 +57,7 @@ public class MachineBakedModel implements IDynamicBakedModel { public static final String CASING_FOLDER = "machine_casing"; public static ModelResourceLocation getCasingModelId(MachineCasing casing) { - return ModelResourceLocation - .standalone(ResourceLocation.fromNamespaceAndPath(casing.key.getNamespace(), CASING_FOLDER + "/" + casing.key.getPath())); + return ModelResourceLocation.standalone(casing.key.withPath(p -> CASING_FOLDER + "/" + p)); } public static BakedModel getCasingModel(MachineCasing casing) { @@ -66,16 +65,14 @@ public static BakedModel getCasingModel(MachineCasing casing) { } private final MachineCasing baseCasing; - private final int[] outputOverlayIndexes; private final TextureAtlasSprite[] defaultOverlays; private final Map tieredOverlays; private final MachineModelClientData defaultData; - public MachineBakedModel(MachineCasing baseCasing, - int[] outputOverlayIndexes, TextureAtlasSprite[] defaultOverlays, + MachineBakedModel(MachineCasing baseCasing, + TextureAtlasSprite[] defaultOverlays, Map tieredOverlays) { this.baseCasing = baseCasing; - this.outputOverlayIndexes = outputOverlayIndexes; this.defaultOverlays = defaultOverlays; this.tieredOverlays = tieredOverlays; this.defaultData = new MachineModelClientData(baseCasing, Direction.NORTH); @@ -96,7 +93,7 @@ public TextureAtlasSprite[] getSprites(@Nullable MachineCasing casing) { * Returns null if nothing should be rendered. */ @Nullable - public TextureAtlasSprite getSprite(TextureAtlasSprite[] sprites, Direction side, Direction facingDirection, boolean isActive) { + public static TextureAtlasSprite getSprite(TextureAtlasSprite[] sprites, Direction side, Direction facingDirection, boolean isActive) { int spriteId; if (side.getAxis().isHorizontal()) { spriteId = (facingDirection.get2DDataValue() - side.get2DDataValue() + 4) % 4 * 2; @@ -124,50 +121,44 @@ public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState return getCasingModel(casing).getModelData(level, pos, state, modelData); } - protected @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand, - @NotNull ModelData extraData, @Nullable RenderType renderType, - @NotNull MachineModelClientData data, @NotNull MachineCasing casing, - @NotNull TextureAtlasSprite[] sprites, @NotNull QuadBakingVertexConsumer vertexConsumer) { + @Override + public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand, + @NotNull ModelData extraData, @Nullable RenderType renderType) { + var data = extraData.get(MachineModelClientData.KEY); + if (data == null) { + data = defaultData; + } + + MachineCasing casing = Objects.requireNonNullElse(data.casing, baseCasing); + var sprites = getSprites(casing); + List quads = new ArrayList<>(); + var vc = new QuadBakingVertexConsumer(); if (side != null) { + // Casing quads.addAll(getCasingModel(casing).getQuads(state, side, rand, extraData, renderType)); - + // Machine overlays TextureAtlasSprite sprite = getSprite(sprites, side, data.frontDirection, false); if (sprite != null) { - quads.add(ModelHelper.bakeSprite(vertexConsumer, side, sprite, -Z_OFFSET)); + quads.add(ModelHelper.bakeSprite(vc, side, sprite, -Z_OFFSET)); } } + // Output overlays if (data.outputDirection != null && side == data.outputDirection) { - quads.add(ModelHelper.bakeSprite(vertexConsumer, data.outputDirection, sprites[outputOverlayIndexes[0]], -3 * Z_OFFSET)); + quads.add(ModelHelper.bakeSprite(vc, data.outputDirection, sprites[24], -3 * Z_OFFSET)); if (data.itemAutoExtract) { - quads.add(ModelHelper.bakeSprite(vertexConsumer, data.outputDirection, sprites[outputOverlayIndexes[1]], -3 * Z_OFFSET)); + quads.add(ModelHelper.bakeSprite(vc, data.outputDirection, sprites[25], -3 * Z_OFFSET)); } if (data.fluidAutoExtract) { - quads.add(ModelHelper.bakeSprite(vertexConsumer, data.outputDirection, sprites[outputOverlayIndexes[2]], -3 * Z_OFFSET)); + quads.add(ModelHelper.bakeSprite(vc, data.outputDirection, sprites[26], -3 * Z_OFFSET)); } } return quads; } - @Override - public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand, - @NotNull ModelData extraData, @Nullable RenderType renderType) { - var data = extraData.get(MachineModelClientData.KEY); - if (data == null) { - data = defaultData; - } - - MachineCasing casing = Objects.requireNonNullElse(data.casing, baseCasing); - var sprites = getSprites(casing); - - var vc = new QuadBakingVertexConsumer(); - - return getQuads(state, side, rand, extraData, renderType, data, casing, sprites, vc); - } - @Override public boolean useAmbientOcclusion() { return true; diff --git a/src/client/java/aztech/modern_industrialization/machines/models/MachineModelBaker.java b/src/client/java/aztech/modern_industrialization/machines/models/MachineModelBaker.java deleted file mode 100644 index ebe775847..000000000 --- a/src/client/java/aztech/modern_industrialization/machines/models/MachineModelBaker.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020 Azercoco & Technici4n - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package aztech.modern_industrialization.machines.models; - -import java.util.Map; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.resources.ResourceLocation; - -public interface MachineModelBaker { - MachineBakedModel bake(MachineCasing baseCasing, - int[] outputOverlayIndexes, TextureAtlasSprite[] defaultOverlays, - Map tieredOverlays); -} diff --git a/src/client/java/aztech/modern_industrialization/machines/models/MachineOverlaysJson.java b/src/client/java/aztech/modern_industrialization/machines/models/MachineOverlaysJson.java deleted file mode 100644 index d5c508e15..000000000 --- a/src/client/java/aztech/modern_industrialization/machines/models/MachineOverlaysJson.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020 Azercoco & Technici4n - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package aztech.modern_industrialization.machines.models; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import java.lang.reflect.Field; -import net.minecraft.client.resources.model.Material; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.InventoryMenu; - -public interface MachineOverlaysJson { - Material[] toSpriteIds(); - - int[] getOutputSpriteIndexes(); - - Gson GSON = new GsonBuilder().registerTypeAdapter(ResourceLocation.class, new ResourceLocation.Serializer()).create(); - - static O parse(Class clazz, JsonObject json, MachineOverlaysJson defaultOverlay) { - O overlays = GSON.fromJson(json, clazz); - - if (defaultOverlay != null) { - try { - for (Field field : clazz.getDeclaredFields()) { - if (field.get(overlays) == null) { - field.set(overlays, field.get(defaultOverlay)); - } - } - } catch (IllegalAccessException ex) { - throw new RuntimeException("Failed to copy fields from default overlay", ex); - } - } - - return overlays; - } - - default Material select(ResourceLocation... candidates) { - for (ResourceLocation id : candidates) { - if (id != null) { - return new Material(InventoryMenu.BLOCK_ATLAS, id); - } - } - return null; - } -} diff --git a/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java b/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java index 3029f47a8..e7224d531 100644 --- a/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java +++ b/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java @@ -24,6 +24,8 @@ package aztech.modern_industrialization.machines.models; import aztech.modern_industrialization.MI; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import java.util.HashMap; import java.util.Map; @@ -36,35 +38,33 @@ import net.minecraft.client.resources.model.ModelState; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; +import net.minecraft.world.inventory.InventoryMenu; import net.neoforged.neoforge.client.model.geometry.IGeometryBakingContext; import net.neoforged.neoforge.client.model.geometry.IGeometryLoader; import net.neoforged.neoforge.client.model.geometry.IUnbakedGeometry; +import org.jetbrains.annotations.Nullable; -public class MachineUnbakedModel implements IUnbakedGeometry> { +public class MachineUnbakedModel implements IUnbakedGeometry { public static final ResourceLocation LOADER_ID = MI.id("machine"); - public static final IGeometryLoader> LOADER = (jsonObject, deserializationContext) -> { - return new MachineUnbakedModel(OverlaysJson.class, MachineBakedModel::new, jsonObject); + public static final IGeometryLoader LOADER = (jsonObject, deserializationContext) -> { + return new MachineUnbakedModel(jsonObject); }; - private final MachineModelBaker modelBaker; + private static final Gson GSON = new GsonBuilder().registerTypeAdapter(ResourceLocation.class, new ResourceLocation.Serializer()).create(); + private final MachineCasing baseCasing; - private final int[] outputOverlayIndexes; private final Material[] defaultOverlays; private final Map tieredOverlays = new HashMap<>(); - public MachineUnbakedModel(Class overlayClass, MachineModelBaker modelBaker, JsonObject obj) { - this.modelBaker = modelBaker; - + private MachineUnbakedModel(JsonObject obj) { this.baseCasing = MachineCasings.get(GsonHelper.getAsString(obj, "casing")); - var defaultOverlaysJson = MachineOverlaysJson.parse(overlayClass, GsonHelper.getAsJsonObject(obj, "default_overlays"), null); - this.outputOverlayIndexes = defaultOverlaysJson.getOutputSpriteIndexes(); + var defaultOverlaysJson = OverlaysJson.parse(GsonHelper.getAsJsonObject(obj, "default_overlays"), null); this.defaultOverlays = defaultOverlaysJson.toSpriteIds(); var tieredOverlays = GsonHelper.getAsJsonObject(obj, "tiered_overlays", new JsonObject()); for (var casingTier : tieredOverlays.keySet()) { - var casingOverlaysJson = MachineOverlaysJson.parse(overlayClass, GsonHelper.getAsJsonObject(tieredOverlays, casingTier), - defaultOverlaysJson); + var casingOverlaysJson = OverlaysJson.parse(GsonHelper.getAsJsonObject(tieredOverlays, casingTier), defaultOverlaysJson); this.tieredOverlays.put(ResourceLocation.parse(casingTier), casingOverlaysJson.toSpriteIds()); } } @@ -77,7 +77,7 @@ public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Functio for (var entry : this.tieredOverlays.entrySet()) { tieredOverlays.put(entry.getKey(), loadSprites(spriteGetter, entry.getValue())); } - return modelBaker.bake(baseCasing, outputOverlayIndexes, defaultOverlays, tieredOverlays); + return new MachineBakedModel(baseCasing, defaultOverlays, tieredOverlays); } private static TextureAtlasSprite[] loadSprites(Function textureGetter, Material[] ids) { @@ -90,7 +90,7 @@ private static TextureAtlasSprite[] loadSprites(Function Date: Mon, 9 Dec 2024 06:06:08 -0500 Subject: [PATCH 5/7] Re-add and deprecate old kubejs casing event methods --- docs/ADDING_MACHINES.md | 4 ++-- .../machine/RegisterCasingsEventJS.java | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/docs/ADDING_MACHINES.md b/docs/ADDING_MACHINES.md index 2f1238780..0764a3d20 100644 --- a/docs/ADDING_MACHINES.md +++ b/docs/ADDING_MACHINES.md @@ -329,10 +329,10 @@ For example: MIMachineEvents.registerCasings(event => { // Register a casing. // This doesn't register any model! Either add models or add the top/side/bottom textures. - event.register("fancy_casing", "Fancy"); + event.registerNamed("fancy_casing", "Fancy"); // This registers a new casing with the same model as a diamond block! - event.registerBlockImitation("diamond_casing", "Diamond", "minecraft:diamond_block"); + event.registerNamedBlockImitation("diamond_casing", "Diamond", "minecraft:diamond_block"); }) ``` diff --git a/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java b/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java index 0d4595442..5be8d82d3 100644 --- a/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java +++ b/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java @@ -23,6 +23,7 @@ */ package aztech.modern_industrialization.compat.kubejs.machine; +import aztech.modern_industrialization.MI; import aztech.modern_industrialization.datagen.model.MachineCasingImitations; import aztech.modern_industrialization.machines.models.MachineCasings; import dev.latvian.mods.kubejs.event.KubeEvent; @@ -30,14 +31,28 @@ import net.minecraft.resources.ResourceLocation; public class RegisterCasingsEventJS implements KubeEvent { - public void register(String name, String englishName) { + @Deprecated + public void register(String... names) { + MI.LOGGER.warn("register is deprecated, use registerNamed instead"); + for (var name : names) { + registerNamed(name, null); + } + } + + public void registerNamed(String name, String englishName) { if (name.contains(":")) { throw new IllegalArgumentException("Casing name cannot contain ':'."); } MachineCasings.create(name, englishName); } - public void registerBlockImitation(String name, String englishName, ResourceLocation block) { + @Deprecated + public void registerBlockImitation(String name, ResourceLocation block) { + MI.LOGGER.warn("registerBlockImitation is deprecated, use registerNamedBlockImitation instead"); + registerNamedBlockImitation(name, null, block); + } + + public void registerNamedBlockImitation(String name, String englishName, ResourceLocation block) { Objects.requireNonNull(block, "block may not be null"); if (name.contains(":")) { throw new IllegalArgumentException("Casing name cannot contain ':'."); From 99639417247a4156d428f1804393c1bb7c1f8cba Mon Sep 17 00:00:00 2001 From: Swedz Date: Mon, 9 Dec 2024 06:25:42 -0500 Subject: [PATCH 6/7] Use private logger for RegisterCasingsEventJS --- .../compat/kubejs/machine/RegisterCasingsEventJS.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java b/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java index 5be8d82d3..46b0add04 100644 --- a/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java +++ b/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java @@ -23,17 +23,20 @@ */ package aztech.modern_industrialization.compat.kubejs.machine; -import aztech.modern_industrialization.MI; import aztech.modern_industrialization.datagen.model.MachineCasingImitations; import aztech.modern_industrialization.machines.models.MachineCasings; import dev.latvian.mods.kubejs.event.KubeEvent; import java.util.Objects; import net.minecraft.resources.ResourceLocation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class RegisterCasingsEventJS implements KubeEvent { + private static final Logger LOGGER = LoggerFactory.getLogger(RegisterCasingsEventJS.class); + @Deprecated public void register(String... names) { - MI.LOGGER.warn("register is deprecated, use registerNamed instead"); + LOGGER.warn("register is deprecated, use registerNamed instead"); for (var name : names) { registerNamed(name, null); } @@ -48,7 +51,7 @@ public void registerNamed(String name, String englishName) { @Deprecated public void registerBlockImitation(String name, ResourceLocation block) { - MI.LOGGER.warn("registerBlockImitation is deprecated, use registerNamedBlockImitation instead"); + LOGGER.warn("registerBlockImitation is deprecated, use registerNamedBlockImitation instead"); registerNamedBlockImitation(name, null, block); } From e386876ab15024fd7fa0b3d7c3fdf801b0b18181 Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+Technici4n@users.noreply.github.com> Date: Tue, 10 Dec 2024 01:18:26 +0100 Subject: [PATCH 7/7] Tweaks. Mostly around not duplicating block translations --- docs/ADDING_MACHINES.md | 2 +- .../datagen/model/MachineCasingsProvider.java | 32 ++----- .../machines/models/MachineBakedModel.java | 7 +- .../machines/models/MachineUnbakedModel.java | 6 +- .../modern_industrialization/lang/en_us.json | 14 ---- .../api/energy/CableTier.java | 3 +- .../machine/RegisterCasingsEventJS.java | 13 +-- .../model/MachineCasingImitations.java | 33 -------- .../translation/TranslationProvider.java | 5 +- .../machines/models/MachineCasing.java | 23 ++++- .../machines/models/MachineCasings.java | 83 +++++++++++++------ 11 files changed, 99 insertions(+), 122 deletions(-) delete mode 100644 src/main/java/aztech/modern_industrialization/datagen/model/MachineCasingImitations.java diff --git a/docs/ADDING_MACHINES.md b/docs/ADDING_MACHINES.md index 0764a3d20..14449ba20 100644 --- a/docs/ADDING_MACHINES.md +++ b/docs/ADDING_MACHINES.md @@ -332,7 +332,7 @@ MIMachineEvents.registerCasings(event => { event.registerNamed("fancy_casing", "Fancy"); // This registers a new casing with the same model as a diamond block! - event.registerNamedBlockImitation("diamond_casing", "Diamond", "minecraft:diamond_block"); + event.registerBlockImitation("diamond_casing", "minecraft:diamond_block"); }) ``` diff --git a/src/client/java/aztech/modern_industrialization/datagen/model/MachineCasingsProvider.java b/src/client/java/aztech/modern_industrialization/datagen/model/MachineCasingsProvider.java index af7196993..2a52413d7 100644 --- a/src/client/java/aztech/modern_industrialization/datagen/model/MachineCasingsProvider.java +++ b/src/client/java/aztech/modern_industrialization/datagen/model/MachineCasingsProvider.java @@ -29,14 +29,8 @@ import aztech.modern_industrialization.machines.models.MachineBakedModel; import aztech.modern_industrialization.machines.models.MachineCasing; import aztech.modern_industrialization.machines.models.MachineCasings; -import aztech.modern_industrialization.materials.MIMaterials; -import aztech.modern_industrialization.materials.part.MIParts; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; -import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.neoforged.neoforge.client.model.generators.BlockModelBuilder; import net.neoforged.neoforge.client.model.generators.ModelProvider; import net.neoforged.neoforge.common.data.ExistingFileHelper; @@ -48,36 +42,22 @@ public MachineCasingsProvider(PackOutput output, ExistingFileHelper existingFile @Override protected void registerModels() { + for (var casing : MachineCasings.registeredCasings.values()) { + if (casing.imitatedBlock != null) { + imitateBlock(casing, casing.imitatedBlock.get()); + } + } + imitateBlock(CableTier.LV.casing, MIBlock.BASIC_MACHINE_HULL.asBlock()); imitateBlock(CableTier.MV.casing, MIBlock.ADVANCED_MACHINE_HULL.asBlock()); imitateBlock(CableTier.HV.casing, MIBlock.TURBO_MACHINE_HULL.asBlock()); imitateBlock(CableTier.EV.casing, MIBlock.HIGHLY_ADVANCED_MACHINE_HULL.asBlock()); imitateBlock(CableTier.SUPERCONDUCTOR.casing, MIBlock.QUANTUM_MACHINE_HULL.asBlock()); - imitateBlock(MachineCasings.FIREBRICKS, MIBlock.BLOCK_FIRE_CLAY_BRICKS.asBlock()); - imitateBlock(MachineCasings.BRICKS, Blocks.BRICKS); - - imitateBlock(MachineCasings.BRONZE, MIMaterials.BRONZE.getPart(MIParts.MACHINE_CASING).asBlock()); - imitateBlock(MachineCasings.BRONZE_PLATED_BRICKS, MIMaterials.BRONZE.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); - imitateBlock(MachineCasings.CLEAN_STAINLESS_STEEL, MIMaterials.STAINLESS_STEEL.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); - imitateBlock(MachineCasings.FROSTPROOF, MIMaterials.ALUMINUM.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); - imitateBlock(MachineCasings.HEATPROOF, MIMaterials.INVAR.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); - imitateBlock(MachineCasings.STAINLESS_STEEL_PIPE, MIMaterials.STAINLESS_STEEL.getPart(MIParts.MACHINE_CASING_PIPE).asBlock()); - imitateBlock(MachineCasings.STEEL, MIMaterials.STEEL.getPart(MIParts.MACHINE_CASING).asBlock()); - imitateBlock(MachineCasings.TITANIUM, MIMaterials.TITANIUM.getPart(MIParts.MACHINE_CASING).asBlock()); - imitateBlock(MachineCasings.TITANIUM_PIPE, MIMaterials.TITANIUM.getPart(MIParts.MACHINE_CASING_PIPE).asBlock()); - imitateBlock(MachineCasings.SOLID_TITANIUM, MIMaterials.TITANIUM.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); - imitateBlock(MachineCasings.NUCLEAR, MIMaterials.NUCLEAR_ALLOY.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); - imitateBlock(MachineCasings.PLASMA_HANDLING_IRIDIUM, MIMaterials.IRIDIUM.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); - cubeBottomTop(MachineCasings.BRICKED_BRONZE, "block/casings/bricked_bronze", "block/fire_clay_bricks", "block/bronze_machine_casing"); cubeBottomTop(MachineCasings.BRICKED_STEEL, "block/casings/bricked_steel", "block/fire_clay_bricks", "block/steel_machine_casing"); cubeAll(MachineCasings.CONFIGURABLE_TANK, "block/casings/configurable_tank"); cubeAll(MachineCasings.STEEL_CRATE, "block/casings/steel_crate"); - - for (var entry : MachineCasingImitations.imitationsToGenerate.entrySet()) { - imitateBlock(entry.getKey(), BuiltInRegistries.BLOCK.getOrThrow(ResourceKey.create(Registries.BLOCK, entry.getValue()))); - } } private void imitateBlock(MachineCasing casing, Block block) { diff --git a/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java b/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java index 8ea6c87f3..92e527455 100644 --- a/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java +++ b/src/client/java/aztech/modern_industrialization/machines/models/MachineBakedModel.java @@ -38,7 +38,6 @@ import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; @@ -66,12 +65,12 @@ public static BakedModel getCasingModel(MachineCasing casing) { private final MachineCasing baseCasing; private final TextureAtlasSprite[] defaultOverlays; - private final Map tieredOverlays; + private final Map tieredOverlays; private final MachineModelClientData defaultData; MachineBakedModel(MachineCasing baseCasing, TextureAtlasSprite[] defaultOverlays, - Map tieredOverlays) { + Map tieredOverlays) { this.baseCasing = baseCasing; this.defaultOverlays = defaultOverlays; this.tieredOverlays = tieredOverlays; @@ -86,7 +85,7 @@ public TextureAtlasSprite[] getSprites(@Nullable MachineCasing casing) { if (casing == null) { return defaultOverlays; } - return tieredOverlays.getOrDefault(casing.key, defaultOverlays); + return tieredOverlays.getOrDefault(casing, defaultOverlays); } /** diff --git a/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java b/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java index e7224d531..3ecc020a0 100644 --- a/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java +++ b/src/client/java/aztech/modern_industrialization/machines/models/MachineUnbakedModel.java @@ -54,7 +54,7 @@ public class MachineUnbakedModel implements IUnbakedGeometry tieredOverlays = new HashMap<>(); + private final Map tieredOverlays = new HashMap<>(); private MachineUnbakedModel(JsonObject obj) { this.baseCasing = MachineCasings.get(GsonHelper.getAsString(obj, "casing")); @@ -65,7 +65,7 @@ private MachineUnbakedModel(JsonObject obj) { var tieredOverlays = GsonHelper.getAsJsonObject(obj, "tiered_overlays", new JsonObject()); for (var casingTier : tieredOverlays.keySet()) { var casingOverlaysJson = OverlaysJson.parse(GsonHelper.getAsJsonObject(tieredOverlays, casingTier), defaultOverlaysJson); - this.tieredOverlays.put(ResourceLocation.parse(casingTier), casingOverlaysJson.toSpriteIds()); + this.tieredOverlays.put(MachineCasings.get(casingTier), casingOverlaysJson.toSpriteIds()); } } @@ -73,7 +73,7 @@ private MachineUnbakedModel(JsonObject obj) { public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, ItemOverrides overrides) { var defaultOverlays = loadSprites(spriteGetter, this.defaultOverlays); - var tieredOverlays = new HashMap(); + var tieredOverlays = new HashMap(); for (var entry : this.tieredOverlays.entrySet()) { tieredOverlays.put(entry.getKey(), loadSprites(spriteGetter, entry.getValue())); } diff --git a/src/generated/resources/assets/modern_industrialization/lang/en_us.json b/src/generated/resources/assets/modern_industrialization/lang/en_us.json index 4eea3ca3b..95ce294a4 100644 --- a/src/generated/resources/assets/modern_industrialization/lang/en_us.json +++ b/src/generated/resources/assets/modern_industrialization/lang/en_us.json @@ -1092,27 +1092,13 @@ "key.modern_industrialization.toggle_flight": "Toggle Flight", "machine_casing.modern_industrialization.bricked_bronze": "Bricked Bronze", "machine_casing.modern_industrialization.bricked_steel": "Bricked Steel", - "machine_casing.modern_industrialization.bricks": "Bricks", - "machine_casing.modern_industrialization.bronze": "Bronze", - "machine_casing.modern_industrialization.bronze_plated_bricks": "Bronze Plated Bricks", - "machine_casing.modern_industrialization.clean_stainless_steel_machine_casing": "Clean Stainless Steel", "machine_casing.modern_industrialization.configurable_tank": "Configurable Tank", "machine_casing.modern_industrialization.ev": "EV", - "machine_casing.modern_industrialization.firebricks": "Firebricks", - "machine_casing.modern_industrialization.frostproof_machine_casing": "Frostproof", - "machine_casing.modern_industrialization.heatproof_machine_casing": "Heatproof", "machine_casing.modern_industrialization.hv": "HV", "machine_casing.modern_industrialization.lv": "LV", "machine_casing.modern_industrialization.mv": "MV", - "machine_casing.modern_industrialization.nuclear_casing": "Nuclear", - "machine_casing.modern_industrialization.plasma_handling_iridium_machine_casing": "Plasma Handling Iridium", - "machine_casing.modern_industrialization.solid_titanium_machine_casing": "Solid Titanium", - "machine_casing.modern_industrialization.stainless_steel_machine_casing_pipe": "Stainless Steel Pipe", - "machine_casing.modern_industrialization.steel": "Steel", "machine_casing.modern_industrialization.steel_crate": "Steel Crate", "machine_casing.modern_industrialization.superconductor": "Superconductor", - "machine_casing.modern_industrialization.titanium": "Titanium", - "machine_casing.modern_industrialization.titanium_machine_casing_pipe": "Titanium Pipe", "rei_categories.modern_industrialization.assembler": "Assembler", "rei_categories.modern_industrialization.bronze_compressor": "Compressor", "rei_categories.modern_industrialization.bronze_cutting_machine": "Cutting Machine", diff --git a/src/main/java/aztech/modern_industrialization/api/energy/CableTier.java b/src/main/java/aztech/modern_industrialization/api/energy/CableTier.java index 6a1c12f5a..374f2b369 100644 --- a/src/main/java/aztech/modern_industrialization/api/energy/CableTier.java +++ b/src/main/java/aztech/modern_industrialization/api/energy/CableTier.java @@ -23,6 +23,7 @@ */ package aztech.modern_industrialization.api.energy; +import aztech.modern_industrialization.MI; import aztech.modern_industrialization.MIBlockKeys; import aztech.modern_industrialization.compat.kubejs.KubeJSProxy; import aztech.modern_industrialization.machines.models.MachineCasing; @@ -83,7 +84,7 @@ public CableTier(String name, String shortEnglishName, String longEnglishName, l this.longEnglishName = longEnglishName; this.eu = eu; this.itemKey = itemKey; - this.casing = MachineCasings.create(name, shortEnglishName); + this.casing = MachineCasings.create(MI.id(name), shortEnglishName); this.builtin = builtin; } diff --git a/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java b/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java index 46b0add04..ea351e609 100644 --- a/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java +++ b/src/main/java/aztech/modern_industrialization/compat/kubejs/machine/RegisterCasingsEventJS.java @@ -23,10 +23,11 @@ */ package aztech.modern_industrialization.compat.kubejs.machine; -import aztech.modern_industrialization.datagen.model.MachineCasingImitations; +import aztech.modern_industrialization.MI; import aztech.modern_industrialization.machines.models.MachineCasings; import dev.latvian.mods.kubejs.event.KubeEvent; import java.util.Objects; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,21 +47,15 @@ public void registerNamed(String name, String englishName) { if (name.contains(":")) { throw new IllegalArgumentException("Casing name cannot contain ':'."); } - MachineCasings.create(name, englishName); + MachineCasings.create(MI.id(name), englishName); } - @Deprecated public void registerBlockImitation(String name, ResourceLocation block) { - LOGGER.warn("registerBlockImitation is deprecated, use registerNamedBlockImitation instead"); - registerNamedBlockImitation(name, null, block); - } - - public void registerNamedBlockImitation(String name, String englishName, ResourceLocation block) { Objects.requireNonNull(block, "block may not be null"); if (name.contains(":")) { throw new IllegalArgumentException("Casing name cannot contain ':'."); } - MachineCasingImitations.imitationsToGenerate.put(MachineCasings.create(name, englishName), block); + MachineCasings.createBlockImitation(MI.id(name), () -> BuiltInRegistries.BLOCK.get(block)); } } diff --git a/src/main/java/aztech/modern_industrialization/datagen/model/MachineCasingImitations.java b/src/main/java/aztech/modern_industrialization/datagen/model/MachineCasingImitations.java deleted file mode 100644 index ec4fee38f..000000000 --- a/src/main/java/aztech/modern_industrialization/datagen/model/MachineCasingImitations.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020 Azercoco & Technici4n - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package aztech.modern_industrialization.datagen.model; - -import aztech.modern_industrialization.machines.models.MachineCasing; -import java.util.HashMap; -import java.util.Map; -import net.minecraft.resources.ResourceLocation; - -public class MachineCasingImitations { - public static final Map imitationsToGenerate = new HashMap<>(); -} diff --git a/src/main/java/aztech/modern_industrialization/datagen/translation/TranslationProvider.java b/src/main/java/aztech/modern_industrialization/datagen/translation/TranslationProvider.java index 337fd40e0..41a095b75 100644 --- a/src/main/java/aztech/modern_industrialization/datagen/translation/TranslationProvider.java +++ b/src/main/java/aztech/modern_industrialization/datagen/translation/TranslationProvider.java @@ -134,9 +134,8 @@ private void collectTranslationEntries() { addTranslation(cableTier.longEnglishKey(), cableTier.longEnglishName); } - for (var casing : MachineCasings.registeredCasings.values()) { - var englishName = MachineCasings.casingNames.get(casing.key); - addTranslation(casing.getTranslationKey(), englishName); + for (var casingName : MachineCasings.translations) { + addTranslation(casingName.casing().getTranslationKey(), casingName.englishName()); } } diff --git a/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java b/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java index 5e930e4af..e2873b725 100644 --- a/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java +++ b/src/main/java/aztech/modern_industrialization/machines/models/MachineCasing.java @@ -23,22 +23,39 @@ */ package aztech.modern_industrialization.machines.models; +import java.util.function.Supplier; +import net.minecraft.Util; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import org.jetbrains.annotations.Nullable; public class MachineCasing { public final ResourceLocation key; + /** + * Not null when registered as an imitation. The actual model might not be an imitation since it is resource pack driven. + * Mostly used to pull the name of the casing from the block it imitates. Will also generate a corresponding casing model. + */ + @Nullable + public final Supplier imitatedBlock; - MachineCasing(ResourceLocation key) { + MachineCasing(ResourceLocation key, @Nullable Supplier imitatedBlock) { this.key = key; + this.imitatedBlock = imitatedBlock; } public String getTranslationKey() { - return "machine_casing.%s.%s".formatted(key.getNamespace(), key.getPath()); + if (imitatedBlock != null) { + throw new IllegalArgumentException("Cannot get translation key for casing imitating a block."); + } + return Util.makeDescriptionId("machine_casing", key); } - public MutableComponent getDisplayName() { + public MutableComponent getName() { + if (imitatedBlock != null) { + return imitatedBlock.get().getName(); + } return Component.translatable(getTranslationKey()); } } diff --git a/src/main/java/aztech/modern_industrialization/machines/models/MachineCasings.java b/src/main/java/aztech/modern_industrialization/machines/models/MachineCasings.java index 767b006be..4cb7ca69d 100644 --- a/src/main/java/aztech/modern_industrialization/machines/models/MachineCasings.java +++ b/src/main/java/aztech/modern_industrialization/machines/models/MachineCasings.java @@ -24,54 +24,87 @@ package aztech.modern_industrialization.machines.models; import aztech.modern_industrialization.MI; +import aztech.modern_industrialization.MIBlock; import aztech.modern_industrialization.compat.kubejs.KubeJSProxy; +import aztech.modern_industrialization.materials.MIMaterials; +import aztech.modern_industrialization.materials.part.MIParts; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.function.Supplier; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import org.jetbrains.annotations.Nullable; +@SuppressWarnings("Convert2MethodRef") public class MachineCasings { public static final Map registeredCasings = new HashMap<>(); - public static final Map casingNames = new HashMap<>(); - public static final MachineCasing BRICKED_BRONZE = create("bricked_bronze", "Bricked Bronze"); - public static final MachineCasing BRICKED_STEEL = create("bricked_steel", "Bricked Steel"); - public static final MachineCasing BRICKS = create("bricks", "Bricks"); - public static final MachineCasing BRONZE = create("bronze", "Bronze"); - public static final MachineCasing BRONZE_PLATED_BRICKS = create("bronze_plated_bricks", "Bronze Plated Bricks"); - public static final MachineCasing CLEAN_STAINLESS_STEEL = create("clean_stainless_steel_machine_casing", "Clean Stainless Steel"); - public static final MachineCasing CONFIGURABLE_TANK = create("configurable_tank", "Configurable Tank"); - public static final MachineCasing STAINLESS_STEEL_PIPE = create("stainless_steel_machine_casing_pipe", "Stainless Steel Pipe"); - public static final MachineCasing FIREBRICKS = create("firebricks", "Firebricks"); - public static final MachineCasing FROSTPROOF = create("frostproof_machine_casing", "Frostproof"); - public static final MachineCasing HEATPROOF = create("heatproof_machine_casing", "Heatproof"); - public static final MachineCasing STEEL = create("steel", "Steel"); - public static final MachineCasing STEEL_CRATE = create("steel_crate", "Steel Crate"); - public static final MachineCasing TITANIUM = create("titanium", "Titanium"); - public static final MachineCasing TITANIUM_PIPE = create("titanium_machine_casing_pipe", "Titanium Pipe"); - public static final MachineCasing SOLID_TITANIUM = create("solid_titanium_machine_casing", "Solid Titanium"); - public static final MachineCasing NUCLEAR = create("nuclear_casing", "Nuclear"); - public static final MachineCasing PLASMA_HANDLING_IRIDIUM = create("plasma_handling_iridium_machine_casing", "Plasma Handling Iridium"); + public record CasingName(MachineCasing casing, String englishName) { + } + + public static final List translations = new ArrayList<>(); + + public static final MachineCasing BRICKED_BRONZE = create(MI.id("bricked_bronze"), "Bricked Bronze"); + public static final MachineCasing BRICKED_STEEL = create(MI.id("bricked_steel"), "Bricked Steel"); + public static final MachineCasing BRICKS = createBlockImitation(MI.id("bricks"), () -> Blocks.BRICKS); + public static final MachineCasing BRONZE = createBlockImitation(MI.id("bronze"), + () -> MIMaterials.BRONZE.getPart(MIParts.MACHINE_CASING).asBlock()); + public static final MachineCasing BRONZE_PLATED_BRICKS = createBlockImitation(MI.id("bronze_plated_bricks"), + () -> MIMaterials.BRONZE.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); + public static final MachineCasing CLEAN_STAINLESS_STEEL = createBlockImitation(MI.id("clean_stainless_steel_machine_casing"), + () -> MIMaterials.STAINLESS_STEEL.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); + public static final MachineCasing CONFIGURABLE_TANK = create(MI.id("configurable_tank"), "Configurable Tank"); + public static final MachineCasing STAINLESS_STEEL_PIPE = createBlockImitation(MI.id("stainless_steel_machine_casing_pipe"), + () -> MIMaterials.STAINLESS_STEEL.getPart(MIParts.MACHINE_CASING_PIPE).asBlock()); + public static final MachineCasing FIREBRICKS = createBlockImitation(MI.id("firebricks"), () -> MIBlock.BLOCK_FIRE_CLAY_BRICKS.asBlock()); + public static final MachineCasing FROSTPROOF = createBlockImitation(MI.id("frostproof_machine_casing"), + () -> MIMaterials.ALUMINUM.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); + public static final MachineCasing HEATPROOF = createBlockImitation(MI.id("heatproof_machine_casing"), + () -> MIMaterials.INVAR.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); + public static final MachineCasing STEEL = createBlockImitation(MI.id("steel"), () -> MIMaterials.STEEL.getPart(MIParts.MACHINE_CASING).asBlock()); + public static final MachineCasing STEEL_CRATE = create(MI.id("steel_crate"), "Steel Crate"); + public static final MachineCasing TITANIUM = createBlockImitation(MI.id("titanium"), + () -> MIMaterials.TITANIUM.getPart(MIParts.MACHINE_CASING).asBlock()); + public static final MachineCasing TITANIUM_PIPE = createBlockImitation(MI.id("titanium_machine_casing_pipe"), + () -> MIMaterials.TITANIUM.getPart(MIParts.MACHINE_CASING_PIPE).asBlock()); + public static final MachineCasing SOLID_TITANIUM = createBlockImitation(MI.id("solid_titanium_machine_casing"), + () -> MIMaterials.TITANIUM.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); + public static final MachineCasing NUCLEAR = createBlockImitation(MI.id("nuclear_casing"), + () -> MIMaterials.NUCLEAR_ALLOY.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); + public static final MachineCasing PLASMA_HANDLING_IRIDIUM = createBlockImitation(MI.id("plasma_handling_iridium_machine_casing"), + () -> MIMaterials.IRIDIUM.getPart(MIParts.MACHINE_CASING_SPECIAL).asBlock()); static { KubeJSProxy.instance.fireRegisterMachineCasingsEvent(); } + public static MachineCasing createBlockImitation(ResourceLocation key, Supplier block) { + Objects.requireNonNull(block); + return register(key, block); + } + public static MachineCasing create(ResourceLocation key, String englishName) { + Objects.requireNonNull(englishName); + var casing = register(key, null); + translations.add(new CasingName(casing, englishName)); + return casing; + } + + private static MachineCasing register(ResourceLocation key, @Nullable Supplier blockImitation) { if (registeredCasings.containsKey(key)) { throw new IllegalArgumentException("Duplicate machine casing definition: " + key); } - MachineCasing casing = new MachineCasing(key); + MachineCasing casing = new MachineCasing(key, blockImitation); registeredCasings.put(key, casing); - casingNames.put(key, englishName); return casing; } - public static MachineCasing create(String name, String englishName) { - return create(MI.id(name), englishName); - } - public static MachineCasing get(ResourceLocation key) { MachineCasing casing = registeredCasings.get(key); if (casing != null) {