[РЕШЕНА] Наилучший способ словить столкновение гранаты с ...
|
|
slogic | Дата: Четверг, 07.12.2006, 00:04:31 | Сообщение # 1 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| У меня есть огромное желание исправить пару багов в metamod плагине AXN. Один из труднорешаемых связан с отловом самого первого столкновения с землей. Ведь именно в этом случае происходит выпускание газа. Или нет? Потом граната может отскачать далеко от этого газа. AXN работает по принципу - где граната - там и ядовитый газ, что неправильно и раздаражет, когда вроде бы находишься в облаке газа, а ты не задыхаешься. Для этого использовать EntityThink и ловить изменение флагов?
Сообщение отредактировал slogic - Пятница, 26.01.2007, 02:12:21 |
|
| |
VEN | Дата: Четверг, 07.12.2006, 11:24:21 | Сообщение # 2 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Quote | связан с отловом самого первого столкновения с землей. Ведь именно в этом случае происходит выпускание газа. Или нет? | Нет, касание - достаточное, но не необходимое требование - должно пройти какое-то время после приземления. На мой взгляд, самый точный способ - отлов второго "events/createsmoke.sc" PlaybackEvent для конкретной entity. Вычислить entity index можно через origin, который передается hook. Пример элементарного PlaybackEvent hook в "Teleport Smoke Grenade"
Сообщение отредактировал VEN - Четверг, 07.12.2006, 12:13:02 |
|
| |
AlMod | Дата: Четверг, 07.12.2006, 11:48:14 | Сообщение # 3 |
Сонный кодер
Группа: Админы
Сообщений: 600
Статус: Не в сети
| А можно просто посчитать примерно и поставить через сет_таск
|
|
| |
VEN | Дата: Четверг, 07.12.2006, 12:24:10 | Сообщение # 4 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Как я отметил, самый точный способ, т.е. с точностью до фрэйма, будет именно отлов второго "events/createsmoke.sc" PlaybackEvent, ведь именно это событие заставляет прорисовывать дым на клиенте. На втором месте по точности будет отлов изменения значения в соответствующем pvPrivateData offset'е. Но тут есть проблема - на разных платформах offset'ы обычно немного сдивинуты. Все остальные способы будут еще менее точные, в частности set_task, у которого предел точности 0.1 сек.
|
|
| |
slogic | Дата: Четверг, 07.12.2006, 12:28:07 | Сообщение # 5 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| set_task - это ламеровский способ, когда есть события. Если нет событий, то да - тогда set_task(0.1, ...). Но такой плагин, imho, луше вообще не издавать. Хорошо, а может есть способ определить, находишьсяли ты в дыме или нет? Или это чисто клиентская фишка и нифига тут не узнаешь? Можно же определить в точке какой entity в ней находится (это утверждение). Наличие дыма можно примерно так же определить?
|
|
| |
VEN | Дата: Четверг, 07.12.2006, 13:42:51 | Сообщение # 6 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Если нет событий, то StartFrame с предельной оптимизацией. :] set_task в таких случаях я тоже не признаю - точность довольна низкая. Не все вопросы понял, но могу предположить, что в случае наличия у нас исходного кода "events/createsmoke.sc", можно (пере)просчитать физику клиентского дыма на сервере. Добавлено (2006-12-07, 1:25 Pm) --------------------------------------------- В ином случае результаты вычислений будут довольно грубые. Добавлено (2006-12-07, 1:42 Pm) --------------------------------------------- О каком Game Mod речь? Я вообще-то про CS говорил.
Сообщение отредактировал VEN - Четверг, 07.12.2006, 13:27:02 |
|
| |
AlMod | Дата: Четверг, 07.12.2006, 14:48:12 | Сообщение # 7 |
Сонный кодер
Группа: Админы
Сообщений: 600
Статус: Не в сети
| Думаю можно, обратись к исходному коду SH_Fartman.sma в супер-херо моде
|
|
| |
VEN | Дата: Четверг, 07.12.2006, 15:09:32 | Сообщение # 8 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Посмотрел sh_fartman.sma - никакого особенного метода не используется, обычный хардкодинг радиуса дыма.
|
|
| |
slogic | Дата: Четверг, 07.12.2006, 15:32:52 | Сообщение # 9 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Quote (VEN) | Не все вопросы понял, но могу предположить, что в случае наличия у нас исходного кода "events/createsmoke.sc", можно (пере)просчитать физику клиентского дыма на сервере. | Нет, я имел в виду тукнуть в точку пространства и определить, есть там дым или нет - аналог point_contents(). Quote (VEN) | О каком Game Mod речь? | CS.
|
|
| |
VEN | Дата: Четверг, 07.12.2006, 16:06:43 | Сообщение # 10 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Quote | я имел в виду тукнуть в точку пространства и определить, есть там дым или нет | Не получится, т.к. smokegren дым - это, скорее всего, clientside tempentity msg.
Сообщение отредактировал VEN - Четверг, 07.12.2006, 16:09:36 |
|
| |
slogic | Дата: Пятница, 15.12.2006, 17:30:33 | Сообщение # 11 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Я посмотрел вчера подробнее. Граната взрывается всегда через определенный промежуток времени после первого столкновения с землей. Где-то около секунды или чуть больше. Т.о. после столкновения можно включить set_task(1.0,...) и точнее определить центр дымовой завесы. Погрешность будет видна даже на глаз если после первого столкновения граната начала падать с большой высоты или вниз по лестнице. Осталось найти такую карту. Еще есть одна мысль. В момент выпускания газа граната приобретает ускорение. Только надо делать анализ свойств, чтобы узнать, можно ли со 100% вероянтностью отличить это событие от свободного падения.
Сообщение отредактировал slogic - Пятница, 15.12.2006, 17:31:11 |
|
| |
slogic | Дата: Четверг, 04.01.2007, 18:25:56 | Сообщение # 12 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| В общем все на самом деле проще. Достаточно словить FM_EmitSound и сравнить имя аудио файла, который воспроизводит звук соотв. взрыва. Источник: плагин Flashbang Dynamic Light. Теперь осталось добавить, что тема не соответсвовала задаче. Нужно было словить именно момент взрыва гранаты.
|
|
| |
VEN | Дата: Четверг, 04.01.2007, 20:27:47 | Сообщение # 13 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Я просто сразу не понял из твоего поста, что ты хочешь использовать set_task именно, чтобы определить момент взрыва гранаты. А сейчас перечитал и понял, и уже было хотел предложить EmitSound метод, но вижу, ты уже сам его нашел. Я сам всегда использую такой метод (возможно, даже это был я, кто впервые предложил его использовать). Итак, подводим итоги: - чтобы определить момент начала выпуска дыма из гранаты, "ловим" второй "events/createsmoke.sc" PlaybackEvent для конкретной entity (вычислить entity index можно через origin, который передается в handler, пример элементарного PlaybackEvent hook'a см. в "Teleport Smoke Grenade") - чтобы определить момент взрыва гранаты, "ловим" "weapons/sg_explode.wav" EmitSound (пример см. в "Teleport Smoke Grenade") Имена звуковых файлов, проигрываемых при взрывах гранат всех типов: /* HE Grenade weapons/debris1.wav weapons/debris2.wav weapons/debris3.wav */ /* Flashbang weapons/flashbang-1.wav weapons/flashbang-2.wav */ /* Smoke Grenade weapons/sg_explode.wav */
|
|
| |
slogic | Дата: Воскресенье, 07.01.2007, 23:08:20 | Сообщение # 14 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Quote (VEN) | чтобы определить момент начала выпуска дыма из гранаты, "ловим" второй "events/createsmoke.sc" | Не понял, EmitSound для дымовой гранаты - недостаточное условие? Я доработал AXN. Меня все устраивает.
|
|
| |
VEN | Дата: Понедельник, 08.01.2007, 00:13:18 | Сообщение # 15 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Quote | недостаточное условие? | Дым создается сразу перед издаванием звука, поэтому PlaybackEvent hook наиболее приемлемый метод для многих случаев. Например, в "Teleport Smoke Grenade" мне приходится блокировать дым, так как даже удаляя grenade entity в EmitSound, одна "дыминка" все равно проскакивает, причем, хитрым образом - origin абсолютно не имеет отношения к месту взрыва, == {0,0,0} - заметил абсолютно случайно. Т.о., все зависит от целей. Если не нужно блокировать дым, то думаю в подавляющем большинстве случаев подойдет EmitSound hook.
Сообщение отредактировал VEN - Понедельник, 08.01.2007, 00:15:03 |
|
| |