Пропадает моделька оружия, хотя по факту оно есть

jaron

Участник
Сообщения
3
Реакции
0
Всем привет

Цель - переключить оружие на нож, запретив при этом смену оружия.

Переключение оружия на нож получилось осуществить с помощью:
C-подобный:
void TakeKnife(int iClient)
{
    int iKnife = GetPlayerWeaponSlot(iClient, 2);
    if (!IsValidEntity(iKnife)) return;
    SetEntPropEnt(iClient, Prop_Send, "m_hActiveWeapon", iKnife);
}

Запрет на переключение:
C-подобный:
SDKHook(client, SDKHook_WeaponSwitch, _WeaponSwitch);

Action _WeaponSwitch(int client, int weapon)
{
    return Plugin_Handled;
}

Но после переключения, если попытаться выбрать, например, 1 слот, то моделька оружия пропадает, при этом возможность бить ножом и звук остаются. Нужно, чтобы моделька была видна. Если применять не к игроку, а к ботам, то у них также оружие не видно.

Пробовал так:
C-подобный:
SetEntProp(client, Prop_Send, "m_bDrawViewmodel", true);

Отдельно выключает/включает видимость рук, но внутри функций SDKHook_WeaponSwitch, SDKHook_WeaponSwitchPost не влияет.

Кто-нибудь знает, как это можно реализовать или хотя бы в какую сторону искать инфу ?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
Этот хук срабатывает после переключения на оружие и его калбэк возвращает только void, т.е. им на событие не повлиять никак.

Вместо хука SDKHook_WeaponSwitch следует использовать SDKHook_WeaponCanSwitchTo: так мы блочим возможность переключения, а не процесс.
Как-то так.
 

jaron

Участник
Сообщения
3
Реакции
0
Этот хук срабатывает после переключения на оружие и его калбэк возвращает только void, т.е. им на событие не повлиять никак.

Вместо хука SDKHook_WeaponSwitch следует использовать SDKHook_WeaponCanSwitchTo: так мы блочим возможность переключения, а не процесс.
Как-то так.
SDKHook_WeaponCanSwitchTo тоже пробовал - он почему-то вообще не вызывается.

C-подобный:
SDKHook(client, SDKHook_WeaponSwitch, _WeaponSwitch);
SDKHook(client, SDKHook_WeaponSwitchPost, _WeaponSwitchPost);
SDKHook(client, SDKHook_WeaponCanSwitchTo, _WeaponCanSwitchTo);

Action _WeaponSwitch(int client, int weapon)
{
    PrintToChatAll("_WeaponSwitch");
}

Action _WeaponSwitchPost(int client, int weapon)
{
    PrintToChatAll("_WeaponSwitchPost");
}

Action _WeaponCanSwitchTo(int client, int weapon)
{
    PrintToChatAll("_WeaponCanSwitchTo");
}

В консоль при этом выводится только:
_WeaponSwitch
_WeaponSwitchPost

Хотя вот здесь (https://forums.alliedmods.net/showthread.php?t=237753) именно про SDKHook_WeaponCanSwitchTo и говорилось...
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
должно быть void _WeaponSwitchPost
Сообщения автоматически склеены:

и компилер не ругается, что Action ничего не возвращает?
Сообщения автоматически склеены:

C-подобный:
    // WeaponCanSwitchToPost
    // WeaponCanUsePost
    // WeaponDropPost
    // WeaponEquipPost
    // WeaponSwitchPost
    function void (int client, int weapon);
Сообщения автоматически склеены:

Вообще можно попробовать вешать хуки через эту функцию:
C-подобный:
/**
 * Hooks an entity
 *
 * Unhooked automatically upon destruction/removal of the entity
 *
 * @param entity        Entity index
 * @param type          Type of function to hook
 * @param callback      Function to call when hook is called
 * @return              Hook Successful
 */
native bool SDKHookEx(int entity, SDKHookType type, SDKHookCB callback);
Так можно узнать удалось ли добавить хук.
 
Последнее редактирование:

jaron

Участник
Сообщения
3
Реакции
0
и компилер не ругается, что Action ничего не возвращает?
Нет, не ругается. А вот если я пытаюсь вернуть Plugin_Continue / Plugin_Handled / Plugin_stop, то ругается, что нельзя вернуть что-либо из void-функции

error 088: cannot return a value from a void function

Вообще можно попробовать вешать хуки через эту функцию:
C-подобный:
/**
native bool SDKHookEx(int entity, SDKHookType type, SDKHookCB callback);
Так можно узнать удалось ли добавить хук.
Спасибо, посмотрю
 
Сверху Снизу