Posted August 3, 201510 yr 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.
August 3, 201510 yr 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 ლ(́◉◞౪◟◉‵ლ
August 4, 201510 yr 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.