HLFX.Ru Forum
Показать все 20 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Смертоносный TargetName (https://hlfx.ru/forum/showthread.php?threadid=4023)


Отправлено Half 23-07-2013 в 16:35:

Half-Life Смертоносный TargetName

Снова всех приветствую! Буду короток:
Увы, но в халфе нет ни единого монстра, который умирает просто, при вызове по имени. Даже всем известные тентакли дохнут благодаря каким-то релеям (у этих реле стоит off). Я уже не говорю про Оспри, который удаляется с карты, не найдя паф корнера (или если скорость меньше 500).
для большей подробности были сделаны скрины:


Прошу помощи! Буду очень признателен!

__________________
Пруха длится всего 5 минут.


Отправлено XaeroX 23-07-2013 в 16:38:

Half
И чем же тебе помочь?

__________________

xaerox on Vivino


Отправлено Half 23-07-2013 в 16:40:

Как прописать ему смерть? Скриптами (маппингом) любой может, а кодом пока не выходит...

__________________
Пруха длится всего 5 минут.


Отправлено Дядя Миша 23-07-2013 в 17:18:

Цитата:
Half писал:
Как прописать ему смерть?

Кому - ему?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Вилс 23-07-2013 в 18:01:

Как я понял он хочет что бы при триггере убивал монстра.


Отправлено XF-Alien 23-07-2013 в 18:38:

Через scripted_sequence вроде как просто проигрываешь нужную анимацию смерти и все.


Отправлено Government-Man 24-07-2013 в 03:38:

trigger_hurt


Отправлено Half 24-07-2013 в 08:21:

Цитата:
Дядя Миша писал:
Кому - ему?

Сейчас выложу файл - узнаешь. + На скринах же видно, или я не так сфоткал?
Цитата:
Вилс писал:
он хочет что бы при триггере убивал монстра

Не только! Хочется, чтобы кнопка или триггер не могли заново запустить "Смерть"
Цитата:
XF-Alien писал:
Через scripted_sequence

Не охота Рипентом уровень ломать
Цитата:
Government-Man писал:
trigger_hurt

Такого монстра даже Hurt-ом не грохнешь. Почему? Ответ в аттаче.

Мне хочется упростить процесс, не пихать всяких скриптов, амбиентов... просто по коду!

Типа:
C++ Source Code:
1
void CTestMonster::CommandUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
2
{
3
  pev->takedamage = DAMAGE_NO;
4
  SetThink( DieThink );
5
  m_iGoalAnim = TEST_ANIM_Death;
6
  break;
7
}
8
 
9
void CTestMonster :: DieThink( void )
10
{
11
  pev->nextthink = gpGlobals-> time + 0.1;
12
 
13
  EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "test/death.wav", 1, ATTN_NORM, 0, 100 );
14
  if (m_fSequenceFinished)
15
  {
16
    if (pev->sequence == m_iGoalAnim)
17
    {
18
      switch( m_iGoalAnim )
19
      {
20
      case TEST_ANIM_Idle:
21
        case TEST_ANIM_Idle2:
22
            break;
23
        case TEST_ANIM_Death:
24
            UTIL_Remove( this );
25
          return;
26
        }
27
    }
28
  }

__________________
Пруха длится всего 5 минут.


Отправлено Дядя Миша 24-07-2013 в 13:15:

Цитата:
Half писал:
Сейчас выложу файл - узнаешь

И что я должен понять из тестового файла?
test monster какой-то. Причём к нему даже кода никакого не написано.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 24-07-2013 в 13:45:

Цитата:
Half писал:
Не охота Рипентом уровень ломать

Ещё один Бумка Шестицентовый Жора... Сделай свой уровень, не уродуй чужой.


Отправлено Half 24-07-2013 в 15:27:

Цитата:
Дядя Миша писал:
test monster какой-то

Монстр специально переименован, чтобы подогреть ваш интерес.
Цитата:
Дядя Миша писал:
Причём к нему даже кода никакого не написано

Врать не буду, ибо брал всё от женерика. В нём кода не много и трудно запутаться.
Я очень надеюсь, что кто-нибудь добавил этот файл к себе в проект, скомпилил и пострелял бы в него на тестовом уровне.
+ В файле я специально закомментировал те места, с которыми я не могу разобраться. (к примеру:KeyValue)
Цитата:
Ku2zoff писал:
Сделай свой уровень, не уродуй чужой

Мне и свой уровень жалко. А в оригинальном он (монстр) лучше выглядит. Так как и уровень и монстр созданы одними и теми же людьми. Я всего лишь пытаюсь воссоздать этого npc.

Ну я реально не знаю, помогите!

__________________
Пруха длится всего 5 минут.


Отправлено Дядя Миша 24-07-2013 в 15:40:

Цитата:
Half писал:
Монстр специально переименован, чтобы подогреть ваш интерес.

Этот монстр не нужен никому кроме тебя. Себе интерес подогревай.

Цитата:
Half писал:
Я всего лишь пытаюсь воссоздать этого npc.

Ну как же ты пытаешься, если ни строчки кода не написал?
Это ты даже еще не начал пытаться

Бери, открывай хентакля, смотри как там устроено.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Half 24-07-2013 в 17:11:

Цитата:
Дядя Миша писал:
открывай хентакля, смотри как там устроено

Не 1 раз открывал, там прописано:
Если тентакла активирует рилей с "Trigger Strate: Off", то тентакл умрёт. Если "On" - подымется вверх. Если "Toggle" - ничего не произойдёт.
Я ведь не через Рилэи буду npc убивать, а обычными кнопками (триггерами).

Добавлено 25-07-2013 в 00:11:

Ну вот, значит написал я:
C++ Source Code:
1
void CTestMonster::CommandUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
2
{
3
  // ALERT( at_console, "%s triggered %d\n", STRING( pev->targetname ), useType );
4
  switch( useType )
5
  {
6
  case USE_TOGGLE:
7
      pev->takedamage = DAMAGE_NO;
8
    SetThink( DieThink );
9
    m_iGoalAnim = PLANT_ANIM_Death;
10
    break;
11
  }
12
 
13
}
14
 
15
void CTestMonster :: DieThink( void )
16
{
17
  pev->nextthink = gpGlobals-> time + 0.1;
18
 
19
  if (m_fSequenceFinished)
20
  {
21
    if (pev->sequence == m_iGoalAnim)
22
    {
23
      switch( m_iGoalAnim )
24
      {
25
      case PLANT_ANIM_Idle:
26
        case PLANT_ANIM_Idle2:
27
            m_iGoalAnim = PLANT_ANIM_Flinch1 + RANDOM_LONG( 0, 2 );
28
          break;
29
        case PLANT_ANIM_Death:
30
            UTIL_Remove( this );
31
          return;
32
        }
33
    }
34
 
35
    // ALERT( at_console, "%d : %d => ", pev->sequence, m_iGoalAnim );
36
    pev->sequence = FindTransition( pev->sequence, m_iGoalAnim, &m_iDir );
37
    // ALERT( at_console, "%d\n", pev->sequence );
38
 
39
    ResetSequenceInfo( );
40
 
41
    switch( pev->sequence )
42
    {
43
    case PLANT_ANIM_Idle:
44
      case PLANT_ANIM_Idle2:
45
        case PLANT_ANIM_Flinch1:
46
          case PLANT_ANIM_Flinch2:
47
            case PLANT_ANIM_Death:
48
                pev->framerate = RANDOM_FLOAT( m_iDir - 0.2, m_iDir + 0.2 );
49
              break;
50
            default:
51
                pev->framerate = 1.0;
52
              break;
53
            }
54
          EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "ambience/flies.wav", 1, ATTN_NORM, 0, 100 );
55
        }
56
    }

