package net.minecraft.world.entity; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData.Builder; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.RandomSource; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.animal.Squid; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; import org.jetbrains.annotations.Nullable; public class GlowSquid extends Squid { private static final EntityDataAccessor DATA_DARK_TICKS_REMAINING = SynchedEntityData.defineId(GlowSquid.class, EntityDataSerializers.INT); private static final int DEFAULT_DARK_TICKS_REMAINING = 0; public GlowSquid(EntityType entityType, Level level) { super(entityType, level); } @Override protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; } @Override protected void defineSynchedData(Builder builder) { super.defineSynchedData(builder); builder.define(DATA_DARK_TICKS_REMAINING, 0); } @Nullable @Override public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) { return EntityType.GLOW_SQUID.create(level, EntitySpawnReason.BREEDING); } @Override protected SoundEvent getSquirtSound() { return SoundEvents.GLOW_SQUID_SQUIRT; } @Override protected SoundEvent getAmbientSound() { return SoundEvents.GLOW_SQUID_AMBIENT; } @Override protected SoundEvent getHurtSound(DamageSource damageSource) { return SoundEvents.GLOW_SQUID_HURT; } @Override protected SoundEvent getDeathSound() { return SoundEvents.GLOW_SQUID_DEATH; } @Override public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); tag.putInt("DarkTicksRemaining", this.getDarkTicksRemaining()); } @Override public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); this.setDarkTicks(tag.getIntOr("DarkTicksRemaining", 0)); } @Override public void aiStep() { super.aiStep(); int i = this.getDarkTicksRemaining(); if (i > 0) { this.setDarkTicks(i - 1); } this.level().addParticle(ParticleTypes.GLOW, this.getRandomX(0.6), this.getRandomY(), this.getRandomZ(0.6), 0.0, 0.0, 0.0); } @Override public boolean hurtServer(ServerLevel level, DamageSource damageSource, float amount) { boolean bl = super.hurtServer(level, damageSource, amount); if (bl) { this.setDarkTicks(100); } return bl; } private void setDarkTicks(int darkTicks) { this.entityData.set(DATA_DARK_TICKS_REMAINING, darkTicks); } public int getDarkTicksRemaining() { return this.entityData.get(DATA_DARK_TICKS_REMAINING); } public static boolean checkGlowSquidSpawnRules( EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random ) { return pos.getY() <= level.getSeaLevel() - 33 && level.getRawBrightness(pos, 0) == 0 && level.getBlockState(pos).is(Blocks.WATER); } }