2018-08-07 22:29:47 +02:00
# pragma semicolon 1
# include <sourcemod>
# include <cstrike>
# undef REQUIRE_PLUGIN
# tryinclude <zombiereloaded>
# define REQUIRE_PLUGIN
# pragma newdecls required
# define DMGINSTEADOFHITS
# define CASHPERHIT 4
# if defined DMGINSTEADOFHITS
ConVar g_cvarDamageMultiplier = null ;
# endif
2020-07-30 13:28:59 +02:00
ConVar g_cvarInfectionGain ;
ConVar g_cvarHumanWinGain ;
2018-08-07 22:29:47 +02:00
bool g_bZRLoaded ;
2020-07-30 02:10:43 +02:00
bool g_bMapEnd ;
2018-08-07 22:29:47 +02:00
2020-07-30 00:15:59 +02:00
int g_iCash [ MAXPLAYERS + 1 ] ;
2020-07-30 02:10:43 +02:00
int g_iCashReconnect [ 256 ] ;
int g_iSteamID [ 256 ] ;
2020-07-30 00:15:59 +02:00
2018-08-07 22:29:47 +02:00
public Plugin myinfo =
{
name = " Defender Money " ,
2020-07-30 00:15:59 +02:00
author = " Obus + Dogan " ,
2020-07-30 02:10:43 +02:00
description = " Reward Humans with cash for shooting Zombies " ,
version = " 1.1.0 " ,
2018-08-07 22:29:47 +02:00
url = " "
} ;
public void OnPluginStart ( )
{
# if defined DMGINSTEADOFHITS
g_cvarDamageMultiplier = CreateConVar ( " sm_damagecashmultiplier " , " 1.0 " , " Multiplier that decides how much cash a client shall receive upon dealing damage " ) ;
2020-07-30 13:28:59 +02:00
g_cvarInfectionGain = CreateConVar ( " sm_infectioncashgain " , " 500 " , " Cash a client shall receive upon infection " ) ;
g_cvarHumanWinGain = CreateConVar ( " sm_humanwincashgain " , " 2500 " , " Cash a human shall receive upon human win " ) ;
2018-08-07 22:29:47 +02:00
AutoExecConfig ( true , " plugin.DefenderMoney " ) ;
# endif
HookEvent ( " player_hurt " , EventHook_PlayerHurt , EventHookMode_Pre ) ;
HookEvent ( " player_death " , EventHook_PlayerDeath , EventHookMode_Pre ) ;
2020-07-30 00:15:59 +02:00
HookEvent ( " player_spawn " , EventHook_PlayerSpawn , EventHookMode_Post ) ;
2020-07-30 13:28:59 +02:00
HookEvent ( " round_end " , EventHook_RoundEnd , EventHookMode_Post ) ;
2020-07-30 02:10:43 +02:00
g_bMapEnd = false ;
2018-08-07 22:29:47 +02:00
}
public void OnAllPluginsLoaded ( )
{
g_bZRLoaded = LibraryExists ( " zombiereloaded " ) ;
}
public void OnLibraryAdded ( const char [ ] sName )
{
2020-07-30 00:15:59 +02:00
if ( strcmp ( sName , " zombiereloaded " , false ) = = 0 )
2018-08-07 22:29:47 +02:00
g_bZRLoaded = true ;
}
public void OnLibraryRemoved ( const char [ ] sName )
{
2020-07-30 00:15:59 +02:00
if ( strcmp ( sName , " zombiereloaded " , false ) = = 0 )
2018-08-07 22:29:47 +02:00
g_bZRLoaded = false ;
}
2020-07-30 00:15:59 +02:00
public void OnMapStart ( )
{
2020-07-30 02:10:43 +02:00
for ( int i = 0 ; i < 256 ; i + + )
{
g_iSteamID [ i ] = 0 ;
g_iCashReconnect [ i ] = 0 ;
}
2020-07-30 00:15:59 +02:00
for ( int i = 1 ; i < = MaxClients ; i + + )
{
2020-07-30 02:10:43 +02:00
g_iCash [ i ] = 0 ;
2020-07-30 00:15:59 +02:00
}
2020-07-30 02:10:43 +02:00
g_bMapEnd = false ;
}
public void OnMapEnd ( )
{
g_bMapEnd = true ;
}
public void OnClientPutInServer ( int client )
{
if ( IsFakeClient ( client ) | | g_bMapEnd )
return ;
int iSteamID = GetSteamAccountID ( client ) ;
for ( int i = 0 ; i < 256 ; i + + )
{
if ( iSteamID = = g_iSteamID [ i ] )
{
g_iCash [ client ] = g_iCashReconnect [ i ] ;
CreateTimer ( 3.0 , MessageReconnect , client ) ;
break ;
}
}
}
public Action MessageReconnect ( Handle timer , int client )
{
PrintToChat ( client , " [SM] Restored your cash: $%d. " , g_iCash [ client ] ) ;
return Plugin_Handled ;
2020-07-30 00:15:59 +02:00
}
public void OnClientDisconnect ( int client )
{
2020-07-30 13:28:59 +02:00
if ( IsFakeClient ( client ) | | ! IsClientInGame ( client ) )
2020-07-30 02:10:43 +02:00
return ;
int iSteamID = GetSteamAccountID ( client ) ;
for ( int i = 0 ; i < 256 ; i + + )
{
if ( iSteamID = = g_iSteamID [ i ] )
{
g_iCashReconnect [ i ] = GetEntProp ( client , Prop_Send , " m_iAccount " ) ;
return ;
}
}
for ( int i = 0 ; i < 256 ; i + + )
{
if ( g_iSteamID [ i ] = = 0 )
{
g_iSteamID [ i ] = iSteamID ;
g_iCashReconnect [ i ] = GetEntProp ( client , Prop_Send , " m_iAccount " ) ;
break ;
}
}
2020-07-30 00:15:59 +02:00
g_iCash [ client ] = 0 ;
}
2020-07-30 13:28:59 +02:00
public void ZR_OnClientInfected ( int client , int attacker , bool motherInfect , bool respawnOverride , bool respawn )
{
if ( ! motherInfect & & IsValidClient ( attacker ) )
SetEntProp ( attacker , Prop_Send , " m_iAccount " , GetEntProp ( attacker , Prop_Send , " m_iAccount " ) + g_cvarInfectionGain . IntValue ) ;
}
2020-07-30 00:15:59 +02:00
public Action EventHook_RoundEnd ( Event hEvent , const char [ ] sEventName , bool bDontBroadcast )
{
2020-07-30 13:28:59 +02:00
bool bAwardHumans = hEvent . GetInt ( " winner " ) = = CS_TEAM_CT ;
2020-07-30 00:15:59 +02:00
for ( int i = 1 ; i < = MaxClients ; i + + )
{
2020-07-30 13:28:59 +02:00
if ( ! IsValidClient ( i ) )
continue ;
if ( ZR_IsClientHuman ( i ) & & bAwardHumans )
{
SetEntProp ( i , Prop_Send , " m_iAccount " , GetEntProp ( i , Prop_Send , " m_iAccount " ) + g_cvarHumanWinGain . IntValue ) ;
g_iCash [ i ] = GetEntProp ( i , Prop_Send , " m_iAccount " ) ;
}
else
{
2020-07-30 00:15:59 +02:00
g_iCash [ i ] = GetEntProp ( i , Prop_Send , " m_iAccount " ) ;
2020-07-30 13:28:59 +02:00
}
2020-07-30 00:15:59 +02:00
}
}
2018-08-07 22:29:47 +02:00
public Action EventHook_PlayerHurt ( Event hEvent , const char [ ] sEventName , bool bDontBroadcast )
{
2020-07-30 00:15:59 +02:00
if ( ! g_bZRLoaded )
2018-08-07 22:29:47 +02:00
return Plugin_Continue ;
int iAttacker = GetClientOfUserId ( hEvent . GetInt ( " attacker " ) ) ;
2020-07-30 00:15:59 +02:00
if ( ! IsValidClient ( iAttacker ) | | ! ZR_IsClientHuman ( iAttacker ) )
2018-08-07 22:29:47 +02:00
return Plugin_Continue ;
int iVictim = GetClientOfUserId ( hEvent . GetInt ( " userid " ) ) ;
2020-07-30 00:15:59 +02:00
if ( ! IsValidClient ( iVictim ) | | ! ZR_IsClientZombie ( iVictim ) )
2018-08-07 22:29:47 +02:00
return Plugin_Continue ;
char sWeapon [ 16 ] ;
hEvent . GetString ( " weapon " , sWeapon , sizeof ( sWeapon ) ) ;
2020-07-30 00:15:59 +02:00
if ( ! strncmp ( sWeapon , " knife " , 5 ) )
return Plugin_Continue ;
if ( GetEntProp ( iAttacker , Prop_Send , " m_iAccount " ) > = 65000 )
2018-08-07 22:29:47 +02:00
return Plugin_Continue ;
# if defined DMGINSTEADOFHITS
float fDamage = float ( hEvent . GetInt ( " dmg_health " ) ) ;
SetEntProp ( iAttacker , Prop_Send , " m_iAccount " , GetEntProp ( iAttacker , Prop_Send , " m_iAccount " ) + RoundToNearest ( fDamage > 0.0 ? fDamage * g_cvarDamageMultiplier . FloatValue : 1.0 ) ) ;
# else
SetEntProp ( iAttacker , Prop_Send , " m_iAccount " , GetEntProp ( iAttacker , Prop_Send , " m_iAccount " ) + CASHPERHIT ) ;
# endif
return Plugin_Continue ;
}
public Action EventHook_PlayerDeath ( Event hEvent , const char [ ] sEventName , bool bDontBroadcast )
{
2020-07-30 00:15:59 +02:00
int client = GetClientOfUserId ( hEvent . GetInt ( " userid " ) ) ;
2018-08-07 22:29:47 +02:00
2020-07-30 00:15:59 +02:00
g_iCash [ client ] = GetEntProp ( client , Prop_Send , " m_iAccount " ) ;
2018-08-07 22:29:47 +02:00
return Plugin_Continue ;
}
2020-07-30 00:15:59 +02:00
public Action EventHook_PlayerSpawn ( Event hEvent , const char [ ] sEventName , bool bDontBroadcast )
2018-08-07 22:29:47 +02:00
{
2020-07-30 00:15:59 +02:00
int client = GetClientOfUserId ( hEvent . GetInt ( " userid " ) ) ;
2020-07-30 13:28:59 +02:00
RequestFrame ( RequestFrame_Callback , client ) ;
2018-08-07 22:29:47 +02:00
2020-07-30 00:15:59 +02:00
return Plugin_Continue ;
2018-08-07 22:29:47 +02:00
}
2020-07-30 13:28:59 +02:00
public void RequestFrame_Callback ( int client )
{
if ( g_iCash [ client ] > 0 )
SetEntProp ( client , Prop_Send , " m_iAccount " , g_iCash [ client ] ) ;
}
2018-08-07 22:29:47 +02:00
stock bool IsValidClient ( int client )
{
return ( client > 0 & & client < = MaxClients & & IsClientInGame ( client ) & & IsPlayerAlive ( client ) ) ;
2020-07-30 00:15:59 +02:00
}