From 463b8ec8ec48f4c894b87fc58f3c6255bf2345d5 Mon Sep 17 00:00:00 2001 From: Jackz Date: Mon, 18 Jan 2021 16:00:07 -0600 Subject: [PATCH] l4d2_extraplayeritems: I hope this is the final version --- plugins/l4d2_extraplayeritems.smx | Bin 6537 -> 8157 bytes scripting/l4d2_extraplayeritems.sp | 187 +++++++++++++++++++++-------- 2 files changed, 139 insertions(+), 48 deletions(-) diff --git a/plugins/l4d2_extraplayeritems.smx b/plugins/l4d2_extraplayeritems.smx index 3e7cb09377b42cefb39506dc302301041ac8d520..dcaaefd1a220129153f1847dccb2b2a5624b821b 100644 GIT binary patch delta 8014 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 delta 6395 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 y5=OjdZYY+fA|1O>o3z;-rtPc>P4`Q7(c-xxq probably dynamic array if using % system. +Far away player detection (behind), tell players in chat. +*/ +public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { + if(late) + isLateLoaded = true; + +} + + public void OnPluginStart() { EngineVersion g_Game = GetEngineVersion(); @@ -44,30 +58,79 @@ public void OnPluginStart() HookEvent("round_end", Event_RoundEnd); HookEvent("player_entered_checkpoint", Event_EnterSaferoom); HookEvent("heal_success", Event_HealFinished); + HookEvent("map_transition", Event_MapTransition); hExtraItemBasePercentage = CreateConVar("l4d2_extraitem_chance", "0.056", "The base chance (multiplied by player count) of an extra item being spawned.", FCVAR_NONE, true, 0.0, true, 1.0); + hAddExtraKits = CreateConVar("l4d2_extraitems_kitmode", "0", "Decides how extra kits should be added. 0 -> Overwrites previous extra kits, 1 -> Adds onto previous extra kits"); AutoExecConfig(true, "l4d2_extraplayeritems"); + + RegAdminCmd("sm_epi_setkits", Command_SetKitAmount, ADMFLAG_CHEATS, "Sets the amount of extra kits that will be provided"); + #if defined DEBUG + RegAdminCmd("sm_epi_kits", Command_GetKitAmount, ADMFLAG_CHEATS); + RegAdminCmd("sm_epi_items", Command_RunExtraItems, ADMFLAG_CHEATS); + #endif } +///////////////////////////////////// +/// COMMANDS +//////////////////////////////////// + +public Action Command_SetKitAmount(int client, int args) { + char arg[32]; + GetCmdArg(1, arg, sizeof(arg)); + int number = StringToInt(arg); + if(number > 0 || number == -1) { + extraKitsAmount = number; + extraKitsStarted = extraKitsAmount; + ReplyToCommand(client, "Set extra kits amount to %d", number); + }else{ + ReplyToCommand(client, "Must be a number greater than 0. -1 to disable"); + } + return Plugin_Handled; +} + +#if defined DEBUG +public Action Command_GetKitAmount(int client, int args) { + ReplyToCommand(client, "Extra kits available: %d | Survivors: %d", extraKitsAmount, GetSurvivorsCount()); + return Plugin_Handled; +} +public Action Command_RunExtraItems(int client, int args) { + ReplyToCommand(client, "Running extra item count increaser..."); + CreateTimer(0.1, Timer_AddExtraCounts); + return Plugin_Handled; +} +#endif ///////////////////////////////////// /// EVENTS //////////////////////////////////// //Called on the first spawn in a mission. -bool startingKitsGiven = false; public Action Event_PlayerFirstSpawn(Event event, const char[] name, bool dontBroadcast) { - if(L4D_IsFirstMapInScenario() && !startingKitsGiven) { - CreateTimer(0.5, Timer_GiveStartingKits); - } -} -public Action Timer_GiveStartingKits(Handle hdl) { - for(int i = 1; i < MaxClients + 1; i++) { - if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2){ - if(!DoesClientHaveKit(i)) { - CheatCommand(i, "give", "first_aid_kit", ""); - } + int client = GetClientOfUserId(event.GetInt("userid")); + if(L4D_IsFirstMapInScenario() && GetClientTeam(client) == 2) { + //Check if all clients are ready, and survivor count is > 4. + //TODO: Possibly stop redudant double loops (ready check & survivor count)0 + if(AreAllClientsReady() && GetSurvivorsCount() > 4) { + int skipLeft = 4; + for(int i = 1; i < MaxClients + 1; i++) { + if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2) { + //Skip at least the first 4 players, as they will pickup default kits. + //If player somehow already has it ,also skip them. + if(skipLeft > 0 || DoesClientHaveKit(i)) { + skipLeft--; + continue; + }else{ + CheatCommand(i, "give", "first_aid_kit", ""); + } + } + } + //do for loop, skip 4 people } + }else{ + if(!DoesClientHaveKit(client) && GetClientTeam(client) == 2) { + CheatCommand(client, "give", "first_aid_kit", ""); + } } } @@ -77,39 +140,38 @@ public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadca if(GetClientTeam(client) == 2 && extraKitsAmount > 0) { if(!DoesClientHaveKit(client)) { CheatCommand(client, "give", "first_aid_kit", ""); - extraKitsAmount--; - if(extraKitsAmount == 0) { - extraKitsAmount = -1; - } + UseExtraKit(); } } } //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; - startingKitsGiven = false; - } + //If previous round was a failure, restore the amount of kits that were left directly after map transition + if(isFailureRound) { + extraKitsAmount = extraKitsStarted; + isFailureRound = false; } - if(totalSurvivorCount > 4 && GetEntityCount() < MAX_ENTITY_LIMIT) + if(!isLateLoaded && GetSurvivorsCount() > 4 && GetEntityCount() < MAX_ENTITY_LIMIT) 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)) { - int survivors = GetSurvivorsCount(); - if(survivors > 4) { - extraKitsAmount = survivors - 4; - PrintToServer("Player entered saferoom. An extra %d kits will be provided", extraKitsAmount); + if(client > 0 && !isCheckpointReached) { + PrintToConsoleAll("saferoom | EKA %d | Client %d | SafeRoom %b", extraKitsAmount, client, L4D_IsInLastCheckpoint(client)); + if(L4D_IsInLastCheckpoint(client)) { + isCheckpointReached = true; + int extraPlayers = GetSurvivorsCount() - 4; + if(extraPlayers > 0) { + //If hAddExtraKits TRUE: Append to previous, FALSE: Overwrite + if(hAddExtraKits.BoolValue) + extraKitsAmount += extraPlayers; + else + extraKitsAmount = extraPlayers; + extraKitsStarted = extraKitsAmount; + PrintToServer(">>> Player entered saferoom. An extra %d kits will be provided", extraKitsAmount); } } } @@ -118,17 +180,19 @@ public void Event_EnterSaferoom(Event event, const char[] name, bool dontBroadca public Action Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) { if(!isFailureRound) isFailureRound = true; } +public Action Event_MapTransition(Event event, const char[] name, bool dontBroadcast) { + isCheckpointReached = false; + isLateLoaded = false; + //If any kits were consumed before map transition, decrease from reset-amount (for if a round fails) + extraKitsStarted = extraKitsAmount; +} 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; - } + UseExtraKit(); } } @@ -138,27 +202,38 @@ public Action Event_HealFinished(Event event, const char[] name, bool dontBroadc /// TIMERS //////////////////////////////////// +//TODO: In future, possibly have a total percentage of spawns that are affected instead on a per-level +//TODO: In future, also randomize what items are selected? Two loops: +/* + first loop pushes any valid _spawns into dynamic array + while / for loop that runs until X amount affected (based on % of GetEntityCount()). + + Prioritize first aid kits somehow? Or split two groups: "utility" (throwables, kits, pill/shots), and "weapon" (all other spawns) +*/ public Action Timer_AddExtraCounts(Handle hd) { - float percentage = hExtraItemBasePercentage.FloatValue * totalSurvivorCount; - PrintToServer("Populating extra items based on player count (%d) | Percentage %d", totalSurvivorCount, percentage); + int survivors = GetSurvivorsCount(); + float percentage = hExtraItemBasePercentage.FloatValue * survivors; + PrintToServer("Populating extra items based on player count (%d) | Percentage %f%%", survivors, percentage * 100); char classname[32]; int entityCount = GetEntityCount(); + int affected = 0; for(int i = MaxClients + 1; i < 2048; i++) { if(IsValidEntity(i) && entityCount < MAX_ENTITY_LIMIT) { GetEntityClassname(i, classname, sizeof(classname)); - if(StrContains(classname, "_spawn", true) > -1 && !StrEqual(classname, "info_zombie_spawn", true)) { - if(StrEqual(classname, "weapon_melee_spawn")) { - - } + if(StrContains(classname, "_spawn", true) > -1 + && !StrEqual(classname, "info_zombie_spawn", true) + && StrContains(classname, "scavenge", true) == -1 + ) { int count = GetEntProp(i, Prop_Data, "m_itemCount"); - if(GetRandomFloat() < percentage) { - PrintToServer("Debug: Incrementing spawn count for %s from %d", classname, count); + if(count > 0 && GetRandomFloat() < percentage) { SetEntProp(i, Prop_Data, "m_itemCount", ++count); + ++affected; } entityCount++; } } } + PrintToServer("Incremented counts for %d items", affected); } ///////////////////////////////////// @@ -169,12 +244,22 @@ stock int GetSurvivorsCount() { int count = 0; for(int i = 1; i < MaxClients + 1; i++) { if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2) { - count++; + ++count; } } + PrintToServer("debug >>> survivors %d", count); return count; } +stock bool AreAllClientsReady() { + for(int i = 1; i < MaxClients + 1; i++) { + if(IsClientConnected(i) && !IsClientInGame(i)) { + return false; + } + } + return true; +} + stock bool DoesClientHaveKit(int client) { char wpn[32]; if(GetClientWeaponName(client, 3, wpn, sizeof(wpn))) { @@ -183,4 +268,10 @@ stock bool DoesClientHaveKit(int client) { } } return false; +} + +stock void UseExtraKit() { + if(--extraKitsAmount <= 0) { + extraKitsAmount = 0; + } } \ No newline at end of file