Cilka Posted October 2, 2019 Posted October 2, 2019 As the title says, I'm not sure why this method is causing a problem. I'm using the jar from gradle build, I have my sides properly set up (via IProxy), but this only breaks when I run this on a server. I know I'm probably missing something simple, but its not obvious to me. Crash Report: Reveal hidden contents ---- Minecraft Crash Report ---- // This doesn't make any sense! Time: 10/1/19 10:35 PM Description: Exception in server tick loop java.lang.NullPointerException: Can't use a null-name for the registry, object null. at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:864) at net.minecraftforge.registries.ForgeRegistry.add(ForgeRegistry.java:287) at net.minecraftforge.registries.ForgeRegistry.add(ForgeRegistry.java:281) at net.minecraftforge.registries.ForgeRegistry.register(ForgeRegistry.java:113) at net.minecraftforge.registries.ForgeRegistry.registerAll(ForgeRegistry.java:154) at com.cilka.telgt.EventSubscriber.registerBlocks(EventSubscriber.java:53) at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_5_EventSubscriber_registerBlocks_Register.invoke(.dynamic) at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) at net.minecraftforge.fml.common.eventhandler.EventBus$1.invoke(EventBus.java:144) at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182) at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:845) at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:630) at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandler.java:99) at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:333) at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:125) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486) at java.lang.Thread.run(Unknown Source) package com.cilka.telgt.block; import com.cilka.telgt.Main; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.util.BlockRenderLayer; public class BaseBlock extends Block { private String blockName; private BlockRenderLayer layer; private String tabName; public BaseBlock(String blockName) { super(Material.ROCK); setCreativeTab(CreativeTabs.MISC); setSoundType(SoundType.CLOTH); this.blockName = blockName; SetRegistrationFromFile(); } public BaseBlock(String blockName, BlockOptions options) { super(options.GetMaterial()); setCreativeTab(options.GetTab()); setSoundType(options.GetSound()); this.blockName = blockName; this.layer = options.GetLayer(); SetRegistrationFromFile(); } public String GetBlockName() { return blockName; } @Override public BlockRenderLayer getRenderLayer() { return layer != null ? layer : super.getRenderLayer(); } @Override public boolean isOpaqueCube(IBlockState state) { return !getRenderLayer().equals(BlockRenderLayer.TRANSLUCENT); } private void SetRegistrationFromFile() { setRegistryName(Main.MODID, blockName); setTranslationKey(blockName); } } Quote
SerpentDagger Posted October 2, 2019 Posted October 2, 2019 On 10/2/2019 at 4:03 AM, Cilka said: java.lang.NullPointerException: Can't use a null-name for the registry, object null. Expand Somewhere you're trying to register a block to a null registry name. You should trace this back from EventSubscriber.registerBlocks() with the debugger to find out where the name isn't being set, if it's tricky enough. Also: Code-Style #4 Quote Fancy 3D Graphing Calculator mod, with many different coordinate systems. Lightweight 3D/2D position/vector transformations library, also with support for different coordinate systems.
Cilka Posted October 2, 2019 Author Posted October 2, 2019 On 10/2/2019 at 4:33 AM, SerpentDagger said: Somewhere you're trying to register a block to a null registry name. You should trace this back from EventSubscriber.registerBlocks() with the debugger to find out where the name isn't being set, if it's tricky enough. Also: Code-Style #4 Expand Originally I thought that too. I traced it back to the BaseBlock.isOpaqueBlock method and found that replacing the return with false makes the server happy. I can double check, and see what else I've missed. Quote
SerpentDagger Posted October 2, 2019 Posted October 2, 2019 Wait, where are you even getting the getRenderLayer() method from? It's not a method accessible via Block, so your compiler should be shouting about that. The method I've been using is Block#getBlockLayer(), which does what I think you want. The only reference I've found to getRenderLayer() is MinecraftForgeClient#getRenderLayer(). Quote Fancy 3D Graphing Calculator mod, with many different coordinate systems. Lightweight 3D/2D position/vector transformations library, also with support for different coordinate systems.
Ommina Posted October 2, 2019 Posted October 2, 2019 It is, however, getRenderLayer() in 1.14.4. The thread title claims 1.12.2 -- has there been an attempt to copy/paste some 1.14.4 sample code into the 1.12.2 project, with unhappy results? Quote
Cilka Posted October 2, 2019 Author Posted October 2, 2019 On 10/2/2019 at 5:44 AM, SerpentDagger said: Wait, where are you even getting the getRenderLayer() method from? It's not a method accessible via Block, so your compiler should be shouting about that. The method I've been using is Block#getBlockLayer(), which does what I think you want. The only reference I've found to getRenderLayer() is MinecraftForgeClient#getRenderLayer(). Expand I just looked at the source of net.minecraft.block and It had the getRenderLayer() method in there. If I try to use getBlockLayer(), the comipler complains that the method doesn't exist, which looking though source code it doesn't either. On 10/2/2019 at 9:50 AM, Ommina said: It is, however, getRenderLayer() in 1.14.4. The thread title claims 1.12.2 -- has there been an attempt to copy/paste some 1.14.4 sample code into the 1.12.2 project, with unhappy results? Expand I was using a 1.12.2 tutorial from Harry's Tech Reviews as my base. I did notice that many of the things that he does in the tutorial goes against forge coding standards, so something could be off when I copied that line. Quote
SerpentDagger Posted October 2, 2019 Posted October 2, 2019 (edited) Hmm. It seems, then, that you've installed a 1.14 version by mistake? Regardless, assuming it works the same way in 1.(?), Block#getBlockLayer() is annotated with @SideOnly(Side.CLIENT), so it only exists on the physical client. Block#isOpaqueCube(), however, is present on both the physical client and the physical server. So when you call getBlockLayer() within isOpaqeCube(), it'll crash a physical server. Edit: Also, Block#isOpaqueCube() is deprecated. I think you only have to use Block#getBlockLayer() now. Edited October 2, 2019 by SerpentDagger Quote Fancy 3D Graphing Calculator mod, with many different coordinate systems. Lightweight 3D/2D position/vector transformations library, also with support for different coordinate systems.
Cilka Posted October 3, 2019 Author Posted October 3, 2019 (edited) On 10/2/2019 at 8:58 PM, SerpentDagger said: Hmm. It seems, then, that you've installed a 1.14 version by mistake? Regardless, assuming it works the same way in 1.(?), Block#getBlockLayer() is annotated with @SideOnly(Side.CLIENT), so it only exists on the physical client. Block#isOpaqueCube(), however, is present on both the physical client and the physical server. So when you call getBlockLayer() within isOpaqeCube(), it'll crash a physical server. Edit: Also, Block#isOpaqueCube() is deprecated. I think you only have to use Block#getBlockLayer() now. Expand I've looked in the .iml file and found that I am using version 1.12.2-14.23.5.2768 as evident here <libelement value="jar://$USER_HOME$/.gradle/caches/minecraft/net/minecraftforge/forge/1.12.2-14.23.5.2768/stable/39/forgeSrc-1.12.2-14.23.5.2768.jar!/" /> I'll see if updating forge to the latest version of 1.12.2 will work. Edit: So I don't know why I didn't think of this before, but I have a work around now. @Override public boolean isOpaqueCube(IBlockState state) { return layer != null ? !layer.equals(BlockRenderLayer.TRANSLUCENT) : super.isOpaqueCube(state); } The way I've initialize my blocks I will always use layer instead of getRenderLayer(). Slightly jank, but doesn't blow up my server. Thanks everyone! Edited October 3, 2019 by Cilka Solved my problem Quote
Recommended Posts
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.