HLFX.Ru Forum Страницы (2): [1] 2 »
Показать все 22 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Хочу func_playerclip! (https://hlfx.ru/forum/showthread.php?threadid=1110)


Отправлено Genesis 15-01-2008 в 12:42:

Question Хочу func_playerclip!

Мне очень нужно сделать так, чтобы игрок не мог проходить через определенную область, но могли проходить монстры!! Как?


Отправлено Ku2zoff 15-01-2008 в 13:42:

А монстры не могут проходить через браши с clip-текстурой?


Отправлено Дядя Миша 15-01-2008 в 14:06:

Ku2zoff по идее могут, если трасинг правильно настроить.


Отправлено XaeroX 16-01-2008 в 03:38:

По-моему не могут, потому что они юзают тоже клиппинг халлс...
Но можно в принципе помудрить и сделать func_playerclip, прописав его действие в pm_shared.c... Это в теории. На практике я не пробовал

__________________

xaerox on Vivino


Отправлено Scrama 16-01-2008 в 08:20:

Простейший вариант (как маппер говорю): сделать функ_воллтогл NULL-текстурой и включать его от триггера, на который монстры не действуют. Это в том случае, если игрок не идет рядом с монстром. А вообще - плохой тон не пускать игрока куда-то клипом. Дверь придумай, или лифт, куда игрок просто пролезть не сможет вместе с монстром.

__________________
"Злобным гениям не нужна харизма." © Shooter__Andy
"Making stuff for an "old ugly game" can be ten times more fun than grinding on a map for a dull, next-gen title." © Lunaran


Отправлено Дядя Миша 16-01-2008 в 13:33:

если уж действительно так хочется - рекомендую изучить pmove.c из второй кваки - там есть подобная фишка.


Отправлено XaeroX 16-01-2008 в 17:50:

Вот малость корявое решение, но его можно впоследствии доработать.

Открываем pm_shared.c и после функции PM_AddGravity добавляем функцию:

C++ Source Code:
1
int PM_CheckForPlayerClip( void )
2
{
3
  int			i;
4
  physent_t	*pe;
5
  hull_t		*hull;
6
  int			num;
7
  vec3_t		wishorigin, wishvel, test;
8
 
9
  // Copy movement amounts
10
  float fmove = pmove->cmd.forwardmove;
11
  float smove = pmove->cmd.sidemove;
12
 
13
  VectorNormalize ( pmove->forward );
14
  VectorNormalize ( pmove->right );
15
 
16
  for (i=0 ; i<3 ; i++)       // Determine x and y parts of velocity
17
  {
18
    wishvel[i] = pmove->forward[i]*fmove + pmove->right[i]*smove;
19
  }
20
  wishvel[2] += pmove->cmd.upmove;
21
 
22
  VectorMA (pmove->origin, pmove->frametime, wishvel, wishorigin);
23
 
24
  for ( i = 0; i < pmove->numvisent; i++ )
25
  {
26
    pe = &pmove->visents[i];
27
 
28
    if ( pe->model && (modtype_t)pmove->PM_GetModelType( pe->model ) == mod_brush && pe->sequence == 666 )
29
    {
30
      hull = (hull_t *)pmove->PM_HullForBsp( pe, test );
31
 
32
      if (!hull)
33
        continue;
34
      num = hull->firstclipnode;
35
 
36
      // Offset the test point appropriately for this hull.
37
      VectorSubtract ( wishorigin, test, test);
38
 
39
      // Test the player's hull for intersection with this model
40
      if ( pmove->PM_HullPointContents (hull, num, test) == CONTENTS_EMPTY)
41
        continue;
42
 
43
      //Вот здесь по-хорошему надо бы рассчитать скольжение вдоль модели
44
      //Но мне влом :)
45
      //Поэтому просто зануляем скорость
46
      VectorClear(pmove->velocity);
47
 
48
      return 1;
49
 
50
    }
51
  }
52
 
53
  return 0;
54
}


Находим PM_PlayerMove и после строк
C++ Source Code:
1
g_onladder = 0;
2
// Don't run ladder code if dead or on a train
3
if ( !pmove->dead && !(pmove->flags & FL_ONTRAIN) )
4
{
5
  pLadder = PM_Ladder();
6
  if ( pLadder )
7
  {
8
    g_onladder = 1;
9
  }
10
}

Добавляем
C++ Source Code:
if ( pmove->movetype != MOVETYPE_NOCLIP && PM_CheckForPlayerClip())
  return;  // Can't move


Теперь код собсна энтити, в bmodels.cpp после кода func_monsterclip добавляем:
C++ Source Code:
1
// -------------------------------------------------------------------------------
2
//
3
// Player only clip brush
4
//
5
// -------------------------------------------------------------------------------
6
class CFuncPlayerClip : public CFuncWall
7
{
8
public:
9
  void	Spawn( void );
10
  void	Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) {}		// Clear out func_wall's use function
11
};
12
 
