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

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- (hl 1, cs) определение стен на предмет простреливаемости (https://hlfx.ru/forum/showthread.php?threadid=1426)


Отправлено Immortal*BLG 12-07-2008 в 20:04:

Half-Life (hl 1, cs) определение стен на предмет простреливаемости

Привет всем!!! Я тут первый раз, но с вопросом :{P
Дело в том, что я редактирую(по мере возможностей) YaPB бота и мне нужена ваша помощь в написании кода проверяющего стену на простреливаемость(в зависимости от текущего оружия), дело в том, что сейчас бот определяет только толщену стены (а как всем известно, есть и очень толстые стены, которые простреливаются....) смотря на исходники читов, я нашел для себя примеры, но наталкнулся на вопрос, чем отличается клиентская

C++ Source Code:
struct pmtrace_s *(*PM_TraceLine) (float *start, float *end, int flags, int usehull, int ignore_pe);

от
простой функции TraceLine? (если можно поподробнее...)

Вот код из чита Ecstatic:
C++ Source Code:
1
int __fastcall cAimbot::CanPenetrate( float *start, float *end, int power )
2
{
3
  pmtrace_t* tr = (pmtrace_t*) &pmtrace;
4
 
5
  float view[3];
6
  float dir[3];
7
 
8
  view[0] = end[0] - start[0];
9
  view[1] = end[1] - start[1];
10
  view[2] = end[2] - start[2];
11
 
12
  float length = VectorLength(view);
13
 
14
  dir[0] = view[0] / length;
15
  dir[1] = view[1] / length;
16
  dir[2] = view[2] / length;
17
 
18
  float position[3];
19
  position[0] = start[0];
20
  position[1] = start[1];
21
  position[2] = start[2];
22
  tr->startsolid = true;
23
 
24
  while( power )
25
  {
26
    if( !tr->startsolid )
27
      power--;
28
    tr = oEngFuncs.PM_TraceLine( position, end, PM_TRACELINE_PHYSENTSONLY, 2, -1);
29
 
30
    if( tr->fraction==1.0f )
31
      return 1;
32
    if( tr->allsolid )
33
      return 0;
34
 
35
    position[0] = tr->endpos[0] + dir[0] * 8.0f;
36
    position[1] = tr->endpos[1] + dir[1] * 8.0f;
37
    position[2] = tr->endpos[2] + dir[2] * 8.0f;
38
  }
39
  return 0;
40
}


P.S. Очень надеюсь на вашу помощь


Отправлено XaeroX 12-07-2008 в 20:14:

Immortal*BLG в чем конкретно заключается вопрос? Лично я в КС играл очень мало, и мне всегда казалось, что простреливаемость прямо зависит от толщины стены (ну и мощности пушки, конечно).

__________________

xaerox on Vivino


Отправлено Immortal*BLG 13-07-2008 в 03:41:

Цитата:
XaeroX писал:
Лично я в КС играл очень мало, и мне всегда казалось, что простреливаемость прямо зависит от толщины стены (ну и мощности пушки, конечно).

Ты не прав если так считаешь, я сам проверял...

Цитата:
XaeroX писал:
в чем конкретно заключается вопрос?

я кинул код CanPenetrate() с чита Ecstatic, мне нужно его переделать с клиентской части на серверную, так как в g_engfuncs нету PM_TraceLine, да и
C++ Source Code:
struct pmtrace_s *(*PM_TraceLine ) (float *start, float *end, int flags, int usehull, int ignore_pe);

отличается от
C++ Source Code:
void (*pfnTraceLine) (const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr);


Отправлено XaeroX 13-07-2008 в 06:38:

Замени

C++ Source Code:
tr = oEngFuncs.PM_TraceLine( position, end, PM_TRACELINE_PHYSENTSONLY, 2, -1);

на
C++ Source Code:
UTIL_TraceLine( position, end, ignore_monsters, NULL, &tr);


Что это за хрень:
pmtrace_t* tr = (pmtrace_t*) &pmtrace;
я не понял.
Объяви переменную так:
TraceResult tr;

Ну и вместо "tr->" надо писать "tr.", разумеется.

Если будет работать не очень хорошо, попробуй параметр missile вместо ignore_monsters.

__________________

xaerox on Vivino


Отправлено Дядя Миша 13-07-2008 в 06:40:

Immortal*BLG ничем не отличается, скажу даже более - это одна и та же функция, вызываемая для клиента и сервера.
Просто вызов выглядит чуть по другому.
flags = fNoMonsters
ignore_pe = pentToSkip (только вместо указателя - индекс)
usehull - подсказка какой хулл юзать, дело в том, что клиент халфы ни сном ни духом о текущем размере хулла на сервере, поэтому приходится ему явно указывать чё каво.
pmtrace_s * = TraceResult
Вроде бы все.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Immortal*BLG 13-07-2008 в 07:21:

Ребята, спасибо за отзывы!

вот, Дядя Миша ты прости, но я не допонял, но всеравно правильно ли я сделал?(так не работает...)
(GetEntity () это бот)

C++ Source Code:
1
int __fastcall cAimbot::CanPenetrate( float *start, float *end, int power )
2
{
3
  TraceResult tr;
4
 
5
  float view[3];
6
  float dir[3];
7
 
8
  view[0] = end[0] - start[0];
9
  view[1] = end[1] - start[1];
10
  view[2] = end[2] - start[2];
11
 
12
  float length = VectorLength(view);
13
 
14
  dir[0] = view[0] / length;
15
  dir[1] = view[1] / length;
16
  dir[2] = view[2] / length;
17
 
18
  float position[3];
19
  position[0] = start[0];
20
  position[1] = start[1];
21
  position[2] = start[2];
22
  tr.startsolid = true;
23
 
24
  while( power )
25
  {
26
    if( !tr.startsolid )
27
      power--;
28
    TraceLine( position, end, true, true, GetEntity (), &tr);
29
 
30
    if( tr.fraction==1.0f )
31
      return 1;
32
    if( tr.allsolid )
33
      return 0;
34
 
35
    position[0] = tr.endpos[0] + dir[0] * 8.0f;
36
    position[1] = tr.endpos[1] + dir[1] * 8.0f;
37
    position[2] = tr.endpos[2] + dir[2] * 8.0f;
38
  }
39
  return 0;
40
}


Отправлено XaeroX 13-07-2008 в 07:30:

Immortal*BLG на мой вариант это совершенно не похоже, поэтому не комментирую.

__________________

xaerox on Vivino


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

Immortal*BLG ignore_monsters это ни разу не булево значение.
Да и вообще нихрена не понятно, что оно у тебя делает.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Immortal*BLG 13-07-2008 в 07:48:

C++ Source Code:
void TraceLine (const Vector &start, const Vector &end, bool ignoreMonsters, bool ignoreGlass, edict_t *ignoreEntity, TraceResult *ptr)
{
  TRACE_LINE (start, end, (ignoreMonsters ? TRUE : FALSE) | (ignoreGlass ? 0x100 : 0), ignoreEntity, ptr);
}


Отправлено XaeroX 13-07-2008 в 07:53:

Immortal*BLG ну тогда все верно. Должно работать.

__________________

xaerox on Vivino


Отправлено Immortal*BLG 13-07-2008 в 07:58:

Просто я ни разу не видел такого:

C++ Source Code:
tr.startsolid = true;

(я имею ввиду, что обычно такого в коде я не замечал ни где)


Отправлено XaeroX 13-07-2008 в 08:07:

Ну попробуй ее убрать

__________________

xaerox on Vivino


Отправлено Дядя Миша 13-07-2008 в 09:55:

code:
typedef struct { int fAllSolid; // if true, plane is not valid int fStartSolid; // if true, the initial point was in a solid area int fInOpen; int fInWater; float flFraction; // time completed, 1.0 = didn't hit anything vec3_t vecEndPos; // final position float flPlaneDist; vec3_t vecPlaneNormal; // surface normal at impact edict_t *pHit; // entity the surface is on int iHitgroup; // 0 == generic, non zero is specific body part } TraceResult;

Все там есть, про буквы слегка другие

__________________
My Projects: download page

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

Цитата:

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


Отправлено Immortal*BLG 14-07-2008 в 07:41:

Дядя Миша, с fNoMonsters я разобралься, тут получается, что надо поставить PM_TRACELINE_PHYSENTSONLY(которое равно 2), а вот тут можешь поподробнее описать int usehull плз(плоучается мне надо подставить в fNoMonsters это: PM_TRACELINE_PHYSENTSONLY | и usehull(который тоже равен 2))
И в итоге, если я прав должно получиться следующее:

C++ Source Code:
TRACE_LINE (source, dest, PM_TRACELINE_PHYSENTSONLY | 2, GetEntity (), &tr);


P.S. пробовал, не работает...


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

Immortal*BLG PM_TRACELINE_PHYSENTONLY
это флажок для клиентской трасы, на сервере он и не будет работать.
меня больше всего смущает GetEntity в параметре ignore.
Скажи что это код должен делать?
Кстати вот пример удара монтировкой, перенесенной на клиент (точнее вызовы трассы)
http://half-life.ru/forum/showthrea...%F0%EE%E2%EA%E8

__________________
My Projects: download page

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

Цитата:

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


Отправлено XaeroX 14-07-2008 в 10:37:

Immortal*BLG не надо тебе usehull 2. Это точечный халл, а UTIL_TraceLine использует его по умолчанию, в отличие от клиентской функции.

__________________

xaerox on Vivino


Отправлено Immortal*BLG 14-07-2008 в 16:02:

Дядя Миша Да пусть тебя GetEntity не смущяет, ибо так написано в старом коде бота проверки толщены стены

На всякий пожарный:

C++ Source Code:
1
bool Bot::IsShootableThruObstacle (Vector dest)
2
{
3
  // this function returns if enemy can be shoot through some obstacle.
4
 
5
  if (m_skill <= 70 || !IsWeaponShootingThroughWall (m_currentWeapon))
6
    return false;
7
 
8
  Vector source = EyePosition ();
9
  Vector direction = (dest - source).Normalize ();	// 1 unit long
10
  Vector point;
11
 
12
  int numHits = 0, thickness = 0;
13
 
14
  TraceResult tr;
15
 
16
  TraceLine (source, dest, true, true, GetEntity (), &tr);
17
 
18
  // check if line not hit anything
19
  while (tr.flFraction < 1.0 && numHits < 2)
20
  {
21
    numHits++;
22
    thickness++;
23
 
24
    point = tr.vecEndPos + direction;
25
 
26
    while (POINT_CONTENTS (point) == CONTENTS_SOLID && thickness <= 100)
27
    {
28
      thickness++;
29
 
30
      point = point + direction;
31
    }
32
 
33
    TraceLine (point, dest, true, true, GetEntity (), &tr);
34
  }
35
 
36
  if (numHits < 2 && thickness <= 100)
37
    return true;
38
 
39
  return false;
40
}


Ок, пошел читать про мантеровку...

={P


Отправлено Дядя Миша 14-07-2008 в 17:27:

Immortal*BLG да как же не смущает, когда непонятно, какой именно эдикт она возвращает и соответственно игнорирует траса?

__________________
My Projects: download page

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

Цитата:

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


Отправлено XaeroX 14-07-2008 в 18:35:

Дядя Миша ну явно не ворлдспавн

__________________

xaerox on Vivino


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

Immortal*BLG покажи код GetEntity для сервера.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Immortal*BLG 15-07-2008 в 09:52:

C++ Source Code:
inline edict_t *GetEntity (void) { return ENT (pev); };

Дядя Миша GetEntity () - это бот!!!!

Добавлено 15-07-2008 в 19:52:

Чет как я не пробовал, у меня ничего не выходит... Всегда возвращает true... D:


Отправлено Дядя Миша 15-07-2008 в 11:21:

Цитата:
Дядя Миша GetEntity () - это бот!!!!

Неее, Дядя Миша GetEntity() return g-cont;
Ни разу не бот!
На самом деле вопрос в другом - ты создал класс бота на сервере или что?

__________________
My Projects: download page

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

Цитата:

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


Отправлено Immortal*BLG 15-07-2008 в 11:35:

Да, тоесть не я, я просто переделываю, доделываю бота...

C++ Source Code:
pev = VARS (bot = (*g_engfuncs.pfnCreateFakeClient) ("ВАСИЛИЙ")));


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

Immortal*BLG уверен что можно русскими буквами имя задавать?

__________________
My Projects: download page

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

Цитата:

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


Отправлено Troll 18-09-2008 в 17:00:

А вообще лучше глянь код PerfectWall, потому что простреливаемость зависит также от текстур.
Тот код который ты привёл выше может очень часто срабатывать в тех местах где прострел вообще не возможен никак.


Отправлено XaeroX 19-09-2008 в 03:35:

Troll что такое PerfectWall?

__________________

xaerox on Vivino


Отправлено Troll 20-09-2008 в 18:45:

XaeroX это в исходниках читов надо рыскать.


Отправлено XaeroX 20-09-2008 в 18:49:

Troll
Очень хорошее объяснение. Спасибо.

__________________

xaerox on Vivino


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

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