Вызов функции по указателю в SM

Banana

Участник
Сообщения
892
Реакции
113
Здравствуйте, есть функция FSelectMenu в эту функцию можно попасть через FFirst или через FSecond, в FSelectMenu мне нужно вызывать ту функцию из которой была вызвана FSelectMenu. Получается некая рекурсия. Подскажите как это сделать? как вызвать функцию по ее указателю или не зная ее названия?

C-подобный:
int IdFunction[2];

void FFirst(int client, int item)
{
  FSelectMenu(client);
}

void FSecond(int client, int item)
{
    FSelectMenu(client);
}

void FSelectMenu(int client)
{
    int item = 256;

    //Тут нужно вызвать родительскую функцию и передать в нее (client, item)
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #2
Call_StartFunction() + по стеку ходить + функции родительские все пабликом должны быть помечены
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Banana, нафига?
Проще же сделать функцию FSelectMenu() не void.
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Не понимаю, что вы там курите, но...
C-подобный:
#pragma newdecls required

public void OnPluginStart() {
    A(1, 0);
}

public void A(int a, int b) {
    C(a, "A");
}

public void B(int a, int b) {
    C(a, "B");
}

void C(int a, const char[] func = NULL_STRING) {
    int item = 256;

    Handle me = GetMyHandle();

    Function caller = GetFunctionByName(me, func);
    if(caller == INVALID_FUNCTION) {
        return;
    }

    Call_StartFunction(me, caller);
    Call_PushCell(a);
    Call_PushCell(item);
    Call_Finish();
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #5
@nyood, тогда нам нужно передавать имя функции. А что если мы её переименуем? Нужно везде обновлять.
По стеку вверх пройтись - самое то. Либо, если уж использовать твоё решение, то передавать не строку, а сразу реф.

И зачем получать хендл плагина - непонятно.
 

Banana

Участник
Сообщения
892
Реакции
113
@nyood, тогда нам нужно передавать имя функции. А что если мы её переименуем? Нужно везде обновлять.
По стеку вверх пройтись - самое то. Либо, если уж использовать твоё решение, то передавать не строку, а сразу реф.

И зачем получать хендл плагина - непонятно.
Если вас не затруднит киньте пример пожалуйста, а то так до меня не доходит((
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Если вас не затруднит киньте пример пожалуйста, а то так до меня не доходит((
Речь про FrameIterator · sourcemod · SourceMod Scripting API Reference и замену типа параметра, в случае, если использовать код выше.
C-подобный:
void C(int a, const char[] func = NULL_STRING) {}

// ->

void A(int a, int b) { C(a, A); }
void C(int a, Function func = INVALID_FUNCTION) {}
 
Последнее редактирование:

Banana

Участник
Сообщения
892
Реакции
113
Подскажите а

PopStackArray​

с Char (String) работает?

char crurrentpathvalues[2][75] = {"123", "321"};
PushStackArray(path[client], crurrentpathvalues, 2);

Нет сейчас возможности скомпилить и попробовать к сожалению но знать очень нужно.
 
Сверху Снизу