From a43849dcb3df990b185758f4babaaef7d09b62f5 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 13 Aug 2020 12:28:24 -0600 Subject: [PATCH] Fix --- userraw/maps/mp/bots/_bot_internal.gsc | 50 ++++++- userraw/maps/mp/bots/_bot_script.gsc | 194 +++++++++++++++++++++++++ userraw/maps/mp/bots/_bot_utility.gsc | 20 +++ z_server.bat | 2 +- 4 files changed, 258 insertions(+), 8 deletions(-) diff --git a/userraw/maps/mp/bots/_bot_internal.gsc b/userraw/maps/mp/bots/_bot_internal.gsc index 3d423f3..9902468 100644 --- a/userraw/maps/mp/bots/_bot_internal.gsc +++ b/userraw/maps/mp/bots/_bot_internal.gsc @@ -354,7 +354,7 @@ UseRunThink() self.bot.isfrozen || self.bot.climbing || self.bot.isreloading || self.bot.ads_pressed || self.bot.fire_pressed || - self.bot.isfragging || + self.bot.isfragging || self.bot.knifing || lengthsquared(self.bot.velocity) <= 25 || self IsStunned() || self isArtShocked() || self maps\mp\_flashgrenades::isFlashbanged()) { @@ -1060,7 +1060,12 @@ grenade_danager() if (self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" )) continue; - if(self.bot.isfraggingafter || self.bot.climbing) + if(self.bot.isfraggingafter || self.bot.climbing || self.bot.knifingafter) + continue; + + curWeap = self GetCurrentWeapon(); + + if (!isWeaponDroppable(curWeap)) continue; myEye = self getEye(); @@ -1206,7 +1211,7 @@ reload_thread() if (self.bot.isfrozen || level.gameEnded || !gameFlag( "prematch_done" )) return; - if(isDefined(self.bot.target) || self.bot.isreloading || self.bot.isfraggingafter || self.bot.climbing || self.bot.knifing) + if(isDefined(self.bot.target) || self.bot.isreloading || self.bot.isfraggingafter || self.bot.climbing || self.bot.knifingafter) return; cur = self getCurrentWEapon(); @@ -2108,6 +2113,18 @@ knife(ent, knifeDist) { self endon("disconnect"); self endon("death"); + level endon ( "game_ended" ); + + if (level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen) + return; + + curWeap = self GetCurrentWeapon(); + + if (!isWeaponDroppable(curWeap)) + return; + + if (self.bot.knifing || self.bot.isfraggingafter) + return; self notify("bot_kill_knife"); self endon("bot_kill_knife"); @@ -2116,7 +2133,6 @@ knife(ent, knifeDist) self.bot.knifingafter = true; isplay = isPlayer(ent); - curWeap = self GetCurrentWeapon(); usedRiot = self.hasRiotShieldEquipped; distsq = DistanceSquared(self.origin, ent.origin); inLastStand = isDefined(self.lastStand); @@ -2260,6 +2276,9 @@ reload() { cur = self GetCurrentWeapon(); + if (level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen) + return; + self SetWeaponAmmoStock(cur, self GetWeaponAmmoClip(cur) + self GetWeaponAmmoStock(cur)); self setWeaponAmmoClip(cur, 0); // the script should reload for us. @@ -2269,6 +2288,21 @@ botThrowGrenade(grenName) { self endon("death"); self endon("disconnect"); + level endon ( "game_ended" ); + + if (isDefined(self.lastStand) && !self _hasPerk("specialty_laststandoffhand") && (!isDefined(self.inFinalStand) || !self.inFinalStand)) + return "laststand"; + + if (level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen) + return "can't move"; + + curWeap = self GetCurrentWeapon(); + + if (!isWeaponDroppable(curWeap)) + return "cur weap is not droppable"; + + if (self.bot.knifingafter) + return "knifing"; if (self.bot.tryingtofrag || self.bot.isfraggingafter) return "already nading"; @@ -2276,8 +2310,6 @@ botThrowGrenade(grenName) if (!self getAmmoCount(grenName)) return "no ammo"; - curWeap = self GetCurrentWeapon(); - self setSpawnWeapon(grenName); self.bot.tryingtofrag = true; @@ -2348,10 +2380,11 @@ jump() { self endon("death"); self endon("disconnect"); + level endon ( "game_ended" ); if (isDefined(self.lastStand) || self getStance() != "stand" || level.gameEnded || !gameFlag( "prematch_done" ) || self IsUsingRemote() || - self.bot.isfrozen || self.bot.climbing || self.bot.jumping || self.bot.jumpingafter) + self.bot.isfrozen || self.bot.climbing || self.bot.jumpingafter) return; self.bot.jumping = true; @@ -2426,6 +2459,9 @@ bot_lookat(pos, time) self endon("spawned_player"); level endon ( "game_ended" ); + if (level.gameEnded || !gameFlag( "prematch_done" ) || self.bot.isfrozen) + return; + if (!isDefined(pos)) return; diff --git a/userraw/maps/mp/bots/_bot_script.gsc b/userraw/maps/mp/bots/_bot_script.gsc index d8b0470..e7aa2d8 100644 --- a/userraw/maps/mp/bots/_bot_script.gsc +++ b/userraw/maps/mp/bots/_bot_script.gsc @@ -500,6 +500,33 @@ setKillstreaks() */ onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration) { + self.killerLocation = undefined; + + if(!IsDefined( self ) || !isDefined(self.team)) + return; + + if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) + return; + + if ( iDamage <= 0 ) + return; + + if(!IsDefined( eAttacker ) || !isDefined(eAttacker.team)) + return; + + if(eAttacker == self) + return; + + if(level.teamBased && eAttacker.team == self.team) + return; + + if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) + return; + + if(!isAlive(eAttacker)) + return; + + self.killerLocation = eAttacker.origin; } /* @@ -507,6 +534,101 @@ onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, */ onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset) { + if(!IsDefined( self ) || !isDefined(self.team)) + return; + + if(!isAlive(self)) + return; + + if ( sMeansOfDeath == "MOD_FALLING" || sMeansOfDeath == "MOD_SUICIDE" ) + return; + + if ( iDamage <= 0 ) + return; + + if(!IsDefined( eAttacker ) || !isDefined(eAttacker.team)) + return; + + if(eAttacker == self) + return; + + if(level.teamBased && eAttacker.team == self.team) + return; + + if ( !IsDefined( eInflictor ) || eInflictor.classname != "player" ) + return; + + if(!isAlive(eAttacker)) + return; + + if (!isSubStr(sWeapon, "_silencer_")) + self bot_cry_for_help( eAttacker ); + + self SetAttacker( eAttacker ); +} + +/* + When the bot gets attacked, have the bot ask for help from teammates. +*/ +bot_cry_for_help( attacker ) +{ + if ( !level.teamBased ) + { + return; + } + + theTime = GetTime(); + if ( IsDefined( self.help_time ) && theTime - self.help_time < 1000 ) + { + return; + } + + self.help_time = theTime; + + for ( i = level.players.size - 1; i >= 0; i-- ) + { + player = level.players[i]; + + if ( !player is_bot() ) + { + continue; + } + + if(!isDefined(player.team)) + continue; + + if ( !IsAlive( player ) ) + { + continue; + } + + if ( player == self ) + { + continue; + } + + if ( player.team != self.team ) + { + continue; + } + + dist = player.pers["bots"]["skill"]["help_dist"]; + dist *= dist; + if ( DistanceSquared( self.origin, player.origin ) > dist ) + { + continue; + } + + if ( RandomInt( 100 ) < 50 ) + { + self SetAttacker( attacker ); + + if ( RandomInt( 100 ) > 70 ) + { + break; + } + } + } } onKillcam() @@ -844,6 +966,9 @@ onSpawned() if(randomInt(100) <= self.pers["bots"]["behavior"]["class"]) self.bot_change_class = undefined; + + self.bot_lock_goal = false; + self.help_time = undefined; } } @@ -883,5 +1008,74 @@ onBotSpawned() { self waittill("bot_spawned"); gameFlagWait("prematch_done"); + + self thread bot_killstreak_think(); + } +} + +bot_killstreak_think() +{ + self endon("disconnect"); + self endon("death"); + level endon("game_ended"); + + for (;;) + { + wait randomIntRange(1, 3); + + if ( !isDefined( self.pers["killstreaks"][0] ) ) + continue; + + if(self BotIsFrozen()) + continue; + + if(self HasThreat()) + continue; + + if(self IsBotReloading() || self IsBotFragging() || self IsKnifing()) + continue; + + if(self isDefusing() || self isPlanting()) + continue; + + curWeap = self GetCurrentWeapon(); + if (!isWeaponDroppable(curWeap)) + continue; + + streakName = self.pers["killstreaks"][0].streakName; + + ksWeap = maps\mp\killstreaks\_killstreaks::getKillstreakWeapon( streakName ); + + if (maps\mp\killstreaks\_killstreaks::isRideKillstreak(streakName) || maps\mp\killstreaks\_killstreaks::isCarryKillstreak(streakName)) + { + // sentry + // predator_missile + // ac130 + // helicopter_minigun + } + else + { + // airdrop_mega + // airdrop_sentry_minigun + // airdrop + // case "harrier_airstrike": + // case "stealth_airstrike": + // case "precision_airstrike": + switch (streakName) + { + case "helicopter": + case "helicopter_flares": + case "uav": + case "nuke": + case "counter_uav": + case "emp": + self BotFreezeControls(true); + self setSpawnWeapon(ksWeap); + wait 1; + self setSpawnWeapon(curWeap); + self BotFreezeControls(false); + break; + } + } } } diff --git a/userraw/maps/mp/bots/_bot_utility.gsc b/userraw/maps/mp/bots/_bot_utility.gsc index 0ee6e81..29e3fd2 100644 --- a/userraw/maps/mp/bots/_bot_utility.gsc +++ b/userraw/maps/mp/bots/_bot_utility.gsc @@ -186,6 +186,26 @@ HasThreat() return (isDefined(self GetThreat())); } +IsKnifing() +{ + return self.bot.knifing; +} + +IsDefusing() +{ + return (isDefined(self.isDefusing) && self.isDefusing); +} + +isPlanting() +{ + return (isDefined(self.isPlanting) && self.isPlanting); +} + +isWeaponDroppable(weap) +{ + return (maps\mp\gametypes\_weapons::mayDropWeapon(weap)); +} + /* Returns if we are stunned. */ diff --git a/z_server.bat b/z_server.bat index 734ebe4..749d2c5 100644 --- a/z_server.bat +++ b/z_server.bat @@ -1 +1 @@ -start iw4x.exe -dedicated +set net_port "28960" +exec server.cfg +map_rotate \ No newline at end of file +start iw4x.exe -dedicated +set sv_lanonly "1" +set net_port "28960" +exec server.cfg +map_rotate \ No newline at end of file