Jump to content

[1.9] Render custom item


TPD

Recommended Posts

  • Replies 54
  • Created
  • Last Reply

Top Posters In This Topic

I'm pretty sure you need to use the new JSON model system or IBakedModels. I have found no tutorials on either of these.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

You could read diesiebens 2nd response and that may answer your question.

http://www.minecraftforge.net/forum/index.php/topic,39203.0/wap2.html

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

Is it possible to cancel the rendering of only the item in one Hand during 'RenderHandEvent'/are there also events that get fired for each Hand independently?

 

If not, is there a reliable way to render the item in a hand?

Link to comment
Share on other sites

Why was IItemRenderer removed?

The mod that I'm working on is FlansMod. I want to update it to 1.10 but it has it's own way of rendering things and the models and animations of all weapons and vehicles are made with this system. It's probably not possible to implement IModel / IBakedModel to this...

Link to comment
Share on other sites

Ok. This means I will use the new system.

 

I still don't exactly understand how IModel and IBakedModel are implemented. I can try to explain how the current Model system works, maybe you know how I could implement it.

 

This is a (very simplified) schematic where I try to explain how it works:

tJk2Qmj.png

 

This is for example what the Model class of a gun looks like:

[spoiler=ModelM9.java]


public class ModelM9 extends ModelGun 
{
public ModelM9()
{
	int textureX = 32;
	int textureY = 16;

	gunModel = new ModelRendererTurbo[3];

	gunModel[0] = new ModelRendererTurbo(this, 0, 0, textureX, textureY);
	gunModel[0].addBox(-1F, -2F, -1F, 3, 4, 2);

	gunModel[1] = new ModelRendererTurbo(this, 0, 6, textureX, textureY);
	gunModel[1].addBox(-1F, 2F, -1F, 8, 1, 2);

	gunModel[2] = new ModelRendererTurbo(this, 0, 9, textureX, textureY);
	gunModel[2].addBox(-0.5F, 3.5F, -0.5F, 8, 1, 1);

	slideModel = new ModelRendererTurbo[3];

	slideModel[0] = new ModelRendererTurbo(this, 0, 12, textureX, textureY);
	slideModel[0].addBox(-1F, 3F, -1F, 8, 2, 2);

	slideModel[1] = new ModelRendererTurbo(this, 10, 2, textureX, textureY);
	slideModel[1].addBox(5.95F, 4.5F, -0.5F, 1, 1, 1);

	slideModel[2] = new ModelRendererTurbo(this, 8, 0, textureX, textureY);
	slideModel[2].addBox(-0.8F, 4.5F, -0.5F, 1, 1, 1);

	ammoModel = new ModelRendererTurbo[1];

	ammoModel[0] = new ModelRendererTurbo(this, 14, 0, textureX, textureY);
	ammoModel[0].addBox(-0.5F, -1.8F, -0.5F, 2, 4, 1);

	barrelAttachPoint = new Vector3f(7.5F / 16F, 4F / 16F, 0F);

	scopeAttachPoint = new Vector3f(3F / 16F, 5F / 16F, 0F);
	scopeIsOnSlide = true;

	gunSlideDistance = 0.25F;
	animationType = EnumAnimationType.PISTOL_CLIP;
}
}

 

 

Here's the source of the mod: https://github.com/gitgud-software/FlansMod

(changes to the mod made by me are not yet committed, but I can commit them if you need the code; I fixed the compiler errors and started fixing bugs)

 

 

Link to comment
Share on other sites

The mod adds many different items for which I need different ICustomModelLoaders. How should I determine whether or not the ICustomLoader accepts it when I just have a ResourceLocation?

 

Edit: nvm. that was a stupid question. I can just add a folder called guns in assets/flansmod/models/item right?

Link to comment
Share on other sites

I'm not sure if it's possible to use the same format for each kind of item... Guns should consist of multiple parts that will have to be moved independently during reloading-animations and so on, but Plane-Models, for example, have other properties...

Link to comment
Share on other sites

Hm ok.

What file-format would you suggest? I can't use a simple .obj-file because the file has to store multiple "sub-objects" (IModelPart) and also other information (for example points where gun attachments/upgrades should be placed).

Should I use a .zip-file that contains .obj files? That would make it possible to edit the model with 3d-programs.

Link to comment
Share on other sites

Do you think it's ok to just have one ICustomModelLoader, store what kind of IModel it describes in the model file and then make the ICustomModelLoader load/instantiate the IModel accordingly?

 

Also what textures do I have to return in getTextures() of IModel and where should I get them from? I mean, aren't textures stored separately?

Link to comment
Share on other sites

Currently the mods stores things like attachments and paintjobs in the ItemStack (as NBT data). Is there a way to get the NBT data during baking? If not: How would I implement attachments and paintjobs?

Link to comment
Share on other sites

I have two more questions:

  • Why is ICustomModelLoader::loadModel called twice for every item?
  • How can I make the Item render in the vanilla way when it's in the inventory/GUIs?

This is what I tried to do in my IPerspectiveAwareModel:

     @Override
    public Pair<? extends IBakedModel, Matrix4f> handlePerspective(ItemCameraTransforms.TransformType cameraTransformType) {
        switch (cameraTransformType) {
            case GUI:
                return Pair.of(Minecraft.getMinecraft().getRenderItem().getItemModelMesher().getModelManager().getModel(new ModelResourceLocation(resourceLocation, null)), null);
        }

        return Pair.of(this, null);
    }

 

The result is just a purple-black square. How can I specify the texture correctly?

Link to comment
Share on other sites

With normal, I mean a "2D-Item". The way almost all Items in the game are rendered. I also tried ModelResourceLocation(resourceLocation, "inventory") and ModelResourceLocation(resourceLocation, "normal") (which is the same as ModelResourceLocation(resourceLocation, null)) with the same outcome.

Link to comment
Share on other sites

The normal "2D-Item" model is defined in "item/handheld.json". If you want a textured variant of this model, load it using

ModelLoaderRegistry.getModel(new ResourceLocation("item/handheld"))

, cast to

IRetexturableModel

and retexture it to use whichever texture you want (make sure the texture is loaded, if need be via

TextureStitchEvent

). The base texture for this item model is called "layer0", so you'd do

IRetexturableModel::retexture(ImmutableMap.of("layer0", <myTexture>))

.

You can then bake the resulting

IModel

.

 

I think you mean

builtin/generated

or

item/generated

.

builtin/generated

is the base 2D-style model,

item/generated

extends this and defines the standard display transformations. Most basic item models extend

item/generated

.

 

item/handheld

extends

item/generated

and redefines the first/third-person display transformations to change how the item renders when held by an entity. Vanilla tool models extend this.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

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

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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