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

69 lines
2.7 KiB
Java

package net.minecraft.world.entity.ai.behavior;
import com.google.common.collect.ImmutableMap;
import it.unimi.dsi.fastutil.ints.IntList;
import java.util.List;
import net.minecraft.Util;
import net.minecraft.core.BlockPos;
import net.minecraft.core.component.DataComponents;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.npc.Villager;
import net.minecraft.world.entity.projectile.FireworkRocketEntity;
import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.world.entity.raid.Raid;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.component.FireworkExplosion;
import net.minecraft.world.item.component.Fireworks;
import org.jetbrains.annotations.Nullable;
public class CelebrateVillagersSurvivedRaid extends Behavior<Villager> {
@Nullable
private Raid currentRaid;
public CelebrateVillagersSurvivedRaid(int minDuration, int maxDuration) {
super(ImmutableMap.of(), minDuration, maxDuration);
}
protected boolean checkExtraStartConditions(ServerLevel level, Villager owner) {
BlockPos blockPos = owner.blockPosition();
this.currentRaid = level.getRaidAt(blockPos);
return this.currentRaid != null && this.currentRaid.isVictory() && MoveToSkySeeingSpot.hasNoBlocksAbove(level, owner, blockPos);
}
protected boolean canStillUse(ServerLevel level, Villager entity, long gameTime) {
return this.currentRaid != null && !this.currentRaid.isStopped();
}
protected void stop(ServerLevel level, Villager entity, long gameTime) {
this.currentRaid = null;
entity.getBrain().updateActivityFromSchedule(level.getDayTime(), level.getGameTime());
}
protected void tick(ServerLevel level, Villager owner, long gameTime) {
RandomSource randomSource = owner.getRandom();
if (randomSource.nextInt(100) == 0) {
owner.playCelebrateSound();
}
if (randomSource.nextInt(200) == 0 && MoveToSkySeeingSpot.hasNoBlocksAbove(level, owner, owner.blockPosition())) {
DyeColor dyeColor = Util.getRandom(DyeColor.values(), randomSource);
int i = randomSource.nextInt(3);
ItemStack itemStack = this.getFirework(dyeColor, i);
Projectile.spawnProjectile(new FireworkRocketEntity(owner.level(), owner, owner.getX(), owner.getEyeY(), owner.getZ(), itemStack), level, itemStack);
}
}
private ItemStack getFirework(DyeColor color, int flightTime) {
ItemStack itemStack = new ItemStack(Items.FIREWORK_ROCKET);
itemStack.set(
DataComponents.FIREWORKS,
new Fireworks(
(byte)flightTime, List.of(new FireworkExplosion(FireworkExplosion.Shape.BURST, IntList.of(color.getFireworkColor()), IntList.of(), false, false))
)
);
return itemStack;
}
}