Jump to content

mooviies

Members
  • Posts

    10
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by mooviies

  1. 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 :) 

  2. 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.

  3. 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

  4. @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

  5. 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.

     

  6. 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!

  7. Did you find a solution for that problem? I have the same problem even if the number and order of states are matching. I also tried doing it with the exact same block that minecraft use to register it.

     

    Registration

    registry.registerAll(
                    new BlockLog(MaterialColor.WOOD, Block.Properties.create(Material.WOOD, MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)).setRegistryName("minecraft:oak_log")
            );

     

    Error

    Quote

    [05Sep2019 10:39:44.482] [Client thread/ERROR] [net.minecraftforge.registries.GameData/REGISTRIES]: Registry replacements for vanilla block 'minecraft:oak_log' must not change the number or order of blockstates.
        Old: axis={x,y,z}
        New: axis={x,y,z}

     

    The Old and New are the exact same thing... 

×
×
  • Create New...

Important Information

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