prop_ragdoll и Grub (ScaleVector(vecVel, 50.0);) игра CSS

Banana

Участник
Сообщения
892
Реакции
113
ВНИМАНИЕ. Код сильно упростил чтоб передать саму реализацию.

создаю куклу:
C-подобный:
int tempRag = CreateEntityByName("prop_ragdoll");
            decl String:sModelName[PLATFORM_MAX_PATH];
            DispatchKeyValue(tempRag, "model", sModelName);
            DispatchSpawn(tempRag);
            SetEntProp(tempRag, Prop_Data, "m_nSolidType", 1);
            SetEntProp(tempRag, Prop_Data, "m_CollisionGroup", 2);
            TeleportEntity(tempRag, vecPos, NULL_VECTOR, NULL_VECTOR);

Тащу ее с помощью граба:
C-подобный:
public OnGameFrame()
{
    for (int client = 1; client <= MaxClients; client++)
    {
        if (!IsValidClient(client) || !IsPlayerAlive(client)) continue;
            GrubFunc(client);
    }
}

void GrubFunc(int client)
{
    int entity = EntRefToEntIndex(g_iGrabbed[client]);
    if (entity != INVALID_ENT_REFERENCE && entity > MaxClients && IsValidEdict(entity))
    {
        float vecView[3], vecFwd[3], vecPos[3], vecVel[3];

        GetClientEyeAngles(client, vecView);
        GetAngleVectors(vecView, vecFwd, NULL_VECTOR, NULL_VECTOR);
        GetClientEyePosition(client, vecPos);
        
        vecPos[0] += vecFwd[0] * 120.0;
        vecPos[1] += vecFwd[1] * 120.0;
        vecPos[2] += vecFwd[2] * 120.0;
        
        GetEntPropVector(entity, Prop_Send, "m_vecOrigin", vecFwd);
        SubtractVectors(vecPos, vecFwd, vecVel);
        ScaleVector(vecVel, 50.0);
        
        TeleportEntity(entity, NULL_VECTOR, NULL_VECTOR, vecVel);
    }
}


Проблема в том что когда я хватаю грабом бочку то она четко следует за грабом (как привязанная), а когда я хватаю prop_ragdoll он еле волочится за мной ... пробовал играться ScaleVector(vecVel, 50.0); - хоть 5000 ставь - разницы не будет...

prop_ragdoll как будто бы слишком тяжелый... кто знает как испрвить? Игра CSS.
Сообщения автоматически склеены:

Сережа (который оставил реакцию) ты просто позиционируешь себя как клоун, я правильно понял твою реакцию?
 
Последнее редактирование:

Banana

Участник
Сообщения
892
Реакции
113
А зачем тебе именно prop_ragdoll ?
Если мне нужно управлять трупом после смерти то я создаю prop_dynamic_override
если использовать это то труп будет просто стоять с руками в стороны.. (CSS)

а нужно чтоб он вел себя как труп...
Сообщения автоматически склеены:

Баз рико или феникса не обойтись по идее)
 
Последнее редактирование:

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
если использовать это то труп будет просто стоять с руками в стороны.. (CSS)

а нужно чтоб он вел себя как труп...
Сообщения автоматически склеены:

Баз рико или феникса не обойтись по идее)
Ну ты ...
Вот посмотри как норм, хотел выложить в ресурсы, но пока не доделал до того что хотел.


C++:
#include <sdktools>

#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo =
{
    name = "[OS] Light Death",
    author = "KiKiEEKi ( DS: kikieeki | vk.com/kikieeki )",
    version = "(1.0)"
};

char g_sModel[] = "models/Plantlife/monkeyflower/jn_monkeyflower_single.mdl";

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

public void OnMapStart()
{
    PrecacheModel(g_sModel, true);
}

void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    
    if(iClient)
    {
        int iEnt = GetEntPropEnt(iClient, Prop_Send, "m_hRagdoll");
        
        char sBuf[256];
        float fPos[3], fAngl[3];
        GetClientModel(iClient, sBuf, sizeof sBuf);
        GetEntPropVector(iEnt, Prop_Send, "m_vecOrigin", fPos);
        if (iEnt != -1) RemoveEdict(iEnt);
        GetClientAbsAngles(iClient, fAngl);

        iEnt = CreateEntityByName("prop_dynamic_override");
        DispatchKeyValue(iEnt, "model", sBuf);
        DispatchKeyValue(iEnt, "solid", "0");
        DispatchSpawn(iEnt);
        TeleportEntity(iEnt, fPos, fAngl, NULL_VECTOR);
        SetVariantString("Death1");
        AcceptEntityInput(iEnt, "SetAnimation");

        iEnt = CreateEntityByName("prop_dynamic_override");
        DispatchKeyValue(iEnt, "model", g_sModel);
        DispatchKeyValue(iEnt, "solid", "0");
        DispatchSpawn(iEnt);
        SetEntPropFloat(iEnt, Prop_Data, "m_flModelScale", 0.5);
        TeleportEntity(iEnt, fPos, fAngl, NULL_VECTOR);
    }
}
 

