2019-07-25 00:28:59 +02:00
# include <sourcemod>
2019-09-29 19:46:32 +02:00
# include <sdktools>
# include <cstrike>
2019-07-25 00:28:59 +02:00
# pragma semicolon 1
# pragma newdecls required
2019-11-10 19:09:02 +01:00
# define NUMBEROFNAMES 116
char g_cName [ NUMBEROFNAMES ] [ ] = { " Dwelitram " , " Gwyri " , " Caredus " , " Arerawia " , " Vilali " , " Astiwiel " , " Vardonydd " , " Ybaossa " , " Umyk " , " Nico50Pax " , " Onand " , " Thelian " , " Nydaleth " , " Chomarin " , " Traedien " , " Miev " , " Kaaede " , " Koamond " , " TheRottenBenson " , " BigLegend2017 " , " TRIGGEREDHarambexXx " , " InPepe2016 " , " xXxMaster2012 " , " InBoixXx " , " TheKopsing " , " Cornelius " , " Gustavo " , " Bryant " , " Winfred " , " Nicolas " , " Mitchel " , " Dana " , " Carrol " , " Darell " , " Ruben " , " Jeromy " , " Wade " , " Scotty " , " Salvatore " , " Kory " , " Don " , " Morgan " , " Kurtis " , " Federico " , " Darin " , " css-ru " , " aimbot " , " lastkraftwagenfahrzeug " , " edger " , " clownface " , " слово " , " счастливый " , " kara " , " puta " , " meow " , " uncle sam " , " FunBun " , " Counter-Strike.Com.Ua " , " For-css.Ru " , " BOBO " , " " , " . " , " Z3r0 " , " ZeTo " , " Sakharov " , " Sache11 " , " Mr. Dogenberg " , " Maus " , " Magikarpet " , " Miles " , " magick " , " James Lebron " , " jiZZ " , " Dobel " , " THE POPE OF DOPE " , " The Joker " , " that guy over there " , " Be happy :) " , " KingKong " , " Figger Nucker " , " noname " , " alexdu63 " , " I put babies in the microwave " , " Tango!! " , " faggot killer " , " admin pidaras " , " MESSI>RONALDO " , " Gabe Newell " , " acetylsalicylic acid " , " Country-Steak: Sauce " , " chlamydia harvester " , " kyle_69 " , " Shaggy's dog " , " rEVERSE " , " Piment d'espelette " , " FireHawk " , " Sgt. Pepper " , " krix. " , " imPulse_^_ " , " Lardon " , " CAPS LOCK " , " $pussymoneyweed$ " , " Low5 " , " Bonerfart " , " Shiny Thanos " , " MARK NUTT " , " Legless Runner " , " Banana is a berry " , " Gabriel " , " El Moustachio " , " James Bong " , " Disco Fever " , " Acacia " , " Sugared " , " ronald goddamn macdonald " , " pizza is life " } ;
2019-07-25 00:28:59 +02:00
2019-09-29 19:46:32 +02:00
bool g_bFakePopulation [ MAXPLAYERS + 1 ] ;
2019-09-29 22:11:56 +02:00
bool g_bMapEnded ;
2019-11-05 17:02:52 +01:00
2019-09-29 22:45:17 +02:00
int g_iBaseLatency [ MAXPLAYERS + 1 ] ;
2019-09-29 19:46:32 +02:00
int g_iLatency [ MAXPLAYERS + 1 ] ;
2019-11-05 17:02:52 +01:00
2019-09-29 22:11:56 +02:00
int g_iAdminFakes ;
2019-11-05 17:02:52 +01:00
2019-09-29 22:11:56 +02:00
bool g_bCheckRequested ;
2019-08-29 23:10:37 +02:00
2019-11-05 17:02:52 +01:00
int g_iBlockInstantFakeConnects ;
bool g_bBlockInstantFakeConnects ;
2019-07-25 00:28:59 +02:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Plugin myinfo =
{
name = " ImprovedHitboxes " , //camouflage
2019-10-04 13:50:30 +02:00
author = " Neon + Dogan + Botox " ,
2019-08-25 02:40:15 +02:00
description = " Handle Hitboxes via Plugin " ,
2019-11-10 19:09:02 +01:00
version = " 5.1.0 " ,
2019-07-25 00:28:59 +02:00
url = " https://steamcommunity.com/id/n3ontm "
} ;
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginStart ( )
{
2019-11-05 17:02:52 +01:00
RegAdminCmd ( " sm_debugfakes " , Command_DebugFakes , ADMFLAG_GENERIC , " Shows the amount of fake-clients on server " ) ;
RegAdminCmd ( " sm_fakes " , Command_Fakes , ADMFLAG_GENERIC , " Shows the fake-clients on server " ) ;
2019-10-04 13:50:30 +02:00
RegAdminCmd ( " sm_setfakes " , Command_SetFakes , ADMFLAG_RCON , " Manually sets the amount of fake-clients " ) ;
2019-09-29 22:11:56 +02:00
g_iAdminFakes = - 1 ;
g_bMapEnded = false ;
2019-11-05 17:02:52 +01:00
g_bBlockInstantFakeConnects = false ;
g_iBlockInstantFakeConnects = 0 ;
CreateTimer ( 4.0 , BlockInstantFakeConnects , _ , TIMER_REPEAT ) ;
2019-10-04 13:50:30 +02:00
CreateTimer ( 3.0 , RandomizePing , _ , TIMER_REPEAT ) ;
2019-11-05 17:02:52 +01:00
CreateTimer ( 150.0 , RandomizeNames , _ , TIMER_REPEAT ) ;
HookUserMessage ( GetUserMessageId ( " SayText2 " ) , UserMessage_SayText2 , true ) ;
2019-09-29 22:11:56 +02:00
RequestFrame ( CheckPopulation ) ;
2019-07-25 00:28:59 +02:00
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginEnd ( )
{
2019-08-25 02:40:15 +02:00
for ( int i = 1 ; i < = MaxClients ; i + + )
{
2019-08-29 23:10:37 +02:00
if ( g_bFakePopulation [ i ] )
{
g_bFakePopulation [ i ] = false ;
2019-09-29 19:46:32 +02:00
g_iLatency [ i ] = 0 ;
2019-10-09 22:13:06 +02:00
KickClient ( i ) ;
2019-08-29 23:10:37 +02:00
}
2019-08-25 02:40:15 +02:00
}
2019-07-25 00:28:59 +02:00
}
2019-09-29 22:11:56 +02:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnMapStart ( )
{
g_bMapEnded = false ;
2019-11-08 02:22:28 +01:00
g_bBlockInstantFakeConnects = false ;
g_iBlockInstantFakeConnects = 0 ;
CreateTimer ( 4.0 , BlockInstantFakeConnects , _ , TIMER_REPEAT ) ;
2019-09-29 22:11:56 +02:00
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnMapEnd ( )
{
g_bMapEnded = true ;
2019-09-29 22:45:17 +02:00
g_iAdminFakes = - 1 ;
}
2019-09-29 22:11:56 +02:00
2019-11-05 17:02:52 +01:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action BlockInstantFakeConnects ( Handle timer )
{
g_iBlockInstantFakeConnects + + ;
g_bBlockInstantFakeConnects = false ;
RequestFrame ( CheckPopulation ) ;
if ( g_iBlockInstantFakeConnects > 4 )
return Plugin_Stop ;
return Plugin_Continue ;
}
2019-09-29 22:45:17 +02:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action RandomizePing ( Handle timer )
{
for ( int i = 1 ; i < = MaxClients ; i + + )
{
if ( g_bFakePopulation [ i ] )
g_iLatency [ i ] = g_iBaseLatency [ i ] + GetRandomInt ( - 3 , 3 ) ;
}
2019-09-29 22:11:56 +02:00
}
2019-11-05 17:02:52 +01:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action RandomizeNames ( Handle timer )
{
for ( int i = 1 ; i < = MaxClients ; i + + )
{
if ( g_bFakePopulation [ i ] )
{
int RandomName = GetRandomInt ( 0 , NUMBEROFNAMES - 1 ) ;
SetClientName ( i , g_cName [ RandomName ] ) ;
}
}
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action UserMessage_SayText2 ( UserMsg msg_id , BfRead msg , const int [ ] players , int playersNum , bool reliable , bool init )
{
if ( ! reliable )
return Plugin_Continue ;
int client ;
char sMessage [ 32 ] ;
if ( GetUserMessageType ( ) = = UM_Protobuf ) //fuck cs go but "ClEaN CoDe"
{
PbReadString ( msg , " msg_name " , sMessage , sizeof ( sMessage ) ) ;
if ( ! ( sMessage [ 0 ] = = '#' & & StrContains ( sMessage , " Name_Change " ) ) )
return Plugin_Continue ;
client = PbReadInt ( msg , " ent_idx " ) ;
}
else
{
client = BfReadByte ( msg ) ;
BfReadByte ( msg ) ;
BfReadString ( msg , sMessage , sizeof ( sMessage ) ) ;
if ( ! ( sMessage [ 0 ] = = '#' & & StrContains ( sMessage , " Name_Change " ) ) )
return Plugin_Continue ;
}
if ( g_bFakePopulation [ client ] )
return Plugin_Handled ;
return Plugin_Continue ;
}
2019-07-25 00:28:59 +02:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action Command_DebugFakes ( int client , int argc )
{
2019-08-25 02:40:15 +02:00
int iFakes = 0 ;
2019-09-29 19:46:32 +02:00
int iFakesInTeam = 0 ;
2019-08-25 02:40:15 +02:00
for ( int i = 1 ; i < = MaxClients ; i + + )
{
2019-08-29 23:10:37 +02:00
if ( g_bFakePopulation [ i ] )
2019-08-25 02:40:15 +02:00
iFakes + + ;
2019-09-29 19:46:32 +02:00
if ( g_bFakePopulation [ i ] & & GetClientTeam ( i ) > 0 )
iFakesInTeam + + ;
2019-08-25 02:40:15 +02:00
}
2019-09-29 19:46:32 +02:00
2019-10-04 13:50:30 +02:00
ReplyToCommand ( client , " [SM] There are currently %d Fake-Clients, from which %d are in Spectate. " , iFakes , iFakes - iFakesInTeam ) ;
2019-09-29 19:46:32 +02:00
2019-07-25 00:28:59 +02:00
return Plugin_Handled ;
}
2019-09-29 22:11:56 +02:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
2019-10-04 12:28:35 +02:00
public Action Command_SetFakes ( int client , int argc )
2019-09-29 22:11:56 +02:00
{
2019-11-05 17:02:52 +01:00
if ( g_iBlockInstantFakeConnects < = 4 )
{
ReplyToCommand ( client , " [SM] Not available right now, because the Plugin is still loading. Try again in couple seconds. " ) ;
return Plugin_Handled ;
}
2019-09-29 22:11:56 +02:00
if ( argc < 1 )
{
ReplyToCommand ( client , " [SM] Usage: sm_setfakes <amount of fakes> " ) ;
return Plugin_Handled ;
}
char sArgs [ 16 ] ;
GetCmdArg ( 1 , sArgs , sizeof ( sArgs ) ) ;
if ( ! StringToIntEx ( sArgs , g_iAdminFakes ) )
{
ReplyToCommand ( client , " [SM] Invalid value " ) ;
return Plugin_Handled ;
}
2019-10-04 13:50:30 +02:00
ReplyToCommand ( client , " [SM] You set the amount of Fake-Clients to %d. " , g_iAdminFakes ) ;
2019-09-29 22:11:56 +02:00
CheckPopulation ( ) ;
return Plugin_Handled ;
2019-10-04 12:28:35 +02:00
}
2019-09-29 22:11:56 +02:00
2019-07-25 00:28:59 +02:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
2019-10-04 13:50:30 +02:00
public Action Command_Fakes ( int client , int args )
{
char aBuf [ 1024 ] ;
char aBuf2 [ MAX_NAME_LENGTH ] ;
for ( int i = 1 ; i < = MaxClients ; i + + )
{
if ( IsClientInGame ( i ) )
{
if ( g_bFakePopulation [ i ] )
{
GetClientName ( i , aBuf2 , sizeof ( aBuf2 ) ) ;
StrCat ( aBuf , sizeof ( aBuf ) , aBuf2 ) ;
StrCat ( aBuf , sizeof ( aBuf ) , " , " ) ;
}
}
}
if ( strlen ( aBuf ) )
{
aBuf [ strlen ( aBuf ) - 2 ] = 0 ;
ReplyToCommand ( client , " [SM] Fake-Clients online: %s " , aBuf ) ;
}
else
ReplyToCommand ( client , " [SM] Fake-Clients online: none " ) ;
return Plugin_Handled ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
2019-07-25 00:28:59 +02:00
public void OnClientConnected ( int client )
{
2019-09-29 22:11:56 +02:00
if ( ! g_bCheckRequested & & ! IsFakeClient ( client ) )
{
RequestFrame ( CheckPopulation ) ;
g_bCheckRequested = true ;
}
2019-07-25 00:28:59 +02:00
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnClientDisconnect ( int client )
{
2019-08-29 23:10:37 +02:00
if ( client > 0 )
{
if ( g_bFakePopulation [ client ] )
2019-09-29 19:46:32 +02:00
{
2019-08-29 23:10:37 +02:00
g_bFakePopulation [ client ] = false ;
2019-09-29 19:46:32 +02:00
g_iLatency [ client ] = 0 ;
}
2019-08-29 23:10:37 +02:00
2019-09-29 22:11:56 +02:00
if ( ! g_bCheckRequested & & ! IsFakeClient ( client ) )
{
RequestFrame ( CheckPopulation ) ;
g_bCheckRequested = true ;
}
2019-08-29 23:10:37 +02:00
}
2019-07-25 00:28:59 +02:00
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void CheckPopulation ( )
{
2019-09-29 22:11:56 +02:00
g_bCheckRequested = false ;
if ( g_bMapEnded )
return ;
2019-10-08 20:12:36 +02:00
int iPlayers = GetClientCount ( false ) ;
2019-07-25 00:28:59 +02:00
for ( int i = 1 ; i < = MaxClients ; i + + )
{
2019-10-08 20:12:36 +02:00
if ( IsClientConnected ( i ) & & IsFakeClient ( i ) )
iPlayers - - ;
2019-07-25 00:28:59 +02:00
}
2019-08-29 23:10:37 +02:00
int iFakes = 0 ;
2019-09-29 19:46:32 +02:00
int iFakesInTeam = 0 ;
2019-08-25 02:40:15 +02:00
for ( int i = 1 ; i < = MaxClients ; i + + )
{
2019-08-29 23:10:37 +02:00
if ( g_bFakePopulation [ i ] )
2019-08-25 02:40:15 +02:00
iFakes + + ;
}
2019-08-29 23:10:37 +02:00
int iFakesNeeded = 0 ;
2019-09-29 19:46:32 +02:00
int iFakesInTeamNeeded = 0 ;
2019-09-01 14:01:29 +02:00
if ( iPlayers > 61 )
2019-09-29 19:46:32 +02:00
{
2019-08-25 02:40:15 +02:00
iFakesNeeded = 0 ;
2019-10-09 22:13:06 +02:00
iFakesInTeamNeeded = 0 ;
2019-09-29 19:46:32 +02:00
}
2019-10-08 20:12:36 +02:00
else if ( iPlayers > 59 )
2019-09-29 19:46:32 +02:00
{
2019-08-25 02:40:15 +02:00
iFakesNeeded = 1 ;
2019-10-09 22:13:06 +02:00
iFakesInTeamNeeded = 0 ;
2019-10-08 20:12:36 +02:00
}
else if ( iPlayers > 57 )
{
iFakesNeeded = 2 ;
2019-10-09 22:13:06 +02:00
iFakesInTeamNeeded = 1 ;
2019-09-29 19:46:32 +02:00
}
2019-09-01 14:01:29 +02:00
else if ( iPlayers > 55 )
2019-09-29 19:46:32 +02:00
{
2019-10-08 20:12:36 +02:00
iFakesNeeded = 3 ;
2019-10-09 22:13:06 +02:00
iFakesInTeamNeeded = 1 ;
2019-09-29 19:46:32 +02:00
}
2019-09-01 14:01:29 +02:00
else if ( iPlayers > 20 )
2019-09-29 19:46:32 +02:00
{
2019-08-25 02:40:15 +02:00
iFakesNeeded = 4 ;
2019-10-09 22:13:06 +02:00
iFakesInTeamNeeded = 2 ;
2019-09-29 19:46:32 +02:00
}
2019-09-01 14:01:29 +02:00
else if ( iPlayers > 10 )
2019-09-29 19:46:32 +02:00
{
2019-11-05 17:02:52 +01:00
iFakesNeeded = 4 ;
2019-10-09 22:13:06 +02:00
iFakesInTeamNeeded = 1 ;
2019-09-29 19:46:32 +02:00
}
2019-09-01 14:01:29 +02:00
else if ( iPlayers > 5 )
2019-09-29 19:46:32 +02:00
{
2019-11-05 17:02:52 +01:00
iFakesNeeded = 4 ;
2019-11-08 02:22:28 +01:00
iFakesInTeamNeeded = 0 ;
2019-09-29 19:46:32 +02:00
}
2019-07-25 00:28:59 +02:00
else
2019-09-29 19:46:32 +02:00
{
2019-11-05 17:02:52 +01:00
iFakesNeeded = 4 ;
2019-09-29 19:46:32 +02:00
iFakesInTeamNeeded = 0 ;
}
2019-08-25 02:40:15 +02:00
2019-09-29 22:11:56 +02:00
if ( g_iAdminFakes ! = - 1 )
iFakesNeeded = g_iAdminFakes ;
2019-09-29 19:46:32 +02:00
if ( iFakes ! = iFakesNeeded )
2019-08-25 02:40:15 +02:00
{
2019-11-05 17:02:52 +01:00
while ( iFakes < iFakesNeeded & & ! g_bBlockInstantFakeConnects )
2019-09-29 19:46:32 +02:00
{
int RandomName = GetRandomInt ( 0 , NUMBEROFNAMES - 1 ) ;
int iIndex = CreateFakeClient ( g_cName [ RandomName ] ) ;
2019-09-29 22:45:17 +02:00
2019-10-09 22:13:06 +02:00
if ( iIndex < 1 | | iIndex > MaxClients )
return ;
2019-09-29 22:45:17 +02:00
SetEntityFlags ( iIndex , FL_CLIENT ) ;
2019-09-29 22:11:56 +02:00
DispatchKeyValue ( iIndex , " classname " , " player " ) ;
DispatchSpawn ( iIndex ) ;
2019-09-29 22:45:17 +02:00
2019-09-29 19:46:32 +02:00
g_bFakePopulation [ iIndex ] = true ;
2019-09-29 22:45:17 +02:00
g_iBaseLatency [ iIndex ] = GetRandomInt ( 20 , 110 ) ;
g_iLatency [ iIndex ] = g_iBaseLatency [ iIndex ] ;
2019-09-29 19:46:32 +02:00
AdminId FakeAdmin = CreateAdmin ( ) ;
SetAdminFlag ( FakeAdmin , Admin_Custom6 , true ) ;
SetUserAdmin ( iIndex , FakeAdmin , true ) ;
2019-11-07 18:34:49 +01:00
//CS_SetClientClanTag(iIndex, "UNLOZE");
2019-09-29 19:46:32 +02:00
iFakes + + ;
2019-11-05 17:02:52 +01:00
if ( g_iBlockInstantFakeConnects < = 4 )
g_bBlockInstantFakeConnects = true ;
2019-09-29 19:46:32 +02:00
}
while ( iFakes > iFakesNeeded )
{
for ( int i = 1 ; i < = MaxClients ; i + + )
{
if ( g_bFakePopulation [ i ] )
{
g_bFakePopulation [ i ] = false ;
g_iLatency [ i ] = 0 ;
2019-10-09 22:13:06 +02:00
KickClient ( i ) ;
2019-09-29 19:46:32 +02:00
iFakes - - ;
break ;
}
}
}
2019-08-25 02:40:15 +02:00
}
2019-07-25 00:28:59 +02:00
2019-10-07 19:41:05 +02:00
for ( int i = 1 ; i < = MaxClients ; i + + )
{
if ( g_bFakePopulation [ i ] & & GetClientTeam ( i ) > = CS_TEAM_T )
iFakesInTeam + + ;
}
2019-10-04 14:01:12 +02:00
if ( iFakes = = iFakesNeeded & & iFakesInTeam ! = iFakesInTeamNeeded & & g_iAdminFakes = = - 1 )
2019-08-25 02:40:15 +02:00
{
2019-10-07 19:41:05 +02:00
while ( iFakesInTeam < iFakesInTeamNeeded )
2019-08-25 02:40:15 +02:00
{
2019-09-29 19:46:32 +02:00
for ( int i = 1 ; i < = MaxClients ; i + + )
2019-08-25 02:40:15 +02:00
{
2019-10-04 12:10:29 +02:00
if ( g_bFakePopulation [ i ] & & GetClientTeam ( i ) < = CS_TEAM_SPECTATOR )
2019-09-29 19:46:32 +02:00
{
ChangeClientTeam ( i , CS_TEAM_CT ) ;
FakeClientCommandEx ( i , " joinclass " ) ;
iFakesInTeam + + ;
break ;
}
2019-08-25 02:40:15 +02:00
}
}
2019-09-29 19:46:32 +02:00
2019-10-07 19:41:05 +02:00
while ( iFakesInTeam > iFakesInTeamNeeded )
2019-09-29 19:46:32 +02:00
{
for ( int i = 1 ; i < = MaxClients ; i + + )
{
2019-10-04 12:10:29 +02:00
if ( g_bFakePopulation [ i ] & & GetClientTeam ( i ) > = CS_TEAM_T )
2019-09-29 19:46:32 +02:00
{
ChangeClientTeam ( i , CS_TEAM_SPECTATOR ) ;
iFakesInTeam - - ;
break ;
}
}
}
}
}
2019-11-05 17:02:52 +01:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
2019-09-29 19:46:32 +02:00
public void OnGameFrame ( )
{
for ( int i = 1 ; i < = MaxClients ; i + + )
{
if ( g_bFakePopulation [ i ] )
{
int iResEnt = GetPlayerResourceEntity ( ) ;
if ( iResEnt = = - 1 )
return ;
SetEntProp ( iResEnt , Prop_Send , " m_iPing " , g_iLatency [ i ] , _ , i ) ;
}
2019-08-25 02:40:15 +02:00
}
2019-09-29 22:48:12 +02:00
}