Jump to content

Recommended Posts

Posted

Are you asking how to assign custom model to Item?

How do you know it's working if you never saw it working (you don't know how to use it)? :o

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

Posted

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

Posted

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

Posted

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

Posted

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.

Posted

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

Posted

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

Posted

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

Posted

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

Posted

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

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 managed to fix it by reinstalling the modpack and re-add all the extra mods I've had previously.
    • Ah, it appears I spoke too soon, I still need a little help here. I now have the forceloading working reliably.  However, I've realized it's not always the first tick that loads the entity.  I've seen it take anywhere from 2-20ish to actually go through, in which time my debugging has revealed that the chunk is loaded, but during which time calling  serverLevelIn.getEntity(uuidIn) returns a null result.  I suspect this has to do with queuing and how entities are loaded into the game.  While not optimal, it's acceptable, and I don't think there's a whole ton I can do to avoid it. However, my concern is that occasionally teleporting an entity in this manner causes a lag spike.  It's not every time and gives the appearance of being correlated with when other chunks are loading in.  It's also not typically a long spike, but can last a second or two, which is less than ideal.  The gist of how I'm summoning is here (although I've omitted some parts that weren't relevant.  The lag occurs before the actual summon so I'm pretty confident it's the loading, and not the actual summon call). ChunkPos chunkPos = new ChunkPos(entityPosIn); if (serverLevelIn.areEntitiesLoaded(chunkPos.toLong())) { boolean isSummoned = // The method I'm using for actual summoning is called here. Apart from a few checks, the bulk of it is shown later on. if (isSummoned) { // Code that runs here just notifies the player of the summon, clears it from the queue, and removes the forceload } } else { // I continue forcing the chunk until the summon succeeds, to make sure it isn't inadvertently cleared ForgeChunkManager.forceChunk(serverLevelIn, MODID, summonPosIn, chunkPos.x, chunkPos.z, true, true); } The summon code itself uses serverLevelIn.getEntity(uuidIn) to retrieve the entity, and moves it as such.  It is then moved thusly: if (entity.isAlive()) { entity.moveTo(posIn.getX(), posIn.getY(), posIn.getZ()); serverLevelIn.playSound(null, entity, SoundEvents.ENDERMAN_TELEPORT, SoundSource.NEUTRAL, 1.0F, 1.0F); return true; } I originally was calling .getEntity() more frequently and didn't have the check for whether or not entities were loaded in place to prevent unnecessary code calls, but even with those safety measures in place, the lag still persists.  Could this just be an issue with 1.18's lack of optimization in certain areas?  Is there anything I can do to mitigate it?  Is there a performance boosting mod I could recommend alongside my own to reduce the chunk loading lag? At the end of the day, it does work, and I'm putting measures in place to prevent players from abusing the system to cause lag (i.e. each player can only have one queued summon at a time-- trying to summon another replaces the first call).  It's also not an unacceptable level of lag, IMO, given the infrequency of such calls, and the fact that I'm providing the option to toggle off the feature if server admins don't want it used.  However, no amount of lag is ideal, so if possible I'd love to find a more elegant solution-- or at least a mod recommendation to help improve it. Thanks!
    • When i start my forge server its on but when i try to join its come a error Internal Exception: java.lang.OutOfMemoryError: Requested array size exceeds VM limit Server infos: Linux Minecraft version 1.20.1 -Xmx11G -Xms8G
    • Also add the latest.log from your logs-folder
  • Topics

×
×
  • Create New...

Important Information

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