@User344
Guest
@
-
Автор темы
- #1
Вообще это нельзя назвать валк ботом, так как он баннихопит .-.
Мне кажется будет нужен тем, у кого хвх хаки, так как если немного поднастроить - будет сильно помогать в набирании скорости и прекратит столкновения (ну или будет мешать если ты криворукий даун).
Как это выглядит: (записывал почти с первого дубля, так шо бот не лупит)
Внимание: Код шкрябал ночью и за пару часов, во искупления вины,
так что скорее всего там серьезные баги и работает не самым лучшим образом.
Теперь начнем пастить:
Давайте укажим наши настройки:
Перед тем как спастить основную функцию давайте сделаем врапер для линий.
А вот и главная функция:
Хайд не ставлю, в любом случае если человек даун - не сможет спастить.
Указывайте автора кода(меня) при перезаливе на другой форум.
Мне кажется будет нужен тем, у кого хвх хаки, так как если немного поднастроить - будет сильно помогать в набирании скорости и прекратит столкновения (ну или будет мешать если ты криворукий даун).
Как это выглядит: (записывал почти с первого дубля, так шо бот не лупит)
Внимание: Код шкрябал ночью и за пару часов, во искупления вины,
так что скорее всего там серьезные баги и работает не самым лучшим образом.
Теперь начнем пастить:
Давайте укажим наши настройки:
Код:
#define MIN_VELOCITY 200 // Минимальная скорость что бы сработал баннихоп/автострейф
#define ADDITION_POS 30 // Сколько отсупать по бокам, что бы проверять на столкновения
#define ANGLE_CLAMP_VALUE 2 // Какой максимум разворота угла за тик?
#define TRACE_DISTANCE 150 // Длина линии
#define CHECK_MAX_ANGLE 360 // На сколько градусов будет бот искать
#define CHECK_ANGLE 2 // Слишком поздно(4:40) что бы думать, просто чекните код и посмотрите что за что отвечает
Код:
trace_t TraceLine(Vector3& vecStart, QAngle& angAngle, float distance, IClientEntity* pSkipEntity)
{
Vector3 vecEnd;
U::AngleVectors(angAngle, &vecEnd, NULL, NULL);
vecEnd = vecStart + (vecEnd * distance);
trace_t tr;
Ray_t ray;
CTraceFilter filter;
filter.pSkip = pSkipEntity;
ray.Init(vecStart, vecEnd);
Interface.EngineTrace->TraceRay(ray, MASK_SOLID, &filter, &tr);
// Использую MASK_SOLID потому что она проверяет на все, что может блокировать движение
// MASK_SHOT же проверяет только на объекты где может рисоватся пуля (НЕ проверяет ворота или скайбокс, например)
return tr;
}
Код:
void Run(CPlayer* pLocalPlayer, CUserCmd* cmd)
{
// Не люблю вызывать много раз одну функцию с одним и тем же результатом
// Лучше сохранить несколько таких в начале
Vector3 vecLocalPos = pLocalPlayer->GetEyePosition();
float flVelocity = pLocalPlayer->GetFloatVelocity();
// Цикл ниже используется для того, что бы лучи шли не только с нашей головы,
// Но и сбоку (Для того, что бы не блокировать наше передвежение если мы задеваем что то
for (int a = -ADDITION_POS; a <= ADDITION_POS; a += ADDITION_POS)
{
Vector3 vecPos;
U::AngleVectors(cmd->viewangles, NULL, &vecPos, NULL);
vecPos = vecLocalPos + (vecPos * a);
// Проводим линию, что бы узнать - нужно поворачивать, или нет
// P.S: Провожу от головы, что бы не поворачивало на ступеньках (нам же это не надо?)
trace_t tr = TraceLine(vecPos, cmd->viewangles, TRACE_DISTANCE, pLocalPlayer);
// Мы застряли?
if (tr.startsolid)
continue;
// Линия не прошла весь путь, а значит мы куда то врезаемся
// Значит поворачиваем
if (tr.fraction < 1.f)
{
// Проводим CHECK_ANGLE линий на CHECK_MAX_ANGLE градусов, что бы узнать куда лучше поворачивать
for (float i = 0; i < CHECK_MAX_ANGLE; i += CHECK_ANGLE)
{
static bool bSwap = false; bSwap = !bSwap;
float angTemp = bSwap ? i : -i;
trace_t tr1 = TraceLine(vecPos, cmd->viewangles + QAngle(0, angTemp, 0), TRACE_DISTANCE, pLocalPlayer);
if (tr1.startsolid || tr1.fraction < 1.f)
continue;
// Что бы не терять скорость при очень резких разворотах
if (i > ANGLE_CLAMP_VALUE)
angTemp = angTemp < 0 ? -ANGLE_CLAMP_VALUE : ANGLE_CLAMP_VALUE;
// Делаем стрейф и смотрим в сторону поворота
cmd->sidemove = bSwap ? 450 : -450;
cmd->viewangles.y += angTemp;
Interface.Engine->SetViewAngles(cmd->viewangles);
break;
}
}
}
// Если скорость меньше MIN_VELOCITY, тогда не баннихопим/стрейфим, а разбегаемся
if (flVelocity < MIN_VELOCITY)
{
cmd->buttons |= IN_FORWARD;
cmd->forwardmove = 250;
return;
}
else
{
// Прыгаем
cmd->buttons |= IN_JUMP;
// Авто-стрейфер
static bool bSwapStrafe = false; bSwapStrafe = !bSwapStrafe;
if (bSwapStrafe) {
cmd->viewangles.y += 1;
cmd->sidemove = 450;
}
else {
cmd->viewangles.y -= 1;
cmd->sidemove = -450;
}
}
}
Хайд не ставлю, в любом случае если человек даун - не сможет спастить.
Указывайте автора кода(меня) при перезаливе на другой форум.