HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > как научить монстров следовать игроку ?
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
илья2
Житель форума

Группа: Неопытный
Дата регистрации: Mar 2020
Проживает: Волгоград
Сообщений: 381
Возраст: 22

Рейтинг



Question как научить монстров следовать игроку ?

Хотелось бы как у Баника: нажал на монстра, и он идет за игроком. Как такое реализовать ?

__________________
илья

Сообщить модератору | | IP: Записан
Сообщение: 212767

Старое сообщение 18-02-2023 17:43
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



А Барник что не монстр?

__________________
My Projects: download page

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

Цитата:

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

Сообщить модератору | | IP: Записан
Сообщение: 212768

Старое сообщение 18-02-2023 18:44
-
Napoleon321
Admiral

Дата регистрации: Jan 2017
Проживает: Sofia
Сообщений: 57
Возраст: 34

Рейтинг



Open barney.cpp or scientist.cpp and look for "follow".

All you need is to either base your new monsters on scientists/barneys or copy the same logic to the monster you would like to create.

Another thing you need to take into account would the classify function... Obviously Gordon (the player) is human... so it should be human ally the one thing that should follow it... or it might follow the player with intention of killing it

__________________
FlatLine Arena | Tutorials

If you don't like something, MOD it!

Сообщить модератору | | IP: Записан
Сообщение: 212808

Старое сообщение 20-02-2023 07:56
- За что?
Demiurge
Наглая морда.

Дата регистрации: Feb 2023
Проживает: Alt reality of Earth
Сообщений: 15
Возраст: 42

Рейтинг



Если в HL1 - то там всё намного сложнее. Дело в том, как мне помнится, функция Follow привязана к Барни и Учёным, и просто так не размножается. Для этого надо сделать следующее:
Спасибо Inferno из MilleniumTeam.

C++ Source Code:
1
Изменения в файлах.
2
 
3
talkmonster.cpp
4
 
5
Вырезаем:
6
 
7
Task_t	tlMoveAway[] =
8
{
9
  { TASK_SET_FAIL_SCHEDULE,	(float)SCHED_MOVE_AWAY_FAIL },
10
  { TASK_STORE_LASTPOSITION,	(float)0		    },
11
  { TASK_MOVE_AWAY_PATH,		(float)100		    },
12
  { TASK_WALK_PATH_FOR_UNITS,	(float)100		    },
13
  { TASK_STOP_MOVING,		(float)0		    },
14
  { TASK_FACE_PLAYER,		(float)0.5		    },
15
};
16
 
17
Schedule_t	slMoveAway[] =
18
{
19
  {
20
    tlMoveAway,
21
    ARRAYSIZE ( tlMoveAway ),
22
    0,
23
    0,
24
    "MoveAway"
25
  },
26
};
27
 
28
Task_t	tlMoveAwayFail[] =
29
{
30
  { TASK_STOP_MOVING,	(float)0	},
31
  { TASK_FACE_PLAYER,	(float)0.5	},
32
};
33
 
34
Schedule_t	slMoveAwayFail[] =
35
{
36
  {
37
    tlMoveAwayFail,
38
    ARRAYSIZE ( tlMoveAwayFail ),
39
    0,
40
    0,
41
    "MoveAwayFail"
42
  },
43
};
44
 
45
Task_t	tlMoveAwayFollow[] =
46
{
47
  { TASK_SET_FAIL_SCHEDULE,	(float)SCHED_TARGET_FACE },
48
  { TASK_STORE_LASTPOSITION,	(float)0		 },
49
  { TASK_MOVE_AWAY_PATH,		(float)100		 },
50
  { TASK_WALK_PATH_FOR_UNITS,	(float)100		 },
51
  { TASK_STOP_MOVING,		(float)0	 	 },
52
  { TASK_SET_SCHEDULE,		(float)SCHED_TARGET_FACE },
53
};
54
 
55
Schedule_t	slMoveAwayFollow[] =
56
{
57
  {
58
    tlMoveAwayFollow,
59
    ARRAYSIZE ( tlMoveAwayFollow ),
60
    0,
61
    0,
62
    "MoveAwayFollow"
63
  },
64
};
65
 
66
И вставляем это в defaultai.cpp, сразу после define's.
67
 
68
Опять идем в talkmonster.cpp и находим строку:
69
 
