#pragma semicolon 1 #include #include #include #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_cvarMotherZombieWinGain; ConVar g_cvarHumanWinGain; ConVar g_cvarHumanTriggerGain; ConVar g_cvarRoundStartCash; ConVar g_cvarStartCash; ConVar g_cvarMaxCash; ConVar g_cvarCashRoundReset; bool g_bZRLoaded; bool g_bMapEnd; bool g_bTriggerCooldown; bool g_bDisabled[2048]; bool g_bAwardHumans; bool g_bAwardZombies; bool g_bMotherZombie[MAXPLAYERS + 1]; int g_iCash[MAXPLAYERS + 1]; int g_iDamageCash[MAXPLAYERS + 1]; int g_iCashReconnect[256]; int g_iSteamID[256]; public Plugin myinfo = { name = "Cash Manager", author = "Obus + Dogan", description = "Manage Cash with additional gains and limits", version = "3.0.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 [Dependency: sm_cashroundreset]"); g_cvarMotherZombieWinGain = CreateConVar("sm_motherzombiecashgain", "2500", "Cash a client shall receive upon zombie win while being motherzombie [Dependency: sm_cashroundreset]"); g_cvarHumanWinGain = CreateConVar("sm_humanwincashgain", "2500", "Cash a human shall receive upon human win [Dependency: sm_cashroundreset]"); g_cvarHumanTriggerGain = CreateConVar("sm_humantriggercashgain", "200", "Cash a human shall receive upon triggering"); g_cvarRoundStartCash = CreateConVar("sm_roundstartcash", "2500", "Minimum cash a client starts the round [Dependency: sm_cashroundreset]"); g_cvarStartCash = CreateConVar("sm_startcash", "12500", "Cash a client starts the map or round [for round Dependency: sm_cashroundreset]"); g_cvarMaxCash = CreateConVar("sm_maxcash", "45000", "Max cash you can store"); g_cvarCashRoundReset = CreateConVar("sm_cashroundreset", "0", "1 = CashManager resets the cash each round, 0 = CashManager doesn't reset the cash at all during a map", FCVAR_NONE, true, 0.0, true, 1.0); AutoExecConfig(true, "plugin.CashManager"); #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); HookEvent("round_start", EventHook_RoundStart, EventHookMode_Post); HookEntityOutput("trigger_once", "OnStartTouch", OnStartTouch); HookEntityOutput("func_button", "OnPressed", OnPressed); 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] = -1; } for(int i = 1; i <= MaxClients; i++) g_iCash[i] = -1; g_bMapEnd = false; } public void OnMapEnd() { g_bMapEnd = true; } public void OnClientPutInServer(int client) { if(IsFakeClient(client) || g_bMapEnd || g_cvarCashRoundReset.BoolValue) return; int iSteamID = GetSteamAccountID(client); g_iCash[client] = g_cvarStartCash.IntValue; SetEntProp(client, Prop_Send, "m_iAccount", g_cvarStartCash.IntValue); for(int i = 0; i < 256; i++) { if(iSteamID == g_iSteamID[i]) { g_iCash[client] = g_iCashReconnect[i]; SetEntProp(client, Prop_Send, "m_iAccount", g_iCash[client]); CreateTimer(3.0, MessageReconnect, client); break; } } } public Action MessageReconnect(Handle timer, int client) { if(!IsClientInGame(client)) return Plugin_Handled; CPrintToChat(client, "{cyan}[UNLOZE CashManager] {white}Restored your cash: {yellow}$%d{white}.", g_iCash[client]); return Plugin_Handled; } public void OnClientDisconnect(int client) { g_iDamageCash[client] = 0; if(IsFakeClient(client) || !IsClientInGame(client) || g_cvarCashRoundReset.BoolValue) 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] = -1; g_bMotherZombie[client] = false; } public void ZR_OnClientInfected(int client, int attacker, bool motherInfect, bool respawnOverride, bool respawn) { if(g_cvarCashRoundReset.BoolValue) return; g_bMotherZombie[client] = motherInfect; if(!motherInfect && IsValidClient(attacker) && !(GetEntProp(attacker, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue)) { SetEntProp(attacker, Prop_Send, "m_iAccount", GetEntProp(attacker, Prop_Send, "m_iAccount") + g_cvarInfectionGain.IntValue); CPrintToChat(attacker, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for infecting an Human.", g_cvarInfectionGain.IntValue); } } public void OnStartTouch(const char[] sOutput, int iCaller, int iActivator, float fDelay) { if (!IsValidClient(iActivator)) return; if (g_bDisabled[iCaller] || g_bTriggerCooldown) return; if (!(ZR_IsClientHuman(iActivator))) return; g_bDisabled[iCaller] = true; g_bTriggerCooldown = true; float fTriggerCD = GetConVarFloat(FindConVar("sm_trigger_reward_cd")); CreateTimer(fTriggerCD, ResetTriggerCD); if(!(GetEntProp(iActivator, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue)) { SetEntProp(iActivator, Prop_Send, "m_iAccount", GetEntProp(iActivator, Prop_Send, "m_iAccount") + g_cvarHumanTriggerGain.IntValue); CPrintToChat(iActivator, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for getting a Trigger.", g_cvarHumanTriggerGain.IntValue); } } public void OnPressed(const char[] sOutput, int iCaller, int iActivator, float fDelay) { if(!IsValidClient(iActivator)) return; if (g_bDisabled[iCaller] || g_bTriggerCooldown) return; if (!(ZR_IsClientHuman(iActivator))) return; int iParent = INVALID_ENT_REFERENCE; if ((iParent = GetEntPropEnt(iCaller, Prop_Data, "m_hMoveParent")) != INVALID_ENT_REFERENCE) { char sClassname[64]; GetEdictClassname(iParent, sClassname, sizeof(sClassname)); if (strncmp(sClassname, "weapon_", 7, false) == 0) return; } g_bDisabled[iCaller] = true; g_bTriggerCooldown= true; float fTriggerCD = GetConVarFloat(FindConVar("sm_trigger_reward_cd")); CreateTimer(fTriggerCD, ResetTriggerCD); if(!(GetEntProp(iActivator, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue)) { SetEntProp(iActivator, Prop_Send, "m_iAccount", GetEntProp(iActivator, Prop_Send, "m_iAccount") + g_cvarHumanTriggerGain.IntValue); CPrintToChat(iActivator, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for getting a Trigger.", g_cvarHumanTriggerGain.IntValue); } } public Action ResetTriggerCD(Handle timer) { g_bTriggerCooldown = false; } public Action EventHook_RoundEnd(Event hEvent, const char[] sEventName, bool bDontBroadcast) { if(g_cvarCashRoundReset.BoolValue) return Plugin_Handled; g_bAwardHumans = (hEvent.GetInt("winner") == CS_TEAM_CT); g_bAwardZombies = (hEvent.GetInt("winner") == CS_TEAM_T); RequestFrame(RequestFrame_Callback3); return Plugin_Handled; } public Action EventHook_RoundStart(Event hEvent, const char[] sEventName, bool bDontBroadcast) { for(int i = 1; i <= MaxClients; i++) { g_bMotherZombie[i] = false; g_iDamageCash[i] = 0; } for(int i = 0; i < 2048; i++) g_bDisabled[i] = false; } 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") >= g_cvarMaxCash.IntValue) 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)); g_iDamageCash[iAttacker] = g_iDamageCash[iAttacker] + RoundToNearest(fDamage > 0.0 ? fDamage * g_cvarDamageMultiplier.FloatValue : 1.0); if(g_iDamageCash[iAttacker] >= 1000) { g_iDamageCash[iAttacker] = 0; CPrintToChat(iAttacker, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$1000{white} for damaging the Zombies."); } #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")); int attacker = GetClientOfUserId(hEvent.GetInt("attacker")); if(!IsValidClient(attacker)) return Plugin_Continue; if(!g_cvarCashRoundReset.BoolValue) { g_iCash[client] = GetEntProp(client, Prop_Send, "m_iAccount"); char sWeapon[16]; hEvent.GetString("weapon", sWeapon, sizeof(sWeapon)); if(ZR_IsClientZombie(attacker) && StrEqual(sWeapon, "knife", true) && !(GetEntProp(attacker, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue)) //nemesis kill { SetEntProp(attacker, Prop_Send, "m_iAccount", GetEntProp(attacker, Prop_Send, "m_iAccount") + g_cvarInfectionGain.IntValue); CPrintToChat(attacker, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for killing an Human.", g_cvarInfectionGain.IntValue); } else if(ZR_IsClientZombie(attacker)) // regular infection { return Plugin_Continue; } } int iPacked = (attacker<<16) | (GetEntProp(attacker, Prop_Send, "m_iAccount")&0xFFFF); RequestFrame(RequestFrame_Callback2, iPacked); 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(!IsValidClient(client)) return; if(g_cvarCashRoundReset.BoolValue) { SetEntProp(client, Prop_Send, "m_iAccount", g_cvarStartCash.IntValue); CPrintToChat(client, "{cyan}[UNLOZE CashManager] {white}Resetting your Cash to {yellow}$%d{white}.", g_cvarStartCash.IntValue); return; } if(g_iCash[client] >= 0 && g_iCash[client] < g_cvarRoundStartCash.IntValue) //Player is (almost) broke SetEntProp(client, Prop_Send, "m_iAccount", g_cvarRoundStartCash.IntValue); else if(g_iCash[client] >= 0 && g_iCash[client] < g_cvarMaxCash.IntValue) //Player isn't broke SetEntProp(client, Prop_Send, "m_iAccount", g_iCash[client]); else if(g_iCash[client] >= 0 && g_iCash[client] >= g_cvarMaxCash.IntValue) //Player hit limit SetEntProp(client, Prop_Send, "m_iAccount", g_cvarMaxCash.IntValue); return; } public void RequestFrame_Callback2(int iPacked) { int iOldCash = iPacked&0xFFFF; int iAttacker = iPacked>>16; SetEntProp(iAttacker, Prop_Send, "m_iAccount", iOldCash); } public void RequestFrame_Callback3() { for(int i = 1; i <= MaxClients; i++) { if(!IsClientInGame(i)) continue; if(IsPlayerAlive(i) && GetClientTeam(i) == CS_TEAM_CT && g_bAwardHumans && !(GetEntProp(i, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue)) { SetEntProp(i, Prop_Send, "m_iAccount", GetEntProp(i, Prop_Send, "m_iAccount") + g_cvarHumanWinGain.IntValue); CPrintToChat(i, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for winning as Human.", g_cvarHumanWinGain.IntValue); g_iCash[i] = GetEntProp(i, Prop_Send, "m_iAccount"); } else if(IsPlayerAlive(i) && GetClientTeam(i) == CS_TEAM_T && g_bAwardZombies && g_bMotherZombie[i] && !(GetEntProp(i, Prop_Send, "m_iAccount") >= g_cvarMaxCash.IntValue)) { SetEntProp(i, Prop_Send, "m_iAccount", GetEntProp(i, Prop_Send, "m_iAccount") + g_cvarMotherZombieWinGain.IntValue); CPrintToChat(i, "{cyan}[UNLOZE CashManager] {white}You gained {yellow}$%d{white} for winning as MotherZombie.", g_cvarMotherZombieWinGain.IntValue); g_iCash[i] = GetEntProp(i, Prop_Send, "m_iAccount"); } else { g_iCash[i] = GetEntProp(i, Prop_Send, "m_iAccount"); } } } stock bool IsValidClient(int client) { return (client > 0 && client <= MaxClients && IsClientInGame(client) && IsPlayerAlive(client)); }