2025-11-24 22:52:51 +03:00

77 lines
2.4 KiB
Java

/*
* Decompiled with CFR 0.152.
*/
package net.minecraft.world.entity.animal;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.tags.FluidTags;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.AgeableMob;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.pathfinder.PathType;
public abstract class AgeableWaterCreature
extends AgeableMob {
protected AgeableWaterCreature(EntityType<? extends AgeableWaterCreature> type, Level level) {
super((EntityType<? extends AgeableMob>)type, level);
this.setPathfindingMalus(PathType.WATER, 0.0f);
}
@Override
public boolean checkSpawnObstruction(LevelReader level) {
return level.isUnobstructed(this);
}
@Override
public int getAmbientSoundInterval() {
return 120;
}
@Override
public int getBaseExperienceReward(ServerLevel level) {
return 1 + this.random.nextInt(3);
}
protected void handleAirSupply(int preTickAirSupply) {
if (this.isAlive() && !this.isInWater()) {
this.setAirSupply(preTickAirSupply - 1);
if (this.shouldTakeDrowningDamage()) {
this.setAirSupply(0);
this.hurt(this.damageSources().drown(), 2.0f);
}
} else {
this.setAirSupply(300);
}
}
@Override
public void baseTick() {
int airSupply = this.getAirSupply();
super.baseTick();
this.handleAirSupply(airSupply);
}
@Override
public boolean isPushedByFluid() {
return false;
}
@Override
public boolean canBeLeashed() {
return false;
}
public static boolean checkSurfaceAgeableWaterCreatureSpawnRules(EntityType<? extends AgeableWaterCreature> type, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random) {
int seaLevel = level.getSeaLevel();
int minSpawnLevel = seaLevel - 13;
return pos.getY() >= minSpawnLevel && pos.getY() <= seaLevel && level.getFluidState(pos.below()).is(FluidTags.WATER) && level.getBlockState(pos.above()).is(Blocks.WATER);
}
}