예제 #1
0
파일: aimbot.cpp 프로젝트: TSM-Dev/nh21
bool aimbot::Think(CUserCmd* cmd)
{
	float best = std::numeric_limits<float>::quiet_NaN();

	if (css())
	{
		if (!GetMaterialParameters)
			GetMaterialParameters = (void (__cdecl*)(int, float&, float&))util::FindPattern("client", "\x55\x8B\xEC\x8B\x45\x08\x83\xC0\xBD");

		if (!GetBulletTypeParameters)
			GetBulletTypeParameters = (void (__stdcall*)(int, float&, float&))util::FindPattern("client",
				"\x55\x8B\xEC\x56\x8B\x75\x08\x68????\x56\xE8????\x83\xC4\x08\x84\xC0"
			);
	}

	if (!bf)
		bf = new BulletFilter();

	target_id = 0;
	bf->hSelf = lp;

	Vector sp = lp->GetShootPos();
	Vector tp = Vector();

	CBaseEntity* w = lp->GetActiveWeapon();

	if (gmod() && MENU_SPAWPROT == 3 && ALPHA(lp->GetMDLColor()) == 200)
		return 0;

	int lteam = lp->GetTeam();
	int maxcl = (MENU_NPCAIMBT ? ents->GetHighestEntityIndex() : globals->max_clients);

	for (int i = 1; i <= maxcl; ++i)
		if (CBaseEntity* pl = ents->GetClientEntity(i))
		{
			if (pl == lp)
				continue;

			//if (pl->IsDormant())
			//	continue;

			if (!pl->GetModel())
				continue;

			bool npc = i > globals->max_clients;
			bool lowp = 1;

			if (npc)
			{
				const char* cclass = pl->GetClientClass()->m_pNetworkName;

				if (gmod())
				{
					RecvTable* p = pl->GetClientClass()->m_pRecvTable->m_pProps[0].m_pDataTable;

					if ((strcmp(cclass, "CAI_BaseNPC") && (!p || strcmp(p->m_pNetTableName, "DT_AI_BaseNPC"))) || !pl->IsAlive())
						continue;
				}

				if (tf2())
				{
					if (
						lowp = (
							strcmp(cclass, "CObjectSentrygun") ||
							ReadPtr<bool>(pl, m_bHasSapper)
						) &&
						(
							strcmp(cclass, "CTFGrenadePipebombProjectile") ||
							!ReadPtr<int>(pl, m_iType) ||
							!ReadPtr<bool>(pl, m_bTouched) ||
							!pl->IsDummyProjectile() ||
							sp.DistTo(lp->GetAbsOrigin()) > 768.f
						)
					)
						continue;

					if (pl->GetTeam() == lteam)
						continue;
				}
			}
			else if (!DoStateCheck(pl))
				continue;

			if (!pl->UpdateBones())
				continue;
			
			float rate = Rate(lp, pl, npc);
			if (!lowp)
				rate *= 0.1f;

			if (rate > best)
				continue;

			if (css() && pl->GetOrigin().DistTo(sp) > 8192.f)
				continue;

			int aim = GetAimBone(pl);
			bool doscan = 1;

			if (pl->GetHitbox(aim))
			{
				Vector box = pl->GetBoxPos(aim);

				if (BulletTrace(sp, box, pl))
				{
					target_id	= i;
					best		= rate;
					tp			= box;

					continue;
				}
			}

			if (doscan && MENU_BONESCAN)
			{
				int m = pl->Hitboxes();
				for (int j = 0; j < m; ++j)
				{
					if (j == aim)
						continue;

					if (pl->GetHitbox(j))
					{
						Vector box = pl->GetBoxPos(j);

						if (BulletTrace(sp, box, pl))
						{
							target_id	= i;
							best		= rate;
							tp			= box;

							continue;
						}
					}
				}
			}
		}

	if (target_id > 0)
	{
		CBaseEntity* pl = ents->GetClientEntity(target_id);

		if (!pl)
			return 0;

		if (target_id > globals->max_clients) // TODO: predict non-lag comepnsated stuff
		{
			tp -= pl->GetAbsOrigin();
			tp += pl->GetOrigin() + pl->GetVelocity() * engine->GetNetChannel()->GetPing();
		}

		cmd->viewangles = (tp - sp).Angle();
		NormalizeAngles(cmd->viewangles);

		if (MENU_AUTOSHOT)
			add(cmd->buttons, IN_ATTACK);

		return 1;
	}

	return 0;
}