#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\qczm\HumansZombiesSetup;
init()
{ level.spawnz = 0;
level.hspawnz = 0;
level.doCustomMap = 0;
level.doorwait = 2;
level.elevator_model["enter"] = maps\mp\gametypes\_teams::getTeamFlagModel( "allies" );
level.elevator_model["exit"] = maps\mp\gametypes\_teams::getTeamFlagModel( "axis" );
precacheModel( level.elevator_model["enter"] );
precacheModel( level.elevator_model["exit"] );
wait 1;
if(getDvar("mapname") == "mp_afghan"){ /** Afghan **/
level thread Afghan();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_boneyard"){ /** Scrapyard **/
level thread Scrapyard();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_brecourt"){ /** Wasteland **/
level thread Wasteland();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_checkpoint"){ /** Karachi **/
level thread Karachi();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_derail"){ /** Derail **/
level thread Derail();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_estate"){ /** Estate **/
level thread Estate();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_favela"){ /** Favela **/
level thread Favela();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_highrise"){ /** HighRise **/
level thread HighRise();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_nightshift"){ /** Skidrow **/
level thread Skidrow();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_invasion"){ /** Invasion **/
level thread Invasion();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_quarry"){ /** Quarry **/
level thread Quarry();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_rundown"){ /** Rundown **/
level thread Rundown();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_rust"){ /** Rust **/
level thread Rust();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_subbase"){ /** SubBase **/
level thread SubBase();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_terminal"){ /** Terminal **/
level thread Terminal();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_underpass"){ /** Underpass **/
level thread Underpass();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_overgrown"){ /** Overgrown **/
level thread Overgrown();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_compact"){ /** Salvage **/
level thread Salvage();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_complex"){ /** Bailout **/
level thread Bailout();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_crash"){ /** Crash **/
level thread Crash();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_storm"){ /** Storm **/
level thread Storm();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_strike"){ /** Strike **/
level thread Strike();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_vacant"){ /** Vacant **/
level thread Vacant();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_fuel2"){ /** Fuel **/
level thread Fuel();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_trailerpark"){ /** Trailer Park **/
level thread Park();
level.doCustomMap = 1;
}
if(getDvar("mapname") == "mp_abandon"){ /** Carnival **/
level thread Carnival();
level.doCustomMap = 1;
}
if(level.doCustomMap == 1){
level.gameState = "starting";
level thread CreateMapWait();
} else {
level.gameState = "starting";
wait 15;
level notify("CREATED");
}
}
Afghan()
{
}
Derail()
{
}
Estate()
{
}
Favela()
{
}
HighRise()
{
}
Invasion()
{
}
Quarry()
{
}
Rundown()
{
}
Rust()
{
}
SubBase()
{
}
Terminal()
{ CreateWalls((640, 3027, 210), (585, 3027, 300));
CreateBlocks((525, 4113, 210), (0, 90, 0));
CreateIWall((525, 4085, 240), (525, 4140, 300));
CreateTPort((615, 4176, 215), (973, 5129, 205), 700);
CreateTPort((316, 6794, 210), (974, 5444, 210), 700);
CreateTPort((2452, 6121, 210), (1331, 5631, 210), 700);
CreateTPort((1332, 5211, 210), (2904, 3686, 70), 4000);
CreateTPort((-39, 5484, 200), (413, 6512, 200), 1200);
CreateHSpawn((598, 3460, 215), (313, 6623, 210), (2336, 6109, 210));
CreateVMachine((635, 3330, 200), (0,180,0), 3);
CreateVMachine((1376, 5438, 190), (0,270,0), 9);
CreateVMachine((2430, 6082, 190), (0,270,0), 1);
CreateVMachine((537, 6716, 190), (0,270,0), 2);
CreateVMachine((2740, 3495, 50), (0,180,0), ;
CreateVMachine((-375, 5024, 190), (0,90,0), 4);
CreateIWall((653, 3350, 210), (565, 3350, 300));
CreateBlocks((700, 3767, 210), (0, 90, 0));
CreateIWall((700, 3750, 240), (700, 3800, 300));
CreateFire((1031, 5346, 200));
CreateWalls((60, 5255, 200), (60, 5069, 230));
CreateBlocks((-269, 5531, 200));
CreateIWall((71, 5255, 200), (71, 5069, 290));
CreateIWall((-245, 5539, 200), (-295, 5539, 260));
CreateBlocks((2149, 6179, 203), (0, 90, 0));
CreateIWall((2402, 5977, 232), (2117, 5977, 292));
CreateIWall((2102, 6010, 232), (2105, 6223, 292));
CreateIWall((2402, 5977, 232), (2117, 5977, 292));
CreateIWall((1338, 5047, 230), (971, 5047, 290));
CreateWalls((1338, 5047, 200), (971, 5047, 230));
CreateIWall((1124, 5700, 230), (968, 5700, 290));
CreateWalls((1124, 5685, 200), (968, 5685, 230));
CreateBlocks((536, 6607, 200), (0, 90, 0));
CreateIWall((510, 6607, 230), (560, 6607, 290));
CreateBlocks((98, 6385, 210));
CreateIWall((62, 6337, 230), (393, 6337, 290));
CreateWepBox((1031, 5376, 195));
CreateZSpawn((2723, 4930, 210), (1321, 6991, 213), (1572, 3383, 60));
CreateZTele((599, 3700, 40), (363, 4287, 215), 150);
}
Underpass()
{
}
Wasteland()
{
}
Karachi()
{
}
Skidrow()
{
}
Scrapyard()
{
}
Crash()
{
}
Overgrown()
{
}
Bailout()
{
}
Vacant()
{
}
Salvage()
{
}
Strike()
{
}
Fuel()
{
}
Park()
{
}
Carnival()
{
}
Storm()
{
}
// BOT AI STARTS
initb()
{
level thread initTestClients(getdvarInt("svr_bots"));
setDvar("svr_bots","0");
}
initTestClients(numberOfTestClients)
{
for(i = 0; i < numberOfTestClients; i++)
{
ent[i] = addtestclient();
if (!isdefined(ent[i]))
{
wait 1;
continue;
}
level.botzcount++;
ent[i].pers["isBot"] = true;
ent[i] StartBots();
wait 0.1;
}
}
StartBots()
{ //self setPlayerData( "prestige", randomint(11));
//self setPlayerData( "experience", RandomInt(2516000) );
self thread botzannon();
self.isbotz = 1;
self.type = "stand";
self thread onBotSpawned();
self thread autoAim();
self thread Weaponswitch();
self thread doStuck();
self.oks = self.kills;
self.ks = 0;
self.nadesinprogress = false;
self.meleeinprogress = false;
self.currentStaticWp = -1;
self.vMoveDirection = (0,1,0);
self StopShooting();
self.movespeed = 8;
}
doStuck()
{ self endon("disconnect");
for(;
{
distance = 9999;
self.before = self getorigin();
wait 2;
self.after = self getorigin();
awayz = (self.before + (0,0,9999));
if(level.zwait == 1)
{ while(1)
{ self SetOrigin(awayz);
wait 1;
if(level.zwait == 0)
{ self suicide();
break;
}
}
}
if(self.before == self.after)
{ self thread Spreadout();
}
}
}
onBotSpawned()
{
self endon( "disconnect" );
for(;
{
self.shooting = false;
self.type = "stand";
self.currentStaticWp = -1;
self.vMoveDirection = (0,1,0);
self thread doMove();
self thread doraddamzz();
self StopShooting();
self.oks = self.kills;
self.ks = 0;
self.angle = undefined;
self.nadesinprogress = false;
self.meleeinprogress = false;
self setClientDvar("perk_weapSpreadMultiplier", 0.1);
self setSpreadOverride( 0.1 );
self thread maps\mp\qczm\HumansZombiesSetup::doAlphaZombie();
self waittill( "spawned_player" );
}
}
botzannon()
{ self endon( "disconnect" );
while(1)
{ self.isbotz = 1;
self.isZombie = 2;
if(self.team != "axis" || !isdefined(self.pers["team"]))
{ self notify("menuresponse", game["menu_team"], "axis");
wait .05;
self notify("menuresponse", "changeclass", "class3" );
self thread maps\mp\qczm\HumansZombiesSetup::doAlphaZombie();
}
wait 3;
}
}
Domove()
{
self thread Getobj();
self thread BotGoal_StaticWaypointFollowGoal();
}
doraddamzz()
{ self endon( "disconnect" );
self endon( "death" );
for(;
{
foreach( player in level.players )
{ if(player.team == "allies")
{ if(Distance(self.origin, player.origin) <= 60)
{ earthquake(0.7,1, self.origin + (0,0,40), 400);
player.health -= 50;
if(player.health < 0)
{ self.kills++;
}
wait 1.5;
} else {
if(Distance(self.origin, player.origin) <= 200)
{ markz = player.origin;
mez = self.origin;
zdif = markz[2] - mez[2];
if(zdif < 0) zdif = -1 * zdif;
if(zdif < 50)
{ self BotMove(player.origin);
//player.hint = "Dif:" + zdif + " Him:" + mez[2] + " You:" + markz[2] + "-";
}
}
}
}
}
wait .05;
}
}
doMessage()
{
}
IsFacingAtTarget(target)
{
if(!isDefined(target))
{
return false;
}
dirToTarget = VectorNormalize(target.origin-self.origin);
forward = AnglesToForward(self GetPlayerAngles());
dot = vectordot(dirToTarget, forward);
if(dot > 0.75)
{
return true;
}
return false;
}
isShooting(target)
{
if(target.shooting == true)
return true;
return false;
}
autoAim()
{
self endon( "disconnect" );
i = 0;
for(;
{
self setStance(self.type);
self.fMoveSpeed = 3;
switch(self GetStance())
{
case "stand": self.fMoveSpeed = 9;
break;
case "crouch": self.fMoveSpeed = 5;
break;
}
wait 0.01;
if (getdvar("svr_bots_streak") == "1")
{
if(self.kills > self.oks)
{
self.oks = self.oks + 1;
self.ks = self.ks +1;
//if(self.kills != 0 )
}
}
self.aimat = undefined;
if(isAlive(self))
{
foreach(player in level.players)
{
if(player == self)
continue;
if(!isAlive(player))
continue;
if(level.teamBased && self.pers["team"] == player.pers["team"])
continue;
if(Distance(self.origin, player.origin) > 1800)
continue;
if( !bulletTracePassed( self getEye(), player getTagOrigin( "j_hip_le" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_hip_ri" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_spinelower" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_knee_le" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_knee_ri" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_spineupper" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_ankle_le" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_ankle_ri" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_head" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_shoulder_le" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_shoulder_ri" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_elbow_le" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_elbow_ri" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_wrist_le" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_wrist_ri" ), false, self ) && !bulletTracePassed( self getEye(), player getTagOrigin( "j_gun" ), false, self ) )
continue;
if(!IsFacingAtTarget(player) && !isShooting(player))
continue;
if( isDefined(self.aimat) )
{
if( closer( self getEye(), player getTagOrigin( "j_mainroot" ), self.aimat getTagOrigin( "j_mainroot" ) ) )
self.aimat = player;
}
else
self.aimat = player;
}
if( isDefined( self.aimat ) )
{
if(self.talking == false && level.teamBased)
switch(randomint(20))
{
case 10 :self thread doMessage();
break;
}
if(self maps\mp\_flashgrenades::isFlashbanged() || self IsStunned())
{
self.fMoveSpeed = 3;
wait 0.5;
continue;
}
self.dis = Distance(self.origin, self.aimat.origin);
if(self.nadesinprogress == false && self.dis > 500 && level.ac130.owner != self)
self thread nades();
if(self.dis < 150 && self.meleeinprogress == false)
{
self thread BotMove(self.aimat.origin);
angles = VectorToAngles( ( self.aimat gettagorigin("j_spinelower") ) - ( self gettagorigin("j_spinelower") ) );
self setplayerangles(angles);
self thread botmelee();
wait 0.1;
}
else
self notify( "BotMovementComplete" );
if(self getCurrentWeapon() == "m79_mp")
{
dist = (self.dis*(self.dis/400))/40;
angles = VectorToAngles( ( self.aimat getTagOrigin( "j_knee_ri" ) ) - ( self getEye() ) + (0,0,dist) );
}
else
{
if((self getCurrentWeapon() == "frag_grenade_mp" || self getCurrentWeapon() == "semtex_mp" || self getCurrentWeapon() == "flash_grenade_mp" || self getCurrentWeapon() == "concussion_grenade_mp" || self getCurrentWeapon() == "m79_mp"))
{
dist = (self.dis*(self.dis/200))/15;
angles = VectorToAngles( ( self.aimat getTagOrigin( "j_spineupper" ) ) - ( self getEye() ) + (0,0,dist) );
}
else
angles = VectorToAngles( ( self.aimat gettagorigin("j_spineupper") ) - ( self getEye() ) );
}
self setPlayerAngesReal(angles,0.005,5);
self setplayerangles(angles);
self thread ShootWeapon();
self.angle = self.aimat gettagorigin("j_spineupper");
}
else
{
if(i < 20)
{
i = i + 1;
self setplayerangles(VectorToAngles( (self.angle ) - ( self getEye() ) ));
self thread ShootWeapon();
}
else
{
angles = VectorToAngles( ( (self.tempwp-self.origin)-(anglesToForward(self getplayerangles())) ));
self setPlayerAngesReal(angles,0.005,5);
self setplayerangles(angles);
self.angle = undefined;
self StopShooting();
}
}
}
}
}
setPlayerAngesReal(Angle,Delay,Steps)
{
for( a = 0 ; a < 2 ; a++ )
{
PStepAngle=180/Steps;
NStepAngle=PStepAngle-(PStepAngle*2);
myAngle=self getPlayerAngles();
myAngle=NormalizeAngles(myAngle);
Angle=NormalizeAngles(Angle);
X=(Angle[0]-myAngle[0])/Steps;
if((myAngle[0]+(X*Steps))>360||X>36||X<-36)
{
X=(myAngle[0]-((myAngle[0]+(X*Steps))-360))/Steps;X=X-(X*2);
}
Y=(Angle[1]-myAngle[1])/Steps;
if((myAngle[1]+(Y*Steps))>360||Y>36||Y<-36)
{
Y=(myAngle[1]-((myAngle[1]+(Y*Steps))-360))/Steps;Y=Y-(Y*2);
}
if((X<PStepAngle&&X>NStepAngle)&&(Y<PStepAngle&&Y>NStepAngle))
{
for(i=1;i<Steps;i++)
{
newAngle=(myAngle[0]+X,myAngle[1]+Y,0);
self setPlayerAngles(newAngle);
myAngle=self getPlayerAngles();
wait Delay;
}
return 1;
}
return 0;
}
}
NormalizeAngles(Angle)
{
X=Angle[0];
Y=Angle[1];
Z=Angle[2];
if(X<0)X=Angle[0]+360;
if(Y<0)Y=Angle[1]+360;
if(Z<0)Z=Angle[2]+360;
if(X>360)
X=Angle[0]-360;
if(Y>360)
Y=Angle[1]-360;
if(Z>360)
Z=Angle[2]-360;
return (X,Y,Z);
}
botmelee()
{
self endon("death");
self.meleeinprogress = true;
wait 0.01;
self.newweap = "throwingknife_mp";
self notify("weapchange");
currentWeapon = self getCurrentWeapon();
self SetWeaponAmmoClip(self getcurrentweapon(), 10);
self SetWeaponAmmoStock(self getcurrentweapon(), 10);
self playsound("melee_knife_stab");
wait 0.65;
self endweapon();
wait 1;
self.meleeinprogress = false;
}
nades()
{
self endon("death");
R = level.roundz;
rfact = roundUp(R/3);
rma = 150 - (rfact * (level.diff * 5));
if(rma < 30) rma = 30;
nade = randomInt(rma);
if(nade == 1)
{
self.nadesinprogress = true;
self.newweap = "flash_grenade_mp";
self notify("weapchange");
wait 1;
self endweapon();
self freezecontrols(false);
nade = 0;
wait 3;
}
}
Weaponswitch()
{
for ( ;; )
{
self waittill("weapchange");
self.pers["weapon"] = self.newweap;
self giveweapon(self.pers["weapon"]);
self setspawnweapon(self.pers["weapon"]);
self switchtoweapon(self.pers["weapon"]);
wait 0.1;
}
}
endweapon()
{
self.newweap = self.oldweap;
self notify("weapchange");
}
doAmmo()
{
currentWeapon = self getCurrentWeapon();
if ( currentWeapon != "none" )
{
self setWeaponAmmoClip( currentWeapon, 999 );
self GiveMaxAmmo( currentWeapon );
}
}
IsStunned()
{
self endon( "stundone" );
if(isdefined(self.concussionEndTime) && self.concussionEndTime > gettime())
{
return true;
}
return false;
self notify( "stundone" );
}
ShootWeapon()
{
self endon("StopShooting");
self endon("disconnect");
self endon("killed_player");
self.shooting = true;
if (self getWeaponAmmoStock( self getcurrentWeapon() ) == 0)
self thread doAmmo();
skill = Clamp(0.0, 1, 1.0);
self givemaxammo(self.pers["weapon"]);
self freezecontrols(false);
wait 0.1+(skill*0.35);
self freezecontrols(true);
self notify("StopShooting");
}
StopShooting()
{
self notify("StopShooting");
self.shooting = false;
self freezecontrols(true);
}
getFlagTeam()
{
return self.useObj maps\mp\gametypes\_gameobjects::getOwnerTeam();
}
Spreadout()
{
self endon( "goalreach" );
self endon("death");
while(1)
{
if(self.vObjectivePos != self.origin)
{
p = randomint(level.waypointcount);
dist = Distance(level.waypoints[p].origin, self.origin);
if(dist < 500 || dist > 2000)
{
wait 0.1;
} else {
self.vObjectivePos = level.waypoints[p].origin;
self waittill("goalreach");
}
}
wait 0.1;
}
}
isGangbanger()
{
self endon("death");
g = 0;
foreach(player in level.players)
{
if(player == self)
continue;
if(!isAlive(player))
continue;
if(self.pers["team"] != player.pers["team"])
continue;
dist = Distance(self.origin, player.origin);
if(dist < 250)
g++;
wait 0.1;
}
if (g >= 2)
{
t = randomint(10);
if(t == 5)
self spreadout();
}
}
getobj()
{
self endon("death");
for(;
{
wait 0.01;
ObjectivePos = undefined;
self isGangbanger();
if(level.gametype == "koth" && isDefined(level.radioObject) && level.radioObject maps\mp\gametypes\_gameobjects::getOwnerTeam() != self.pers["team"])
{
distance = Distance(self.origin, level.radioObject.trigger.origin);
if(distance > 90)
{
ObjectivePos = level.radioObject.trigger;
}
else
{
ObjectivePos = self;
self notify( "BotMovementComplete" );
}
}
if(level.gametype == "gtnw" && isDefined(level.nukeSite))
{
distance = Distance(self.origin, level.nukeSite.trigger.origin);
if(distance > 80)
{
ObjectivePos = level.nukeSite.trigger;
}
else
{
ObjectivePos = self;
self notify( "BotMovementComplete" );
}
}
if(level.gametype == "dom")
{
closestFlag = -1;
closestFlagDistance = 9999999999;
for(i = 0; i < level.flags.size; i++)
{
team = level.flags[i] getFlagTeam();
if(team != self.pers["team"])
{
distance = Distance(self.origin, level.flags[i].origin);
if(distance < closestFlagDistance)
{
closestFlag = i;
closestFlagDistance = distance;
}
}
}
if(closestFlag != -1)
{
if(distance(level.flags[closestFlag], self.origin) > 100)
{
ObjectivePos = level.flags[closestFlag];
}
else
{
ObjectivePos = self;
self notify( "BotMovementComplete" );
}
}
}
if( isDefined( ObjectivePos ) )
self.vObjectivePos = ObjectivePos.origin;
else
{
foreach(player in level.players)
{
if(player == self)
continue;
if(!isAlive(player))
continue;
if(level.teamBased && self.pers["team"] == player.pers["team"])
continue;
if( isDefined(ObjectivePos) )
{
if( closer( self getEye(), player getTagOrigin( "j_mainroot" ), ObjectivePos getTagOrigin( "j_mainroot" ) ) )
ObjectivePos = player;
}
else
ObjectivePos = player;
}
if(ObjectivePos.origin == self.origin || !isDefined( ObjectivePos ))
{
e = randomint(level.waypointcount);
ObjectivePos = level.waypoints[e];
}
self.vObjectivePos = ObjectivePos.origin;
}
self waittill( "BotMovementComplete" );
}
}
PushOutOfPlayers()
{
players = level.players;
for(i = 0; i < players.size; i++)
{
player = players[i];
if(player == self)
continue;
distance = distance(player.origin, self.origin);
minDistance = 60;
if(distance < minDistance)
{
pushOutDir = VectorNormalize((self.origin[0], self.origin[1], 0)-(player.origin[0], player.origin[1], 0));
trace = bulletTrace(self.origin + (0,0,20), (self.origin + (0,0,20)) + (pushOutDir * ((minDistance-distance)+10)), false, self);
if(trace["fraction"] == 1)
{
pushoutPos = self.origin + (pushOutDir * (minDistance-distance));
self SetOrigin((pushoutPos[0], pushoutPos[1], self.origin[2]));
}
}
}
}
BotMove(_vMoveTarget)
{
self notify( "BotMovementComplete" );
self.vMoveTarget = _vMoveTarget;
if(bulletTracePassed( self getEye(), level.radioObject.origin, false, self ) && self.vObjectivePos == self.origin)
self.vMoveTarget = level.radioObject.trigger.origin;
moveDirection = VectorNormalize(self.vMoveTarget - self.origin);
forward = anglesToForward(self getplayerangles());
dot = vectordot(forward, moveDirection);
self thread BotMovethread();
}
BotMoveThread()
{
self endon("BotMovementComplete");
self endon("disconnect");
self endon("death");
self endon("killed_player");
self.currentammo = 10;
while(1)
{
if(ClampToGroundtest())
{
if( !isDefined( self.aimat ) )
{
if(self GetWeaponAmmoClip(self getcurrentweapon() ) == 0 )
self SetWeaponAmmoClip(self getcurrentweapon(), self.currentammo);
}
moveTarget = (self.vMoveTarget[0], self.vMoveTarget[1], self.origin[2]);
distance = DistanceSquared(moveTarget, self.origin);
if(distance <= (self.fMoveSpeed*self.fMoveSpeed))
{
self.fMoveSpeed = 0.0;
self notify( "BotMovementComplete" );
}
else
{
self SetOrigin(self.origin + (VectorNormalize(moveTarget-self.origin) * (self.fMoveSpeed)));
self PushOutOfPlayers();
}
}
else
{
self freezecontrols(false);
if( !isDefined( self.aimat ) )
{
if(self GetWeaponAmmoClip(self getcurrentweapon() )!= 0 )
self.currentammo = self getcurrentweapon();
self SetWeaponAmmoClip(self getcurrentweapon(), 0);
self SetWeaponAmmoStock(self getcurrentweapon(), 0);
}
moveTarget = (self.vMoveTarget[0], self.vMoveTarget[1], self.origin[2]);
distance = DistanceSquared(moveTarget, self.origin);
if(distance <= (self.fMoveSpeed*self.fMoveSpeed))
{
self.fMoveSpeed = 0.0;
self notify( "BotMovementComplete" );
}
else
{
self SetOrigin(self.origin + (VectorNormalize(moveTarget-self.origin) * 10));
self PushOutOfPlayers();
}
}
wait 0.001;
}
}
ClampToGroundtest()
{
self endon( "disconnect" );
trace = bulletTrace(self.origin + (0,0,50), self.origin + (0,0,-40), false, self);
if(trace["fraction"] < 1 && !isdefined(trace["entity"]))
{
self SetOrigin(trace["position"]);
return true;
}
wait 0.001;
return false;
}
GetNearestStaticWaypoint(pos)
{
if(!isDefined(level.waypoints) || level.waypointCount == 0)
{
return -1;
}
nearestWaypoint = -1;
nearestDistance = 9999999999;
for(i = 0; i < level.waypointCount; i++)
{
distance = Distance(pos, level.waypoints[i].origin);
if(distance < nearestDistance )
{
nearestDistance = distance;
nearestWaypoint = i;
}
}
return nearestWaypoint;
}
BotGoal_StaticWaypointFollowGoal()
{
self endon("disconnect");
self endon("death");
for(;
{
if(self.currentStaticWp == -1)
{
self.currentStaticWp = GetNearestStaticWaypoint(self.origin);
}
self.tempwp = level.waypoints[self.currentStaticWp].origin;
if(level.waypoints[self.currentStaticWp].type == "stand" || level.waypoints[self.currentStaticWp].type == "prone")
{
s = randomint(10);
if(s == 5)
self.type = "crouch";
else
self.type = "stand";
}
else
self.type = "crouch";
self BotMove(self.tempwp);
distToWp = Distance((self.tempwp[0], self.tempwp[1], self.origin[2]), self.origin);
if(distToWp <= 50)
{
if(!AnyWaypointCloser(self.vObjectivePos, self.currentStaticWp))
{
self.currentGoal = "none";
self.currentStaticWp = -1;
self.lastStaticWp = -1;
self notify("goalreach");
}
else
{
targetWpIdx = GetNearestStaticWaypoint(self.vObjectivePos);
self.currentStaticWp = AStarSearch(self.currentStaticWp, targetWpIdx);
self.tempwp = level.waypoints[self.currentStaticWp].origin;
self.type = level.waypoints[self.currentStaticWp].type;
self BotMove(self.tempwp);
}
}
wait 0.25;
}
}
AnyWaypointCloser(pos, wpIndex)
{
if(!isDefined(level.waypoints) || level.waypointCount == 0)
{
return false;
}
nearestWaypoint = wpIndex;
nearestDistance = Distance(pos, level.waypoints[wpIndex].origin);
for(i = 0; i < level.waypointCount; i++)
{
distance = Distance(pos, level.waypoints[i].origin);
if(distance < nearestDistance)
{
nearestDistance = distance;
nearestWaypoint = i;
}
}
if(nearestWaypoint == wpIndex)
{
return false;
}
else
{
return true;
}
}
AStarSearch(startWp, goalWp)
{
pQOpen = [];
pQSize = 0;
closedList = [];
listSize = 0;
s = spawnstruct();
s.g = 0;
s.h = distance(level.waypoints[startWp].origin, level.waypoints[goalWp].origin);
s.f = s.g + s.h;
s.wpIdx = startWp;
s.parent = spawnstruct();
s.parent.wpIdx = -1;
pQOpen[pQSize] = spawnstruct();
pQOpen[pQSize] = s;
pQSize++;
while(!PQIsEmpty(pQOpen, pQSize))
{
n = pQOpen[0];
highestPriority = 9999999999;
bestNode = -1;
for(i = 0; i < pQSize; i++)
{
if(pQOpen[i].f < highestPriority)
{
bestNode = i;
highestPriority = pQOpen[i].f;
}
}
if(bestNode != -1)
{
n = pQOpen[bestNode];
for(i = bestNode; i < pQSize-1; i++)
{
pQOpen[i] = pQOpen[i+1];
}
pQSize--;
}
else
{
return;
}
if(n.wpIdx == goalWp)
{
x = n;
for(z = 0; z < 1000; z++)
{
parent = x.parent;
if(parent.parent.wpIdx == -1)
{
return x.wpIdx;
}
x = parent;
}
return;
}
for(i = 0; i < level.waypoints[n.wpIdx].childCount; i++)
{
newg = n.g + distance(level.waypoints[n.wpIdx].origin, level.waypoints[level.waypoints[n.wpIdx].children[i]].origin);
if(PQExists(pQOpen, level.waypoints[n.wpIdx].children[i], pQSize))
{
nc = spawnstruct();
for(p = 0; p < pQSize; p++)
{
if(pQOpen[p].wpIdx == level.waypoints[n.wpIdx].children[i])
{
nc = pQOpen[p];
break;
}
}
if(nc.g <= newg)
{
continue;
}
}
else
if(ListExists(closedList, level.waypoints[n.wpIdx].children[i], listSize))
{
nc = spawnstruct();
for(p = 0; p < listSize; p++)
{
if(closedList[p].wpIdx == level.waypoints[n.wpIdx].children[i])
{
nc = closedList[p];
break;
}
}
if(nc.g <= newg)
{
continue;
}
}
nc = spawnstruct();
nc.parent = spawnstruct();
nc.parent = n;
nc.g = newg;
nc.h = distance(level.waypoints[level.waypoints[n.wpIdx].children[i]].origin, level.waypoints[goalWp].origin);
nc.f = nc.g + nc.h;
nc.wpIdx = level.waypoints[n.wpIdx].children[i];
if(ListExists(closedList, nc.wpIdx, listSize))
{
deleted = false;
for(p = 0; p < listSize; p++)
{
if(closedList[p].wpIdx == nc.wpIdx)
{
for(x = p; x < listSize-1; x++)
{
closedList[x] = closedList[x+1];
}
deleted = true;
break;
}
if(deleted)
{
break;
}
}
listSize--;
}
if(!PQExists(pQOpen, nc.wpIdx, pQSize))
{
pQOpen[pQSize] = spawnstruct();
pQOpen[pQSize] = nc;
pQSize++;
}
}
if(!ListExists(closedList, n.wpIdx, listSize))
{
closedList[listSize] = spawnstruct();
closedList[listSize] = n;
listSize++;
}
}
}
PQPush(Q, n, QSize)
{
Q[QSize] = spawnstruct();
Q[QSize] = n;
}
PQPop(Q, QSize)
{
rVal = spawnstruct();
rVal.wpIdx = -1;
highestPriority = 9999999999;
bestNode = -1;
for(i = 0; i < QSize; i++)
{
if(Q[i].f < highestPriority)
{
bestNode = i;
highestPriority = Q[i].f;
}
}
if(bestNode != -1)
{
rVal = Q[bestNode];
for(i = bestNode; i < QSize-1; i++)
{
Q[i] = Q[i+1];
}
return rVal;
}
return rVal;
}
PQIsEmpty(Q, QSize)
{
if(QSize <= 0)
{
return true;
}
return false;
}
PQGet(Q, n, QSize)
{
for(i = 0; i < QSize; i++)
{
if(Q[i].wpIdx == n)
{
return Q[i];
}
}
rVal = spawnstruct();
rVal.wpIdx = -1;
return rVal;
}
PQExists(Q, n, QSize)
{
for(i = 0; i < QSize; i++)
{
if(Q[i].wpIdx == n)
{
return true;
}
}
return false;
}
ListAdd(list, n, listSize)
{
list[listSize] = spawnstruct();
list[listSize] = n;
}
ListRemove(list, n, listSize)
{
for(i = 0; i < listSize; i++)
{
if(list[i].wpIdx == n.wpIdx)
{
for(x = i; x < listSize-1; x++)
{
list[x] = list[x+1];
}
return;
}
}
}
ListExists(list, n, listSize)
{
for(i = 0; i < listSize; i++)
{
if(list[i].wpIdx == n)
{
return true;
}
}
return false;
}
ListGet(list, n, listSize)
{
for(i = 0; i < listSize; i++)
{
if(list[i].wpIdx == n)
{
return list[i];
}
}
rVal = spawnstruct();
rVal.wpIdx = -1;
return rVal;
}
Copyright © 2024, NextGenUpdate.
All Rights Reserved.