Получение данных из натива

Статус
В этой теме нельзя размещать новые ответы.

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
Возник немного трудноватый для меня вопрос, и дабы не колдовать и не танцевать с бубном в поисках решения, пишу сюда.

имеется структура:
Код:
enum _: block_info_struct   {
    block_data,
    block_expired,

    block_map[32],
    block_attacker[info_admin_struct],
    block_reason[MAX_REASON_LENGTH],

    info_types_struct: block_type
};
Необходимо из натива получать только необходимый мне параметр, но с реализацией проблемы, не откажусь от малейшего примера или подсказки

Пока на этом мой мозг дальше не идет:
Код:
public plugin_natives() {
    register_native("gag_get_user_data", "__get_user_data", 0);
}

public __get_user_data(pluginInfo, argInfo) {
    enum  {
        arg_id = 1,
        arg_data,
        arg_expired,
        arg_map,
        arg_attacker,
        arg_reason,
        info_types_struct: arg_block_type
    };

    new id = get_param(arg_id);

    if (!is_user_connected(id))
        return -1;
}
Не мастер объяснений, желаемый результат примерно таков:


Код:
native gag_get_user_data(id, ...);

some_func(id)    {
    new expired;
    gag_get_user_data(id, expired);

    //some code
}
 
Последнее редактирование:

georgeml

Скриптер
Постоялец
Регистрация
12 Сен 2017
Сообщения
595
Симпатии
314
C++:
enum _: block_info_struct   {
    block_data,
    block_expired,

    block_map[32],
    block_attacker[info_admin_struct],
    block_reason[MAX_REASON_LENGTH],

    info_types_struct: block_type
};

public plugin_natives() {
    register_native("gag_get_user_data", "__get_user_data", 0);
}

public __get_user_data()
{
    enum
    {
        arg_id = 1,
        arg_identifier,
        arg_data,
        arg_datalen,
    };
    
    new id = get_param(arg_id);
    
    if (!is_user_connected(id))
        return -1;
    
    new aBlockStruct[block_info_struct];
    ...
    ... set aBlockStruct data
    
    new iLen = get_param(arg_datalen);
    if(iLen)
        return set_string(arg_data, aBlockStruct[arg_identifier], iLen);
    
    return aBlockStruct[arg_identifier];
}
 

georgeml

Скриптер
Постоялец
Регистрация
12 Сен 2017
Сообщения
595
Симпатии
314
ах да.. забыл
C++:
native    gag_get_user_data(iClient, iIdentifier, szData[] = "", iDataLen = 0);
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
ах да.. забыл
C++:
native    gag_get_user_data(iClient, iIdentifier, szData[] = "", iDataLen = 0);
Тут я догадался синтаксис, спасибо большое, дома буду проверю отпишу, тему прошу пока не закрывать
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
georgeml, В общем, непонятно пока что:

Код:
#include <amxmodx>
#include <reapi>

const type_none        = -1;
const type_chat        = (1<<0);
const type_voice       = (1<<1);

const MAX_REASON_LENGTH = 32;

enum _: block_info_struct   {
    block_data,
    block_expired,

    block_map[32],
    block_admin_name[MAX_NAME_LENGTH],
    block_admin_steam[MAX_AUTHID_LENGTH],
    block_reason[MAX_REASON_LENGTH],

    block_type
};

enum _: forwards_struct {
    fwd_onblock_pre,
    fwd_onblock_post,
    fwd_unblock_pre,
    fwd_unblock_post,
    fwd_return_value
};

new g_blockedData[MAX_PLAYERS + 1][block_info_struct];
new g_forwardsData[forwards_struct];

public plugin_init()    {
    register_plugin("Gag system", "1.0.0", "cpctrl");

    register_clcmd("say /t", "clcmd_test");

    //register_menucmd(register_menuid("Blockmenu Players"), 1023, "Handle_MenuPlayers");

    g_forwardsData[fwd_onblock_pre] = CreateMultiForward("gag_onblocked_pre", ET_STOP, FP_CELL);
    g_forwardsData[fwd_onblock_post] = CreateMultiForward("gag_onblocked_post", ET_CONTINUE, FP_CELL);

    g_forwardsData[fwd_unblock_pre] = CreateMultiForward("gag_unblocked_pre", ET_STOP, FP_CELL);
    g_forwardsData[fwd_unblock_post] = CreateMultiForward("gag_ounblocked_post", ET_CONTINUE, FP_CELL);
}

