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

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 Дядя Миша

code:
CBaseEntity *pEntity = NULL; while ((pEntity = UTIL_FindEntityInSphere( pEntity, pev->origin, 512 )) != NULL); { }


Вот сфера в 512 "чвототам", вот только я не знаю как сделать проверку не на все название класса, а только на его начало, т.е. сделать такую проверку...

code:
if (FClassnameIs(pEntity->pev, "weapon_mp5")


...я могу, а как проверить только на наличие в названии класса слова "weapon_"? Что то мне подсказывает, что если я напишу FClassnameIs(pEntity->pev, "weapon_"), то работать не будет.


Отправлено KiQ 12-03-2011 в 07:49:

[)r0n а почему ты не хочешь сделать вывод спрайта сразу в этом условии?

C++ Source Code:
1
if (FClassnameIs (pEntity->pev ,"weapon_mp5"){
2
  //Рисуем спрайт мп5
3
}
4
if (FClassnameIs (pEntity->pev ,"weapon_crowbar"){
5
  //Рисуем спрайт фомки
6
}
7
if (FClassnameIs (pEntity->pev ,"weapon_egon"){
8
  //Рисуем спрайт пылесоса
9
}
10
//И т.д.

__________________
-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 ))
2
{
3
  CBasePlayerWeapon *pWeapon = (CBasePlayerWeapon *)pEnnity;
4
  pWeapon->GetItemInfo(blablabla );
5
}

Цитата:
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)
2
{
3
  // out of range?
4
  if (pev->frags && (pLooker->pev->origin - pSeen->pev->origin).Length() > pev->frags)
5
    return FALSE;
6
 
7
  // check FOV if appropriate
8
  if (pev->max_health < 360)
9
  {
10
    // copied from CBaseMonster's FInViewCone function
11
    Vector2D vec2LOS;
12
    float flDot;
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() );
18
 
19
    // ALERT(at_debug, "flDot is %f\n", flDot);
20
 
21
    if ( pev->max_health == -1 )
22
    {
23
      CBaseMonster *pMonst = pLooker->MyMonsterPointer();
24
      if (pMonst)
25
        flComp = pMonst->m_flFieldOfView;
26
      else
27
        return FALSE; // not a monster, can't use M-M-M-MonsterVision
28
    }
29
 
30
    // outside field of view
31
    if (flDot <= flComp)
32
      return FALSE;
33
  }
34
 
35
  // check LOS if appropriate
36
  if (!FBitSet(pev->spawnflags, SF_ONSIGHT_NOLOS))
37
  {
38
    TraceResult tr;
39
    if (SF_ONSIGHT_NOGLASS)
40
      UTIL_TraceLine( pLooker->EyePosition(), pSeen->pev->origin, ignore_monsters, ignore_glass, pLooker->edict(), &tr );
41
    else
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())
44
      return FALSE;
45
  }


Добавлено 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 CHud2; // 1nf


потом идешь в class TeamFortressViewport : public Panel
и во втором public добавляешь:

C++ Source Code:
CHud2* m_pHud2; // 1nfnite


потом идешь в vgui_teamfortressviewport.cpp и добавляешь инклуд:

C++ Source Code:
#include "vgui_hud.h"


потом ищешь

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:
1
// 1nf start
2
m_pHud2 = new CHud2();
3
m_pHud2->setParent(this);
4
m_pHud2->setVisible(true);


потом идешь в Initialize и там добавляешь

C++ Source Code:
if (m_pHud2)
  m_pHud2->Initialize(); // 1nf


С этим файлом все.

Дальше идешь в hud.cpp и там

C++ Source Code:
#include "vgui_hud.h"
#include "vgui_TeamFortressViewport.h"


дальше идем в Init и там добавляем перед

C++ Source Code:
GetClientVoiceMgr()->Init(&g_VoiceStatusHelper, (vgui::Panel**)&gViewPort);


вот это:

C++ Source Code:
Hud2Init(); // 1nf


С этим файлом все.

Идем в 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 )
2
{
3
  // TODO: update local health data
4
  BEGIN_READ( pbuf, iSize );
5
  int x = READ_BYTE();
6
 
7
  m_iFlags |= HUD_ACTIVE;
8
 
9
  // Only update the fade if we've changed health
10
  if (x != m_iHealth)
11
  {
12
    m_fFade = FADE_TIME;
13
    m_iHealth = x;
14
  }
15
 
16
  gViewPort->m_pHud2->UpdateHealth(x); // buz
17
 
18
  return 1;
19
}


Далее идем в 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 )
2
{
3
  m_iFlags |= HUD_ACTIVE;
4
 
5
 
6
  BEGIN_READ( pbuf, iSize );
7
  int x = READ_SHORT();
8
 
9
  if (x != m_iBat)
10
  {
11
    m_fFade = FADE_TIME;
12
    m_iBat = x;
13
  }
14
 
15
  gViewPort->m_pHud2->UpdateArmor(x); // 1nf
16
 
17
  return 1;
18
}


Все.
Теперь кладем картинки этого худа в свой мод и наслаждаемся. Кстати, вот тебе архив с картинками из моего мода и 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'


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

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