Загрузка данных
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);
}
}
}
}
}
}