Коллизия

tonline_kms65_1

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

Давай разберемся, ты хочешь показывать своим и скрывать от чужих. Есть еще наблюдатели, я не пробовал как с ними работать.
Не пойму, зачем проверка на столкновения(коллизии)? Я бы делал след. образом:
У тебя есть координаты твоих подарков. Да вообще, зачем координаты. При создании ENT подарка, делаешь таймер его существования, (интервал 0.1, до ж...опы хватит). Таймер живет пока жива ENT. В этом таймере, радиусом проверяешь есть игроки или нет, если есть, проверяешь свой - чужой(с наблюдателями я не пробовал). Игрок свой - проявляется ENT, подбежал - схватил и ENT "померло"(таймер естественно тоже "помер". Естественно, модель в ENT, при её создании, делаешь прозрачной. Коллизия тебе, в данном случае, вообще не нужна. Даже не мучайся, только мешать будет игрокам, ставишь просто референсом и все дела. Проще некуда.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #22
Не пойму, зачем проверка на столкновения(коллизии)?
Потому что:
Для команды террористов, я ее скрываю (SDKHook_SetTransmit), но террорист может в нее упереться. Разумеется, подобрать может её только спецназовец, но вот хочется так же сделать, чтобы именно коллизия работала на спецназовца, а террор просто будет проходить насквозь.

Вариант с таймером вообще странно выглядит. Постоянно что-то делать каждую секунду... Ну, такое себе.
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
А что там такого? Проверка радиусом наличия игрока, 32(64) ENT. Очень странный ответ.
А как ты думаешь остальные ф-ии работают? По какому принципу? Неужели по другому?
Не нравится такой, можно сделать один на всех игроков, или вообще в updater забить, частоту уменьшить. Можно в ф-ю создание ENT, я не знаю как она называется, тоже самое сделать.
Но принцип будет везде один.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
да сделайте просто trigger_multiple - Valve Developer Community и всё
PHP:
public void OnMapStart()
{
    PrecacheModel("models/props/de_dust/du_crate_64x64.mdl", true);
}

stock void CreateTrigger(int i, float pos[3])
{
    static int ent;
    if((ent = CreateEntityByName("trigger_multiple")) == -1)
        return;

    DispatchKeyValue(ent, "model", "models/props/de_dust/du_crate_64x64.mdl");
    DispatchKeyValue(ent, "spawnflags", "512");    // фильтруем прикосновения к триггеру
    DispatchKeyValue(ent, "wait", "0");
    DispatchSpawn(ent);
    ActivateEntity(ent);
    SetEntPropVector(ent, Prop_Data, "m_vecMaxs", fZoneMaxs);
    SetEntPropVector(ent, Prop_Data, "m_vecMins", fZoneMins);
    TeleportEntity(ent, pos, NULL_VECTOR, NULL_VECTOR);
    SetEntProp(ent, Prop_Send, "m_nSolidType", 2);    // чтобы не мешть перемещаться сквозь триггер
    // самоуничтожение по прошествии времени
    char buffer[32];
    FormatEx(buffer, sizeof(buffer), "OnUser1 !self:Kill::%.2f:-1", fLifetime);
    SetVariantString(buffer);
    AcceptEntityInput(ent, "AddOutput");
    AcceptEntityInput(ent, "FireUser1");
    // отлавливаем каcания
    SDKHook(ent, SDKHook_TouchPost, OnPlantTouch);
}

public void OnPlantTouch(int entity, int client)
{
    if(0 < client <= MaxClients && IsPlayerAlive(client) && GetClientTeam(client) == 3) своя_функция();
}
--- Добавлено позже ---
Только в той же точке ставьте свои подарки, а триггер будет отлавливать касания (кстати для модели подарка тоже установите полную нематериальность и добавьте такой же таймер на самоуничтожение, как и у триггера)
 
Последнее редактирование:

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Интересное решение.
SetEntPropVector(ent, Prop_Data, "m_vecMaxs", fZoneMaxs);
SetEntPropVector(ent, Prop_Data, "m_vecMins", fZoneMins);
Я думаю прежде чем задать размеры, нужно их сначала получить:
float fZoneMaxs[3], fZoneMins[3];
GetEntPropVector(ent, Prop_Send, "m_vecMaxs", fZoneMaxs);
GetEntPropVector(ent, Prop_Send, "m_vecMins", fZoneMins);
--------------------------------------------------------------------
stock void CreateTrigger(int i, float pos[3])
{
static
int ent;
if((
ent = CreateEntityByName("trigger_multiple")) == -1)
return;

DispatchKeyValue(ent, "model", "models/props/de_dust/du_crate_64x64.mdl"); // это 3d модель подарка
DispatchKeyValue(ent, "spawnflags", "512"); // фильтруем прикосновения к триггеру (посмотреть в хаммере)
DispatchKeyValue(ent, "filtername", "игроки имя класса"); // фильтрация по имени класса
DispatchKeyValue(ent, "wait", "0");
DispatchSpawn(ent);
ActivateEntity(ent);

GetEntPropVector(ent, Prop_Send, "m_vecMaxs", fZoneMaxs);
GetEntPropVector(ent, Prop_Send, "m_vecMins", fZoneMins);


SetEntPropVector
(ent, Prop_Data, "m_vecMaxs", fZoneMaxs);
SetEntPropVector(ent, Prop_Data, "m_vecMins", fZoneMins);
TeleportEntity(ent, pos, NULL_VECTOR, NULL_VECTOR);
SetEntProp(ent, Prop_Send, "m_nSolidType", 2); // чтобы не мешть перемещаться сквозь триггер
// самоуничтожение по прошествии времени
char buffer[32];
FormatEx(buffer, sizeof(buffer), "OnUser1 !self:Kill::%.2f:-1", fLifetime);
SetVariantString(buffer);
AcceptEntityInput(ent, "AddOutput");
AcceptEntityInput(ent, "FireUser1");
// отлавливаем каcания
SDKHook(ent, SDKHook_TouchPost, OnPlantTouch);
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@tonline_kms65_1, эти величины можно сделать константами (ведь размер подарка не меняется) с размером примерно равным размеру подарка.
Этими размерами ты задаёшь размер зоны, в которой будет отлавливаться приближение игрока к подарку.
По оси Z вообще можно установить размер в 1 юнит, а по оси X и Y размеры будут одинаковыми (насколько я понимаю, подарок выглядит как кубик).
Т.е. примерно так: fZoneMins = {-10.0, -10.0, 0.0} и fZoneMaxs = {10.0, 10.0, 20.0}
Точнее можно сказать видя саму модель (можно даже с неё получать размеры)
 
Последнее редактирование:

Napas

Участник
Сообщения
832
Реакции
667
Хай, вот у меня вопрос, уже 2 дня голову ломаю и не знаю как реализовать, прострел пули через игрока, projectile для патрона в CS:GO нету. Кто-то знает как можно реализовать?
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Опять же вариант наклевывается:
триггером делаем, примерно, радиус видимости игрока, игрок в триггер зашел - модель видима.
насчет констант - модели могут быть разными, одни больше, другие меньше.
--- Добавлено позже ---
как реализовать, прострел пули через игрока, projectile для патрона в CS:GO нету.
Как нибудь понятнее. Попроще объясни вопрос.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
игрок в триггер зашел - модель видима
тогда нужно 2 триггера: 1-й для включения видимости, 2-й - для получения подарка игроком.
Но всё равно через триггер включать видимость - это фигня нездоровая. Всё равно проще видимость через SDKHook_SetTransmit делать.
Хотя какой смысл скрывать подарок от террористов, если они всё равно не смогут подобрать? Разве что чтобы засаду рядом не устраивали, как спецы возле бомбы.

Вообще радиус (триггером создаётся прямоугольная область, а не круглая) видимости можно делать с помощью
C-подобный:
- m_fadeMinDist (Offset 816) (Save|Key|Input)(4 Bytes) - fademindist
- m_fadeMaxDist (Offset 820) (Save|Key|Input)(4 Bytes) - fademaxdist

Интересно, вот это на что влияет для пропов?
C-подобный:
-  InputSetTeam (Offset 0) (Input)(0 Bytes) - SetTeam
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Задает принадлежность к команде. Для ботов, для триггеров кстати.

Чем дальше - тем больше я убеждаюсь в верности своей версии с таймером. Просто и сердито. 100% отработает так как нужно.
 

Nebraska

Участник
Сообщения
234
Реакции
299
@Grey83, с триггером вариант рабочий и простой, спасибо большое :dance4: Всем спасибо, кто был в теме :beer:
 

ololoex

Участник
Сообщения
123
Реакции
51
Хай, вот у меня вопрос, уже 2 дня голову ломаю и не знаю как реализовать, прострел пули через игрока, projectile для патрона в CS:GO нету. Кто-то знает как можно реализовать?
Плагин ниже и соответственно ext
 

Вложения

  • collision.sp
    429 байт · Просмотры: 32

Someone

Участник
Сообщения
1,933
Реакции
1,653
Хай, вот у меня вопрос, уже 2 дня голову ломаю и не знаю как реализовать, прострел пули через игрока, projectile для патрона в CS:GO нету. Кто-то знает как можно реализовать?
Используй SDK хук TraceAttack.
 
Сверху Снизу