From 63107d13f5f4d30af4da13fd4022fe50ae909083 Mon Sep 17 00:00:00 2001 From: Jackz Date: Mon, 28 Sep 2020 14:27:43 -0500 Subject: [PATCH] Improved to work with multiple bots --- plugins/200IQBots_FlyYouFools.smx | Bin 6697 -> 8636 bytes scripting/200IQBots_FlyYouFools.sp | 145 ++++++++++++++++++++++++----- 2 files changed, 124 insertions(+), 21 deletions(-) diff --git a/plugins/200IQBots_FlyYouFools.smx b/plugins/200IQBots_FlyYouFools.smx index 1d8289979b84edf387175b03e17d655e2c0a73f5..f3a40461f79b0ffe89ce495f1d132b156a1a4e1e 100644 GIT binary patch literal 8636 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

EP53d639vl+qG?#aJHHUeFJfRWhl| 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 GI{ycT4im!w diff --git a/scripting/200IQBots_FlyYouFools.sp b/scripting/200IQBots_FlyYouFools.sp index 722cc8f..1cb16c9 100644 --- a/scripting/200IQBots_FlyYouFools.sp +++ b/scripting/200IQBots_FlyYouFools.sp @@ -1,24 +1,25 @@ #pragma semicolon 1 #include #include -#define PLUGIN_VERSION "1.4" +#define PLUGIN_VERSION "1.5" #pragma newdecls required //#define DEBUG static bool bEscapeReady = false; -static int TankClient; -//static ConVar hTankDangerDistance; +static int TankClient, iAliveTanks; +static bool bIsTank[MAXPLAYERS+1]; public Plugin myinfo = { name = "Fly You Fools", author = "ConnerRia & Jackzmc", - description = "Survivor bots will retreat from tank. ", + description = "Survivor bots will retreat from tank. Improved version.", version = PLUGIN_VERSION, url = "N/A" } + public void OnPluginStart() { EngineVersion g_Game = GetEngineVersion(); @@ -28,48 +29,79 @@ public void OnPluginStart() } CreateConVar("FlyYouFools_Version", PLUGIN_VERSION, "FlyYouFools Version", FCVAR_NOTIFY|FCVAR_REPLICATED|FCVAR_DONTRECORD); - //hTankDangerDistance = CreateConVar("200IQBots_TankDangerRange", "800.0", "The range by which survivors bots will detect the presence of tank and retreat. ", FCVAR_NOTIFY|FCVAR_REPLICATED); HookEvent("map_transition", Event_RoundStart, EventHookMode_PostNoCopy); HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); HookEvent("tank_spawn", Event_TankSpawn); HookEvent("tank_killed", Event_RoundStart, EventHookMode_PostNoCopy); HookEvent("finale_vehicle_incoming", Event_FinaleArriving, EventHookMode_PostNoCopy); + + //debug + HookEvent("player_hurt", Event_PlayerHurt); - AutoExecConfig(true, "200IQBots_FlyYouFools"); } public void OnMapStart() { - TankClient = -1; - bEscapeReady = false; - + resetPlugin(); FindExistingTank(); } public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast) { - TankClient = -1; - bEscapeReady = false; + resetPlugin(); } public void Event_TankSpawn(Event event, const char[] name, bool dontBroadcast) { - TankClient = GetClientOfUserId(GetEventInt(event, "userid")); - CreateTimer(0.1, BotControlTimer, _, TIMER_REPEAT); + iAliveTanks++; + int userID = GetClientOfUserId(GetEventInt(event, "userid")); + bIsTank[userID] = true; + if(iAliveTanks < 1) { + TankClient = GetClientOfUserId(GetEventInt(event, "userid")); + CreateTimer(0.1, BotControlTimerV2, _, TIMER_REPEAT); + } } public void Event_FinaleArriving(Event event, const char[] name, bool dontBroadcast) { bEscapeReady = true; } +public void Event_PlayerHurt(Event event, const char[] name, bool dontBroadcast) { + int targetPlayer = GetClientOfUserId(event.GetInt("userid")); + int attacker = GetClientOfUserId(event.GetInt("attacker")); + char attackerName[16]; + GetClientName(attacker, attackerName, sizeof(attackerName)); + if(StrContains(attackerName, "Tank", true) > -1) { + PrintToChatAll("%N (%d) was hit by tank %s (%d)", targetPlayer, targetPlayer, attackerName, attacker); + } +} +/* +Logic overview: +1. Check If there is a tank (will be last spawned tank) +2. Check that the tank has a target (not waiting) +3. Loop all valid players (bots, alive, survivors) +4. If they are being targetted by tank OR health < 40: + always run away +5. Else if less than 200 units away: + run away + else: + attack tank +*/ public Action BotControlTimer(Handle timer) { //remove timer once tank no longer exists, is dead, or finale escape vehicle arrived - if(bEscapeReady || TankClient == -1 || !IsClientInGame(TankClient) || !IsPlayerAlive(TankClient)) { - //incase any other tanks are available - FindExistingTank(); + //temp improvement: disable if more than one tank. + + if(bEscapeReady || iAliveTanks == 0) { + //Check if there is any existing bots, if escape NOT ready + if(!bEscapeReady) FindExistingTank(); return Plugin_Stop; } //Once an AI tank is awakened, m_lookatPlayer is set to a player ID //Possible props: m_lookatPlayer, m_zombieState (if 1), m_hasVisibleThreats int tank_target = GetEntPropEnt(TankClient, Prop_Send, "m_lookatPlayer", 0); + if(tank_target > -1) { + ShowHintToAll("TankClient#: %d | AliveTanks: %d | TankTarget: %N", TankClient, iAliveTanks, tank_target); + }else{ + ShowHintToAll("TankClient#: %d | AliveTanks: %d | TankTarget: n/a", TankClient, iAliveTanks); + } if(tank_target > -1) { //grab tank position outside loop, only calculate bot float TankPosition[3]; @@ -87,7 +119,7 @@ public Action BotControlTimer(Handle timer) float BotPosition[3]; GetClientAbsOrigin(i, BotPosition); - + //Compare the distance between tank and the survivor bot, attack if far, run if too close. float distance = GetVectorDistance(BotPosition, TankPosition); if(distance < 200) { L4D2_RunScript("CommandABot({cmd=2,bot=GetPlayerFromUserID(%i),target=GetPlayerFromUserID(%i)})", GetClientUserId(i), GetClientUserId(TankClient)); @@ -102,17 +134,88 @@ public Action BotControlTimer(Handle timer) } return Plugin_Continue; } +/* +New logic overview: +Either: Loop all tanks, check for any survivors. +Or: Loop any survivors, check for a nearby tank? + +*/ +public Action BotControlTimerV2(Handle timer) +{ + //remove timer once tank no longer exists, is dead, or finale escape vehicle arrived + if(bEscapeReady || TankClient == -1 || !IsClientInGame(TankClient) || !IsPlayerAlive(TankClient)) { + //Check if there is any existing bots, if escape NOT ready + if(!bEscapeReady) FindExistingTank(); + return Plugin_Stop; + } + if(iAliveTanks == 0) return Plugin_Continue; + //Loop all players, finding survivors. (survivor team, bots, not tank.) + for (int i = 1; i <= MaxClients; i++) { + if (IsClientInGame(i) && IsPlayerAlive(i) && IsFakeClient(i) && !bIsTank[i] && GetClientTeam(i) == 2) { + //Grab health of bot and current position + int botHealth = GetClientHealth(i); + float BotPosition[3]; + GetClientAbsOrigin(i, BotPosition); + + float smallestDistance = 0.0; + int closestTank = -1; + //Loop all players, finding tanks (alive, bot, tank) + for(int tankID = 1; tankID <= MaxClients; tankID++) { + if (IsClientInGame(tankID) && IsPlayerAlive(tankID) && IsFakeClient(tankID) && bIsTank[tankID]) { + //Check if tank has a target. tank_target will be -1 if not activated + int tank_target = GetEntPropEnt(tankID, Prop_Send, "m_lookatPlayer", 0); + if(tank_target > -1) { + + //Fetch the tank's position + float TankPosition[3]; + GetClientAbsOrigin(tankID, TankPosition); + //Get distance to survivor, and compare to get closest tank + float distanceFromSurvivor = GetVectorDistance(BotPosition, TankPosition); + PrintHintTextToAll("[Survivor: %N (%d)] | Tank: %d | Distance: %f", i, i, tankID, distanceFromSurvivor); + if(distanceFromSurvivor <= 1000 && smallestDistance > distanceFromSurvivor || smallestDistance == 0.0) { + smallestDistance = distanceFromSurvivor; + closestTank = tankID; + } + } + } + } + //If the closest tank exists (-1 means no tank.) and is close, avoid. + if(closestTank > -1 && smallestDistance <= 1000) { + if(smallestDistance <= 300) { + L4D2_RunScript("CommandABot({cmd=2,bot=GetPlayerFromUserID(%i),target=GetPlayerFromUserID(%i)})", GetClientUserId(i), GetClientUserId(closestTank)); + } + }else{ + L4D2_RunScript("CommandABot({cmd=3,bot=GetPlayerFromUserID(%i)", GetClientUserId(i)); + } + } + } + return Plugin_Continue; +} +void resetPlugin() { + TankClient = -1; + bEscapeReady = false; + iAliveTanks = 0; + for(int i = 0; i < sizeof(bIsTank); i++) { + bIsTank[i] = false; + } +} public void FindExistingTank() { + //Loop all valid clients, check if they a BOT and an infected. Check for a name that contains "Tank" + iAliveTanks = 0; for (int i = 1; i < MaxClients+1 ;i++) { if(IsClientInGame(i) && IsFakeClient(i) && IsPlayerAlive(i) && GetClientTeam(i) == 3) { char name[16]; GetClientName(i, name, sizeof(name)); - if(StrContains(name,"Tank",true) > -1) { - TankClient = i; - CreateTimer(0.1, BotControlTimer, _, TIMER_REPEAT); - break; + if(StrContains(name, "Tank", true) > -1) { + bIsTank[i] = true; + PrintToChatAll("Found existing tank: %N (%i)", i, i); + if(iAliveTanks == 0) { + TankClient = i; + CreateTimer(0.1, BotControlTimerV2, _, TIMER_REPEAT); + } + iAliveTanks++; } }