AMX MOD X
Вторник, 23.04.2024, 09:16:01



Приветствую Вас Гость | RSS
[ Главная ] [ Trip Mine, сенсорная, лазерная мина в Half-Life - Страница 2 - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Trip Mine, сенсорная, лазерная мина в Half-Life
Trip Mine, сенсорная, лазерная мина в Half-Life
PomanoBДата: Среда, 01.07.2009, 10:38:57 | Сообщение # 16
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Конкретно взрыв это сообщение SVC_TEMPENTITY TE_EXPLOSION

http://romanov4400.mybrute.com
 
se7hДата: Среда, 01.07.2009, 11:15:25 | Сообщение # 17
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
в 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
Репутация: 70
Статус: Не в сети
Quote (se7h)
также для предотвращения взрыва можно использовать хук FM_Think:

Но тогда мина и TraceLine делать не будет


http://romanov4400.mybrute.com
 
se7hДата: Среда, 01.07.2009, 12:43:41 | Сообщение # 19
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
Quote (PomanoB)
Но тогда мина и TraceLine делать не будет

если использовать forward TraceLine то алгоритм такой: ловишь момент когда игрок пересекает луч, затем делаешь то что ты задумал, например, взрываешь игрока, возвращаешь FMRES_SUPERCEDE, не давая тем самым запуститься стандартному механизму - вобщем совершаешь обычную подмену с блокировкой

если FM_Think, то здесь придёться самому пускать Trace от мины и отлавливать пересечение луча игроком и далее производить необходимые действия, либо другой вариант: возможно, что момент пересечения луча можно "отловить" по гипотетическому флагу и тогда никаких trace не нужно: ловишь это изменение и далее по списку... осталось лишь найти этот признак B)

впрочем, из двух методов первый без сомнения более оптимальный




Сообщение отредактировал se7h - Среда, 01.07.2009, 13:04:02
 
PomanoBДата: Среда, 01.07.2009, 14:35:59 | Сообщение # 20
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
pev_health становится равным нулю перед взрывом
Quote (se7h)
вобщем совершаешь обычную подмену с блокировкой

я хотел не блокировать, а не дать увидеть игрока, не вышло к сожалению(


http://romanov4400.mybrute.com
 
se7hДата: Среда, 01.07.2009, 14:44:50 | Сообщение # 21
Генерал-майор
Группа: Cупер-модеры
Сообщений: 424
Репутация: 13
Статус: Не в сети
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
Репутация: 0
Статус: Не в сети
Если зделать так:

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
Репутация: 70
Статус: Не в сети
Он как раз и имел ввиду заблокировать 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
Репутация: 13
Статус: Не в сети
На англоязычном форуме тебе посоветовали сделать так как я указал в своём предыдущем посте

 
VladimirokДата: Среда, 01.07.2009, 22:44:01 | Сообщение # 25
Лейтенант
Группа: Пользователи
Сообщений: 73
Репутация: 0
Статус: Не в сети
Quote
Пробовал сделать как написано в http://amxmodx.ucoz.ru/forum/9-3178-20690-16-1246445090 ?

Да, канешно пробувал. Не блокирует, как будто ничего не происходит. Мина все равно взрывается.

Quote
Могу предположить что FindEntityBySphere относится не к мине непосредственно, а к получаемому взрыву

Да, все верно. Это взрыв ищет все энтити которые получают повреждения. Туда входит все оружие которое попало в радиус. А также в эту сферу входит func_illusionary)

Буду сегодня всю ночь эту гранату иследовать. Может она взрываеться по тригеру. Типа как говорили что записываеться True - False (1, 0) кудато и нужно всего лишь подменять значения. Спасибо.

 
PomanoBДата: Четверг, 02.07.2009, 11:14:03 | Сообщение # 26
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Посмотри в hlsdk, файл tripmine.cpp

http://romanov4400.mybrute.com
 
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Trip Mine, сенсорная, лазерная мина в Half-Life
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

AMX Mod X Russian Community © 2006-2024