Передача прав на handle в другой плагин (DataPack)

Banana

Участник
Сообщения
892
Реакции
113
C-подобный:
L 11/29/2019 - 02:54:42: [SM] Exception reported: Invalid data pack handle 22cb041e (error 5).
L 11/29/2019 - 02:54:42: [SM] Blaming: sg_questionmenu.smx
L 11/29/2019 - 02:54:42: [SM] Call stack trace:
L 11/29/2019 - 02:54:42: [SM]   [0] ResetPack
L 11/29/2019 - 02:54:42: [SM]   [1] Line 18, questionmenu.sp::StartQuestionMenu
L 11/29/2019 - 02:54:42: [SM]   [3] Call_Finish
L 11/29/2019 - 02:54:42: [SM]   [4] Line 110, games.sp::StartQuestionMenu
L 11/29/2019 - 02:54:42: [SM]   [5] Line 127, games.sp::sm_games

// В games.sp вызываем

C-подобный:
h_StartQuestionMenu = CreateGlobalForward("StartQuestionMenu", ET_Ignore, Param_Cell);

bool StartQuestionMenu()
{
    new Handle:b_pack = CreateDataPack();
    WritePackCell(b_pack, 1993);
    new Handle:hReturnPack = CloneHandle(b_pack, GetMyHandle());
    b_pack.Close();

    Call_StartForward(h_StartQuestionMenu);
    Call_PushCell(hReturnPack);
    Call_Finish(); // - ВОТ ЭТО 110
}

// В questionmenu.sp получаем
C-подобный:
public StartQuestionMenu(int hDataPack)
{
    new Handle:h_pack = view_as<DataPack>(hDataPack); // Получаем наш DataPack
    ResetPack(h_pack); // - ВОТ ЭТО 18 СТРОКА
    PrintToChatAll("%d", ReadPackCell(h_pack));
    CloseHandle(h_pack);
}


//127 СТРОКА это строка вызова.. там не может быть ошибки.
Мне нужно передать pack из games.sp через Forward в questionmenu.sp
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
new Handle:hReturnPack = CloneHandle(b_pack, GetMyHandle()); b_pack.Close();
а в чем суть сия действа если ты сделал владельцем плагин, который и так был владельцем?
public StartQuestionMenu(int hDataPack)
а зачем тут писать инт и потом приводить к типу если можно сразу указать что туда датапак приходит?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
и еще зачем закрывать датапак в StartQuestionMenu ?
 

Banana

Участник
Сообщения
892
Реакции
113
C-подобный:
void StartQuestionMenu()
{
    new Handle:b_pack = CreateDataPack();
    WritePackCell(b_pack, 1993);
   
    Call_StartForward(h_StartQuestionMenu);
    Call_PushCell(b_pack);
    Call_Finish();
}

C-подобный:
public StartQuestionMenu(Handle h_pack)
{
    ResetPack(h_pack);
    PrintToChatAll("%d", ReadPackCell(h_pack));
    //CloseHandle(h_pack);
}


L 11/29/2019 - 15:38:56: [SM] Exception reported: Invalid data pack handle 5d4e0d55 (error 5).
L 11/29/2019 - 15:38:56: [SM] Blaming: sg_questionmenu.smx
L 11/29/2019 - 15:38:56: [SM] Call stack trace:
L 11/29/2019 - 15:38:56: [SM] [0] ResetPack
L 11/29/2019 - 15:38:56: [SM] [1] Line 17, sg_questionmenu.sp::StartQuestionMenu
L 11/29/2019 - 15:38:56: [SM] [3] Call_Finish
L 11/29/2019 - 15:38:56: [SM] [4] Line 108, sg_games.sp::StartQuestionMenu
L 11/29/2019 - 15:38:56: [SM] [5] Line 125, sg_games.sp::sm_games


