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.



×
×
  • Create New...

Important Information

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