Native

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
95
Реакции
21
День добрый знатоки, подскажите как решить данную проблему с нативом.

Код:
#define PLUGIN "Test Native A"

#define VERSION "0.0.1"

#define AUTHOR "South Shtorm"


#include <amxmodx>

#include <reapi>


new const Float:g_flCoords[][] = {

    {0.50, 0.40}, {0.56, 0.44},

    {0.60, 0.50}, {0.56, 0.56},

    {0.50, 0.60}, {0.44, 0.56},

    {0.40, 0.50}, {0.44, 0.44}

};


new g_iPosition[MAX_CLIENTS+1], g_szCoords;


new bool:g_bDmgReturn[MAX_CLIENTS+1];


public plugin_init()

{

    register_plugin(PLUGIN, VERSION, AUTHOR);

    register_clcmd("say /dmg", "ClientCommand_Damager");

  

    RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage_Post", .post = true);

  

    g_szCoords = charsmax(g_flCoords);

}


public plugin_natives()

    register_native("get_bDmgReturn", "_get_bDmgReturn_", 1);


public _get_bDmgReturn_(id)

    return g_bDmgReturn[id];


public client_putinserver(id)

    g_bDmgReturn[id] = false;


public ClientCommand_Damager(id)

    g_bDmgReturn[id] = !g_bDmgReturn[id];


public CBasePlayer_TakeDamage_Post(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)

{

    if(!g_bDmgReturn[pevAttacker] || !is_user_connected(pevAttacker))

        return HC_CONTINUE;


    if(pevAttacker == this || pevAttacker != pevInflictor)   

        return HC_CONTINUE;

      

    if(rg_is_player_can_takedamage(this, pevAttacker))

    {

        new iPos = g_iPosition[pevAttacker] > g_szCoords ? (g_iPosition[pevAttacker] = 0) : g_iPosition[pevAttacker];


        set_hudmessage(0, 100, 200, Float:g_flCoords[iPos][0], Float:g_flCoords[iPos][1], 0, 0.1, 2.5, 0.02, 0.02);

        show_hudmessage(pevAttacker, "%.0f", flDamage);


        g_iPosition[pevAttacker]++;

    }

  

    return HC_CONTINUE;

}

Код:
#define PLUGIN "Test Native B"
#define VERSION "0.0.1"
#define AUTHOR "South Shtorm"

#define MENU_TITLE "\yМеню:^n^n"
#define MENU_DMG_ON "\y1. \rПоказ урона: \w[ \yВКЛ\w ]"
#define MENU_DMG_OFF "\y1. \rПоказ урона: \y[ \wВЫКЛ\y ]"
#define MENU_EXIT_NAME "\r0. \yВыход"

#include <amxmodx>
#include <reapi>

native bool:get_bDmgReturn(id);

const MENU_KEY_BITS = (MENU_KEY_1|MENU_KEY_0);
const MENU_KEY_EXIT = 9;

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
   
    register_clcmd("say /vp", "ClientCommand_Menu");
    register_clcmd("say_team /vp", "ClientCommand_Menu");
   
    register_menucmd(register_menuid("Menu"), MENU_KEY_BITS, "Menu_Handler");
}

public ClientCommand_Menu(const id)
{
    new iLen, szMenu[512], iKey = MENU_KEY_0;
   
    iLen = formatex(szMenu, charsmax(szMenu), MENU_TITLE);
   
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%s^n^n", get_bDmgReturn(id) ? MENU_DMG_ON : MENU_DMG_OFF);
    iKey |= MENU_KEY_1;
   
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, MENU_EXIT_NAME);
    iKey |= MENU_KEY_0;
   
    show_menu(id, iKey, szMenu, -1, "Menu");
    return PLUGIN_HANDLED;
}

public Menu_Handler(id, iKey)
{
    if(iKey == MENU_KEY_EXIT)
        return PLUGIN_HANDLED;
   
    switch(iKey)
    {
        case 0: client_cmd(id, "say /dmg");
    }
   
    ClientCommand_Menu(id);
    return PLUGIN_HANDLED;
}


