Загрузка данных


using GTA;
using GTA.Native;
using System;
using System.Windows.Forms;

public class HomelanderMod : Script
{
    private bool isLaserActive = false;

    public HomelanderMod()
    {
        KeyDown += OnKeyDown;
        Tick += OnTick;
    }

    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        // Активация на английскую букву U
        if (e.KeyCode == Keys.U)
        {
            isLaserActive = !isLaserActive;

            if (isLaserActive)
            {
                UI.Notify("~r~Лазерный взгляд Хоумлендера включен!~s~");
            }
            else
            {
                UI.Notify("~g~Лазерный взгляд выключен.~s~");
            }
        }
    }

    private void OnTick(object sender, EventArgs e)
    {
        if (!isLaserActive) return;

        Ped playerPed = Game.Player.Character;

        if (playerPed.Exists() && playerPed.IsAlive)
        {
            // Делаем игрока бессмертным, чтобы он сам не взорвался от своих лазеров
            playerPed.IsInvincible = true;

            // Получаем координаты направления взгляда камеры игрока
            GameplayCamera.ClampPitch(-89.0f, 89.0f);
            Vector3 camCoord = GameplayCamera.Position;
            Vector3 camRot = GameplayCamera.Rotation;
            
            // Вычисляем точку впереди, куда смотрит игрок (дистанция 50 метров)
            float num = camRot.Z * 0.0174532924f;
            float num2 = camRot.X * 0.0174532924f;
            float num3 = Math.Abs((float)Math.Cos((double)num2));
            
            Vector3 targetPos = new Vector3();
            targetPos.X = camCoord.X - (float)Math.Sin((double)num) * num3 * 50f;
            targetPos.Y = camCoord.Y + (float)Math.Cos((double)num) * num3 * 50f;
            targetPos.Z = camCoord.Z + (float)Math.Sin((double)num2) * 50f;

            // Находим точку кастинга луча из глаз (чуть выше центра персонажа)
            Vector3 eyePos = playerPed.Position + playerPed.UpVector * 0.6f;

            // Рисуем два тонких красных лазерных луча из глаз персонажа к цели
            // (Смещение влево и вправо для симуляции двух глаз)
            Vector3 leftEye = eyePos - playerPed.RightVector * 0.1f;
            Vector3 rightEye = eyePos + playerPed.RightVector * 0.1f;

            Function.Call(Hash.DRAW_LINE, leftEye.X, leftEye.Y, leftEye.Z, targetPos.X, targetPos.Y, targetPos.Z, 255, 0, 0, 255);
            Function.Call(Hash.DRAW_LINE, rightEye.X, rightEye.Y, rightEye.Z, targetPos.X, targetPos.Y, targetPos.Z, 255, 0, 0, 255);

            // Трассировка луча: находим, во что упёрся взгляд (в машину, человека или землю)
            OutputArgument hitPosition = new OutputArgument();
            OutputArgument hitEntity = new OutputArgument();
            int raycast = Function.Call<int>(Hash._CAST_3D_RAY_POINT_TO_POINT, eyePos.X, eyePos.Y, eyePos.Z, targetPos.X, targetPos.Y, targetPos.Z, -1, playerPed, 7);
            
            bool hit = false;
            OutputArgument normal = new OutputArgument();
            Function.Call(Hash._GET_RAYCAST_RESULT, raycast, ref hit, hitPosition, normal, hitEntity);

            if (hit)
            {
                Vector3 finalImpactPoint = hitPosition.GetResult<Vector3>();

                // Создаем микро-взрывы лазерного типа (Bullet) в точке попадания
                // Тип взрыва 23 (BULLET) — он поджигает и наносит урон, но не создает кучу дыма
                Function.Call(Hash.ADD_EXPLOSION, finalImpactPoint.X, finalImpactPoint.Y, finalImpactPoint.Z, 23, 10.0f, true, false, 0.5f);

                // Дополнительно принудительно поджигаем зону вокруг точки удара
                Function.Call(Hash.START_SCRIPT_FIRE, finalImpactPoint.X, finalImpactPoint.Y, finalImpactPoint.Z, 1, true);
            }
        }
    }
}