Veteran Member
Join Date: Mar 2010
Location: m_flZipcore
|
11-28-2013
, 15:18
Re: Anti Strafe Hack/Bot
|
#4
|
This is my current status, based on this plugin: http://forums.alliedmods.net/showthread.php?t=229785
PHP Code:
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon) { new bool:ongrund = bool:(GetEntityFlags(client) & FL_ONGROUND); if(!g_PlayerStates[client][bOn]) { GetClientAbsOrigin(client, vLastOrigin[client]); GetClientAbsAngles(client, vLastAngles[client]); GetEntPropVector(client, Prop_Data, "m_vecVelocity", vLastVelocity[client]); return; } if(g_PlayerStates[client][nStrafes] >= MAX_STRAFES) { GetClientAbsOrigin(client, vLastOrigin[client]); GetClientAbsAngles(client, vLastAngles[client]); GetEntPropVector(client, Prop_Data, "m_vecVelocity", vLastVelocity[client]); return; } new Float:time = GetGameTime(); new Float:vAngles[3]; vAngles[1] = angles[1]; vAngles[1] += 360; new bool:angle_gain; //Angle turned direction? if (vLastAngles[client][1] < angles[1]) { angle_gain = true; } else { angle_gain = false; } if (g_PlayerStates[client][bStrafeAngleGain][g_PlayerStates[client][nStrafes]] != angle_gain) { g_PlayerStates[client][bStrafeAngleGain][g_PlayerStates[client][nStrafes]] = angle_gain; g_PlayerStates[client][fStrafeTimeAngleTurn][g_PlayerStates[client][nStrafes]] = time; } new nButtonCount; if(buttons & IN_MOVELEFT) nButtonCount++; if(buttons & IN_MOVERIGHT) nButtonCount++; if(buttons & IN_FORWARD) nButtonCount++; if(buttons & IN_BACK) nButtonCount++; new bool:newstrafe; if(nButtonCount == 1) { //new strafe? if(g_PlayerStates[client][nStrafeDir] != 1 && buttons & IN_MOVELEFT) { g_PlayerStates[client][nStrafeDir] = 1; newstrafe = true; } else if(g_PlayerStates[client][nStrafeDir] != 2 && buttons & IN_MOVERIGHT) { g_PlayerStates[client][nStrafeDir] = 2; newstrafe = true; } else if(g_PlayerStates[client][nStrafeDir] != 3 && buttons & IN_FORWARD) { g_PlayerStates[client][nStrafeDir] = 3; newstrafe = true; } else if(g_PlayerStates[client][nStrafeDir] != 4 && buttons & IN_BACK) { g_PlayerStates[client][nStrafeDir] = 4; newstrafe = true; } //still same strafe? else if(g_PlayerStates[client][nStrafeDir] == 1 && buttons & IN_MOVELEFT) { g_PlayerStates[client][fStrafeTimeLastSync][g_PlayerStates[client][nStrafes]] = time; } else if(g_PlayerStates[client][nStrafeDir] == 2 && buttons & IN_MOVERIGHT) { g_PlayerStates[client][fStrafeTimeLastSync][g_PlayerStates[client][nStrafes]] = time; } else if(g_PlayerStates[client][nStrafeDir] == 3 && buttons & IN_FORWARD) { g_PlayerStates[client][fStrafeTimeLastSync][g_PlayerStates[client][nStrafes]] = time; } else if(g_PlayerStates[client][nStrafeDir] == 4 && buttons & IN_BACK) { g_PlayerStates[client][fStrafeTimeLastSync][g_PlayerStates[client][nStrafes]] = time; } } if(newstrafe) { g_PlayerStates[client][nStrafes]++; g_PlayerStates[client][fStrafeTimeStart][g_PlayerStates[client][nStrafes]] = time; //get delay between angle turned and key pressed for a new strafe if(g_PlayerStates[client][nStrafes]) { new Float:strafe_delay; strafe_delay = time-g_PlayerStates[client][fStrafeTimeLastSync][g_PlayerStates[client][nStrafes]-1]; g_PlayerStates[client][fStrafeDelay][g_PlayerStates[client][nStrafes]] = strafe_delay; //PrintToChatAll("START-LASTSYNC: %.2f", strafe_delay*100); //PrintCenterText(client, "%.2f", strafe_delay*100); } } if(g_PlayerStates[client][nStrafes] > 0) { new Float:fVelDelta; fVelDelta = GetSpeed(client) - GetVSpeed(vLastVelocity[client]); if(!ongrund) { if(GetSpeed(client) > 275.0) { if(fVelDelta > 3.0) { if(!g_PlayerStates[client][bBoosted][g_PlayerStates[client][nStrafes]]) g_PlayerStates[client][nStrafesBoosted]++; g_PlayerStates[client][bBoosted][g_PlayerStates[client][nStrafes]] = true; } } } } GetClientAbsOrigin(client, vLastOrigin[client]); GetClientAbsAngles(client, vLastAngles[client]); GetEntPropVector(client, Prop_Data, "m_vecVelocity", vLastVelocity[client]); }
public OnClientStartTouchZoneType(client, MapZoneType:type) { if (type != ZtEnd && type != ZtBonusEnd) return; g_PlayerStates[client][bOn] = false; new nPerfect, nVeryGood, nGood, nNormal, nFail, nPre; for(new i = 1; i < g_PlayerStates[client][nStrafes]; i++) { if(g_PlayerStates[client][bBoosted][i]) continue; //Pre pressed if(g_PlayerStates[client][fStrafeDelay][i] < 0) { nPre++; continue; } //Failed if(g_PlayerStates[client][fStrafeDelay][i] > 0.1) { nFail++; continue; } //Perfect if(g_PlayerStates[client][fStrafeDelay][i] < 0.006) { nPerfect++; continue; } //Very Good if(g_PlayerStates[client][fStrafeDelay][i] < 0.011) { nVeryGood++; continue; } //Good if(g_PlayerStates[client][fStrafeDelay][i] < 0.021) { nGood++; continue; } //Bad nNormal++; } if((float(nPerfect)/float(g_PlayerStates[client][nStrafes]))*100 < 10) return; Timer_LogInfo("###########################################################"); Timer_LogInfo("%N Strafes: %d, Perfect: %d, VeryGood: %d, Good: %d, Boosted: %d, Normal: %d, Fail: %d, Pre: %d", client, g_PlayerStates[client][nStrafes], nPerfect, nVeryGood, nGood, g_PlayerStates[client][nStrafesBoosted], nNormal, nFail, nPre); Timer_LogInfo("%N STATS: Perfect: %.2f, VeryGood: %.2f, Good: %.2f, Boosted: %.2f, Normal: %.2f, Fail: %.2f, Pre: %.2f", client, (float(nPerfect)/float(g_PlayerStates[client][nStrafes]))*100, (float(nVeryGood)/float(g_PlayerStates[client][nStrafes]))*100, (float(nGood)/float(g_PlayerStates[client][nStrafes]))*100, (float(g_PlayerStates[client][nStrafesBoosted])/float(g_PlayerStates[client][nStrafes]))*100, (float(nNormal)/float(g_PlayerStates[client][nStrafes]))*100, (float(nFail)/float(g_PlayerStates[client][nStrafes]))*100, (float(nPre)/float(g_PlayerStates[client][nStrafes]))*100); Timer_LogInfo("###########################################################"); }
public OnClientEndTouchZoneType(client, MapZoneType:type) { if (type != ZtStart && type != ZtBonusStart) return; g_PlayerStates[client][bOn] = true; // Reset stuff g_PlayerStates[client][nStrafeDir] = 0; g_PlayerStates[client][nStrafes] = 0; g_PlayerStates[client][nStrafesBoosted] = 0; new Float:time = GetGameTime(); for(new i = 0; i < MAX_STRAFES; i++) { g_PlayerStates[client][bBoosted][i] = false; g_PlayerStates[client][fStrafeTimeLastSync][i] = time; g_PlayerStates[client][fStrafeTimeAngleTurn][i] = time; g_PlayerStates[client][fStrafeTimeStart][i] = time; g_PlayerStates[client][bStrafeAngleGain][i] = false; g_PlayerStates[client][fStrafeDelay][i] = 0.0; } }
Float:GetSpeed(client) { new Float:vVelocity[3]; GetEntPropVector(client, Prop_Data, "m_vecVelocity", vVelocity); vVelocity[2] = 0.0; return GetVectorLength(vVelocity); }
Float:GetVSpeed(Float:v[3]) { new Float:vVelocity[3]; vVelocity = v; vVelocity[2] = 0.0; return GetVectorLength(vVelocity); }
And an attachment with bot mimic records with and without strafehack, to have facts to work with
WARNING: UPDATE SOURCECODE IF YOU ARE RUNNING SMAC EYE-ANGLES OR ALL PLAYERS GET BANNED!!!
__________________
Last edited by zipcore; 12-04-2013 at 10:57.
|
|