Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Как создать Глобальную Функцию (CreateNative)
Как создать Глобальную Функцию
_wS_ Дата: Понедельник, 23.04.2012, 21:10:10 | Сообщение # 1
CreateNative(const String:name[], NativeCall:func);

Позволяет создать функцию, которую можно вызвать из любого вашего SM скрипта.
Делать это нужно в событии AskPluginLoad2, ниже пример.

Создайте a.sp с таким содержимым, скомпилируйте и запустите скрипт:

Code
#include <sourcemod>

public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
     CreateNative("my_func", Native_my_func);
     CreateNative("my_bool_func", Native_my_bool_func);
     return APLRes_Success;
}

public Native_my_func(Handle:plugin, numParams) return GetNativeCell(1) + GetNativeCell(2);
public Native_my_bool_func(Handle:plugin, numParams) return GetNativeCell(1) > GetNativeCell(2);


Теперь создайте файл my_funtion.inc с таким содержимым и киньте его в
addons/sourcemod/scripting/include

Code
native my_func(num1, num2);
native bool:my_bool_func(num1, num2);


Создайте b.sp с таким содержимым, скомпилируйте и запустите скрипт:

Code
#include <sourcemod>
#include <my_funtion>

public OnPluginStart()
{
     PrintToServer("2 + 1 = %d", my_func(2, 1)); // 3
     PrintToServer("2 + 5 = %d", my_func(2, 5)); // 7
     PrintToServer("2 > 1 (%d)", my_bool_func(2, 1)); // 1
     PrintToServer("2 > 5 (%d)", my_bool_func(2, 5)); // 0
}


GetNativeCell(x) - возвращает целое число (x - номер аргумента в функции)

GetNativeString(x, String:buffer[], maxlength, &bytes=0);
Возвращает SP_ERROR_NONE, если строка получена, или любое целое число, если произошла ошибка.

GetNativeArray(x, any:local[], size);
Возвращает SP_ERROR_NONE, как и выше (так получаем массив)
 
Geny Дата: Суббота, 28.12.2013, 15:31:21 | Сообщение # 2
Сообщений: 111
Репутация: 0 [ +/- ]
Код
#include <sourcemod>

public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
      CreateNative("my_func", Native_my_func)
      return APLRes_Success;
}

public Native_my_func(Handle:plugin, numParams)  
{
         new LOL[3];
         for (new I = 0;I<3;I++) LOL[I] = 2014;
         return LOL;
}


Красит return LOL;.... почему нельзя так вернуть массив? в С++ можно. как тут быть?
 
_wS_ Дата: Суббота, 28.12.2013, 15:41:26 | Сообщение # 3
SetNativeArray
 
Geny Дата: Суббота, 28.12.2013, 16:17:13 | Сообщение # 4
Сообщений: 111
Репутация: 0 [ +/- ]
Вызываю глобальную функцию new Float:Pos_pr[3] = GetLookPos(client); красит... Как правильно вызвать функцию?
 
_wS_ Дата: Суббота, 28.12.2013, 16:32:05 | Сообщение # 5
Код
public Native_my_func(Handle:plugin, numParams)
{
     decl LOL[3];
     for (new I = 0; I < 3; I++) LOL[I] = 2014;
     SetNativeArray(1, LOL, 3);
}

///

decl info[3]; my_func(info);
PrintToServer("%d, %d, %d", info[0], info[1], info[2]);
 
Geny Дата: Пятница, 24.01.2014, 16:18:53 | Сообщение # 6
Сообщений: 111
Репутация: 0 [ +/- ]
А можно устроить так чтоб функция отправляла число типа int (new) а возвращала массив Float ?
 
Vitaminoz Дата: Понедельник, 24.02.2014, 21:17:15 | Сообщение # 7
Сообщений: 135
Репутация: 1 [ +/- ]
Есть кусок кода в скрипте A:
Код
public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
  CreateNative("Boss_Function", ZH_Boss_Hook);
  return APLRes_Success;
}

public ZH_Boss_Hook(Handle:plugin, numParams)
{
  return GetNativeCell(round_time + GetConVarInt(h_cvar_round_counts));
}

Создан файл zombie_horde.inc
Код
native ZH_Boss_Hook();

Кусок кода в скрипте B:
Код
#include <zombie_horde>
...
public RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
  if (ZH_Boss_Hook() + 1 || ZH_Boss_Hook() + 2)
  {
   boss_round = true;
  }
}

Проблема в том что консоль пишет что Native не обнаружен и выгружает скрипт B
 
_wS_ Дата: Понедельник, 24.02.2014, 21:31:59 | Сообщение # 8
Код
native Boss_Function();

#include <zombie_horde>  
...  
public RoundStart(Handle:event, const String:name[], bool:dontBroadcast)  
{  
     if (Boss_Function() ...
 
Vitaminoz Дата: Понедельник, 24.02.2014, 22:49:46 | Сообщение # 9
Сообщений: 135
Репутация: 1 [ +/- ]
Да все понял спасибо.

Добавлено (24.02.2014, 22:49:46)
---------------------------------------------
Не получается вообщем мне есть a.sp в нем есть Handle и int переменные int переменная при выгрыше CT на 1 пункт прибавляется ей название round_timer 2ая переменная Handle она отвечает за количество раундов и создает консольную переменную. я делал так:
Код
public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
CreateNative("BossRound_Hook", ZH_Boss_Hook);
CreateNative("Round_Hook", ZH_Round_Hook);
return APLRes_Success;
}

public ZH_Boss_Hook(Handle:plugin, numParams)
{
return GetConVarInt(h_cvar_round_counts) + 1;
}

public ZH_Round_Hook(Handle:plugin, numParams)
{
return round_time;
}

Нельзя ли это как то сделать по другому а то мне не совсем нравиться данный метод ...


Сообщение отредактировал Vitaminoz - Понедельник, 24.02.2014, 22:49:56
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Как создать Глобальную Функцию (CreateNative)
Страница 1 из 11
Поиск: