Jump to content

Possible to make a block that adds the wither affect upon entity collision?


Aideux

Recommended Posts

Just like the title says, is it possible to make a block that adds the wither status effect upon entity collision? I'm assuming that something would be added to the block constructor, but I'm not entirely sure what the correct terminology is. Can someone point me in the right direction? Thank you!

Link to comment
Share on other sites

Define "access."  If you want to look at it, like Lex said, then open up the Forge-src jar in the project hierarchy and browse down to net -> minecraft -> blocks -> BlockSoulSand.java

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

Define "access."  If you want to look at it, like Lex said, then open up the Forge-src jar in the project hierarchy and browse down to net -> minecraft -> blocks -> BlockSoulSand.java

So I looked at the code, and it doesn't seem like there's any explicit method call to make entity collision instantiate the wither effect.

Link to comment
Share on other sites

Define "access."  If you want to look at it, like Lex said, then open up the Forge-src jar in the project hierarchy and browse down to net -> minecraft -> blocks -> BlockSoulSand.java

So I looked at the code, and it doesn't seem like there's any explicit method call to make entity collision instantiate the wither effect.

 

Soul Sand doesn't apply the Wither effect, it slows down entities.

 

There are only two methods in

BlockSoulSand

excluding the constructor: one defines the bounding box (so entities can collide with it), the other slows down entities when they collide with the block.

 

When an entity collides with your block, check if it's an

EntityLivingBase

and then use

EntityLivingBase#addPotionEffect

to apply the Wither effect to it.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

Define "access."  If you want to look at it, like Lex said, then open up the Forge-src jar in the project hierarchy and browse down to net -> minecraft -> blocks -> BlockSoulSand.java

So I looked at the code, and it doesn't seem like there's any explicit method call to make entity collision instantiate the wither effect.

 

Soul Sand doesn't apply the Wither effect, it slows down entities.

 

There are only two methods in

BlockSoulSand

excluding the constructor: one defines the bounding box (so entities can collide with it), the other slows down entities when they collide with the block.

 

When an entity collides with your block, check if it's an

EntityLivingBase

and then use

EntityLivingBase#addPotionEffect

to apply the Wither effect to it.

 

So here's what I've come up with, but it still doesn't work! Can you please help me out? I'm really confused.

package com.aideux.cursedblock;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class BlockCursed extends Block 
{
public final String name = "cursedBlock";

public BlockCursed()
{
	super(Material.rock);
	GameRegistry.registerBlock(this, name);
	setUnlocalizedName(CursedBlock.MODID + "_" + name);
	setCreativeTab(CreativeTabs.tabMisc);
}
public void onEntityWalking(World world, int par2, int par3, int par4, Entity entity)
{
	if(entity instanceof EntityLivingBase)
	{
		((EntityLivingBase) entity).addPotionEffect(new PotionEffect(Potion.confusion.getId(), 100, 1));
	}
}

}

Link to comment
Share on other sites

There is no

Block#onEntityWalking

method in 1.8+, so your method doesn't override a super method and is never called. This is why you should always use the

@Override

annotation, you would have gotten a compilation error telling you this.

 

Use your IDE to auto-generate override methods.

 

Block#onEntityCollidedWithBlock(World, BlockPos, Entity)

is called when an entity that can trigger walking (i.e. returns

true

from

Entity#canTriggerWalking

) walks on top of the block.

 

Block#onEntityCollidedWithBlock(World, BlockPos, IBlockState, Entity)

is called when an entity collides with the block in any direction.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

Note that the block boundary must be smaller than 1x1x1 in the direction you wish for collisions to occur in.

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

Note that the block boundary must be smaller than 1x1x1 in the direction you wish for collisions to occur in.

Hey, I got it to work, thank you! For some reason, however, the wither effect is only added when the entity collides with the top of the block. This may have to do with the fact that I just copied and pasted the collision bounds from the soul sand class, so is there any way I can fix this? Thank you again, I really appreciate you helping me out!

Link to comment
Share on other sites

An entity can only collide with a block on a given side if the block's bounding box is inset by a small amount on that side. Soul Sand is only inset on the top (i.e. the maximum y coordinate is less than 1), so entities will only collide on the top.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

An entity can only collide with a block on a given side if the block's bounding box is inset by a small amount on that side. Soul Sand is only inset on the top (i.e. the maximum y coordinate is less than 1), so entities will only collide on the top.

 

So now the player can collide with the top and two sides to produce the wither effect, but the bottom and the remaining two sides do nothing... I'm sorry for being so persistent, but could you please point me in the right direction? Here's my code:

float f = 0.125F;
return new AxisAlignedBB((double)pos.getX(), (double)pos.getY(), (double)pos.getZ(), (double)((float)(pos.getX() + 1) - f), (double)((float)(pos.getY() + 1) - f), (double)((float)(pos.getZ() + 1) - f));

Link to comment
Share on other sites

If you want entities to be able to collide on all sides, call

Block#setBlockBounds

in the constructor with

OFFSET

as the minimum coordinates and

1 - OFFSET

as the maximum coordinates (where

OFFSET

is some small value like 0.125). This removes the need to override

Block#getCollisionBoundingBox

.

 

In 1.9, create a static final

AxisAlignedBB

field with these coordinates instead and override

Block#getCollisionBoundingBox

to return it.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

0.125 is a fairly substantial amount: 2 pixels!

 

If you want something that looks like a full block you can have an offset amount of 0.0001 which IIRC is sufficient for collisions, but small enough that after being rendered you can't tell.

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 just tested this here, the smallest possible offset (to 4 decimal places) is 0.0011. With an offset of 0.0010, the player can only collide by walking into a corner of the block rather than anywhere on any face.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

I typed that and had the sneaking suspicion that I may have added too many zeros.  The last time I futzed around with it (needing a full-cube block that was collidable from all sides) was in 1.6.4

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 just tested this here, the smallest possible offset (to 4 decimal places) is 0.0011. With an offset of 0.0010, the player can only collide by walking into a corner of the block rather than anywhere on any face.

So I gave your test code a shot and now I just fall through the block. I do get withered though haha, but I'm passing right through it like it doesn't exist.

Link to comment
Share on other sites

I just tested this here, the smallest possible offset (to 4 decimal places) is 0.0011. With an offset of 0.0010, the player can only collide by walking into a corner of the block rather than anywhere on any face.

So I gave your test code a shot and now I just fall through the block. I do get withered though haha, but I'm passing right through it like it doesn't exist.

 

Are you using 1.8.9 or 1.9? My code is for 1.9, for 1.8.9 you'd need to call

Block#setBlockBounds

with the coordinates instead of creating a static field and overriding

Block#getCollisionBoundingBox

.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

I just tested this here, the smallest possible offset (to 4 decimal places) is 0.0011. With an offset of 0.0010, the player can only collide by walking into a corner of the block rather than anywhere on any face.

So I gave your test code a shot and now I just fall through the block. I do get withered though haha, but I'm passing right through it like it doesn't exist.

[/quot

Are you using 1.8.9 or 1.9? My code is for 1.9, for 1.8.9 you'd need to call

Block#setBlockBounds

with the coordinates instead of creating a static field and overriding

Block#getCollisionBoundingBox

.

 

I'm using 1.8.9. What's the syntax look like for setBlockBonds as opposed to getCollisionBounding?

Link to comment
Share on other sites

I'm using 1.8.9. What's the syntax look like for setBlockBonds as opposed to getCollisionBounding?

 

Call

setBlockBounds

in your constructor. Look at the method definition in the

Block

class for the arguments.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

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



×
×
  • Create New...

Important Information

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