Ghoul [BB] писал: В команде у нас два говнокодера-неудачника, которые сами не знают толком, что кодят и как оно всё в итоге будет работать. Это ж очевидно.
Эво как ты Мастера-то...
Добавлено 27-11-2016 в 02:49:
Garux
Тебе надо к ним в команду, в качестве математика.
Я, конечно, не их эйчар, но подозреваю, что банановое довольствие и три топора по праздникам в качестве бонуса они тебе с Мастером обеспечат.
~ X ~ писал: Сделал милость.
C++ Source Code:
Vector UTIL_VecEnemyPrediction( const Vector &vecSrc, const Vector &vecEnemyPos, const Vector &vecEnemyVel, float flProjectileSpeed )
{
____Vector v = vecSrc - vecEnemyPos;
____float d = DotProduct( v, vecEnemyVel );
____float a = DotProduct( vecEnemyVel, vecEnemyVel ) - flProjectileSpeed * flProjectileSpeed;
____float dsq = sqrtf( d * d - DotProduct( v, v ) * a );
____float t1 = ( d + dsq ) / a;
____float t2 = ( d - dsq ) / a;
____return ( vecEnemyVel - v / max( t1, t2 ) ) / flProjectileSpeed;
}
Функция возвращает направление, в котором надо стрелять с упреждением.
Если прожектайлы медленные или игрок далеко - то, т.к. упреждение рассчитывается в строго определённый момент, резкая остановка игрока приведёт к тому, что монстры будут сильно мазать. Я бы использовал такой код только в случае, если игрок - на двери/поезде (т.е. есть basevelocity), либо если прожектайлы очень быстрые, либо игрок довольно близко. В волатиле, пожалуй, именно так и сделаю.
Пример использования в коде булсквида:
Я конечно кодер и математик тоже не ахти, попробовал заюзать на примере буллсквида, добавил код UTIL_VecEnemyPrediction в util.cpp и util.h, писало ошибку на max, заменил своим аналогом, потом добавил буллсквиду атаку, попробовал на карте с1а1с посмотреть как оно работает, где буллсквид мочит хедкрабов на другой стороне канавы, если двигаться из стороны в сторону присядом то попадает, если бегать, то он берет сильно большое упреждение и промахивается, там у буллсквида был разброс в оригинале халвы, я его убрал, плюет он прямо в игрока если стоять. Из-за того что в 6 студии что-то оно не хотело компилироваться с max, я функцию так изменил:
code:Vector UTIL_VecEnemyPrediction( const Vector &vecSrc, const Vector &vecEnemyPos, const Vector &vecEnemyVel, float flProjectileSpeed )
{
Vector v = vecSrc - vecEnemyPos;
float d = DotProduct( v, vecEnemyVel );
float a = DotProduct( vecEnemyVel, vecEnemyVel ) - flProjectileSpeed * flProjectileSpeed;
float dsq = sqrtf( d * d - DotProduct( v, v ) * a );
float t;
float t1 = ( d + dsq ) / a;
float t2 = ( d - dsq ) / a;
if (t1 > t2)
t=t1;
else
t=t2;
return ( vecEnemyVel - v / t ) / flProjectileSpeed;
}
Увы, ничем помочь тут не могу: у меня на с1а1с буллсквид прекрасно попадает в игрока с упреждением, а без - как и в халфе, сильно мажет.
Для вас, по-видимому, остаётся только коэффициент 1.75.
Это даже не "МЫ", а ВЫ! Ты посмотри, что несколькими постами ранее творилось! Какие выпады совершались...
Я лишь подвёл итоги и назвал вещи своими именами. Так, как сложилось о них мнение у тут присутствующих. Не более. Свои личные оценки я оставил за скобками.
П.С. Может, у мя не работает в силу других причин? Кто бы мог знать? Нужно проверить т.к. у моего буллсквида прожектайль летит по параболе, т.е. на него действует гравитация.
Добавлено 27-11-2016 в 09:53:
.... Поверил безгравитационные прожектайлы... не работают.
Слишком большое упреждение.
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
Ghoul [BB] писал: Я лишь подвёл итоги и назвал вещи своими именами. Так, как сложилось о них мнение у тут присутствующих. Не более.
Ну зачем же ты судишь за всех присутствующих.
Цитата:
Ghoul [BB] писал: Поверил безгравитационные прожектайлы... не работают.
Слишком большое упреждение.
Н-да. Не понимаю, может, вы как-то не так тестируете? Важно не менять направление и скорость с момента выплёвывания булсквидом прожектайла. Потому что, очевидно, он отныне не властен над ним, а предсказывать ломаные и неравномерные траектории такой простой код не в состоянии.
XaeroX писал: Н-да. Не понимаю, может, вы как-то не так тестируете? Важно не менять направление и скорость с момента выплёвывания булсквидом прожектайла. Потому что, очевидно, он отныне не властен над ним, а предсказывать ломаные и неравномерные траектории такой простой код не в состоянии.
Я попробовал этот код заюзать в коде XashXT, у буллсквида естественно снаряд летит как в простой халве, без гравитации и прямо, бегаю линейно, не меняя направления, что-то он все равно мимо плюет, т.к. плюет дальше чем надо. В чем дело, понять не могу никак.
Chyvachok
Вот дллка, которую я тестирую и у меня с ней всё ок. Проверь её, пожалуйста.
Если у тебя и с ней не работает - то мы явно тестируем по-разному.
Вложение: hl.zip (478.7 кб)
Этот файл был скачан 90 раз.
XaeroX проверил - я где то все таки накосячил, вот залил видео с твоим упреждением, с твоей dll-кой он попадает, если двигаться линейно, у меня он стабильно берет больше чем надо и ни разу не попадает. Кстати может вопрос совсем нубский, а из-за чего код в util.cpp выбивает ошибку error C2065: 'max' : undeclared identifier? Компилил 6-ой студией с 5 сервис паком.
Chyvachok писал: Кстати может вопрос совсем нубский, а из-за чего код в util.cpp выбивает ошибку error C2065: 'max' : undeclared identifier?
Возможно, у тебя в extdll.h нет макроса max?
C++ Source Code:
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
Цитата:
Chyvachok писал: с твоей dll-кой он попадает, если двигаться линейно, у меня он стабильно берет больше чем надо и ни разу не попадает
Ну чудеса...
Добавлено 27-11-2016 в 18:19:
Кстати, после видео появилась идея по доработке кода. Делать трассу от игрока в направлении, куда он предположительно сдвинется, и если там стенка - то пересчитывать направление прожектайла так, чтобы он настигал игрока именно у этой стенки.
Из игр где реализована стрельба на упреждение, мне еще вспоминается Паркан Железная Стратегия, там АИ со всего оружия делает поправку, не только с пушек что прямо без гравитации летят, как плевки буллсквида но и с оружия что ведут огонь по баллистической траектории, огнемет там так сгустками стреляет как инсинератор из Fallout New Vegas, помню завхватить бункер с огнеметом там легко - его снаряды медленные, и от них легко уходить, а вот с пушками куда сложнее, тут уже не хило так вилять надо чтобы в него зайти.
Добавлено 27-11-2016 в 13:23:
Цитата:
XaeroX писал: Возможно, у тебя в extdll.h нет макроса max?
Выходит что его нету в 6 студии.
Цитата:
XaeroX писал: Делать трассу от игрока в направлении, куда он предположительно сдвинется, и если там стенка - то пересчитывать направление прожектайла так, чтобы он настигал игрока именно у этой стенки
Хорошая идея, кстати еще интересно, код работает с снарядами с баллистической траекторией, типа плевков гонарча?
Я использовал СДК, который выложен ссылкой в ветке "Half-Life SDK", вверху. http://hlfx.ru/pub/HL1_src_vs2005.zip
Может быть, я сам добавлял туда этот макрос, когда портировал сдк под новые студии - этого я уже не помню, давно было.
Цитата:
Chyvachok писал: код работает с снарядами с баллистической траекторией, типа плевков гонарча?
Нет, баллистическая траектория сложнее, там нужно учитывать ускорение (т.е. гравитацию). Но при желании можно составить уравнения и решить их.
XaeroX вот, свой, и заодно не измененный из КсашХТ, т.к. есть отличие от кода из халвы, вместо ( m_hEnemy->pev->origin + m_hEnemy->pev->view_ofs ) там m_hEnemy->EyePosition(). Я еще мог сделать ошибку в замене макроса max, или дело в XashXT?
code: float t;
float t1 = ( d + dsq ) / a;
float t2 = ( d - dsq ) / a;
if (t1 >= t2)
t=t1;
else
t=t2;
return ( vecEnemyVel - v / t ) / flProjectileSpeed;
Вложение: bullsquid.rar (16.9 кб)
Этот файл был скачан 75 раз.