Ошибки те же( подскажите пожалуйста как правильно передавать паки\массивы\стирингмапы и т д..
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5
C-подобный:
void StartQuestionMenu()
{
    new Handle:b_pack = CreateDataPack();
    WritePackCell(b_pack, 1993);
  
    Call_StartForward(h_StartQuestionMenu);
    Call_PushCell(b_pack);
    Call_Finish();
}

C-подобный:
public StartQuestionMenu(Handle h_pack)
{
    ResetPack(h_pack);
    PrintToChatAll("%d", ReadPackCell(h_pack));
    //CloseHandle(h_pack);
}


L 11/29/2019 - 15:38:56: [SM] Exception reported: Invalid data pack handle 5d4e0d55 (error 5).
L 11/29/2019 - 15:38:56: [SM] Blaming: sg_questionmenu.smx
L 11/29/2019 - 15:38:56: [SM] Call stack trace:
L 11/29/2019 - 15:38:56: [SM] [0] ResetPack
L 11/29/2019 - 15:38:56: [SM] [1] Line 17, sg_questionmenu.sp::StartQuestionMenu
L 11/29/2019 - 15:38:56: [SM] [3] Call_Finish
L 11/29/2019 - 15:38:56: [SM] [4] Line 108, sg_games.sp::StartQuestionMenu
L 11/29/2019 - 15:38:56: [SM] [5] Line 125, sg_games.sp::sm_games


Ошибки те же( подскажите пожалуйста как правильно передавать паки\массивы\стирингмапы и т д..
а если поменять датапак на другой хендл, arraylist например?

по коду вроде всё норм. либо влияет что-то другое чего нет в этих кусочках

мне не нравится что обе ф-и одинаково называются. это не вызывает конфликтов?
 

Allen

love society
Сообщения
352
Реакции
274
  • Команда форума
  • #6
C-подобный:
void StartQuestionMenu()
{
    new Handle:b_pack = CreateDataPack();
    WritePackCell(b_pack, 1993);
 
    Call_StartForward(h_StartQuestionMenu);
    Call_PushCell(b_pack);
    Call_Finish();
}

C-подобный:
public StartQuestionMenu(Handle h_pack)
{
    ResetPack(h_pack);
    PrintToChatAll("%d", ReadPackCell(h_pack));
    //CloseHandle(h_pack);
}


L 11/29/2019 - 15:38:56: [SM] Exception reported: Invalid data pack handle 5d4e0d55 (error 5).
L 11/29/2019 - 15:38:56: [SM] Blaming: sg_questionmenu.smx
L 11/29/2019 - 15:38:56: [SM] Call stack trace:
L 11/29/2019 - 15:38:56: [SM] [0] ResetPack
L 11/29/2019 - 15:38:56: [SM] [1] Line 17, sg_questionmenu.sp::StartQuestionMenu
L 11/29/2019 - 15:38:56: [SM] [3] Call_Finish
L 11/29/2019 - 15:38:56: [SM] [4] Line 108, sg_games.sp::StartQuestionMenu
L 11/29/2019 - 15:38:56: [SM] [5] Line 125, sg_games.sp::sm_games


Ошибки те же( подскажите пожалуйста как правильно передавать паки\массивы\стирингмапы и т д..
C-подобный:
void StartQuestionMenu()
{
    DataPack hPack = new DataPack();
    hPack.WriteCell(1024);
  
    Call_StartForward(h_StartQuestionMenu);
    Call_PushCell(hPack);
    Call_Finish();
}

public void fwdStartQuestionMenu(any iData)
{
    DataPack hPack = view_as<DataPack>(iData);
    hPack.Reset();
    PrintToChatAll("%d", hPack.ReadCell());
    hPack.Close();
}
Можно весь код?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
C-подобный:
void StartQuestionMenu()
{
    DataPack hPack = new DataPack();
    hPack.WriteCell(1024);
 
    Call_StartForward(h_StartQuestionMenu);
    Call_PushCell(hPack);
    Call_Finish();
}

public void fwdStartQuestionMenu(any iData)
{
    DataPack hPack = view_as<DataPack>(iData);
    hPack.Reset();
    PrintToChatAll("%d", hPack.ReadCell());
    hPack.Close();
}
Можно весь код?
шо за бред?

C++:
void fwdStartQuestionMenu()
{
    DataPack hPack = new DataPack();
    hPack.WriteCell(1024);
 
    Call_StartForward(h_StartQuestionMenu);
    Call_PushCell(hPack);
    Call_Finish();

    hPack.Close();
}

public void OnStartQuestionMenu(DataPack hPack)
{
    hPack.Reset();
    PrintToChatAll("%d", hPack.ReadCell());
}
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #8
Ошибки те же( подскажите пожалуйста как правильно передавать паки\массивы\стирингмапы и т д..
Ответ: как и другие значения (cell)

Но нужно следить за их закрытием. Там могут быть разные подходы в зависимости от ситуации.
Например если в ядре хендл глобальный и он передается в модули то там их закрывать не нужно. Та и вообще в форвардах как правило хендлы не нужно закрывать т.к. он циклом по очереди вызывается во всех плагинах.

А вот с нативами уже от ситуации зависит.
 

Banana

Участник
Сообщения
892
Реакции
113
void fwdStartQuestionMenu() { DataPack hPack = new DataPack(); hPack.WriteCell(1024); Call_StartForward(h_StartQuestionMenu); Call_PushCell(hPack); Call_Finish(); hPack.Close(); } public void OnStartQuestionMenu(DataPack hPack) { hPack.Reset(); PrintToChatAll("%d", hPack.ReadCell()); }
ошибки в консоле нет но и вывода 1024 тоже нет..
Сообщения автоматически склеены:

Магия какая-то.. проверьте кто нибудь у себя.(
 
Последнее редактирование:

Banana

Участник
Сообщения
892
Реакции
113
так может ты больше кода скинешь?
Так нечего давать, я создал 2 тестовых плагина и пытаюсь получить нужный мне результат эти плагины только это и делают.

C-подобный:
h_StartQuestionMenu = CreateGlobalForward("OnStartQuestionMenu", ET_Ignore, Param_Cell);

void StartQuestionMenu()
{
    DataPack hPack = new DataPack();
    hPack.WriteCell(1024);
    
    Call_StartForward(h_StartQuestionMenu);
    Call_PushCell(hPack);
    Call_Finish();

    hPack.Close();
}

C-подобный:
public OnStartQuestionMenu(DataPack hPack)
{
    hPack.Reset();
    PrintToChatAll("%d", hPack.ReadCell());
}

C-подобный:
L 11/30/2019 - 00:43:38: [SM] Exception reported: Invalid data pack handle 35964ae4 (error 5).
L 11/30/2019 - 00:43:38: [SM] Blaming: sg_questionmenu.smx
L 11/30/2019 - 00:43:38: [SM] Call stack trace:
L 11/30/2019 - 00:43:38: [SM]   [0] DataPack.Reset
L 11/30/2019 - 00:43:38: [SM]   [1] Line 18, sg_questionmenu.sp::OnStartQuestionMenu
L 11/30/2019 - 00:43:38: [SM]   [3] Call_Finish
L 11/30/2019 - 00:43:38: [SM]   [4] Line 32, sg_games.sp::StartQuestionMenu
L 11/30/2019 - 00:43:38: [SM]   [5] Line 52, sg_games.sp::sm_games

Сил уже нет... не получается..
Сообщения автоматически склеены:

Отмечу что обычный INT передается отлично..

Call_StartForward(h_StartQuestionMenu);
Call_PushCell(1);
Call_Finish();

public OnStartQuestionMenu(int hPack)
{
PrintToChatAll("%d", hPack);
}


h_StartQuestionMenu = CreateGlobalForward("OnStartQuestionMenu", ET_Ignore, Param_Cell); - эта строка точно применима к передаче DataPack?
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #12
ну как минимум это не весь код, не ясно когда вызывается форвард
 

Banana

Участник
Сообщения
892
Реакции
113
C-подобный:
#include <sourcemod>

new Handle:h_StartQuestionMenu; 

public OnPluginStart()
{
    h_StartQuestionMenu = CreateGlobalForward("OnStartQuestionMenu", ET_Ignore, Param_Cell);
    RegConsoleCmd("sm_wasdasd", wasdasd);    
}

public Action:wasdasd(client, args)
{
    DataPack hPack = new DataPack();
    hPack.WriteCell(1024);
    
    Call_StartForward(h_StartQuestionMenu);
    Call_PushCell(hPack);
    Call_Finish();

    hPack.Close();
}

C-подобный:
#include <sourcemod>

public OnStartQuestionMenu(DataPack hPack)
{
    PrintToChatAll("***");
    hPack.Reset();
    PrintToChatAll("%d", hPack.ReadCell());
}
Сообщения автоматически склеены:

ну как минимум это не весь код, не ясно когда вызывается форвард
Полный код выше. L 11/30/2019 - 02:36:42: [SM] Exception reported: Invalid data pack handle 3d754b01 (error 5).
Сообщения автоматически склеены:

ну как минимум это не весь код, не ясно когда вызывается форвард
загляните пожалуйста, очень хочу разобраться
Сообщения автоматически склеены:

Если нельзя Передать DataPack то как передать другой массив данных например StringMap? (хотя по сути так же наверно..)
Сообщения автоматически склеены:

ArrayList - отлично передался.. и все сработало как надо.. вопрос с передаче DataPack остается открытым, тут уже спортивный интерес понять чем эти 2 Hanlde принципиально отличатся...
 
Последнее редактирование:

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,335
@Banana, я вот этот код у себя проверил на локальном сервере, всё работает (плагин использует свой же форвард).
C-подобный:
new Handle:fw;

forward TestForward(Handle:dp);

public OnPluginStart()
{
    fw = CreateGlobalForward("TestForward", ET_Ignore, Param_Cell);
    
    
    new Handle:dp = CreateDataPack();
    WritePackCell(dp, 1231);
    
    Call_StartForward(fw);
    Call_PushCell(dp);
    Call_Finish();
    
    CloseHandle(dp);
}

public TestForward(Handle:dp)
{
    ResetPack(dp);
    PrintToServer("%d", ReadPackCell(dp));
}

У вас этот код работает?
 

DarklSide

Участник
Сообщения
931
Реакции
468
@Banana, для совместного использования DataPack/Handle между плагинами - попробуйте клонировать его:

Например:
C-подобный:
public void OnStartQuestionMenu(DataPack hPack)
{
    PrintToChatAll("***");
    if (hPack != null)
    {
        PrintToChatAll("&&&");
        hPack = view_as<DataPack>(CloneHandle(hPack));
        if (hPack != null)
        {
            hPack.Reset();
            PrintToChatAll("%d", hPack.ReadCell());
            hPack.Close();
        }
    }
}
P.S.: Не забывайте в вызывающем закрывать клонированный Handle, так же и из вызываемого, если переданный не глобальный.
 
Последнее редактирование:
Сверху Снизу