minecraft-src/net/minecraft/world/effect/MobEffectUtil.java
2025-07-04 03:45:38 +03:00

64 lines
2.3 KiB
Java

package net.minecraft.world.effect;
import java.util.List;
import net.minecraft.core.Holder;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.Mth;
import net.minecraft.util.StringUtil;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable;
public final class MobEffectUtil {
public static Component formatDuration(MobEffectInstance effect, float durationFactor, float ticksPerSecond) {
if (effect.isInfiniteDuration()) {
return Component.translatable("effect.duration.infinite");
} else {
int i = Mth.floor(effect.getDuration() * durationFactor);
return Component.literal(StringUtil.formatTickDuration(i, ticksPerSecond));
}
}
public static boolean hasDigSpeed(LivingEntity entity) {
return entity.hasEffect(MobEffects.HASTE) || entity.hasEffect(MobEffects.CONDUIT_POWER);
}
public static int getDigSpeedAmplification(LivingEntity entity) {
int i = 0;
int j = 0;
if (entity.hasEffect(MobEffects.HASTE)) {
i = entity.getEffect(MobEffects.HASTE).getAmplifier();
}
if (entity.hasEffect(MobEffects.CONDUIT_POWER)) {
j = entity.getEffect(MobEffects.CONDUIT_POWER).getAmplifier();
}
return Math.max(i, j);
}
public static boolean hasWaterBreathing(LivingEntity entity) {
return entity.hasEffect(MobEffects.WATER_BREATHING) || entity.hasEffect(MobEffects.CONDUIT_POWER);
}
public static List<ServerPlayer> addEffectToPlayersAround(
ServerLevel level, @Nullable Entity source, Vec3 pos, double radius, MobEffectInstance effect, int duration
) {
Holder<MobEffect> holder = effect.getEffect();
List<ServerPlayer> list = level.getPlayers(
serverPlayer -> serverPlayer.gameMode.isSurvival()
&& (source == null || !source.isAlliedTo(serverPlayer))
&& pos.closerThan(serverPlayer.position(), radius)
&& (
!serverPlayer.hasEffect(holder)
|| serverPlayer.getEffect(holder).getAmplifier() < effect.getAmplifier()
|| serverPlayer.getEffect(holder).endsWithin(duration - 1)
)
);
list.forEach(serverPlayer -> serverPlayer.addEffect(new MobEffectInstance(effect), source));
return list;
}
}