Jump to content

Recommended Posts

Posted

So I finally have started to work with redstone and have been doing fine except for one thing which I am sorta lost on.

 

My block that emits a signal will emit when it does meet the conditions,  but the redstone itself needs me to place a block next to it for it to be powered.

 

Now I have looked at the redstone torch code and came across the updateTick and the onNeighborChange, I only have tried the onNeighborChange since my block emits only when a block is placed next to it but that seemed to do nothing. Any help or advice would be appreciated.

 

Block:

 

public class BlockBasicDetector extends BlockTD {

    

    public BlockBasicDetector(){
        super(Material.wood);
        setBlockName(Names.BASIC_DETECTOR);
        setBlockTextureName(Reference.MOD_ID_LOWER + ":" + Names.BASIC_DETECTOR);
        setCreativeTab(CreativeTabs.tabAllSearch);
        setTickRandomly(true);

    }


    @SideOnly(Side.CLIENT)
    private IIcon faceIcon;
    @SideOnly(Side.CLIENT)
    private IIcon backIcon;
    @SideOnly(Side.CLIENT)
    private IIcon blockIcon;

    @Override
    public void registerBlockIcons(IIconRegister register){
        faceIcon = register.registerIcon(this.textureName + "_" + "front");
        backIcon = register.registerIcon(this.textureName + "_" + "back");
        blockIcon = register.registerIcon(this.textureName + "_" + "side");
    }

    @Override
    public void onBlockPlacedBy(World par1World, int x, int y, int z, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack)
    {
        int l = BlockPistonBase.determineOrientation(par1World, x, y, z, par5EntityLivingBase);
        par1World.setBlockMetadataWithNotify(x, y, z, l, 2);
    }

    @SideOnly(Side.CLIENT)
    @Override
    public IIcon getIcon(int side, int metadata) {

        int k = BlockPistonBase.getPistonOrientation(metadata);

        return side != k ? (side == Facing.oppositeSide[k] ? this.faceIcon : this.blockIcon): this.backIcon;


    }


    @Override
    public boolean canProvidePower()
    {
        return true;
    }

    @Override
    public int isProvidingWeakPower(IBlockAccess p_149748_1_, int x, int y, int z, int side)
    {
        int r = p_149748_1_.getBlockMetadata(x,y,z) & 7;

        if(side != r) {
            if (side == Facing.oppositeSide[r]) {
                if (side == 2) {
                    if (!p_149748_1_.isAirBlock(x, y, z - 1)) {
                        return 15;
                    } else return 0;
                }
                else if (side == 3)
                {
                    if (!p_149748_1_.isAirBlock(x, y, z + 1)) {
                        return 15;
                    } else return 0;
                }
                else if (side == 4)
                {
                    if (!p_149748_1_.isAirBlock(x - 1, y, z)) {
                        return 15;
                    } else return 0;
                }
                else if (side == 5)
                {
                    if (!p_149748_1_.isAirBlock(x + 1, y, z)) {
                        return 15;
                    } else return 0;
                }
                else if (side == 0)
                {
                    if (!p_149748_1_.isAirBlock(x, y - 1, z)) {
                        return 15;
                    } else return 0;
                }
                else if (side == 1)
                {
                    if (!p_149748_1_.isAirBlock(x, y + 1, z)) {
                        return 15;
                    } else return 0;
                }
                else return 0;
            }
            else return 0;
        }
        else {
            return 0;
        }
    }

    @Override
    public void onNeighborBlockChange(World world, int x, int y, int z, Block block)
    {

    }



}

 

~SureShotM/Leo~ gaming coding all around fun!

Posted

and yes I know there is nothing in the onNeighborChange, this is because I took code out of it and I am currently testing. Help or advice is still wanted.

~SureShotM/Leo~ gaming coding all around fun!

Posted

And what, prey tell,  did you expect an empty onNeighborChange function do?

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.

Posted

And what, prey tell,  did you expect an empty onNeighborChange function do?

and yes I know there is nothing in the onNeighborChange, this is because I took code out of it and I am currently testing. Help or advice is still wanted.

~SureShotM/Leo~ gaming coding all around fun!

Posted

Draco if you read I did say it was empty because I was testing when I made this post. Now I have tried to check if a block is on side and if so to tick but that didn't work Im going to post that tomorrow after I get sleep so maybe you can help me then.

~SureShotM/Leo~ gaming coding all around fun!

Posted

Okay this was what I had

 

 @Override
    public void onNeighborBlockChange(World world, int x, int y, int z, Block block)
    {
        
        world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world));
    }

 

before that I had

 @Override
    public void onNeighborBlockChange(World world, int x, int y, int z, Block block)
    {
        if(!world.isAirBlock(x -1, y, z) || !world.isAirBlock(x +1, y, z)  || !world.isAirBlock(x, y - 1, z) || !world.isAirBlock(x, y +1, z) || !world.isAirBlock(x, y, z - 1) || !world.isAirBlock(x, y, z + 1))
{
        world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world));
}
    }

 

I'm starting to think I need to have updateTick in my block code. but not sure what needs to go in there since in the redstone torch code uses its own functions for it and I'm not sure what those functions do since there is no description for them.

~SureShotM/Leo~ gaming coding all around fun!

Posted

I would like it to emit the moment it detects there is a block in front of the face side and not to emit when the block gets removed, and thank you @diesieben07 for asking that.

~SureShotM/Leo~ gaming coding all around fun!

Posted

onNeighborBlockChange is for when a nearby block changes, it is not used to update other blocks when the block is placed. If you look at the redstone torch code you'll see:

 