Суть проблемы:
В плагине А зарегистрирован натив на проверку булевой(работает как вкл\выкл для дамагера).

В плагине Б Открывается менюшка которая отображает состояние булевой (вкл или выкл) и нажав на цифру меню, мы отправляем (say /dmg ), которая меняет ее положение тру\фолс , но проблема в том что в меню, изменение в тексте происходит только со 2-3 нажатия, словно натива не успевает вернуть значение....я так понимаю ее нужно зафорсить или как вариант через второй натив менять ее значение................

Пробовал через второй натив менять значение в плагине Б, для плагина А...но там вообще не сработало. Может кто подскажет идею для решения?
 
Последнее редактирование модератором:
Сообщения
576
Реакции
1,003
Помог
18 раз(а)
Как минимум перестать юзать костыль с client cmd.
 
Сообщения
95
Реакции
21
Mistrick, иной вариант, это создать доп натив меняющий параметр булевой в в другом плагине, или есть иные варики?
8 Июл 2018
Пробовал через доп натив

public _set_bDmgReturn_(id, status)
status = g_bDmgReturn[id];


но так оно не ставит значения тру/фолс которые мы отсылаем с хендлера меню

case
set_bDmgReturn(id, true)
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
thegame,

в ините где то сейвишь себе переменные
Код:
new plugin_id = find_plugin_byfile("chet_tut.amxx");
new func_id = get_func_id("func_name", plugin_id);
где надо - вызываешь
Код:
if(callfunc_begin_i(func_id, plugin_id))
{
    callfunc_push_int(id); // one param - player index
    callfunc_end();
}
 
Сообщения
95
Реакции
21
neygomon, ну вот часть принципа использования я догнал, костыль с client_cmd поборол. но вот как узнать в плагине Б состояние булевой тру\фолс , чтоб в форматексе оно отображалось соотвественно

iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%s^n^n", get_bDmgReturn(id) ? MENU_DMG_ON : MENU_DMG_OFF);
iKey |= MENU_KEY_1;
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
thegame, только натива тогда.
можно, конечно, через другую функцию дернуть инфу используя callfunc, но это наркомания
 
Сообщения
95
Реакции
21
neygomon,

Вышло вот так, если есть косяки, то буду рад услышать о них:

Код:
#define PLUGIN "Test Native A"
#define VERSION "0.0.1"
#define AUTHOR "South Shtorm"

#include <amxmodx>
#include <reapi>

new const Float:g_flCoords[][] = {
    {0.50, 0.40}, {0.56, 0.44},
    {0.60, 0.50}, {0.56, 0.56},
    {0.50, 0.60}, {0.44, 0.56},
    {0.40, 0.50}, {0.44, 0.44}
};

new g_iPosition[MAX_CLIENTS+1], g_szCoords;

new bool:g_bDmgReturn[MAX_CLIENTS+1];

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage_Post", .post = true);
    
    g_szCoords = charsmax(g_flCoords);
}

public plugin_natives()
    register_native("get_dmg_bool", "_get_dmg_bool_", 1);

public client_putinserver(id)
    g_bDmgReturn[id] = false;
    
public _get_dmg_bool_(id)
    return g_bDmgReturn[id];
    
public SwitchCommand_Callback(id)
    g_bDmgReturn[id] = !g_bDmgReturn[id];

public CBasePlayer_TakeDamage_Post(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
    if(!g_bDmgReturn[pevAttacker] || !is_user_connected(pevAttacker))
        return HC_CONTINUE;

    if(pevAttacker == this || pevAttacker != pevInflictor)   
        return HC_CONTINUE;
        
    if(rg_is_player_can_takedamage(this, pevAttacker))
    {
        new iPos = g_iPosition[pevAttacker] > g_szCoords ? (g_iPosition[pevAttacker] = 0) : g_iPosition[pevAttacker];

        set_hudmessage(0, 100, 200, Float:g_flCoords[iPos][0], Float:g_flCoords[iPos][1], 0, 0.1, 2.5, 0.02, 0.02);
        show_hudmessage(pevAttacker, "%.0f", flDamage);

        g_iPosition[pevAttacker]++;
    }
    return HC_CONTINUE;
}


