diff --git a/main_shared/maps/mp/bots/_bot_internal.gsc b/main_shared/maps/mp/bots/_bot_internal.gsc index ef866de..574bdb3 100644 --- a/main_shared/maps/mp/bots/_bot_internal.gsc +++ b/main_shared/maps/mp/bots/_bot_internal.gsc @@ -224,10 +224,69 @@ spawned() self thread watchHoldBreath(); self thread onNewEnemy(); self thread doBotMovement(); + self thread watchGrenadeFire(); self notify("bot_spawned"); } +/* + Watches when the bot fires a grenade +*/ +watchGrenadeFire() +{ + self endon("disconnect"); + self endon("death"); + + for (;;) + { + self waittill( "grenade_fire", nade, weapname ); + + if ( weapname == "c4_mp" ) + self thread watchC4Thrown(nade); + } +} + +/* + Watches the c4 +*/ +watchC4Thrown(c4) +{ + self endon("disconnect"); + c4 endon("death"); + + wait 0.5; + + for (;;) + { + wait 1 + randomInt(50) * 0.05; + + shouldBreak = false; + for (i = 0; i < level.players.size; i++) + { + player = level.players[i]; + + if(player == self) + continue; + + if((level.teamBased && self.team == player.team) || player.sessionstate != "playing" || !isAlive(player)) + continue; + + if (distanceSquared(c4.origin, player.origin) > 200*200) + continue; + + if (!bulletTracePassed(c4.origin, player.origin + (0, 0, 25), false, c4)) + continue; + + shouldBreak = true; + } + + if (shouldBreak) + break; + } + + self notify( "alt_detonate" ); +} + /* Bot moves towards the point */ @@ -375,26 +434,25 @@ onWeaponChange() { self endon("disconnect"); self endon("death"); - - weap = self GetCurrentWeapon(); - self.bot.is_cur_full_auto = WeaponIsFullAuto(weap); - self.bot.cur_weap_dist_multi = SetWeaponDistMulti(weap); - self.bot.is_cur_sniper = IsWeapSniper(weap); - if (weap != "none") - self changeToWeap(weap); + first = true; for(;;) { - self waittill( "weapon_change", newWeapon ); + newWeapon = undefined; + if (first) + { + first = false; + newWeapon = self getCurrentWeapon(); + } + else + self waittill( "weapon_change", newWeapon ); self.bot.is_cur_full_auto = WeaponIsFullAuto(newWeapon); - self.bot.cur_weap_dist_multi = SetWeaponDistMulti(weap); - self.bot.is_cur_sniper = IsWeapSniper(weap); + self.bot.cur_weap_dist_multi = SetWeaponDistMulti(newWeapon); + self.bot.is_cur_sniper = IsWeapSniper(newWeapon); if (newWeapon == "none") - { continue; - } self changeToWeap(newWeapon); } @@ -1215,8 +1273,6 @@ aim() if(!self canFire(curweap) || !self isInRange(dist, curweap)) continue; - //c4 logic here, but doesnt work anyway - canADS = (self canAds(dist, curweap) && conedot > 0.75); if (canADS) { diff --git a/main_shared/maps/mp/bots/_bot_script.gsc b/main_shared/maps/mp/bots/_bot_script.gsc index fbcc6a4..9a2f28f 100644 --- a/main_shared/maps/mp/bots/_bot_script.gsc +++ b/main_shared/maps/mp/bots/_bot_script.gsc @@ -673,7 +673,6 @@ get_random_perk(perkslot, rank, att1, att2) { case "specialty_parabolic": case "specialty_holdbreath": - case "specialty_weapon_c4": case "specialty_explosivedamage": case "specialty_twoprimaries": continue; @@ -1794,6 +1793,8 @@ bot_use_equipment_think() nade = undefined; if (self GetAmmoCount("claymore_mp")) nade = "claymore_mp"; + if (self GetAmmoCount("c4_mp")) + nade = "c4_mp"; if (!isDefined(nade)) continue; @@ -1871,7 +1872,8 @@ bot_use_equipment_think() if (self changeToWeapon(nade)) { - self thread fire_current_weapon(); + if (nade != "c4_mp") + self thread fire_current_weapon(); self waittill_any_timeout(5, "grenade_fire", "weapon_change"); self notify("stop_firing_weapon"); } @@ -2256,7 +2258,7 @@ bot_weapon_think() } else { - if(curWeap != "none" && self getAmmoCount(curWeap) && curWeap != "c4_mp") + if(curWeap != "none" && self getAmmoCount(curWeap)) { if(randomInt(100) > self.pers["bots"]["behavior"]["switch"]) continue; @@ -2282,7 +2284,7 @@ bot_weapon_think() if (maps\mp\gametypes\_weapons::isGrenade( weapon )) continue; - if(curWeap == weapon || weapon == "c4_mp" || weapon == "none" || weapon == "claymore_mp" || weapon == "")//c4 no work + if(curWeap == weapon || weapon == "c4_mp" || weapon == "none" || weapon == "claymore_mp" || weapon == "") continue; weap = weapon;