mirror of
https://github.com/ineedbots/iw3_bot_warfare.git
synced 2025-04-22 02:15:42 +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
|
# Folder to not ignore
|
||||||
!/main_shared/
|
!/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);
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user