Jump to content

Help with setBlockState


Durtle02

Recommended Posts

Hello. I'm trying to make a block where on random ticks it will grow upwards(for now), like reeds. Also it is supposed to grow upwards on player activation. I have somewhat of a clue how to to this and the current code I have isn't working. The block is registering in game and the name, texture, and creative tab are all working.

package TestMod.tutorial.block;

import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class GooBlock extends BlockBase{
    
    public GooBlock(String name){
        super(Material.ROCK, name);
        setTickRandomly(true);
        setHardness(0f);
        setResistance(1f);
    } 
    
    @Override
    public GooBlock setCreativeTab(CreativeTabs tab){
        super.setCreativeTab(tab);
        return this;
    }
    
    public void updateTick(World worldIn, BlockPos pos){
        BlockPos pos0 = new BlockPos(pos.getX(), (pos.getY()+1) , pos.getZ());

        
        worldIn.setBlockState(pos0, ModBlocks.gooblock.getDefaultState());
    }
    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ){
        BlockPos pos0 = new BlockPos(pos.getX(), (pos.getY()+1) , pos.getZ());
        worldIn.setBlockState(pos0, ModBlocks.gooblock.getDefaultState());
    return false;}
}

 

Thanks for the help.

I don't optimize my code before it works.

Link to comment
Share on other sites

You can simplify this:

BlockPos pos0 = new BlockPos(pos.getX(), (pos.getY()+1) , pos.getZ());

BlockPos pos0 = pos.up();

 

That said, what isn't working correctly?

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

In game nothing happens. The code should be working right?

 

For random ticks, you didn't specify that your block should receive random ticks).

For right-clicking, you have the wrong method signature (@Override would tell you this). You want

public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ)

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

public GooBlock(String name){
        super(Material.ROCK, name);
        setTickRandomly(true);
        setHardness(0f);
        setResistance(1f);
    } 

 

It was in there. I tried adding the

this.

but it still didn't work.

I don't optimize my code before it works.

Link to comment
Share on other sites

I believe they need to be scheduled.

world.scheduleBlockUpdate(pos, blockIn, delay, priority);

I would do it in onBlockPlaced and then in the update method itself when the first one happens.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

I believe they need to be scheduled.

world.scheduleBlockUpdate(pos, blockIn, delay, priority);

I would do it in onBlockPlaced and then in the update method itself when the first one happens.

 

There are random update ticks. Look at BlockCrops.

Line 28, specifically.

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

I believe they need to be scheduled.

world.scheduleBlockUpdate(pos, blockIn, delay, priority);

I would do it in onBlockPlaced and then in the update method itself when the first one happens.

 

There are random update ticks. Look at BlockCrops.

Line 28, specifically.

I thought they were the same thing, like you would schedule a random tick by scheduling it using Random#nextInt(...). Bu his other problem is a wrong method signature with updateTick it is Block#updateTick(World world, BlockPos pos, IBlockState state, Random rand)

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

Any ideas of what's wrong? None of the block changes are happening.

 

Current Code:

package TestMod.tutorial.block;

import javax.annotation.Nullable;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class GooBlock extends BlockBase{
    
    public GooBlock(String name){
        super(Material.ROCK, name);
        setTickRandomly(true);
        setHardness(0f);
        setResistance(1f);
    } 
    
    @Override
    public GooBlock setCreativeTab(CreativeTabs tab){
        super.setCreativeTab(tab);
        return this;
    }
    
    public void updateTick(World worldIn, BlockPos pos){
        BlockPos pos0 = new BlockPos(pos.getX(), (pos.getY()+1) , pos.getZ());
        worldIn.setBlockState(pos0, ModBlocks.gooblock.getDefaultState());
    }

    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ){
        BlockPos pos0 = new BlockPos(pos.getX(), (pos.getY()+1) , pos.getZ());
        worldIn.setBlockState(pos0, ModBlocks.gooblock.getDefaultState());
    return false;}
}

I don't optimize my code before it works.

Link to comment
Share on other sites

I thought they were the same thing, like you would schedule a random tick by scheduling it using Random#nextInt(...).

 

scheduled ticks are, by definition, not random.  You can use a random interval, but they are distinct from random update ticks, which are given to a fixed number of blocks in each chunk at random.

 

Any ideas of what's wrong? None of the block changes are happening.

 

Yes:

wrong method signature with updateTick it is Block#updateTick(World world, BlockPos pos, IBlockState state, Random rand)

 

Use @Override on every method that you are overriding. If Eclipse says "not valid, suggest remove" then you should fix the signature.  Eclipse can't suggest an alternate signature, its too complex of an operation.

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

So what does the @Override tell you? The random tick is working (Thank you) but the player activation still isn't.

