203 lines
5.9 KiB
Java
203 lines
5.9 KiB
Java
|
|
package hal.studios.hpm.entity;
|
|
|
|
import net.minecraftforge.registries.ForgeRegistries;
|
|
import net.minecraftforge.network.PlayMessages;
|
|
import net.minecraftforge.network.NetworkHooks;
|
|
import net.minecraftforge.common.ForgeMod;
|
|
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.level.ServerLevelAccessor;
|
|
import net.minecraft.world.level.LevelReader;
|
|
import net.minecraft.world.level.Level;
|
|
import net.minecraft.world.item.ItemStack;
|
|
import net.minecraft.world.entity.projectile.ThrownPotion;
|
|
import net.minecraft.world.entity.player.Player;
|
|
import net.minecraft.world.entity.ai.navigation.PathNavigation;
|
|
import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation;
|
|
import net.minecraft.world.entity.ai.control.FlyingMoveControl;
|
|
import net.minecraft.world.entity.ai.attributes.Attributes;
|
|
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
|
|
import net.minecraft.world.entity.SpawnGroupData;
|
|
import net.minecraft.world.entity.PathfinderMob;
|
|
import net.minecraft.world.entity.MobType;
|
|
import net.minecraft.world.entity.MobSpawnType;
|
|
import net.minecraft.world.entity.Mob;
|
|
import net.minecraft.world.entity.EntityType;
|
|
import net.minecraft.world.entity.Entity;
|
|
import net.minecraft.world.entity.AreaEffectCloud;
|
|
import net.minecraft.world.damagesource.DamageSource;
|
|
import net.minecraft.world.InteractionResult;
|
|
import net.minecraft.world.InteractionHand;
|
|
import net.minecraft.world.DifficultyInstance;
|
|
import net.minecraft.sounds.SoundEvent;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
import net.minecraft.network.protocol.Packet;
|
|
import net.minecraft.nbt.CompoundTag;
|
|
import net.minecraft.core.BlockPos;
|
|
|
|
import javax.annotation.Nullable;
|
|
|
|
import hal.studios.hpm.procedures.CutterSeatTickProcedure;
|
|
import hal.studios.hpm.procedures.CutterPassengerOnInitialEntitySpawnProcedure;
|
|
import hal.studios.hpm.procedures.CutterPassengerEntityIsHurtProcedure;
|
|
import hal.studios.hpm.init.HpmModEntities;
|
|
|
|
public class CutterSeatEntity extends PathfinderMob {
|
|
public CutterSeatEntity(PlayMessages.SpawnEntity packet, Level world) {
|
|
this(HpmModEntities.CUTTER_SEAT.get(), world);
|
|
}
|
|
|
|
public CutterSeatEntity(EntityType<CutterSeatEntity> type, Level world) {
|
|
super(type, world);
|
|
maxUpStep = 0.6f;
|
|
xpReward = 0;
|
|
setNoAi(false);
|
|
setPersistenceRequired();
|
|
this.moveControl = new FlyingMoveControl(this, 10, true);
|
|
}
|
|
|
|
@Override
|
|
public Packet<?> getAddEntityPacket() {
|
|
return NetworkHooks.getEntitySpawningPacket(this);
|
|
}
|
|
|
|
@Override
|
|
protected PathNavigation createNavigation(Level world) {
|
|
return new FlyingPathNavigation(this, world);
|
|
}
|
|
|
|
@Override
|
|
protected void registerGoals() {
|
|
super.registerGoals();
|
|
|
|
}
|
|
|
|
@Override
|
|
public MobType getMobType() {
|
|
return MobType.UNDEFINED;
|
|
}
|
|
|
|
@Override
|
|
public boolean removeWhenFarAway(double distanceToClosestPlayer) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public double getPassengersRidingOffset() {
|
|
return super.getPassengersRidingOffset() + -0.6;
|
|
}
|
|
|
|
@Override
|
|
public SoundEvent getHurtSound(DamageSource ds) {
|
|
return ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(""));
|
|
}
|
|
|
|
@Override
|
|
public SoundEvent getDeathSound() {
|
|
return ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(""));
|
|
}
|
|
|
|
@Override
|
|
public boolean causeFallDamage(float l, float d, DamageSource source) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean hurt(DamageSource source, float amount) {
|
|
CutterPassengerEntityIsHurtProcedure.execute(this.level, this.getX(), this.getY(), this.getZ(), this);
|
|
if (source.getDirectEntity() instanceof ThrownPotion || source.getDirectEntity() instanceof AreaEffectCloud)
|
|
return false;
|
|
if (source == DamageSource.FALL)
|
|
return false;
|
|
if (source == DamageSource.DROWN)
|
|
return false;
|
|
if (source == DamageSource.DRAGON_BREATH)
|
|
return false;
|
|
if (source == DamageSource.WITHER)
|
|
return false;
|
|
if (source.getMsgId().equals("witherSkull"))
|
|
return false;
|
|
return super.hurt(source, amount);
|
|
}
|
|
|
|
@Override
|
|
public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData livingdata, @Nullable CompoundTag tag) {
|
|
SpawnGroupData retval = super.finalizeSpawn(world, difficulty, reason, livingdata, tag);
|
|
CutterPassengerOnInitialEntitySpawnProcedure.execute(this);
|
|
return retval;
|
|
}
|
|
|
|
@Override
|
|
public InteractionResult mobInteract(Player sourceentity, InteractionHand hand) {
|
|
ItemStack itemstack = sourceentity.getItemInHand(hand);
|
|
InteractionResult retval = InteractionResult.sidedSuccess(this.level.isClientSide());
|
|
super.mobInteract(sourceentity, hand);
|
|
sourceentity.startRiding(this);
|
|
return retval;
|
|
}
|
|
|
|
@Override
|
|
public void baseTick() {
|
|
super.baseTick();
|
|
CutterSeatTickProcedure.execute(this.level, this.getX(), this.getY(), this.getZ(), this);
|
|
}
|
|
|
|
@Override
|
|
public boolean canBreatheUnderwater() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean checkSpawnObstruction(LevelReader world) {
|
|
return world.isUnobstructed(this);
|
|
}
|
|
|
|
@Override
|
|
public boolean isPushedByFluid() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean isPushable() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
protected void doPush(Entity entityIn) {
|
|
}
|
|
|
|
@Override
|
|
protected void pushEntities() {
|
|
}
|
|
|
|
@Override
|
|
protected void checkFallDamage(double y, boolean onGroundIn, BlockState state, BlockPos pos) {
|
|
}
|
|
|
|
@Override
|
|
public void setNoGravity(boolean ignored) {
|
|
super.setNoGravity(true);
|
|
}
|
|
|
|
public void aiStep() {
|
|
super.aiStep();
|
|
this.setNoGravity(true);
|
|
}
|
|
|
|
public static void init() {
|
|
}
|
|
|
|
public static AttributeSupplier.Builder createAttributes() {
|
|
AttributeSupplier.Builder builder = Mob.createMobAttributes();
|
|
builder = builder.add(Attributes.MOVEMENT_SPEED, 0.3);
|
|
builder = builder.add(Attributes.MAX_HEALTH, 50);
|
|
builder = builder.add(Attributes.ARMOR, 0);
|
|
builder = builder.add(Attributes.ATTACK_DAMAGE, 3);
|
|
builder = builder.add(Attributes.FOLLOW_RANGE, 16);
|
|
builder = builder.add(Attributes.FLYING_SPEED, 0.3);
|
|
builder = builder.add(ForgeMod.SWIM_SPEED.get(), 0.3);
|
|
return builder;
|
|
}
|
|
}
|