Jump to content

[1.14.4] Displaying vanilla items on ground perspective.


Recommended Posts

Posted (edited)

I'm trying to take the existing models of the items in minecraft and display them on the ground. It's pretty easy using a custom model but it would take a lot of time to do it for every items.

There's not a lot of documentation on 1.14 as of now and the best I could find seems to be from 1.12? Event the description in 1.13 doc doesn't seem to be up to date.

 

I also want to use baked model and not a TER which isn't the best for the performance. Especially since the models wouldn't change after the initialisation of the game.

I did a lot of digging in forge's code to try understanding what's exactly happening. I managed to use the ModelBakeEvent to add a custom IBakedModel.

I override the getQuads method and return a model that I got from the ModelManager. For now I'm just trying to do it with flint.

 

Since the only model present in the registry is the inventory variant of flint, I get the inventory model. Which is not made to be displayed in the world.

The result is a vertical flint with a black baground in the world.

 

I'm really lost as to what to do next. I probably need to apply some transforms to show it properly, but I don't know where or how to apply them and can't seem to find out. I've came across PerspectiveMapWrapper but I don't know what to pass to give it the OnGround perspective. There's a lot of deprecated methods and I'm not sure what I should use.

 

Here's some relevant parts of my code.

 

My IBakedModel

public class MBlockItemBakedModel implements IBakedModel {
    @Override
    public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand) {
        return Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes().getModelManager().getModel(new ModelResourceLocation("minecraft:flint", "inventory")).getQuads(state, side, rand);
    }

    @Override
    public boolean isAmbientOcclusion() {
        return true;
    }

    @Override
    public boolean isGui3d() {
        return false;
    }

    @Override
    public boolean isBuiltInRenderer() {
        return false;
    }

    @Override
    public TextureAtlasSprite getParticleTexture() {
        return Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes().getModelManager().getModel(new ModelResourceLocation("minecraft:flint", "inventory")).getParticleTexture();
    }

    @Override
    public ItemOverrideList getOverrides() {
        return Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes().getModelManager().getModel(new ModelResourceLocation("minecraft:flint", "inventory")).getOverrides();
    }
}

 

The onBakeEvent

@SubscribeEvent
public static void onBakeEvent(ModelBakeEvent event)
{
  Map<ResourceLocation, IBakedModel> modelRegistry = event.getModelRegistry();
  modelRegistry.put(new ModelResourceLocation(SCResourcesLocations.BLOCK_ITEM, ""), new MBlockItemBakedModel());
}

 

Thanks for any input!

Edited by mooviies
removed test code
Posted
10 minutes ago, mooviies said:

Map<ResourceLocation, IBakedModel> modelTest = new HashMap<>();  for(ResourceLocation r : modelRegistry.keySet()) { if(r.toString().contains("flint")) modelTest.put(r, modelRegistry.get(r)); }

What is this even supposed to do?...

 

10 minutes ago, mooviies said:

SCResourcesLocations.BLOCK_ITEM

What is this?

11 minutes ago, mooviies said:

Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes().getModelManager().getModel

Why are you using this? Flint isn't a Block. Use what ItemRenderer uses.(Take a look at it's class).

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.

Posted (edited)
Quote

What is this even supposed to do?...

That was some test code to look at what was in the registry. I forgot to remove it from my example. It does nothing. I removed it with an edit just after my post. You probably saw it before the edit.

 

Quote

What is this?

It's just a constant to a resource location

public static final ResourceLocation BLOCK_ITEM = new ResourceLocation(MyMod.MOD_ID, "sc_block_item");

 

Quote

Why are you using this? Flint isn't a Block. Use what ItemRenderer uses.(Take a look at it's class).

I just want to get the ModelManager which is the same for blocks and items as per the forge wiki.

Quote

The ModelManager may be acquired, without reflection or access tranformation, through Minecraft.getMinecraft().getRenderItem().getItemModelMesher().getModelManager() or Minecraft.getMinecraft().getBlockRenderDispatcher().getBlockModelShapes().getModelManager(). Contrary to their names, these are equivalent.

 

Edited by mooviies
Posted

