Здравствуйте, хотелось бы узнать как происходит определение игрока противоположной команды на экране. Нашёл отрывок кода Code: var vec, scr: vec3_t; Team, PlayerTeam: Integer; Distance: Single; ScreenVector: vec3_s; begin // Получем координаты игрока // Изменяем позицию, иначе будет только по яйцам стрелять. vec.x := pEnt.Origin.x + Aimbot_PosX; vec.y := pEnt.Origin.y + Aimbot_PosY; vec.z := pEnt.Origin.z + Aimbot_PosZ; // Получаем координаты центра экрана scr.y := oEngfuncs.GetWindowCenterY; scr.x := oEngfuncs.GetWindowCenterX; // Получаем дистанцию от центра экрана до игроков Distance := CalcDistance(@scr, @vec); // Получаем команду игроков Team := pPlayerInfo.Info[pEnt.Index].Team; PlayerTeam := pPlayerInfo.Info[pLocal.Index].Team; if not (Team in [0..3]) then Exit; if not (PlayerTeam in [0..3]) then Exit; // если у нас Active то проверяем дистанцию (ФОВ) if Aimbot_Activ = True then if Distance < Aimbot_Fov then // если дистанция меньше фова, то проверяем команду игрока // если ваша команда не равна команде другого игрока, то стреляем if Team <> PlayerTeam then SetCursorPos(Round(vec.x),Round(vec.y + vec.z)); end; Но в нём нету определения игроков вражеской тимы. Как вообще происходит это определение? Понимаю конечно что на делфях подобное редко пишется но всё же.
дельфю незнаю и зависит от реализации, перехватывается функцию пользовательских сообщений (pfnUserMsgHook) и делаются редиректы на обработчики, один из которых TeamInfo Code: // HUD_Redraw Client Function void HUD_Redraw ( float x, int y ) { //...some stuff Aimbot.FindTarget(); //...some stuff } void CAimbot::FindTarget( void ) { if (!me.alive) return; SetTarget(-1); for (int ax=0;ax<MAX_VPLAYERS;ax++) { if ( vPlayers[ax].isUpdatedAddEnt() && vPlayers[ax].canAim && vPlayers[ax].isAlive()) // No Dead People { if( !HasTarget() ) { SetTarget(ax); continue; } if( vPlayers[ax].fovangle < vPlayers[iTarget].fovangle ) { SetTarget(ax); } } } } inline void SetTarget( int iIndex ){ iTarget = iIndex; } void CAimbot::calcFovangleAndVisibility(int ax) { PlayerInfo& r = vPlayers[ax]; r.fovangle = calcFovAngle(me.pmEyePos, me.viewAngles, r.origin() ); if(r.updateType() == 0 || r.updateType() == 2 || !r.isAlive()) { r.visible = false; return; } float fov = 0; //1=10 , 2=30 , 3=90 , 4=360 if (cvar.fov == 1) fov = 10; else if (cvar.fov == 2) fov = 30; else if (cvar.fov == 3) fov = 90; else if (cvar.fov == 4) fov = 360; r.visible = TargetRegion(ax); if(0) {} else if (!CheckTeam(ax)) { r.canAim = 0; } else if (IsShielded(ax)) { r.canAim = 0; } else if (r.fovangle>fov) { r.canAim = 0; } else if (bSoonvisible(ax)) { r.canAim = 1; } else if (cvar.autowall) { int damage = GetDamageVec(ax, true); if (damage) { r.canAim = 2; } else { damage = GetDamageVec(ax, false); if (damage) r.canAim = 1; else r.canAim = 0; } } else { r.canAim = r.visible; } } bool CAimbot::CheckTeam(int ax) { if (me.team != vPlayers[ax].team) return true; return false; } //================================================================================== static int TeamInfo (const char *pszName, int iSize, void *pbuf) { BEGIN_READ(pbuf,iSize); int px = READ_BYTE(); char * teamtext = READ_STRING(); const char * STR_TERROR = "TERRORIST"; const char * STR_CT = "CT"; const char * STR_UNASSIGNED = "UNASSIGNED"; const char * STR_SPECTATOR = "SPECTATOR"; if (!strcmpi (teamtext, STR_TERROR)) vPlayers[px].team = 1; else if (!strcmpi (teamtext, STR_CT)) vPlayers[px].team = 2; else if (!strcmpi (teamtext, STR_UNASSIGNED)) vPlayers[px].team = 0; else if (!strcmpi (teamtext, STR_SPECTATOR)) vPlayers[px].team = 0; else { vPlayers[px].team = -1; } if(px == gEngfuncs.GetLocalPlayer()->index) { if (!strcmpi (teamtext, STR_TERROR)) me.team = 1; else if (!strcmpi (teamtext, STR_CT)) me.team = 2; else if (!strcmpi (teamtext, STR_UNASSIGNED)) me.team = 0; else if (!strcmpi (teamtext, STR_SPECTATOR)) me.team = 0; else { me.team = -1; } } return (*TeamInfoOrg)(pszName, iSize, pbuf); }