Files
Swashbucklers/src/main/java/hal/studios/hpm/entity/CutterSeatEntity.java
2026-01-24 22:03:03 +00:00

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;
}
}