Offset, List API, added forgotten difficulty, better GetEyeHeight

This commit is contained in:
Your Name 2020-07-24 23:33:44 -06:00
parent 351fc54a23
commit e9c122b647
5 changed files with 131 additions and 69 deletions

2
.gitignore vendored
View File

@ -9,3 +9,5 @@
# Folder to not ignore
!/main_shared/
main_shared/maps/mp/gametypes/_globallogic.gsx
main_shared/maps/mp/gametypes/_hardpoints.gsx

View File

@ -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);
}
/*

View File

@ -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);

View File

@ -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();
}

View File

@ -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.
*/