From c9b953e32ea268544cda1b61588b944d17d940ea Mon Sep 17 00:00:00 2001 From: ineedbots Date: Tue, 15 Jun 2021 20:07:37 -0600 Subject: [PATCH] They play --- mods/bots/maps/mp/bots/_bot.gsc | 32 +++++++++-- mods/bots/maps/mp/bots/_bot_internal.gsc | 68 +++++++++++------------- mods/bots/maps/mp/bots/_bot_utility.gsc | 33 +++++++----- 3 files changed, 81 insertions(+), 52 deletions(-) diff --git a/mods/bots/maps/mp/bots/_bot.gsc b/mods/bots/maps/mp/bots/_bot.gsc index f4b79da..58a5c85 100644 --- a/mods/bots/maps/mp/bots/_bot.gsc +++ b/mods/bots/maps/mp/bots/_bot.gsc @@ -281,14 +281,16 @@ watchAmmoUsage(weap) self endon("disconnect"); self endon("weapon_change"); + slot = self getWeaponSlot(weap); + for (;;) { - aCount = self GetWeaponSlotClipAmmo(self getCurrentWeaponSlot()); + aCount = self GetWeaponSlotClipAmmo(slot); - while (aCount == self GetWeaponSlotClipAmmo(self getCurrentWeaponSlot())) + while (aCount == self GetWeaponSlotClipAmmo(slot)) wait 0.05; - if (self GetWeaponSlotClipAmmo(self getCurrentWeaponSlot()) < aCount) + if (self GetWeaponSlotClipAmmo(slot) < aCount) self notify("weapon_fired"); else self notify("reload"); @@ -412,6 +414,30 @@ connected() self thread onDisconnect(); level notify("bot_connected", self); + + self thread spawnBot(); +} + +spawnBot() +{ + wait 5; + + self notify("menuresponse", game["menu_team"], "autoassign"); + + wait 0.5; + + weap = "mp40_mp"; + if (self.team == "allies") + { + if (game["allies"] == "american") + weap = "thompson_mp"; + else if (game["allies"] == "british") + weap = "greasegun_mp"; + else + weap = "ppsh_mp"; + } + + self notify("menuresponse", game["menu_weapon_" + self.team], weap); } /* diff --git a/mods/bots/maps/mp/bots/_bot_internal.gsc b/mods/bots/maps/mp/bots/_bot_internal.gsc index 7729511..fb68f63 100644 --- a/mods/bots/maps/mp/bots/_bot_internal.gsc +++ b/mods/bots/maps/mp/bots/_bot_internal.gsc @@ -208,7 +208,7 @@ doBotMovement_loop(data) 0); // make the length 127 - dir = VectorNormalize(dir) * 127; + dir = vector_scale(VectorNormalize(dir), 127); // invert the second component as the engine requires this dir = (dir[0], 0-dir[1], 0); @@ -227,18 +227,18 @@ doBotMovement_loop(data) }*/ startPos = self.origin + (0, 0, 50); - startPosForward = startPos + anglesToForward((0, angles[1], 0)) * 25; + startPosForward = startPos + vector_scale(anglesToForward((0, angles[1], 0)), 25); bt = bulletTrace(startPos, startPosForward, false, self); if (bt["fraction"] >= 1) { // 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") @@ -258,6 +258,7 @@ doBotMovement_loop(data) // move! self botMovement(int(dir[0]), int(dir[1])); + self setOrigin(move_To); } /* @@ -331,6 +332,9 @@ IsWeapSniper(weap) { if (weap == "none") return false; + + if (weaponClass(weap) != "sniper") + return false; return true; } @@ -404,8 +408,8 @@ reload_watch_loop() if (weap == "none") break; - // if (self GetWeaponAmmoClip(weap) >= WeaponClipSize(weap)) - // break; + if (self GetWeaponSlotClipAmmo(self getWeaponSlot(weap)) >= WeaponClipSize(weap)) + break; } self.bot.isreloading = false; } @@ -513,14 +517,14 @@ reload_thread() if (cur == "" || cur == "none") return; - //if(IsWeaponClipOnly(cur) || !self GetWeaponAmmoStock(cur)) - // return; + if(IsWeaponClipOnly(cur) || !self getweaponslotammo(self getWeaponSlot(cur))) + return; - //maxsize = WeaponClipSize(cur); - //cursize = self GetWeaponammoclip(cur); + maxsize = WeaponClipSize(cur); + cursize = self GetWeaponSlotClipAmmo(self getWeaponSlot(cur)); - //if(cursize/maxsize < 0.5) - // self thread reload(); + if(cursize/maxsize < 0.5) + self thread reload(); } /* @@ -594,7 +598,7 @@ updateAimOffset(obj) else offsetScalar = 1 - objCreatedFor / aimDiffTime; - obj.aim_offset = obj.aim_offset_base * offsetScalar; + obj.aim_offset = vector_scale(obj.aim_offset_base, offsetScalar); } /* @@ -1026,8 +1030,6 @@ aim_loop() if(self.bot.isfraggingafter || self.bot.issmokingafter) nadeAimOffset = dist/3000; - else if(curweap != "none" && weaponClass(curweap) == "grenade") - nadeAimOffset = dist/16000; if(no_trace_time && (!isDefined(self.bot.after_target) || self.bot.after_target != target)) { @@ -1042,8 +1044,6 @@ aim_loop() 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") - time = 2; if(!isSecondaryGrenade(nade)) self thread frag(time); @@ -1148,8 +1148,6 @@ aim_loop() if(self.bot.isfraggingafter || self.bot.issmokingafter) nadeAimOffset = dist/3000; - else if(curweap != "none" && weaponClass(curweap) == "grenade") - nadeAimOffset = dist/16000; aimpos = last_pos + (0, 0, self getEyeHeight() + nadeAimOffset); conedot = getConeDot(aimpos, eyePos, angles); @@ -1195,7 +1193,7 @@ aim_loop() { lookat = undefined; - if(self.bot.second_next_wp != -1 && !self.bot.issprinting && !self.bot.climbing) + if(self.bot.second_next_wp != -1 && !self.bot.climbing) lookat = level.waypoints[self.bot.second_next_wp].origin; else if(isDefined(self.bot.towards_goal)) lookat = self.bot.towards_goal; @@ -1267,7 +1265,7 @@ canFire(curweap) if(curweap == "none") return false; - return /*self GetWeaponammoclip(curweap)*/; + return self GetWeaponSlotClipAmmo(self getWeaponSlot(curweap)); } /* @@ -1287,7 +1285,7 @@ canAds(dist, curweap) return false; weapclass = (weaponClass(curweap)); - if(weapclass == "spread" || weapclass == "grenade") + if(weapclass == "spread") return false; return true; @@ -1305,9 +1303,6 @@ isInRange(dist, curweap) if(weapclass == "spread" && dist > level.bots_maxShotgunDistance) return false; - - if (curweap == "m2_flamethrower_mp" && dist > level.bots_maxShotgunDistance) - return false; return true; } @@ -1360,7 +1355,7 @@ walk_loop() { self thread killWalkCauseNoWaypoints(); stepDist = 64; - forward = AnglesToForward(self GetPlayerAngles())*stepDist; + forward = vector_scale(AnglesToForward(self GetPlayerAngles()), stepDist); forward = (forward[0], forward[1], 0); myOrg = self.origin + (0, 0, 32); @@ -1376,7 +1371,7 @@ walk_loop() { // didnt hit anything, just choose a random direction then dir = (0,randomIntRange(-180, 180),0); - goal = PhysicsTrace(myOrg, myOrg + AnglesToForward(dir) * stepDist, false, self); + goal = PhysicsTrace(myOrg, myOrg + vector_scale(AnglesToForward(dir), stepDist), false, self); goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); } else @@ -1386,9 +1381,9 @@ walk_loop() d = VectorNormalize(trace["position"] - myOrg); n = trace["normal"]; - r = d - 2 * (VectorDot(d, n)) * n; + r = d - 2 * vector_scale(VectorDot(d, n), n); - goal = PhysicsTrace(myOrg, myOrg + (r[0], r[1], 0) * stepDist, false, self); + goal = PhysicsTrace(myOrg, myOrg + vector_scale((r[0], r[1], 0), stepDist), false, self); goal = PhysicsTrace(goal + (0, 0, 50), goal + (0, 0, -40), false, self); } } @@ -1453,8 +1448,8 @@ strafe(target) anglesRight = (0, angles[1]-90, 0); myOrg = self.origin + (0, 0, 16); - left = myOrg + anglestoforward(anglesLeft)*500; - right = myOrg + anglestoforward(anglesRight)*500; + left = myOrg + vector_scale(anglestoforward(anglesLeft), 500); + right = myOrg + vector_scale(anglestoforward(anglesRight), 500); traceLeft = BulletTrace(myOrg, left, false, self); traceRight = BulletTrace(myOrg, right, false, self); @@ -1776,6 +1771,7 @@ reload() self notify("bot_reload"); self endon("bot_reload"); + self notify("reload_start"); self botAction("+reload"); wait 0.05; self botAction("-reload"); @@ -2015,9 +2011,9 @@ bot_lookat(pos, time, vel) steps = 1; myEye = self GetEyePos(); // get our eye pos - myEye += (self getVelocity() * 0.05) * (steps - 1); // account for our velocity + myEye += vector_scale(vector_scale(self getVelocity(), 0.05), steps - 1); // account for our velocity - pos += (vel * 0.05) * (steps - 1); // add the velocity vector + pos += vector_scale(vector_scale(vel, 0.05), steps - 1); // add the velocity vector myAngle=self getPlayerAngles(); angles = VectorToAngles( (pos - myEye) - anglesToForward(myAngle) ); diff --git a/mods/bots/maps/mp/bots/_bot_utility.gsc b/mods/bots/maps/mp/bots/_bot_utility.gsc index 7769ccd..25c7523 100644 --- a/mods/bots/maps/mp/bots/_bot_utility.gsc +++ b/mods/bots/maps/mp/bots/_bot_utility.gsc @@ -377,27 +377,34 @@ isSecondaryGrenade(nade) */ weaponClass(weap) { - + return ""; } /* CoD2 */ -getCurrentWeaponSlot() +WeaponClipSize(weap) { - current = self getCurrentWeapon(); - weapon1 = self getweaponslotweapon("primary"); - weapon2 = self getweaponslotweapon("primaryb"); - currentslot = undefined; + return 1; +} - if(current == weapon1) - currentslot = "primary"; +/* + CoD2 +*/ +getWeaponSlot(weap) +{ + if (self getweaponslotweapon("primary") == weap) + return "primary"; else - { - currentslot = "primaryb"; - } + return "primaryb"; +} - return currentslot; +/* + IsWeaponClipOnly cod2 +*/ +IsWeaponClipOnly(weap) +{ + return false; } /* @@ -737,7 +744,7 @@ RaySphereIntersect(start, end, spherePos, radius) //mu2 = (0-b - sqrt(bb4ac)) / (2 * a); // intersection points of the sphere - ip1 = start + mu1 * dp; + ip1 = start + vector_scale(dp, mu1); //ip2 = start + mu2 * dp; myDist = DistanceSquared(start, end);