From 547f486bbbeb8b26f5c154712979ac147a379c01 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 8 Aug 2020 03:04:11 -0600 Subject: [PATCH] throw back --- mods/bots/maps/mp/bots/_bot.gsc | 10 ++- mods/bots/maps/mp/bots/_bot_internal.gsc | 110 ++++++++++++++++++++++- mods/bots/maps/mp/bots/_bot_utility.gsc | 7 +- 3 files changed, 120 insertions(+), 7 deletions(-) diff --git a/mods/bots/maps/mp/bots/_bot.gsc b/mods/bots/maps/mp/bots/_bot.gsc index f30d352..79923b2 100644 --- a/mods/bots/maps/mp/bots/_bot.gsc +++ b/mods/bots/maps/mp/bots/_bot.gsc @@ -71,6 +71,7 @@ init() level.bots_maxShotgunDistance *= level.bots_maxShotgunDistance; level.bots_listenDist = 100; level.bots_listenDist *= level.bots_listenDist; + level.botPushOutDist = 30; level.smokeRadius = 255; @@ -557,18 +558,21 @@ onGrenadeFire() if(weaponName == "smoke_grenade_mp") grenade thread AddToSmokeList(); else if (isSubStr(weaponName, "frag_")) - grenade thread AddToFragList(); + grenade thread AddToFragList(self); else if ( weaponName == "claymore" || weaponName == "claymore_mp" ) grenade thread claymoreDetonationBotFix(); } } -AddToFragList() +AddToFragList(who) { grenade = spawnstruct(); grenade.origin = self getOrigin(); grenade.velocity = (0, 0, 0); grenade.grenade = self; + grenade.owner = who; + grenade.team = who.team; + grenade.throwback = undefined; grenade thread thinkFrag(); @@ -580,7 +584,7 @@ thinkFrag() while(isDefined(self.grenade)) { nowOrigin = self.grenade getOrigin(); - self.velocity = (nowOrigin - self.origin)*20; //lensq < 10000 + self.velocity = (nowOrigin - self.origin)*20; self.origin = nowOrigin; wait 0.05; diff --git a/mods/bots/maps/mp/bots/_bot_internal.gsc b/mods/bots/maps/mp/bots/_bot_internal.gsc index 2d88560..c818acb 100644 --- a/mods/bots/maps/mp/bots/_bot_internal.gsc +++ b/mods/bots/maps/mp/bots/_bot_internal.gsc @@ -154,7 +154,7 @@ onPlayerSpawned() self thread UseRunThink(); self thread watchUsingRemote(); - // grenades (pick up too), knife (players and ents), stinger, footsounds + // knife (players and ents), stinger, footsounds self thread spawned(); } @@ -429,6 +429,30 @@ moveHack() } // push out of players + for (i = level.players.size - 1; i >= 0; i--) + { + player = level.players[i]; + + if (player == self) + continue; + + if (!isReallyAlive(player)) + continue; + + dist = distance(self.origin, player.origin); + + if (dist > level.botPushOutDist) + continue; + + pushOutDir = VectorNormalize((self.origin[0], self.origin[1], 0)-(player.origin[0], player.origin[1], 0)); + trace = bulletTrace(self.origin + (0,0,20), (self.origin + (0,0,20)) + (pushOutDir * ((level.botPushOutDist-dist)+10)), false, self); + //no collision, so push out + if(trace["fraction"] == 1) + { + pushoutPos = self.origin + (pushOutDir * (level.botPushOutDist-dist)); + self SetOrigin((pushoutPos[0], pushoutPos[1], self.origin[2])); + } + } if (completedMove) continue; @@ -728,6 +752,8 @@ spawned() self thread emptyClipShoot(); + self thread grenade_danager(); + self thread target(); self thread aim(); self thread check_reload(); @@ -738,6 +764,85 @@ spawned() self notify("bot_spawned"); } +grenade_danager() +{ + self endon("disconnect"); + self endon("death"); + + for(;;) + { + wait 1; + + if (self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" )) + continue; + + if(self.bot.isfraggingafter || self.bot.climbing) + continue; + + myEye = self getEye(); + for (i = level.bots_fragList.count-1; i >= 0; i--) + { + frag = level.bots_fragList.data[i]; + + if (isDefined(frag.throwback)) + continue; + + if (isDefined(frag.owner) && frag.owner == self) + continue; + + if (level.teamBased && frag.team == self.team) + continue; + + if (lengthSquared(frag.velocity) > 10000) + continue; + + if(DistanceSquared(self.origin, frag.origin) > 20000) + continue; + + if (!bulletTracePassed( myEye, frag.origin, false, frag.grenade )) + continue; + + frag.throwback = true; + + hasFrag = self HasWeapon("frag_grenade_mp"); + fragCount = self GetAmmoCount("frag_grenade_mp"); + + if (!hasFrag) + self _GiveWeapon("frag_grenade_mp", 0); + self SetWeaponAmmoClip("frag_grenade_mp", 1); + + self thread watchThrowback(frag); + self botThrowGrenade("frag_grenade_mp"); + + frag.throwback = undefined; + self SetWeaponAmmoClip("frag_grenade_mp", fragCount); + if (!hasFrag) + self TakeWeapon("frag_grenade_mp"); + break; + } + } +} + +watchThrowback(frag) +{ + self endon("bot_kill_throwback"); + self thread notifyAfterDelay(5, "bot_kill_throwback"); + self waittill( "grenade_fire", grenade ); + + // blew up already + if (!isDefined(frag.grenade)) + { + grenade delete(); + return; + } + + grenade.threwBack = true; + self thread incPlayerStat( "throwbacks", 1 ); + grenade thread maps\mp\gametypes\_shellshock::grenade_earthQuake(); + grenade.originalOwner = frag.owner; + frag.grenade delete(); +} + /* Bots will update its needed stance according to the nodes on the level. Will also allow the bot to sprint when it can. */ @@ -1807,7 +1912,7 @@ botThrowGrenade(grenName) self endon("death"); self endon("disconnect"); - if (self.bot.tryingtofrag) + if (self.bot.tryingtofrag || self.bot.isfraggingafter) return "already nading"; if (!self getAmmoCount(grenName)) @@ -1825,7 +1930,6 @@ botThrowGrenade(grenName) if (ret != "timeout") { ret = self waittill_any_timeout( 5, "grenade_fire", "weapon_change", "offhand_end" ); - wait 0.95; } self.bot.tryingtofrag = false; diff --git a/mods/bots/maps/mp/bots/_bot_utility.gsc b/mods/bots/maps/mp/bots/_bot_utility.gsc index 40406c8..0ee6e81 100644 --- a/mods/bots/maps/mp/bots/_bot_utility.gsc +++ b/mods/bots/maps/mp/bots/_bot_utility.gsc @@ -21,7 +21,6 @@ botAdsAmount() return (1 / (self.bot.ads_highest - self.bot.ads_lowest)) * self.bot.ads_tightness + (1 + (self.bot.ads_highest / (self.bot.ads_lowest - self.bot.ads_highest))); } -// aim loop needs work BotPressADS(time) { self maps\mp\bots\_bot_internal::pressAds(time); @@ -215,6 +214,12 @@ getEyeHeight() return myEye[2] - self.origin[2]; } +notifyAfterDelay(delay, not) +{ + wait delay; + self notify(not); +} + /* Pezbot's line sphere intersection. */