@Animefan8888 thanks for the suggestion to look at ItemRenderer. This looks like to be what I'm searching for.

 

Already, the way to get the item's model looks less hacky. However it still does the same thing. I tried to do the same thing as in the renderItem method but it still does the same thing as my previous code.

 

I'm still investigating the class, if anyone as any input let me know :)

 

Here's my modified code

public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand, @Nonnull IModelData extraData) {
  IBakedModel ibakedmodel = Minecraft.getInstance().getItemRenderer().getModelWithOverrides(new ItemStack(Items.FLINT));
  return ForgeHooksClient.handleCameraTransforms(ibakedmodel, ItemCameraTransforms.TransformType.GROUND, false).getQuads(state, side, rand);
}

 

and also, something I didn't include in my first post. The result of the rendering.

 

2019-09-15_11.35.45.png

Posted (edited)

Well, your block is telling the game that it is a block that completely fills its space and is opaque. This is default behavior. As such the game culled all the faces on its neighbors.

Edited by Draco18s

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted (edited)

The background isn't really the problem. Just didn't set a block with the right configs for my test. What I really need to know is how to apply a transform to an IBakedModel if it's possible at all. It looks like I need to use the handleperspective method but my override is never called for some reason.

 

I'd want the item to be flat on the ground. So I'd need to apply a 90degree rotation.

 

EDIT:

 

I added an example of what I want. Right now I can do that using a custom model. However, I want to do the same thing using the item's model (So I don't have to create a model for all the items). I also don't want to use a TER since it's not good if I have a lot of those in the world.

2019-09-15_11.58.49.png

2019-09-15_17.02.05.png

Edited by mooviies
Posted (edited)

From what I think I understand. handlePerspective is only called when a model is rendered as an item and not when a block is rendered. So maybe, with a block there's no way to transform a model unless you use a TileEntityRenderer? I was really hoping to find a way around using a TER for that if possible at all. There must be a way since Minecraft is able to create IBakedModels with rotations when reading blockstate config files. I guess I'll start digging into the IBakedModels generation from the blockstates.

 

EDIT

Looks like I need to look into IUnbakedModel and create the model from there, a bit like forge does with its bucket.

Edited by mooviies
Posted (edited)

From what I've gathered I need to make an IUnbakedModel which represents the model. However I don't seem to find how to register it in 1.14. 

 

I've hooked onto the ModelRegistryEvent which seems to be the right one. I use it to register a ICustomModelLoader.

@SubscribeEvent
public static void onModelsRegistry(ModelRegistryEvent event)
{
  ModelLoaderRegistry.registerLoader(new MBlockItemModelLoader());
}

 

and I've created a dummy IUnbakedModel that just returns my current IBakedModel. I just want to get the same result that I have for now but using an IUnbakedModel.

For now I my ICustomModelLoader only returns my model. I've added in the accepts method that it accepts the resource location for my block. I've put breakpoints into both methods and none of the them are ever called so it must not have been registered correctly. 

 

public class MBlockItemModelLoader implements ICustomModelLoader {
    @Override
    public void onResourceManagerReload(IResourceManager resourceManager) {
    }

    @Override
    public boolean accepts(ResourceLocation modelLocation) {
        return modelLocation == SCResourcesLocations.BLOCK_ITEM; // Breakpoint here
    }

    @Override
    public IUnbakedModel loadModel(ResourceLocation modelLocation) throws Exception {
        return new MBlockItemModel();  // Breakpoint here
    }
}

 

How do I register it in 1.14? Or is there actually a whole other system I'm missing? I'm still trying to reverse engineer all of that but there's not really any vanilla block that does that. They seem to all use blockstates and json models. If you are aware of any mod that does that kind of stuff and has its source code available, I'd love to get a link to look into it :) 

