[УСТАРЕЛО] Помогите найти решение - оттолкнуть игроков при касании. Игра "Сумо"

Svyatoy

Участник
Сообщения
335
Реакции
137
Здравствуйте, уважаемые пользователи HLMOD!

Возникла необходимость решить такую задачу:
У нас есть два игрока, мы заранее знаем кто это.
При касании друг друга мы должны их оттолкнуть в сторону противоположную касанию их.
Для наглядности приложу маленькую схемку ниже
(Нарисовал как смог :D)
Дополнение: Мне нужно оттолкнуть их с довольно большой силой. Как будто при касании между ними произошел взрыв и их оттолкнуло взрывной волной :)
Видел на каком-то сервере игру "Сумо" в LR. Вот мне нужно реализовать тоже самое

1.jpg


Был бы крайне признателен тем, кто поможет найти решение.
Самому, к сожалению, не удалось найти
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
режим 17 для ноблока вместо 2 и этого хватит:
SetEntProp(client, Prop_Data, "m_CollisionGroup", 17);
 

Svyatoy

Участник
Сообщения
335
Реакции
137
режим 17 для ноблока вместо 2 и этого хватит:
SetEntProp(client, Prop_Data, "m_CollisionGroup", 17);
Не совсем, это я знаю. Сейчас добавлю в пост доп. инфо.
Мне нужно оттолкнуть их с довольно большой силой. Как будто при касании между ними произошел взрыв и их оттолкнуло взрывной волной :)
Сообщения автоматически склеены:

Дополняю:
Видел на каком-то сервере игру "Сумо" в LR. Вот мне нужно реализовать тоже самое
 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Мне нужно оттолкнуть их с довольно большой силой. Как будто при касании между ними произошел взрыв и их оттолкнуло взрывной волной :)..
Получаешь векторы их движения, делаешь эти-же векторы отрицательными и толкаешь по отрицательным векторам с той скоростью какую сам задашь, или с той которая была у положительных векторов
 

Dragokas

Добрая душа
Сообщения
229
Реакции
213
Попробуйте:

C-подобный:
stock void PushCommonInfected(int client, int target, float distance, float jump_power = 251.0)
{
    static float angle[3], dir[3], current[3], resulting[3];
    
    static int iVelocity = 0;
    if (iVelocity == 0)
        iVelocity = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]");
    
    GetClientEyeAngles(client, angle);
    GetAngleVectors(angle, dir, NULL_VECTOR, NULL_VECTOR);
    NormalizeVector(dir, dir);
    ScaleVector(dir, distance);
    
    GetEntDataVector(target, iVelocity, current);
    resulting[0] = current[0] + dir[0];
    resulting[1] = current[1] + dir[1];
    resulting[2] = jump_power; // min. 251
    
    TeleportEntity(target, NULL_VECTOR, NULL_VECTOR, resulting);
}
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
iVelocity = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]");
Или хотя-бы округлить значения, потом сравнивать.
iVelocity объявлен как целое число а ты ему плавающее присвоить пытаешься. Это нормально?
Сообщения автоматически склеены:

По идее это есть скорость движения модели.
Здесь тоже, если с клавы идет управление, то задавать длину вектора не нужно, нормализовал и этого вполне достаточно, нормализованному задать свою скорость.
Если ты получаешь от какой то ф-ции эту длину то ситуация может быть такая, отталкивается игрок а сзади него стена, и он с успехом пролетает сквозь неё(я правда не уверен, с такими сущностями игрока, от первого лица, я не работал, только начинаю). Может быть физбоксы отработают и он просто отлетит от стены, но в любом случае при указании длинны вектора модель становится неуправляемой, нужно предусмотреть условия выхода до конца длины.
 
Последнее редактирование:

Dragokas

Добрая душа
Сообщения
229
Реакции
213
iVelocity объявлен как целое число а ты ему плавающее присвоить пытаешься. Это нормально?
Откуда вы это взяли еще и приписали меня в авторы? 🤦 Это не мой код.

По идее это есть скорость движения модели.
Здесь тоже, если с клавы идет управление, то задавать длину вектора не нужно, нормализовал и этого вполне достаточно, нормализованному задать свою скорость.
Так и есть, текущая скорость, к которой добавляется направление атакующего игрока.
Если не задавать длину, то не сможете регулировать силу отскока по осям X, Z.

Если ты получаешь от какой то ф-ции эту длину то ситуация может быть такая, отталкивается игрок а сзади него стена, и он с успехом пролетает сквозь неё(я правда не уверен, с такими сущностями игрока, от первого лица, я не работал, только начинаю).
С какого перепугу?
В TeleportEntity модифицируется только скорость, но не трогаются координаты.
Он никак не может пролететь сквозь стену, если у вас не включен какой-нибудь чит и стена неразрушаема.

Может быть физбоксы отработают и он просто отлетит от стены, но в любом случае при указании длинны вектора модель становится неуправляемой, нужно предусмотреть условия выхода до конца длины.
Ну это уже вам решать, должен объект ударяться о стену или нет.
В условиях задачи этого не было.
 

Svyatoy

Участник
Сообщения
335
Реакции
137
Попробуйте:

C-подобный:
stock void PushCommonInfected(int client, int target, float distance, float jump_power = 251.0)
{
    static float angle[3], dir[3], current[3], resulting[3];
   
    static int iVelocity = 0;
    if (iVelocity == 0)
        iVelocity = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]");
   
    GetClientEyeAngles(client, angle);
    GetAngleVectors(angle, dir, NULL_VECTOR, NULL_VECTOR);
    NormalizeVector(dir, dir);
    ScaleVector(dir, distance);
   
    GetEntDataVector(target, iVelocity, current);
    resulting[0] = current[0] + dir[0];
    resulting[1] = current[1] + dir[1];
    resulting[2] = jump_power; // min. 251
   
    TeleportEntity(target, NULL_VECTOR, NULL_VECTOR, resulting);
}
Спасибо за помощь, но данная задача уже устарела т.к. было принято решение изменить концепцию данной задачи
 
Сверху Снизу