using System;
using System.Windows.Forms;
using GTA;
using GTA.Math;
using GTA.Native;
public class SedanCabinCamera : Script
{
private Camera _carCamera;
private float _heightOffset = 1.2f;
private bool _wasInCar = false;
public SedanCabinCamera()
{
KeyDown += OnKeyDown;
Tick += OnTick;
// Проверка: загрузился ли скрипт вообще
UI.Notify("~g~Скрипт камеры успешно загружен!");
}
private void OnTick(object sender, EventArgs e)
{
var vehicle = Game.Player.Character.CurrentVehicle;
if (vehicle == null)
{
RemoveCamera();
_wasInCar = false;
return;
}
bool isTarget = (vehicle.Model.Hash == Game.GenerateHash("jzx100") ||
vehicle.Model.Hash == Game.GenerateHash("mk2100"));
if (!isTarget)
{
RemoveCamera();
_wasInCar = false;
return;
}
// Если мы сели в нужную машину, показываем уведомление ОДИН раз
if (!_wasInCar)
{
UI.Notify($"~b~Обнаружена машина: {vehicle.Model.ToString()}");
_wasInCar = true;
}
if (Function.Call<int>(Hash.GET_FOLLOW_VEHICLE_CAM_VIEW_MODE) == 4)
{
RemoveCamera();
return;
}
if (_carCamera == null || !_carCamera.Exists())
{
_carCamera = World.CreateCamera(vehicle.Position, vehicle.Rotation, 60f);
}
_carCamera.AttachTo(vehicle, new Vector3(0f, -3.5f, _heightOffset));
_carCamera.Rotation = vehicle.Rotation;
World.RenderingCamera = _carCamera;
// Принудительно говорим игре использовать скриптовую камеру
Function.Call(Hash.RENDER_SCRIPT_CAMS, true, false, 0, true, false);
}
private void OnKeyDown(object sender, KeyEventArgs e)
{
var vehicle = Game.Player.Character.CurrentVehicle;
if (vehicle == null) return;
bool isTarget = (vehicle.Model.Hash == Game.GenerateHash("jzx100") ||
vehicle.Model.Hash == Game.GenerateHash("mk2100"));
if (!isTarget) return;
if (e.KeyCode == Keys.NumPad9)
{
_heightOffset += 0.05f;
UI.Notify($"~g~Высота: {_heightOffset:F2}");
}
else if (e.KeyCode == Keys.NumPad3)
{
_heightOffset -= 0.05f;
UI.Notify($"~y~Высота: {_heightOffset:F2}");
}
}
private void RemoveCamera()
{
if (_carCamera != null && _carCamera.Exists())
{
World.RenderingCamera = null;
// Выключаем принудительную скриптовую камеру
Function.Call(Hash.RENDER_SCRIPT_CAMS, false, false, 0, true, false);
_carCamera.Delete();
_carCamera = null;
}
}
}