Jump to content

[1.16.5] Attempting to Register Blockstates


Syric

Recommended Posts

I'm currently trying to make a new cauldron-type block, and I'm having difficulty implementing blockstates. Here's the relevant part of the alchemical cauldron's code:

 

public class AlchemicalCauldronBlock extends Block {
    public static final IntegerProperty LEVEL = IntegerProperty.create("level", 1, 3);
    private static final VoxelShape INSIDE = box(2.0D, 4.0D, 2.0D, 14.0D, 16.0D, 14.0D);
    protected static final VoxelShape SHAPE = VoxelShapes.join(VoxelShapes.block(), VoxelShapes.or(box(0.0D, 0.0D, 4.0D, 16.0D, 3.0D, 12.0D), box(4.0D, 0.0D, 0.0D, 12.0D, 3.0D, 16.0D), box(2.0D, 0.0D, 2.0D, 14.0D, 3.0D, 14.0D), INSIDE), IBooleanFunction.ONLY_FIRST);

    public AlchemicalCauldronBlock() {
        super(Properties.of(Material.METAL).sound(SoundType.METAL).harvestLevel(3).strength(2F,2F));
//        this.registerDefaultState(this.stateDefinition.any().setValue(LEVEL, 0));
//        this.registerDefaultState(this.stateDefinition.any().setValue(LEVEL, Integer.valueOf(0)));
    }
...

When I try to run this with either of the two attempts at registerDefaultState uncommented, I get this error: https://pastebin.com/vPf3UryC. For convenience, I believe this part is most relevant:

Quote

Details:
    Mod File: main
    Failure message: Alchemy Plus (alchemyplus) encountered an error during the load_registries event phase
        java.lang.IllegalArgumentException: Cannot set property IntegerProperty{name=level, clazz=class java.lang.Integer, values=[1, 2, 3]} as it does not exist in Block{null}
    Mod Version: NONE
    Mod Issue URL: NOT PROVIDED
    Exception message: java.lang.IllegalArgumentException: Cannot set property IntegerProperty{name=level, clazz=class java.lang.Integer, values=[1, 2, 3]} as it does not exist in Block{null}

How can I avoid this? My registry classes look like this, if it helps:

public class registry {

    public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, AlchemyPlus.MODID);
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, AlchemyPlus.MODID);

    public static void register() {
        IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
        BLOCKS.register(modEventBus);
        ITEMS.register(modEventBus);

        registerItems.register();
        registerBlocks.register();
    }

}
public class registerBlocks {

    public static final RegistryObject<Block> ALCHEMICAL_CAULDRON = register("alchemical_cauldron", AlchemicalCauldronBlock::new);

    static void register() {}

    private static <T extends Block> RegistryObject<T> registerNoItem(String name, Supplier<T> block) {
        return registry.BLOCKS.register(name, block);
    }

    private static <T extends Block> RegistryObject<T> register(String name, Supplier<T> block) {
        RegistryObject<T> ret = registerNoItem(name, block);
        registry.ITEMS.register(name, () -> new BlockItem(ret.get(), new Item.Properties().tab(ItemGroup.TAB_BREWING)));
        return ret;
    }

}

Full GitHub repository available here.

 

(Other minor problem(?):  I copied the methods getShape and getInteractionShape from net.minecraft.block.CauldronBlock and I'm getting these weird warnings. What's up with that? Do I need to worry about it?)

image.thumb.png.d7de8f6211459760f9425a09fe31b5c4.png
 

Link to comment
Share on other sites

Mojang marks methods as deprecated meaning "do not call this directly, call the BlockState version." It is not a "do not override indicator."

 

There are literally hundreds of posts about it on this forum.

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.

Link to comment
Share on other sites

You lack this method:
https://github.com/Draco18s/ReasonableRealism/blob/1.14.4/src/main/java/com/draco18s/harderores/block/ore/HardOreBlock.java#L51-L54

I'm not sure what the Mojang mapping name is for it, but you still lack it.

  • Thanks 1

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.

Link to comment
Share on other sites

Every implementation of blockstates I've been able to find (including the one you just linked) does something along the lines of:

this.setDefaultState(this.stateDefinition.any().setValue(LEVEL, Integer.valueOf(0)));

but setDefaultState shows up red and IntelliJ claims it can't resolve the symbol. I assume the method's been renamed. Where can I find it? If it's registerDefaultState then I'm already using that, so that's not the solution (oh well).

 

As for your suggestion of what is needed, adding that method did not change the outcome- in fact, it threw an error because it didn't actually override anything.

My bad, you said you didn't know the Mojang mapping. Never mind.

If anyone else has suggestions, my original problem is still present.

Edited by Syric
Link to comment
Share on other sites

setDefaultState is called in mojang mappings registerDefaultState
you can use the bot an the forge discord server
https://discord.com/invite/UvedJ9m

EDIT: commands:

  • mcpe -> mojang : !moj -c mcp methode/field/(1.17) class
  • mojang -> mcpe : !mcp -c moj methode/field/(1.17) class
7 minutes ago, lupicus said:

Add




   protected void createBlockStateDefinition(StateContainer.Builder<Block, BlockState> builder) {
      builder.add(LEVEL);
   }

snippet taken from the CauldronBlock with slight edit

this create StateDefinition but set not the default values

Edited by Luis_ST
  • Thanks 1
Link to comment
Share on other sites

createBlockStateDefinition seems to have done the trick, at least for now- the game does not crash on startup! I'll have to investigate more to make sure things are actually working (and, y'know, actually do something with the blockstates) but I'm leaving that to tomorrow.

Thank you all for the help!

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.

×
×
  • Create New...

Important Information

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