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:
Хочу 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... Это в теории. На практике я не пробовал 
__________________
Отправлено 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 ) |
7 | vec3_t wishorigin, wishvel, test; |
9 | // Copy movement amounts |
10 | float fmove = pmove->cmd.forwardmove; |
11 | float smove = pmove->cmd.sidemove; |
13 | VectorNormalize ( pmove->forward ); |
14 | VectorNormalize ( pmove->right ); |
16 | for (i=0 ; i<3 ; i++) // Determine x and y parts of velocity |
18 | wishvel[i] = pmove->forward[i]*fmove + pmove->right[i]*smove; |
20 | wishvel[2] += pmove->cmd.upmove; |
22 | VectorMA (pmove->origin, pmove->frametime, wishvel, wishorigin); |
24 | for ( i = 0; i < pmove->numvisent; i++ ) |
26 | pe = &pmove->visents[i]; |
28 | if ( pe->model && (modtype_t)pmove->PM_GetModelType( pe->model ) == mod_brush && pe->sequence == 666 ) |
30 | hull = (hull_t *)pmove->PM_HullForBsp( pe, test ); |
34 | num = hull->firstclipnode; |
36 | // Offset the test point appropriately for this hull. |
37 | VectorSubtract ( wishorigin, test, test); |
39 | // Test the player's hull for intersection with this model |
40 | if ( pmove->PM_HullPointContents (hull, num, test) == CONTENTS_EMPTY) |
43 | //Вот здесь по-хорошему надо бы рассчитать скольжение вдоль модели |
45 | //Поэтому просто зануляем скорость |
46 | VectorClear(pmove->velocity); |
Находим PM_PlayerMove и после строк
C++ Source Code:
2 | // Don't run ladder code if dead or on a train |
3 | if ( !pmove->dead && !(pmove->flags & FL_ONTRAIN) ) |
Добавляем
C++ Source Code:
if ( pmove->movetype != MOVETYPE_NOCLIP && PM_CheckForPlayerClip()) |
Теперь код собсна энтити, в bmodels.cpp после кода func_monsterclip добавляем:
C++ Source Code:
1 | // ------------------------------------------------------------------------------- |
3 | // Player only clip brush |
5 | // ------------------------------------------------------------------------------- |
6 | class CFuncPlayerClip : public CFuncWall |
10 | void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) {} // Clear out func_wall's use function |
13 | LINK_ENTITY_TO_CLASS( func_playerclip, CFuncPlayerClip ); |
15 | void CFuncPlayerClip::Spawn( void ) |
18 | if ( CVAR_GET_FLOAT("showtriggers") == 0 ) |
19 | pev->effects = EF_NODRAW; |
21 | pev->solid = SOLID_NOT; |
Компилим и сервер, и клиент.
Коряво тут то, что игрок не скользит вдоль браша, а тупо останавливается. Но мне влом делать это скольжение, слишком сложно и думать надо :)__________________
Отправлено 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 я тебе написал вариант, что не устраивает? не нравится, что игрок не скользит - бери и сам дорабатывай, не умеешь - пользуйся тем, что другие сделали. А хватит хамить, как последнее быдло!
__________________
Отправлено Genesis 17-01-2008 в 14:40:
Я не умею кодить. ВСЁ!!