Jump to content

1.9 make use of item models that only exist in code


UberAffe

Recommended Posts

I have an item type which generates an IFlexibleBakedModel based on it's nbt information. I have that model stored so that it only needs to get generated once. But how do I actually go about using that model when the item is rendered?

 

Edit:

Ended up updating to 1.9

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

If by pre-generated you mean during pre-postInit no. The available instances get created by the player in-game, some will be loaded from a file and could be generated during pre-postInit, the only way to make all of them available during pre-postInit would be to force a server restart each time they add an instance which I do not want to do.

 

I have this in my ClientProxy#postInit

ModelResourceLocation itemModel = Refs.modelResourceLocation;
ModelLoader.setCustomModelResourceLocation(MeleeCore.meleeCore, 0, itemModel);	

 

This is what I have for the ModelBakeEvent

        @SideOnly(Side.CLIENT)
@SubscribeEvent
public void onModelBakeEvent(ModelBakeEvent event)
{
	 Object obj = event.modelRegistry.getObject(DraftableSmartItemModel.modelResourceLocation);
	 if(obj instanceof IBakedModel)
	 {
		 event.modelRegistry.putObject(DraftableSmartItemModel.modelResourceLocation, new DraftableSmartItemModel());
	 }
}

 

Here is what I have for ISmartItemModel:

public class DraftableSmartItemModel implements ISmartItemModel{

public static final ModelResourceLocation modelResourceLocation = new ModelResourceLocation(Refs.MODID + ":draftable_Item","inventory"); // this file doesn't exist

@Override
public IFlexibleBakedModel handleItemState(ItemStack stack) {
      IFlexibleBakedModel model = null;
      if(stack.getTagCompound().hasKey(Refs.DRAFTABLE) && DraftableReg.Exists(stack.getTagCompound().getString(Refs.DRAFTABLE)))
         model = DraftableReg.getModel(stack.getTagCompound().getString(Refs.DRAFTABLE));
      return model;
   }
}

 

This is in the item class(I have my own registry of instances of this class)

         public ItemStack CreateItem() {
	LogHelper.info("creating " + name);
	ItemStack toReturn = new ItemStack(this, 1, 0);
	NBTTagCompound tag = new NBTTagCompound();
	tag.setString(Refs.DRAFTABLE, name);
	toReturn.setTagCompound(tag);
	return toReturn;
}

 

The models are just showing up as purple and black boxes. Is there something wrong with how I am assigning the models to the items?

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

postInit because I'm a noob when it comes to this, moved to preInit and both places now use

Refs.modelResourceLocation, I just moved the variable from DraftableSmartItemModel to Refs.

 

These are in DraftableReg

       @SideOnly(Side.CLIENT)
public static IFlexibleBakedModel GetModel(String draftItem) {
	return models.get(draftItem);
}

        public static void RegisterDraftable(IDraftable draftable){
	LogHelper.info("Registering Draftable :" + draftable.GetName());
	knowledgeBase.put(draftable.GetName(), draftable);
}

@SideOnly(Side.CLIENT)
public static void RegisterDraftableModel(IDraftable draftable){
	LogHelper.info("Registering Model for :" + draftable.GetName());
	models.put(draftable.GetName(), new DraftableBakedModel(draftable));
}

My proxies have a Register method that gets used to call either one or both of these register methods.

 

I put a breakpoint in GetModel and it doesn't get called, so something is still wrong with how I am assigning my DraftableSmartItemModel to the items.

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

I put a breakpoint in handleItemState and it never gets called so no.

This is the only error I can find in the log

 

