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


using System;
using System.Windows.Forms;
using GTA;
using GTA.Math;
using GTA.Native;

public class CustomVehicleCamera : Script
{
    private Camera _carCamera;
    private float _heightOffset = 0.0f;
    private readonly float _heightStep = 0.05f; // Шаг изменения высоты
    private ScriptSettings _config;

    public CustomVehicleCamera()
    {
        // Загружаем настройки из файла (создастся автоматически)
        _config = ScriptSettings.Load("scripts\\CameraOffsets.ini");
        Tick += OnTick;
        KeyDown += OnKeyDown;
    }

    private void OnTick(object sender, EventArgs e)
    {
        var player = Game.Player.Character;
        var vehicle = player.CurrentVehicle;

        // Если игрок в машине и это не вид от первого лица
        if (vehicle != null && vehicle.IsAlive && !Game.IsPaused && !Function.Call<bool>(Hash.IS_GAMEPLAY_CAM_LOOKING_BEHIND))
        {
            if (_carCamera == null || !_carCamera.Exists())
            {
                _carCamera = World.CreateCamera(vehicle.Position, vehicle.Rotation, 60f);
                // Загружаем сохраненную высоту для этой модели (по умолчанию 0)
                string modelName = vehicle.Model.ToString();
                _heightOffset = _config.GetValue<float>("Offsets", modelName, 0.0f);
            }

            // Смещение: X = 0 (по центру), Y = -5 (сзади), Z = 2 + _heightOffset
            var offset = new Vector3(0f, -5f, 2f + _heightOffset);
            _carCamera.AttachTo(vehicle, offset);
            
            // Камера смотрит туда же, куда и машина
            _carCamera.Rotation = vehicle.Rotation; 

            World.RenderingCamera = _carCamera;
        }
        else
        {
            // Возврат к стандартной камере при выходе из машины
            if (_carCamera != null && _carCamera.Exists())
            {
                World.RenderingCamera = null;
                _carCamera.Delete();
                _carCamera = null;
            }
        }
    }

    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        var vehicle = Game.Player.Character.CurrentVehicle;
        if (vehicle == null) return;

        string modelName = vehicle.Model.ToString();

        if (e.KeyCode == Keys.NumPad8) // Поднять
        {
            _heightOffset += _heightStep;
            SaveOffset(modelName);
        }
        else if (e.KeyCode == Keys.NumPad2) // Опустить
        {
            _heightOffset -= _heightStep;
            SaveOffset(modelName);
        }
    }

    private void SaveOffset(string modelName)
    {
        _config.SetValue<float>("Offsets", modelName, _heightOffset);
        _config.Save();
        UI.ShowSubtitle($"~y~{modelName}~s~: Высота = {_heightOffset:F2}");
    }
}