Как задать аргументы нативу при вызове его через функцию, а не API?

iLoco

А печеньки будут :?
Меценат
Сообщения
2,039
Реакции
1,020
Интересует вопрос, как можно задать аргументы в натив при вызове его через этот код
C-подобный:
public void OnPluginStart()
{
    CreateNative("MC_TEST", Native_MC_TEST);

    Handle plugin = GetMyHandle();

    Call_StartFunction(plugin, GetFunctionByName(plugin, "Native_MC_TEST"));
    Call_PushCell(156316546);
    Call_PushCell(1);
    Call_Finish();
}
public int Native_MC_TEST(Handle plugin, int numParams)
{
    PrintToServer("Handle '%i' %i, %i", plugin, numParams, GetNativeCell(1));
}

`GetNativeCell` вызывает ошибку из-за отсуствия аргументов
C-подобный:
L 03/17/2021 - 17:22:42: [SM] Exception reported: Not called from inside a native function
L 03/17/2021 - 17:22:42: [SM] Blaming: test3.smx
L 03/17/2021 - 17:22:42: [SM] Call stack trace:
L 03/17/2021 - 17:22:42: [SM]   [0] GetNativeCell
L 03/17/2021 - 17:22:42: [SM]   [1] Line 18, C:\Users\admin\Desktop\scripting\test3.sp::Native_MC_TEST
L 03/17/2021 - 17:22:42: [SM]   [3] Call_Finish
L 03/17/2021 - 17:22:42: [SM]   [4] Line 13, C:\Users\admin\Desktop\scripting\test3.sp::OnPluginStart

То-есть, нужно вызвать натив из плагина А плагином Б, и указать Handle плагина С, что бы на него все данные записывались (привязка по Handle плагина). Если конкретней, то нужно зарегать предметы в шоп/вип одним плагином, что бы он контролировал это, а вся логика будет в другом. (MC Core)

1615996756326.png
 
Последнее редактирование:

Grey83

Ленивая и невнимательная жопа
Сообщения
4,827
Реакции
2,837
@iLoco, можно как вариант в нативе вызывать функцию, которой натив будет передавать параметры.
Ну и потом из другого места вызывать эту функцию со своими параметрами.
 

iLoco

А печеньки будут :?
Меценат
Сообщения
2,039
Реакции
1,020
@iLoco, можно как вариант в нативе вызывать функцию, которой натив будет передавать параметры.
Ну и потом из другого места вызывать эту функцию со своими параметрами.
Как вариант можно, но, в лучшем случае мне нужно что бы было управление в стороне, в другом плагине. Потому что моему замыслу это не очень подходит, да, можно юзать, но уже не то будет...

C-подобный:
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{   
    CreateNative("MC_TEST", Native_MC_TEST);

    prf = new PrivateForward(ET_Ignore, Param_Cell);
    prf.AddFunction(myself, GetFunctionByName(myself, "Native_MC_Call"));

    RegPluginLibrary("test");
    return APLRes_Success;
}

public void OnPluginStart()
{
    Call_StartForward(prf);
    Call_PushCell(55);
    Call_Finish();
}

public int Native_MC_Call(int param)
{
    MC_TEST(param);
}

public int Native_MC_TEST(Handle plugin, int numParams)
{
    PrintToServer("plugin %i", plugin);
    PrintToServer("numParams %i", numParams);
    PrintToServer("GetNativeCell %i", GetNativeCell(1));
}
1615998658669.png
 

Grey83

Ленивая и невнимательная жопа
Сообщения
4,827
Реакции
2,837
@iLoco, я не понял чего ты в результате хочешь добиться
 

Kruzya

Raspberry Pi 4
Команда форума
Меценат
Сообщения
10,550
Реакции
8,726
Так просто вызвать натив так, как надо, не выйдет. Тут нужно писать расширение для SM, и не факт, что нужное апи там вообще есть.
 

iLoco

А печеньки будут :?
Меценат
Сообщения
2,039
Реакции
1,020
@iLoco, я не понял чего ты в результате хочешь добиться
я щас пишут ядро Multi-Core (MC Core), в задумке у меня стоит такой план, который подразумевает собой управление всей составляющей в ядре, это регистрация предмета в шопе/випке/других ядрах данных его модулей, модули в свою очередь несут ТОЛЬКО физическую составляющую (работа с ентами), привязывается модуль только к Multi-Core ядру и регает себя в нём, в другие ядра не лезят модули, потому что вся логика в ядре Multi-Core будет.

