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