world.notifyBlocksOfNeighborChange

You may need to execute this for the blocks that your redstone device is connecting to to cause those blocks to update and detect that the block is providing them power.

Posted

world.notifyBlocksOfNeighborChange(int x, int y, int z, Block b)

requires the location of the block that changed, it automatically calls the function

world.nofityBlockOfNeighborChange(int x, int y, int z, Block b)

for all 6 connected blocks.

 

Btw, as of this message, congrats on 64 posts, you're now a full stack!

Posted

what function should I put that in because I don't believe I need it like the torch witch is when it is place or broken, I do believe I would need it when it detects a block on a the facing side, if so should I make a custom function for this.

 

I'm so lost on this right now, I need a break.

~SureShotM/Leo~ gaming coding all around fun!

Posted

You should execute that whenever you change the signal that you are outputting, so wherever that is being changed, add that line. In the case of what you're doing, you'd put it in the onNeighborBlockChange.

 

onNeighborBlockChange:

1) Check if there is a block connected to the front face

2) Set the metadata of the block depending on that result

3) call the notifyBlocksOfNeighborChange

 

isProvidingWeakPower:

1) return a boolean based off the metadata that you set in the onNeighborBlockChange

2) You can get that metadata using the IBlockAccess.getBlockMetadata

3) The first 3 integers in the isProvidingWeakPower are the X, Y and Z coords.

 

An example of the metadata could be:

0 ) North - No power

1 ) South - No power

2 ) East - No power

3 ) West - No power

4 ) Up - No power

5 ) Down - No power

6 ) North - Power

7 ) South - Power

8 ) East - Power

9 ) West - Power

10 ) Up - Power

11 ) Down - Power

 

You can get direction (0-5) using

meta % 6

You can get power using

meta > 5

 

If you only want North, South, East and Wesk, just make it 0-7, use

meta % 4

and

meta > 3

Posted

so i should put it in my providing week power code? since that is where I set the signal, and that was stupid to ask cause that doesn't have world. hmmmmmmm well I just need a break for a bit ill come back to it in a bit.

 

~SureShotM/Leo~ gaming coding all around fun!

Posted

Okay you completely lost me.

 

onNeighborBlockChange:

1) Check if there is a block connected to the front face - how can I when I don't have a parameter of side to check if you meant this meta % 6 to get side That is a bit confusing to me please give more detail.

2) Set the metadata of the block depending on that result - Do I set metadata with notify then.

3) call the notifyBlocksOfNeighborChange

 

 

isProvidingWeakPower:

1) return a boolean based off the metadata that you set in the onNeighborBlockChange - so if metadata = 0, ill set a boolean (emitSignal) or do I return it. This is confusing since isProvidingWeakPower can only return a int.

2) You can get that metadata using the IBlockAccess.getBlockMetadata

3) The first 3 integers in the isProvidingWeakPower are the X, Y and Z coords.  - You don't explain how it relevant besides the fact that this is the x,y,z of my block.

 

I do appreciate the help, I am just really confused on this, especially since it took me 5 days of trial an error just to do this.

 

 @Override
    public int isProvidingWeakPower(IBlockAccess p_149748_1_, int x, int y, int z, int side)
    {
        int r = p_149748_1_.getBlockMetadata(x,y,z) & 7;

        if(side != r) {
            if (side == Facing.oppositeSide[r]) {
                if (side == 2) {
                    if (!p_149748_1_.isAirBlock(x, y, z - 1)) {
                        return 15;
                    } else return 0;
                }
                else if (side == 3)
                {
                    if (!p_149748_1_.isAirBlock(x, y, z + 1)) {
                        return 15;
                    } else return 0;
                }
                else if (side == 4)
                {
                    if (!p_149748_1_.isAirBlock(x - 1, y, z)) {
                        return 15;
                    } else return 0;
                }
                else if (side == 5)
                {
                    if (!p_149748_1_.isAirBlock(x + 1, y, z)) {
                        return 15;
                    } else return 0;
                }
                else if (side == 0)
                {
                    if (!p_149748_1_.isAirBlock(x, y - 1, z)) {
                        return 15;
                    } else return 0;
                }
                else if (side == 1)
                {
                    if (!p_149748_1_.isAirBlock(x, y + 1, z)) {
                        return 15;
                    } else return 0;
                }
                else return 0;
            }
            else return 0;
        }
        else {
            return 0;
        }
    }

and this

 @Override
    public void onBlockPlacedBy(World par1World, int x, int y, int z, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack)
    {
        int l = BlockPistonBase.determineOrientation(par1World, x, y, z, par5EntityLivingBase);
        par1World.setBlockMetadataWithNotify(x, y, z, l, 2);
    }

    @SideOnly(Side.CLIENT)
    @Override
    public IIcon getIcon(int side, int metadata) {

        int k = BlockPistonBase.getPistonOrientation(metadata);

        return side != k ? (side == Facing.oppositeSide[k] ? this.faceIcon : this.blockIcon): this.backIcon;


    }

~SureShotM/Leo~ gaming coding all around fun!

Posted

Ok, if you're checking the block in the isprovidingWeakPower, then you can just call the notifyBlocksOfNeighborChange within the onNeighborChange.

 

public void onNeighborBlockChange(World world, int x, int y, int z, Block block)
{
    world.notifyBlocksOfNeighborChange(x, y, z, this);
}

Posted

so this was strange but I did put that in my onNeighborChange and every time a block was placed it would crash. Once I woke up and tried it again it works flawlessly. So thank you very much.

~SureShotM/Leo~ gaming coding all around fun!

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



×
×
  • Create New...

Important Information

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