[Решено][CSGO] Краш клиента из-за невидимого оружия

hitmany

Участник
Сообщения
171
Реакции
97
Добрый день, иногда вылетает клиент csgo у всех игроков, если выполняется код на невидимое оружие для игрока

Я устанавливаю 20% видимости для игрока, но т.к. оружие видно то просто сделать setrendermode render_none не получится и нужно сделать невидимость для всех attachment игрока(все что на спине висит: бомба, оружие, ножи) я использую m_iAddonBits и для оружия которое в руках m_nModelIndex 0

пример кода:
PHP:
public setinvis(client)
{
   new knife = GetPlayerWeaponSlot(client, CS_SLOT_KNIFE);
   if (knife != -1)
  {
       SetEntProp(GetEntPropEnt(knife, Prop_Send, "m_hWeaponWorldModel"), Prop_Send, "m_nModelIndex", 0);
   }
   SDKHookEx(client, SDKHook_PostThinkPost, OnPostThinkPost);
    invisible[client] = 1;
}

public PostThinkPost(client)
{
    if(invisible[client] == 1)
    {
        SetEntProp(client, Prop_Send, "m_iAddonBits",0);
    }
}

Как вообще понять причину краша клиента, копать дампы? есть ли логи ошибок? У некоторых даже при подключении вылеты
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #4
@hitmany, прошу прощения, тогда в ксго при запуске нужно -debug прописать.
Будут логи.
 

hitmany

Участник
Сообщения
171
Реакции
97
@hitmany, прошу прощения, тогда в ксго при запуске нужно -debug прописать.
Будут логи.

Круто, попробую, т.е. в SteamApps\common\Counter-Strike Global Offensive\debug.log запишется последний вывод в консоли? И я наконец смогу увидеть ошибку
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #6
@hitmany, у меня еще в /csgo.
Т.е. полный путь такой:
C-подобный:
SteamApps\common\Counter-Strike Global Offensive\csgo\debug.log
--- Добавлено позже ---
@hitmany, вот нашел что:
-condebug - для сохранения всех логов консоли в текстовом файле console.log
Видимо изменили.
 

hitmany

Участник
Сообщения
171
Реакции
97
В логах ничего в момент краша, только чат...
 

ludanik

Участник
Сообщения
146
Реакции
20
invisible[client] = true; (до sdkhook, а не после)
if (invisible[client])

так будет куда лучше.

Вылетать может даже из за пропов, которые попросту не валидны. Нужно сделать проверку на валидность оружия.
--- Добавлено позже ---
@hitmany,
C-подобный:
setinvis(client)
{
    new knife = GetPlayerWeaponSlot(client, CS_SLOT_KNIFE);
    if (knife != -1)
    {
        SetEntProp(GetEntPropEnt(knife, Prop_Send, "m_hWeaponWorldModel"), Prop_Send, "m_nModelIndex", 0);
    }
    invisible[client] = true;
    SDKHookEx(client, SDKHook_PostThinkPost, OnPostThinkPost);
}

public OnPostThinkPost(client)
{
    if (invisible[client]) SetEntProp(client, Prop_Send, "m_iAddonBits",0);
}
SDKUnhook(client, SDKHook_PostThinkPost, OnPostThinkPost); не забудь сделать, когда нужно.
 
Последнее редактирование:

hitmany

Участник
Сообщения
171
Реакции
97
invisible[client] = true; (до sdkhook, а не после)

if (invisible[client])

так будет куда лучше.

Вылетать может даже из за пропов, которые попросту не валидны. Нужно сделать проверку на валидность оружия.
--- Добавлено позже ---
@hitmany,
C-подобный:
setinvis(client)
{
    new knife = GetPlayerWeaponSlot(client, CS_SLOT_KNIFE);
    if (knife != -1)
    {
        SetEntProp(GetEntPropEnt(knife, Prop_Send, "m_hWeaponWorldModel"), Prop_Send, "m_nModelIndex", 0);
    }
    invisible[client] = true;
    SDKHookEx(client, SDKHook_PostThinkPost, OnPostThinkPost);
}

public OnPostThinkPost(client)
{
    if (invisible[client]) SetEntProp(client, Prop_Send, "m_iAddonBits",0);
}
SDKUnhook(client, SDKHook_PostThinkPost, OnPostThinkPost); не забудь сделать, когда нужно.