Вот поэтому я и ищу способ как можно регать предметы в шопе от имени друго-го плагина. Потому что нету в шопе натива по выгрузке предмета по его иду (я сделаю пулл на этот счёт, что бы костыль убрать этот что щас ищу). По сути можно просто делать в ядре Shop_UnRegme и заного потом регать всё, но это нагрузка лишняя будет.


Щас подумал, что в этом нету особо большого смысла, так как обратные вызова на отображение предмета и тд будут то приходить по Handle плагина на которые зареган предмет, так что всё-ровно костыли писать прийдёться...


Пойду пулл писать на добавление этого натива. А пока что обойдусь костылями
 
Последнее редактирование:

nyood

e-val
Сообщения
1,119
Реакции
750
Как вариант можно, но, в лучшем случае мне нужно что бы было управление в стороне, в другом плагине. Потому что моему замыслу это не очень подходит, да, можно юзать, но уже не то будет...

C-подобный:
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{  
    CreateNative("MC_TEST", Native_MC_TEST);

    prf = new PrivateForward(ET_Ignore, Param_Cell);
    prf.AddFunction(myself, GetFunctionByName(myself, "Native_MC_Call"));

    RegPluginLibrary("test");
    return APLRes_Success;
}

public void OnPluginStart()
{
    Call_StartForward(prf);
    Call_PushCell(55);
    Call_Finish();
}

public int Native_MC_Call(int param)
{
    MC_TEST(param);
}

public int Native_MC_TEST(Handle plugin, int numParams)
{
    PrintToServer("plugin %i", plugin);
    PrintToServer("numParams %i", numParams);
    PrintToServer("GetNativeCell %i", GetNativeCell(1));
}
Посмотреть вложение 74195
Объявить прототип функции необходимо, тоже самое происходит и при подключении инклюдов...
Ровным счетом, как и регистрация нативов и форвардов должна происходить в AskPluginLoad2()

C-подобный:
#pragma newdecls required

native void TEST_N(int arg1, int arg2);

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    CreateNative("TEST_N", Native_N);
    RegPluginLibrary("test_N");

    return APLRes_Success;
}

public void OnPluginStart()
{
    TEST_N(1,2);
}

public int Native_N(Handle hCaller, int args)
{
    LogMessage("Sum: %d", GetNativeCell(1) + GetNativeCell(2));  // output: 3
    return 1;
}
 

iLoco

А печеньки будут :?
Меценат
Сообщения
2,039
Реакции
1,020
Объявить прототип функции необходимо, тоже самое происходит и при подключении инклюдов...
Ровным счетом, как и регистрация нативов и форвардов должна происходить в AskPluginLoad2()

C-подобный:
#pragma newdecls required

native void TEST_N(int arg1, int arg2);

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    CreateNative("TEST_N", Native_N);
    RegPluginLibrary("test_N");

    return APLRes_Success;
}

public void OnPluginStart()
{
    TEST_N(1,2);
}

public int Native_N(Handle hCaller, int args)
{
    LogMessage("Sum: %d", GetNativeCell(1) + GetNativeCell(2));  // output: 3
    return 1;
}
и каким образом тут подменить hCaller на другой?
 

iLoco

А печеньки будут :?
Меценат
Сообщения
2,039
Реакции
1,020
Последнее редактирование:

Grey83

Ленивая и невнимательная жопа
Сообщения
4,827
Реакции
2,837
@iLoco, ты хочешь посылать Handle ядра при использовании натива этого самого ядра?
C-подобный:
public int Native_MC_TEST(Handle plugin, int numParams)
{
    PrintToServer("plugin %i", GetMyHandle());
    PrintToServer("numParams %i", numParams);
    PrintToServer("GetNativeCell %i", GetNativeCell(1));
}
 

iLoco

А печеньки будут :?
Меценат
Сообщения
2,039
Реакции
1,020
@iLoco, ты хочешь посылать Handle ядра при использовании натива этого самого ядра?
C-подобный:
public int Native_MC_TEST(Handle plugin, int numParams)
{
    PrintToServer("plugin %i", GetMyHandle());
    PrintToServer("numParams %i", numParams);
    PrintToServer("GetNativeCell %i", GetNativeCell(1));
}
нет, я хочу из плагина (ядро) А посылать вызов на натив регастрации предмета в шопе, при этом послать Handle плагина Б, а не свой. И в плагине Б не задействовать инклюд шопа (обязательное условие)
 
Сверху