Edited by mooviies

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

    • hello, I've been trying to resolve this problem on curseforge for a while because I can't find a solution, can someone help me? I put the logs of the problem above:       [23Jan2025 06:58:39.109] [main/INFO][cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher running: args [--username, cochon93, --version, forge-47.3.10, --gameDir, C:\Users\claey\curseforge\minecraft\Instances\create, --assetsDir, C:\Users\claey\curseforge\minecraft\Install\assets, --assetIndex, 5, --uuid, fd8a812c9e7a4ecbb8c750f0b8ffddf4, --accessToken, ????????, --clientId, OWM0NDE0ZmMtOWJiMS00OTBhLWIxYWYtMmI0ODM4Y2FkYTFl, --xuid, 2535422576924500, --userType, msa, --versionType, release, --width, 1024, --height, 768, --quickPlayPath, C:\Users\claey\curseforge\minecraft\Install\quickPlay\java\1737611916744.json, --launchTarget, forgeclient, --fml.forgeVersion, 47.3.10, --fml.mcVersion, 1.20.1, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20230612.114412] [23Jan2025 06:58:39.124] [main/INFO][cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher 10.0.9+10.0.9+main.dcd20f30 starting: java version 17.0.13 by Eclipse Adoptium; OS Windows 11 arch amd64 version 10.0 [23Jan2025 06:58:42.749] [main/INFO][net.minecraftforge.fml.loading.ImmediateWindowHandler/]: Loading ImmediateWindowProvider fmlearlywindow [23Jan2025 06:58:42.835] [main/INFO][EARLYDISPLAY/]: Trying GL version 4.6 [23Jan2025 06:58:43.030] [main/INFO][EARLYDISPLAY/]: Requested GL version 4.6 got version 4.6 [23Jan2025 06:58:43.145] [main/INFO][mixin/]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/claey/curseforge/minecraft/Install/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%23100!/ Service=ModLauncher Env=CLIENT [23Jan2025 06:58:43.195] [pool-2-thread-1/INFO][EARLYDISPLAY/]: GL info: NVIDIA GeForce RTX 4060 Laptop GPU/PCIe/SSE2 GL version 4.6.0 NVIDIA 561.03, NVIDIA Corporation [23Jan2025 06:58:44.664] [main/WARN][net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\claey\curseforge\minecraft\Install\libraries\net\minecraftforge\fmlcore\1.20.1-47.3.10\fmlcore-1.20.1-47.3.10.jar is missing mods.toml file [23Jan2025 06:58:44.668] [main/WARN][net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\claey\curseforge\minecraft\Install\libraries\net\minecraftforge\javafmllanguage\1.20.1-47.3.10\javafmllanguage-1.20.1-47.3.10.jar is missing mods.toml file [23Jan2025 06:58:44.670] [main/WARN][net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\claey\curseforge\minecraft\Install\libraries\net\minecraftforge\lowcodelanguage\1.20.1-47.3.10\lowcodelanguage-1.20.1-47.3.10.jar is missing mods.toml file [23Jan2025 06:58:44.674] [main/WARN][net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file C:\Users\claey\curseforge\minecraft\Install\libraries\net\minecraftforge\mclanguage\1.20.1-47.3.10\mclanguage-1.20.1-47.3.10.jar is missing mods.toml file [23Jan2025 06:58:45.326] [main/WARN][net.minecraftforge.jarjar.selection.JarSelector/]: Attempted to select two dependency jars from JarJar which have the same identification: Mod File: and Mod File: . Using Mod File: [23Jan2025 06:58:45.329] [main/WARN][net.minecraftforge.jarjar.selection.JarSelector/]: Attempted to select a dependency jar for JarJar which was passed in as source: cloth_config. Using Mod File: C:\Users\claey\curseforge\minecraft\Instances\create\mods\cloth-config-11.1.136-forge.jar [23Jan2025 06:58:45.329] [main/INFO][net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator/]: Found 48 dependencies adding them to mods collection     thank you very much for your help
    • After adding all my mods and everything loading up fine, I go to create a singleplayer world and it load to 100 then crashes saying: The game crashed: exception in server tick loop Error: java.lang.NoClassDefFoundError: net/luckperms/api/LuckPermsProvider Crash Report: https://pastebin.com/nmTTFBB4
    • i have just made a modpack and i accidentally added a few fabric mods and after deleting them i can no longer launch the pack if any one could help these are my latest logs [22:42:24] [main/INFO]:additionalClassesLocator: [optifine., net.optifine.] [22:42:25] [main/INFO]:Compatibility level set to JAVA_17 [22:42:25] [main/ERROR]:Mixin config epicsamurai.mixins.json does not specify "minVersion" property [22:42:25] [main/INFO]:Launching target 'forgeclient' with arguments [--version, forge-43.4.0, --gameDir, C:\Users\Mytht\curseforge\minecraft\Instances\overseer (1), --assetsDir, C:\Users\Mytht\curseforge\minecraft\Install\assets, --uuid, 4c176bf14d4041cba29572aa4333ca1d, --username, mythtitan0, --assetIndex, 1.19, --accessToken, ????????, --clientId, MGJiMTEzNGEtMjc3Mi00ODE0LThlY2QtNzFiODMyODEyYjM4, --xuid, 2535469006485684, --userType, msa, --versionType, release, --width, 854, --height, 480] [22:42:25] [main/WARN]:Reference map 'insanelib.refmap.json' for insanelib.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'corpsecurioscompat.refmap.json' for gravestonecurioscompat.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'nitrogen_internals.refmap.json' for nitrogen_internals.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'arclight.mixins.refmap.json' for epicsamurai.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'simplyswords-common-refmap.json' for simplyswords-common.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'simplyswords-forge-refmap.json' for simplyswords.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map '${refmap_target}refmap.json' for corgilib.forge.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:25] [main/WARN]:Reference map 'MysticPotions-forge-refmap.json' for mysticpotions.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:26] [main/WARN]:Reference map 'packetfixer-forge-forge-refmap.json' for packetfixer-forge.mixins.json could not be read. If this is a development environment you can ignore this message [22:42:26] [main/WARN]:Error loading class: atomicstryker/multimine/client/MultiMineClient (java.lang.ClassNotFoundException: atomicstryker.multimine.client.MultiMineClient) [22:42:26] [main/WARN]:@Mixin target atomicstryker.multimine.client.MultiMineClient was not found treechop.forge.compat.mixins.json:MultiMineMixin [22:42:26] [main/WARN]:Error loading class: com/simibubi/create/content/contraptions/components/fan/AirCurrent (java.lang.ClassNotFoundException: com.simibubi.create.content.contraptions.components.fan.AirCurrent) [22:42:26] [main/WARN]:Error loading class: shadows/apotheosis/ench/table/ApothEnchantContainer (java.lang.ClassNotFoundException: shadows.apotheosis.ench.table.ApothEnchantContainer) [22:42:26] [main/WARN]:@Mixin target shadows.apotheosis.ench.table.ApothEnchantContainer was not found origins_classes.mixins.json:common.apotheosis.ApotheosisEnchantmentMenuMixin [22:42:26] [main/WARN]:Error loading class: se/mickelus/tetra/blocks/workbench/WorkbenchTile (java.lang.ClassNotFoundException: se.mickelus.tetra.blocks.workbench.WorkbenchTile) [22:42:26] [main/WARN]:@Mixin target se.mickelus.tetra.blocks.workbench.WorkbenchTile was not found origins_classes.mixins.json:common.tetra.WorkbenchTileMixin [22:42:27] [main/WARN]:Error loading class: tfar/davespotioneering/blockentity/AdvancedBrewingStandBlockEntity (java.lang.ClassNotFoundException: tfar.davespotioneering.blockentity.AdvancedBrewingStandBlockEntity) [22:42:27] [main/WARN]:@Mixin target tfar.davespotioneering.blockentity.AdvancedBrewingStandBlockEntity was not found itemproductionlib.mixins.json:davespotioneering/AdvancedBrewingStandBlockEntityMixin [22:42:27] [main/WARN]:Error loading class: fuzs/visualworkbench/world/inventory/ModCraftingMenu (java.lang.ClassNotFoundException: fuzs.visualworkbench.world.inventory.ModCraftingMenu) [22:42:27] [main/WARN]:@Mixin target fuzs.visualworkbench.world.inventory.ModCraftingMenu was not found itemproductionlib.mixins.json:visualworkbench/ModCraftingMenuMixin [22:42:27] [main/WARN]:Error loading class: fuzs/easymagic/world/inventory/ModEnchantmentMenu (java.lang.ClassNotFoundException: fuzs.easymagic.world.inventory.ModEnchantmentMenu) [22:42:27] [main/WARN]:@Mixin target fuzs.easymagic.world.inventory.ModEnchantmentMenu was not found skilltree.mixins.json:easymagic/ModEnchantmentMenuMixin [22:42:27] [main/WARN]:Error loading class: shadows/apotheosis/ench/table/ApothEnchantmentMenu (java.lang.ClassNotFoundException: shadows.apotheosis.ench.table.ApothEnchantmentMenu) [22:42:27] [main/WARN]:@Mixin target shadows.apotheosis.ench.table.ApothEnchantmentMenu was not found skilltree.mixins.json:apotheosis/ApothEnchantContainerMixin [22:42:27] [main/WARN]:Error loading class: shadows/apotheosis/adventure/affix/socket/SocketingRecipe (java.lang.ClassNotFoundException: shadows.apotheosis.adventure.affix.socket.SocketingRecipe) [22:42:27] [main/WARN]:@Mixin target shadows.apotheosis.adventure.affix.socket.SocketingRecipe was not found skilltree.mixins.json:apotheosis/SocketingRecipeMixin [22:42:27] [main/WARN]:Error loading class: shadows/apotheosis/adventure/affix/socket/gem/bonus/AttributeBonus (java.lang.ClassNotFoundException: shadows.apotheosis.adventure.affix.socket.gem.bonus.AttributeBonus) [22:42:27] [main/WARN]:@Mixin target shadows.apotheosis.adventure.affix.socket.gem.bonus.AttributeBonus was not found skilltree.mixins.json:apotheosis/AttributeBonusMixin [22:42:27] [main/WARN]:Error loading class: shadows/apotheosis/adventure/affix/socket/gem/bonus/EnchantmentBonus (java.lang.ClassNotFoundException: shadows.apotheosis.adventure.affix.socket.gem.bonus.EnchantmentBonus) [22:42:27] [main/WARN]:@Mixin target shadows.apotheosis.adventure.affix.socket.gem.bonus.EnchantmentBonus was not found skilltree.mixins.json:apotheosis/EnchantmentBonusMixin [22:42:27] [main/WARN]:Error loading class: shadows/apotheosis/adventure/client/AdventureModuleClient (java.lang.ClassNotFoundException: shadows.apotheosis.adventure.client.AdventureModuleClient) [22:42:27] [main/WARN]:@Mixin target shadows.apotheosis.adventure.client.AdventureModuleClient was not found skilltree.mixins.json:apotheosis/AdventureModuleClientMixin [22:42:27] [main/WARN]:Error loading class: me/shedaniel/rei/RoughlyEnoughItemsCoreClient (java.lang.ClassNotFoundException: me.shedaniel.rei.RoughlyEnoughItemsCoreClient) [22:42:27] [main/WARN]:Error loading class: com/replaymod/replay/ReplayHandler (java.lang.ClassNotFoundException: com.replaymod.replay.ReplayHandler) [22:42:27] [main/WARN]:Error loading class: net/coderbot/iris/pipeline/newshader/ExtendedShader (java.lang.ClassNotFoundException: net.coderbot.iris.pipeline.newshader.ExtendedShader) [22:42:27] [main/WARN]:Error loading class: net/irisshaders/iris/pipeline/programs/ExtendedShader (java.lang.ClassNotFoundException: net.irisshaders.iris.pipeline.programs.ExtendedShader) [22:42:27] [main/INFO]:Initializing MixinExtras via com.llamalad7.mixinextras.service.MixinExtrasServiceImpl(version=0.3.6).
    • My Mohist server crashed as well but all it says in logs is " C:\Minecraft Mohist server>java -Xm6G -jar mohist.jar nogul  Error: Unable to access jarfile mohist.jar   C:\Minecraft Mohist server>PAUSE press any key to continue  .  .  . " Any ideas? i have the server file that its looking for where its looking for it.
  • Topics

×
×
  • Create New...

Important Information

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