Banana

Участник
Сообщения
892
Реакции
113
Ну ты ...
Вот посмотри как норм, хотел выложить в ресурсы, но пока не доделал до того что хотел.


C++:
#include <sdktools>

#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo =
{
    name = "[OS] Light Death",
    author = "KiKiEEKi ( DS: kikieeki | vk.com/kikieeki )",
    version = "(1.0)"
};

char g_sModel[] = "models/Plantlife/monkeyflower/jn_monkeyflower_single.mdl";

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

public void OnMapStart()
{
    PrecacheModel(g_sModel, true);
}

void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
 
    if(iClient)
    {
        int iEnt = GetEntPropEnt(iClient, Prop_Send, "m_hRagdoll");
     
        char sBuf[256];
        float fPos[3], fAngl[3];
        GetClientModel(iClient, sBuf, sizeof sBuf);
        GetEntPropVector(iEnt, Prop_Send, "m_vecOrigin", fPos);
        if (iEnt != -1) RemoveEdict(iEnt);
        GetClientAbsAngles(iClient, fAngl);

        iEnt = CreateEntityByName("prop_dynamic_override");
        DispatchKeyValue(iEnt, "model", sBuf);
        DispatchKeyValue(iEnt, "solid", "0");
        DispatchSpawn(iEnt);
        TeleportEntity(iEnt, fPos, fAngl, NULL_VECTOR);
        SetVariantString("Death1");
        AcceptEntityInput(iEnt, "SetAnimation");

        iEnt = CreateEntityByName("prop_dynamic_override");
        DispatchKeyValue(iEnt, "model", g_sModel);
        DispatchKeyValue(iEnt, "solid", "0");
        DispatchSpawn(iEnt);
        SetEntPropFloat(iEnt, Prop_Data, "m_flModelScale", 0.5);
        TeleportEntity(iEnt, fPos, fAngl, NULL_VECTOR);
    }
}
это конечно хорошо, но как взаимодействовать с таким трупом? Ты сам к нему применить граб пробовал?
Нужно получить int entity = GetClientAimTarget(client, false); на который смотришь ( на этот самый труп) и потом с помощью void GrubFunc(int client) (описанной выше в 1 посте) - его таскать.

prop_dynamic_override - это статический обьект с которым нельзя взаимодействовать, он как проиграл свою анимацию (лечь) так и будет лежать и повлиять на него не получится.

PS. На сколько я вижу - этот участок кода лишний в примере?:

C-подобный:
iEnt = CreateEntityByName("prop_dynamic_override");
        DispatchKeyValue(iEnt, "model", g_sModel);
        DispatchKeyValue(iEnt, "solid", "0");
        DispatchSpawn(iEnt);
        SetEntPropFloat(iEnt, Prop_Data, "m_flModelScale", 0.5);
        TeleportEntity(iEnt, fPos, fAngl, NULL_VECTOR);
 
Последнее редактирование:

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
это конечно хорошо, но как взаимодействовать с таким трупом? Ты сам к нему применить граб пробовал?
Нужно получить int entity = GetClientAimTarget(client, false); на который смотришь ( на этот самый труп) и потом с помощью void GrubFunc(int client) (описанной выше в 1 посте) - его таскать.

prop_dynamic_override - это статический обьект с которым нельзя взаимодействовать, он как проиграл свою анимацию (лечь) так и будет лежать и повлиять на него не получится.

PS. На сколько я вижу - этот участок кода лишний в примере?:

C-подобный:
iEnt = CreateEntityByName("prop_dynamic_override");
        DispatchKeyValue(iEnt, "model", g_sModel);
        DispatchKeyValue(iEnt, "solid", "0");
        DispatchSpawn(iEnt);
        SetEntPropFloat(iEnt, Prop_Data, "m_flModelScale", 0.5);
        TeleportEntity(iEnt, fPos, fAngl, NULL_VECTOR);
Поменяй на prop_physics_override тогда и все, в чем проблема то?
 
Сверху Снизу