public clcmd_test(id)   {
    new mapname[32];
    get_mapname(mapname, charsmax(mapname));

    g_blockedData[id][block_data] = get_systime();
    g_blockedData[id][block_expired] = get_systime()+120;

    formatex(g_blockedData[id][block_map], charsmax(g_blockedData[][]), mapname);

    formatex(g_blockedData[id][block_admin_name], charsmax(g_blockedData[][]), "TEST SERVER");
    formatex(g_blockedData[id][block_admin_steam], charsmax(g_blockedData[][]), "TEST SERVER STEAMID");

    formatex(g_blockedData[id][block_reason], charsmax(g_blockedData[][]), "TEST REASON");

    g_blockedData[id][block_type] = type_chat | type_voice;

    ExecuteForward(g_forwardsData[fwd_onblock_post], g_forwardsData[fwd_return_value], id);
}

public plugin_natives() {
    register_native("gag_get_user_data", "__get_user_data", 0);
}

public __get_user_data()    {
    enum    {
        arg_id = 1,
        arg_identifier,
        arg_data,
        arg_datalen,
    };
  
    new id = get_param(arg_id);
  
    if (!is_user_connected(id))
        return -1;

    new iLen = get_param(arg_datalen);

    if (iLen)    {
        return set_string(arg_data, g_blockedData[id][arg_identifier], iLen);
    }

    return g_blockedData[id][arg_identifier];
}

Код:
#include <amxmodx>

const MAX_REASON_LENGTH = 32;

enum _: ident_data_struct   {
    ident_data,
    ident_expired,

    ident_map,
    ident_admin_name,
    ident_admin_steam,
    ident_reason,

    ident_type
}

enum _: block_info_struct   {
    block_data,
    block_expired,

    block_map[32],
    block_admin_name[MAX_NAME_LENGTH],
    block_admin_steam[MAX_AUTHID_LENGTH],
    block_reason[MAX_REASON_LENGTH],

    block_type
};

native gag_get_user_data(id, identifier, data[] = "", len = 0);
forward gag_onblocked_post(id);

public gag_onblocked_post(id)   {
    new string[211], len, blockInfo[block_info_struct];

    server_print("Test two");

    for (new i; i < ident_data_struct; i++) {
        if (i > ident_expired && i < ident_type)    {
            gag_get_user_data(id, i, blockInfo[i], charsmax(blockInfo[]));
            len += formatex(string[len], charsmax(string) - len, "^nstruct str[%d]: %s", i, blockInfo[i]);
        }
        else    {
            blockInfo[i] = gag_get_user_data(id, i);
            len += formatex(string[len], charsmax(string) - len, "^nstruct int[%d]: %d", i, blockInfo[i]);
        }
    }
    server_print(string);
}

На выходе:
Код:
struct int[0]: 0
struct int[1]: 0
struct str[2]:
struct str[3]:
struct str[4]:
struct str[5]:
struct int[6]: 0
 

georgeml

Скриптер
Постоялец
Регистрация
12 Сен 2017
Сообщения
595
Симпатии
314

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
Здесь значения проверьте.


Это set_array
Используйте одномерный массив для строк и int для чисел
В оригинале :
Код:
    static bool: showed;

    if (!showed)    {
        showed=true;
        new str[512],len;

        len = formatex(str, charsmax(str), "Start debug");
        len+=formatex(str[len], charsmax(str)-len, "^nblock_data = %d", g_blockedData[id][block_data]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_expired = %d", g_blockedData[id][block_expired]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_type = %d", g_blockedData[id][block_type]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_map = %s", g_blockedData[id][block_map]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_admin_name = %s", g_blockedData[id][block_admin_name]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_admin_steam = %s", g_blockedData[id][block_admin_steam]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_reason = %s", g_blockedData[id][block_reason]);

        server_print(str);
    }
Вывод:
Код:
block_data = 1580731349
block_expired = 1580731469
block_type = 3
block_map = de_dust2
block_admin_name = TEST SERVER
block_admin_steam = TEST SERVER STEAMID
block_reason = TEST REASON
Тест:
Код:
    server_print("block_data : %d", gag_get_user_data(id, ident_data));
    server_print("block_expired : %d", gag_get_user_data(id, ident_expired));
    server_print("block_type : %d", gag_get_user_data(id, ident_type));

    new string[32];

    gag_get_user_data(id, ident_map, string, charsmax(string));
    server_print("block_map : %s", string);

    gag_get_user_data(id, ident_admin_name, string, charsmax(string));
    server_print("block_admin_name : %s", string);

    gag_get_user_data(id, ident_admin_steam, string, charsmax(string));
    server_print("block_admin_steam : %s", string);

    gag_get_user_data(id, ident_reason, string, charsmax(string));
    server_print("block_reason : %s", string);

