From 5096c5d8f63d9dabea8645a55ca968b8f6198caf Mon Sep 17 00:00:00 2001 From: Jackz Date: Mon, 11 Jan 2021 11:09:25 -0600 Subject: [PATCH] Add l4d2_extraplayeritems --- plugins/l4d2_extraplayeritems.smx | Bin 0 -> 5973 bytes scripting/l4d2_extraplayeritems.sp | 150 +++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 plugins/l4d2_extraplayeritems.smx create mode 100644 scripting/l4d2_extraplayeritems.sp diff --git a/plugins/l4d2_extraplayeritems.smx b/plugins/l4d2_extraplayeritems.smx new file mode 100644 index 0000000000000000000000000000000000000000..e2be988d7df47ad6ad3d5fe195eb41bc7e32f026 GIT binary patch literal 5973 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 literal 0 HcmV?d00001 diff --git a/scripting/l4d2_extraplayeritems.sp b/scripting/l4d2_extraplayeritems.sp new file mode 100644 index 0000000..99961bb --- /dev/null +++ b/scripting/l4d2_extraplayeritems.sp @@ -0,0 +1,150 @@ +#pragma semicolon 1 +#pragma newdecls required + +//#define DEBUG + +#define PLUGIN_VERSION "1.0" + +#include +#include +#include +#include +//#include + +public Plugin myinfo = +{ + name = "L4D2 Extra Player Items", + author = "jackzmc", + description = "Automatic system to give extra players kits, and provide extra items.", + version = PLUGIN_VERSION, + url = "" +}; + +static ConVar hExtraItemBasePercentage; +static int extraKitsAmount, totalSurvivorCount, isFailureRound; + +/* +on first start: Everyone has a kit, new comers also get a kit. +then when you reach the saferoom, extraKitsAmount is set to the amount of players minus 4. Ex: 5 players -> 1 extra kit +Then on heal at the point, you get an extra kit. After a map transition when a player_spawn is fired, if they do not have a kit; give an extra kit if there is any. +Any left over kits will be used on heals until depleted. +*/ + +public void OnPluginStart() +{ + EngineVersion g_Game = GetEngineVersion(); + if(g_Game != Engine_Left4Dead && g_Game != Engine_Left4Dead2) + { + SetFailState("This plugin is for L4D/L4D2 only."); + } + + HookEvent("player_spawn", Event_PlayerSpawn); + HookEvent("player_first_spawn", Event_PlayerFirstSpawn); + HookEvent("player_disconnect", Event_Disconnect); + HookEvent("round_end", Event_RoundEnd); + HookEvent("player_entered_checkpoint", Event_EnterSaferoom); + HookEvent("heal_success", Event_HealFinished); + + hExtraItemBasePercentage = CreateConVar("l4d2_extraitem_chance", "0.056", "The base chance (multipled by player count) of an extra item being spawned.", FCVAR_NONE, true, 0.0, true, 1.0); + + AutoExecConfig(true); +} + +///////////////////////////////////// +/// EVENTS +//////////////////////////////////// + +//Called on the first spawn in a mission. +public Action Event_PlayerFirstSpawn(Event event, const char[] name, bool dontBroadcast) { + //int client = GetClientOfUserId(event.GetInt("userid")); + totalSurvivorCount++; +} + +//Provide extra kits when a player spawns (aka after a map transition) +public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) { + int client = GetClientOfUserId(event.GetInt("userid")); + if(extraKitsAmount > 0) { + char wpn[32]; + if(GetClientWeaponName(client, 3, wpn, sizeof(wpn))) { + if(!StrEqual(wpn, "weapon_first_aid_kit")) { + CheatCommand(client, "give", "first_aid_kit", ""); + extraKitsAmount--; + if(extraKitsAmount == 0) { + extraKitsAmount = -1; + } + } + } + } +} +public Action Event_Disconnect(Event event, const char[] name, bool dontBroadcast) { + totalSurvivorCount--; +} + +//TODO: Possibly switch to game_init or game_newmap ? +public void OnMapStart() { + //If it is the first map, reset count as this is before any players. Needs to ignore after a round_end + if(L4D_IsFirstMapInScenario()) { + if(isFailureRound) + isFailureRound = false; + else + totalSurvivorCount = 0; + } + + if(totalSurvivorCount > 4) + CreateTimer(20.0, Timer_AddExtraCounts); +} + +public void Event_EnterSaferoom(Event event, const char[] name, bool dontBroadcast) { + + int client = GetClientOfUserId(event.GetInt("userid")); + if(client > 0) { + if(extraKitsAmount == -1 && L4D_IsInLastCheckpoint(client)) { + if(totalSurvivorCount > 4) { + extraKitsAmount = totalSurvivorCount - 4; + PrintToServer("Player entered saferoom. An extra %d kits will be provided on heal", extraKitsAmount); + } + } + } +} + +public Action Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) { + if(!isFailureRound) isFailureRound = true; +} + + +public Action Event_HealFinished(Event event, const char[] name, bool dontBroadcast) { + int client = GetClientOfUserId(event.GetInt("userid")); + //if statement + if(extraKitsAmount > 0) { + CheatCommand(client, "give", "first_aid_kit", ""); + extraKitsAmount--; + if(extraKitsAmount == 0) { + extraKitsAmount = -1; + } + } +} + + + +///////////////////////////////////// +/// TIMERS +//////////////////////////////////// + +public Action Timer_AddExtraCounts(Handle hd) { + float percentage = hExtraItemBasePercentage.FloatValue * totalSurvivorCount; + PrintToServer("Populating extra items based on player count (%d)", totalSurvivorCount); + char classname[32]; + for(int i = MaxClients + 1; i < 2048; i++) { + if(IsValidEntity(i)) { + GetEntityClassname(i, classname, sizeof(classname)); + if(StrContains(classname, "_spawn", true) > -1 && !StrEqual(classname, "info_zombie_spawn", true)) { + int count = GetEntProp(i, Prop_Data, "m_itemCount"); + if(GetRandomFloat() < percentage) { + PrintToServer("Debug: Incrementing spawn count for %s from %d", classname, count); + SetEntProp(i, Prop_Data, "m_itemCount", ++count); + } + PrintToServer("%s %d", classname, count); + } + } + } +} \ No newline at end of file