Перейти к содержанию
Если у вас техническая проблема с модом или их сборкой, то создавайте тему в разделе "Технические проблемы".
В разделе "Моды" запрещено набирать игроков на свой сервер и искать друзей для игры.

я тут подумал а что если


k23515

Рекомендуемые сообщения

В теме 3 сообщения

что если я размещу тут примеры скрипта для мода на сущность которая наблюдает а когда смотришь на нее она нападет на тебя то всем будет пофиг или найдутся люди которые сделают из это мод скрипт

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);
    }
}

 

 

 

все это нейронка

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...