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


using GTA;
using GTA.Math;
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)
    {
        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;

            // Получаем точный вектор направления, куда повернута голова/тело персонажа
            Vector3 forwardVector = playerPed.ForwardVector;

            // Находим реальную позицию глаз персонажа
            Vector3 eyePos = playerPed.Position + playerPed.UpVector * 0.62f;
            Vector3 leftEye = eyePos - playerPed.RightVector * 0.1f;
            Vector3 rightEye = eyePos + playerPed.RightVector * 0.1f;

            // Точка, куда бьет луч (на расстоянии 35 метров по направлению лица)
            Vector3 targetPos = eyePos + forwardVector * 35.0f;

            // РИСУЕМ ТОЛСТЫЕ ЛАЗЕРЫ: Используем маркеры-цилиндры (тип 27) от глаз к цели
            // Параметры 255, 0, 0 отвечают за сочный красный цвет
            Function.Call(Hash.DRAW_MARKER, 27, leftEye.X, leftEye.Y, leftEye.Z, forwardVector.X, forwardVector.Y, forwardVector.Z, 0.0f, 0.0f, 0.0f, 0.3f, 35.0f, 0.3f, 255, 0, 0, 200, false, false, 2, false, null, null, false);
            Function.Call(Hash.DRAW_MARKER, 27, rightEye.X, rightEye.Y, rightEye.Z, forwardVector.X, forwardVector.Y, forwardVector.Z, 0.0f, 0.0f, 0.0f, 0.3f, 35.0f, 0.3f, 255, 0, 0, 200, false, false, 2, false, null, null, false);

            // Трассировка луча для поиска целей (людей или машин) по направлению взгляда головы
            OutputArgument hitPosition = new OutputArgument();
            OutputArgument hitEntity = new OutputArgument();
            OutputArgument normal = new OutputArgument();
            bool hit = false;

            // Флаг 6 означает искать только пешеходов (Peds) и транспорт (Vehicles), игнорируя карту/землю
            int raycast = Function.Call<int>(Hash._CAST_3D_RAY_POINT_TO_POINT, eyePos.X, eyePos.Y, eyePos.Z, targetPos.X, targetPos.Y, targetPos.Z, 6, playerPed, 7);
            Function.Call(Hash._GET_RAYCAST_RESULT, raycast, ref hit, hitPosition, normal, hitEntity);

            if (hit)
            {
                // Получаем объект, в который попал лазер
                Entity targetEntity = hitEntity.GetResult<Entity>();

                if (targetEntity.Exists() && targetEntity != playerPed)
                {
                    // Проверяем: если это человек
                    if (Function.Call<bool>(Hash.IS_ENTITY_AN_PED, targetEntity))
                    {
                        Ped targetPed = new Ped(targetEntity.Handle);
                        if (targetPed.IsAlive)
                        {
                            Function.Call(Hash.START_ENTITY_FIRE, targetPed); // Мгновенный поджог тела
                            targetPed.Health -= 15; // Быстрое выжигание здоровья
                        }
                    }
                    // Проверяем: если это машина
                    else if (Function.Call<bool>(Hash.IS_ENTITY_AN_VEHICLE, targetEntity))
                    {
                        Vehicle targetVehicle = new Vehicle(targetEntity.Handle);
                        Function.Call(Hash.START_ENTITY_FIRE, targetVehicle); // Поджигаем машину
                        
                        // Если долго жарить лазером машину, она взрывается от повреждений двигателя
                        Function.Call(Hash.SET_VEHICLE_DAMAGE, targetVehicle, targetVehicle.Position, 150.0f, 50.0f, true);
                    }
                }
            }
        }
    }
}