@Override
    boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ){
        BlockPos pos0 = new BlockPos(pos.getX(), (pos.getY()+1) , pos.getZ());
        worldIn.setBlockState(pos0, ModBlocks.gooblock.getDefaultState());
    return false;}

It is okay with the code without the @Override but it doesn't like it with the override. (I'm using NetBeans 8.2)

I don't optimize my code before it works.

Link to comment
Share on other sites

It is okay with the code without the @Override but it doesn't like it with the override.

 

Stop for a moment and think about what that means... It is quiet without the assertion, but you hear about an error when you assert the truth about the method.

 

As the designer, you KNOW that a method is (supposed to) override an inherited method. Therefore, when your IDE suggests that you remove the annotation, you KNOW that it's bad advice (like "curing" a fever by removing that pesky thermometer -- all you accomplish is that you turn off the alert; you wouldn't be fixing the problem).

 

Now there are some methods that you are not allowed to override. If you are modding in unexplored territory, you might run into static and/or private (and maybe final?) methods. Then you need to get creative. However, onBlockActivated shouldn't be one of those.

 

Follow the advice above: Copy-paste the exact method header. You can then change parameter names if you like, but don't mess with the return type, qualifiers or parameter types.

 

And yes, every Java programmer should attach the @Override annotation to each and every method that's supposed be overriding an inherited method -- NO EXCEPTIONS. The first time you go through an upgrade exercise to a new MC release, you will thank your past self for pasting all those annotations where they assert the truth of your design (because they'll flag subtle inconsistencies created by vanilla code changes).

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • My name is SARAH GOLDFISH, and I'm the CEO of a once-thriving tech startup. Today, I want to share a deeply personal story about how Tropical Delight Recovery saved my business and, quite possibly, my life. In the summer of 2023, my company was at its peak. We had just secured a major partnership, our products were flying off the shelves, and our future looked brighter than ever. However, in the midst of this success, I made a decision that nearly led to our downfall.  Like many others, I was drawn to the world of cryptocurrency. The promise of quick and significant returns was enticing, and I saw it as an opportunity to further bolster our financial standing. After some research, I invested a substantial amount of the company’s funds into a new and seemingly promising cryptocurrency. At first, it seemed like a great move. The value of our investment soared, and I was hailed as a visionary. But as quickly as our fortunes rose, they plummeted. The cryptocurrency market is notoriously volatile, and within weeks, the value of our investment tanked. What I had failed to see was that the currency was part of a sophisticated scam. The entire platform vanished overnight, and with it, our hard-earned money. The impact was immediate and devastating. Our financial cushion was obliterated, and we found ourselves unable to meet payroll or fulfill orders. Our partners began to lose faith, and the media caught wind of our predicament, amplifying our troubles. I was overwhelmed with guilt and fear. I had not only jeopardized the company but also the livelihoods of my employees. Despair set in, and I couldn't see a way out. In my darkest hour, a friend recommended Tropical Delight Recovery. Skeptical and with little hope, I reached out to them. From the first contact, their team was professional, understanding, and, most importantly, optimistic about our chances of recovery. They assured me that they had dealt with similar cases and had a strong track record of retrieving lost funds from fraudulent schemes. Tropical Delight Recovery took swift action. They meticulously traced the fraudulent transactions and employed their extensive network and legal expertise to go after the perpetrators. Their process was transparent, and they kept me informed at every step. It was a complex and arduous journey, but their determination never wavered. Weeks turned into months, and just when I was starting to lose hope, Tropical Delight Recovery delivered a miracle. They managed to recover a significant portion of our lost funds. The relief I felt was indescribable. This wasn't just about the money; it was about the restoration of hope and the possibility of a future for my company. With the recovered funds, we were able to stabilize our finances, reassure our partners, and regain the trust of our employees. It wasn't an instant fix, but it gave us the lifeline we needed to rebuild. Slowly but surely, we started to turn things around. Today, our company is back on track, stronger and more resilient than ever. I owe a debt of gratitude to Tropical Delight Recovery. They didn't just save my company; they saved me from a path of despair and hopelessness. Their professionalism, expertise, and unwavering commitment to their clients make them a beacon of hope for anyone caught in the web of financial fraud. If you find yourself in a situation like mine, don't hesitate to reach out to Tropical Delight Recovery. They are more than a recovery company; they are life-savers. You can reach out to them via: Email: tropicaldelightrecoveryhacker @ out look . Com.
Signal: + 16 14568 3873
Telegram: @ tropical delightrecovery hacker Website: h. t. t ps : // dev-tropicaldelightrecovery pantheonsite   .io
    • You have to set the java path in your start script
    • i tried that and i got rid of java to install the new one but it still says i have the old one and i cant get the new one because of the old one  
    • Я создал босса для Майнкрафт и когда он вызывается «Произошла непредвиденная ошибка при попытке выполнить эту команду» и в описании «Не удается вызвать ошибку "net.minecraft.world.entity.ai.attributes.attribute instance.m_22100_ (double)", потому что возвращаемое значение "net.minecraft.world.entity.monster.zombie.m_21051_ (net.minecraft.world.entity.ai.attributes.attribute)" имеет значение null. Я не до конца понимаю, в чем ошибка. Но, похоже, это связано с атрибутами. Помогите пожалуйста разобраться   Вот сам класс босса: package org.mymod.afraid; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.*; import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.phys.Vec3; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.entity.projectile.SmallFireball; import org.jetbrains.annotations.NotNull; public class AfraidBoss extends Zombie { private static final int MAX_HEALTH = 1000; private static final double ATTACK_DAMAGE = 10.0D; private static final double FOLLOW_RANGE = 50.0D; private static final double ATTACK_KNOCKBACK = 1.0D; private static final double MOVEMENT_SPEED = 0.25D; private static final int TELEPORT_RADIUS = 20; private static final int FIREBALL_COOLDOWN = 100; // 5 seconds (20 ticks per second) private static final int FIREBALL_COUNT = 3; private int fireballCooldown = 0; private int fireDashCooldown = 0; public AfraidBoss(EntityType<? extends Zombie> type, Level level) { super(type, level); this.setHealth(MAX_HEALTH); this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.DIAMOND_SWORD)); this.setItemSlot(EquipmentSlot.OFFHAND, new ItemStack(Items.DIAMOND_SWORD)); } @Override protected void registerGoals() { this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true)); this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 1.0, (float) TELEPORT_RADIUS)); this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(4, new WaterAvoidingRandomStrollGoal(this, 1.0)); this.goalSelector.addGoal(5, new HurtByTargetGoal(this)); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); } @Override public void aiStep() { super.aiStep(); if (this.getTarget() instanceof Player) { Player player = (Player) this.getTarget(); double distanceToPlayer = this.distanceToSqr(player); // Fire Dash ability if (distanceToPlayer <= TELEPORT_RADIUS * TELEPORT_RADIUS && fireDashCooldown == 0) { this.fireDash(player); fireDashCooldown = 200; // Cooldown for fire dash (10 seconds) } // Fireball attack if (fireballCooldown == 0) { this.shootFireballs(player); fireballCooldown = FIREBALL_COOLDOWN; // Cooldown for fireball attack (5 seconds) } // Decrement cooldowns if (fireDashCooldown > 0) { fireDashCooldown--; } if (fireballCooldown > 0) { fireballCooldown--; } } } private void fireDash(Player player) { Vec3 direction = player.position().subtract(this.position()).normalize(); Vec3 newPos = this.position().add(direction.scale(10)); this.teleportTo(newPos.x, newPos.y, newPos.z); this.createFireTrail(newPos); player.hurt(DamageSource.mobAttack(this), 20.0F); // Damage the player } private void createFireTrail(Vec3 position) { for (int x = -2; x <= 2; x++) { for (int z = -2; z <= 2; z++) { BlockPos firePos = new BlockPos(position.x + x, position.y, position.z + z); this.level.setBlock(firePos, Blocks.FIRE.defaultBlockState(), 11); } } } private void shootFireballs(Player player) { Vec3 direction = player.position().subtract(this.position()).normalize(); for (int i = 0; i < FIREBALL_COUNT; i++) { SmallFireball fireball = new SmallFireball(this.level, this, direction.x, direction.y, direction.z); fireball.setPos(this.getX() + direction.x, this.getY() + direction.y, this.getZ() + direction.z); this.level.addFreshEntity(fireball); } } public static AttributeSupplier.Builder createAttributes() { return Zombie.createMobAttributes() .add(Attributes.MAX_HEALTH, MAX_HEALTH) .add(Attributes.ATTACK_DAMAGE, ATTACK_DAMAGE) .add(Attributes.FOLLOW_RANGE, FOLLOW_RANGE) .add(Attributes.ATTACK_KNOCKBACK, ATTACK_KNOCKBACK) .add(Attributes.MOVEMENT_SPEED, MOVEMENT_SPEED); } @Override public boolean hurt(@NotNull DamageSource source, float amount) { boolean flag = super.hurt(source, amount); if (flag && source.getEntity() instanceof Player) { Player player = (Player) source.getEntity(); if (this.random.nextInt(10) == 0) { this.teleportAndAttack(player); } } return flag; } private void teleportAndAttack(Player player) { Vec3 randomPos = player.position().add((this.random.nextDouble() - 0.5) * 4, 0, (this.random.nextDouble() - 0.5) * 4); if (this.randomTeleport(randomPos.x, randomPos.y, randomPos.z, true)) { player.hurt(DamageSource.mobAttack(this), 10.0F); // Damage the player } } }  
  • Topics

×
×
  • Create New...

Important Information

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