238 lines
5.5 KiB
SourcePawn
238 lines
5.5 KiB
SourcePawn
#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
|
|
|
|
ConVar g_cvarInfectionGain;
|
|
ConVar g_cvarHumanWinGain;
|
|
|
|
bool g_bZRLoaded;
|
|
bool g_bMapEnd;
|
|
|
|
int g_iCash[MAXPLAYERS + 1];
|
|
int g_iCashReconnect[256];
|
|
int g_iSteamID[256];
|
|
|
|
public Plugin myinfo =
|
|
{
|
|
name = "Defender Money",
|
|
author = "Obus + Dogan",
|
|
description = "Reward Humans with cash for shooting Zombies",
|
|
version = "1.1.0",
|
|
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");
|
|
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");
|
|
|
|
AutoExecConfig(true, "plugin.DefenderMoney");
|
|
#endif
|
|
|
|
HookEvent("player_hurt", EventHook_PlayerHurt, EventHookMode_Pre);
|
|
HookEvent("player_death", EventHook_PlayerDeath, EventHookMode_Pre);
|
|
HookEvent("player_spawn", EventHook_PlayerSpawn, EventHookMode_Post);
|
|
HookEvent("round_end", EventHook_RoundEnd, EventHookMode_Post);
|
|
|
|
g_bMapEnd = false;
|
|
}
|
|
|
|
public void OnAllPluginsLoaded()
|
|
{
|
|
g_bZRLoaded = LibraryExists("zombiereloaded");
|
|
}
|
|
|
|
public void OnLibraryAdded(const char[] sName)
|
|
{
|
|
if(strcmp(sName, "zombiereloaded", false) == 0)
|
|
g_bZRLoaded = true;
|
|
}
|
|
|
|
public void OnLibraryRemoved(const char[] sName)
|
|
{
|
|
if(strcmp(sName, "zombiereloaded", false) == 0)
|
|
g_bZRLoaded = false;
|
|
}
|
|
|
|
public void OnMapStart()
|
|
{
|
|
for(int i = 0; i < 256; i++)
|
|
{
|
|
g_iSteamID[i] = 0;
|
|
g_iCashReconnect[i] = 0;
|
|
}
|
|
|
|
for(int i = 1; i <= MaxClients; i++)
|
|
{
|
|
g_iCash[i] = 0;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
public void OnClientDisconnect(int client)
|
|
{
|
|
if(IsFakeClient(client) || !IsClientInGame(client))
|
|
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;
|
|
}
|
|
}
|
|
|
|
g_iCash[client] = 0;
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
public Action EventHook_RoundEnd(Event hEvent, const char[] sEventName, bool bDontBroadcast)
|
|
{
|
|
bool bAwardHumans = hEvent.GetInt("winner") == CS_TEAM_CT;
|
|
|
|
for(int i = 1; i <= MaxClients; i++)
|
|
{
|
|
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
|
|
{
|
|
g_iCash[i] = GetEntProp(i, Prop_Send, "m_iAccount");
|
|
}
|
|
}
|
|
}
|
|
|
|
public Action EventHook_PlayerHurt(Event hEvent, const char[] sEventName, bool bDontBroadcast)
|
|
{
|
|
if(!g_bZRLoaded)
|
|
return Plugin_Continue;
|
|
|
|
int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
|
|
|
|
if(!IsValidClient(iAttacker) || !ZR_IsClientHuman(iAttacker))
|
|
return Plugin_Continue;
|
|
|
|
int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));
|
|
|
|
if(!IsValidClient(iVictim) || !ZR_IsClientZombie(iVictim))
|
|
return Plugin_Continue;
|
|
|
|
char sWeapon[16];
|
|
|
|
hEvent.GetString("weapon", sWeapon, sizeof(sWeapon));
|
|
|
|
if(!strncmp(sWeapon, "knife", 5))
|
|
return Plugin_Continue;
|
|
|
|
if(GetEntProp(iAttacker, Prop_Send, "m_iAccount") >= 65000)
|
|
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)
|
|
{
|
|
int client = GetClientOfUserId(hEvent.GetInt("userid"));
|
|
|
|
g_iCash[client] = GetEntProp(client, Prop_Send, "m_iAccount");
|
|
|
|
return Plugin_Continue;
|
|
}
|
|
|
|
public Action EventHook_PlayerSpawn(Event hEvent, const char[] sEventName, bool bDontBroadcast)
|
|
{
|
|
int client = GetClientOfUserId(hEvent.GetInt("userid"));
|
|
|
|
RequestFrame(RequestFrame_Callback, client);
|
|
|
|
return Plugin_Continue;
|
|
}
|
|
|
|
public void RequestFrame_Callback(int client)
|
|
{
|
|
if(g_iCash[client] > 0)
|
|
SetEntProp(client, Prop_Send, "m_iAccount", g_iCash[client]);
|
|
}
|
|
|
|
stock bool IsValidClient(int client)
|
|
{
|
|
return (client > 0 && client <= MaxClients && IsClientInGame(client) && IsPlayerAlive(client));
|
|
} |