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:
(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 ) |
3 | pmtrace_t* tr = (pmtrace_t*) &pmtrace; |
8 | view[0] = end[0] - start[0]; |
9 | view[1] = end[1] - start[1]; |
10 | view[2] = end[2] - start[2]; |
12 | float length = VectorLength(view); |
14 | dir[0] = view[0] / length; |
15 | dir[1] = view[1] / length; |
16 | dir[2] = view[2] / length; |
19 | position[0] = start[0]; |
20 | position[1] = start[1]; |
21 | position[2] = start[2]; |
22 | tr->startsolid = true; |
28 | tr = oEngFuncs.PM_TraceLine( position, end, PM_TRACELINE_PHYSENTSONLY, 2, -1); |
30 | if( tr->fraction==1.0f ) |
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; |
P.S. Очень надеюсь на вашу помощь
Отправлено XaeroX 12-07-2008 в 20:14:
Immortal*BLG в чем конкретно заключается вопрос? Лично я в КС играл очень мало, и мне всегда казалось, что простреливаемость прямо зависит от толщины стены (ну и мощности пушки, конечно).
__________________
Отправлено 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.__________________
Отправлено Дядя Миша 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 ) |
8 | view[0] = end[0] - start[0]; |
9 | view[1] = end[1] - start[1]; |
10 | view[2] = end[2] - start[2]; |
12 | float length = VectorLength(view); |
14 | dir[0] = view[0] / length; |
15 | dir[1] = view[1] / length; |
16 | dir[2] = view[2] / length; |
19 | position[0] = start[0]; |
20 | position[1] = start[1]; |
21 | position[2] = start[2]; |
28 | TraceLine( position, end, true, true, GetEntity (), &tr); |
30 | if( tr.fraction==1.0f ) |
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; |
Отправлено XaeroX 13-07-2008 в 07:30:
Immortal*BLG на мой вариант это совершенно не похоже, поэтому не комментирую.
__________________
Отправлено Дядя Миша 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 ну тогда все верно. Должно работать.
__________________
Отправлено Immortal*BLG 13-07-2008 в 07:58:
Просто я ни разу не видел такого:
C++ Source Code:
(я имею ввиду, что обычно такого в коде я не замечал ни где)
Отправлено XaeroX 13-07-2008 в 08:07:
Ну попробуй ее убрать 
__________________
Отправлено Дядя Миша 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 использует его по умолчанию, в отличие от клиентской функции.
__________________
Отправлено Immortal*BLG 14-07-2008 в 16:02:
Дядя Миша Да пусть тебя GetEntity не смущяет, ибо так написано в старом коде бота проверки толщены стены
На всякий пожарный:
C++ Source Code:
1 | bool Bot::IsShootableThruObstacle (Vector dest) |
3 | // this function returns if enemy can be shoot through some obstacle. |
5 | if (m_skill <= 70 || !IsWeaponShootingThroughWall (m_currentWeapon)) |
8 | Vector source = EyePosition (); |
9 | Vector direction = (dest - source).Normalize (); // 1 unit long |
12 | int numHits = 0, thickness = 0; |
16 | TraceLine (source, dest, true, true, GetEntity (), &tr); |
18 | // check if line not hit anything |
19 | while (tr.flFraction < 1.0 && numHits < 2) |
24 | point = tr.vecEndPos + direction; |
26 | while (POINT_CONTENTS (point) == CONTENTS_SOLID && thickness <= 100) |
30 | point = point + direction; |
33 | TraceLine (point, dest, true, true, GetEntity (), &tr); |
36 | if (numHits < 2 && thickness <= 100) |
Ок, пошел читать про мантеровку...
={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:
Дядя Миша ну явно не ворлдспавн 
__________________
Отправлено Дядя Миша 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?
__________________
Отправлено Troll 20-09-2008 в 18:45:
XaeroX это в исходниках читов надо рыскать.
Отправлено XaeroX 20-09-2008 в 18:49:
Troll
Очень хорошее объяснение. Спасибо.
__________________
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024