From e9c122b6479e524af3c13bd7a849fcfb668f596e Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Jul 2020 23:33:44 -0600 Subject: [PATCH] Offset, List API, added forgotten difficulty, better GetEyeHeight --- .gitignore | 2 + main_shared/maps/mp/bots/_bot.gsc | 60 ++++++------- main_shared/maps/mp/bots/_bot_internal.gsc | 31 +++++-- main_shared/maps/mp/bots/_bot_script.gsc | 8 +- main_shared/maps/mp/bots/_bot_utility.gsc | 99 ++++++++++++++++------ 5 files changed, 131 insertions(+), 69 deletions(-) diff --git a/.gitignore b/.gitignore index 53a7058..48ac095 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ # Folder to not ignore !/main_shared/ +main_shared/maps/mp/gametypes/_globallogic.gsx +main_shared/maps/mp/gametypes/_hardpoints.gsx diff --git a/main_shared/maps/mp/bots/_bot.gsc b/main_shared/maps/mp/bots/_bot.gsc index 17038c1..69f2668 100644 --- a/main_shared/maps/mp/bots/_bot.gsc +++ b/main_shared/maps/mp/bots/_bot.gsc @@ -53,7 +53,7 @@ init() setDvar("bots_loadout_allow_op", true); level.defuseObject = undefined; - level.bots_smokeList = []; + level.bots_smokeList = List(); level.tbl_PerkData[0]["reference_full"] = true; for(h = 1; h < 6; h++) for(i = 0; i < 3; i++) @@ -293,13 +293,14 @@ diffBots() var_allies_med = getDVarInt("bots_skill_allies_med"); var_axis_hard = getDVarInt("bots_skill_axis_hard"); var_axis_med = getDVarInt("bots_skill_axis_med"); + var_skill = getDvarInt("bots_skill"); allies_hard = 0; allies_med = 0; axis_hard = 0; axis_med = 0; - if(getDvarInt("bots_skill") == 8) + if(var_skill == 8) { playercount = level.players.size; for(i = 0; i < playercount; i++) @@ -344,6 +345,19 @@ diffBots() } } } + else if (var_skill != 0 && var_skill != 9) + { + playercount = level.players.size; + for(i = 0; i < playercount; i++) + { + player = level.players[i]; + + if(!player is_bot()) + continue; + + player.pers["bots"]["skill"]["base"] = var_skill; + } + } } } @@ -604,49 +618,31 @@ onGrenadeFire() */ AddToSmokeList() { - index = level.bots_smokeList.size; - level.bots_smokeList[index] = spawnstruct(); - level.bots_smokeList[index].origin = self getOrigin(); - level.bots_smokeList[index].state = "moving"; - level.bots_smokeList[index] thread thinkSmoke(self); + grenade = spawnstruct(); + grenade.origin = self getOrigin(); + grenade.state = "moving"; + grenade.grenade = self; + + grenade thread thinkSmoke(); + + level.bots_smokeList ListAdd(grenade); } /* The smoke grenade logic. */ -thinkSmoke(gnade) +thinkSmoke() { - while(isDefined(gnade)) + while(isDefined(self.grenade)) { - self.origin = gnade getOrigin(); + self.origin = self.grenade getOrigin(); self.state = "moving"; wait 0.05; } self.state = "smoking"; wait 11.5; - removeSmokeNade(self); -} - -/* - Removes the smoke grenade inplace of the array. -*/ -removeSmokeNade(nade) -{ - sizeof = level.bots_smokeList.size; - for ( entry = 0; entry < sizeof; entry++ ) - { - if ( level.bots_smokeList[entry] == nade ) - { - while ( entry < sizeof-1 ) - { - level.bots_smokeList[entry] = level.bots_smokeList[entry+1]; - entry++; - } - level.bots_smokeList[entry] = undefined; - break; - } - } + level.bots_smokeList ListRemove(self); } /* diff --git a/main_shared/maps/mp/bots/_bot_internal.gsc b/main_shared/maps/mp/bots/_bot_internal.gsc index 77c6a56..216575e 100644 --- a/main_shared/maps/mp/bots/_bot_internal.gsc +++ b/main_shared/maps/mp/bots/_bot_internal.gsc @@ -104,8 +104,9 @@ onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint resetBotVars() { self.bot.script_target = undefined; - self.bot.targets = []; + self.bot.script_target_offset = undefined; self.bot.target = undefined; + self.bot.targets = []; self.bot.target_this_frame = undefined; self.bot.script_aimpos = undefined; @@ -489,7 +490,9 @@ target() daDist = distanceSquared(self.origin, ent.origin); obj = self.bot.targets[key]; isObjDef = isDefined(obj); - entOrigin = ent.origin + (0, 0, 5); + entOrigin = ent.origin; + if (isDefined(self.bot.script_target_offset)) + entOrigin += self.bot.script_target_offset; for(;;) { @@ -515,6 +518,8 @@ target() obj.trace_time_time = 0; obj.rand = randomInt(100); obj.didlook = false; + obj.isplay = isPlayer(ent); + obj.offset = self.bot.script_target_offset; self.bot.targets[key] = obj; } @@ -577,6 +582,8 @@ target() obj.trace_time_time = 0; obj.rand = randomInt(100); obj.didlook = false; + obj.isplay = isPlayer(player); + obj.offset = undefined; self.bot.targets[key] = obj; } @@ -626,6 +633,8 @@ target() obj.trace_time_time = 0; obj.rand = randomInt(100); obj.didlook = false; + obj.isplay = isPlayer(player); + obj.offset = undefined; self.bot.targets[key] = obj; } @@ -713,7 +722,7 @@ onNewEnemy() if(!isDefined(self.bot.target)) continue; - if(!isDefined(self.bot.target.entity) || !isPlayer(self.bot.target.entity)) + if(!isDefined(self.bot.target.entity) || !self.bot.target.isplay) continue; if(self.bot.target.didlook) @@ -815,7 +824,8 @@ aim() last_pos = self.bot.target.last_seen_pos; target = self.bot.target.entity; conedot = 0; - isplay = isPlayer(target); + isplay = self.bot.target.isplay; + offset = self.bot.target.offset; dist = self.bot.target.dist; curweap = self getCurrentWeapon(); eyePos = self getEyePos(); @@ -873,8 +883,7 @@ aim() if(!nadeAimOffset && conedot > 0.999) { - //self botLookAtPlayer(target, "j_spineupper");//cod4x is crashing when this is called - self botLookAt(aimpos, aimspeed); + self botLookAtPlayer(target, "j_spineupper"); } else { @@ -883,7 +892,10 @@ aim() } else { - aimpos = target.origin + (0, 0, 5 + nadeAimOffset); + aimpos = target.origin; + if (isDefined(offset)) + aimpos += offset; + aimpos += (0, 0, nadeAimOffset); conedot = getConeDot(aimpos, eyePos, angles); self botLookAt(aimpos, aimspeed); } @@ -905,7 +917,8 @@ aim() canADS = self canAds(dist, curweap); self ads(canADS); - if((!canADS || self playerads() == 1.0) && conedot > 0.999 && trace_time > reaction_time) + + if((!canADS || self playerads() == 1.0) && (conedot > 0.999 || dist < level.bots_maxKnifeDistance) && trace_time > reaction_time) { self botFire(); } @@ -1074,7 +1087,7 @@ walk() continue; } - if(isPlayer(self.bot.target.entity) && self.bot.target.trace_time && self canFire(curweap) && self isInRange(self.bot.target.dist, curweap)) + if(self.bot.target.isplay && self.bot.target.trace_time && self canFire(curweap) && self isInRange(self.bot.target.dist, curweap)) { if(self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"]) self strafe(self.bot.target.entity); diff --git a/main_shared/maps/mp/bots/_bot_script.gsc b/main_shared/maps/mp/bots/_bot_script.gsc index 7e5e907..905f9af 100644 --- a/main_shared/maps/mp/bots/_bot_script.gsc +++ b/main_shared/maps/mp/bots/_bot_script.gsc @@ -1194,10 +1194,10 @@ bot_kill_chopper() if(level.chopper.team == self.team && level.teamBased) continue; - if(!bulletTracePassed( self getEyePos(), level.chopper.origin + (0, 0, 5), false, level.chopper )) + if(!bulletTracePassed( self getEyePos(), level.chopper.origin + (0, 0, -5), false, level.chopper )) continue; - self SetScriptEnemy( level.chopper ); + self SetScriptEnemy( level.chopper, (0, 0, -5) ); self bot_chopper_attack(level.chopper); self ClearScriptEnemy(); } @@ -1263,7 +1263,7 @@ bot_kill_equipment() if (item.name != "c4_mp" && item.name != "claymore_mp") continue; - if(!hasDetectExp && !bulletTracePassed(myEye, item.origin+(0, 0, 5), false, item)) + if(!hasDetectExp && !bulletTracePassed(myEye, item.origin+(0, 0, 0), false, item)) continue; if(getConeDot(item.origin, self.origin, myAngles) < 0.6) @@ -1278,7 +1278,7 @@ bot_kill_equipment() if(isDefined(target)) { - self SetScriptEnemy( target ); + self SetScriptEnemy( target, (0, 0, 0) ); self bot_equipment_attack(target); self ClearScriptEnemy(); } diff --git a/main_shared/maps/mp/bots/_bot_utility.gsc b/main_shared/maps/mp/bots/_bot_utility.gsc index db0b749..adf1f35 100644 --- a/main_shared/maps/mp/bots/_bot_utility.gsc +++ b/main_shared/maps/mp/bots/_bot_utility.gsc @@ -122,9 +122,10 @@ ClearScriptGoal() /* Sets the script enemy for a bot. */ -SetScriptEnemy(enemy) +SetScriptEnemy(enemy, offset) { self.bot.script_target = enemy; + self.bot.script_target_offset = offset; } /* @@ -132,7 +133,7 @@ SetScriptEnemy(enemy) */ ClearScriptEnemy() { - self SetScriptEnemy(undefined); + self SetScriptEnemy(undefined, undefined); } /* @@ -177,24 +178,9 @@ HasThreat() */ GetEyeHeight() { - h = 0; - switch(self getStance()) - { - case "stand": - h = 60; - break; - case "crouch": - h = 40; - break; - case "prone": - h = 11; - break; - } + myEye = self GetEyePos(); - if(isDefined(self.lastStand)) - h = 22; - - return h; + return myEye[2] - self.origin[2]; } /* @@ -202,7 +188,7 @@ GetEyeHeight() */ GetEyePos() { - return self getEye() + (0, 0, self GetEyeHeight() - 40); + return self getTagOrigin("tag_eye"); } /* @@ -400,10 +386,9 @@ RaySphereIntersect(start, end, spherePos, radius) */ SmokeTrace(start, end, rad) { - sizeof = level.bots_smokeList.size; - for(i = 0; i < sizeof; i++) + for(i = level.bots_smokeList.count - 1; i >= 0; i--) { - nade = level.bots_smokeList[i]; + nade = level.bots_smokeList.data[i]; if(nade.state != "smoking") continue; @@ -418,7 +403,7 @@ SmokeTrace(start, end, rad) } /* - Returns the cone dot (like fov, or distance from the center of our screen). + Returns the cone dot (like fov, or distance from the center of our screen). 1.0 = directly looking at, 0.0 = completely right angle, -1.0, completely 180 */ getConeDot(to, from, dir) { @@ -427,6 +412,14 @@ getConeDot(to, from, dir) return vectordot(dirToTarget, forward); } +DistanceSquared2D(to, from) +{ + to = (to[0], to[1], 0); + from = (from[0], from[1], 0); + + return DistanceSquared(to, from); +} + /* Rounds to the nearest whole number. */ @@ -781,6 +774,64 @@ _WaypointsToKDTree(waypoints, dem) _WaypointsToKDTree(right, (dem+1)%3); } +/* + Returns a new list. +*/ +List() +{ + list = spawnStruct(); + list.count = 0; + list.data = []; + + return list; +} + +/* + Adds a new thing to the list. +*/ +ListAdd(thing) +{ + self.data[self.count] = thing; + + self.count++; +} + +/* + Adds to the start of the list. +*/ +ListAddFirst(thing) +{ + for (i = self.count - 1; i >= 0; i--) + { + self.data[i + 1] = self.data[i]; + } + + self.data[0] = thing; + self.count++; +} + +/* + Removes the thing from the list. +*/ +ListRemove(thing) +{ + for ( i = 0; i < self.count; i++ ) + { + if ( self.data[i] == thing ) + { + while ( i < self.count-1 ) + { + self.data[i] = self.data[i+1]; + i++; + } + + self.data[i] = undefined; + self.count--; + break; + } + } +} + /* Returns a new KDTree. */