В данной статье мы расскажем, как вызывать нативные функции из C++ напрямую в вашем скрипте, применять их в качестве условий, а также использовать необработанные хэши функций. Этот материал предназначен для новичков, кто прежде не создавал скрипты для GTA 5, но уже знаком с синтаксисом языка C#.
Когда необходимо вызывать нативные функции напрямуюЕсли ScriptHookVDotNet не поддерживает функции, которые вы хотите использовать, их придется вызывать напрямую. Например, класс Vehicle в SHVDN в настоящее время не имеет свойства Radio, позволяющего изменять радиостанцию или включать/выключать радио.
Чтобы вызвать нативную функцию, используйте метод Function.Call(), передав в нем хэш-код и параметры. Найти информацию обо всех функциях GTA 5 можно в
базе от моддера alloc8or. На сегодняшний день она является самой подробной и актуальной.
Для примера возьмем функцию SET_VEHICLE_RADIO_ENABLED, которая принимает два параметра: хэндл транспортного средства и значение переключения радио.
Function.Call(Hash.SET_VEHICLE_RADIO_ENABLED, Game.Player.Character.CurrentVehicle, false);
Возвращение чего-либо из нативной функцииЕсли вы хотите вернуть что-то при вызове нативной функции, добавьте к Function.Call тип значения, который вы хотите вернуть, поместив тип внутри угловых скобок:
var test = Function.Call<int>(GTA.Native.Hash.CREATE_SYNCHRONIZED_SCENE, Game.Player.Character.Position.X, Game.Player.Character.Position.Y, Game.Player.Character.Position. - 1, 0, 0, 180, 2);
В данном примере нам нужно получить идентификатор синхронизированной сцены, поэтому мы привели Function.Call к значению int.
Аналогичные действия проводятся и с условным вызовом нативных функций:
if (!Function.Call<bool>(Hash.IS_PED_A_PLAYER, ped)
{
// Код сработает, если ped не является игроком
}
Необработанные хэш-значенияGTA 5 регулярно обновляется, и апдейты GTA Online привносят в игру новые нативные функции, которые можно использовать в том числе и в одиночной игре. Если в SHVDN нет нужной вам функции, её можно вызвать напрямую по её хэш-значению.
Function.Call((Hash)0x9A9D1BA639675CF1, "HeistIsland", true);
Данная функция загружает и выгружает остров Кайо-Перико. В базе нативных функций она числится как
SET_ISLAND_ENABLED, но в SHVDN её ещё не добавили.
А вот полный пример кода, который позволит вам оказаться на острове Кайо-Перико:
using System.Windows.Forms;
using GTA;
using GTA.Math;
using GTA.Native;
namespace CayoPericoLoad
{
public class Basics : Script
{
public Basics()
{
KeyUp += Basics_KeyUp;
}
private void Basics_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.NumPad1)
{
Function.Call((Hash)0x0888C3502DBBEEF5);
//void ON_ENTER_MP() // 0x0888C3502DBBEEF5 0xC65586A9 b323
Function.Call((Hash)0x9A9D1BA639675CF1, "HeistIsland", true);
//void SET_ISLAND_ENABLED(const char* name, BOOL toggle) // 0x9A9D1BA639675CF1 b2189
Function.Call((Hash)0xB96B00E976BE977F, 0.0f);
// _SET_CURRENT_INTENSITY OCEAN WAVES
GTA.UI.Screen.FadeOut(1000);//Game.FadeScreenOut(1000);
Wait(1000);
Function.Call(Hash.SET_ENTITY_COORDS, Game.Player.Character, 4840.571, -5174.425, 2.0, 0, 0, 1);
GTA.UI.Screen.FadeIn(1000);//Game.FadeScreenOut(1000);
}
}
}
}
На этом цикл вводных статей закончен. В следующий раз мы рассмотрим работу с внутриигровым интерфейсом и известными фреймворками к нему. Следите за выходом новых материалом в разделе
«Уроки по программированию».