TheWildBackport/common/src/main/java/com/cursedcauldron/wildbackport/common/utils/MobUtils.java
2022-08-25 17:53:18 -04:00

42 lines
2.3 KiB
Java

package com.cursedcauldron.wildbackport.common.utils;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.behavior.PositionTracker;
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
import net.minecraft.world.entity.ai.memory.WalkTarget;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class MobUtils {
public static void addEffectToPlayersWithinDistance(ServerLevel level, @Nullable Entity entity, Vec3 position, double distance, MobEffectInstance instance, int duration) {
MobEffect mobeffect = instance.getEffect();
List<ServerPlayer> players = level.getPlayers(player -> player.gameMode.isSurvival() && (entity == null || !entity.isAlliedTo(player)) && position.closerThan(player.position(), distance) && (!player.hasEffect(mobeffect) || player.getEffect(mobeffect).getAmplifier() < instance.getAmplifier() || player.getEffect(mobeffect).getDuration() < duration));
players.forEach(player -> player.addEffect(new MobEffectInstance(instance), entity));
}
public static void walkTowards(LivingEntity entity, PositionTracker target, float speed, int closeEnough) {
WalkTarget walkTarget = new WalkTarget(target, speed, closeEnough);
entity.getBrain().setMemory(MemoryModuleType.LOOK_TARGET, target);
entity.getBrain().setMemory(MemoryModuleType.WALK_TARGET, walkTarget);
}
public static void give(LivingEntity entity, ItemStack stack, Vec3 target, Vec3 velocity, float yOffset) {
double y = entity.getEyeY() - (double)yOffset;
ItemEntity item = new ItemEntity(entity.level, entity.getX(), y, entity.getZ(), stack);
item.setThrower(entity.getUUID());
Vec3 distance = target.subtract(entity.position());
distance = distance.normalize().multiply(velocity.x, velocity.y, velocity.z);
item.setDeltaMovement(distance);
item.setDefaultPickUpDelay();
entity.level.addFreshEntity(item);
}
}