Вывод:
Код:
block_data : 100
block_expired : 100
block_type : 100
block_map : de_dust2
block_admin_name : de_dust2
block_admin_steam : de_dust2
block_reason : de_dust2
странно, завтра поколдую, напишу что наколдовал
 

georgeml

Скриптер
Постоялец
Регистрация
12 Сен 2017
Сообщения
595
Симпатии
314
Дайте коды целиком
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
Дайте коды целиком
Код:
#include <amxmodx>
#include <reapi>

const type_none        = -1;
const type_chat        = (1<<0);
const type_voice       = (1<<1);

const MAX_REASON_LENGTH = 32;

enum _: block_info_struct   {
    block_data,
    block_expired,

    block_map[32],
    block_admin_name[MAX_NAME_LENGTH],
    block_admin_steam[MAX_AUTHID_LENGTH],
    block_reason[MAX_REASON_LENGTH],

    block_type
};

enum _: forwards_struct {
    fwd_onblock_pre,
    fwd_onblock_post,
    fwd_unblock_pre,
    fwd_unblock_post,
    fwd_return_value
};

new g_blockedData[MAX_PLAYERS + 1][block_info_struct];
new g_forwardsData[forwards_struct];

public plugin_init()    {
    register_plugin("Gag system", "1.0.0", "cpctrl");

    register_clcmd("say /t", "clcmd_test");

    //register_menucmd(register_menuid("Blockmenu Players"), 1023, "Handle_MenuPlayers");

    g_forwardsData[fwd_onblock_pre] = CreateMultiForward("gag_onblocked_pre", ET_STOP, FP_CELL);
    g_forwardsData[fwd_onblock_post] = CreateMultiForward("gag_onblocked_post", ET_CONTINUE, FP_CELL);

    g_forwardsData[fwd_unblock_pre] = CreateMultiForward("gag_unblocked_pre", ET_STOP, FP_CELL);
    g_forwardsData[fwd_unblock_post] = CreateMultiForward("gag_ounblocked_post", ET_CONTINUE, FP_CELL);
}

public clcmd_test(id)   {
    new mapname[32];
    get_mapname(mapname, charsmax(mapname));

    g_blockedData[id][block_data] = get_systime();
    g_blockedData[id][block_expired] = get_systime()+120;

    formatex(g_blockedData[id][block_map], charsmax(g_blockedData[]), mapname);

    formatex(g_blockedData[id][block_admin_name], charsmax(g_blockedData[]), "TEST SERVER");
    formatex(g_blockedData[id][block_admin_steam], charsmax(g_blockedData[]), "TEST SERVER STEAMID");

    formatex(g_blockedData[id][block_reason], charsmax(g_blockedData[]), "TEST REASON");

    g_blockedData[id][block_type] = type_chat | type_voice;

    ExecuteForward(g_forwardsData[fwd_onblock_post], g_forwardsData[fwd_return_value], id);
}

public plugin_natives() {
    register_native("gag_get_user_data", "__get_user_data", 0);
}

