Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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.

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

 

ლ(́◉◞౪◟◉‵ლ

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

 

ლ(́◉◞౪◟◉‵ლ

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

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.