[12:00:39] [Client thread/ERROR] [FML]: Exception loading model for variant lidr:draftable_Item#inventory for item "lidr:lidr_defaultmelee"
java.lang.Exception: Could not load model definition for variant lidr:draftable_Item#inventory
at net.minecraftforge.client.model.ModelLoader.getModelBlockDefinition(ModelLoader.java:215) ~[ModelLoader.class:?]
at net.minecraftforge.client.model.ModelLoader.loadItems(ModelLoader.java:259) ~[ModelLoader.class:?]
at net.minecraftforge.client.model.ModelLoader.setupModelRegistry(ModelLoader.java:116) ~[ModelLoader.class:?]
at net.minecraft.client.resources.model.ModelManager.onResourceManagerReload(ModelManager.java:28) [ModelManager.class:?]
at net.minecraft.client.resources.SimpleReloadableResourceManager.notifyReloadListeners(SimpleReloadableResourceManager.java:130) [simpleReloadableResourceManager.class:?]
at net.minecraft.client.resources.SimpleReloadableResourceManager.reloadResources(SimpleReloadableResourceManager.java:111) [simpleReloadableResourceManager.class:?]
at net.minecraft.client.Minecraft.refreshResources(Minecraft.java:772) [Minecraft.class:?]
at net.minecraftforge.fml.client.FMLClientHandler.finishMinecraftLoading(FMLClientHandler.java:326) [FMLClientHandler.class:?]
at net.minecraft.client.Minecraft.startGame(Minecraft.java:532) [Minecraft.class:?]
at net.minecraft.client.Minecraft.run(Minecraft.java:360) [Minecraft.class:?]
at net.minecraft.client.main.Main.main(Main.java:116) [Main.class:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
at GradleStart.main(GradleStart.java:26) [start/:?]
Caused by: java.lang.RuntimeException: Encountered an exception when loading model definition of model lidr:blockstates/draftable_Item.json
at net.minecraft.client.resources.model.ModelBakery.getModelBlockDefinition(ModelBakery.java:165) ~[ModelBakery.class:?]
at net.minecraftforge.client.model.ModelLoader.getModelBlockDefinition(ModelLoader.java:211) ~[ModelLoader.class:?]
... 22 more
Caused by: java.io.FileNotFoundException: lidr:blockstates/draftable_Item.json
at net.minecraft.client.resources.SimpleReloadableResourceManager.getAllResources(SimpleReloadableResourceManager.java:82) ~[simpleReloadableResourceManager.class:?]
at net.minecraft.client.resources.model.ModelBakery.getModelBlockDefinition(ModelBakery.java:143) ~[ModelBakery.class:?]
at net.minecraftforge.client.model.ModelLoader.getModelBlockDefinition(ModelLoader.java:211) ~[ModelLoader.class:?]
... 22 more
[12:00:39] [Client thread/ERROR] [FML]: Model definition for location lidr:draftable_Item#inventory not found

 

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

Ok so I have all of that in place now but there is one problem.

 

ISmartItemModel extends IBakedModel not IFlexibleBakedModel and bake wants an IFlexibleBakedModel.

Do I just need to update my forge version to fix this (im using 1764)?

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

You can implement two? Idk, I am alredy on 1.9 where there are no longer any of those. I totally skipped 1.8.9 (meaning I didn't touch rendering knowing that it will change).

 

And yeah - I suggest going to 1.9 directly, a lot of stuff has been replaced.

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

Alright so I now have gotten rid of all the obvious errors in code after updateing to 1.9 and I am essentially at the same point again. So for custom item model in 1.9 do I use a similar process as what you described but only using IBakedModel or is it something else?

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

ICustomModelLoader

 

public class DraftableModelLoader implements ICustomModelLoader{

@Override
public void onResourceManagerReload(IResourceManager resourceManager) {	}

@Override
public boolean accepts(ResourceLocation modelLocation) {
	return Refs.modelResourceLocation == modelLocation;
}

@Override
public IModel loadModel(ResourceLocation modelLocation) throws Exception {
	return new DraftableModel();
}
}

 

IModel

 

public class DraftableModel implements IModel{

@Override
public Collection<ResourceLocation> getDependencies() {
	return ImmutableList.of();
}

@Override
public Collection<ResourceLocation> getTextures() {
	return ImmutableList.of();
}

@Override
public IBakedModel bake(IModelState state, VertexFormat format,
		Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) {
	return DraftableBakedModel.instance;
}

@Override
public IModelState getDefaultState() {
	return TRSRTransformation.identity();
}
}

 

IBakedModel

 

public class DraftableBakedModel implements IBakedModel{

public static final DraftableBakedModel instance = new DraftableBakedModel();

private DraftableBakedModel() {
}

@Override
public ItemOverrideList getOverrides() {
	return new DraftableOverrideList(null);
}
        // removed code that handles creating BakedQuads from an IDraftable
}

 

ItemOverrideList

 

public class DraftableOverrideList extends ItemOverrideList{

public DraftableOverrideList(List<ItemOverride> overridesIn) {
	super(overridesIn);
}

@Override
public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity)
    {
        Item item = stack.getItem();
        if (item instanceof DraftingItemCore)
        {
            return DraftableReg.GetModel(((NBTTagCompound)stack.getTagCompound().getTag(Refs.MODID)).getString("name"));
        }
        return originalModel;
    }
}

 

 

I have this in my ClientProxy#preInit

ModelLoader.setCustomModelResourceLocation(MeleeCore.meleeCore, 0, Refs.modelResourceLocation);
ModelLoaderRegistry.registerLoader(new DraftableModelLoader());

and this in my CommonProxy#preInit

GameRegistry.registerItem(MeleeCore.meleeCore, Refs.MODID + "_" + MeleeCore.meleeCore.GetName());

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

in my ICustomModelLoader#accepts I put this

@Override
public boolean accepts(ResourceLocation modelLocation) {
	if(Refs.modelResourceLocation == modelLocation)
		Refs.NOP();
	return Refs.modelResourceLocation == modelLocation;
}

when I put a breakpoint on the nop it never gets triggered.

which means that

ModelLoader.setCustomModelResourceLocation(MeleeCore.meleeCore, 0, Refs.modelResourceLocation);

isn't doing what I thought it was.

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

Ok so I have it using my models now, I need to compare the modelResourceLocations with .equals not ==, I hate when that is the problem.

 

Anyways my Models seem to be completely transparent, so on to how I am creating the models.

          public DraftableBakedModel(IDraftable draft){
	 DraftableMap parts = draft.GetPartArray();
	 for(int xPos = 0; xPos < parts.GetWidth(); xPos++){
		 for(int yPos = 0; yPos < parts.GetHeight(); yPos++){
            for(int zPos = 0; zPos < parts.GetDepth(); zPos++){
               if(parts.GetPart(xPos + "," + yPos + "," + zPos) != null)
            	   quads.addAll(parts.GetPart(xPos + "," + yPos + "," + zPos).GetQuadsAt(xPos, yPos, zPos));
            }
		 }
	 }
 }

 

in the IPartType implementation

 

         public List<BakedQuad> GetQuadsAt(int offX, int offY, int offZ) {
	List<BakedQuad> list = new ArrayList<BakedQuad>();
	BakedQuad quad;
	//North
	quad = new BakedQuad(applyOffset(getVertices(EnumFacing.NORTH),offX,offY,offZ), 0, EnumFacing.NORTH, null, true, new VertexFormat());
	list.add(quad);
	//Up
	quad = new BakedQuad(applyOffset(getVertices(EnumFacing.UP),offX,offY,offZ), 0, EnumFacing.UP, null, true, new VertexFormat());
	list.add(quad);
	//East
	quad = new BakedQuad(applyOffset(getVertices(EnumFacing.EAST),offX,offY,offZ), 0, EnumFacing.EAST, null, true, new VertexFormat());
	list.add(quad);
	//South
	quad = new BakedQuad(applyOffset(getVertices(EnumFacing.SOUTH),offX,offY,offZ), 0, EnumFacing.SOUTH, null, true, new VertexFormat());
	list.add(quad);
	//Down
	quad = new BakedQuad(applyOffset(getVertices(EnumFacing.DOWN),offX,offY,offZ), 0, EnumFacing.DOWN, null, true, new VertexFormat());
	list.add(quad);
	//West
	quad = new BakedQuad(applyOffset(getVertices(EnumFacing.WEST),offX,offY,offZ), 0, EnumFacing.WEST, null, true, new VertexFormat());
	list.add(quad);
	return list;
}

        private int[] getVertices(EnumFacing face) {
	switch(face){
	case NORTH:
		return north();
	case EAST:
		return east();
	case WEST:
		return west();
	case SOUTH:
		return south();
	case UP:
		return up();
	case DOWN:
		return down();
	default:
		return null;
	}
}

        private int[] north() {
	int[] vertices = new int[28];
	//top left
	vertices[0] = 0; //x
	vertices[1] = 0; //y
	vertices[2] = 0; //z
	vertices[3] = asInt(luxin.GetColor()); // rrggbbaa
	vertices[4] = 0; //u 
	vertices[5] = 0; //v
	vertices[6] = 0; //unused
	//top right
	vertices[7] = 1; //x
	vertices[8] = 0; //y
	vertices[9] = 0; //z
	vertices[10] = asInt(luxin.GetColor()); // rrggbbaa
	vertices[11] = 0; //u 
	vertices[12] = 0; //v
	vertices[13] = 0; //unused
	//bottom right
	vertices[14] = 1; //x
	vertices[15] = 1; //y
	vertices[16] = 0; //z
	vertices[17] = asInt(luxin.GetColor()); // rrggbbaa
	vertices[18] = 0; //u 
	vertices[19] = 0; //v
	vertices[20] = 0; //unused
	//bottom left
	vertices[21] = 0; //x
	vertices[22] = 1; //y
	vertices[23] = 0; //z
	vertices[24] = asInt(luxin.GetColor()); // rrggbbaa
	vertices[25] = 0; //u 
	vertices[26] = 0; //v
	vertices[27] = 0; //unused
	return vertices;
}

        private int asInt(int[] color) {
	return (color[0]&0x0ff)<<24|(color[1]&0x0ff)<<16|(color[2]&0x0ff)<<8|(color[3]&0x0ff);//0 is r, 1 is g, 2 is b, 3 is a, &0x0ff limits each to 1 byte
}

 

 

and in my ILuxin implementations

        public int[] GetColor() {
	return new int[]{0,0,255,127};
}

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

I'll be diving into minecraft code when I get home but I think I just need to figure out what minecraft does with the tint value. If they don't use it I may need to write my own ItemRenderer, if I do need to do you have any suggested resources to help me accomplish that?

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I have created a very simple mod that is just supposed to send a message to a player when they join. Upon adding it to a server (that has other mods on it), the following crash message appears: [12:13:01] [main/ERROR] [minecraft/Main]: Failed to start the minecraft server net.minecraftforge.fml.LoadingFailedException: Loading errors encountered: [         Epic Mod (epicmod) has failed to load correctly §7java.lang.NoSuchMethodException: net.ed.epicmod.EpicMod.<init>() ]         at net.minecraftforge.fml.ModLoader.waitForTransition(ModLoader.java:243) ~[fmlcore-1.19.2-43.2.14.jar%23548!/:?] {}         at net.minecraftforge.fml.ModLoader.lambda$dispatchAndHandleError$24(ModLoader.java:208) ~[fmlcore-1.19.2-43.2.14.jar%23548!/:?] {}         at java.util.Optional.ifPresent(Optional.java:178) ~[?:?] {re:mixin}         at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:208) ~[fmlcore-1.19.2-43.2.14.jar%23548!/:?] {}         at net.minecraftforge.fml.ModLoader.lambda$gatherAndInitializeMods$14(ModLoader.java:185) ~[fmlcore-1.19.2-43.2.14.jar%23548!/:?] {}         at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?] {re:mixin,re:computing_frames}         at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:185) ~[fmlcore-1.19.2-43.2.14.jar%23548!/:?] {}         at net.minecraftforge.server.loading.ServerModLoader.load(ServerModLoader.java:32) ~[forge-1.19.2-43.2.14-universal.jar%23552!/:?] {re:classloading}         at net.minecraft.server.Main.main(Main.java:113) ~[server-1.19.2-20220805.130853-srg.jar%23547!/:?] {re:classloading,re:mixin,pl:mixin:A}         at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] {}         at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] {}         at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] {}         at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] {}         at net.minecraftforge.fml.loading.targets.CommonServerLaunchHandler.lambda$launchService$0(CommonServerLaunchHandler.java:29) ~[fmlloader-1.19.2-43.2.14.jar%2367!/:?] {}         at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:30) [modlauncher-10.0.8.jar%2354!/:?] {}         at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) [modlauncher-10.0.8.jar%2354!/:?] {}         at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) [modlauncher-10.0.8.jar%2354!/:?] {}         at cpw.mods.modlauncher.Launcher.run(Launcher.java:106) [modlauncher-10.0.8.jar%2354!/:?] {}         at cpw.mods.modlauncher.Launcher.main(Launcher.java:77) [modlauncher-10.0.8.jar%2354!/:?] {}         at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) [modlauncher-10.0.8.jar%2354!/:?] {}         at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) [modlauncher-10.0.8.jar%2354!/:?] {}         at cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:141) [bootstraplauncher-1.1.2.jar:?] {} Why could this be? I have tried using the mod on another forge server with only this mod installed and it works there. Is my mod somehow interfering with other mods? MC version is 1.19.2
    • how to make animated doors?, maybe geckolib, but i don't know how to code it?
    • For crash 1, set max-tick-time to -1 in your server.properties Crash 2 shows a conflict or incompatibility between LuckPerms and the mod boh-0.0.6.1-forge-1.20.1_2.jar
    • Add the crash-report or latest.log (logs-folder) with sites like https://mclo.gs/ and paste the link to it here  
    • so my minecraft crashes when opening my world, i played without any troubles for about 5 days and today it started tweaking.. pls help me
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.