70
DEFINE_CUSTOM_SCHEDULES( CTalkMonster )
71
{
72
  ...
73
и вырезаем эти строки:
74
  slMoveAway,
75
  slMoveAwayFollow,
76
  slMoveAwayFail,
77
  ...
78
};
79
 
80
Снова идем в defaultai.cpp, находим там:
81
DEFINE_CUSTOM_SCHEDULES( CTalkMonster )
82
{
83
  вставляем вырезанные 3 строки.
84
  ...
85
};
86
 
87
Опять идем в talkmonster.cpp и находим функцию:
88
 
89
void CTalkMonster :: StartTask( Task_t *pTask )
90
{
91
  ...
92
  //case TASK_FACE_PLAYER:  // эту строчку закоментируем
93
  case TASK_TLK_LOOK_AT_CLIENT:
94
    case TASK_TLK_CLIENT_STARE:
95
        // track head to the client for a while.
96
      m_flWaitFinished = gpGlobals->time + pTask->flData;
97
      break;
98
 
99
  теперь копируем
100
case TASK_FACE_PLAYER:
101
    m_flWaitFinished = gpGlobals->time + pTask->flData;
102
  break;
103
 
104
Теперь идем в файл schedule.cpp и вставляем вырезанный блок кода в функцию:
105
 
106
  void CBaseMonster :: StartTask ( Task_t *pTask )
107
  {
108
    ...
109
    ...
110
  }
111
 
112
Вырезаем следующий блок кода:
113
 
114
case TASK_CANT_FOLLOW:
115
    StopFollowing( FALSE );
116
  //	PlaySentence( m_szGrp[TLK_STOP], RANDOM_FLOAT(2, 2.5), VOL_NORM, ATTN_NORM );
117
  TaskComplete();
118
  break;
119
 
120
case TASK_WALK_PATH_FOR_UNITS:
121
    m_movementActivity = ACT_WALK;
122
  break;
123
 
124
case TASK_MOVE_AWAY_PATH:
125
  {
126
    Vector dir = pev->angles;
127
    dir.y = pev->ideal_yaw + 180;
128
    Vector move;
129
 
130
    UTIL_MakeVectorsPrivate( dir, move, NULL, NULL );
131
    dir = pev->origin + move * pTask->flData;
132
    if ( MoveToLocation( ACT_WALK, 2, dir ) )
133
    {
134
      TaskComplete();
135
    }
136
    else if ( FindCover( pev->origin, pev->view_ofs, 0, CoverRadius() ) )
137
    {
138
      // then try for plain ole cover
139
      m_flMoveWaitFinished = gpGlobals->time + 2;
140
      TaskComplete();
141
    }
142
    else
143
    {
144
      // nowhere to go?
145
      TaskFail();
146
    }
147
  }
148
  break;
149
  ...
150
 
151
Теперь идем в файл schedule.cpp и вставляем вырезанный блок кода в функцию:
152
 
153
  void CBaseMonster :: StartTask ( Task_t *pTask )
154
  {
155
    ...
156
    // возможно по аналогии с другими case надо будет вставить несколько {}
157
    ...
158
  }
159
 
160
Опять идем в talkmonster.cpp и находим функцию:
161
 
162
  void CTalkMonster :: RunTask( Task_t *pTask )
163
  {
164
    ...
165
  Вырезаем следующий блок кода:
166
 
167
  case TASK_WALK_PATH_FOR_UNITS:
168
    {
169
      float distance;
170
 
171
      distance = (m_vecLastPosition - pev->origin).Length2D();
172
 
173
      // Walk path until far enough away
174
      if ( distance > pTask->flData || MovementIsComplete() )
175
      {
176
        TaskComplete();
177
        RouteClear();		// Stop moving
178
      }
179
    }
180
    break;
181
 
182
  case TASK_FACE_PLAYER:
183
    {
184
      // Get edict for one player
185
      edict_t *pPlayer = g_engfuncs.pfnPEntityOfEntIndex( 1 );
186
 
187
      if ( pPlayer )
188
      {
189
        MakeIdealYaw ( pPlayer->v.origin );
190
        ChangeYaw ( pev->yaw_speed );
191
        //		IdleHeadTurn( pPlayer->v.origin );
192
        if ( gpGlobals->time > m_flWaitFinished && FlYawDiff() < 10 )
193
        {
194
          TaskComplete();
195
        }
196
      }
197
      else
198
      {
199
        TaskFail();
200
      }
201
    }
202
    break;
203
 
204
  Теперь идем в файл schedule.cpp и вставляем вырезанный блок кода в функцию:
205
 
206
    void CBaseMonster :: RunTask ( Task_t *pTask )
207
    {
208
      ...
209
      // возможно по аналогии с другими case надо будет вставить несколько {}
210
      ...
211
    }
212
 
213
    Опять идем в talkmonster.cpp и помещаем в /* */ функцию LimitFollowers, во всем коде нужно закомментировать еЈ или удалить.
214
 
215
    Затем вырезаем функцию
216
    void CTalkMonster :: Touch( CBaseEntity *pOther )
217
    {
218
    }
219
 
220
    и помещаем еЈ в monsters.cpp, изменив еЈ имя и код
221
    void CBaseMonster :: FollowTouch( CBaseEntity *pOther )
222
    {
223
      if ( IsFollowing() )
224
      {
225
        // Did the player touch me?
226
        if ( pOther->IsPlayer() )
227
        {
228
          // Ignore if pissed at player
229
          if ( m_afMemory & bits_MEMORY_PROVOKED )
230
            return;
231
 
232
          // Stay put during speech
233
          //	if ( IsTalking() )
234
          //		return;
235
 
236
          // Heuristic for determining if the player is pushing me away
237
          float speed = fabs(pOther->pev->velocity.x) + fabs(pOther->pev->velocity.y);
238
 
239
          if ( speed > 50 )
240
          {
241
            SetConditions( bits_COND_CLIENT_PUSH );
242
            MakeIdealYaw( pOther->pev->origin );
243
          }
244
        }
245
      }
246
    }
247
 
248
  Опять идем в talkmonster.cpp и находим функцию:
249
    Schedule_t* CTalkMonster :: GetScheduleOfType ( int Type )
250
    {
251
    вырезаем:
252
 
253
    case SCHED_MOVE_AWAY:
254
        return slMoveAway;
255
 
256
    case SCHED_MOVE_AWAY_FOLLOW:
257
        return slMoveAwayFollow;
258
 
259
    case SCHED_MOVE_AWAY_FAIL:
260
        return slMoveAwayFail;
261
      ...
262
    }
263
 
264
    идем в defaultai.cpp и вставляем в GetScheduleOfType ( int Type )
265
 
266
  Опять идем в talkmonster.cpp и полностью вырезаем функции:
267
 
268
    void CTalkMonster::StopFollowing( BOOL clearSchedule )
269
  здесь нужно закоментировать строки:
270
 
271
    /*
272
    if ( !(m_afMemory & bits_MEMORY_PROVOKED) )
273
    {
274
      PlaySentence(m_szGrp[TLK_UNUSE],RANDOM_FLOAT(2.8, 3.2),VOL_NORM,ATTN_IDLE);
275
      m_hTalkTarget = m_hTargetEnt;
276
  } */
277
 
278
  void CTalkMonster::StartFollowing( CBaseEntity *pLeader )
279
здесь нужно закоментировать строки:
280
 
281
  //	PlaySentence( m_szGrp[TLK_USE], RANDOM_FLOAT(2.8, 3.2), VOL_NORM, ATTN_IDLE );
282
  //	m_hTalkTarget = m_hTargetEnt;
283
 
284
 
285
  BOOL CTalkMonster::CanFollow( void )
286
 
287
  void CTalkMonster :: FollowerUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
288
здесь нужно закоментировать строки:
289
  // Don't allow use during a scripted_sentence
290
  /*	if ( m_useTime > gpGlobals->time )
291
  		return;*/
292
 
293
  //SetBits(m_bitsSaid, bit_saidHelloPlayer);	// Don't say hi after you've started following
294
 
295
  идем в конец файла monsters.cpp и вставляем вырезанные функции.
296
  Заменяем в их именах слово Talk на Base.
297
  например: вместо BOOL CTalkMonster::CanFollow( void ) нужно
298
  BOOL CBaseMonster::CanFollow( void )
299
 
300
Теперь откроем файл talkmonster.h, найдем:
301
  и заменим
302
  /*
303
  enum
304
  {
305
  	SCHED_CANT_FOLLOW = LAST_COMMON_SCHEDULE + 1,
306
  	SCHED_MOVE_AWAY,		// Try to get out of the player's way
307
  	SCHED_MOVE_AWAY_FOLLOW,	// same, but follow afterward
308
  	SCHED_MOVE_AWAY_FAIL,	// Turn back toward player
309
 
310
  	LAST_TALKMONSTER_SCHEDULE,		// MUST be last
311
  };
312
  */
313
 
314
  на
315
 
316
  enum
317
  {
318
    SCHED_FICTION = LAST_COMMON_SCHEDULE + 1, // new
319
 
320
    LAST_TALKMONSTER_SCHEDULE,		// MUST be last
321
  };
322
 
323
  Скопируем
324
  SCHED_CANT_FOLLOW,
325
  SCHED_MOVE_AWAY,	// Try to get out of the player's way
326
  SCHED_MOVE_AWAY_FOLLOW,	// same, but follow afterward
327
  SCHED_MOVE_AWAY_FAIL,	// Turn back toward player
328
 
329
и вставим в файл schedule.h вот сюда:
330
 
331
  typedef enum
332
  {
333
    SCHED_NONE = 0,
334
    SCHED_IDLE_STAND,
335
    ...
336
    ///////////////
337
    сюда
338
    ///////////////
339
    LAST_COMMON_SCHEDULE			// Leave this at the bottom
340
  }
341
 
342
ниже(в файле talkmonster.h):
343
 
344
  enum
345
  {
346
    TASK_TLK_RESPOND = LAST_COMMON_TASK + 1, // new
347
    //	TASK_CANT_FOLLOW = LAST_COMMON_TASK + 1,
348
    //	TASK_MOVE_AWAY_PATH,
349
    //	TASK_WALK_PATH_FOR_UNITS,
350
    //	TASK_FACE_PLAYER,		// Face the player
351
    ...
352
  };
353
 
354
  вырежем отсюда
355
  TASK_MOVE_AWAY_PATH,
356
  TASK_WALK_PATH_FOR_UNITS,
357
  TASK_FACE_PLAYER,
358
  TASK_CANT_FOLLOW,
359
 
360
и вставим в файл schedule.h вот сюда:
361
 
362
  //=========================================================
363
  // These are the shared tasks
364
  //=========================================================
365
  typedef enum
366
  {
367
    TASK_INVALID = 0,
368
    TASK_MOVE_AWAY_PATH,
369
    TASK_WALK_PATH_FOR_UNITS,
370
    TASK_FACE_PLAYER,
371
    TASK_CANT_FOLLOW,
372
    ...
373
  }
374
 
375
откроем файл talkmonster.h, найдем:
376
 
377
  class CTalkMonster : public CBaseMonster
378
  {
379
  public:
380
  и вырежем функции:
381
    BOOL	CanFollow( void );
382
    BOOL	IsFollowing( void ) { return m_hTargetEnt != NULL && m_hTargetEnt->IsPlayer(); }
383
    void	StopFollowing( BOOL clearSchedule );
384
    void	StartFollowing( CBaseEntity *pLeader );
385
    virtual void	DeclineFollowing( void ) {}
386
 
387
    void EXPORT	FollowerUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
388
 
389
    void EXPORT	FollowTouch( CBaseEntity *pOther ); // new
390
 
391
  };
392
 
393
и поместим их в файл basemonster.h, вот сюда:
394
 
395
  class CBaseMonster : public CBaseToggle
396
  {
397
  private:
398
    int			m_afConditions;
399
  public:
400
    здесь есть фунция
401
    //	virtual void StopFollowing( BOOL clearSchedule ) {}
402
    еЈ нужно поместить в комменты
403
    ...
404
    -->например сюда
405
  };
406
 
407
В файле talkmonster.h вырезаем:
408
#define		bits_COND_CLIENT_PUSH		( bits_COND_SPECIAL1 )
409
  и вставляем в файл basemonster.h прямо перед #endif // BASEMONSTER_H

__________________
Что такое РАНО, и что такое ПОЗДНО, когда у нас впереди ВЕЧНОСТЬ.

Сообщить модератору | | IP: Записан
Сообщение: 212903

Старое сообщение 23-02-2023 14:57
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 22:52. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > как научить монстров следовать игроку ?
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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