Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[Understood/Solved] Overriding a Vanilla block.


Recommended Posts

I've come across a need, and a potential method for effectively assigning a minecraft block to a custom class.   I am having issues 'understanding' it as a whole & .. what about it works.
--  where if I do it the same way as I do my own...  I get errors.

 

Just to be clear..  I understand how the FallingBlock (class) works ... well enough to 'augment/override' the tick function that is the trigger of it.

What I don't understand .. is ... why overriding the vanilla block works in this manner..   while the typical deferred registers ends up failing for this.
 

public static <T extends Block> RegistryObject<T> register(String name, Supplier<T> block) {
        RegistryObject<T> exit = registration.BLOCKS.register(name, block);
        registration.ITEMS.register(name, () -> new BlockItem(exit.get(),
                new Item.Properties().group({ItemGroup})));

 

I have this as in the 'blockoverrides' java class in net.minecraft

---
Cut out bad example.  rather not have this confuse others.  [will list corrected one if asked]
----

As well I have it using 'sand()' from inside my mod.
 

package com.dephoegon.reclaim.aid.block;

import com.dephoegon.reclaim.aid.util.kb;
import com.dephoegon.reclaim.block.stone.slabs;
import net.minecraft.block.BlockState;
import net.minecraft.block.SandBlock;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.item.FallingBlockEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.server.ServerWorld;

import javax.annotation.Nullable;
import java.util.List;
import java.util.Random;

public class sand extends SandBlock {
    private static String tip0;
    private static String tip1;
    private static String tip2;
    private static boolean fall;
    public sand(int dustColorIn, Properties properties, String normtoolTip, String shiftToolTip, String ctrlToolTip, boolean falls) {
        super(dustColorIn, properties);
        if (normtoolTip != "") { tip0 = normtoolTip; } else { tip0 = null; }
        if (shiftToolTip != "") { tip1 = shiftToolTip; } else { tip1 = null; }
        if (ctrlToolTip != "") { tip2 = ctrlToolTip; } else { tip2 = null; }
        if (falls) { fall = true; } else { fall = false; }
    }
    @Override
    public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random rand) {
        if (gravity(state, worldIn, pos) && pos.getY() >= 0) {
            FallingBlockEntity fallingblockentity = new FallingBlockEntity(worldIn, (double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, worldIn.getBlockState(pos));
            this.onStartFalling(fallingblockentity);
            worldIn.addEntity(fallingblockentity);
        }
    }
    private boolean spider(Object state, BlockPos pos, ServerWorld worldIn, BlockState self) {
        boolean last = false;
        if (worldIn.getBlockState(pos).getBlock() == state) { last = true; }
        else if (worldIn.getBlockState(pos) == self) { last = spider(state, pos.up(), worldIn, self); }
        else { last = false; }
        return last;
    }
    private boolean gravity(BlockState state, ServerWorld worldIn, BlockPos pos){
        boolean tfall;
        boolean airOrFallthrough;
        boolean hld;
        if (fall) {
            if (spider(slabs.BASALT_SLAB.get(), pos.up(), worldIn, state))
            { hld = true; } else { hld = false; }
            if (worldIn.isAirBlock(pos.down()) || canFallThrough(worldIn.getBlockState(pos.down()))) {
                airOrFallthrough = true;
            } else { airOrFallthrough = false; }
            // currently separated for logical construction & allowance of further 'falling disabling'
            // currently only considering 1-2 additional. some 'stone' or slab/item
            if (hld) { tfall = false; } else {
                if (airOrFallthrough) { tfall = true; } else { tfall = false; }
            }
        } else { tfall = false; }
        return tfall;
    }

    @Override
    public void addInformation(ItemStack stack, @Nullable IBlockReader worldIn, List<ITextComponent> tooltip, ITooltipFlag flagIn)
    {
        if (tip0 !=null) {
            if (tip1 != null) {
                if (tip2 != null) {
                    if (kb.HCtrl() || kb.HShift()) {
                        if (kb.HShift() && kb.HCtrl()) {
                            tooltip.add(new StringTextComponent(tip2));
                            tooltip.add(new StringTextComponent(tip1));
                        } else if (kb.HCtrl()) {
                            tooltip.add(new StringTextComponent(tip2));
                        } else {
                            tooltip.add(new StringTextComponent(tip1));
                        }
                    } else {
                        tooltip.add(new StringTextComponent(tip0));
                    }
                } else {
                    if (kb.HShift()) {
                        tooltip.add(new StringTextComponent(tip1));
                    } else {
                        tooltip.add(new StringTextComponent(tip0));
                    }
                }
            } else if(tip2 !=null) {
                if (kb.HCtrl()) {
                    tooltip.add(new StringTextComponent(tip2));
                } else {
                    tooltip.add(new StringTextComponent(tip0));
                }
            } else {
                tooltip.add(new StringTextComponent(tip0));
            }
        } else if (tip1 !=null) {
            if (tip2 != null) {
                if (kb.HCtrl() || kb.HShift()) {
                    if (kb.HShift() && kb.HCtrl()) {
                        tooltip.add(new StringTextComponent(tip2));
                        tooltip.add(new StringTextComponent(tip1));
                    } else if (kb.HCtrl()) {
                        tooltip.add(new StringTextComponent(tip2));
                    } else {
                        tooltip.add(new StringTextComponent(tip1));
                    }
                }
            } else {
                if (kb.HShift()) {
                    tooltip.add(new StringTextComponent(tip1));
                }
            }
        } else if(tip2 != null) {
            if (kb.HCtrl()) {
                tooltip.add(new StringTextComponent(tip2));
            }
        }
    }

}

 

Edited by DePhoegon
Solved, removed faulted example to prevent confusion
Link to post
Share on other sites
  • That is not how you use @ObjectHolder. You must not assign a value to the field yourself.
  • Do not create registry entries in static initializers.
  • Your DeferredRegister example is not complete, show what you gave it for "name".
Link to post
Share on other sites
6 hours ago, diesieben07 said:
  • That is not how you use @ObjectHolder. You must not assign a value to the field yourself.
  • Do not create registry entries in static initializers.
  • Your DeferredRegister example is not complete, show what you gave it for "name".

1.  I Don't get what you mean of the deferred Register .. but I'll show the 'altcolor()' one, as it's atm the smallest, with both something to register & uses the one I (sorta)understand as it is.  [I had only snipped out the name of the itemgroup itself.]
-far as I knew 'name' was legitimately a variable that got used by the actual self created entries,  and a way to create the method (that atm, I've  got a tiny grasp on) to register  both the block & the item form of it.
~which I didn't actually think to hard on till about now.
1a.  it  of course gets called by my main class, which I'm still ...  combing through ...  still some tutorialized code & text in it.. but it's late on my list for understanding entirely as I am getting on with the stuff & things of the  process, with some aspects being more important to get down  & understand first.. when i have a working way first.

package com.dephoegon.reclaim.block.sand;

import com.dephoegon.reclaim.aid.block.sand;
import com.dephoegon.reclaim.aid.util.registration;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.block.material.Material;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraftforge.common.ToolType;
import net.minecraftforge.fml.RegistryObject;

import java.util.function.Supplier;

public class altcolor extends Blocks {
    public static final RegistryObject<Block> WHITE_SAND = register("white_sand",
            () -> new sand(0xffffff, AbstractBlock.Properties.create(Material.SAND)
                    .hardnessAndResistance(.5f, .5f)
                    .harvestLevel(1).harvestTool(ToolType.SHOVEL)
                    ,"","","",true));

    public static void register() { }

    public static <T extends Block> RegistryObject<T> register(String name, Supplier<T> block) {
        RegistryObject<T> exit = registration.BLOCKS.register(name, block);
        registration.ITEMS.register(name, () -> new BlockItem(exit.get(),
                new Item.Properties().group(ItemGroup.BUILDING_BLOCKS)));
        return exit;
    }
}


2.  I don't know what to tell you, I must have had something wrong with phrasing before..   as now  i just cut out the Objectholder, and it works. (Where as it barfed up an error about doing something on a already named space.)
-- perhaps tried to be too clever before I knew how it worked and I'm even more crankity over it. (more . testing to do later I believe)

3.  You're going to have to be explicitly clear...  Honestly... you kind of not atm.  Frankly I'd rather avoid using what I didn't understand... but 'luckily'/'unluckily'  There  is no mention of how to do this, and far to many tutorials are of far older versions which make it ... more frustrating than I would care to admit...   
--where do you do you start learning when all the conversations you find are of older versions or on aspects that aren't on your hands atm.  (Kinda why I paid for a 1.16 course[just for a reasonable starting point that goes over many things & can help get your feet of the ground to even get your own thing up & running], as there is legit nothing as a starting point, & any resource I found was muttled with prior versions & guess work from prideful twats who for some reason got stuck on older mc versions & forge methods.)

4. Forge documentation... kinda sucks balls...   It's great for those who 'KNOW' the ways already... but as a starting point for learning.. it's ass really....  not even a hello world example of items, blocks, events, registration, or entities.
-- I've learned more from intelJ  and backtracking methods & examples from the 'gradle' build then I have from forge documentation.

Link to post
Share on other sites
Posted (edited)
21 hours ago, diesieben07 said:

The code you showed now doesn't even show you overriding vanilla sand, so what is your point?

I showed you that code...    it was this, and your 'complained' about the deferred register name, then went on about Objectholder (which to be fair was only there because the ONLY other example of doing this wasn't exactly knowledgeable as to what was happening or why.

I'm trying to figure out why the following works, and the example wasn't exactly updated, so i had to use IDE feedback to get it to work properly, and I used setRegistryName as a way to prevent it from using my own name space....   
-- To be clear i'm not sure what i did that caused it to work..  but it does

Just to be clear  This is sitting where the package says it's sitting.  
-mine are sitting in com.dephoegon.reclaim....  

----
Cut Example,   faulty   (functional, technically but not worth it.)

Edited by DePhoegon
Removed Confusing & bad example, after solve
Link to post
Share on other sites
16 hours ago, DePhoegon said:

Just to be clear  This is sitting where the package says it's sitting.  

Do not put code in Minecraft's packages... why on earth are you doing that?

 

You are still creating registry entries in static initializers. You must create them in the appropriate registry event. DeferredRegister does this all for you correctly.

Link to post
Share on other sites
2 hours ago, diesieben07 said:

Do not put code in Minecraft's packages... why on earth are you doing that?

 

You are still creating registry entries in static initializers. You must create them in the appropriate registry event. DeferredRegister does this all for you correctly.

Then, Explain to me how to do the exact same thing  in the correct way... as I've not seen hide nor hair of it of how to properly do it.

For a very select few blocks,  have a custom block class (say SandBlock or Gravelblock) with gravity override, and still retain the same namespace as if it wasn't there (minecraft:sand , as exampe)

 

If you actually wanna be helpful, explain how that's done and actually explain things.   It's clear I'm not sure how to pull it off  with the same requirement checked off.  
-- Saying 'Don't do it that way' isn't helpful, when it's not clear how to do it 'the other way' & still achieve the same goal.

Link to post
Share on other sites

DeferredRegister usage is explained both in the documentation about registries as well as the DeferredRegister javadoc. I'll repeat it here for you:

private static final DeferredRegister<Block> MINECRAFT_BLOCK_OVERRIDES = DeferredRegister.create(ForgeRegistries.BLOCKS, "minecraft");
public static final RegistryObject<Block> SAND = MINECRAFT_BLOCK_OVERRIDES.register(
        "sand", () -> new Block(...)
)

 

  • Thanks 1
Link to post
Share on other sites

Thank you for that.

I it also got me to re-examine a bit of 'my code' again, and I was able to cleanly insert it properly this time and actually UNDERSTAND what was doing what.

Unsure if I should list the updated code I got from it, but in short effect I got the BLOCK & ITEM override sitting next to my  actual ones, and it being called as intended.
-- genuinely wish there was a better way to inject behavior into a block that was able to interact with tick void w/o having to recreate/override the block.

 

while I did what I could to minimize any conflicts possible... I feel this can cause unexpected behavior if another mod recreates the same block(s)
-my case, sand, red_sand, gravel ... for the gravity behavior.

Link to post
Share on other sites
  • DePhoegon changed the title to [Understood/Solved] Overriding a Vanilla block.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

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



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • setBlockAndUpdate uses flag 3, but I've tried 1, 2, and 4 with no success. Is there any documentation on what these flags do? I found this thread but since I'm using the mojang mappings I don't think I have the same javadocs.   
    • Ok i can't make it work. It gives me this error "java.lang.RuntimeException: Attempted to load class net/minecraft/client/renderer/tileentity/ItemStackTileEntityRenderer for invalid dist DEDICATED_SERVER" I try to move the chestRenderer() methods to a separate class but it keeps to give me this error. I don't know how to separate the Supplier<Callable<ItemStackTileEntityRenderer>> renderMethod parameter to the server registration. I tryied to make a class for only the items, removing it from the Blocks class:   public class Items { public static final DeferredRegister<Item> ITEMS; private static final RegistryObject<Item> MINI_CHEST; private static final RegistryObject<Item> SMELTING_CHEST; private static final RegistryObject<Item> INVISIBLE_CHEST; private static final RegistryObject<Item> TRAP_CHEST; private static final RegistryObject<Item> PITFALL_CHEST; private static final RegistryObject<Item> DRILL_CHEST; private static final RegistryObject<Item> TELEPORT_CHEST; private static final RegistryObject<Item> LOOT_CHEST; private static final RegistryObject<Item> MONSTER_CHEST; private static final RegistryObject<Item> POCKET_DIMENSION_CHEST; private static final RegistryObject<Item> COLOSSAL_CHEST; static { ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, TenChest.MODID); MINI_CHEST = register("mini_chest", Blocks.MINI_CHEST, ItemBlockRenderer::baseChestRenderer); SMELTING_CHEST = register("smelting_chest", Blocks.SMELTING_CHEST, ItemBlockRenderer::smeltingChestRenderer); INVISIBLE_CHEST = register("invisible_chest", Blocks.INVISIBLE_CHEST, ItemBlockRenderer::baseChestRenderer); TRAP_CHEST = register("trap_chest", Blocks.TRAP_CHEST, ItemBlockRenderer::baseChestRenderer); PITFALL_CHEST = register("pitfall_chest", Blocks.PITFALL_CHEST, ItemBlockRenderer::baseChestRenderer); DRILL_CHEST = register("drill_chest", Blocks.DRILL_CHEST, ItemBlockRenderer::baseChestRenderer); TELEPORT_CHEST = register("teleport_chest", Blocks.TELEPORT_CHEST, ItemBlockRenderer::teleportChestRenderer); LOOT_CHEST = register("loot_chest", Blocks.LOOT_CHEST, ItemBlockRenderer::lootChestRenderer); MONSTER_CHEST = register("monster_chest", Blocks.MONSTER_CHEST, ItemBlockRenderer::baseChestRenderer); POCKET_DIMENSION_CHEST = register("pocket_dimension_chest", Blocks.POCKET_DIMENSION_CHEST, ItemBlockRenderer::pocketDimensionChestRenderer); COLOSSAL_CHEST = register("colossal_chest", Blocks.COLOSSAL_CHEST, ItemBlockRenderer::baseChestRenderer); } private static <T extends Item> RegistryObject<T> register(String name, RegistryObject<Block> block, Supplier<Callable<ItemStackTileEntityRenderer>> renderMethod) { return register(name, block, (item) -> item(block, renderMethod)); } private static <T extends Item> RegistryObject<T> register(String name, RegistryObject<Block> ret, Function<RegistryObject<Block>, Supplier<? extends Item>> itemCreator) { return ITEMS.register(name, (Supplier) itemCreator.apply(ret)); } private static Supplier<BlockItem> item(RegistryObject<? extends Block> block, Supplier<Callable<ItemStackTileEntityRenderer>> renderMethod) { return () -> { BlockItem blockItem = new BlockItem(block.get(), (new Item.Properties().tab(TenChest.MOD_GROUP).setISTER(renderMethod))); return blockItem; }; } } But the items are not registered, and i don't know why. It gives to me this:   [16:06:18] [Render thread/INFO] [ne.mi.re.GameData/REGISTRIES]: Injecting existing registry data into this CLIENT instance [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:colossal_chest [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:colossal_chest_part [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:drill_chest [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:invisible_chest [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:loot_chest [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:mini_chest [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:monster_chest [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:pitfall_chest [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:pocket_dimension_chest [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:smelting_chest [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:teleport_chest [16:06:18] [Render thread/INFO] [ne.mi.re.ForgeRegistry/REGISTRIES]: Registry Item: Found a missing id from the world tenchest:trap_chest [16:06:18] [Render thread/DEBUG] [ne.mi.re.GameData/REGISTRIES]: There are 12 mappings missing - attempting a mod remap [16:06:18] [Render thread/ERROR] [ne.mi.re.GameData/REGISTRIES]: Unidentified mapping from registry minecraft:item tenchest:colossal_chest: 987 tenchest:colossal_chest_part: 986 tenchest:drill_chest: 981 tenchest:invisible_chest: 978 tenchest:loot_chest: 983 tenchest:mini_chest: 976 tenchest:monster_chest: 984 tenchest:pitfall_chest: 980 tenchest:pocket_dimension_chest: 985 tenchest:smelting_chest: 977 tenchest:teleport_chest: 982 tenchest:trap_chest: 979  
    • I've tried to play my old world with mods, but Minecraft just crashes after the mods loading screen. The Minecraft version is 1.12.2 and the Forge version is the latest one, 14.23.5.2855   I've already reinstalled forge, deleted the mods and using the previous version (which I used originally and worked) and even using different versions of Java, so I don't know what else to do   The debug.log file is this: https://pastebin.com/vwLHWvFE . The error is in the line 332, I hope it helps.   Thanks in advance
    • https://github.com/DefDaemon/Daemons_Horror_Moon/blob/02a0d917a9738e7f7076865abb4a74de0e97eb3c/src/main/java/com/defdaemon/horrormoon/lists/ToolMaterialList.java#L9 You cannot access your items here yet, the registration has not happened yet. Store the supplier instead of the item.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.