Код:
#define PLUGIN "Test Native B"
#define VERSION "0.0.1"
#define AUTHOR "South Shtorm"

#define MENU_TITLE "\yМеню:^n^n"
#define MENU_DMG_ON "\y1. \rПоказ урона: \w[ \yВКЛ\w ]"
#define MENU_DMG_OFF "\y1. \rПоказ урона: \y[ \wВЫКЛ\y ]"
#define MENU_EXIT_NAME "\r0. \yВыход"

#include <amxmodx>
#include <reapi>

const MENU_KEY_BITS = (MENU_KEY_1|MENU_KEY_0);
const MENU_KEY_EXIT = 9;

new plugin_id, func_id;

native bool:get_dmg_bool(id);

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    register_clcmd("say /vp", "ClientCommand_Menu");
    register_clcmd("say_team /vp", "ClientCommand_Menu");
    
    register_menucmd(register_menuid("Menu"), MENU_KEY_BITS, "Menu_Handler");
    
    plugin_id =    plugin_id = find_plugin_byfile("test1.amxx");
    func_id = get_func_id("SwitchCommand_Callback", plugin_id);
}

public ClientCommand_Menu(const id)
{
    new iLen, szMenu[512], iKey = MENU_KEY_0;
    
    iLen = formatex(szMenu, charsmax(szMenu), MENU_TITLE);
    
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%s^n^n", get_dmg_bool(id) ? MENU_DMG_ON : MENU_DMG_OFF);
    iKey |= MENU_KEY_1;
    
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, MENU_EXIT_NAME);
    iKey |= MENU_KEY_0;
    
    show_menu(id, iKey, szMenu, -1, "Menu");
    return PLUGIN_HANDLED;
}

public Menu_Handler(id, iKey)
{
    if(iKey == MENU_KEY_EXIT) return PLUGIN_HANDLED;
    
    switch(iKey)
    {
        case 0:
        {
            if(callfunc_begin_i(func_id, plugin_id))
            {
                callfunc_push_int(id); // one param - player index
                callfunc_end();
            }
        }   
    }
    
    ClientCommand_Menu(id);
    return PLUGIN_HANDLED;
}



Теперь все работает как нужно, меню обновляется сразу, я так понимаю callfunc выступает в роли форсирования
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
95
Реакции
21
neygomon, я имел ввиду для форматекса...ибо если через клиент кмд делать, то оно тоже меняло значение переменной, но вот в меню начинало отображать с 2-3 нажатия....
 
Сообщения
327
Реакции
289
Помог
9 раз(а)
Что мешает сделать 2 натива get/set
..или 1 с параметрами get/set
 
Сообщения
95
Реакции
21
neygomon, и сама реализация норм?
8 Июл 2018
zhorzh78, ну наверное, то что я пробовал зделать через гет и сет, только менюшка всеравно обновлялась после 2-3 нажатия...может у вас другой способ?
 
Последнее редактирование:
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
thegame, он имеет ввиду это:
native change_bool(id), вместо callfunc

а change_bool будет делать тоже самое что и callfunc, только все это будет красивее
 
Сообщения
95
Реакции
21
neygomon, приведи пример, а то я как не пробывал, ну не смог
 
Сообщения
265
Реакции
315
Помог
10 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
thegame, хм...

в плагин А добавь: register_native("change_dmg_bool", "SwitchCommand_Callback", 1);
в плагине Б замени:
Код:
if(callfunc_begin_i(func_id, plugin_id))
            {
                callfunc_push_int(id); // one param - player index
                callfunc_end();
            }
на change_dmg_bool(id);
ну и в шапке плагина Б: native change_dmg_bool(id);
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу