|
Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/
Trip Mine, сенсорная, лазерная мина в Half-Life
|
|
PomanoB | Дата: Среда, 01.07.2009, 10:38:57 | Сообщение # 16 |
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| Конкретно взрыв это сообщение SVC_TEMPENTITY TE_EXPLOSION
http://romanov4400.mybrute.com
|
|
| |
se7h | Дата: Среда, 01.07.2009, 11:15:25 | Сообщение # 17 |
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Статус: Не в сети
| в forward TraceLine вместо FMRES_HANDLED возвращай FMRES_SUPERCEDE также для предотвращения взрыва можно использовать хук FM_Think: Code register_forward(FM_Think, "fw_mines_think")
public fw_mines_think(entity) { if(pev_valid(entity) && "мина ли это") return FMRES_SUPERCEDE //отмена взрыва }
|
|
| |
PomanoB | Дата: Среда, 01.07.2009, 11:28:40 | Сообщение # 18 |
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| Quote (se7h) также для предотвращения взрыва можно использовать хук FM_Think: Но тогда мина и TraceLine делать не будет
http://romanov4400.mybrute.com
|
|
| |
se7h | Дата: Среда, 01.07.2009, 12:43:41 | Сообщение # 19 |
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Статус: Не в сети
| Quote (PomanoB) Но тогда мина и TraceLine делать не будет если использовать forward TraceLine то алгоритм такой: ловишь момент когда игрок пересекает луч, затем делаешь то что ты задумал, например, взрываешь игрока, возвращаешь FMRES_SUPERCEDE, не давая тем самым запуститься стандартному механизму - вобщем совершаешь обычную подмену с блокировкой если FM_Think, то здесь придёться самому пускать Trace от мины и отлавливать пересечение луча игроком и далее производить необходимые действия, либо другой вариант: возможно, что момент пересечения луча можно "отловить" по гипотетическому флагу и тогда никаких trace не нужно: ловишь это изменение и далее по списку... осталось лишь найти этот признак впрочем, из двух методов первый без сомнения более оптимальный
Сообщение отредактировал se7h - Среда, 01.07.2009, 13:04:02 |
|
| |
PomanoB | Дата: Среда, 01.07.2009, 14:35:59 | Сообщение # 20 |
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| pev_health становится равным нулю перед взрывом Quote (se7h) вобщем совершаешь обычную подмену с блокировкой я хотел не блокировать, а не дать увидеть игрока, не вышло к сожалению(
http://romanov4400.mybrute.com
|
|
| |
se7h | Дата: Среда, 01.07.2009, 14:44:50 | Сообщение # 21 |
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Статус: Не в сети
| Quote (PomanoB) я хотел не блокировать, а не дать увидеть игрока, не вышло к сожалению( думаю что стоит попытаться вернуть FMRES_SUPERCEDE: Code public forward_trace_line(Float:start[3], Float:dest[3], ignore_monsters, id, ptr) { if(!pev_valid(id)) return FMRES_IGNORED
static class[32] pev(id, pev_classname, class, sizeof class - 1) if(equal(class, "monster_tripmine")) { new index = get_tr2(ptr, TR_pHit) new IsRedMine = pev(id, pev_euser2) if(is_user_alive(index) && IsRedMine) { new MineOwner = pev(id, pev_euser1) fm_fakedamage(index, "fire_entity", 999.0, DMG_BLAST) EmitKill(MineOwner, index, "tripmine")
return FMRES_SUPERCEDE } }
return FMRES_IGNORED }
Сообщение отредактировал se7h - Среда, 01.07.2009, 14:55:26 |
|
| |
Vladimirok | Дата: Среда, 01.07.2009, 18:01:14 | Сообщение # 22 |
Лейтенант
Группа: Пользователи
Сообщений: 73
Статус: Не в сети
| Если зделать так: Code RegisterHam(Ham_Killed, "monster_tripmine", "active_mine", 0) ... public active_mine(this, idattacker, shouldgib) { new IsRedMine = entity_get_edict(this, EV_ENT_euser2) if(IsRedMine) { server_print("[AMXX] this: %d, attacker: %d, shouldgib: %d", this, idattacker, shouldgib) return HAM_SUPERCEDE }
return FMRES_IGNORED } то мина остаеться и луч остаеться, даже не взрываеться но становиться мягкой, по ней нельзя ходить и взорвать из любого вида оружия а также она больше перестает реагировать на TraceLine, которое так прекрасно работает. Если сделать так: Code register_forward(FM_Think, "fw_mines_think") ... public fw_mines_think(entity) { if(pev_valid(entity) && "мина ли это") return FMRES_SUPERCEDE //отмена взрыва } то мина вообще не работает. Если зделать такое в момент активации мины (или когда она активировалась) то мина перестает работать также только виден луч. Момент установки и активации мины: Code register_forward(FM_EmitSound, "fw_EmitSound") ... public fw_EmitSound(ent, channel, sample[]) { //Момент когда мина только только установлена на стену if(equal(sample, "weapons/mine_deploy.wav")) { //Если игрок нажал на альтернативную атаку, тогда ставим мину с красным лучем, если нет то ставим обычную new owner = entity_get_edict(ent, EV_ENT_owner) if(!attack_button[owner]) { attack_button[owner] = true entity_set_edict(ent, EV_ENT_euser1, owner) entity_set_edict(ent, EV_ENT_euser2, 1) //server_print("False") } else { entity_set_edict(ent, EV_ENT_euser2, 0) //server_print("True") } } //Когда мина заряжаеться if(equal(sample, "weapons/mine_charge.wav")) { client_print(0, print_chat, "[AMXX] Mine is charge! Owner: (%d)", ent_owner) } //Когда мина активизировалась, тоесть проресовался луч и она готова к использованию if(equal(sample, "weapons/mine_activate.wav")) { //Здесь если мина с красным лучем то ищем энтити beam (конец луча), запоминаем позицию и удаляем. Потом прорисовываем свой, если нет то не удаляем (Для того что бы лучи обычных мин и красных не сходились в один пучок) client_print(0, print_chat, "[AMXX] Trip mine ID: %d", ent) if(entity_get_edict(ent, EV_ENT_euser2)) { new ent2 = 0; do { ent2 = find_ent(ent2, "beam"); if(ent2 > 0) { if(entity_get_edict(ent2, EV_ENT_euser2) == 0) { new Float:Origin[3] new fOrigin[3] new param[9] pev(ent, pev_origin, Origin) fOrigin[0] = floatround(Origin[0]) fOrigin[1] = floatround(Origin[1]) fOrigin[2] = floatround(Origin[2]) param[0] = fOrigin[0] param[1] = fOrigin[1] param[2] = fOrigin[2] pev(ent2, pev_origin, Origin) remove_entity(ent2) fOrigin[0] = floatround(Origin[0]) fOrigin[1] = floatround(Origin[1]) fOrigin[2] = floatround(Origin[2]) param[3] = fOrigin[0] param[4] = fOrigin[1] param[5] = fOrigin[2] param[6] = 255 param[7] = 0 param[8] = 0 DrawTripMineLaser(param) set_task(0.1, "DrawTripMineLaser", 2000 + ent, param, 9, "a", 99999999999) } } } while(ent2) } else { new ent2 = 0; do { ent2 = find_ent(ent2, "beam"); if(ent2 > 0) { if(entity_get_edict(ent2, EV_ENT_euser2) == 0) { entity_set_edict(ent2, EV_ENT_euser2, 1) } } } while(ent2) } } //Когда лазерная мина взрывается if(equal(sample, "weapons/debris1.wav") || equal(sample, "weapons/debris2.wav") || equal(sample, "weapons/debris3.wav")) { new eName[33] entity_get_string(ent, EV_SZ_classname, eName, 32) if(equal(eName, "monster_tripmine")) { //client_print(0, print_chat, "[AMXX] Trip mine is blow: (%d)", ent) remove_task(2000 + ent) } } //client_print(0, print_chat, "[AMXX] Sound: (%s)", sample) return FMRES_IGNORED } Еще когда делал хук на все, брал скрипт из этого сайта (AllFMHooks.sma) то было замечено что в момент пересичения мина ищет все энтити в какомто радиусе, тоесть FindEntityBySphere (непомню как пишеться правельно). Еще проскакивает ентити func_illusionary (может быть и глюк). Проверка количества энтити: - количество энтити до установки мины = 281 (пусто) - колечество энтити после установки мины = 282 (сама мина) - количество энтити после активации мины = 283 (мина и конечная точка луча (beam)) Как отловить и заблокировать взрыв и приэтом оставить роботоспособную мину ну никак не выходит Была идея делать тоненькую квадратную прозрачную энтити дал самим лучем, тоесть как бы луч внутри а потом лосить на FM_Touch. Но как расчитать в какую сейчас сторону смотрит мина? (Верх, низ, вперед, назад, влево, вправо). Была идея после того как сработал TraceLine убить игрока и заблокировать взрыв RegisterHam(Ham_Killed, "monster_tripmine", "active_mine", 0), а потом быстренько создать на ее месте копию только без луча (но сами понимаете как это будет выглядет). Большое вам спасибо за помощь! Может у кого выйдет какнибуть то отпишитесь пожалуйста. Спасибо. Добавлено (2009-07-01, 6:01 Pm) --------------------------------------------- Еще забыл что писал на иностранном форуме то только аж за 8 часов один кто то написал: - You have to block the original trace too. - Вам придется блокировать оригинальный след так же. Что он имел в виду под оригинальным следом так и не понял. Ссылка: https://forums.alliedmods.net/showthread.php?t=96074
|
|
| |
PomanoB | Дата: Среда, 01.07.2009, 19:36:07 | Сообщение # 23 |
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| Он как раз и имел ввиду заблокировать TraceLine Пробовал сделать как написано в http://amxmodx.ucoz.ru/forum/9-3178-20690-16-1246445090 ? Могу предположить что FindEntityBySphere относится не к мине непосредственно, а к получаемому взрыву
http://romanov4400.mybrute.com
|
|
| |
se7h | Дата: Среда, 01.07.2009, 19:51:20 | Сообщение # 24 |
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Статус: Не в сети
| На англоязычном форуме тебе посоветовали сделать так как я указал в своём предыдущем посте
|
|
| |
Vladimirok | Дата: Среда, 01.07.2009, 22:44:01 | Сообщение # 25 |
Лейтенант
Группа: Пользователи
Сообщений: 73
Статус: Не в сети
| Да, канешно пробувал. Не блокирует, как будто ничего не происходит. Мина все равно взрывается. Quote Могу предположить что FindEntityBySphere относится не к мине непосредственно, а к получаемому взрыву Да, все верно. Это взрыв ищет все энтити которые получают повреждения. Туда входит все оружие которое попало в радиус. А также в эту сферу входит func_illusionary) Буду сегодня всю ночь эту гранату иследовать. Может она взрываеться по тригеру. Типа как говорили что записываеться True - False (1, 0) кудато и нужно всего лишь подменять значения. Спасибо.
|
|
| |
PomanoB | Дата: Четверг, 02.07.2009, 11:14:03 | Сообщение # 26 |
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| Посмотри в hlsdk, файл tripmine.cpp
http://romanov4400.mybrute.com
|
|
| |
| AMX Mod X Russian Community © 2006-2024 | |
|
| |