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 # Folder to not ignore
!/main_shared/ !/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); setDvar("bots_loadout_allow_op", true);
level.defuseObject = undefined; level.defuseObject = undefined;
level.bots_smokeList = []; level.bots_smokeList = List();
level.tbl_PerkData[0]["reference_full"] = true; level.tbl_PerkData[0]["reference_full"] = true;
for(h = 1; h < 6; h++) for(h = 1; h < 6; h++)
for(i = 0; i < 3; i++) for(i = 0; i < 3; i++)
@ -293,13 +293,14 @@ diffBots()
var_allies_med = getDVarInt("bots_skill_allies_med"); var_allies_med = getDVarInt("bots_skill_allies_med");
var_axis_hard = getDVarInt("bots_skill_axis_hard"); var_axis_hard = getDVarInt("bots_skill_axis_hard");
var_axis_med = getDVarInt("bots_skill_axis_med"); var_axis_med = getDVarInt("bots_skill_axis_med");
var_skill = getDvarInt("bots_skill");
allies_hard = 0; allies_hard = 0;
allies_med = 0; allies_med = 0;
axis_hard = 0; axis_hard = 0;
axis_med = 0; axis_med = 0;
if(getDvarInt("bots_skill") == 8) if(var_skill == 8)
{ {
playercount = level.players.size; playercount = level.players.size;
for(i = 0; i < playercount; i++) 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() AddToSmokeList()
{ {
index = level.bots_smokeList.size; grenade = spawnstruct();
level.bots_smokeList[index] = spawnstruct(); grenade.origin = self getOrigin();
level.bots_smokeList[index].origin = self getOrigin(); grenade.state = "moving";
level.bots_smokeList[index].state = "moving"; grenade.grenade = self;
level.bots_smokeList[index] thread thinkSmoke(self);
grenade thread thinkSmoke();
level.bots_smokeList ListAdd(grenade);
} }
/* /*
The smoke grenade logic. 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"; self.state = "moving";
wait 0.05; wait 0.05;
} }
self.state = "smoking"; self.state = "smoking";
wait 11.5; wait 11.5;
removeSmokeNade(self); level.bots_smokeList ListRemove(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;
}
}
} }
/* /*

View File

@ -104,8 +104,9 @@ onDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint
resetBotVars() resetBotVars()
{ {
self.bot.script_target = undefined; self.bot.script_target = undefined;
self.bot.targets = []; self.bot.script_target_offset = undefined;
self.bot.target = undefined; self.bot.target = undefined;
self.bot.targets = [];
self.bot.target_this_frame = undefined; self.bot.target_this_frame = undefined;
self.bot.script_aimpos = undefined; self.bot.script_aimpos = undefined;
@ -489,7 +490,9 @@ target()
daDist = distanceSquared(self.origin, ent.origin); daDist = distanceSquared(self.origin, ent.origin);
obj = self.bot.targets[key]; obj = self.bot.targets[key];
isObjDef = isDefined(obj); 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(;;) for(;;)
{ {
@ -515,6 +518,8 @@ target()
obj.trace_time_time = 0; obj.trace_time_time = 0;
obj.rand = randomInt(100); obj.rand = randomInt(100);
obj.didlook = false; obj.didlook = false;
obj.isplay = isPlayer(ent);
obj.offset = self.bot.script_target_offset;
self.bot.targets[key] = obj; self.bot.targets[key] = obj;
} }
@ -577,6 +582,8 @@ target()
obj.trace_time_time = 0; obj.trace_time_time = 0;
obj.rand = randomInt(100); obj.rand = randomInt(100);
obj.didlook = false; obj.didlook = false;
obj.isplay = isPlayer(player);
obj.offset = undefined;
self.bot.targets[key] = obj; self.bot.targets[key] = obj;
} }
@ -626,6 +633,8 @@ target()
obj.trace_time_time = 0; obj.trace_time_time = 0;
obj.rand = randomInt(100); obj.rand = randomInt(100);
obj.didlook = false; obj.didlook = false;
obj.isplay = isPlayer(player);
obj.offset = undefined;
self.bot.targets[key] = obj; self.bot.targets[key] = obj;
} }
@ -713,7 +722,7 @@ onNewEnemy()
if(!isDefined(self.bot.target)) if(!isDefined(self.bot.target))
continue; continue;
if(!isDefined(self.bot.target.entity) || !isPlayer(self.bot.target.entity)) if(!isDefined(self.bot.target.entity) || !self.bot.target.isplay)
continue; continue;
if(self.bot.target.didlook) if(self.bot.target.didlook)
@ -815,7 +824,8 @@ aim()
last_pos = self.bot.target.last_seen_pos; last_pos = self.bot.target.last_seen_pos;
target = self.bot.target.entity; target = self.bot.target.entity;
conedot = 0; conedot = 0;
isplay = isPlayer(target); isplay = self.bot.target.isplay;
offset = self.bot.target.offset;
dist = self.bot.target.dist; dist = self.bot.target.dist;
curweap = self getCurrentWeapon(); curweap = self getCurrentWeapon();
eyePos = self getEyePos(); eyePos = self getEyePos();
@ -873,8 +883,7 @@ aim()
if(!nadeAimOffset && conedot > 0.999) if(!nadeAimOffset && conedot > 0.999)
{ {
//self botLookAtPlayer(target, "j_spineupper");//cod4x is crashing when this is called self botLookAtPlayer(target, "j_spineupper");
self botLookAt(aimpos, aimspeed);
} }
else else
{ {
@ -883,7 +892,10 @@ aim()
} }
else 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); conedot = getConeDot(aimpos, eyePos, angles);
self botLookAt(aimpos, aimspeed); self botLookAt(aimpos, aimspeed);
} }
@ -905,7 +917,8 @@ aim()
canADS = self canAds(dist, curweap); canADS = self canAds(dist, curweap);
self ads(canADS); 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(); self botFire();
} }
@ -1074,7 +1087,7 @@ walk()
continue; 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"]) if(self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"])
self strafe(self.bot.target.entity); self strafe(self.bot.target.entity);

View File

@ -1194,10 +1194,10 @@ bot_kill_chopper()
if(level.chopper.team == self.team && level.teamBased) if(level.chopper.team == self.team && level.teamBased)
continue; 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; continue;
self SetScriptEnemy( level.chopper ); self SetScriptEnemy( level.chopper, (0, 0, -5) );
self bot_chopper_attack(level.chopper); self bot_chopper_attack(level.chopper);
self ClearScriptEnemy(); self ClearScriptEnemy();
} }
@ -1263,7 +1263,7 @@ bot_kill_equipment()
if (item.name != "c4_mp" && item.name != "claymore_mp") if (item.name != "c4_mp" && item.name != "claymore_mp")
continue; continue;
if(!hasDetectExp && !bulletTracePassed(myEye, item.origin+(0, 0, 5), false, item)) if(!hasDetectExp && !bulletTracePassed(myEye, item.origin+(0, 0, 0), false, item))
continue; continue;
if(getConeDot(item.origin, self.origin, myAngles) < 0.6) if(getConeDot(item.origin, self.origin, myAngles) < 0.6)
@ -1278,7 +1278,7 @@ bot_kill_equipment()
if(isDefined(target)) if(isDefined(target))
{ {
self SetScriptEnemy( target ); self SetScriptEnemy( target, (0, 0, 0) );
self bot_equipment_attack(target); self bot_equipment_attack(target);
self ClearScriptEnemy(); self ClearScriptEnemy();
} }

View File

@ -122,9 +122,10 @@ ClearScriptGoal()
/* /*
Sets the script enemy for a bot. Sets the script enemy for a bot.
*/ */
SetScriptEnemy(enemy) SetScriptEnemy(enemy, offset)
{ {
self.bot.script_target = enemy; self.bot.script_target = enemy;
self.bot.script_target_offset = offset;
} }
/* /*
@ -132,7 +133,7 @@ SetScriptEnemy(enemy)
*/ */
ClearScriptEnemy() ClearScriptEnemy()
{ {
self SetScriptEnemy(undefined); self SetScriptEnemy(undefined, undefined);
} }
/* /*
@ -177,24 +178,9 @@ HasThreat()
*/ */
GetEyeHeight() GetEyeHeight()
{ {
h = 0; myEye = self GetEyePos();
switch(self getStance())
{
case "stand":
h = 60;
break;
case "crouch":
h = 40;
break;
case "prone":
h = 11;
break;
}
if(isDefined(self.lastStand)) return myEye[2] - self.origin[2];
h = 22;
return h;
} }
/* /*
@ -202,7 +188,7 @@ GetEyeHeight()
*/ */
GetEyePos() 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) SmokeTrace(start, end, rad)
{ {
sizeof = level.bots_smokeList.size; for(i = level.bots_smokeList.count - 1; i >= 0; i--)
for(i = 0; i < sizeof; i++)
{ {
nade = level.bots_smokeList[i]; nade = level.bots_smokeList.data[i];
if(nade.state != "smoking") if(nade.state != "smoking")
continue; 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) getConeDot(to, from, dir)
{ {
@ -427,6 +412,14 @@ getConeDot(to, from, dir)
return vectordot(dirToTarget, forward); 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. Rounds to the nearest whole number.
*/ */
@ -781,6 +774,64 @@ _WaypointsToKDTree(waypoints, dem)
_WaypointsToKDTree(right, (dem+1)%3); _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. Returns a new KDTree.
*/ */