prop_dynamic толчек.. (сдвинуть с места)

Banana

Участник
Сообщения
892
Реакции
113
Здравствуйте, подскажите пожалуйста как модель типа prop_dynamic сдвинуть с места толчком? Спасибо.
 

Banana

Участник
Сообщения
892
Реакции
113
в том то и дело что TeleportEntity (толчек) применим только к prop_physics ... Просто телепортнуть - да, тоже работает.. но вот чтоб толкнуть - нет.
Сообщения автоматически склеены:

velocity - вот этот параметр применимо к prop_dynamic всегда NULL_VECTOR ... (на практике)
 

Dragokas

Добрая душа
Сообщения
229
Реакции
213
Нужно создать энтити (ну или "подменить" читай пересоздать у существующей) класс prop_dynamic_override.
Это позволит взаимодействовать с моделью как с физической, но при условии что такая поддержка заложена в саму модель.

Также некоторые модели можно пересоздать и с классом prop_physics.
Уж не знаю, как это проверить иначе, чем через эксперимент. Вопрос к мододелам.

Далее, как уже вы упомянули, применить velocity.
Вот пример, небольшого толчка игрока в направлении ближайшего к нему игрока (подпрыг):

C-подобный:
// smooth teleport in eye view direction (with collision)
//
stock bool TeleportPlayerSmooth(int client, float distance, float jump_power = 251.0)
{
    static float angle[3], dir[3], current[3], resulting[3], vecOrigin[3], vecTarget[3];
   
    static int iVelocity = 0;
    if (iVelocity == 0)
        iVelocity = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]");
        //GetEntPropVector(client, Prop_Send, "m_vecVelocity", current);
   
    int iNear = GetNearestClient(client, -1);
    if (iNear != 0) {
        GetClientAbsOrigin(client, vecOrigin);
        GetClientAbsOrigin(iNear, vecTarget);
        GetVectorOrigins(vecOrigin, vecTarget, angle);
        TeleportEntity(client, NULL_VECTOR, angle, NULL_VECTOR);
    }
   
    GetClientEyeAngles(client, angle);
   
    //dir[0] = Cosine(DegToRad(angle[1])) * distance;
    //dir[1] = Sine(DegToRad(angle[1])) * distance;
    GetAngleVectors(angle, dir, NULL_VECTOR, NULL_VECTOR);
    ScaleVector(dir, distance);
   
    GetEntDataVector(client, iVelocity, current);
    resulting[0] = current[0] + dir[0];
    resulting[1] = current[1] + dir[1];
    resulting[2] = jump_power; // min. 251
   
    TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, resulting);
    return true;
}

int GetNearestClient(int client, int team) {
    float tpos[3], spos[3], dist, mindist;
    int i, iNear;
    mindist = 0.0;
    iNear = -1;
    GetClientAbsOrigin(client, tpos);
   
    for (i = 1; i <= MaxClients; i++) {
        if (i != client && IsClientInGame(i) && (GetClientTeam(i) == team || (team == -1 && GetClientTeam(i) != 1)) && IsPlayerAlive(i)) {
            GetClientAbsOrigin(i, spos);
            dist = GetVectorDistance(tpos, spos, false);
            if (dist < mindist || mindist == 0.0) {
                mindist = dist;
                iNear = i;
            }
        }
    }
    return iNear;
}

Для энтити код будет сильно отличаться в части получения свойств, но надеюсь общую суть вы уловите.
 
Сверху Снизу