From 3a173548107fb914539d02c749584f47da4bd5e5 Mon Sep 17 00:00:00 2001 From: INeedBots Date: Thu, 8 Oct 2020 01:54:28 -0600 Subject: [PATCH] after_target --- main_shared/maps/mp/bots/_bot_internal.gsc | 158 +++++++++++++++------ main_shared/maps/mp/bots/_bot_script.gsc | 8 ++ 2 files changed, 121 insertions(+), 45 deletions(-) diff --git a/main_shared/maps/mp/bots/_bot_internal.gsc b/main_shared/maps/mp/bots/_bot_internal.gsc index 395814d..24aebd7 100644 --- a/main_shared/maps/mp/bots/_bot_internal.gsc +++ b/main_shared/maps/mp/bots/_bot_internal.gsc @@ -26,6 +26,7 @@ added() self.pers["bots"]["skill"]["spawn_time"] = 0; self.pers["bots"]["skill"]["help_dist"] = 10000; self.pers["bots"]["skill"]["semi_time"] = 0.05; + self.pers["bots"]["skill"]["shoot_after_time"] = 1; self.pers["bots"]["behavior"] = []; self.pers["bots"]["behavior"]["strafe"] = 50; @@ -110,6 +111,7 @@ resetBotVars() self.bot.target = undefined; self.bot.targets = []; self.bot.target_this_frame = undefined; + self.bot.after_target = undefined; self.bot.script_aimpos = undefined; @@ -795,6 +797,36 @@ watchToLook() } } + +/* + Assigns the bot's after target (bot will keep firing at a target after no sight or death) +*/ +start_bot_after_target(who) +{ + self endon("disconnect"); + self endon("death"); + + self.bot.after_target = spawnStruct(); + self.bot.after_target.target = who; + self.bot.after_target.last_pos = who.origin; + + self notify("kill_after_target"); + self endon("kill_after_target"); + + wait self.pers["bots"]["skill"]["shoot_after_time"]; + + self.bot.after_target = undefined; +} + +/* + Clears the bot's after target +*/ +clear_bot_after_target() +{ + self.bot.after_target = undefined; + self notify("kill_after_target"); +} + /* This is the bot's main aimming thread. The bot will aim at its targets or a node its going towards. Bots will aim, fire, ads, grenade. */ @@ -811,9 +843,13 @@ aim() continue; aimspeed = self.pers["bots"]["skill"]["aim_time"]; - eyePos = self getEyePos(); + if(self IsStunned() || self isArtShocked()) aimspeed = 1; + + eyePos = self getEyePos(); + curweap = self getCurrentWeapon(); + angles = self GetPlayerAngles(); if(isDefined(self.bot.target) && isDefined(self.bot.target.entity)) { @@ -829,20 +865,17 @@ aim() isplay = self.bot.target.isplay; offset = self.bot.target.offset; dist = self.bot.target.dist; - curweap = self getCurrentWeapon(); - angles = self GetPlayerAngles(); rand = self.bot.target.rand; no_trace_ads_time = self.pers["bots"]["skill"]["no_trace_ads_time"]; reaction_time = self.pers["bots"]["skill"]["reaction_time"]; nadeAimOffset = 0; - myeye = self getEyePos(); if(self.bot.isfraggingafter || self.bot.issmokingafter) nadeAimOffset = dist/3000; else if(weaponClass(curweap) == "grenade") nadeAimOffset = dist/16000; - if(no_trace_time) + if(no_trace_time && (!isDefined(self.bot.after_target) || self.bot.after_target.target != target)) { if(no_trace_time > no_trace_ads_time) { @@ -852,7 +885,7 @@ aim() if(!self.bot.isfraggingafter && !self.bot.issmokingafter) { nade = self getValidGrenade(); - if(isDefined(nade) && rand <= self.pers["bots"]["behavior"]["nade"] && bulletTracePassed(myEye, myEye + (0, 0, 75), false, self) && bulletTracePassed(last_pos, last_pos + (0, 0, 100), false, target) && dist > level.bots_minGrenadeDistance && dist < level.bots_maxGrenadeDistance) + if(isDefined(nade) && rand <= self.pers["bots"]["behavior"]["nade"] && bulletTracePassed(eyePos, eyePos + (0, 0, 75), false, self) && bulletTracePassed(last_pos, last_pos + (0, 0, 100), false, target) && dist > level.bots_minGrenadeDistance && dist < level.bots_maxGrenadeDistance) { if(nade == "frag_grenade_mp") self thread frag(2.5); @@ -873,56 +906,91 @@ aim() self botLookAt(last_pos + (0, 0, self getEyeHeight() + nadeAimOffset), aimspeed); continue; } - - if(isplay) + + if (trace_time) { - aimpos = target getTagOrigin( "j_spineupper" ) + (0, 0, nadeAimOffset); - conedot = getConeDot(aimpos, eyePos, angles); - - if(!nadeAimOffset && conedot > 0.999) + if(isplay) { - self botLookAtPlayer(target, "j_spineupper"); + aimpos = target getTagOrigin( "j_spineupper" ) + (0, 0, nadeAimOffset); + conedot = getConeDot(aimpos, eyePos, angles); + + if(!nadeAimOffset && conedot > 0.999) + { + self botLookAtPlayer(target, "j_spineupper"); + } + else + { + self botLookAt(aimpos, aimspeed); + } } else { + aimpos = target.origin; + if (isDefined(offset)) + aimpos += offset; + aimpos += (0, 0, nadeAimOffset); + conedot = getConeDot(aimpos, eyePos, angles); self botLookAt(aimpos, aimspeed); } - } - else - { - aimpos = target.origin; - if (isDefined(offset)) - aimpos += offset; - aimpos += (0, 0, nadeAimOffset); - conedot = getConeDot(aimpos, eyePos, angles); - self botLookAt(aimpos, aimspeed); - } - - if(isplay && conedot > 0.9 && dist < level.bots_maxKnifeDistance && trace_time > reaction_time) - { - self knife(); + + if(isplay && conedot > 0.9 && dist < level.bots_maxKnifeDistance && trace_time > reaction_time) + { + self clear_bot_after_target(); + self knife(); + continue; + } + + if(!self canFire(curweap) || !self isInRange(dist, curweap)) + continue; + + //c4 logic here, but doesnt work anyway + + canADS = self canAds(dist, curweap); + if (canADS) + self thread pressADS(); + + if (trace_time > reaction_time) + { + if((!canADS || self playerads() == 1.0) && (conedot > 0.95 || dist < level.bots_maxKnifeDistance)) + self botFire(); + + if (isplay) + self thread start_bot_after_target(target); + } + continue; } - - if(!self canFire(curweap) || !self isInRange(dist, curweap)) - { - continue; - } - - //c4 logic here, but doesnt work anyway - - canADS = self canAds(dist, curweap); - if (canADS) - self thread pressADS(); - - if((!canADS || self playerads() == 1.0) && (conedot > 0.95 || dist < level.bots_maxKnifeDistance) && trace_time > reaction_time) - { - self botFire(); - } - - continue; } } + + if (isDefined(self.bot.after_target)) + { + nadeAimOffset = 0; + last_pos = self.bot.after_target.last_pos; + dist = DistanceSquared(self.origin, last_pos); + + if(self.bot.isfraggingafter || self.bot.issmokingafter) + nadeAimOffset = dist/3000; + else if(weaponClass(curweap) == "grenade") + nadeAimOffset = dist/16000; + + aimpos = last_pos + (0, 0, self getEyeHeight() + nadeAimOffset); + conedot = getConeDot(aimpos, eyePos, angles); + + self thread bot_lookat(aimpos, aimspeed); + + if(!self canFire(curweap) || !self isInRange(dist, curweap)) + continue; + + canADS = self canAds(dist, curweap); + if (canADS) + self thread pressAds(); + + if((!canADS || self botAdsAmount() == 1.0) && (conedot > 0.95 || dist < level.bots_maxKnifeDistance)) + self botFire(); + + continue; + } if (self.bot.next_wp != -1 && isDefined(level.waypoints[self.bot.next_wp].angles) && false) { diff --git a/main_shared/maps/mp/bots/_bot_script.gsc b/main_shared/maps/mp/bots/_bot_script.gsc index 3ed9097..0b38925 100644 --- a/main_shared/maps/mp/bots/_bot_script.gsc +++ b/main_shared/maps/mp/bots/_bot_script.gsc @@ -274,6 +274,7 @@ difficulty() self.pers["bots"]["skill"]["spawn_time"] = 0.75; self.pers["bots"]["skill"]["help_dist"] = 0; self.pers["bots"]["skill"]["semi_time"] = 0.9; + self.pers["bots"]["skill"]["shoot_after_time"] = 1; self.pers["bots"]["behavior"]["strafe"] = 0; self.pers["bots"]["behavior"]["nade"] = 10; self.pers["bots"]["behavior"]["sprint"] = 10; @@ -296,6 +297,7 @@ difficulty() self.pers["bots"]["skill"]["spawn_time"] = 0.65; self.pers["bots"]["skill"]["help_dist"] = 500; self.pers["bots"]["skill"]["semi_time"] = 0.75; + self.pers["bots"]["skill"]["shoot_after_time"] = 0.75; self.pers["bots"]["behavior"]["strafe"] = 10; self.pers["bots"]["behavior"]["nade"] = 15; self.pers["bots"]["behavior"]["sprint"] = 15; @@ -318,6 +320,7 @@ difficulty() self.pers["bots"]["skill"]["spawn_time"] = 0.5; self.pers["bots"]["skill"]["help_dist"] = 750; self.pers["bots"]["skill"]["semi_time"] = 0.65; + self.pers["bots"]["skill"]["shoot_after_time"] = 0.65; self.pers["bots"]["behavior"]["strafe"] = 20; self.pers["bots"]["behavior"]["nade"] = 20; self.pers["bots"]["behavior"]["sprint"] = 20; @@ -340,6 +343,7 @@ difficulty() self.pers["bots"]["skill"]["spawn_time"] = 0.35; self.pers["bots"]["skill"]["help_dist"] = 1000; self.pers["bots"]["skill"]["semi_time"] = 0.5; + self.pers["bots"]["skill"]["shoot_after_time"] = 0.5; self.pers["bots"]["behavior"]["strafe"] = 30; self.pers["bots"]["behavior"]["nade"] = 25; self.pers["bots"]["behavior"]["sprint"] = 30; @@ -362,6 +366,7 @@ difficulty() self.pers["bots"]["skill"]["spawn_time"] = 0.25; self.pers["bots"]["skill"]["help_dist"] = 1500; self.pers["bots"]["skill"]["semi_time"] = 0.4; + self.pers["bots"]["skill"]["shoot_after_time"] = 0.35; self.pers["bots"]["behavior"]["strafe"] = 40; self.pers["bots"]["behavior"]["nade"] = 35; self.pers["bots"]["behavior"]["sprint"] = 40; @@ -384,6 +389,7 @@ difficulty() self.pers["bots"]["skill"]["spawn_time"] = 0.2; self.pers["bots"]["skill"]["help_dist"] = 2000; self.pers["bots"]["skill"]["semi_time"] = 0.25; + self.pers["bots"]["skill"]["shoot_after_time"] = 0.25; self.pers["bots"]["behavior"]["strafe"] = 50; self.pers["bots"]["behavior"]["nade"] = 45; self.pers["bots"]["behavior"]["sprint"] = 50; @@ -406,6 +412,7 @@ difficulty() self.pers["bots"]["skill"]["spawn_time"] = 0.05; self.pers["bots"]["skill"]["help_dist"] = 3000; self.pers["bots"]["skill"]["semi_time"] = 0.1; + self.pers["bots"]["skill"]["shoot_after_time"] = 0; self.pers["bots"]["behavior"]["strafe"] = 65; self.pers["bots"]["behavior"]["nade"] = 65; self.pers["bots"]["behavior"]["sprint"] = 65; @@ -447,6 +454,7 @@ set_diff() self.pers["bots"]["skill"]["spawn_time"] = 0.05 * randomInt(20); self.pers["bots"]["skill"]["help_dist"] = randomIntRange(500, 25000); self.pers["bots"]["skill"]["semi_time"] = randomFloatRange(0.05, 1); + self.pers["bots"]["skill"]["shoot_after_time"] = randomFloatRange(0.05, 1); self.pers["bots"]["behavior"]["strafe"] = randomInt(100); self.pers["bots"]["behavior"]["nade"] = randomInt(100); self.pers["bots"]["behavior"]["sprint"] = randomInt(100);