item_pickup или SDKHook_WeaponCanUse

Тема в разделе "Программирование / Скриптинг", создана пользователем Черная вдова, 11 фев 2016.

  1. Черная вдова

    Черная вдова

    Сообщения:
    1.929
    Симпатии:
    317
    Что лучше использовать что бы заблокировать подбор оружия ?
    item_pickup или SDKHook_WeaponCanUse
    Мне надо что бы оно оставалось на полу, через item_pickup я так понимаю нагрузка меньше будет
    У меня получилось только приходится его периодически дропать, а не просто оставлять на земле, а можно как то лучше ?
     
  2. R1KO

    R1KO Рукоблуд с машинными кодами Супермодератор

    Сообщения:
    6.997
    Симпатии:
    4.165
    Лучше сдк хукс. Может и чуть затратнее, зато у тебя будет и индекс оружия и имя и всё что только захочешь, к тому же чтобы запретить достаточно просто Plugin_Handled вернуть. И разница в нагрузке не настолько существенна чтобы переживать по этому поводу. Это же не хук трансмит
     
    Последнее редактирование: 6 сен 2017
    Черная вдова нравится это.
  3. Черная вдова

    Черная вдова

    Сообщения:
    1.929
    Симпатии:
    317
    Ок, а слот можно узнать в какой переместиться ?
     
  4. Monomizer

    Monomizer Мимо пробегал Супермодератор

    Сообщения:
    1.553
    Симпатии:
    237
    Парни, сорри что влезаю, но темы отдельной не стоит...
    Кароче в 1.6. есть профилирование для "таких" вопросов, а sourcemod подобие такого есть, именно в файле?
    видел вроде бы была команда sm profile etc...
    Руки ещё не доходили
     
  5. NiGaByte

    NiGaByte

    Сообщения:
    562
    Симпатии:
    103
    Почему не срабатывает? Хукаю в конце раунда, UnХукаю тут, либо в начале раунда, и нечего не получается.
    PHP:
    public Action OnPlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
    {
        for( 
    int iClient 1iClient <= MaxClientsiClient++ )
        {
            
    SDKUnhook(iClientSDKHook_WeaponCanUseUnBlockWeaponCanUse);
        }
    }

    public 
    Action:UnBlockWeaponCanUse(iClientweapon)
    {
        return 
    Plugin_Continue;
    }
    Как быть?
     
  6. Someone

    Someone

    Сообщения:
    1.094
    Симпатии:
    625
    Там ведь не событие возрождения, начало раунда, да ?

    А что ты от кода ожидаешь ?
     
    NiGaByte нравится это.
  7. NiGaByte

    NiGaByte

    Сообщения:
    562
    Симпатии:
    103
    я хукаю SDKHook_WeaponCanUse в событии OnRoundEnd и делаю return Plugin_Handled;
    Далее, мне нужно чтобы SDKHook_WeaponCanUse УнХукнулся, и делаю то что написал выше, и без разницы когда, в начале раунда или при спавне.
    --- Добавлено позже ---
    @Someone ,
    PHP:
    public OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        for( 
    int iClient 1iClient <= MaxClientsiClient++ )
        {
            
    SDKHook(iClientSDKHook_WeaponCanUseBlockWeaponCanUse);
        }
    }

    public 
    Action:BlockWeaponCanUse(iClientweapon)
    {
        return 
    Plugin_Handled;
    }
    PHP:
    public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
       for( 
    int iClient 1iClient <= MaxClientsiClient++ )
       {
            
    SDKUnhook(iClientSDKHook_WeaponCanUseUnBlockWeaponCanUse);
       }
    }

    public 
    Action:UnBlockWeaponCanUse(iClientweapon)
    {
        return 
    Plugin_Continue;
    }
    Вот так делаю, хотя это немного нагибает мою логику, я сначала хукаю, а потом унХукаю, и при этом возвращаю Continue;
    Как правильно сделать? Ну не кодил я раньше е-маё... Знания есть, опыта 5 дней. Подскажите, будьте так добры.
     
    Последнее редактирование: 6 сен 2017
  8. Someone

    Someone

    Сообщения:
    1.094
    Симпатии:
    625

    PHP:
    #include <sdkhooks>

    #pragma semicolon 1
    #pragma newdecls required

    bool g_bBlock;    // true блокирует

    public void OnPluginStart()
    {
        
    HookEvent("round_start",    Event_RoundStart,      EventHookMode_PostNoCopy);
        
    HookEvent("round_end",         Event_RoundEnd,      EventHookMode_PostNoCopy);
    }

    public 
    void OnClientPutInServer(int iClient)
    {
        
    SDKHook(iClientSDKHook_WeaponCanUseWeaponCanUse); // Разхукает сам
    }

    public 
    void Event_RoundStart(Event hEvent, const char[] namebool bDontBroadcast)
    {
        
    g_bBlock false;
    }

    public 
    void Event_RoundEnd(Event hEvent, const char[] namebool bDontBroadcast)
    {
        
    g_bBlock true;
    }

    public 
    Action WeaponCanUse(int iClientint iWeapon)
    {
        switch(
    g_bBlock)
        {
            case 
    0: return Plugin_Continue;
            case 
    1: return Plugin_Handled;
        }
    }
     
    Meowmurmur и NiGaByte нравится это.
  9. NiGaByte

    NiGaByte

    Сообщения:
    562
    Симпатии:
    103
    PHP:
    public OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        for( 
    int iClient 1iClient <= MaxClientsiClient++ )
        {
            
    SDKHook(iClientSDKHook_WeaponCanUseBlockWeaponCanUse);
        }
    }

    public 
    Action:BlockWeaponCanUse(iClientweapon)
    {
        return 
    Plugin_Handled;
    }
    PHP:
    public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
       for( 
    int iClient 1iClient <= MaxClientsiClient++ )
       {
            
    SDKUnhook(iClientSDKHook_WeaponCanUseUnBlockWeaponCanUse);
       }
    }

    public 
    Action:UnBlockWeaponCanUse(iClientweapon)
    {
        return 
    Plugin_Continue;
    }
    Вот так делаю, хотя это немного нагибает мою логику, я сначала хукаю, а потом унХукаю, и при этом возвращаю Continue;
    Как правильно сделать? Ну не кодил я раньше
    А свитчем не очень жестко? МБ выгодней If?
     
  10. Someone

    Someone

    Сообщения:
    1.094
    Симпатии:
    625
    switch быстрее, но в этой ситуации не знаю.
     
    Meowmurmur и NiGaByte нравится это.
  11. NiGaByte

    NiGaByte

    Сообщения:
    562
    Симпатии:
    103
    А ну я типа вкурил.
    --- Добавлено позже ---
    только меня напрягает глобальная переменная, чёт в падлу хранить её там.
    --- Добавлено позже ---
    @Someone, он так ругаеться что WeaponCanUse(iClient, weapon) должен вернуть значение...
    --- Добавлено позже ---
    warning 209: function "WeaponCanUse" should return a value
     
    Последнее редактирование: 6 сен 2017
  12. Someone

    Someone

    Сообщения:
    1.094
    Симпатии:
    625
    Это в разы лучше, чем хукать и анхукать.

    Ну тогда:
    PHP:
    public Action WeaponCanUse(int iClientint iWeapon)
    {
        if(
    g_bBlock)    return Plugin_Handled
        
    return Plugin_Continue;
    }
     
    Meowmurmur и NiGaByte нравится это.
  13. NiGaByte

    NiGaByte

    Сообщения:
    562
    Симпатии:
    103
    @Someone, он так ругаеться что WeaponCanUse(iClient, weapon) должен вернуть значение...
    а я могу не чего не передавать?
    ну типа
    PHP:
    public Action:WeaponCanUse()
    {
        switch(
    g_bBlock)
        {
            case 
    0: return Plugin_Continue;
            case 
    1: return Plugin_Handled;
        }
    }
     
  14. Someone

    Someone

    Сообщения:
    1.094
    Симпатии:
    625
    Если сделал, как я написал, то не будет.
     
    Meowmurmur и NiGaByte нравится это.
  15. NiGaByte

    NiGaByte

    Сообщения:
    562
    Симпатии:
    103
    Не не могу.
    --- Добавлено позже ---
    @Someone, а какое событие первее, round_start или player_spawn?
     
    Последнее редактирование: 6 сен 2017
  16. R1KO

    R1KO Рукоблуд с машинными кодами Супермодератор

    Сообщения:
    6.997
    Симпатии:
    4.165
    @NiGaByte,
    но ксго как всегда выделилась и в ней вроде идет так:
    1. round_prestart
    2. player_spawn
    3. round_start
     
    Серый™, Meowmurmur, NiGaByte и ещё 1-му нравится это.