minecraft-src/net/minecraft/world/entity/monster/piglin/PiglinBrute.java
2025-07-04 02:49:36 +03:00

171 lines
5.8 KiB
Java

package net.minecraft.world.entity.monster.piglin;
import com.google.common.collect.ImmutableList;
import com.mojang.serialization.Dynamic;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.RandomSource;
import net.minecraft.util.profiling.Profiler;
import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraft.world.DifficultyInstance;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.SpawnGroupData;
import net.minecraft.world.entity.ai.Brain;
import net.minecraft.world.entity.ai.Brain.Provider;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier.Builder;
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
import net.minecraft.world.entity.ai.sensing.Sensor;
import net.minecraft.world.entity.ai.sensing.SensorType;
import net.minecraft.world.entity.monster.Monster;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.ServerLevelAccessor;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.Nullable;
public class PiglinBrute extends AbstractPiglin {
private static final int MAX_HEALTH = 50;
private static final float MOVEMENT_SPEED_WHEN_FIGHTING = 0.35F;
private static final int ATTACK_DAMAGE = 7;
private static final double TARGETING_RANGE = 12.0;
protected static final ImmutableList<SensorType<? extends Sensor<? super PiglinBrute>>> SENSOR_TYPES = ImmutableList.of(
SensorType.NEAREST_LIVING_ENTITIES, SensorType.NEAREST_PLAYERS, SensorType.NEAREST_ITEMS, SensorType.HURT_BY, SensorType.PIGLIN_BRUTE_SPECIFIC_SENSOR
);
protected static final ImmutableList<MemoryModuleType<?>> MEMORY_TYPES = ImmutableList.of(
MemoryModuleType.LOOK_TARGET,
MemoryModuleType.DOORS_TO_CLOSE,
MemoryModuleType.NEAREST_LIVING_ENTITIES,
MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES,
MemoryModuleType.NEAREST_VISIBLE_PLAYER,
MemoryModuleType.NEAREST_VISIBLE_ATTACKABLE_PLAYER,
MemoryModuleType.NEAREST_VISIBLE_ADULT_PIGLINS,
MemoryModuleType.NEARBY_ADULT_PIGLINS,
MemoryModuleType.HURT_BY,
MemoryModuleType.HURT_BY_ENTITY,
MemoryModuleType.WALK_TARGET,
MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE,
MemoryModuleType.ATTACK_TARGET,
MemoryModuleType.ATTACK_COOLING_DOWN,
MemoryModuleType.INTERACTION_TARGET,
MemoryModuleType.PATH,
MemoryModuleType.ANGRY_AT,
MemoryModuleType.NEAREST_VISIBLE_NEMESIS,
MemoryModuleType.HOME
);
public PiglinBrute(EntityType<? extends PiglinBrute> entityType, Level level) {
super(entityType, level);
this.xpReward = 20;
}
public static Builder createAttributes() {
return Monster.createMonsterAttributes()
.add(Attributes.MAX_HEALTH, 50.0)
.add(Attributes.MOVEMENT_SPEED, 0.35F)
.add(Attributes.ATTACK_DAMAGE, 7.0)
.add(Attributes.FOLLOW_RANGE, 12.0);
}
@Nullable
@Override
public SpawnGroupData finalizeSpawn(
ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData
) {
PiglinBruteAi.initMemories(this);
this.populateDefaultEquipmentSlots(level.getRandom(), difficulty);
return super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData);
}
@Override
protected void populateDefaultEquipmentSlots(RandomSource random, DifficultyInstance difficulty) {
this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.GOLDEN_AXE));
}
@Override
protected Provider<PiglinBrute> brainProvider() {
return Brain.provider(MEMORY_TYPES, SENSOR_TYPES);
}
@Override
protected Brain<?> makeBrain(Dynamic<?> dynamic) {
return PiglinBruteAi.makeBrain(this, this.brainProvider().makeBrain(dynamic));
}
@Override
public Brain<PiglinBrute> getBrain() {
return (Brain<PiglinBrute>)super.getBrain();
}
@Override
public boolean canHunt() {
return false;
}
@Override
public boolean wantsToPickUp(ServerLevel level, ItemStack stack) {
return stack.is(Items.GOLDEN_AXE) ? super.wantsToPickUp(level, stack) : false;
}
@Override
protected void customServerAiStep(ServerLevel level) {
ProfilerFiller profilerFiller = Profiler.get();
profilerFiller.push("piglinBruteBrain");
this.getBrain().tick(level, this);
profilerFiller.pop();
PiglinBruteAi.updateActivity(this);
PiglinBruteAi.maybePlayActivitySound(this);
super.customServerAiStep(level);
}
@Override
public PiglinArmPose getArmPose() {
return this.isAggressive() && this.isHoldingMeleeWeapon() ? PiglinArmPose.ATTACKING_WITH_MELEE_WEAPON : PiglinArmPose.DEFAULT;
}
@Override
public boolean hurtServer(ServerLevel level, DamageSource damageSource, float amount) {
boolean bl = super.hurtServer(level, damageSource, amount);
if (bl && damageSource.getEntity() instanceof LivingEntity livingEntity) {
PiglinBruteAi.wasHurtBy(level, this, livingEntity);
}
return bl;
}
@Override
protected SoundEvent getAmbientSound() {
return SoundEvents.PIGLIN_BRUTE_AMBIENT;
}
@Override
protected SoundEvent getHurtSound(DamageSource damageSource) {
return SoundEvents.PIGLIN_BRUTE_HURT;
}
@Override
protected SoundEvent getDeathSound() {
return SoundEvents.PIGLIN_BRUTE_DEATH;
}
@Override
protected void playStepSound(BlockPos pos, BlockState state) {
this.playSound(SoundEvents.PIGLIN_BRUTE_STEP, 0.15F, 1.0F);
}
protected void playAngrySound() {
this.makeSound(SoundEvents.PIGLIN_BRUTE_ANGRY);
}
@Override
protected void playConvertedSound() {
this.makeSound(SoundEvents.PIGLIN_BRUTE_CONVERTED_TO_ZOMBIFIED);
}
}