HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Спрайт оружия (https://hlfx.ru/forum/showthread.php?threadid=2684)
Отправлено [)r0n 11-03-2011 в 09:53:
Спрайт оружия
Нашел тутор, по которому сделал подбор оружия в стиле Halo. Т.е. в один слот можно поместить только одно оружие. Чтобы оружие сменить надо подойти к стволу который лежит на земле, нажать "использовать".
Вопрос такого плана, я ковыряюсь в tri.cpp, каким условием можно оттуда проверить находиться ли в зоне досягаемости игрока оружие, и что это за оружие?
Отправлено KiQ 11-03-2011 в 11:01:
[)r0n а я думал он только за отрисовку отвечает
__________________
-Brain is dead-
Отправлено Дядя Миша 11-03-2011 в 11:41:
[)r0n на клиенте этого делать не надо. Делай на сервере.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено [)r0n 11-03-2011 в 11:54:
я в Си абсолютный 0, просто подумал, что можно сделать по аналогии с Blood Overlay (тутор есть на форуме), только условие заменить. Так что, просьба к адептам C++ особо не смеяться 
Добавлено 11-03-2011 в 14:54:
Дядя Миша, а есть возможность сделать на клиенте?
Отправлено KiQ 11-03-2011 в 12:00:
[)r0n я думаю это надо делать в функции поднятия оружия. А потом слать сообщение на клиент.
__________________
-Brain is dead-
Отправлено [)r0n 11-03-2011 в 12:14:
KiQ, с CBasePlayerWeapon::AddToPlayer пойдет?
Отправлено KiQ 11-03-2011 в 12:59:
[)r0n думаю нет. Она же вызывается уже после поднятия?
__________________
-Brain is dead-
Отправлено Дядя Миша 11-03-2011 в 13:15:
Цитата:
[)r0n писал:
а есть возможность сделать на клиенте?
нету. Как ты определишь что это пушка? Разве что новый флаг завести в pev->flags__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено [)r0n 11-03-2011 в 17:00:
Ок, а как всетаки определить, что за оружие лежит перед игроком?
Отправлено Дядя Миша 11-03-2011 в 17:06:
Цитата:
[)r0n писал:
Ок, а как всетаки определить, что за оружие лежит перед игроком?
ты по русски умееш читать? Тебе написали что никак это на клиенте не сделать. Во всяком случае красиво, надежно и просто.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено [)r0n 11-03-2011 в 17:20:
Дядя Миша, Не совсем точно выразился. Имелось в виду как все таки узнать, что за оружие перед игроком на сервере.
Отправлено Ku2zoff 11-03-2011 в 17:54:
[)r0n надо сделать трейс от игрока, который будет проверять, что за энтитя находится в месте, куда направлен прицел. Штоб сильно не грузить проц, можно этот трейс делать не постоянно, а в момент нажатия кнопочки "USE". И проверять энтитю по имени класса. А потом уже можно и на клиент мессагу отправлять, если понадобится.
Отправлено Дядя Миша 11-03-2011 в 17:54:
Цитата:
[)r0n писал:
Имелось в виду как все таки узнать, что за оружие перед игроком на сервере.
ну что конкретно узнать?
делаем UTIL_FindEntityInSphere, проверяем класснейм на 'weapon_", если совпадает делаем преобразование в CBasePlayerWeapon и вызываем GetItemInfo. А там уже глядим что это за пушка и чего в ней.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Ku2zoff 11-03-2011 в 18:00:
Я так понял, оружие у тебя подбирается юзанием. Нужно при подбирании какой-либо пушки ставить игроку определённый флаг или переменную. Если есть флаг - значит у игрока есть пушка, значит вторая пушка, ставящая игроку такой же флаг не подберётся. Теперь делаем трейс, проверяем, если пушка с другим флагом, то она подбирается, если с таким же - старая выкидывается, новая подбирается.
Отправлено KiQ 11-03-2011 в 19:26:
Нифига себе
я думал это надо в Deploy у пушки прописывать и мессагой на клиент слать
Добавлено 11-03-2011 в 21:49:
Хорошо, что не посоветовал
Добавлено 11-03-2011 в 21:52:
Пойду курить вальвовскую википедию
Добавлено 11-03-2011 в 22:26:
Думаю, UTIL_FindEntityInSphere будет предпочтительнее, ведь тогда не надо обязательно смотреть на пушку.
__________________
-Brain is dead-
Отправлено [)r0n 12-03-2011 в 00:07:
Ku2zoff, а зачем флаги? Оружие и так прекрасно подбирается, мне просто надо сделать, чтобы на экране появлялся спрайт оружия которое игрок возьмет, если нажмет на USE. Основной код при этом находиться в CBasePlayerWeapon::AddToPlayer. Т.к. благодаря новым проверкам, игрок не может взять оружие, пока не нажмет на USE.
2 Дядя Миша
...я могу, а как проверить только на наличие в названии класса слова "weapon_"? Что то мне подсказывает, что если я напишу FClassnameIs(pEntity->pev, "weapon_"), то работать не будет.
Отправлено KiQ 12-03-2011 в 07:49:
[)r0n а почему ты не хочешь сделать вывод спрайта сразу в этом условии?
C++ Source Code:
1 | if (FClassnameIs (pEntity->pev ,"weapon_mp5"){ |
4 | if (FClassnameIs (pEntity->pev ,"weapon_crowbar"){ |
7 | if (FClassnameIs (pEntity->pev ,"weapon_egon"){ |
8 | //Рисуем спрайт пылесоса |
__________________
-Brain is dead-
Отправлено Ku2zoff 12-03-2011 в 07:50:
>>Что то мне подсказывает, что если я напишу FClassnameIs(pEntity->pev, "weapon_"), то работать не будет.
[)r0n UTIL_FindEntityInSphere работает в определённом радиусе, игрок будет задом к оружию стоять, к тому же оружие будет за стенкой/ящиком/дверью/ещёчемто, а в ХУДе спрайт загорится. Нехорошо. Лучше сделать трейс по взгляду игрока. Ещё можно "подсветить" модель оружия, на которую направлен прицел или сделать "скобки" как в Деус Эксе, но второе сложнее.
А по поводу проверки на оружие как класс энтить вообще, придётся задать всем оружиям какую-нибудь переменную (её придётся объявить в классе CBaseEntity и по умолчанию сделать нулевой или FALSE, а для оружия единичкой или TRUE) и проверять её типа вот так:
C++ Source Code:
if (pEntity->мояпеременная != 0) |
Отправлено [)r0n 12-03-2011 в 09:35:
KiQ, ок, попробуем.
Цитата:
Ku2zoff писал:
Лучше сделать трейс по взгляду игрока.
В трейсах не шарю, по этому я пока обойдусь сферами.
Цитата:
Ku2zoff писал:
Ещё можно "подсветить" модель оружия, на которую направлен прицел или сделать "скобки" как в Деус Эксе
покажешь как?
Отправлено Дядя Миша 12-03-2011 в 10:19:
Цитата:
[)r0n писал:
Что то мне подсказывает, что если я напишу FClassnameIs(pEntity->pev, "weapon_"), то работать не будет.
C++ Source Code:
1 | if( !strncmp( STRING( pEntity->pev->classname ), "weapon_", 7 )) |
3 | CBasePlayerWeapon *pWeapon = (CBasePlayerWeapon *)pEnnity; |
4 | pWeapon->GetItemInfo(blablabla ); |
Цитата:
Ku2zoff писал:
Лучше сделать трейс по взгляду игрока.
угу и сидеть часами целится, чтобы трейс и оружие совпали.
Нахрен там трейс не нужен, лучше сделать проверку на FViewInCone, по типу trigger_onsight фспирите.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено KiQ 12-03-2011 в 10:54:
Дядя Миша гугл подавился
Цитата:
По запросу FViewInCone не найдено ни одного документа.
__________________
-Brain is dead-
Отправлено Дядя Миша 12-03-2011 в 11:25:
Цитата:
KiQ писал:
гугл подавился
ты бы ему еще "рембытспецстройхимтресттехмонтаж" вбил, чтобы уж наверняка. Открывай combat.cpp на строчке 1170 и ога.
Правда его придется слегка переделать, поскольку он находится в классе монстров.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено KiQ 12-03-2011 в 11:47:
Дядя Миша ну я думал оно должно быть на вальвовской вики. Или они сами не знают всех функций что в движок напихали
Добавлено 12-03-2011 в 14:47:
А вообще мне пока что делать такую фишку не зачем. Просто возьму на заметку.
__________________
-Brain is dead-
Отправлено Ku2zoff 12-03-2011 в 12:09:
>>лучше сделать проверку на FViewInCone
Ну это конечно лучше, т.к. площадь, покрываемая конусом намного больше точки трейса 
Отправлено [)r0n 12-03-2011 в 13:26:
По поводу конуса, вот код с буржуинского форума:
C++ Source Code:
1 | BOOL CBasePlayerWeapon :: CanSee(CBaseEntity *pLooker, CBaseEntity *pSeen) |
4 | if (pev->frags && (pLooker->pev->origin - pSeen->pev->origin).Length() > pev->frags) |
7 | // check FOV if appropriate |
8 | if (pev->max_health < 360) |
10 | // copied from CBaseMonster's FInViewCone function |
13 | float flComp = pev->health; |
14 | UTIL_MakeVectors ( pLooker->pev->angles ); |
15 | vec2LOS = ( pSeen->pev->origin - pLooker->pev->origin ).Make2D(); |
16 | vec2LOS = vec2LOS.Normalize(); |
17 | flDot = DotProduct (vec2LOS , gpGlobals->v_forward.Make2D() ); |
19 | // ALERT(at_debug, "flDot is %f\n", flDot); |
21 | if ( pev->max_health == -1 ) |
23 | CBaseMonster *pMonst = pLooker->MyMonsterPointer(); |
25 | flComp = pMonst->m_flFieldOfView; |
27 | return FALSE; // not a monster, can't use M-M-M-MonsterVision |
30 | // outside field of view |
35 | // check LOS if appropriate |
36 | if (!FBitSet(pev->spawnflags, SF_ONSIGHT_NOLOS)) |
39 | if (SF_ONSIGHT_NOGLASS) |
40 | UTIL_TraceLine( pLooker->EyePosition(), pSeen->pev->origin, ignore_monsters, ignore_glass, pLooker->edict(), &tr ); |
42 | UTIL_TraceLine( pLooker->EyePosition(), pSeen->pev->origin, ignore_monsters, dont_ignore_glass, pLooker->edict(), &tr ); |
43 | if (tr.flFraction < 1.0 && tr.pHit != pSeen->edict()) |
Добавлено 12-03-2011 в 16:26:
не могу месагу послать 
в player.cpp
прописал int gmsgСoDws = 0;
затем ниже gmsgСoDws = REG_USER_MSG( "СoDws", 8 );
потом в weapons.h вставил external int gmsgСoDws;
а в weapon.cpp вставил это:
MESSAGE_BEGIN( MSG_ONE, gmsgCoDws, NULL, pev )
WRITE_STRING( STRING( pEntity->pev->classname ) );
MESSAGE_END();
вылезла ошибка:
error C2064: term does not evaluate to a function
И еще вопрос, как правильно получить мессагу на клиенте, чтобы потом отправленное можно было в tri.cpp получить?
Отправлено KiQ 12-03-2011 в 13:54:
--а в weapon.cpp вставил это:
а куда конкретно?
__________________
-Brain is dead-
Отправлено Дядя Миша 12-03-2011 в 13:59:
Цитата:
[)r0n писал:
error C2064: term does not evaluate to a function
это значит, ты пытаешься вызывать некую переменную как функцию.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено [)r0n 16-03-2011 в 12:48:
Наконец таки нашел где баг в серверной части: оказалось не хватает ";"
Как правильно "словить" на клиенте мою строку, чтобы в tri.pp можно было ей воспользоваться?
Отправлено SiPlus 16-03-2011 в 13:06:
Я вот что подумал: а нельзя ли сделать все это посылом сообщения клиенту от оружия через Touch оружия? К оружию прикасается игрок - оружие посылает сообщение игроку для включения элемента HUD с информацией о самом себе. Касание прекращается/игрок умирает - элемент HUD отключается.
Отправлено KiQ 16-03-2011 в 13:54:
SiPlus я так и предлагал, но вроде он хочет, чтобы спрайт рисовался и вблизи оружия, даже если непосредственного контакта нет.
__________________
-Brain is dead-
Отправлено [)r0n 17-03-2011 в 07:08:
и в третий раз спрошу:
Цитата:
[)r0n писал:
Как правильно "словить" на клиенте мою строку, чтобы в tri.pp можно было ей воспользоваться?
Отправлено KiQ 17-03-2011 в 08:14:
[)r0n насколько я помню сообщения ловятся в hud.cpp По крайней мере там можно посмотреть, как это делается.
__________________
-Brain is dead-
Отправлено [)r0n 20-03-2011 в 09:02:
Чтобы новую тему не создавать спрошу тут:
Как в SOHL реализовано, что игрок не может юзать энтити сквозь стены? Подскажите где конкретно искать этот код.
Отправлено Дядя Миша 20-03-2011 в 10:40:
[)r0n в player.cpp ключевое слово FCAP_ONLYDIRECT_USE.
Там просто делается траселайн, в отличие от стандартного подхода, где идет поиск в заданной сфере.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено [)r0n 22-03-2011 в 03:56:
Дядя Миша, спасибо, все успешно "своровалось"
Теперь еще один ворпос:
Один щедрый человек поделился когда-то кодом hud-а из paranoia. Все сделал как описано в туторе, новый hud появляется, но при этом старый hud от half-life никуда не делся, кто-нибудь знает как от него избавиться?
А вот и сам тутор:
HUD этот из Paranoia взят, картинки я перерисовал под свой мод.
Потом напишу тутор как сделать такой HUD, там несложно, берешь из паранойи VGUI_HUD.h, VGUI_HUD.cpp и добавляешь в свой проект. Потом идешь в vgui_teamfortressviewport.h и там к аналогичным строкам добавляешь
C++ Source Code:
потом идешь в class TeamFortressViewport : public Panel
и во втором public добавляешь:
C++ Source Code:
CHud2* m_pHud2; // 1nfnite |
потом идешь в vgui_teamfortressviewport.cpp и добавляешь инклуд:
C++ Source Code:
потом ищешь
C++ Source Code:
TeamFortressViewport::TeamFortressViewport(int x,int y,int wide,int tall) : Panel(x,y,wide,tall), m_SchemeManager(wide,tall) |
и там в конце функции добавляешь
C++ Source Code:
3 | m_pHud2->setParent(this); |
4 | m_pHud2->setVisible(true); |
потом идешь в Initialize и там добавляешь
C++ Source Code:
m_pHud2->Initialize(); // 1nf |
С этим файлом все.
Дальше идешь в hud.cpp и там
C++ Source Code:
#include "vgui_TeamFortressViewport.h" |
дальше идем в Init и там добавляем перед
C++ Source Code:
GetClientVoiceMgr()->Init(&g_VoiceStatusHelper, (vgui::Panel**)&gViewPort); |
вот это:
C++ Source Code:
С этим файлом все.
Идем в health.cpp и добавляем:
C++ Source Code:
#include "vgui_TeamFortressViewport.h" // 1nf |
#include "vgui_hud.h" // 1nf |
потом заменяем
C++ Source Code:
int CHudHealth:: MsgFunc_Health(const char *pszName, int iSize, void *pbuf ) |
на эту:
C++ Source Code:
1 | int CHudHealth:: MsgFunc_Health(const char *pszName, int iSize, void *pbuf ) |
3 | // TODO: update local health data |
4 | BEGIN_READ( pbuf, iSize ); |
7 | m_iFlags |= HUD_ACTIVE; |
9 | // Only update the fade if we've changed health |
16 | gViewPort->m_pHud2->UpdateHealth(x); // buz |
Далее идем в battery.cpp и опять же добавляем:
C++ Source Code:
#include "vgui_TeamFortressViewport.h" // 1nf |
#include "vgui_hud.h" // 1nf |
дальше заменяем
C++ Source Code:
int CHudBattery:: MsgFunc_Battery(const char *pszName, int iSize, void *pbuf ) |
на эту:
C++ Source Code:
1 | int CHudBattery:: MsgFunc_Battery(const char *pszName, int iSize, void *pbuf ) |
3 | m_iFlags |= HUD_ACTIVE; |
6 | BEGIN_READ( pbuf, iSize ); |
15 | gViewPort->m_pHud2->UpdateArmor(x); // 1nf |
Все.
Теперь кладем картинки этого худа в свой мод и наслаждаемся. Кстати, вот тебе архив с картинками из моего мода и vgui_hud. Из паранойи vgui_hud небери - там нужно будет еще кое-что делать, это уже будет касаться нетолько здоровья и брони, но еще и патронов и картинок оружия.
Отправлено FiEctro 22-03-2011 в 10:08:
[)r0n
return 0; где нить в функции отрисовки хада впихни. В той же параное подсмотри.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Отправлено Дядя Миша 22-03-2011 в 11:03:
Цитата:
[)r0n писал:
Все сделал как описано в туторе, новый hud появляется, но при этом старый hud от half-life никуда не делся, кто-нибудь знает как от него избавиться?
у вас обострение на почве не умения думать и пользоваться поиском?
две недели назад эта же самая тема подымалась.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено [)r0n 02-04-2011 в 14:22:
В халве, когда что-нибудь подбираешь с правой стороны экрана появляется спрайт. Как приподнять высоту появления спрайта? Просто, переделал худ, он немного выше стандартного и появляющиеся спрайты предметов налезают на худ.
Отправлено Дядя Миша 02-04-2011 в 14:52:
[)r0n гугли в ammohistory.cpp
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'