public __get_user_data()    {
    enum    {
        arg_id = 1,
        arg_identifier,
        arg_data,
        arg_datalen,
    };
   
    new id = get_param(arg_id);
   
    if (!is_user_connected(id))
        return -1;

    static bool: showed;

    if (!showed)    {
        showed=true;
        new str[512],len;

        len = formatex(str, charsmax(str), "Start debug");
        len+=formatex(str[len], charsmax(str)-len, "^nblock_data = %d", g_blockedData[id][block_data]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_expired = %d", g_blockedData[id][block_expired]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_type = %d", g_blockedData[id][block_type]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_map = %s", g_blockedData[id][block_map]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_admin_name = %s", g_blockedData[id][block_admin_name]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_admin_steam = %s", g_blockedData[id][block_admin_steam]);
        len+=formatex(str[len], charsmax(str)-len, "^nblock_reason = %s", g_blockedData[id][block_reason]);

        server_print(str);
    }

    new iLen = get_param(arg_datalen);

    if (iLen)    {
        return set_string(arg_data, g_blockedData[id][arg_identifier], iLen);
    }

    return g_blockedData[id][arg_identifier];
}

Код:
#include <amxmodx>

enum    {
    ident_data,
    ident_expired,

    ident_map,
    ident_admin_name,
    ident_admin_steam,
    ident_reason,

    ident_type
}

native gag_get_user_data(id, identifier, data[] = "", len = 0);
forward gag_onblocked_post(id);

public gag_onblocked_post(id)   {
    server_print("block_data : %d", gag_get_user_data(id, ident_data));
    server_print("block_expired : %d", gag_get_user_data(id, ident_expired));
    server_print("block_type : %d", gag_get_user_data(id, ident_type));

    new string[32];

    gag_get_user_data(id, ident_map, string, charsmax(string));
    server_print("block_map : %s", string);

    gag_get_user_data(id, ident_admin_name, string, charsmax(string));
    server_print("block_admin_name : %s", string);

    gag_get_user_data(id, ident_admin_steam, string, charsmax(string));
    server_print("block_admin_steam : %s", string);

    gag_get_user_data(id, ident_reason, string, charsmax(string));
    server_print("block_reason : %s", string);
}
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
Код:
    if (iLen)    {
        return set_string(arg_data, g_blockedData[id][arg_identifier], iLen);
    }

    return g_blockedData[id][arg_identifier];
->
Код:
    new ident = get_param(arg_identifier);

    if (iLen)    {
        return set_string(arg_data, g_blockedData[id][ident], iLen);
    }

    return g_blockedData[id][ident];
Небольшая невнимательность, прогресс на лицо:
Код:
block_data : 1580848142
block_expired : 1580848262
block_type : 117
block_map : de_dust2
block_admin_name : e_dust2
block_admin_steam : _dust2
block_reason : dust2
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
Код:
public clcmd_test(id)   {
    new mapname[32];
    get_mapname(mapname, charsmax(mapname));
    g_blockedData[id][block_data] = get_systime();
    g_blockedData[id][block_expired] = get_systime()+120;
    copy(g_blockedData[id][block_admin_name], MAX_NAME_LENGTH - 1, "SERVER");
    copy(g_blockedData[id][block_admin_steam], MAX_AUTHID_LENGTH - 1, "STEAMID");
    copy(g_blockedData[id][block_reason], MAX_REASON_LENGTH - 1, "REASON");
    copy(g_blockedData[id][block_map], MAX_NAME_LENGTH - 1, mapname);
    g_blockedData[id][block_type] = type_chat | type_voice;
    for (new i; i < 7; i++) {
        if (i > 1 && i < 6)    {
            server_print("str struct[%d] data[%s]", i, g_blockedData[id][i]);
        }
        else    {
            server_print("int struct[%d] data[%d]", i, g_blockedData[id][i]);
        }
    }
    ExecuteForward(g_forwardsData[fwd_onblock_post], g_forwardsData[fwd_return_value], id);
    return PLUGIN_HANDLED;
}
Код:
int struct[0] data[1581020289]
int struct[1] data[1581020409]
str struct[2] data[de_dust2]
str struct[3] data[e_dust2]
str struct[4] data[_dust2]
str struct[5] data[dust2]
int struct[6] data[117]

#needhelp
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
server_print("%s",g_blockedData[id][block_admin_name]);
SERVER
хм.

copy(g_blockedData[id][block_admin_name], MAX_NAME_LENGTH - 1, "SERVER");
return set_string(arg_data, g_blockedData[id][block_admin_name], len);
Вывод в соседний плагин при таком раскладе:
Код:
block_map : SERVER
block_admin_name : SERVER
block_admin_steam: SERVER
block_reason : SERVER
 

cpCTRL

bruh
Скриптер
Постоялец
Регистрация
20 Фев 2018
Сообщения
263
Симпатии
65
Пол
Мужской
Решение всей проблемы если кому интересно, может пригодится:

Код:
public __get_user_data(plugin,params)    {
    enum    {
        arg_id = 1,
        arg_identifier,
        arg_data,
        arg_datalen
    };

    new id = get_param(arg_id);
    
    if (!is_user_connected(id))
        return -1;

    new len = get_param(arg_datalen);
    new ident = get_param(arg_identifier);

    new string[MAX_NAME_LENGTH+12], int = -1;

    switch (ident_struct: ident)  {
        case ident_data: int = g_blockedData[id][block_data];
        case ident_expired: int = g_blockedData[id][block_expired];
        case ident_map: copy(string, len, g_blockedData[id][block_map]);
        case ident_admin_name: copy(string, len, g_blockedData[id][block_admin_name]);
        case ident_admin_steam: copy(string, len, g_blockedData[id][block_admin_steam]);
        case ident_reason: copy(string, len, g_blockedData[id][block_reason]);
        case ident_type: int = g_blockedData[id][block_type];
    }

    if (len)    {
        return set_string(arg_data, string, len);
    }

    return int;
}
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу