Стрельба по трупам (трупы не естественные)

А вы любите глумиться над трупами врагов?


  • Всего проголосовало
    14

romchik4021

Участник
Сообщения
42
Реакции
15
Доброго времени!

С самого выхода CS:GO я пришел в недоумение, после жаркой перестрелки и убийства игрока, хочется на последок прострелить башку его трупу, так сказать "контрольный в голову", но сразу же после убийства игрока, его моделька становится как бы "призрачной", то есть видеть то труп видно, но вот как либо с ним взаимодействовать не получается! Ни ножом на последок не порезать, ни пару пуль всадить, и даже взрыв гранаты не двигает труп с места... Брызг крови при этом тоже нет (в отличии от той же CS:S), из-за этого сразу приходишь в реальность и понимаешь, что это всего лишь игра, при чем с очень грубым косяком! Вопрос, есть ли какое то решение, поправить данное недоразумение, что бы физика трупов была как в CS:S? Может есть переменная какая нибудь или же плагином можно исправить?
 

komashchenko

Идиот
Сообщения
916
Реакции
2,569
Переделал с TTT, должно быть то что вам нужно

PHP:
#pragma semicolon 1
#pragma newdecls required
#include sdktools

public void OnPluginStart()
{
    HookEvent("player_death", Event_player_death, EventHookMode_Pre);
}

public Action Event_player_death(Event event, const char[] menu, bool dontBroadcast)
{
    int iClient = GetClientOfUserId(event.GetInt("userid"));
    if(iClient)
    {
        int iRagdoll = GetEntPropEnt(iClient, Prop_Send, "m_hRagdoll");
        if (iRagdoll != -1)
        {
            RemoveEdict(iRagdoll);
        }
        
        char sBuf[256];
        float origin[3], angles[3], velocity[3];
        GetClientModel(iClient, sBuf, sizeof sBuf);
        GetClientAbsOrigin(iClient, origin);
        GetClientAbsAngles(iClient, angles);
        GetEntPropVector(iClient, Prop_Data, "m_vecAbsVelocity", velocity);
        
        iRagdoll = CreateEntityByName("prop_ragdoll");
        DispatchKeyValue(iRagdoll, "model", sBuf);
        SetEntProp(iRagdoll, Prop_Data, "m_nSolidType", 6);
        SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 5);
        SetEntityMoveType(iRagdoll, MOVETYPE_NONE);
        AcceptEntityInput(iRagdoll, "DisableMotion");
        ActivateEntity(iRagdoll);
        DispatchSpawn(iRagdoll);
        if (GetVectorLength(velocity) >= 500)
        {
            TeleportEntity(iRagdoll, origin, angles, NULL_VECTOR);
        }
        else
        {
            TeleportEntity(iRagdoll, origin, angles, velocity);
        }
        SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 2);
        AcceptEntityInput(iRagdoll, "EnableMotion");
        SetEntityMoveType(iRagdoll, MOVETYPE_VPHYSICS);
        SetEntPropEnt(iClient, Prop_Send, "m_hRagdoll", iRagdoll);
    }
}
 

Faya™

Жуестер
Сообщения
867
Реакции
457
Переделал с TTT, должно быть то что вам нужно

PHP:
#pragma semicolon 1
#pragma newdecls required
#include sdktools

public void OnPluginStart()
{
    HookEvent("player_death", Event_player_death, EventHookMode_Pre);
}

public Action Event_player_death(Event event, const char[] menu, bool dontBroadcast)
{
    int iClient = GetClientOfUserId(event.GetInt("userid"));
    if(iClient)
    {
        int iRagdoll = GetEntPropEnt(iClient, Prop_Send, "m_hRagdoll");
        if (iRagdoll != -1)
        {
            RemoveEdict(iRagdoll);
        }
       
        char sBuf[256];
        float origin[3], angles[3], velocity[3];
        GetClientModel(iClient, sBuf, sizeof sBuf);
        GetClientAbsOrigin(iClient, origin);
        GetClientAbsAngles(iClient, angles);
        GetEntPropVector(iClient, Prop_Data, "m_vecAbsVelocity", velocity);
       
        iRagdoll = CreateEntityByName("prop_ragdoll");
        DispatchKeyValue(iRagdoll, "model", sBuf);
        SetEntProp(iRagdoll, Prop_Data, "m_nSolidType", 6);
        SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 5);
        SetEntityMoveType(iRagdoll, MOVETYPE_NONE);
        AcceptEntityInput(iRagdoll, "DisableMotion");
        ActivateEntity(iRagdoll);
        DispatchSpawn(iRagdoll);
        if (GetVectorLength(velocity) >= 500)
        {
            TeleportEntity(iRagdoll, origin, angles, NULL_VECTOR);
        }
        else
        {
            TeleportEntity(iRagdoll, origin, angles, velocity);
        }
        SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 2);
        AcceptEntityInput(iRagdoll, "EnableMotion");
        SetEntityMoveType(iRagdoll, MOVETYPE_VPHYSICS);
        SetEntPropEnt(iClient, Prop_Send, "m_hRagdoll", iRagdoll);
    }
}
Конечно это более реалистично, но все таки на деле это выглядит не очень, т.к после смерти удаляется модель и сравниться новая которую можно двигать, но это выглядит не естественно как то...
 

kleuser

Участник
Сообщения
1,838
Реакции
732
Это было сделано в угоду оптимизации якобы. Так говорили сами разработчики. Проще уже удалять трупы, что бы желания не возникало издеваться надо ними.
 

mika

Участник
Сообщения
1,069
Реакции
641
Это было сделано в угоду оптимизации якобы. Так говорили сами разработчики. Проще уже удалять трупы, что бы желания не возникало издеваться надо ними.
Видимо это единственное, что они сделали "в угоду оптимизации".
 

xek

Рыба клоун
Сообщения
1,652
Реакции
636
В первых версиях CS GO такая возможность была, но ее вырезали.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@komashchenko, м/б, просто отлавливать создание трупа и менять ему какие-то параметры (коллизию или модель)?
 

komashchenko

Идиот
Сообщения
916
Реакции
2,569
@Grey83, Не знаю, я просто взял реализацию TTT (Вспомнил что там такое есть), думаю они таких костылей не делали, если бы хватало простой смены параметров.
 

romchik4021

Участник
Сообщения
42
Реакции
15
Переделал с TTT, должно быть то что вам нужно

PHP:
#pragma semicolon 1
#pragma newdecls required
#include sdktools

public void OnPluginStart()
{
    HookEvent("player_death", Event_player_death, EventHookMode_Pre);
}

public Action Event_player_death(Event event, const char[] menu, bool dontBroadcast)
{
    int iClient = GetClientOfUserId(event.GetInt("userid"));
    if(iClient)
    {
        int iRagdoll = GetEntPropEnt(iClient, Prop_Send, "m_hRagdoll");
        if (iRagdoll != -1)
        {
            RemoveEdict(iRagdoll);
        }
      
        char sBuf[256];
        float origin[3], angles[3], velocity[3];
        GetClientModel(iClient, sBuf, sizeof sBuf);
        GetClientAbsOrigin(iClient, origin);
        GetClientAbsAngles(iClient, angles);
        GetEntPropVector(iClient, Prop_Data, "m_vecAbsVelocity", velocity);
      
        iRagdoll = CreateEntityByName("prop_ragdoll");
        DispatchKeyValue(iRagdoll, "model", sBuf);
        SetEntProp(iRagdoll, Prop_Data, "m_nSolidType", 6);
        SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 5);
        SetEntityMoveType(iRagdoll, MOVETYPE_NONE);
        AcceptEntityInput(iRagdoll, "DisableMotion");
        ActivateEntity(iRagdoll);
        DispatchSpawn(iRagdoll);
        if (GetVectorLength(velocity) >= 500)
        {
            TeleportEntity(iRagdoll, origin, angles, NULL_VECTOR);
        }
        else
        {
            TeleportEntity(iRagdoll, origin, angles, velocity);
        }
        SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 2);
        AcceptEntityInput(iRagdoll, "EnableMotion");
        SetEntityMoveType(iRagdoll, MOVETYPE_VPHYSICS);
        SetEntPropEnt(iClient, Prop_Send, "m_hRagdoll", iRagdoll);
    }
}
Большое спасибо за код, фактически то что нужно, но есть некоторые моменты... Например во время убийства, тело падает немножечко не естественно (у меня еще физика немного форсирована для эпик-эффекта):
sm_cvar phys_pushscale 900
sm_cvar cs_enable_player_physics_box 1
Из-за плагина, при убийстве не возникает эффекта эпичного "отлёта" тела (оно просто замертво падает на землю, но когда уже стреляешь по трупу, форс-физика снова работает и труп подлетает, это мне нравится) и во время стрельбы, резни по трупу, нет эффекта брызг крови... Вот если бы ты смог эти моменты поправить, был бы очень благодарен! Спасибо что не прошел мимо!
--- Добавлено позже ---
Это было сделано в угоду оптимизации якобы. Так говорили сами разработчики. Проще уже удалять трупы, что бы желания не возникало издеваться надо ними.
Со стороны разработчиков это очень некомпетентная отговорка, зачем делать явный регресс физики, в угоду псевдо-оптимизации... На крайний случай можно было бы вынести этот параметр в конфиг и каждый б сам решал, в силу производительности своего сервера... Тем более с каждым годом железяки становятся мощнее, как клиентские, так и серверные.

Вспомните, как в CSS все было динамично, мусор на картах, взаимодействие с различными объектами (можно было даже газировку купить на cs_office), даже та самая "издёвка над трупами" приводила в ярость противника, и вызывала много эмоций, игра была поистине живая и реалистичная, а в CSGO только красивые текстуры карт, качественный звук и скины оружия... Про физику и очевидные вещи забыли совсем... Надежды на Valve уже мало, их интересует только прибыль, еженедельные обновления ничего существенного не вносят, кроме "невидимых фиксов", изменений интерфейса и скинов... Тем не менее хочется двигаться в ногу со временем и наслаждаться прелестями обновленного движка Source... Мне CSGO очень симпатична, жаль что приходится искать для неё всевозможные костыли...

Прошу сильно не ругать меня, это мое субъективное мнение и некоторые не согласятся со мной, просто хочется взять все самое лучшее, за что так полюбилась CSS и перенести это в новую CSGO, в этом я считаю и заключается прогресс...
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
ну можно попробовать заставить рэгдолл принять ту же позу, что и игрок после смерти (не в точности, что была в момент смерти, но похоже):
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools>

public void OnPluginStart()
{
    HookEvent("player_death", Event_player_death, EventHookMode_Pre);
}

public void Event_player_death(Event event, const char[] menu, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(!client) return;

    int iRagdoll = GetEntPropEnt(client, Prop_Send, "m_hRagdoll");
    if(iRagdoll != -1) RemoveEdict(iRagdoll);

    float origin[3], angles[3], velocity[3];
    GetClientAbsOrigin(client, origin);
    GetClientAbsAngles(client, angles);
    GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", velocity);
    int mdl = GetEntProp(client, Prop_Data, "m_nModelIndex");
    int seq = GetEntProp(client, Prop_Send, "m_nSequence");

    iRagdoll = CreateEntityByName("prop_ragdoll");
    if(iRagdoll == -1) return;

    SetEntProp(client, Prop_Data, "m_nModelIndex", mdl);
    SetEntProp(iRagdoll, Prop_Data, "m_nSolidType", 6);
    SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 5);
    SetEntityMoveType(iRagdoll, MOVETYPE_NONE);
    AcceptEntityInput(iRagdoll, "DisableMotion");
    SetEntProp(iRagdoll, Prop_Send, "m_nSequence", seq);
    ActivateEntity(iRagdoll);
    DispatchSpawn(iRagdoll);
    TeleportEntity(iRagdoll, origin, angles, velocity);
    SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 2);
    AcceptEntityInput(iRagdoll, "EnableMotion");
    SetEntityMoveType(iRagdoll, MOVETYPE_VPHYSICS);
    SetEntPropEnt(client, Prop_Send, "m_hRagdoll", iRagdoll);
}

P.S. Интересно, а вот этот параметр из дампа нетпропов может что-то изменить в отношении рэгдолла?
C-подобный:
Member: m_bClientSideRagdoll (offset 584) (type integer) (bits 1) (Unsigned)
 

Faya™

Жуестер
Сообщения
867
Реакции
457
ну можно попробовать заставить рэгдолл принять ту же позу, что и игрок после смерти (не в точности, что была в момент смерти, но похоже):
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools>