Вроде всё верно, но всё равно не работает. Почему?

__________________
Пруха длится всего 5 минут.


Отправлено Дядя Миша 24-07-2013 в 18:22:

Кейсы вообще убери. Пусть только дохнет по активации.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Luxury 24-07-2013 в 19:15:

А не проще сделать точечную энтити, которая убивает монстра по имени? А эту энтити вызывать кнопкой.


Отправлено Half 25-07-2013 в 13:44:

Цитата:
Дядя Миша писал:
Кейсы вообще убери. Пусть только дохнет по активации

Кейсы с комментами убраны, однако ничего не изменилось:
C++ Source Code:
1
void CTestMonster::CommandUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
2
{
3
  pev->takedamage = DAMAGE_NO;
4
  SetThink( DieThink );
5
  m_iGoalAnim = PLANT_ANIM_Death;
6
}
7
 
8
void CTestMonster :: DieThink( void )
9
{
10
  pev->nextthink = gpGlobals-> time + 0.1;
11
 
12
  if (m_fSequenceFinished)
13
  {
14
    if (pev->sequence == m_iGoalAnim)
15
    {
16
      switch( m_iGoalAnim )
17
      {
18
      case PLANT_ANIM_Death:
19
          UTIL_Remove( this );
20
        return;
21
      }
22
    }
23
 
24
    pev->sequence = FindTransition( pev->sequence, m_iGoalAnim, &m_iDir );
25
 
26
    if (m_iDir > 0)
27
    {
28
      pev->frame = 0;
29
    }
30
    else
31
    {
32
      pev->frame = 255;
33
    }
34
    ResetSequenceInfo( );
35
 
36
    switch( pev->sequence )
37
    {
38
    case PLANT_ANIM_Death:
39
        pev->framerate = RANDOM_FLOAT( m_iDir - 0.2, m_iDir + 0.2 );
40
      break;
41
    default:
42
        pev->framerate = 1.0;
43
      break;
44
    }
45
    EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "ambience/flies.wav", 1, ATTN_NORM, 0, 100 );
46
  }
47
}

Цитата:
Luxury писал:
сделать точечную энтити, которая убивает монстра по имени? А эту энтити вызывать кнопкой

Я этого монстра и кнопками и мульти_менеджерами грохаю.

