Загрузка данных
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;
// Конечная точка лучей (30 метров вперед)
Vector3 targetPos = eyePos + forwardVector * 30.0f;
// РИСУЕМ ТОЛСТЫЕ ЛАЗЕРЫ: Используем маркеры-цилиндры (тип 27), которые отлично работают в v2.10.3
// 255, 0, 0 — ярко-красный цвет, 220 — высокая плотность (будут толстыми и видимыми)
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, 30.0f, 0.3f, 255, 0, 0, 220, 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, 30.0f, 0.3f, 255, 0, 0, 220, false, false, 2, false, null, null, false);
// Безопасный перебор объектов в узком конусе перед игроком (вместо вылетающего нативного луча)
// Ищем людей в радиусе 30 метров
foreach (Ped ped in World.GetAllPeds())
{
if (ped.Exists() && ped != playerPed && ped.IsAlive)
{
// Если человек находится близко к траектории взгляда (в пределах узкого угла)
if (ped.Position.DistanceTo(eyePos) < 30.0f && IsEntityInFront(playerPed, ped))
{
Function.Call(Hash.START_ENTITY_FIRE, ped); // Мгновенный поджог пешехода
ped.Health -= 10; // Выжигание здоровья лазером
}
}
}
// Ищем машины в радиусе 30 метров
foreach (Vehicle veh in World.GetAllVehicles())
{
if (veh.Exists())
{
// Если машина находится перед игроком на линии взгляда
if (veh.Position.DistanceTo(eyePos) < 30.0f && IsEntityInFront(playerPed, veh))
{
Function.Call(Hash.START_ENTITY_FIRE, veh); // Поджигаем машину
Function.Call(Hash.SET_VEHICLE_DAMAGE, veh, veh.Position, 100.0f, 30.0f, true); // Наносим урон кузову/двигателю
}
}
}
}
}
// Вспомогательный метод для проверки, находится ли объект строго перед лицом игрока
private bool IsEntityInFront(Ped player, Entity target)
{
Vector3 dirToTarget = (target.Position - player.Position);
dirToTarget.Normalize();
// Считаем угол между направлением взгляда и направлением на цель
float dotProduct = Vector3.Dot(player.ForwardVector, dirToTarget);
// 0.97f — это узкий угол обзора, симулирующий точечный лазер из глаз
return dotProduct > 0.97f;
}
}