Jump to content

[VANILLA BUG][SOLVED][1.7.2] Block metadata incorrect during explosion?


coolAlias

Recommended Posts

I'm getting abnormal behavior from getExplosionResistance - it seems to ignore the real world metadata values or the real world metadata gets changed before getting the explosion resistance:

@Override
public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) {
// printing the values I would expect from the block placed, e.g. 12
System.out.println("Block metadata: " + world.getBlockMetadata(x, y, z));
}

@Override
public float getExplosionResistance(Entity entity, World world, int x, int y, int z, double explosionX, double explosionY, double explosionZ) {
// printing the world meta here prints ZERO?!?! it just printed 12 when I clicked the block a second ago...
System.out.println("Block meta: " + world.getBlockMetadata(x, y, z));
if (world.getBlockMetadata(x, y, z) < 0x8) {
return getExplosionResistance(entity);
} else {
// never prints, obviously
return 500F;
}
}

Link to comment
Share on other sites

getExplosionResistance(entity);

 

What does that do?

 

You also have print statements in there, what do they say when run?

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

And my other question?

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

getExplosionResistance(entity) is what vanilla blocks call from the multiple parameter getExplosionResistance method, which ultimately just returns blockHardness / 5.0F.

 

The print statements in clickBlock show the correct metadata, in my test it was 12, and previously (1.6.4) getExplosionResistance(args[]...) would also show the correct metadata; now, however, it always prints 0 zero for the metadata in that method, so of course my block is destroyed when it shouldn't be.

Link to comment
Share on other sites

Print out the block ID at that location.

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

And now you have found the problem.

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

Well, thanks to Draco's suggestion, I found out the source of the problem:

// vanilla method:
public void onBlockExploded(World world, int x, int y, int z, Explosion explosion)
{
world.setBlockToAir(x, y, z);
onBlockDestroyedByExplosion(world, x, y, z, explosion);
}

// my "fix":
@Override
public void onBlockExploded(World world, int x, int y, int z, Explosion explosion) {
if (world.getBlockMetadata(x, y, z) < 0x8) {
super.onBlockExploded(world, x, y, z, explosion);
}
}

That solves the blocks getting destroyed when they shouldn't, though I'm not very satisfied with it. This method is the same as in 1.6.4, so I'm not sure what else has changed to cause this discrepancy, so if anyone else has insights, I'd love to hear them. Likewise, I'll post my findings if I discover anything more about this.

Link to comment
Share on other sites

It's a bug in the vanilla code:

 

// Entity.getExplosionResistance:

public float func_145772_a(Explosion p_145772_1_, World p_145772_2_, int p_145772_3_, int p_145772_4_, int p_145772_5_, Block p_145772_6_)

{

return p_145772_6_.getExplosionResistance(this, p_145772_2_, p_145772_3_, p_145772_3_, p_145772_4_, posX, posY + getEyeHeight(), posZ);

}

 

Notice how the parameter 'x' is used for both x and y when getting the block's explosion resistance, and the y parameter is used for z.

 

Link to comment
Share on other sites

Report it to Mojang.  I've reported things I've found in the code before (like why walking on slabs over ice is like walking on ice, it has to do with the fact that the entity position is floored, then subtracts 1 to determine what block you're walking on).

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

Every time I go to report a bug, I get to the point where it asks me to create a new account and I stop. Call me lazy, but I think it's ridiculous to need an account just to report a bug, and being unable to use the one we already have with Mojang is even more ridiculous. So I just end up never reporting bugs. I know, it's petty, but it pisses me off every time I go there. Just one of those random things...

Link to comment
Share on other sites

You are a lazy bastard indeed.

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

Not lazy, it's just one of those things that I can't stand for some illogical reason. I realize it's stupid, but it still irks me to no end that I have to create an account to post a bug report. I actually did create an account for the original Atlassian bug tracker, but somehow that's gotten all f-ed up and I can't use it anymore due to some onDemand gibberish, and I really don't feel like making another or wasting any more time than I already have on it, when they could just as easily link it to our Minecraft accounts. I don't see how they expect people to report bugs when they make it such a damn hassle to do so, but perhaps I'm the only one that feels that way.

Link to comment
Share on other sites

due to some onDemand gibberish

 

You mean like migrating to a new URL?  Your login is valid on the new tracker if you had one on the old.

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

You mean like migrating to a new URL?  Your login is valid on the new tracker if you had one on the old.

That's what I thought as well, but you know, it was quite a long time ago when I set up that account, and to be honest I don't recall if I ever got it working back then either. I thought I had, but now I'm not so certain, as I recall it being quite difficult to set up. I realize that makes me look like an idiot, I mean come on, who can't set up an online account these days... but man, I've never encountered a service that is that freaking difficult to use before. I set up an account, log in and there seem to be all sorts of other account 'options', and later on I can't use the account anymore because it's not set up for whatever that damn on Demand crap is, and I sure as hell am not signing up for that because it sounds like a paid 'service'. I was definitely able to at least log in before, more than a year ago, but now I can't even do that. Anyway, I've wasted a lot of time messing around with the damn thing since its inception, and I've just had enough of it, in addition to my original point that I think it's absurd to require an account, especially one separate from the one we already use to play the game, just to report a bug. Sorry, but the whole situation has been grating on my nerves for some time, and it's been exceedingly frustrating to use (or not, since I haven't been successful since I first set up the account).

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

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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