HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- [help] помогите с кодом брашей (https://hlfx.ru/forum/showthread.php?threadid=5135)
Отправлено ~ X ~ 21-09-2018 в 10:45:
[help] помогите с кодом брашей
Доброго дня!
Очень нужна помощь с кодом конпок, дверей и прочих движущихся брашей.
Проблема началась с того что Spark() у кнопок вызывался как-то рандомно и криво. В итоге оказалось, что надо отвязывать механизм MoveDone() от Think(), иначе что-то сделать неовзможно. Пробовал делать такое, но тут вообще рандом получается, т.к. ltime ведет себя непредсказуемо.
C++ Source Code:
1 | //----------------------------------------------------------------------------- |
2 | // Purpose: Additional layer to replace engine's calls to MoveDone as THINK funcitons. |
3 | // Warning: In XDM thinking should work regardless of movement. |
4 | // Callers: engine: DispatchThink() |
5 | //----------------------------------------------------------------------------- |
6 | void CBaseToggle::Think(void) |
8 | bool bWasAlwaysThinking = FBitSet(pev->flags, FL_ALWAYSTHINK); |
9 | if (m_flArrivalTimeMov != 0.0f) |
11 | if (m_flArrivalTimeMov + pev->ltime <= gpGlobals->time && !pev->velocity.IsZero()) |
14 | conprintf(2, "%s[%d] \"%s\"::Think() origin %f %f %f -> dest %f %f %f\n", ENTFMT_P, pev->origin.x, pev->origin.y, pev->origin.z, m_vecFinalDest.x, m_vecFinalDest.y, m_vecFinalDest.z); |
16 | if (m_flArrivalTimeRot != 0.0f && m_flArrivalTimeRot + pev->ltime <= gpGlobals->time && !pev->avelocity.IsZero())// TODO |
19 | if (!FBitSet(pev->flags, FL_ALWAYSTHINK) || (pev->nextthink != 0 && pev->nextthink <= gpGlobals->time))// XDM3039 |
22 | if (bWasAlwaysThinking) |
24 | SetBits(pev->flags, FL_ALWAYSTHINK);// in case someone cleared it |
29 | //----------------------------------------------------------------------------- |
30 | // Purpose: XDM3039: Is this entity actually moving right now? |
31 | //----------------------------------------------------------------------------- |
32 | bool CBaseToggle::IsMoving(void) const |
34 | return !pev->velocity.IsZero() || !pev->avelocity.IsZero(); |
37 | //----------------------------------------------------------------------------- |
38 | // Purpose: Calculate pev->velocity and pev->nextthink to reach vecDest from pev->origin traveling at flSpeed |
39 | // Note : Better to SetMoveDone() BEFORE calling this. |
40 | // Input : vecDest - absolute destination coordinates |
41 | // flSpeed - units per second |
42 | //----------------------------------------------------------------------------- |
43 | void CBaseToggle::LinearMove(const Vector &vecDest, const float &flSpeed) |
45 | if (vecDest == pev->origin)// Already there? |
47 | m_vecFinalDest = vecDest; |
51 | if (flSpeed == 0.0f)// XDM3038c |
54 | m_vecFinalDest = vecDest; |
55 | // set destdelta to the vector needed to move |
56 | Vector vecDestDelta(vecDest); vecDestDelta -= pev->origin; |
58 | // divide vector length by speed to get time to reach dest |
59 | float flTravelTime = vecDestDelta.Length() / flSpeed; |
61 | m_flArrivalTimeMov = pev->ltime + flTravelTime;// XDM3039: WTF TESTME |
62 | SetBits(pev->flags, FL_ALWAYSTHINK);// XDM3039 |
65 | // scale the destdelta vector by the time spent traveling to get velocity |
66 | pev->velocity = vecDestDelta / flTravelTime; |
67 | DBG_PrintF("%s[%d] \"%s\"::LinearMove(): velocity %f %f %f, time %g, ArrivalTime %g\n", ENTFMT_P, pev->velocity.x, pev->velocity.y, pev->velocity.z, flTravelTime, m_flArrivalTimeMov); |
70 | //----------------------------------------------------------------------------- |
71 | // Purpose: Another hack |
72 | // After moving, set origin to exact final destination, call "move done" function |
73 | //----------------------------------------------------------------------------- |
74 | void CBaseToggle::LinearMoveDone(void) |
76 | Vector delta(m_vecFinalDest); delta -= pev->origin;// HL20130901 |
77 | vec_t error = delta.Length(); |
78 | if (error > MOVEMENT_POSIITON_ERROR_MAX) |
80 | LinearMove(m_vecFinalDest, error/max(0.001, gpGlobals->frametime));// move one frame, prevent resonance? |
84 | UTIL_SetOrigin(this, m_vecFinalDest); |
85 | pev->velocity.Clear(); |
86 | m_flArrivalTimeMov = 0.0f; |
88 | if (m_pfnCallWhenMoveDone) |
89 | (this->*m_pfnCallWhenMoveDone)(); |
92 | //----------------------------------------------------------------------------- |
93 | // Purpose: Calculate pev->avelocity and pev->nextthink to reach vecDestAngles from pev->angles traveling at flSpeed |
94 | // Input : vecDestAngles - absolute destination angles |
95 | // flSpeed - degrees per second |
96 | //----------------------------------------------------------------------------- |
97 | void CBaseToggle::AngularMove(const Vector &vecDestAngles, const float &flSpeed) |
99 | if (vecDestAngles == pev->angles)// Already there? |
101 | m_vecFinalAngle = vecDestAngles; |
105 | if (flSpeed == 0.0f)// XDM3038c |
108 | m_vecFinalAngle = vecDestAngles; |
109 | // set destdelta to the vector needed to move |
110 | Vector vecDestDelta(vecDestAngles); vecDestDelta -= pev->angles; |
112 | // divide by speed to get time to reach dest |
113 | float flTravelTime = vecDestDelta.Length() / flSpeed; |
115 | m_flArrivalTimeRot = pev->ltime + flTravelTime;// XDM3039: WTF TESTME |
116 | SetBits(pev->flags, FL_ALWAYSTHINK);// XDM3039 |
119 | // scale the destdelta vector by the time spent traveling to get velocity |
120 | pev->avelocity = vecDestDelta / flTravelTime; |
121 | DBG_PrintF("%s[%d] \"%s\"::LinearMove(): avelocity %f %f %f, TravelTime %g, ArrivalTime %g, CurTime %g, LocalTime %g\n", ENTFMT_P, pev->avelocity.x, pev->avelocity.y, pev->avelocity.z, flTravelTime, m_flArrivalTimeRot, gpGlobals->time, pev->ltime); |
124 | //----------------------------------------------------------------------------- |
125 | // Purpose: another hack |
126 | // After rotating, set angle to exact final angle, call "move done" function |
127 | //----------------------------------------------------------------------------- |
128 | void CBaseToggle::AngularMoveDone(void) |
130 | pev->angles = m_vecFinalAngle; |
131 | pev->avelocity.Clear(); |
132 | m_flArrivalTimeRot = 0.0f; |
134 | if (m_pfnCallWhenMoveDone) |
135 | (this->*m_pfnCallWhenMoveDone)(); |
GUYZ, PLZ HLP!
Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено XaeroX 21-09-2018 в 12:42:
Цитата:
~ X ~ писал:
как-то
Цитата:
~ X ~ писал:
что-то
Цитата:
~ X ~ писал:
тут вообще рандом
Цитата:
~ X ~ писал:
непредсказуемо
Я так и не понял, какая поставлена задача и что именно не получается? __________________
Отправлено Дядя Миша 21-09-2018 в 15:22:
Если уж стоит флаг FL_ALWAYSTHINK, для чего тогда нужен весь остальной код?
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ~ X ~ 21-09-2018 в 15:38:
Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.
XaeroX по-моему, задача предельно простая: надо отвязвать механизм MoveDone() от Think(). Т.е. чтобы MoveDone() вызывался независимо ни от чего, и SetThink() - тоже. Желательно и linear/angular (в терминах ХЛ) сделать независимыми друг от друга.
В данный момент все пробелмы в приведенном выше Think(). Я не знаю как отследить тот момент когда надо вызывать MoveDone() при условии возникновения всяких Blocked() и прочих исключений. Для этого явно служит ltime, но не понятно как его использовать.
FL_ALWAYSTHINK - это хак чтобы заставить движок вызывать Think() каждый кадр и уже руками сравнивать nextthink и вызывать коллбэки. Без него время вызова для брашей регулируется "погодой на марсе".__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено Дядя Миша 21-09-2018 в 17:55:
Чтобы развязать - надо кастомную физику, иначе никак.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ~ X ~ 21-09-2018 в 19:42:
Дядя Миша ты хочешь сказать, что отталкиваться от ltime вообще не получится? Должен же быть способ!
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено Дядя Миша 21-09-2018 в 20:40:
~ X ~ pev->nextthink = pev->ltime + 0.1; попробуй.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено XaeroX 21-09-2018 в 20:55:
Цитата:
~ X ~ писал:
m_flArrivalTimeRot + pev->ltime <= gpGlobals->time
Так делать нельзя, ты сравниваешь локальное время мувера и глобальное время. Они не сравнимы.
Нужно отнимать фреймтайм от m_flArrivalTimeRot (ну или тчинктайм - тогда надо кешировать предыдущий локалтайм, чтобы узнать дельту) и сравнивать его с нулём.__________________
Отправлено ~ X ~ 22-09-2018 в 10:21:
Цитата:
Дядя Миша писал:
~ X ~ pev->nextthink = pev->ltime + 0.1; попробуй.
Так это ж будет фиксированный интервал в 10ФПС, не?
И где попробовать? И что оно должно сделать?
В оригинале LinearMove() так и было. Только там было pev->nextthink = pev->ltime + movement_time. И движок внутри этот nextthink как-то сдвигал во время Blocked(), если я не ошибаюсь.
XaeroX:
а как же тогда ДМ пишет сообщением выше чтобы я локальное время совал в глобальное? Вообще я не понял концепцию локального времени мувера. Я честно много раз пытался смотреть код PushMove(), но от него откровенно голова идет крУгом. Я думал что ltime начинает расти во время блока, но нет. Оно могло бы быть версией глобального времени с отставанием, но тоже нет. Можешь тогда кодом написать, что и с чем сравнивать каждый кадр?__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено Дядя Миша 22-09-2018 в 13:03:
Цитата:
~ X ~ писал:
Так это ж будет фиксированный интервал в 10ФПС, не?
А сколько надо?
Цитата:
~ X ~ писал:
Вообще я не понял концепцию локального времени мувера
Глобальное время идёт от начала уровня, локальное - от начала движения мувера. Ну или если задать nextthink.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ~ X ~ 22-09-2018 в 13:39:
Дядя Миша "думать" надо каждый кадр. Тога получается, что время прибытия для браша надо определять так:
C++ Source Code:
3 | if (pev->ltime >= m_fMovementTime) |
? Где m_fMovementTime будет задана в начале движения т.е. m_fMovementTime = flTravelTime;
Как-то оно слишком просто получается. Где-то там были подводные камни. Имхо, была ситуация когда ltime вело себя нелинейно или вообще не менялось... надо дампануть всё в spreadsheet и построить график... __________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено Дядя Миша 22-09-2018 в 13:45:
Цитата:
~ X ~ писал:
Имхо, была ситуация когда ltime вело себя нелинейно или вообще не менялось...
Ну да, есть такое. Поэтому я и говорю что надо кастомную физику. Меня это говно тоже не устраивало.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ~ X ~ 22-09-2018 в 16:22:
Дядя Миша а со стандартным HL API такое возможно?
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено Дядя Миша 22-09-2018 в 17:02:
Теоретически да, надо всем энтитям поставить MOVETYPE_NONE и в StartFrame делать кастомную физику. Но я сам не пробовал.
Добавлено 22-09-2018 в 20:02:
Прикинул так-сяк, да наверное должно сработать, если затрагивать только муверы. А остальные типы нет смысла переделывать.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ~ X ~ 24-09-2018 в 11:02:
Понятно. Т.е. не совсем понятно, конечно, но главное что это сильно затратно будет по жизненным ресурсам. Я так никогда рисовать не сяду
В общем, придется, навное, вернуть как было. Спарки кнопкам сделаю рендерсистемой.
Но вообще - уныние
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]