TriggerBot (AutoShoot)

Что это такое:

Как только центр нашего экрана, либо угол punchangle пересекается с игроком или определённой областью на игроке, происходит авто-выстрел (autoshoot). Достаточно только водить мышкой, нет необходимости нажимать клавишу огня. Достаточно спорный хак - кто-то использует и доволен, а кому-то только мешает.. Может быть исполнен разными способами: получением прямой информации, о том что прицел на игроке, либо калькуляцией разности углов - позиции игрока и наших.

Вариант 1:

1) Нужны Engine Functions. Там хук pfnDrawConsoleString

Code:
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 и в нём:

Code:
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

Code:
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

Hosted by uCoz