mirror of
https://github.com/ineedbots/iw3_bot_warfare.git
synced 2025-04-21 18:05:44 +00:00
Offset, List API, added forgotten difficulty, better GetEyeHeight
This commit is contained in:
parent
351fc54a23
commit
e9c122b647
2
.gitignore
vendored
2
.gitignore
vendored
@ -9,3 +9,5 @@
|
||||
|
||||
# Folder to not ignore
|
||||
!/main_shared/
|
||||
main_shared/maps/mp/gametypes/_globallogic.gsx
|
||||
main_shared/maps/mp/gametypes/_hardpoints.gsx
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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.
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user