#define WIN32_LEAN_AND_MEAN #pragma warning (disable:4786) #include #include #include #undef NDEBUG #include #include #include #include #include #include "engine/wrect.h" #include "engine/cl_dll.h" #include "engine/cdll_int.h" #include "engine/util_vector.h" #include "engine/cl_entity.h" #include "common/com_model.h" #include "common/event_api.h" #include "engine/pmtrace.h" #include "engine/pm_defs.h" #include "aimbot.h" #include "cvar.h" #include "client.h" #include "interpreter.h" #include "trace.h" #include "attack.h" #include "defs.h" #include "playeritems.h" #include "perfectwall.h" #define BOUND_VALUE(var,min,max) if((var)>(max)){(var)=(max);};if((var)<(min)){(var)=(min);} using namespace std; Poopbot gAimbot; #define gAimbot extern float mainViewOrigin[3],mainViewAngles[3]; void VectorAngles(const float *forward, float *angles) { if (!forward[1] == 0 && !forward[0] == 0) { angles[0] = atan2(forward[2], sqrt(forward[0] * forward[0] + forward[1] * forward[1])) * (57.2957f); angles[1] = atan2(forward[1], forward[0]) * (57.2957f); angles[2] = 0; } } static void PredictTarget(int index,float *pred) { VectorCopy(vPlayers[index].getEnt()->origin,pred);} bool PathFree(float* from,float* to) { pmtrace_t tr; gEngfuncs.pEventAPI->EV_SetTraceHull( 2 ); gEngfuncs.pEventAPI->EV_PlayerTrace( from, to, PM_GLASS_IGNORE, me.ent->index, &tr ); return (tr.fraction == 1.0); } void Poopbot::CalcFovangleAndVisibility(int ax) { int damage; float targetspot[3]; PlayerInfo& r = vPlayers[ax]; if (!GetAimingTeam(ax)) { r.visible = 0; r.damage = 0; r.damagespot[0] = 0; r.damagespot[1] = 0; r.damagespot[2] = 0; } else { damage = GetDamageVec(ax, targetspot, true); if (damage) { r.visible = 2; } else { damage = GetDamageVec(ax, targetspot, false); if (damage) r.visible = 1; else r.visible = 0; } r.damage = damage; r.damagespot[0] = targetspot[0]; r.damagespot[1] = targetspot[1]; r.damagespot[2] = targetspot[2]; } } void Poopbot::FindTarget() { target=-1; for(int ax=0;ax::iterator si, end; if (vPlayers[ax].getEnt()->curstate.usehull == 0) { si = AimVecsS.begin(); end = AimVecsS.end(); } else { si = AimVecsD.begin(); end = AimVecsD.end(); } if (vPlayers[ax].getEnt()->curstate.gaitsequence == 6) { si = AimVecsJ.begin(); end = AimVecsJ.end(); } playerAngles[0]=0; playerAngles[1]=vPlayers[ax].getEnt()->angles[1]; playerAngles[2]=0; gEngfuncs.pfnAngleVectors (playerAngles, forward, right, up); forward[2] = -forward[2]; for (;si!=end;++si) { vPlayers[ax].vVecSpot = gEngfuncs.GetEntityByIndex(ax)->origin + forward * si->f + up * si->h + right * si->r; if(PathFree(me.pmEyePos,vPlayers[ax].vVecSpot)) return &(*si); else if(cvar.autohead) { vPlayers[ax].vVecSpot = gEngfuncs.GetEntityByIndex(ax)->origin + (up * (si->h * cvar.ah_h)) + (forward * (si->f * cvar.ah_f)) + (right * (si->r * cvar.ah_r)); if(PathFree(me.pmEyePos,vPlayers[ax].vVecSpot )) return &(*si); else vPlayers[ax].vVecSpot = gEngfuncs.GetEntityByIndex(ax)->origin + (up * (si->h * cvar.ah_h )) + (forward * (si->f * (cvar.ah_f * -1))) + (right * (si->r * (cvar.ah_r * -1))); if(PathFree(me.pmEyePos,vPlayers[ax].vVecSpot )) return &(*si); else vPlayers[ax].vVecSpot = gEngfuncs.GetEntityByIndex(ax)->origin + (up * (si->h * cvar.ah_h/2)) + (forward * (si->f * cvar.ah_f/2)) + (right * (si->r * cvar.ah_r/2)); if(PathFree(me.pmEyePos,vPlayers[ax].vVecSpot )) return &(*si); else vPlayers[ax].vVecSpot = gEngfuncs.GetEntityByIndex(ax)->origin + (up * (si->h * cvar.ah_h/2)) + (forward * (si->f * (cvar.ah_f/2 * -1))) + (right * (si->r * (cvar.ah_r/2 * -1))); if(PathFree(me.pmEyePos,vPlayers[ax].vVecSpot )) return &(*si); } } return NULL; } int Poopbot::GetDamageVec(int ax, float *targetspot, bool onlyvis) { int hitdamage, penetration = WALL_PEN0, bullettype, damage; vec3_t vecEnd, up, right, forward, EntViewOrg, PlayerOrigin, playerAngles; float distance, wallpierce, defaultvec[3] = {0,0,0}; vector::iterator si, end; PredictTarget(ax,PlayerOrigin); if (vPlayers[ax].getEnt()->curstate.usehull == 0) { if (AimVecsS.size() > 0) { si = AimVecsS.begin(); end = AimVecsS.end(); defaultvec[0] = AimVecsS[0].h; defaultvec[1] = AimVecsS[0].f; defaultvec[2] = AimVecsS[0].r; } } else { if (AimVecsD.size() > 0) { si = AimVecsD.begin(); end = AimVecsD.end(); defaultvec[0] = AimVecsD[0].h; defaultvec[1] = AimVecsD[0].f; defaultvec[2] = AimVecsD[0].r; } } if (vPlayers[ax].getEnt()->curstate.gaitsequence == 6) { if (AimVecsJ.size() > 0) { si = AimVecsJ.begin(); end = AimVecsJ.end(); defaultvec[0] = AimVecsJ[0].h; defaultvec[1] = AimVecsJ[0].f; defaultvec[2] = AimVecsJ[0].r; } } playerAngles[0]=0; playerAngles[1]=vPlayers[ax].getEnt()->angles[1]; playerAngles[2]=0; gEngfuncs.pfnAngleVectors(playerAngles, forward, right, up); forward[2] = -forward[2]; if (!onlyvis && cvar.autowall) penetration = playerItems.CurPenetration(); bullettype = playerItems.CurBulletType(); damage = playerItems.CurDamage(); distance = playerItems.CurDistance(); wallpierce = playerItems.CurWallPierce(); for (;si!=end;++si) { targetspot[0] = PlayerOrigin[0] + up[0] * si->h + forward[0] * si->f + right[0] * si->r; targetspot[1] = PlayerOrigin[1] + up[1] * si->h + forward[1] * si->f + right[1] * si->r; targetspot[2] = PlayerOrigin[2] + up[2] * si->h + forward[2] * si->f + right[2] * si->r; hitdamage = CanPenetrate(me.pmEyePos, targetspot, distance, penetration, bullettype, damage, wallpierce); if (hitdamage > 0) return hitdamage; } targetspot[0] = PlayerOrigin[0] + up[0] * defaultvec[0] + forward[0] * defaultvec[1] + right[0] * defaultvec[2]; targetspot[1] = PlayerOrigin[1] + up[1] * defaultvec[0] + forward[1] * defaultvec[1] + right[1] * defaultvec[2]; targetspot[2] = PlayerOrigin[2] + up[2] * defaultvec[0] + forward[2] * defaultvec[1] + right[2] * defaultvec[2]; return CanPenetrate(me.pmEyePos, targetspot, distance, penetration, bullettype, damage, wallpierce); } void Poopbot::CalcTargetSpot(float *out) { vec3_t vecEnd, up, right, forward, EntViewOrg, playerAngles; cl_entity_s* ent = vPlayers[target].getEnt(); PredictTarget(target,out); playerAngles[0]=0; playerAngles[1]=ent->angles[1]; playerAngles[2]=0; gEngfuncs.pfnAngleVectors (playerAngles, forward, right, up); aimvec* si = TargetRegion(target); float h=0,r=0,f=0; if (si) { f = si->f; h = si->h; r = si->r; } else { if (ent->curstate.usehull==0) { if (AimVecsS.size() > 0) { f = AimVecsS[0].f; h = AimVecsS[0].h; r = AimVecsS[0].r; } } else { if (AimVecsD.size() > 0) { f = AimVecsD[0].f; h = AimVecsD[0].h; r = AimVecsD[0].r; } } if (ent->curstate.gaitsequence==6 && AimVecsJ.size()>0) { f = AimVecsJ[0].f; h = AimVecsJ[0].h; r = AimVecsJ[0].r; } } out[0] = out[0] + forward[0]*f + up[0]*h + right[0]*r; out[1] = out[1] + forward[1]*f + up[1]*h + right[1]*r; out[2] = out[2] + forward[2]*f + up[2]*h + right[2]*r; } void Poopbot::CalcVec_MeToTarget(float *view) { float EntViewOrg[3]; CalcTargetSpot(EntViewOrg); VectorCopy(EntViewOrg,aim_spot); view[0] = EntViewOrg[0] - me.pmEyePos[0]; view[1] = EntViewOrg[1] - me.pmEyePos[1]; view[2] = EntViewOrg[2] - me.pmEyePos[2]; } void Poopbot::CalcViewAngles() { float vec_to_target[3]; vec_to_target[0] = vPlayers[target].damagespot[0] - me.pmEyePos[0]; vec_to_target[1] = vPlayers[target].damagespot[1] - me.pmEyePos[1]; vec_to_target[2] = vPlayers[target].damagespot[2] - me.pmEyePos[2]; VectorAngles(vec_to_target,aim_viewangles); aim_viewangles[0] *= -1; if (aim_viewangles[0]>180) aim_viewangles[0]-=360; if (aim_viewangles[1]>180) aim_viewangles[1]-=360; }