Подождите) Я написал примерный код, invisible переменную дописал чтобы не выгружать кучу кода с переменными и выложить на форум упролщенную
А как из-за пропов может вылетать, вы про m_hWeaponWorldModel?
Я хукаю только для игроков с предварительной проверкой что он жив.
SDKUnhook есть когда сбрасывается переменная, вот наверно забыл что когда игрок выходит сервера и переменная не сбрасывается делать unhook, попробую дописать
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Из всех методов скрывать world model оружия ты выбрал самый идиотский и удивляешься, что выкидывает клиент.
Действуй по-другому. Например, ты можешь использовать инпут, который, кстати, есть у всего оружия "HideWeapon". Его следует отправлять самой ентити пухи. Или же хукнуть ентити ворлд модели на трансмит, но в этом случае есть правило, что своё оружие клиент должен видеть, так что просто используй проп овнера.
 

hitmany

Участник
Сообщения
171
Реакции
97
Из всех методов скрывать world model оружия ты выбрал самый идиотский и удивляешься, что выкидывает клиент.
Действуй по-другому. Например, ты можешь использовать инпут, который, кстати, есть у всего оружия "HideWeapon". Его следует отправлять самой ентити пухи. Или же хукнуть ентити ворлд модели на трансмит, но в этом случае есть правило, что своё оружие клиент должен видеть, так что просто используй проп овнера.

Спасибо за совет, когда делал других методов не нашел
PHP:
public OnEntityCreated(entity, const String:classname[])
{

    if(strcmp(classname, "weaponworldmodel", false) == 0)
    {
        SDKHook(entity, SDKHook_SetTransmit, Hook_SetTransmit);
        new owner = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
        PrintToChatAll("%d",owner);
     }
}
public Action:Hook_SetTransmit(entity, client)
{
        decl String:iWeapon[32];
        GetEdictClassname(entity, iWeapon, sizeof(iWeapon));
        if(StrEqual(iWeapon, "weaponworldmodel", false))
        {
            new owner = GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity");
            PrintToChatAll("%d",owner);
        }
}

owner всегда возвращается -1
А hidemodel работает только на viewmodel
PHP:
new knife = GetPlayerWeaponSlot(client, CS_SLOT_KNIFE);
AcceptEntityInput(GetEntPropEnt(knife, Prop_Send, "m_hWeaponWorldModel"), "hideweapon");

как вариант создать массив и в него записывать owner при weaponequip
--- Добавлено позже ---
в общем сделал массив в weaponequip и от него в settransmit все делаю
РАБОТАЕТ, спасибо
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
@hitmany, я говорил инпут "HideWeapon", а не hidemodel, и он отлично работает на оружие (инпут следует отправлять именно пухе). Правда в этом случае пуха остается видимой овнеру.
Ну а по поводу трансмита, ты должен был прошарить пропы и найти у weaponworldmodel проп m_hCombatWeaponParent, после чего сперва узнавать индекс оружия через этот проп, а затем смотреть овнера уже у ентити оружия.
Я использовал оба эти варианта, и если какой-то не работает, то дело только в тебе.
И я тоже когда-то читал эти нелепые посты на АМ про смену индекса модели в пропе, из-за которых выкидывает клиенты. Проблема в том, что ты даже не подумал сам что можно сделать ещё.
Хотя ты попробовал сделать что я сказал, для этого форума это уже победа.
 

hitmany

Участник
Сообщения
171
Реакции
97
@hitmany, я говорил инпут "HideWeapon", а не hidemodel, и он отлично работает на оружие (инпут следует отправлять именно пухе). Правда в этом случае пуха остается видимой овнеру.
Ну а по поводу трансмита, ты должен был прошарить пропы и найти у weaponworldmodel проп m_hCombatWeaponParent, после чего сперва узнавать индекс оружия через этот проп, а затем смотреть овнера уже у ентити оружия.
Я использовал оба эти варианта, и если какой-то не работает, то дело только в тебе.
И я тоже когда-то читал эти нелепые посты на АМ про смену индекса модели в пропе, из-за которых выкидывает клиенты. Проблема в том, что ты даже не подумал сам что можно сделать ещё.
Хотя ты попробовал сделать что я сказал, для этого форума это уже победа.

Спасибо, про m_hCombatWeaponParent не знал, рылся в дампах datamaps и netprops, не нашел что-то похожее. Да и нету как обычно на энтити никаких доков
Про m_hCombatWeaponParent вообще ноль инфы на AM
 
Сверху Снизу