что если я размещу тут примеры скрипта для мода на сущность которая наблюдает а когда смотришь на нее она нападет на тебя то всем будет пофиг или найдутся люди которые сделают из это мод скрипт
public class EntityStalker extends Monster {
public static final EntityDataAccessor<Boolean> DATA_IS_AGGRO = SynchedEntityData.defineId(EntityStalker.class, EntityDataSerializers.BOOLEAN);
private int attackCooldown = 0;
public EntityStalker(EntityType<? extends Monster> type, Level worldIn) {
super(type, worldIn);
}
@Override
protected void defineSynchedData() {
super.defineSynchedData();
this.entityData.define(DATA_IS_AGGRO, false);
}
@Override
protected void registerGoals() {
this.goalSelector.addGoal(1, new LookAtPlayerGoal(this, Player.class, 8.0F)); // Смотрит на игрока
// Убери цели передвижения и атаки, чтобы он не бегал сам по себе
this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true));
}
@Override
public void tick() {
super.tick();
Player player = this.level.getNearestPlayer(this, 25.0); // Ищем игрока в радиусе 25 блоков
if (player != null) {
// Проверяем, смотрит ли игрок на существо
boolean playerIsLooking = isPlayerLookingAtMe(player);
// Если игрок смотрит и ещё не в режиме атаки
if (playerIsLooking && !this.entityData.get(DATA_IS_AGGRO)) {
this.entityData.set(DATA_IS_AGGRO, true); // Активируем режим атаки
this.attackCooldown = 40; // Устанавливаем задержку перед атакой (2 секунды, т.к. 20 тиков = 1 сек)
// Можно добавить звуковый эффект SCRECHE
}
// Логика атаки
if (this.entityData.get(DATA_IS_AGGRO)) {
this.getLookControl().setLookAt(player.getX(), player.getEyeY(), player.getZ());
if (this.attackCooldown > 0) {
this.attackCooldown--;
} else {
// Телепортация за спину игроку
teleportBehindPlayer(player);
// Атака
player.hurt(DamageSource.mobAttack(this), 5.0F); // Наносим 2.5 сердца урона
// Исчезаем или сбрасываем состояние
this.remove(RemovalReason.KILLED); // Просто удаляем существо
// Или сбрасываем агренье: this.entityData.set(DATA_IS_AGGRO, false);
}
}
}
}
// Самая важная функция: проверка, смотрит ли игрок на实体
private boolean isPlayerLookingAtMe(Player player) {
// 1. Получаем вектор взгляда игрока
Vec3 playerLookVec = player.getViewVector(1.0F).normalize();
// 2. Получаем вектор от глаз игрока к нашим глазам
Vec3 vecToStalker = new Vec3(this.getX() - player.getX(),
this.getEyeY() - player.getEyeY(),
this.getZ() - player.getZ());
double distanceToStalker = vecToStalker.length();
vecToStalker = vecToStalker.normalize(); // Нормализуем
// 3. Находим скалярное произведение двух векторов.
// Оно показывает, насколько вектора направлены в одну сторону.
// 1.0 = прямо, 0.0 = перпендикулярно, -1.0 = в противоположную
double dotProduct = playerLookVec.dot(vecToStalker);
// 4. Игрок смотрит на нас, если угол между векторами небольшой (скалярное произведение близко к 1)
// И игрок находится достаточно близко, чтобы нас заметить.
// 0.95 - это угол примерно в 18 градусов. Чем больше значение, тем уже "конус" взгляда.
return dotProduct > 0.95D && distanceToStalker < 25.0D;
}
private void teleportBehindPlayer(Player player) {
// Вычисляем точку позади игрока (на 2 блока сзади)
double angle = player.getYRot() * Math.PI / 180.0; // Переводим угол в радианы
double dx = -2 * Math.sin(angle); // Смещение по X
double dz = 2 * Math.cos(angle); // Смещение по Z
double newX = player.getX() + dx;
double newY = player.getY();
double newZ = player.getZ() + dz;
// Телепортируем существо
this.teleportTo(newX, newY, newZ);
}
}
все это нейронка