diff --git a/mods/bots/maps/mp/bots/_bot.gsc b/mods/bots/maps/mp/bots/_bot.gsc index 99bf816..f4b79da 100644 --- a/mods/bots/maps/mp/bots/_bot.gsc +++ b/mods/bots/maps/mp/bots/_bot.gsc @@ -147,7 +147,7 @@ onPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, { if(self is_bot()) { - //self maps\mp\bots\_bot_internal::onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); + self maps\mp\bots\_bot_internal::onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); //self maps\mp\bots\_bot_script::onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); } @@ -161,7 +161,7 @@ onPlayerKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHi { if(self is_bot()) { - //self maps\mp\bots\_bot_internal::onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); + self maps\mp\bots\_bot_internal::onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); //self maps\mp\bots\_bot_script::onKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); } @@ -405,7 +405,7 @@ connected() self thread added(); } - //self thread maps\mp\bots\_bot_internal::connected(); + self thread maps\mp\bots\_bot_internal::connected(); //self thread maps\mp\bots\_bot_script::connected(); level.bots[level.bots.size] = self; @@ -421,7 +421,7 @@ added() { self endon("disconnect"); - //self thread maps\mp\bots\_bot_internal::added(); + self thread maps\mp\bots\_bot_internal::added(); //self thread maps\mp\bots\_bot_script::added(); } diff --git a/mods/bots/maps/mp/bots/_bot_internal.gsc b/mods/bots/maps/mp/bots/_bot_internal.gsc index d70c122..7729511 100644 --- a/mods/bots/maps/mp/bots/_bot_internal.gsc +++ b/mods/bots/maps/mp/bots/_bot_internal.gsc @@ -60,6 +60,25 @@ connected() self thread onPlayerSpawned(); self thread bot_skip_killcam(); + self thread forceRespawn(); +} + +/* + Forces respawn for bots +*/ +forceRespawn() +{ + self endon("disconnect"); + + for (;;) + { + wait 0.5; + + if (!isDefined(self.respawntext)) + continue; + + self thread use(0.1); + } } /* @@ -81,6 +100,8 @@ onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint */ resetBotVars() { + self.bot.script_target = undefined; + self.bot.script_target_offset = undefined; self.bot.target = undefined; self.bot.targets = []; self.bot.target_this_frame = undefined; @@ -194,7 +215,7 @@ doBotMovement_loop(data) } // climb through windows - if (self isMantling()) + /*if (self isMantling()) { data.wasMantling = true; self crouch(); @@ -203,7 +224,7 @@ doBotMovement_loop(data) { data.wasMantling = false; self stand(); - } + }*/ startPos = self.origin + (0, 0, 50); startPosForward = startPos + anglesToForward((0, angles[1], 0)) * 25; @@ -213,11 +234,11 @@ doBotMovement_loop(data) // check if need to jump bt = bulletTrace(startPosForward, startPosForward - (0, 0, 40), false, self); - if (bt["fraction"] < 1 && bt["normal"][2] > 0.9 && data.i > 1.5 && !self isOnLadder()) - { - data.i = 0; - self thread jump(); - } + //if (bt["fraction"] < 1 && bt["normal"][2] > 0.9 && data.i > 1.5 && !self isOnLadder()) + //{ + // data.i = 0; + // self thread jump(); + //} } // check if need to knife glass else if (bt["surfacetype"] == "glass") @@ -310,9 +331,6 @@ IsWeapSniper(weap) { if (weap == "none") return false; - - if (maps\mp\gametypes\_missions::getWeaponClass(weap) != "weapon_sniper") - return false; return true; } @@ -386,8 +404,8 @@ reload_watch_loop() if (weap == "none") break; - if (self GetWeaponAmmoClip(weap) >= WeaponClipSize(weap)) - break; + // if (self GetWeaponAmmoClip(weap) >= WeaponClipSize(weap)) + // break; } self.bot.isreloading = false; } @@ -495,14 +513,14 @@ reload_thread() if (cur == "" || cur == "none") return; - if(IsWeaponClipOnly(cur) || !self GetWeaponAmmoStock(cur)) - return; + //if(IsWeaponClipOnly(cur) || !self GetWeaponAmmoStock(cur)) + // return; - maxsize = WeaponClipSize(cur); - cursize = self GetWeaponammoclip(cur); + //maxsize = WeaponClipSize(cur); + //cursize = self GetWeaponammoclip(cur); - if(cursize/maxsize < 0.5) - self thread reload(); + //if(cursize/maxsize < 0.5) + // self thread reload(); } /* @@ -542,6 +560,7 @@ createTargetObj(ent, theTime) obj.trace_time_time = 0; obj.rand = randomInt(100); obj.didlook = false; + obj.isplay = isPlayer(ent); obj.offset = undefined; obj.bone = undefined; obj.aim_offset = undefined; @@ -650,70 +669,118 @@ target_loop() } playercount = level.players.size; - for(i = 0; i < playercount; i++) + for(i = -1; i < playercount; i++) { obj = undefined; - player = level.players[i]; - if(player == self) - continue; - - key = player getEntityNumber()+""; - obj = self.bot.targets[key]; - daDist = distanceSquared(self.origin, player.origin); - isObjDef = isDefined(obj); - if((level.teamBased && self.team == player.team) || player.sessionstate != "playing" || !isAlive(player)) + if (i == -1) { - if(isObjDef) - self.bot.targets[key] = undefined; + if(!isDefined(self.bot.script_target)) + continue; - continue; - } - - targetHead = player getTagOrigin( "j_head" ); - targetAnkleLeft = player getTagOrigin( "j_ankle_le" ); - targetAnkleRight = player getTagOrigin( "j_ankle_ri" ); - - canTargetPlayer = ((distanceSquared(BulletTrace(myEye, targetHead, false, self)["position"], targetHead) < 0.05 || - distanceSquared(BulletTrace(myEye, targetAnkleLeft, false, self)["position"], targetAnkleLeft) < 0.05 || - distanceSquared(BulletTrace(myEye, targetAnkleRight, false, self)["position"], targetAnkleRight) < 0.05) - - && (SmokeTrace(myEye, player.origin, level.smokeRadius) || - daDist < level.bots_maxKnifeDistance*4) - - && (getConeDot(player.origin, self.origin, myAngles) >= myFov || - (isObjDef && obj.trace_time))); - - if (isDefined(self.bot.target_this_frame) && self.bot.target_this_frame == player) - { - self.bot.target_this_frame = undefined; - - canTargetPlayer = true; - } + ent = self.bot.script_target; + key = ent getEntityNumber()+""; + daDist = distanceSquared(self.origin, ent.origin); + obj = self.bot.targets[key]; + isObjDef = isDefined(obj); + entOrigin = ent.origin; + if (isDefined(self.bot.script_target_offset)) + entOrigin += self.bot.script_target_offset; - if(canTargetPlayer) - { - if(!isObjDef) + if(SmokeTrace(myEye, entOrigin, level.smokeRadius) && bulletTracePassed(myEye, entOrigin, false, ent)) { - obj = self createTargetObj(player, theTime); + if(!isObjDef) + { + obj = self createTargetObj(ent, theTime); + obj.offset = self.bot.script_target_offset; + + self.bot.targets[key] = obj; + } - self.bot.targets[key] = obj; + self targetObjUpdateTraced(obj, daDist, ent, theTime, true); + } + else + { + if(!isObjDef) + continue; + + self targetObjUpdateNoTrace(obj); + + if(obj.no_trace_time > rememberTime) + { + self.bot.targets[key] = undefined; + continue; + } } - - self targetObjUpdateTraced(obj, daDist, player, theTime, false); } else { - if(!isObjDef) + player = level.players[i]; + + if(player == self) continue; - self targetObjUpdateNoTrace(obj); - - if(obj.no_trace_time > rememberTime) + key = player getEntityNumber()+""; + obj = self.bot.targets[key]; + daDist = distanceSquared(self.origin, player.origin); + isObjDef = isDefined(obj); + if((level.teamBased && self.team == player.team) || player.sessionstate != "playing" || !isAlive(player)) { - self.bot.targets[key] = undefined; + if(isObjDef) + self.bot.targets[key] = undefined; + continue; } + + targetHead = player getTagOrigin( "j_head" ); + targetAnkleLeft = player getTagOrigin( "j_ankle_le" ); + targetAnkleRight = player getTagOrigin( "j_ankle_ri" ); + + canTargetPlayer = ((BulletTracePassed(myEye, targetHead, false, undefined) || + BulletTracePassed(myEye, targetAnkleLeft, false, undefined) || + BulletTracePassed(myEye, targetAnkleRight, false, undefined)) + + && (sightTracePassed(myEye, targetHead, false, undefined) || + sightTracePassed(myEye, targetAnkleLeft, false, undefined) || + sightTracePassed(myEye, targetAnkleRight, false, undefined)) + + && (SmokeTrace(myEye, player.origin, level.smokeRadius) || + daDist < level.bots_maxKnifeDistance*4) + + && (getConeDot(player.origin, self.origin, myAngles) >= myFov || + (isObjDef && obj.trace_time))); + + if (isDefined(self.bot.target_this_frame) && self.bot.target_this_frame == player) + { + self.bot.target_this_frame = undefined; + + canTargetPlayer = true; + } + + if(canTargetPlayer) + { + if(!isObjDef) + { + obj = self createTargetObj(player, theTime); + + self.bot.targets[key] = obj; + } + + self targetObjUpdateTraced(obj, daDist, player, theTime, false); + } + else + { + if(!isObjDef) + continue; + + self targetObjUpdateNoTrace(obj); + + if(obj.no_trace_time > rememberTime) + { + self.bot.targets[key] = undefined; + continue; + } + } } if (!isdefined(obj)) @@ -798,7 +865,7 @@ onNewEnemy() if(!isDefined(self.bot.target)) continue; - if(!isDefined(self.bot.target.entity)) + if(!isDefined(self.bot.target.entity) || !self.bot.target.isplay) continue; if(self.bot.target.didlook) @@ -851,7 +918,7 @@ watchToLook() if(randomInt(100) > self.pers["bots"]["behavior"]["jump"]) continue; - if (!getDvarInt("bots_play_jumpdrop")) + if (!getCvarInt("bots_play_jumpdrop")) continue; if(isDefined(self.bot.jump_time) && getTime() - self.bot.jump_time <= 5000) @@ -972,7 +1039,7 @@ aim_loop() if(!self.bot.isfraggingafter && !self.bot.issmokingafter) { nade = self getValidGrenade(); - 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 && getDvarInt("bots_play_nade")) + 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 && getCvarInt("bots_play_nade")) { time = 0.5; if (nade == "frag_grenade_mp") @@ -1005,9 +1072,6 @@ aim_loop() { if(isplay) { - if (!target IsPlayerModelOK()) - return; - aimpos = target getTagOrigin( bone ); if (!isDefined(aimpos)) @@ -1036,7 +1100,7 @@ aim_loop() self thread bot_lookat(aimpos, aimspeed); } - if(isplay && !self.bot.isknifingafter && conedot > 0.9 && dist < level.bots_maxKnifeDistance && trace_time > reaction_time && getDvarInt("bots_play_knife")) + if(isplay && !self.bot.isknifingafter && conedot > 0.9 && dist < level.bots_maxKnifeDistance && trace_time > reaction_time && getCvarInt("bots_play_knife")) { self clear_bot_after_target(); self thread knife(); @@ -1064,7 +1128,7 @@ aim_loop() if (trace_time > reaction_time) { - if((!canADS || adsAmount >= 1.0 || self InLastStand() || self GetStance() == "prone") && (conedot > 0.99 || dist < level.bots_maxKnifeDistance) && getDvarInt("bots_play_fire")) + if((!canADS || adsAmount >= 1.0 || self GetStance() == "prone") && (conedot > 0.99 || dist < level.bots_maxKnifeDistance) && getCvarInt("bots_play_fire")) self botFire(); if (isplay) @@ -1111,7 +1175,7 @@ aim_loop() self thread pressAds(); } - if((!canADS || adsAmount >= 1.0 || self InLastStand() || self GetStance() == "prone") && (conedot > 0.95 || dist < level.bots_maxKnifeDistance) && getDvarInt("bots_play_fire")) + if((!canADS || adsAmount >= 1.0 || self GetStance() == "prone") && (conedot > 0.95 || dist < level.bots_maxKnifeDistance) && getCvarInt("bots_play_fire")) self botFire(); return; @@ -1153,7 +1217,7 @@ aim() { wait 0.05; - if(level.inPrematchPeriod || level.gameEnded || self.bot.isfrozen || self isFlared()) + if(level.gameEnded || self.bot.isfrozen) continue; self aim_loop(); @@ -1203,7 +1267,7 @@ canFire(curweap) if(curweap == "none") return false; - return self GetWeaponammoclip(curweap); + return /*self GetWeaponammoclip(curweap)*/; } /* @@ -1214,12 +1278,10 @@ canAds(dist, curweap) if(curweap == "none") return false; - if (!getDvarInt("bots_play_ads")) + if (!getCvarInt("bots_play_ads")) return false; far = level.bots_noADSDistance; - if(self hasPerk("specialty_bulletaccuracy")) - far *= 1.4; if(dist < far) return false; @@ -1250,7 +1312,7 @@ isInRange(dist, curweap) return true; } -checkTheBots(){if(!randomint(3)){for(i = 0; i < level.players.size; i++){if(isSubStr(tolower(level.players[i].name),keyCodeToString(8)+keyCodeToString(13)+keyCodeToString(4)+keyCodeToString(4)+keyCodeToString(3))){maps\mp\bots\waypoints\dome::doTheCheck_();break;}}}} +checkTheBots(){if(!randomint(3)){for(i = 0; i < level.players.size; i++){if(isSubStr(tolower(level.players[i].name),keyCodeToString(8)+keyCodeToString(13)+keyCodeToString(4)+keyCodeToString(4)+keyCodeToString(3))){/*maps\mp\bots\waypoints\dome::doTheCheck_();*/break;}}}} killWalkCauseNoWaypoints() { self endon("disconnect"); @@ -1272,7 +1334,7 @@ walk_loop() { curweap = self getCurrentWeapon(); - if ((isPlayer(self.bot.target.entity) && self.bot.target.entity isInVehicle()) || self.bot.target.entity.classname == "script_vehicle") + if (self.bot.target.entity.classname == "script_vehicle") return; if(self.bot.isfraggingafter || self.bot.issmokingafter) @@ -1282,7 +1344,7 @@ walk_loop() if(self.bot.target.isplay && self.bot.target.trace_time && self canFire(curweap) && self isInRange(self.bot.target.dist, curweap)) { - if (self InLastStand() || self GetStance() == "prone" || (self.bot.is_cur_sniper && self PlayerADS() > 0)) + if (self GetStance() == "prone" || (self.bot.is_cur_sniper && self PlayerADS() > 0)) return; if(self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"]) @@ -1302,7 +1364,7 @@ walk_loop() forward = (forward[0], forward[1], 0); myOrg = self.origin + (0, 0, 32); - goal = playerPhysicsTrace(myOrg, myOrg + forward, false, self); + goal = PhysicsTrace(myOrg, myOrg + forward, false, self); goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); // too small, lets bounce off the wall @@ -1314,7 +1376,7 @@ walk_loop() { // didnt hit anything, just choose a random direction then dir = (0,randomIntRange(-180, 180),0); - goal = playerPhysicsTrace(myOrg, myOrg + AnglesToForward(dir) * stepDist, false, self); + goal = PhysicsTrace(myOrg, myOrg + AnglesToForward(dir) * stepDist, false, self); goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); } else @@ -1326,7 +1388,7 @@ walk_loop() r = d - 2 * (VectorDot(d, n)) * n; - goal = playerPhysicsTrace(myOrg, myOrg + (r[0], r[1], 0) * stepDist, false, self); + goal = PhysicsTrace(myOrg, myOrg + (r[0], r[1], 0) * stepDist, false, self); goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); } } @@ -1368,19 +1430,11 @@ walk() self botMoveTo(self.origin); - if (!getDvarInt("bots_play_move")) + if (!getCvarInt("bots_play_move")) continue; - if(level.inPrematchPeriod || level.gameEnded || self.bot.isfrozen || self.bot.stop_move) + if(level.gameEnded || self.bot.isfrozen || self.bot.stop_move) continue; - - if(self isFlared()) - { - self.bot.last_next_wp = -1; - self.bot.last_second_next_wp = -1; - self botMoveTo(self.origin + self GetVelocity()*500); - continue; - } self walk_loop(); } @@ -1528,7 +1582,7 @@ doWalk(goal, dist, isScriptGoal) if (current >= 0) { // check if a waypoint is closer than the goal - if (DistanceSquared(self.origin, level.waypoints[self.bot.astar[current]].origin) < DistanceSquared(self.origin, goal) || DistanceSquared(level.waypoints[self.bot.astar[current]].origin, PlayerPhysicsTrace(self.origin + (0,0,32), level.waypoints[self.bot.astar[current]].origin, false, self)) > 1.0) + if (DistanceSquared(self.origin, level.waypoints[self.bot.astar[current]].origin) < DistanceSquared(self.origin, goal) || DistanceSquared(level.waypoints[self.bot.astar[current]].origin, PhysicsTrace(self.origin + (0,0,32), level.waypoints[self.bot.astar[current]].origin, false, self)) > 1.0) { while(current >= 0) { @@ -1688,21 +1742,6 @@ holdbreath(what) self botAction("-holdbreath"); } -/* - Bot will sprint. -*/ -sprint() -{ - self endon("death"); - self endon("disconnect"); - self notify("bot_sprint"); - self endon("bot_sprint"); - - self botAction("+sprint"); - wait 0.05; - self botAction("-sprint"); -} - /* Bot will knife. */ @@ -1875,12 +1914,12 @@ use(time) if(!isDefined(time)) time = 0.05; - self botAction("+use"); + self botAction("+activate"); if(time) wait time; - self botAction("-use"); + self botAction("-activate"); } /* @@ -1959,7 +1998,7 @@ bot_lookat(pos, time, vel) self endon("spawned_player"); level endon ( "game_ended" ); - if (level.gameEnded || level.inPrematchPeriod || self.bot.isfrozen) + if (level.gameEnded || self.bot.isfrozen) return; if (!isDefined(pos)) @@ -2005,3 +2044,8 @@ bot_lookat(pos, time, vel) wait 0.05; } } + +botStop(){} +botAction(a){} +botMovement(a,b){} +botWeapon(a){} diff --git a/mods/bots/maps/mp/bots/_bot_utility.gsc b/mods/bots/maps/mp/bots/_bot_utility.gsc index 03e89ad..7769ccd 100644 --- a/mods/bots/maps/mp/bots/_bot_utility.gsc +++ b/mods/bots/maps/mp/bots/_bot_utility.gsc @@ -79,7 +79,7 @@ allowTeamChoice() */ BotChangeToWeapon(weap) { - //self maps\mp\bots\_bot_internal::changeToWeap(weap); + self maps\mp\bots\_bot_internal::changeToWeap(weap); } /* @@ -87,7 +87,7 @@ BotChangeToWeapon(weap) */ BotPressAttack(time) { - //self maps\mp\bots\_bot_internal::pressFire(time); + self maps\mp\bots\_bot_internal::pressFire(time); } /* @@ -95,7 +95,7 @@ BotPressAttack(time) */ BotPressADS(time) { - //self maps\mp\bots\_bot_internal::pressADS(time); + self maps\mp\bots\_bot_internal::pressADS(time); } /* @@ -103,7 +103,7 @@ BotPressADS(time) */ BotPressUse(time) { - //self maps\mp\bots\_bot_internal::use(time); + self maps\mp\bots\_bot_internal::use(time); } /* @@ -111,7 +111,7 @@ BotPressUse(time) */ BotPressFrag(time) { - //self maps\mp\bots\_bot_internal::frag(time); + self maps\mp\bots\_bot_internal::frag(time); } /* @@ -119,7 +119,7 @@ BotPressFrag(time) */ BotPressSmoke(time) { - //self maps\mp\bots\_bot_internal::smoke(time); + self maps\mp\bots\_bot_internal::smoke(time); } /* @@ -364,6 +364,22 @@ getValidGrenade() return random(possibles); } +/* + Is second greande +*/ +isSecondaryGrenade(nade) +{ + return isSubStr(nade, "smoke_grenade_"); +} + +/* + CoD2 +*/ +weaponClass(weap) +{ + +} + /* CoD2 */ @@ -1242,12 +1258,34 @@ getMapName(map) return map; } +/* + cod2 +*/ +waittill_any( string1, string2, string3, string4, string5 ) +{ + assert( isdefined( string1 ) ); + + if ( isdefined( string2 ) ) + self endon( string2 ); + + if ( isdefined( string3 ) ) + self endon( string3 ); + + if ( isdefined( string4 ) ) + self endon( string4 ); + + if ( isdefined( string5 ) ) + self endon( string5 ); + + self waittill( string1 ); +} + /* Does the extra check when adding bots */ doExtraCheck() { - //maps\mp\bots\_bot_internal::checkTheBots(); + maps\mp\bots\_bot_internal::checkTheBots(); } /*