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


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

public class ATrainMod : Script
{
    // Переменная, которая хранит статус: включен мод или выключен
    private bool isATrainModeActive = false;

    public ATrainMod()
    {
        // Подключаем отслеживание нажатия кнопок и постоянное обновление кадров
        KeyDown += OnKeyDown;
        Tick += OnTick;
    }

    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        // Проверяем нажатие английской клавиши U
        if (e.KeyCode == Keys.U)
        {
            isATrainModeActive = !isATrainModeActive;

            if (isATrainModeActive)
            {
                UI.Notify("~b~Режим Поезда-А (A-Train) активирован!~s~");
            }
            else
            {
                UI.Notify("~r~Режим Поезда-А выключен.~s~");
                // Сбрасываем множитель скорости пешком до стандартного (1.0)
                Game.Player.SetRunSprintMultiplierForPlayer(1.0f);
            }
        }
    }

    private void OnTick(object sender, EventArgs e)
    {
        // Если мод не активирован кнопкой, ничего не делаем
        if (!isATrainModeActive) return;

        Ped playerPed = Game.Player.Character;

        // Проверяем, что игрок жив и бежит/спринтует
        if (playerPed.IsAlive && (playerPed.IsRunning || playerPed.IsSprinting))
        {
            // Увеличиваем скорость передвижения игрока (максимально допустимое значение движка — 1.49f)
            Game.Player.SetRunSprintMultiplierForPlayer(1.49f);

            // Дополнительно ускоряем игрока физическим импульсом вперед, чтобы бег был по-настоящему безумным
            playerPed.ApplyForce(playerPed.ForwardVector * 3.5f);

            // Создаем визуальный эффект искажения воздуха/скорости вокруг игрока
            Function.Call(Hash.REQUEST_NAMED_PTFX_ASSET, "core");
            if (Function.Call<bool>(Hash.HAS_NAMED_PTFX_ASSET_LOADED, "core"))
            {
                Function.Call(Hash._SET_PTFX_ASSET_NEXT_CALL, "core");
                Function.Call(Hash.START_PARTICLE_EFFECT_NON_LOOPED_ON_ENTITY, 
                    "ent_anim_dust_kickup", playerPed, 0f, 0f, 0f, 0f, 0f, 0f, 1.5f, false, false, false);
            }

            // Находим всех людей вокруг на расстоянии 3.5 метров
            Ped[] nearbyPeds = World.GetNearbyPeds(playerPed.Position, 3.5f);

            foreach (Ped ped in nearbyPeds)
            {
                // Не трогаем самого себя и проверяем, что пешеход жив
                if (ped != playerPed && ped.IsAlive)
                {
                    // Включаем пешеходу рэгдолл (физику падения), чтобы он не стоял на анимации
                    ped.CanRagdoll = true;
                    Function.Call(Hash.SET_PED_TO_RAGDOLL, ped, 5000, 5000, 0, true, true, false);

                    // С силой толкаем пешехода по направлению нашего бега и немного вверх
                    ped.ApplyForce(playerPed.ForwardVector * 45.0f + playerPed.UpVector * 15.0f);

                    // Наносим большой урон пешеходу от столкновения
                    ped.Health -= 150;

                    // Спавним искры и эффект сильного удара в месте столкновения
                    Function.Call(Hash._SET_PTFX_ASSET_NEXT_CALL, "core");
                    Function.Call(Hash.START_PARTICLE_EFFECT_NON_LOOPED_AT_COORD, 
                        "ent_sht_blood", ped.Position.X, ped.Position.Y, ped.Position.Z, 0f, 0f, 0f, 2.0f, false, false, false);
                }
            }
        }
    }
}