#pragma semicolon 1 #include #include #undef REQUIRE_PLUGIN #tryinclude #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)); }