public void OnPluginStart()
{
    HookEvent("player_death", Event_player_death, EventHookMode_Pre);
}

public void Event_player_death(Event event, const char[] menu, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(!client) return;

    int iRagdoll = GetEntPropEnt(client, Prop_Send, "m_hRagdoll");
    if(iRagdoll != -1) RemoveEdict(iRagdoll);

    float origin[3], angles[3], velocity[3];
    GetClientAbsOrigin(client, origin);
    GetClientAbsAngles(client, angles);
    GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", velocity);
    int mdl = GetEntProp(client, Prop_Data, "m_nModelIndex");
    int seq = GetEntProp(client, Prop_Send, "m_nSequence");

    iRagdoll = CreateEntityByName("prop_ragdoll");
    if(iRagdoll == -1) return;

    SetEntProp(client, Prop_Data, "m_nModelIndex", mdl);
    SetEntProp(iRagdoll, Prop_Data, "m_nSolidType", 6);
    SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 5);
    SetEntityMoveType(iRagdoll, MOVETYPE_NONE);
    AcceptEntityInput(iRagdoll, "DisableMotion");
    SetEntProp(iRagdoll, Prop_Send, "m_nSequence", seq);
    ActivateEntity(iRagdoll);
    DispatchSpawn(iRagdoll);
    TeleportEntity(iRagdoll, origin, angles, velocity);
    SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 2);
    AcceptEntityInput(iRagdoll, "EnableMotion");
    SetEntityMoveType(iRagdoll, MOVETYPE_VPHYSICS);
    SetEntPropEnt(client, Prop_Send, "m_hRagdoll", iRagdoll);
}

P.S. Интересно, а вот этот параметр из дампа нетпропов может что-то изменить в отношении рэгдолла?
C-подобный:
Member: m_bClientSideRagdoll (offset 584) (type integer) (bits 1) (Unsigned)
Что никто не пробовал что ли?
У меня крашит сервер во время убийства
 

Banana

Участник
Сообщения
892
Реакции
113
Переделал с TTT, должно быть то что вам нужно

PHP:
#pragma semicolon 1
#pragma newdecls required
#include sdktools

public void OnPluginStart()
{
    HookEvent("player_death", Event_player_death, EventHookMode_Pre);
}

public Action Event_player_death(Event event, const char[] menu, bool dontBroadcast)
{
    int iClient = GetClientOfUserId(event.GetInt("userid"));
    if(iClient)
    {
        int iRagdoll = GetEntPropEnt(iClient, Prop_Send, "m_hRagdoll");
        if (iRagdoll != -1)
        {
            RemoveEdict(iRagdoll);
        }
       
        char sBuf[256];
        float origin[3], angles[3], velocity[3];
        GetClientModel(iClient, sBuf, sizeof sBuf);
        GetClientAbsOrigin(iClient, origin);
        GetClientAbsAngles(iClient, angles);
        GetEntPropVector(iClient, Prop_Data, "m_vecAbsVelocity", velocity);
       
        iRagdoll = CreateEntityByName("prop_ragdoll");
        DispatchKeyValue(iRagdoll, "model", sBuf);
        SetEntProp(iRagdoll, Prop_Data, "m_nSolidType", 6);
        SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 5);
        SetEntityMoveType(iRagdoll, MOVETYPE_NONE);
        AcceptEntityInput(iRagdoll, "DisableMotion");
        ActivateEntity(iRagdoll);
        DispatchSpawn(iRagdoll);
        if (GetVectorLength(velocity) >= 500)
        {
            TeleportEntity(iRagdoll, origin, angles, NULL_VECTOR);
        }
        else
        {
            TeleportEntity(iRagdoll, origin, angles, velocity);
        }
        SetEntProp(iRagdoll, Prop_Data, "m_CollisionGroup", 2);
        AcceptEntityInput(iRagdoll, "EnableMotion");
        SetEntityMoveType(iRagdoll, MOVETYPE_VPHYSICS);
        SetEntPropEnt(iClient, Prop_Send, "m_hRagdoll", iRagdoll);
    }
}
Феникс ответе пожалуйста мне тут - prop_ragdoll и Grub (ScaleVector(vecVel, 50.0);) игра CSS темы немного перекликаются.
 
Сверху Снизу