Как создать Глобальную Функцию
|
|
_wS_
|
Дата: Понедельник, 23.04.2012, 21:10:10 | Сообщение # 1 |
|
CreateNative(const String:name[], NativeCall:func);
Позволяет создать функцию, которую можно вызвать из любого вашего SM скрипта. Делать это нужно в событии AskPluginLoad2, ниже пример.
Создайте a.sp с таким содержимым, скомпилируйте и запустите скрипт:
Код #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
Код native my_func(num1, num2); native bool:my_bool_func(num1, num2);
Создайте b.sp с таким содержимым, скомпилируйте и запустите скрипт:
Код #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 |
|
Сообщений: 110
Репутация: 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 |
|
Сообщений: 110
Репутация: 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 |
|
Сообщений: 110
Репутация: 0 [ +/- ]
|
|
А можно устроить так чтоб функция отправляла число типа int (new) а возвращала массив Float ?
|
|
| |
Vitaminoz
|
Дата: Понедельник, 24.02.2014, 21:17:15 | Сообщение # 7 |
|
Сообщений: 141
Репутация: 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 |
|
Сообщений: 141
Репутация: 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 |
|
| |