Коллизия

Nebraska

Участник
Сообщения
234
Реакции
299
Здравствуйте. Есть возможность задать коллизию объекту в зависимости от выбранной команды? Например, создаю prop_dynamic_override, команда CT может с ней соприкасаться, команда T - нет.
--- Добавлено позже ---
На этом форуме вообще с серьёзными вопросами помогают? Или только могут помочь с выводом сообщения в чат и подобной ерундой? Столько "экспертов", но при этом сдуваются на серьёзных темах.
 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Ты так лучше не ставь вопрос. А то получится как у меня на "Оленях" получилось, ждал ответа, ждал, потом спросил, все там тупые или нет. Получил по тыкве, но ответ так и не получил.

prop_dynamic_override -
если посмотреть в хаммере, не полениться, увидишь вот что:
lesson1.jpg
видно 3 типа коллизий, для того что бы увидеть как программно удобнее записать, нужно нажать кнопочку SmartEdit.
Потом, просто, в зависимости от команды игроков, отключаешь или включаешь коллизию.
например вот так, запросто:
C-подобный:
if(team == CT)DispatchKeyValue(ent, "solid", "6"); или DispatchKeyValue(ent, "solid", "2");
else DispatchKeyValue(ent, "solid", "0");
 
Последнее редактирование:

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #3
@tonline_kms65_1, не могу понять почему 6 присваиваешь. 2 еще понятно, а вот 6...
И почему передаешь как строку, разве не целочисленное там число?
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@tonline_kms65_1, не могу понять почему 6 присваиваешь. 2 еще понятно, а вот 6...
И почему передаешь как строку, разве не целочисленное там число?

6 коллизия - это физбокс (если создатель модели этот вид коллизии предусмотрел, я например всегда для своих моделей делаю, на всякий случай, даже если и не собираю)
lesson2.jpg
2 коллизия - это что-то типа ящика по размерам референса модели(как раз 2 и не совсем понятно, это или хитбокс, или баундингбокс. Я делаю физбоксы и хитбоксы)
Насчет параметра, по барабану, я и так и так пробовал, работает если задано. Но вообще это конечно int.
 
Последнее редактирование:

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #5
@tonline_kms65_1, если тогда не проблема, не подскажешь все варианты коллизий?
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@tonline_kms65_1, если тогда не проблема, не подскажешь все варианты коллизий?
Ты в хаммер модель вытащи и посмотри, там для этой ENT и используемой в ней модели видно будет все, что можно использовать.
можно в Half-Life Model Viewer посмотреть саму модель, но в принципе все что нужно, можно увидеть в хаммере.

Если, к примеру, у модели нет физбокса, то ты его (6) хоть завключайся, он не будет работать, так как его просто нет. Так же и с остальным.
--- Добавлено позже ---
Вот еще пример - 3d модель Дерево.
lesson3.jpg
есть референс (само дерево, сквозь него можно свободно пройти, может быть анимация)
есть физбокс - ствол (красным) в ствол ты упрешься, и не пройдешь.
если сделать хитбокс, то можно будет это дерево убить, поджечь, и т.д. это все можно предусмотреть при компиляции модели (в .qc файле) Здесь уточню - программно можно так же убить, поджечь, и т.д. Но если делаешь карту в хаммере, там программного кода как в юнити нет, можно использовать свойства ENT, но по мне, проще предусмотреть вс в самой 3D модели.
 
Последнее редактирование:

Nebraska

Участник
Сообщения
234
Реакции
299
@tonline_kms65_1, спасибо за разъяснения, дружище :ab: много полезного написал, действительно. Да, ты прав, задал я вопрос не совсем корректно, за это приношу свои извинения, был вымотан, не мог собраться с мыслями. Опишу более подробнее. В общем, спавню я модельку подарка для спецназа. Для команды террористов, я ее скрываю (SDKHook_SetTransmit), но террорист может в нее упереться. Разумеется, подобрать может её только спецназовец, но вот хочется так же сделать, чтобы именно коллизия работала на спецназовца, а террор просто будет проходить насквозь. Вопрос, действительно, серьезный. Прибегал к костылям, сравнивал расстояние между подарком и спецназовцем, имитировал подбор подарка. Но это очень сомнительный и полу-рабочий вариант. Есть, конечно, такой хук - SDKHook_ShouldCollide, но не совсем понятно, как он работает. Да и работает он тоже не очень корректно, игрок туго проходит через модельку. Также, есть расширение для этого плана (CH_ShouldCollide и CH_PassFilter - функции), но там также коллизия неплавная. В общем, к чему я это всё. Может идейка будет, костыльным образом обойти эту проблему. Моя задача заключается в том, чтобы команда террориста не натыкалась на нее вообще (плавная коллизия). Способ реализации неважен, главное - чтобы работало на 100 %.
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
@tonline_kms65_1, спасибо за разъяснения, дружище :ab: много полезного написал, действительно. Да, ты прав, задал я вопрос не совсем корректно, за это приношу свои извинения, был вымотан, не мог собраться с мыслями. Опишу более подробнее. В общем, спавню я модельку подарка для спецназа. Для команды террористов, я ее скрываю (SDKHook_SetTransmit), но террорист может в нее упереться. Разумеется, подобрать может её только спецназовец, но вот хочется так же сделать, чтобы именно коллизия работала на спецназовца, а террор просто будет проходить насквозь. Вопрос, действительно, серьезный. Прибегал к костылям, сравнивал расстояние между подарком и спецназовцем, имитировал подбор подарка. Но это очень сомнительный и полу-рабочий вариант. Есть, конечно, такой хук - SDKHook_ShouldCollide, но не совсем понятно, как он работает. Да и работает он тоже не очень корректно, игрок туго проходит через модельку. Также, есть расширение для этого плана (CH_ShouldCollide и CH_PassFilter - функции), но там также коллизия неплавная. В общем, к чему я это всё. Может идейка будет, костыльным образом обойти эту проблему. Моя задача заключается в том, чтобы команда террориста не натыкалась на нее вообще (плавная коллизия). Способ реализации неважен, главное - чтобы работало на 100 %.

А как на счет этого ?

PHP:
#include <sdkhooks>

// Подарок создался
{
    SDKHook(iEnt, SDKHook_StartTouch,    OnStartTouch); // Или SDKHook_Touch
    SDKHook(iEnt, SDKHook_SetTransmit, OnTransmit);
}

public Action OnStartTouch(int iGift, int iEnt)
{
    if(iEnt > 0 && iEnt <= MaxClients && GetClientTeam(iEnt) == 3) // IsPlayerAlive
    {
        // Спецназовец дотронулся до подарка
    }
}

public Action OnTransmit(int iGift, int iClient)
{
    return GetClientTeam(iEnt) == 3 ? Plugin_Continue:Plugin_Stop;
}
 
Последнее редактирование:

Nebraska

Участник
Сообщения
234
Реакции
299
@Someone, ты, наверное, не вчитывался в последнее моё сообщение. Я же говорю, это у меня реализовано, таким образом я только визуально скрою подарок. Но мне нужно еще, чтобы террорист не задевал его, а проходил насквозь.
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
@Someone, ты, наверное, не вчитывался в последнее моё сообщение. Я же говорю, это у меня реализовано, таким образом я только визуально скрою подарок. Но мне нужно еще, чтобы террорист не задевал его, а проходил насквозь.
А ты видимо не проверял мой способ.
 

Nebraska

Участник
Сообщения
234
Реакции
299
@Someone, зачем мне его проверять, дружище?) это никак не решит мою проблему. У меня точно такой же код, только пару проверок отличаются. SDKHook_SetTransmit блокирует только видимость сущности ведь.
 
Последнее редактирование:

Someone

Участник
Сообщения
1,933
Реакции
1,653
@Someone, зачем мне его проверять, дружище?) это никак не решит мою проблему. У меня точно такой же код, только пару проверок отличаются. SDKHook_SetTransmit блокирует только видимость сущности ведь.
Мда. И тебя не смущает, что там не только SDKHook_SetTransmit ?

То что там есть это:
SDKHook(iEnt, SDKHook_StartTouch, OnStartTouch);
В котором можно блокировать/разрешать коллизию. Ну ладно, разбирайся сам.
 

Nebraska

Участник
Сообщения
234
Реакции
299
@Someone, так ты сразу бы намекнул, что дело в этом. Я уже пробовал так делать. То есть, докоснулся террор - отключаю коллизию. Или ты о другом?
 

Nebraska

Участник
Сообщения
234
Реакции
299
@Someone, да, без вариантов. Я может тебя не совсем понимаю, ты имеешь ввиду такой вид реализации? По мне - единственное, что в голову придёт. Но это не сработает, сам понимаешь. Таким макаром между игроками вариант делать :ab:
PHP:
public Action: StartTouch(entity, client)
{
    if (IsValidEntity(entity) && IsValidClient(client))
    {
        if (GetClientTeam(client) == 3)
        {
            SetEntProp(entity, Prop_Data, "m_CollisionGroup", 5);
        }
     
        else
        {
            SetEntProp(entity, Prop_Data, "m_CollisionGroup", 2);
        }
    }
}
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
@Someone, да, без вариантов. Я может тебя не совсем понимаю, ты имеешь ввиду такой вид реализации? По мне - единственное, что в голову придёт. Но это не сработает, сам понимаешь. Таким макаром между игроками вариант делать :ab:
PHP:
public Action: StartTouch(entity, client)
{
    if (IsValidEntity(entity) && IsValidClient(client))
    {
        if (GetClientTeam(client) == 3)
        {
            SetEntProp(entity, Prop_Data, "m_CollisionGroup", 5);
        }
    
        else
        {
            SetEntProp(entity, Prop_Data, "m_CollisionGroup", 2);
        }
    }
}
Вообще-то им можно вернуть Plugin_Handled/Plugin_Stop (Plugin_Continue, чтобы разрешить) и он должен будет заблокировать коллизию. Сам же объект по умолчанию должен быть прикасаемым. Либо StartTouch хук, либо просто Touch.
 

Islam Cherkess

Там мля о мля
Сообщения
1,504
Реакции
895
@Someone как зачем ??
А как тогда подсадки делать в классическом режиме ??
Что-бы все могли через друг друга проходить а вот при подсадке можно было бы подсадить )
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
@Someone как зачем ??
А как тогда подсадки делать в классическом режиме ??
Что-бы все могли через друг друга проходить а вот при подсадке можно было бы подсадить )
C-подобный:
mp_solid_teammates - How solid are teammates: 0 = transparent; 1 = fully solid; 2 = can stand on top of heads
 
Сверху Снизу