ImNotJahan Posted September 25, 2021 Share Posted September 25, 2021 I have a custom TNT block which is meant to increase its power by 1 whenever given gunpowder, and I tried to make it put its power in a property instead of just a variable so I'd save, but nothing seems to change despite everything else working correctly. I know the explosion size changes correctly as it worked previously before using properties, and the only thing I've really done since it stopped working was add properties. Block class: Spoiler public class DynamicTnt extends TNTBlock { public static final IntegerProperty POWER = imnotjahan.mod.dynamictnt.init.Properties.POWER; public DynamicTnt() { super(AbstractBlock.Properties.of(Material.EXPLOSIVE)); } @Override public ActionResultType use(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { ItemStack itemstack = player.getItemInHand(hand); Item item = itemstack.getItem(); if (item != Items.FLINT_AND_STEEL && item != Items.FIRE_CHARGE) { if(item == Items.GUNPOWDER) { itemstack.shrink(1); int powerP1 = state.getValue(POWER) + 1; // P1 = Plus one state.setValue(POWER, Integer.valueOf(Math.min(powerP1, 100))); return ActionResultType.SUCCESS; } else return super.use(state, world, pos, player, hand, ray); } else // From here it's all minecraft code { catchFire(state, world, pos, ray.getDirection(), player); world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11); if (!player.isCreative()) { if (item == Items.FLINT_AND_STEEL) { itemstack.hurtAndBreak(1, player, (p_220287_1_) -> { p_220287_1_.broadcastBreakEvent(hand); }); } else { itemstack.shrink(1); } } return ActionResultType.sidedSuccess(world.isClientSide); } } @Override public void catchFire(BlockState state, World world, BlockPos pos, @Nullable net.minecraft.util.Direction face, @Nullable LivingEntity igniter) { explode(world, pos, igniter, state.getValue(POWER)); } private void explode(World world, BlockPos pos, @Nullable LivingEntity entity, int power) { if (!world.isClientSide) { DynamicTNTEntity tntEntity = new DynamicTNTEntity(world, (double)pos.getX() + 0.5D, pos.getY(), (double)pos.getZ() + 0.5D, entity, power); world.addFreshEntity(tntEntity); world.playSound(null, tntEntity.getX(), tntEntity.getY(), tntEntity.getZ(), SoundEvents.TNT_PRIMED, SoundCategory.BLOCKS, 1.0F, 1.0F); } } @Override protected void createBlockStateDefinition(StateContainer.Builder<Block, BlockState> stateBuilder) { super.createBlockStateDefinition(stateBuilder); stateBuilder.add(POWER); } } TNT entity class Spoiler public class DynamicTNTEntity extends TNTEntity { LivingEntity owner; int size = 4; public DynamicTNTEntity(EntityType<? extends TNTEntity> type, World world) { super(type, world); } public DynamicTNTEntity(World world, double xo, double yo, double zo, @Nullable LivingEntity owner, int size) { this(EntityType.TNT, world); this.setPos(xo, yo, zo); double d0 = world.random.nextDouble() * (double)((float)Math.PI * 2F); this.setDeltaMovement(-Math.sin(d0) * 0.02D, (double)0.2F, -Math.cos(d0) * 0.02D); this.setFuse(80); this.xo = xo; this.yo = yo; this.zo = zo; this.size = size; this.owner = owner; } @Override protected void explode() { this.level.explode(this, this.getX(), this.getY(0.0625D), this.getZ(), size, Explosion.Mode.BREAK); } @Nullable @Override public LivingEntity getOwner() { return this.owner; } } Properties class: Spoiler public class Properties { public static final IntegerProperty POWER = IntegerProperty.create("tnt_power", 4, 100); } Quote Link to comment Share on other sites More sharing options...
Luis_ST Posted September 25, 2021 Share Posted September 25, 2021 you never register the defaultState in the constructor of your block Quote Link to comment Share on other sites More sharing options...
ImNotJahan Posted September 25, 2021 Author Share Posted September 25, 2021 I added this.registerDefaultState(this.defaultBlockState().setValue(UNSTABLE, Boolean.valueOf(false)) .setValue(POWER, 4)); to the constructor right after the super, but nothing has seemed to change. Quote Link to comment Share on other sites More sharing options...
Draco18s Posted September 25, 2021 Share Posted September 25, 2021 (edited) 38 minutes ago, ImNotJahan said: if (item != Items.FLINT_AND_STEEL && item != Items.FIRE_CHARGE) { if(item == Items.GUNPOWDER) { You know you could just do the second if statement, right? Think about it. If the second one is true, the first one MUST be true. The vanilla code is then wrapped in an if-else that checks for flint and steel or fire charges, and a final else-return-super. If the catch-fire portion ("from here on its vanilla code") is the code from the TNT block (your super) you could just call super... Edited September 25, 2021 by Draco18s 1 Quote 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 More sharing options...
ImNotJahan Posted September 25, 2021 Author Share Posted September 25, 2021 Actually yea that's a good point, I'll just call super instead, but also I've figured out why it wasn't working By looking at SweetBerryBush I figured out that you have to replace the block to change the block state, so I just changed my previous state.setValue to world.setBlock(pos, state.setValue(POWER, Math.min(state.getValue(POWER) + 1, 100)), 2); and it all works now. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.