Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.8] Weird pushable entity collision glitch


Recommended Posts

Hello guys, do you know how can I do a pushable entity? I tried using the code from EntityBoat and EntityMinecart; however, I always get a annoying effect: when the entity collides, it will sometimes go to the top of the other entity bounding box. I also noted that this happened with other mods as well. So, what is causing it?

 

Anyway, here is the current code that I'm using.

 

 

 

@Override

public boolean canBePushed()

{

return true;

}

 

@Override

public AxisAlignedBB getCollisionBox(Entity entity)

{

return entity.getEntityBoundingBox();

}

 

@Override

public AxisAlignedBB getBoundingBox()

{

return this.getEntityBoundingBox();

}

 

/** From minecart code */

protected void handlePushMotion()

{

if (this.worldObj.isRemote)

{

this.setPosition(this.posX, this.posY, this.posZ);

this.setRotation(this.rotationYaw, this.rotationPitch);

}

else

{

this.prevPosX = this.posX;

this.prevPosY = this.posY;

this.prevPosZ = this.posZ;

this.motionY -= 0.03999999910593033D;

int j = MathHelper.floor_double(this.posX);

int k = MathHelper.floor_double(this.posZ);

 

this.motionX = MathHelper.clamp_double(this.motionX, -0.4D, 0.4D);

this.motionZ = MathHelper.clamp_double(this.motionZ, -0.4D, 0.4D);

 

if (this.onGround)

{

this.motionX *= 0.5D;

this.motionY *= 0.5D;

this.motionZ *= 0.5D;

}

 

this.moveEntity(this.motionX, this.motionY, this.motionZ);

 

if (!this.onGround)

{

this.motionX *= 0.94999998807907104D;

this.motionZ *= 0.94999998807907104D;

if (this.inWater)

{

this.motionY -= 0.0125F;

if (this.motionY < -0.15F)

this.motionY = -0.15F;

}

else

{

this.motionY -= 0.025F;

if (this.motionY < -0.6F)

this.motionY = -0.6F;

}

}

 

this.doBlockCollisions();

this.rotationPitch = 0.0F;

double xDifference = this.prevPosX - this.posX;

double zDifference = this.prevPosZ - this.posZ;

 

if (xDifference * xDifference + zDifference * zDifference > 0.001D)

this.rotationYaw = (float) (Math.atan2(zDifference, xDifference) * 180.0D / Math.PI);

 

double d3 = MathHelper.wrapAngleTo180_float(this.rotationYaw - this.prevRotationYaw);

if (d3 < -170.0D || d3 >= 170.0D)

this.rotationYaw += 180.0F;

 

this.setRotation(this.rotationYaw, this.rotationPitch);

this.handleWaterMovement();

}

}

 

 

 

PS: What I really want is something similar to when you try to push a wolf that is sitting.

Link to post
Share on other sites

Theres some weird black magic that happens with the posY...

 

Anyway Ive gotten around it by using a dataWatcher to hold the posY data, so rather than changing the posY I update the datawatcher with that value and on the onUpdate method I do posY = getDataWatcher.getWatchableFloat(yourId)

 

Look at this: http://www.minecraftforge.net/wiki/Datawatcher

"you seem to be THE best modder I've seen imo."

~spynathan

 

ლ(́◉◞౪◟◉‵ლ

Link to post
Share on other sites

Actually I looked a bit into it, when an entity packet is sent this method is called in Entity.class

 

    @SideOnly(Side.CLIENT)

    public void func_180426_a(double p_180426_1_, double p_180426_3_, double p_180426_5_, float p_180426_7_, float p_180426_8_, int p_180426_9_, boolean p_180426_10_)

    {

        this.setPosition(p_180426_1_, p_180426_3_, p_180426_5_);

        this.setRotation(p_180426_7_, p_180426_8_);

        List list = this.worldObj.getCollidingBoundingBoxes(this, this.getEntityBoundingBox().contract(0.03125D, 0.0D, 0.03125D));

 

        if (!list.isEmpty())

        {

            double d3 = 0.0D;

            Iterator iterator = list.iterator();

 

            while (iterator.hasNext())

            {

                AxisAlignedBB axisalignedbb = (AxisAlignedBB)iterator.next();

 

                if (axisalignedbb.maxY > d3)

                {

                    d3 = axisalignedbb.maxY;

                }

            }

 

 

            //THIS BIT CAUSES IT    \/

            p_180426_3_ += d3 - this.getEntityBoundingBox().minY;

            this.setPosition(p_180426_1_, p_180426_3_, p_180426_5_);

        }

    }

 

So just override the  func_180426_a in your entity class with something suitable

"you seem to be THE best modder I've seen imo."

~spynathan

 

ლ(́◉◞౪◟◉‵ლ

Link to post
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.

Guest
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.



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.