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


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

public class ATrainMod : Script
{
    private bool isATrainModeActive = false;
    private int nextTickTime = 0;

    public ATrainMod()
    {
        KeyDown += OnKeyDown;
        Tick += OnTick;
    }

    private void OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.U)
        {
            isATrainModeActive = !isATrainModeActive;

            if (isATrainModeActive)
            {
                UI.Notify("~b~Режим Поезда-А активирован!~s~");
            }
            else
            {
                UI.Notify("~r~Режим Поезда-А выключен.~s~");
                Function.Call(Hash.SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER, Game.Player, 1.0f);
            }
        }
    }

    private void OnTick(object sender, EventArgs e)
    {
        if (!isATrainModeActive) return;

        Ped playerPed = Game.Player.Character;

        if (playerPed.Exists() && playerPed.IsAlive && (playerPed.IsRunning || playerPed.IsSprinting))
        {
            // Стабильное ускорение без перегрузки физического движка
            Function.Call(Hash.SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER, Game.Player, 1.49f);
            
            // Плавное подталкивание вместо жесткого удара по памяти
            playerPed.Velocity += playerPed.ForwardVector * 0.5f;

            // Ограничиваем частоту проверок столкновений (раз в 30 миллисекунд), чтобы избежать краша "written"
            if (Game.GameTime < nextTickTime) return;
            nextTickTime = Game.GameTime + 30;

            // Создаем легкий визуальный эффект скорости
            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)0x0C53BA701D97D3EB, "ent_anim_dust_kickup", playerPed, 0f, 0f, 0f, 0f, 0f, 0f, 1.2f, false, false, false);
            }

            // Перебираем всех существующих пешеходов через пул игры (это намного стабильнее на старых патчах)
            foreach (Ped ped in World.GetAllPeds())
            {
                if (ped.Exists() && ped != playerPed && ped.IsAlive)
                {
                    // Проверяем дистанцию до человека (в пределах 3 метров)
                    if (playerPed.Position.DistanceTo(ped.Position) < 3.0f)
                    {
                        // Включаем физику падения
                        ped.CanRagdoll = true;
                        Function.Call(Hash.SET_PED_TO_RAGDOLL, ped, 4000, 4000, 0, true, true, false);

                        // Отбрасываем пешехода в сторону бега
                        ped.Velocity = playerPed.ForwardVector * 35.0f + playerPed.UpVector * 10.0f;

                        // Наносим критический урон
                        ped.Health -= 160;

                        // Эффект крови в точке удара
                        Function.Call(Hash._SET_PTFX_ASSET_NEXT_CALL, "core");
                        Function.Call((Hash)0xBB9090358E8FBA8B, "ent_sht_blood", ped.Position.X, ped.Position.Y, ped.Position.Z, 0f, 0f, 0f, 1.5f, false, false, false);
                    }
                }
            }
        }
    }
}