13
LINK_ENTITY_TO_CLASS( func_playerclip, CFuncPlayerClip );
14
 
15
void CFuncPlayerClip::Spawn( void )
16
{
17
  CFuncWall::Spawn();
18
  if ( CVAR_GET_FLOAT("showtriggers") == 0 )
19
    pev->effects = EF_NODRAW;
20
  pev->sequence = 666;
21
  pev->solid = SOLID_NOT;
22
}


Компилим и сервер, и клиент.
Коряво тут то, что игрок не скользит вдоль браша, а тупо останавливается. Но мне влом делать это скольжение, слишком сложно и думать надо :)

__________________

xaerox on Vivino


Отправлено Scrama 17-01-2008 в 02:19:

С другой стороны, Offighost на своей конкурсной карте просто поставил trigger_push в дверном проеме и было вполне сносно. Опять же, плохой это тон - невидимые стены.

__________________
"Злобным гениям не нужна харизма." © Shooter__Andy
"Making stuff for an "old ugly game" can be ten times more fun than grinding on a map for a dull, next-gen title." © Lunaran


Отправлено Дядя Миша 17-01-2008 в 08:31:

Scrama триггер_пушами и valve не брезговала.
Обидно это все - зачем не пускать игрока туда, куда очень хочется? все равно ведь врубит ноклип и залетит.


Отправлено Scrama 17-01-2008 в 10:14:

Дядя Миша Вот и я о том же. Над сценарием надо думать заранее, а не решать проблемы по мере их поступления. Что тоже хорошо, но несколько в других обстоятельствах. да разве ж докажешь кому...

__________________
"Злобным гениям не нужна харизма." © Shooter__Andy
"Making stuff for an "old ugly game" can be ten times more fun than grinding on a map for a dull, next-gen title." © Lunaran


Отправлено Genesis 17-01-2008 в 12:10:

Вы не знаете зачем мне это надо, а объяснять вам бестолку.


Отправлено Дядя Миша 17-01-2008 в 12:49:

Цитата:
Вы не знаете зачем мне это надо, а объяснять вам бестолку.

Ну значит и не жди внятных ответов.


Отправлено Genesis 17-01-2008 в 13:16:

Я внятно задал вопрос, как сделать чтобы игрок не мог пройти через определенную зону, а монстр мог? Ты совсем тупой да???


Отправлено XaeroX 17-01-2008 в 14:33:

Genesis я тебе написал вариант, что не устраивает? не нравится, что игрок не скользит - бери и сам дорабатывай, не умеешь - пользуйся тем, что другие сделали. А хватит хамить, как последнее быдло!

__________________

xaerox on Vivino


Отправлено Genesis 17-01-2008 в 14:40:

Я не умею кодить. ВСЁ!!


Временная зона GMT. Текущее время 01:09. Страницы (2): [1] 2 »
Показать все 22 сообщений этой темы на одной странице

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