minecraft-src/net/minecraft/world/entity/ai/sensing/PiglinSpecificSensor.java
2025-07-04 02:00:41 +03:00

127 lines
5.7 KiB
Java

package net.minecraft.world.entity.ai.sensing;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.tags.BlockTags;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.ai.Brain;
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
import net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities;
import net.minecraft.world.entity.boss.wither.WitherBoss;
import net.minecraft.world.entity.monster.WitherSkeleton;
import net.minecraft.world.entity.monster.hoglin.Hoglin;
import net.minecraft.world.entity.monster.piglin.AbstractPiglin;
import net.minecraft.world.entity.monster.piglin.Piglin;
import net.minecraft.world.entity.monster.piglin.PiglinAi;
import net.minecraft.world.entity.monster.piglin.PiglinBrute;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.CampfireBlock;
import net.minecraft.world.level.block.state.BlockState;
public class PiglinSpecificSensor extends Sensor<LivingEntity> {
@Override
public Set<MemoryModuleType<?>> requires() {
return ImmutableSet.of(
MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES,
MemoryModuleType.NEAREST_LIVING_ENTITIES,
MemoryModuleType.NEAREST_VISIBLE_NEMESIS,
MemoryModuleType.NEAREST_TARGETABLE_PLAYER_NOT_WEARING_GOLD,
MemoryModuleType.NEAREST_PLAYER_HOLDING_WANTED_ITEM,
MemoryModuleType.NEAREST_VISIBLE_HUNTABLE_HOGLIN,
MemoryModuleType.NEAREST_VISIBLE_BABY_HOGLIN,
MemoryModuleType.NEAREST_VISIBLE_ADULT_PIGLINS,
MemoryModuleType.NEARBY_ADULT_PIGLINS,
MemoryModuleType.VISIBLE_ADULT_PIGLIN_COUNT,
MemoryModuleType.VISIBLE_ADULT_HOGLIN_COUNT,
MemoryModuleType.NEAREST_REPELLENT
);
}
@Override
protected void doTick(ServerLevel level, LivingEntity entity) {
Brain<?> brain = entity.getBrain();
brain.setMemory(MemoryModuleType.NEAREST_REPELLENT, findNearestRepellent(level, entity));
Optional<Mob> optional = Optional.empty();
Optional<Hoglin> optional2 = Optional.empty();
Optional<Hoglin> optional3 = Optional.empty();
Optional<Piglin> optional4 = Optional.empty();
Optional<LivingEntity> optional5 = Optional.empty();
Optional<Player> optional6 = Optional.empty();
Optional<Player> optional7 = Optional.empty();
int i = 0;
List<AbstractPiglin> list = Lists.<AbstractPiglin>newArrayList();
List<AbstractPiglin> list2 = Lists.<AbstractPiglin>newArrayList();
NearestVisibleLivingEntities nearestVisibleLivingEntities = (NearestVisibleLivingEntities)brain.getMemory(MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES)
.orElse(NearestVisibleLivingEntities.empty());
for (LivingEntity livingEntity : nearestVisibleLivingEntities.findAll(livingEntityx -> true)) {
if (livingEntity instanceof Hoglin hoglin) {
if (hoglin.isBaby() && optional3.isEmpty()) {
optional3 = Optional.of(hoglin);
} else if (hoglin.isAdult()) {
i++;
if (optional2.isEmpty() && hoglin.canBeHunted()) {
optional2 = Optional.of(hoglin);
}
}
} else if (livingEntity instanceof PiglinBrute piglinBrute) {
list.add(piglinBrute);
} else if (livingEntity instanceof Piglin piglin) {
if (piglin.isBaby() && optional4.isEmpty()) {
optional4 = Optional.of(piglin);
} else if (piglin.isAdult()) {
list.add(piglin);
}
} else if (livingEntity instanceof Player player) {
if (optional6.isEmpty() && !PiglinAi.isWearingSafeArmor(player) && entity.canAttack(livingEntity)) {
optional6 = Optional.of(player);
}
if (optional7.isEmpty() && !player.isSpectator() && PiglinAi.isPlayerHoldingLovedItem(player)) {
optional7 = Optional.of(player);
}
} else if (!optional.isEmpty() || !(livingEntity instanceof WitherSkeleton) && !(livingEntity instanceof WitherBoss)) {
if (optional5.isEmpty() && PiglinAi.isZombified(livingEntity.getType())) {
optional5 = Optional.of(livingEntity);
}
} else {
optional = Optional.of((Mob)livingEntity);
}
}
for (LivingEntity livingEntity2 : (List)brain.getMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES).orElse(ImmutableList.of())) {
if (livingEntity2 instanceof AbstractPiglin abstractPiglin && abstractPiglin.isAdult()) {
list2.add(abstractPiglin);
}
}
brain.setMemory(MemoryModuleType.NEAREST_VISIBLE_NEMESIS, optional);
brain.setMemory(MemoryModuleType.NEAREST_VISIBLE_HUNTABLE_HOGLIN, optional2);
brain.setMemory(MemoryModuleType.NEAREST_VISIBLE_BABY_HOGLIN, optional3);
brain.setMemory(MemoryModuleType.NEAREST_VISIBLE_ZOMBIFIED, optional5);
brain.setMemory(MemoryModuleType.NEAREST_TARGETABLE_PLAYER_NOT_WEARING_GOLD, optional6);
brain.setMemory(MemoryModuleType.NEAREST_PLAYER_HOLDING_WANTED_ITEM, optional7);
brain.setMemory(MemoryModuleType.NEARBY_ADULT_PIGLINS, list2);
brain.setMemory(MemoryModuleType.NEAREST_VISIBLE_ADULT_PIGLINS, list);
brain.setMemory(MemoryModuleType.VISIBLE_ADULT_PIGLIN_COUNT, list.size());
brain.setMemory(MemoryModuleType.VISIBLE_ADULT_HOGLIN_COUNT, i);
}
private static Optional<BlockPos> findNearestRepellent(ServerLevel level, LivingEntity livingEntity) {
return BlockPos.findClosestMatch(livingEntity.blockPosition(), 8, 4, blockPos -> isValidRepellent(level, blockPos));
}
private static boolean isValidRepellent(ServerLevel level, BlockPos pos) {
BlockState blockState = level.getBlockState(pos);
boolean bl = blockState.is(BlockTags.PIGLIN_REPELLENTS);
return bl && blockState.is(Blocks.SOUL_CAMPFIRE) ? CampfireBlock.isLitCampfire(blockState) : bl;
}
}