From 4bb94de1c609f7c3c495f031b1d26c2842a3b2c6 Mon Sep 17 00:00:00 2001 From: Jackz Date: Mon, 4 Oct 2021 23:20:29 -0500 Subject: [PATCH] Use troll instance cache for magnet, use flag for random chance --- scripting/include/feedthetrolls/events.inc | 49 +++++++++++++++++----- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/scripting/include/feedthetrolls/events.inc b/scripting/include/feedthetrolls/events.inc index 8fd279b..cdabe4d 100644 --- a/scripting/include/feedthetrolls/events.inc +++ b/scripting/include/feedthetrolls/events.inc @@ -78,6 +78,11 @@ public Action L4D2_OnChooseVictim(int attacker, int &curTarget) { // ========================= // OVERRIDE VICTIM // ========================= + static Troll spMagnet; + static Troll tankMagnet; + if(!spMagnet.id) GetTroll("Special Magnet", spMagnet); + if(!tankMagnet.id) GetTroll("Tank Magnet", tankMagnet); + if(hMagnetChance.FloatValue < GetRandomFloat()) return Plugin_Continue; L4D2Infected class = view_as(GetEntProp(attacker, Prop_Send, "m_zombieClass")); int existingTarget = GetClientOfUserId(g_iAttackerTarget[attacker]); @@ -101,7 +106,11 @@ public Action L4D2_OnChooseVictim(int attacker, int &curTarget) { if((class == L4D2Infected_Tank && hMagnetTargetMode.IntValue & 2 == 2) || hMagnetTargetMode.IntValue & 1 == 1 ) continue; } - if(class == L4D2Infected_Tank && IsTrollActive(i, "Tank Magnet") || (class != L4D2Infected_Tank && IsTrollActive(i, "Special Magnet"))) { + if(class == L4D2Infected_Tank && tankMagnet.IsActive(i) || (class != L4D2Infected_Tank && spMagnet.IsActive(i))) { + if(class == L4D2Infected_Tank) { + if(!WillMagnetRun(tankMagnet, i)) return Plugin_Continue; + } else if(!WillMagnetRun(spMagnet, i)) return Plugin_Continue; + GetClientAbsOrigin(i, survPos); float dist = GetVectorDistance(survPos, spPos, true); if(closestClient == -1 || dist < closestDistance) { @@ -119,6 +128,17 @@ public Action L4D2_OnChooseVictim(int attacker, int &curTarget) { } return Plugin_Continue; } + +bool WillMagnetRun(const Troll troll, int i) { + if(troll.activeFlagClients[i] == 0) return true; + float cChance = 1.0; + //Skip first bit as it is ('Always') + if(troll.activeFlagClients[i] & 2) // 2nd: 50% + cChance = 0.5; + else if(troll.activeFlagClients[i] & 4) //3rd: 10% + cChance = 0.1; + return GetRandomFloat() <= cChance; +} public Action L4D2_OnEntityShoved(int client, int entity, int weapon, float vecDir[3], bool bIsHighPounce) { if(client > 0 && client <= MaxClients && IsTrollActive(client, "No Shove") && hShoveFailChance.FloatValue > GetRandomFloat()) { return Plugin_Handled; @@ -141,7 +161,7 @@ public Action OnClientSayCommand(int client, const char[] command, const char[] PrintToServer("%N: %s", client, sArgs); return Plugin_Handled; }else if(IsTrollActive(client, "iCantSpellNoMore")) { - int type = GetRandomInt(1, trollKV.Size + 8); + int type = GetRandomInt(1, 13 + 5); char letterSrc, replaceChar; switch(type) { case 1: { @@ -196,6 +216,10 @@ public Action OnClientSayCommand(int client, const char[] command, const char[] letterSrc = 'e'; replaceChar = 'r'; } + case 14: { + letterSrc = 'w'; + replaceChar = 'h'; + } default: return Plugin_Continue; @@ -413,23 +437,28 @@ void EntityCreateCallback(int entity) { if(!HasEntProp(entity, Prop_Send, "m_hOwnerEntity") || !IsValidEntity(entity)) return; static char class[16]; + static Troll badThrow; + if(!badThrow.id) { + GetTroll("Bad Throw", badThrow); + } + GetEntityClassname(entity, class, sizeof(class)); int entOwner = GetEntPropEnt(entity, Prop_Send, "m_hOwnerEntity"); if(entOwner > 0 && entOwner <= MaxClients) { - if(IsTrollActive(entOwner, "Bad Throw")) { + if(badThrow.IsActive(entOwner)) { static float pos[3]; GetClientEyePosition(entOwner, pos); - if(StrContains(class, "vomitjar", true) > -1) { + if(badThrow.IsFlagActive(entOwner, Flag_1) && StrContains(class, "vomitjar", true) > -1) { AcceptEntityInput(entity, "Kill"); - if(hBadThrowHitSelf.FloatValue > 0.0 && GetRandomFloat() > hBadThrowHitSelf.FloatValue) { + if(hBadThrowHitSelf.FloatValue > 0.0 && GetRandomFloat() <= hBadThrowHitSelf.FloatValue) { L4D_CTerrorPlayer_OnVomitedUpon(entOwner, entOwner); EmitSoundToAll("weapons/ceda_jar/ceda_jar_explode.wav", entOwner); FindClosestClient(entOwner, false, pos); } SpawnItem("vomitjar", pos); - } else if(StrContains(class, "molotov", true) > -1) { + } else if(badThrow.IsFlagActive(entOwner, Flag_2) && StrContains(class, "molotov", true) > -1) { // Burn them if no one near :) - if(hBadThrowHitSelf.FloatValue > 0.0 && GetRandomFloat() > hBadThrowHitSelf.FloatValue) { + if(hBadThrowHitSelf.FloatValue > 0.0 && GetRandomFloat() <= hBadThrowHitSelf.FloatValue) { GetClientAbsOrigin(entOwner, pos); if(IsAnyPlayerNear(entOwner, 500.0)) { AcceptEntityInput(entity, "Kill"); @@ -441,8 +470,8 @@ void EntityCreateCallback(int entity) { SpawnItem("molotov", pos); AcceptEntityInput(entity, "Kill"); } - } else if(StrContains(class, "pipe_bomb", true) > -1) { - if(hBadThrowHitSelf.FloatValue > 0.0 && GetRandomFloat() > hBadThrowHitSelf.FloatValue) + } else if(badThrow.IsFlagActive(entOwner, Flag_3) && StrContains(class, "pipe_bomb", true) > -1) { + if(hBadThrowHitSelf.FloatValue > 0.0 && GetRandomFloat() <= hBadThrowHitSelf.FloatValue) TeleportEntity(entity, pos, NULL_VECTOR, NULL_VECTOR); SpawnItem("pipe_bomb", pos); } @@ -460,4 +489,4 @@ int FindClosestVisibleClient(int source) { public bool TraceEntityFilterPlayer(int entity, int mask, any data) { return data != entity && entity <= MaxClients && GetClientTeam(entity) == 2 && IsPlayerAlive(entity); -} +} \ No newline at end of file