diff --git a/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 b/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 index 02ee3fc46..e15235617 100644 --- a/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 +++ b/src/generated/resources/.cache/b69ee8a2655365569b979911c0440daa8c470ac2 @@ -1,4 +1,4 @@ -// 1.21.1 2025-05-13T23:50:15.1356608 Item Models: superbwarfare +// 1.21.1 2025-05-21T21:13:24.0760608 Item Models: superbwarfare 13ca8d5676888ff51f3308d88e4bf67691fa34f8 assets/superbwarfare/models/item/aa_12_blueprint.json 0a9bfb695c2b5668863a2de4770f5bfca663c1dc assets/superbwarfare/models/item/agm.json 29ad5daadcdf7c10771fc45b649c527d16325cbb assets/superbwarfare/models/item/aircraft_catapult.json @@ -7,6 +7,9 @@ c993bddc0db9453ffbefa59f9ac9a74dba909038 assets/superbwarfare/models/item/ancient_cpu.json a5cf666a970906ba6ac0af9a4d5d52dd0e093dec assets/superbwarfare/models/item/annihilator_blueprint.json 4b8fe8fbe5e64c3449ad539317254e4ed7188411 assets/superbwarfare/models/item/ap_head.json +0d41599d73bef0eefd40b54bb4940fe2e8e03da6 assets/superbwarfare/models/item/aurelia_sceptre.json +47b117e79990f208022980edf27898c559c715f4 assets/superbwarfare/models/item/aurelia_sceptre_base.json +a207f0f01b87315d1b85fc3ea69bf52b2bd5c71a assets/superbwarfare/models/item/aurelia_sceptre_icon.json 984c08ca6f6893a15721a85e30118f9e32c65c7f assets/superbwarfare/models/item/barbed_wire.json e8f16946c6f9429989d05e9ec250a72ffc64f9e1 assets/superbwarfare/models/item/beam_test.json bda38dd5cb3ca4c3e289a012c0529609ac02ded2 assets/superbwarfare/models/item/beast.json diff --git a/src/generated/resources/assets/superbwarfare/models/item/aurelia_sceptre.json b/src/generated/resources/assets/superbwarfare/models/item/aurelia_sceptre.json new file mode 100644 index 000000000..7ba965a1b --- /dev/null +++ b/src/generated/resources/assets/superbwarfare/models/item/aurelia_sceptre.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:item/generated", + "base": { + "parent": "superbwarfare:item/aurelia_sceptre_base" + }, + "gui_light": "front", + "loader": "neoforge:separate_transforms", + "perspectives": { + "fixed": { + "parent": "superbwarfare:lod/aurelia_sceptre" + }, + "ground": { + "parent": "superbwarfare:lod/aurelia_sceptre" + }, + "gui": { + "parent": "superbwarfare:item/aurelia_sceptre_icon" + }, + "head": { + "parent": "superbwarfare:lod/aurelia_sceptre" + }, + "thirdperson_lefthand": { + "parent": "superbwarfare:lod/aurelia_sceptre" + }, + "thirdperson_righthand": { + "parent": "superbwarfare:lod/aurelia_sceptre" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/superbwarfare/models/item/aurelia_sceptre_base.json b/src/generated/resources/assets/superbwarfare/models/item/aurelia_sceptre_base.json new file mode 100644 index 000000000..a7f3e0bb8 --- /dev/null +++ b/src/generated/resources/assets/superbwarfare/models/item/aurelia_sceptre_base.json @@ -0,0 +1,6 @@ +{ + "parent": "superbwarfare:displaysettings/aurelia_sceptre.item", + "textures": { + "layer0": "superbwarfare:item/aurelia_sceptre" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/superbwarfare/models/item/aurelia_sceptre_icon.json b/src/generated/resources/assets/superbwarfare/models/item/aurelia_sceptre_icon.json new file mode 100644 index 000000000..85cc670c4 --- /dev/null +++ b/src/generated/resources/assets/superbwarfare/models/item/aurelia_sceptre_icon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "superbwarfare:item/aurelia_sceptre_icon" + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/datagen/CustomSeparateModelBuilder.java b/src/main/java/com/atsuishio/superbwarfare/datagen/CustomSeparateModelBuilder.java new file mode 100644 index 000000000..f237b21e2 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/datagen/CustomSeparateModelBuilder.java @@ -0,0 +1,61 @@ +package com.atsuishio.superbwarfare.datagen; + +import com.google.common.base.Preconditions; +import com.google.gson.JsonObject; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemDisplayContext; +import net.neoforged.neoforge.client.model.generators.CustomLoaderBuilder; +import net.neoforged.neoforge.client.model.generators.ModelBuilder; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class CustomSeparateModelBuilder> extends CustomLoaderBuilder { + + public static > CustomSeparateModelBuilder begin(T parent, ExistingFileHelper existingFileHelper) { + return new CustomSeparateModelBuilder<>(parent, existingFileHelper); + } + + private String base; + private final Map childModels = new LinkedHashMap<>(); + + protected CustomSeparateModelBuilder(T parent, ExistingFileHelper existingFileHelper) { + super(ResourceLocation.parse("neoforge:separate_transforms"), parent, existingFileHelper, true); + } + + public CustomSeparateModelBuilder base(String location) { + Preconditions.checkNotNull(location, "location must not be null"); + base = location; + return this; + } + + public CustomSeparateModelBuilder perspective(ItemDisplayContext perspective, String location) { + Preconditions.checkNotNull(perspective, "perspective must not be null"); + Preconditions.checkNotNull(location, "location must not be null"); + childModels.put(perspective.getSerializedName(), location); + return this; + } + + @Override + public @NotNull JsonObject toJson(@NotNull JsonObject json) { + json = super.toJson(json); + + if (this.base != null) { + var base = new JsonObject(); + base.addProperty("parent", this.base); + json.add("base", base); + } + + JsonObject parts = new JsonObject(); + for (Map.Entry entry : childModels.entrySet()) { + var part = new JsonObject(); + part.addProperty("parent", entry.getValue()); + parts.add(entry.getKey(), part); + } + json.add("perspectives", parts); + + return json; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java b/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java index 86a94975d..047358e79 100644 --- a/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java +++ b/src/main/java/com/atsuishio/superbwarfare/datagen/ModItemModelProvider.java @@ -4,13 +4,16 @@ import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.init.ModBlocks; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.item.common.BlueprintItem; +import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.client.model.generators.ItemModelBuilder; import net.neoforged.neoforge.client.model.generators.ItemModelProvider; +import net.neoforged.neoforge.client.model.generators.ModelFile; import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.neoforged.neoforge.registries.DeferredHolder; @@ -23,6 +26,9 @@ public class ModItemModelProvider extends ItemModelProvider { @Override protected void registerModels() { + // test + gunItem(ModItems.AURELIA_SCEPTRE); + simpleItem(ModItems.EMPTY_PERK, "perk/"); simpleItem(ModItems.MORTAR_SHELL); @@ -205,4 +211,39 @@ public class ModItemModelProvider extends ItemModelProvider { return withExistingParent(item.getId().getPath(), ResourceLocation.withDefaultNamespace("item/handheld")) .texture("layer0", Mod.loc("item/" + item.getId().getPath())); } + + private ItemModelBuilder gunIcon(DeferredHolder item) { + return withExistingParent(item.getId().getPath() + "_icon", ResourceLocation.withDefaultNamespace("item/generated")) + .texture("layer0", Mod.loc("item/" + item.getId().getPath() + "_icon")); + } + + private ItemModelBuilder gunBase(DeferredHolder item) { + return getBuilder(item.getId().getPath() + "_base") + .parent(new ModelFile.UncheckedModelFile(modLoc("displaysettings/" + item.getId().getPath() + ".item"))) + .texture("layer0", Mod.loc("item/" + item.getId().getPath())); + } + + private ItemModelBuilder customSeparatedGunModel(DeferredHolder item) { + String lod = modLoc("lod/" + item.getId().getPath()).toString(); + String base = modLoc("item/" + item.getId().getPath() + "_base").toString(); + String icon = modLoc("item/" + item.getId().getPath() + "_icon").toString(); + + return withExistingParent(item.getId().getPath(), ResourceLocation.withDefaultNamespace("item/generated")) + .guiLight(BlockModel.GuiLight.FRONT) + .customLoader(CustomSeparateModelBuilder::begin) + .base(base) + .perspective(ItemDisplayContext.FIXED, lod) + .perspective(ItemDisplayContext.HEAD, lod) + .perspective(ItemDisplayContext.GROUND, lod) + .perspective(ItemDisplayContext.THIRD_PERSON_RIGHT_HAND, lod) + .perspective(ItemDisplayContext.THIRD_PERSON_LEFT_HAND, lod) + .perspective(ItemDisplayContext.GUI, icon) + .end(); + } + + private void gunItem(DeferredHolder item) { + this.gunIcon(item); + this.gunBase(item); + this.customSeparatedGunModel(item); + } } diff --git a/src/main/resources/assets/superbwarfare/models/item/aurelia_sceptre_3d.json b/src/main/resources/assets/superbwarfare/models/lod/aurelia_sceptre.json similarity index 100% rename from src/main/resources/assets/superbwarfare/models/item/aurelia_sceptre_3d.json rename to src/main/resources/assets/superbwarfare/models/lod/aurelia_sceptre.json