TriggerBot (AutoShoot) |
Что это такое:
Как только центр нашего экрана, либо угол punchangle пересекается с игроком или определённой областью на игроке, происходит авто-выстрел (autoshoot). Достаточно только водить мышкой, нет необходимости нажимать клавишу огня. Достаточно спорный хак - кто-то использует и доволен, а кому-то только мешает.. Может быть исполнен разными способами: получением прямой информации, о том что прицел на игроке, либо калькуляцией разности углов - позиции игрока и наших.
Вариант 1:
1) Нужны Engine Functions. Там хук pfnDrawConsoleString
bool bStringBot = false; int DrawConsoleString(int x, int y, char * str)
{
if(strstr(str,"Enemy"))
bStringBot = true;
else
bStringBot = false; return oEngFuncs.pfnDrawConsoleString(x,y,str);
} // В CL_CreateMove if(bStringBot == true)
cmd->buttons |= IN_ATTACK;
2) Необязательно получать строчку "Enemy" в pfnDrawConsoleString. Есть ещё несколько мест в Engine Functions, где она проходит, когда мы наводимся на игрока противоположной команды. pfnTextMessageGet например. Самый главный минус этого триггербота - это скорость его срабатывания. Если совсем не участвовать в стрельбе: убьют.
Вариант 2:
1) Тоже самое, что и прошлый, только необходимо хукать Engine Functions -> pfnHookUserMessages -> StatusValue и в нём:
BEGIN_READ(pbuf,iSize);
int iMsg = READ_BYTE();
int iValue = READ_BYTE();
// Message-Values descriptions:
// iMsg 1: TeamInfo, 1 = Teammate / 2 = Enemy / 3 = Hostage
// iMsg 2: PlayerIndex, For hostage iMsg 2 is not sent, or fired with 0 value.
// iMsg 3: PlayerHealth, value is fired only for Teammates and Hostages.
// Triggerbot Sample
// You can tweak it better
if((iMsg == 1) && (iValue == 2)) // Got Team - Enemy
{
bMessageBot = true;
msg1 = true;
}
if((iMsg == 2) && (iValue != 0) && msg1)
{
bMessageBot = true;
}
else
{
bMessageBot = false;
}
// В CL_CreateMove
if(bMessageBot == true)
cmd->buttons |= IN_ATTACK;
2) Тоже самое, что и первый вариант.
Вариант 3:
1) Нужна структура игроков, в которой будет информация о видимости/жизни/состоянии/направлении/координатах игроков OGC style
bool bTriggerBot(float * maimangles, float *paimangles) { float view[3], diff[3], radius, distance, boxradius; vec3_t vecEnd, up, right, forward, EntViewOrg, playerAngles, taimangles, faimangles; faimangles[0] = maimangles[0] + paimangles[0]; faimangles[1] = maimangles[1] + paimangles[1]; for (int pl=0;pl < MAX_VPLAYERS;pl++) if (vPlayers[pl].isUpdated() && vPlayers[pl].isAlive() && vPlayers[pl].visible) { // Dont touch me if (pl == me.entindex) continue; // No team if (!CheckTeam(pl)) continue; // Copy position VectorCopy(vPlayers[pl].origin(),EntViewOrg); // Up/Down spot EntViewOrg[2] += cvar.aim_triggerbot_spot; // Vector view[0] = EntViewOrg[0] - me.pmEyePos[0]; view[1] = EntViewOrg[1] - me.pmEyePos[1]; view[2] = EntViewOrg[2] - me.pmEyePos[2]; // Vecs angle VectorAngles(view,taimangles); taimangles[0] *= -1; if (taimangles[1]>180) taimangles[1]-=360; diff[0] = faimangles[0] - taimangles[0]; diff[1] = faimangles[1] - taimangles[1]; if (diff[1]>180) diff[1]-=360; if (diff[1]>45 || diff[1]<-45) continue; diff[2] = sqrt(diff[0] * diff[0] + diff[1] * diff[1]); distance = sqrt(view[0] * view[0] + view[1] * view[1] + view[2] * view[2]); boxradius = cvar.aim_triggerbot_sens; radius = (float) ((atan2( boxradius, distance) * 180 / M_PI)); if (diff[2] < radius) return true; } return false; } // Cl_createmove if(bTriggerBot(cmd->viewangles, me.punchangle))
cmd->buttons |= IN_ATTACK;
2) Надеюсь разберётесь что к чему.. Если нет - пишите..
Copyright (c) Troll