Jump to content

[1.10.2] Issue with fluid JSON files


Gunmetal_Gears

Recommended Posts

I'm trying to add a liquid, called Liquid Mercury, but the game continually gives me json blockstate errors.

 

Here is one of the errors:

Spoiler

[16:17:33] [Client thread/ERROR] [FML]: Exception loading model for variant smalladditions:fluid#liquid_mercury for blockstates ["smalladditions:liquid_mercury[level=3]", "smalladditions:liquid_mercury[level=2]", "smalladditions:liquid_mercury[level=1]", "smalladditions:liquid_mercury[level=0]", "smalladditions:liquid_mercury[level=7]", "smalladditions:liquid_mercury[level=6]", "smalladditions:liquid_mercury[level=5]", "smalladditions:liquid_mercury[level=4]", "smalladditions:liquid_mercury[level=11]", "smalladditions:liquid_mercury[level=10]", "smalladditions:liquid_mercury[level=9]", "smalladditions:liquid_mercury[level=8]", "smalladditions:liquid_mercury[level=15]", "smalladditions:liquid_mercury[level=14]", "smalladditions:liquid_mercury[level=13]", "smalladditions:liquid_mercury[level=12]"]
net.minecraftforge.client.model.ModelLoaderRegistry$LoaderException: Exception loading model smalladditions:fluid#liquid_mercury with loader VariantLoader.INSTANCE, skipping
    at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:153) ~[ModelLoaderRegistry.class:?]
    at net.minecraftforge.client.model.ModelLoader.registerVariant(ModelLoader.java:252) ~[ModelLoader.class:?]
    at net.minecraft.client.renderer.block.model.ModelBakery.loadBlock(ModelBakery.java:145) ~[ModelBakery.class:?]
    at net.minecraftforge.client.model.ModelLoader.loadBlocks(ModelLoader.java:240) ~[ModelLoader.class:?]
    at net.minecraftforge.client.model.ModelLoader.setupModelRegistry(ModelLoader.java:147) ~[ModelLoader.class:?]
    at net.minecraft.client.renderer.block.model.ModelManager.onResourceManagerReload(ModelManager.java:28) [ModelManager.class:?]
    at net.minecraft.client.resources.SimpleReloadableResourceManager.registerReloadListener(SimpleReloadableResourceManager.java:122) [SimpleReloadableResourceManager.class:?]
    at net.minecraft.client.Minecraft.startGame(Minecraft.java:540) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:386) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_102]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_102]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_102]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_102]
    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_102]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_102]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_102]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_102]
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    at GradleStart.main(GradleStart.java:26) [start/:?]
Caused by: net.minecraft.client.renderer.block.model.ModelBlockDefinition$MissingVariantException
    at net.minecraft.client.renderer.block.model.ModelBlockDefinition.getVariant(ModelBlockDefinition.java:78) ~[ModelBlockDefinition.class:?]
    at net.minecraftforge.client.model.ModelLoader$VariantLoader.loadModel(ModelLoader.java:1195) ~[ModelLoader$VariantLoader.class:?]
    at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:149) ~[ModelLoaderRegistry.class:?]
    ... 21 more

 

 

Here is my blockstate json (called liquid_mercury.json,): 

Spoiler

{    
    "forge_marker": 1,
    "defaults": {
        "model": "forge:fluid"
    },
    "variants": {
        "liquid_mercury": {
            "custom": { "fluid": "liquid_mercury" }
        }
    }
}
 

 

In game, the liquid works as it should; it flows and whatnot, but it is made up of cubes and is pink and black. Here's a screenshot: ZGgcD3b.png

Link to comment
Share on other sites

6 hours ago, diesieben07 said:

The log clearly tells you which variant it is looking for. You do not have that variant in your blockstate.

I don't know how to add these levels to my blockstate. There's no documentation for this anywhere, as far as I can tell, so I have no idea what I'm doing. It appears as though I'm using the wrong syntax, because I keep getting malformed json errors, but I don't know what the right syntax would be.

Link to comment
Share on other sites

15 hours ago, Gunmetal_Gears said:

smalladditions:fluid#liquid_mercury

This is the variant it's trying to render. That means it's looking for a blockstates file (in assets/smalladditions/blockstates) called fluid.json, and a variant in that file called "liquid_mercury". You either need to rename your file and variants, or change the ModelResourceLocation that your fluid tries to render. If you need more help, post the code where you register your fluid's state mapper etc.

Link to comment
Share on other sites

19 minutes ago, Jay Avery said:

This is the variant it's trying to render. That means it's looking for a blockstates file (in assets/smalladditions/blockstates) called fluid.json, and a variant in that file called "liquid_mercury". You either need to rename your file and variants, or change the ModelResourceLocation that your fluid tries to render. If you need more help, post the code where you register your fluid's state mapper etc.

I've renamed the json to 'fluid.json' and I am getting the same errors.

Here is where I'm registering the state mapper:

Spoiler

