item_pickup или SDKHook_WeaponCanUse

Черная вдова

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
Лучше сдк хукс. Может и чуть затратнее, зато у тебя будет и индекс оружия и имя и всё что только захочешь, к тому же чтобы запретить достаточно просто Plugin_Handled вернуть. И разница в нагрузке не настолько существенна чтобы переживать по этому поводу. Это же не хук трансмит
 
Последнее редактирование:

Monomizer

Держу JDW в бане.
Сообщения
1,947
  • Команда форума
  • #4
Парни, сорри что влезаю, но темы отдельной не стоит...
Кароче в 1.6. есть профилирование для "таких" вопросов, а sourcemod подобие такого есть, именно в файле?
видел вроде бы была команда sm profile etc...
Руки ещё не доходили
 
N

NiGaByte

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

public Action:UnBlockWeaponCanUse(iClient, weapon)
{
    return Plugin_Continue;
}
Как быть?
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
N

NiGaByte

Там ведь не событие возрождения, начало раунда, да ?


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

public Action:BlockWeaponCanUse(iClient, weapon)
{
    return Plugin_Handled;
}

PHP:
public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
   for( int iClient = 1; iClient <= MaxClients; iClient++ )
   {
        SDKUnhook(iClient, SDKHook_WeaponCanUse, UnBlockWeaponCanUse);
   }
}

public Action:UnBlockWeaponCanUse(iClient, weapon)
{
    return Plugin_Continue;
}

Вот так делаю, хотя это немного нагибает мою логику, я сначала хукаю, а потом унХукаю, и при этом возвращаю Continue;
Как правильно сделать? Ну не кодил я раньше е-маё... Знания есть, опыта 5 дней. Подскажите, будьте так добры.
 
Последнее редактирование модератором:

Someone

Участник
Сообщения
1,933
Реакции
1,653
я хукаю SDKHook_WeaponCanUse в событии OnRoundEnd и делаю return Plugin_Handled;
Далее, мне нужно чтобы SDKHook_WeaponCanUse УнХукнулся, и делаю то что написал выше, и без разницы когда, в начале раунда или при спавне.
--- Добавлено позже ---
@Someone,

PHP:
public OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    for( int iClient = 1; iClient <= MaxClients; iClient++ )
    {
        SDKHook(iClient, SDKHook_WeaponCanUse, BlockWeaponCanUse);
    }
}

public Action:BlockWeaponCanUse(iClient, weapon)
{
    return Plugin_Handled;
}

PHP:
public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
   for( int iClient = 1; iClient <= MaxClients; iClient++ )
   {
        SDKUnhook(iClient, SDKHook_WeaponCanUse, UnBlockWeaponCanUse);
   }
}

public Action:UnBlockWeaponCanUse(iClient, weapon)
{
    return Plugin_Continue;
}

Вот так делаю, хотя это немного нагибает мою логику, я сначала хукаю, а потом унХукаю, и при этом возвращаю Continue;
Как правильно сделать? Ну не кодил я раньше е-маё... Знания есть, опыта 5 дней. Подскажите, будьте так добры.


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(iClient, SDKHook_WeaponCanUse, WeaponCanUse); // Разхукает сам
}

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

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

public Action WeaponCanUse(int iClient, int iWeapon)
{
    switch(g_bBlock)
    {
        case 0: return Plugin_Continue;
        case 1: return Plugin_Handled;
    }
}
 
N

NiGaByte

PHP:
public OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    for( int iClient = 1; iClient <= MaxClients; iClient++ )
    {
        SDKHook(iClient, SDKHook_WeaponCanUse, BlockWeaponCanUse);
    }
}

public Action:BlockWeaponCanUse(iClient, weapon)
{
    return Plugin_Handled;
}

PHP:
public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
   for( int iClient = 1; iClient <= MaxClients; iClient++ )
   {
        SDKUnhook(iClient, SDKHook_WeaponCanUse, UnBlockWeaponCanUse);
   }
}

public Action:UnBlockWeaponCanUse(iClient, weapon)
{
    return Plugin_Continue;
}

Вот так делаю, хотя это немного нагибает мою логику, я сначала хукаю, а потом унХукаю, и при этом возвращаю Continue;
Как правильно сделать? Ну не кодил я раньше
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(iClient, SDKHook_WeaponCanUse, WeaponCanUse); // Разхукает сам
}

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

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

public Action WeaponCanUse(int iClient, int iWeapon)
{
    switch(g_bBlock)
    {
        case 0: return Plugin_Continue;
        case 1: return Plugin_Handled;
    }
}
А свитчем не очень жестко? МБ выгодней If?
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
PHP:
public OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    for( int iClient = 1; iClient <= MaxClients; iClient++ )
    {
        SDKHook(iClient, SDKHook_WeaponCanUse, BlockWeaponCanUse);
    }
}

public Action:BlockWeaponCanUse(iClient, weapon)
{
    return Plugin_Handled;
}

PHP:
public OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
   for( int iClient = 1; iClient <= MaxClients; iClient++ )
   {
        SDKUnhook(iClient, SDKHook_WeaponCanUse, UnBlockWeaponCanUse);
   }
}

public Action:UnBlockWeaponCanUse(iClient, weapon)
{
    return Plugin_Continue;
}

Вот так делаю, хотя это немного нагибает мою логику, я сначала хукаю, а потом унХукаю, и при этом возвращаю Continue;
Как правильно сделать? Ну не кодил я раньше

А свитчем не очень жестко? МБ выгодней If?
switch быстрее, но в этой ситуации не знаю.
 
N

NiGaByte

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

Someone

Участник
Сообщения
1,933
Реакции
1,653
только меня напрягает глобальная переменная, чёт в падлу хранить её там.
Это в разы лучше, чем хукать и анхукать.

@Someone, он так ругаеться что WeaponCanUse(iClient, weapon) должен вернуть значение...
Ну тогда:
PHP:
public Action WeaponCanUse(int iClient, int iWeapon)
{
    if(g_bBlock)    return Plugin_Handled
    return Plugin_Continue;
}
 
N

NiGaByte

@Someone, он так ругаеться что WeaponCanUse(iClient, weapon) должен вернуть значение...

а я могу не чего не передавать?
ну типа
PHP:
public Action:WeaponCanUse()
{
    switch(g_bBlock)
    {
        case 0: return Plugin_Continue;
        case 1: return Plugin_Handled;
    }
}
Не не могу.
--- Добавлено позже ---
@Someone, а какое событие первее, round_start или player_spawn?
 
Последнее редактирование модератором:

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Это в разы лучше, чем хукать и анхукать.


Ну тогда:
PHP:
public Action WeaponCanUse(int iClient, int iWeapon)
{
    if(g_bBlock)    return Plugin_Handled
    return Plugin_Continue;
}

PHP:
public Action WeaponCanUse(int iClient, int iWeapon)
{
    return g_bBlock ? Plugin_Handled : Plugin_Continue;
}

Тогда так :D
 
Сверху Снизу