mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
117 lines
3.2 KiB
Java
117 lines
3.2 KiB
Java
package com.hbm.entity.mob;
|
|
|
|
import net.minecraft.entity.EntityCreature;
|
|
import net.minecraft.util.DamageSource;
|
|
import net.minecraft.world.World;
|
|
|
|
/**
|
|
* Base class for "digging" entities, removes things such as fall behavior, enables noClip and implements some basic movement code
|
|
* @author hbm
|
|
*/
|
|
public abstract class EntityBurrowingBase extends EntityCreature {
|
|
|
|
protected float airDrag;
|
|
protected float airDragY;
|
|
protected float groundDrag;
|
|
protected float groundDragY;
|
|
|
|
public EntityBurrowingBase(World world) {
|
|
super(world);
|
|
this.noClip = true;
|
|
this.airDrag = 0.995F;
|
|
this.airDragY = 0.997F;
|
|
this.groundDrag = 0.98F;
|
|
this.groundDragY = 0.995F;
|
|
}
|
|
|
|
/**
|
|
* Since most burrowing entities (such as worms, drills and whatnot) rotate along with their movement, center the eye height.
|
|
* We can override this later on in case we have an "upright" burrowing entity.
|
|
*/
|
|
@Override
|
|
public float getEyeHeight() {
|
|
return this.height * 0.5F;
|
|
}
|
|
|
|
@Override
|
|
public boolean attackEntityFrom(DamageSource source, float amount) {
|
|
|
|
if(this.isEntityInvulnerable() || source == DamageSource.drown || source == DamageSource.inWall) {
|
|
return false;
|
|
}
|
|
|
|
return super.attackEntityFrom(source, amount);
|
|
}
|
|
|
|
/**
|
|
* No fall and fallstate functions
|
|
*/
|
|
@Override
|
|
protected void fall(float dist) { }
|
|
@Override
|
|
protected void updateFallState(double distFallen, boolean onGround) { }
|
|
|
|
/**
|
|
* ...and we turn off the default AI routines. We don't care about path-finding anyway.
|
|
*/
|
|
@Override
|
|
protected void updateEntityActionState() { }
|
|
|
|
/**
|
|
* Calls moveFlying to add motion depending on our entity's rotation, then moves. Drag is applied depending on whether it is underground or airborne.
|
|
* Called in onLivingUpdate TODO: figure out if strafe and forward are set by one of the superclasses or if this part is pointless
|
|
*/
|
|
@Override
|
|
public void moveEntityWithHeading(float strafe, float forward) {
|
|
|
|
float drag = this.groundDrag;
|
|
float dragY = this.groundDragY;
|
|
|
|
if(!isEntityInsideOpaqueBlock() && !isInWater() && !handleLavaMovement()) {
|
|
drag = this.airDrag;
|
|
dragY = this.airDragY;
|
|
}
|
|
|
|
//misnomer, actually just sets the motion, the moving part happens the line after that
|
|
moveFlying(strafe, forward, 0.02F);
|
|
moveEntity(this.motionX, this.motionY, this.motionZ);
|
|
|
|
this.motionX *= drag;
|
|
this.motionY *= dragY;
|
|
this.motionZ *= drag;
|
|
}
|
|
|
|
/**
|
|
* Sorry, can't use ladders.
|
|
*/
|
|
@Override
|
|
public boolean isOnLadder() {
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* If the mob supports the movement behavior through air
|
|
* @return true if the entity can fly and false if it can only move through ground.
|
|
*/
|
|
public boolean canFly() {
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Contrary to its name, all I could find about it was that it controlled some rotation behavior. BoT seems to work fine with it, so we'll use it here too.
|
|
*/
|
|
@Override
|
|
protected boolean isAIEnabled() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Whether the entity can freely dig up and down or if gravity should be applied instead.
|
|
* Some entities might not be able to course-correct when airborne, such as small non-worm entities.
|
|
* @return true if vertical movement can be performed and false if gravity should apply.
|
|
*/
|
|
protected boolean canSupportMovement() {
|
|
return isEntityInsideOpaqueBlock() || canFly();
|
|
}
|
|
}
|