void registerFluidModel(BlockFluidBase fluidBlock) {
        final Item item = Item.getItemFromBlock(fluidBlock);
        assert item != null;
        ModelBakery.registerItemVariants(item);
        final ModelResourceLocation modelResourceLocation = new ModelResourceLocation(FLUID_RESOURCE_PATH, fluidBlock.getFluid().getName());
        ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition() {
            @Override
            public ModelResourceLocation getModelLocation(ItemStack stack) {
                return modelResourceLocation;
            }
        });
        ModelLoader.setCustomStateMapper(fluidBlock, new StateMapperBase() {
            @Override
            protected ModelResourceLocation getModelResourceLocation(IBlockState p_178132_1_) {
                return modelResourceLocation;
            }
        });
    }

 

Link to comment
Share on other sites

2 minutes ago, Jay Avery said:

Post the latest console log (in full) and the most up-to-date blockstates file. Also, please use the code tags (<> icon), otherwise it's hard to read.

Sorry about that; I'll use those tags from now on. Here's the entire console log, from the moment I pressed run to when the game's menu opened: https://pastebin.com/LRseFTZD

Link to comment
Share on other sites

I just did some poking around my own fluid rendering and I think I've found the problem. For some reason (I don't 100% understand the forge blockstates format myself...), forge doesn't seem to understand fluid blockstates if the "model" is defined in the "defaults" section and the "variant" is surrounded only by curly brackets {} . Either you need to define the model individually inside each variant:

{
  "forge_marker": 1,
  "variants": {
    "your_fluid_type": {
      "model": "forge:fluid",
      "custom": { "fluid": "your_fluid_name" }
    }
  }
}

Or you need to wrap each variant in square brackets [] too:

{
  "forge_marker": 1,
  "defaults": {
    "model": "forge:fluid"
  },
  "variants": {
    "your_fluid_type": [{
       "custom": { "fluid": "your_fluid_name" }
    }]
  }
}

 

I'm guessing it's something to do with the use of the "custom" tag, but maybe someone very knowledgeable about the forge blockstates format can explain fully.

Link to comment
Share on other sites

11 minutes ago, Jay Avery said:

I just did some poking around my own fluid rendering and I think I've found the problem. For some reason (I don't 100% understand the forge blockstates format myself...), forge doesn't seem to understand fluid blockstates if the "model" is defined in the "defaults" section and the "variant" is surrounded only by curly brackets {} . Either you need to define the model individually inside each variant:


{
  "forge_marker": 1,
  "variants": {
    "your_fluid_type": {
      "model": "forge:fluid",
      "custom": { "fluid": "your_fluid_name" }
    }
  }
}

Or you need to wrap each variant in square brackets [] too:


{
  "forge_marker": 1,
  "defaults": {
    "model": "forge:fluid"
  },
  "variants": {
    "your_fluid_type": [{
       "custom": { "fluid": "your_fluid_name" }
    }]
  }
}

 

I'm guessing it's something to do with the use of the "custom" tag, but maybe someone very knowledgeable about the forge blockstates format can explain fully.

Hey, look at that, it actually works! Thank you so much!

Seems like the simplest mistakes can lead to the most elusive problems.

Link to comment
Share on other sites

Glad to help! Json can be a nightmare for small and inexplicable bugs. D:

 

I just dug through the ForgeBlockStateV1 code to understand why this happens. It's not specifically to do with the "custom" tag, it's just the way that forge identifies fully-defined variants. The way forge recognises a partially-defined variant (one where the properties will be combined with the properties from all other variants) is that the first element inside the variant is a json object (a tag followed by curly brackets). So the variant "property_name" is recognised as partially defined because the first element inside it is "one_value": { }, a json object:

"variants": {
    "property_name": {
     	"one_value": {
             // submodels and whatnot 
        },
        "another_value": {
            // submodels and whatnot 
        }
    }
}

 

