171 lines
5.8 KiB
Java
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);
|
|
}
|
|
}
|