Jump to content

Recommended Posts

Posted

Nevermind, i just made some tests, you can just override getCollisionShape without all that onEntityCollision stuff(even if it somehow worked). Still we are at the starting point again, by returning the full block collision shape in case your condition is not verified, the block pushes you back, and the only way i managed to get that working is still to return a voxel shape which is slightly smaller than the full cube as i showed earlier..why that works? i honestly still have to figure it out 🤔

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Posted

I've literally done this before.

https://github.com/Draco18s/ReasonableRealism/blob/1.14.4/src/main/java/com/draco18s/industry/block/RailBridgeBlock.java#L71

 

I'm not overriding a vanilla block to do it, but I've still conditionally given a block a collision volume.

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

I changed the method to:

public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
        return VoxelShapes.empty();
}

And the block has no collision at all. That means there should be something wrong with my condition that causes the block switches between the state collidable and not collidable

Posted (edited)
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
        Entity entity = context.getEntity();
        if(!(entity instanceof LivingEntity)) return super.getCollisionShape(state, worldIn, pos, context);
        ItemStack boots = ((LivingEntity) entity).getItemStackFromSlot(EquipmentSlotType.FEET);
        ResourceLocation registryName = boots.getItem().getRegistryName();
        if(registryName == null || !registryName.getPath().equals("item_name")) return super.getCollisionShape(state, worldIn, pos, context);
        return VoxelShapes.empty();
    }

This is the inverted one.

public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
        Entity entity = context.getEntity();
        if(entity instanceof LivingEntity) {
            ItemStack boots = ((LivingEntity) entity).getItemStackFromSlot(EquipmentSlotType.FEET);
            ResourceLocation registryName = boots.getItem().getRegistryName();
            if(registryName != null && registryName.getPath().equals("item_name")) {
                return VoxelShapes.empty();
            }
        }
        return super.getCollisionShape(state, worldIn, pos, context);
    }

This is the one I made at the very beginning.

 

I don't see the problem though.

Edited by NorthWestWind
Posted
32 minutes ago, NorthWestWind said:

ResourceLocation registryName = boots.getItem().getRegistryName();

if(registryName != null && registryName.getPath().equals("item_name")) {

Dude, create a field to hold a reference to your boots. Don't string compare!

Also, the registry name will never be null. Trying to register an item with a null registry name throws an error.

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
Quote

Dude, create a field to hold a reference to your boots. Don't string compare!

ok I'll change that

Quote

Also, the registry name will never be null. Trying to register an item with a null registry name throws an error.

IntelliJ told me this and I just don't know

Posted
58 minutes ago, NorthWestWind said:

IntelliJ told me this and I just don't know

Because the method isn't annotated as @NonNull. And this is because before SetRegistryName is called, it will return null, but once the game's running you can be sure that no registry name will ever be null.

This is a case of being unable to tell the compiler that we don't need the check in a way that the compiler will be able to understand.

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

Why don't you make a boolean property which if is true you can walk through the block and setting the boolean property to true for the blocks the player is looking at and if the entity (in this case the player) matches the condition i would do it like this it's not even hard to code

Posted

So, I created a HashMap to store whether the player can walk through blocks. In LivingUpdateEvent, the map is updated.

And then, in the extended block, it reads the states of the player from the map and decides whether to have collision or not, but that still doesn't work

Posted
9 hours ago, Crazzy4999 said:

Why don't you make a boolean property which if is true you can walk through the block and setting the boolean property to true for the blocks the player is looking at and if the entity (in this case the player) matches the condition i would do it like this it's not even hard to code

So the player can walk through the block only when actually looking at it?

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Posted
6 minutes ago, Beethoven92 said:

So the player can walk through the block only when actually looking at it?

Yes by what i wrote than now i realised that this Guy wants something else xd

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.