And a fully-defined variant which starts with, say, a "model" tag will be recognised because the first element inside it is not a json object (it's a json primitive, a tag and one string):

"variants": {
    "full_variant": {
     	"model": "modid:modelname" 
    }
}

 

But, in a case like a fluid blockstates file, you might want to make a fully-defined variant (one that shouldn't be combined with other properties) where the first tag inside it happens to be a json object, like the "custom" tag:

"variants": {
    "fluid_variant": {
     	"custom": {
            // etc
        }
    }
}

 

So forge gets confused and thinks this is a property variant like the first example, and can't find it properly when it's needed. But (other than making sure the first element in the variant is an object, like by putting the "model" tag first inside every one), this check will be overriden if the variant is a json array (a tag followed by square brackets):

"variants": {
    "fluid_variant": [{
     	"custom": {
            // etc
        }
    }]
}

 

Sorry for the infodump, I got a bit focused on working this out because I've always been irritated by not understanding forge blockstates. :D I've seen advice to "use an array for fully-defined variants" but never quite understood why that was or how exactly it's defined.

 

 

Edited by Jay Avery
  • Like 1
Link to comment
Share on other sites

1 hour ago, Alpvax said:

@Jay Avery  Really helpful and fully descriptive post. Could you update the documentation with this information. (Doc repository here).

I've never contributed to something on github before and I'm a bit unsure of what to do. Plus there's an open pull request for a big overhaul of the models and blockstates documentation so my small addition will probably get in the way?

Link to comment
Share on other sites

I have asked the people working on the PR to integrate the information you posted.

 

In order to contribute, you need to create a copy (fork) of the repository, make the changes, and then open a PR between the 2 repositories.

Edited by Alpvax
Link to comment
Share on other sites

2 hours ago, Alpvax said:

I have asked the people working on the PR to integrate the information you posted.

 

In order to contribute, you need to create a copy (fork) of the repository, make the changes, and then open a PR between the 2 repositories.

Thank you! :)

Link to comment
Share on other sites

I'm having one other issue with my mod. I can't seem to get the universal bucket system to work. The link to my GitHub page is up above, Xechon added it.


The issue I'm having is that I'm trying to add a shapeless recipe that takes four items (three Drops of Mercury, which are from my mod, and an empty bucket) and returns a bucket that's full of liquid mercury. As it currently stands, it creates a pink and black square in the crafting menu, and the moment I mouse over it, it crashes the game due to a null pointer exception. 

Here's a crash report from it: https://pastebin.com/6LyMM573

 

The recipe is in my init event in my Main class.

Link to comment
Share on other sites

That's definitely a step in the right direction. However, the item doesn't have any texture. It's still a pink and black square.

 

Slightly unrelated, but I also have no idea how to get my fluid to have proper liquid physics. It has no collision with entities, they walk right through it like air.

Link to comment
Share on other sites

I don't know anything about the universal bucket textures, I'm afraid.

 

The fluids thing though - unfortunately forge fluids don't do anything with collisions. So if you want to e.g. make entities slow down in the fluid, you'll have to manually implement something. I have a very simple version here, overriding onEntityCollidedWithBlock to reduce the entity's horizontal motion by a fixed amount.

Edited by Jay Avery
  • Like 1
Link to comment
Share on other sites

23 hours ago, Jay Avery said:

I don't know anything about the universal bucket textures, I'm afraid.

 

The fluids thing though - unfortunately forge fluids don't do anything with collisions. So if you want to e.g. make entities slow down in the fluid, you'll have to manually implement something. I have a very simple version here, overriding onEntityCollidedWithBlock to reduce the entity's horizontal motion by a fixed amount.

Awesome, thank you! I knew it had to be something with that particular method; I just couldn't quite figure out what it was.

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

    • Right now im trying to make an own mod for minecraft for the version 1.16.5 with forge but whatever i do it still doesnt fix the error this is my build.gradle : buildscript { repositories { maven { url = "https://maven.minecraftforge.net" } mavenCentral() } dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:5.1.+' } } apply plugin: 'net.minecraftforge.gradle' apply plugin: 'java' group = 'com.example' // Modify to your package name version = '1.0' archivesBaseName = 'flippermod' java { toolchain { languageVersion = JavaLanguageVersion.of(8) } } minecraft { version = "1.16.5-36.2.42" // Ensure this matches your Forge version mappings channel: 'official', version: '1.16.5' runs { client { workingDirectory project.file('run') property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' property 'forge.logging.console.level', 'debug' mods { flipper_mod { sourceSets.main.output } } } } } repositories { maven { url = "https://maven.minecraftforge.net/" } mavenCentral() } dependencies { minecraft "net.minecraftforge:forge:1.16.5-36.2.42" } and this one is my settings.gradle:  pluginManagement { repositories { gradlePluginPortal() maven { name = 'MinecraftForge' url = 'https://maven.minecraftforge.net/' } } } plugins { id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' } rootProject.name = 'flippermod' this one is the mods.tml    modLoader="javafml" loaderVersion="[36,)" modId="flippermod" version="1.0.0" displayName="Flippermod" and the last one is the gradle-wrapper.properties distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip dc :"code_slivki"
    • Today I tried downloading 1.16.5 forge (the recommended version) and when installing I selected "download client". At the end just before appeared "These libraries failed to download. Try again." and at the bottom there were "org.apache.logging.log4j:log4j-api:2.15.0 ; org.apache.logging.log4j:log4j-core:2.15.0 and org.apache.logging.log4j:log4j-slf4j18-impl2.15.0" I tried the newest version and the same thing appeared
    • I think the problem is the server doesn't have enough ram, but I need to be sure before buying more. The modpack I use is Craft of exile 2 and the server has 4gb ram. When I try to turn it on I get a bunch of warns and at the end it just says "[Multicraft] Skipped 564 lines due to rate limit (160/s)" Is there a way to increase the rate limit? One time it did start, but without half of the mods. The modpack works perfectly fine on my computer even if I have the launch ram limit to 4gb.
    • Nevermind, RedstoneWireBlock.java had what I needed. Surprised I didn't try looking there until now.
    • I tried to open my Minecraft world normally and got the error "Errors in currently selected data pacts prevented the world from loading." Trying to start in safe mode gives the error "This world contains invalid or corrupted save data." My recent log is too large to make a Pastebin link. Any help would be much appreciated. 
  • Topics

×
×
  • Create New...

Important Information

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