__________________
Пруха длится всего 5 минут.


Отправлено Дядя Миша 25-07-2013 в 14:06:

А что может измениться, если ты копируешь случайные куски кода, не понимая что они делают?
Ты и env_spritetrain по такому же принципу делал - год копировал разные куски кода в надежде, что заработает. Не заработало. Выводов ты так и не сделал, учиться ничему не стал. Следовательно тебе просто нравится убивать время таким образом.
Не буду мешать

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено KiQ 25-07-2013 в 17:01:

Как-то так. Топорно, можно улучшить, но принцип ясен

C++ Source Code:
1
//=====================================================
2
// trigger_killmonster: kill the target monster
3
//=====================================================
4
class CTriggerKillmonster : public CBaseEntity
5
{
6
  DECLARE_CLASS( CTriggerKillmonster, CBaseDelay );
7
public:
8
  void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
9
};
10
 
11
LINK_ENTITY_TO_CLASS( trigger_killmonster, CTriggerKillmonster );
12
 
13
void CTriggerKillmonster::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
14
{
15
  if (!pev->target)
16
    return;
17
 
18
  CBaseMonster * pMonster;
19
 
20
  if (pActivator->IsPlayer()) {
21
    pMonster = (CBaseMonster*)UTIL_FindEntityByTargetname(NULL, STRING(pev->target));
22
 
23
    if (pMonster) pMonster->Killed(pActivator->pev, GIB_NORMAL);
24
  }
25
 
26
  pev->target = NULL;
27
}


FGD:

C++ Source Code:
1
@PointClass base(Targetname) = trigger_killmonster : "Trigger Kill Monster"
2
[
3
target(target_destination) : "Monster for kill!"
4
]

__________________
-Brain is dead-


Отправлено Дядя Миша 25-07-2013 в 17:17:

Мне эта тема всё больше начинает напоминать программу "поезд"

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено KiQ 25-07-2013 в 19:46:

Дядя Миша ну я ж говорю, не идеальный вариант. У тентакля и контролера Killed вообще ничего не дает

Добавлено 25-07-2013 в 21:26:

Хотя мой вариант хотя бы работает с обычными монстрами

Добавлено 25-07-2013 в 22:41:

Ан нет, только с тентаклем такая фигня со смертью

Добавлено 25-07-2013 в 22:46:

Вобщем через мой вариант (а именно этого, вроде хочет ТС) просто и чисто организовать смерть хентакля не выйдет, хотя в целом это возможно.

Добавлено 25-07-2013 в 23:20:

В общем, исправление для хентакля. Во-первых, нужно в CTentacle добавить функцию

C++ Source Code:
void MonsterUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );


это делается в файле tentacle.cpp в декларации класса по аналогии с CommandUse, ничего сложного.

Потом просто вставляем над функцией CommandUse нашу:

C++ Source Code:
1
/*
2
============
3
MonsterUse
4
============
5
*/
6
void CTentacle::MonsterUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ){
7
  CTentacle::CommandUse( pActivator, pCaller, useType, value);
8
}


Она как бы играет роль заглушки в данном случае.

И теперь исправленный и дополненный вариант моего триггера:

C++ Source Code:
1
//=====================================================
2
// trigger_killmonster: kill the target monster
3
//=====================================================
4
class CTriggerKillmonster : public CBaseEntity
5
{
6
  DECLARE_CLASS( CTriggerKillmonster, CBaseEntity );
7
public:
8
  void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
9
};
10
 
11
LINK_ENTITY_TO_CLASS( trigger_killmonster, CTriggerKillmonster );
12
 
13
void CTriggerKillmonster::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
14
{
15
  if ( !pev->target )
16
    return;
17
 
18
  if ( pActivator->IsPlayer() )
19
  {
20
    CBaseMonster * pMonster = (CBaseMonster*)UTIL_FindEntityByTargetname( NULL, STRING( pev->target ) );
21
 
22
    if ( pMonster )
23
    {
24
 
25
      if ( FClassnameIs( pMonster, "monster_tentacle" ) )
26
      {
27
        pMonster->MonsterUse( pActivator, pCaller, USE_OFF, 0);
28
 
29
        return;
30
      }
31
      else
32
        pMonster->Killed( pActivator->pev, GIB_NORMAL );
33
    }
34
  }
35
 
36
  pev->target = NULL;
37
}


Вроде ничего не забыл. Триггер работает, хентакля при нажатии на кнопку дохнет. Может далеко не идеальный вариант, но я прошу, если кто-то знает как лучше, отпишитесь, пожалуйста

Добавлено 25-07-2013 в 23:46:

Кстати, монстров для расправы можно указывать через trigger_changetarget. Таким образом можно повторно использовать один и тот же триггер, например в сочетании с monstermaker. Допустим, в игре вроде BaseDefence, где можно в конце каждого раунда рождать монстра, убиваемого через определенные действия игроков, в результате которых и будет активирован trigger_killmonster

__________________
-Brain is dead-


Временная зона GMT. Текущее время 01:55.
Показать все 20 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024