mirror of
https://git.code.sf.net/p/quake/game-source
synced 2024-11-24 21:02:06 +00:00
Stuff. Lots of stuff. Possibly buggy stuff. No shaking shamblers at it.
This commit is contained in:
parent
819688576d
commit
40b262b9ee
15 changed files with 1978 additions and 1933 deletions
512
fbxa/bot.qc
512
fbxa/bot.qc
|
@ -95,18 +95,27 @@ void() bot_map_load =
|
|||
{
|
||||
// place your qc loaded waypoints here
|
||||
|
||||
if (mapname == "dm1")
|
||||
map_dm1();
|
||||
else if (mapname == "dm2")
|
||||
map_dm2();
|
||||
else if (mapname == "dm3")
|
||||
map_dm3();
|
||||
else if (mapname == "dm4")
|
||||
map_dm4();
|
||||
else if (mapname == "dm5")
|
||||
map_dm5();
|
||||
else if (mapname == "dm6")
|
||||
map_dm6();
|
||||
switch (mapname) {
|
||||
case "dm1":
|
||||
map_dm1 ();
|
||||
break;
|
||||
case "dm2":
|
||||
map_dm2 ();
|
||||
break;
|
||||
case "dm3":
|
||||
map_dm3 ();
|
||||
break;
|
||||
case "dm4":
|
||||
map_dm4 ();
|
||||
break;
|
||||
case "dm5":
|
||||
map_dm5 ();
|
||||
break;
|
||||
case "dm6":
|
||||
map_dm6 ();
|
||||
default:
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -182,7 +191,6 @@ float AI_ROUTE_FAILED = 2;
|
|||
float AI_WAIT = 4;
|
||||
float AI_DANGER = 8;
|
||||
|
||||
|
||||
// addition masks
|
||||
float AI_POINT_TYPES = 29152;
|
||||
float AI_READAHEAD_TYPES = 36528;
|
||||
|
@ -196,7 +204,6 @@ float WM_EDITOR = 4;
|
|||
float WM_EDITOR_DYNAMIC = 5;
|
||||
float WM_EDITOR_DYNLINK = 6;
|
||||
|
||||
|
||||
float OPT_SAVEBOTS = 1;
|
||||
float OPT_NOCHAT = 2;
|
||||
|
||||
|
@ -271,13 +278,11 @@ float(float v) frik_anglemod;
|
|||
void() bot_chat;
|
||||
void(float tpic) bot_start_topic;
|
||||
|
||||
|
||||
// editor stuffs
|
||||
|
||||
void() bot_way_edit;
|
||||
void() bot_menu_display;
|
||||
|
||||
|
||||
// ----------Commands---------
|
||||
void(entity e, float chan, string samp, float vol, float atten) frik_sound = #8;
|
||||
void(entity client, string s) frik_stuffcmd = #21;
|
||||
|
@ -316,13 +321,13 @@ direct messages to the bots, it crashes quake :-(
|
|||
void(entity client, string s) stuffcmd =
|
||||
{
|
||||
if (client.ishuman == 1)
|
||||
frik_stuffcmd(client, s);
|
||||
frik_stuffcmd (client, s);
|
||||
b_temp1 = player_head;
|
||||
|
||||
while(b_temp1) {
|
||||
while (b_temp1) {
|
||||
if (b_temp1.classname == "botcam") {
|
||||
if ((b_temp1.enemy == client) && b_temp1.ishuman)
|
||||
frik_stuffcmd(b_temp1, s);
|
||||
frik_stuffcmd (b_temp1, s);
|
||||
}
|
||||
b_temp1 = b_temp1._next;
|
||||
}
|
||||
|
@ -334,26 +339,26 @@ void(entity e) setspawnparms =
|
|||
frik_setspawnparms(e);
|
||||
else {
|
||||
b_temp1 = player_head;
|
||||
while(b_temp1) {
|
||||
while (b_temp1) {
|
||||
if (b_temp1.ishuman) {
|
||||
frik_setspawnparms(b_temp1);
|
||||
frik_setspawnparms (b_temp1);
|
||||
return;
|
||||
}
|
||||
b_temp1 = b_temp1._next;
|
||||
}
|
||||
SetNewParms();
|
||||
SetNewParms ();
|
||||
}
|
||||
};
|
||||
void(entity client, string s) sprint =
|
||||
{
|
||||
if (client.ishuman == 1)
|
||||
frik_sprint(client, s);
|
||||
frik_sprint (client, s);
|
||||
b_temp1 = player_head;
|
||||
|
||||
while(b_temp1) {
|
||||
while (b_temp1) {
|
||||
if (b_temp1.classname == "botcam") {
|
||||
if ((b_temp1.enemy == client) && b_temp1.ishuman)
|
||||
frik_sprint(b_temp1, s);
|
||||
frik_sprint (b_temp1, s);
|
||||
}
|
||||
b_temp1 = b_temp1._next;
|
||||
}
|
||||
|
@ -362,13 +367,13 @@ void(entity client, string s) sprint =
|
|||
void(entity client, string s) centerprint =
|
||||
{
|
||||
if (client.ishuman == 1)
|
||||
frik_centerprint(client, s);
|
||||
frik_centerprint (client, s);
|
||||
b_temp1 = player_head;
|
||||
|
||||
while(b_temp1) {
|
||||
while (b_temp1) {
|
||||
if (b_temp1.classname == "botcam") {
|
||||
if ((b_temp1.enemy == client) && b_temp1.ishuman)
|
||||
frik_centerprint(b_temp1, s);
|
||||
frik_centerprint (b_temp1, s);
|
||||
}
|
||||
b_temp1 = b_temp1._next;
|
||||
}
|
||||
|
@ -377,69 +382,77 @@ void(entity client, string s) centerprint =
|
|||
vector(entity e, float sped) aim =
|
||||
{
|
||||
e.missile_speed = sped;
|
||||
return frik_aim(e, sped);
|
||||
return frik_aim (e, sped);
|
||||
};
|
||||
|
||||
void(entity e, float chan, string samp, float vol, float atten) sound =
|
||||
{
|
||||
|
||||
frik_sound(e, chan, samp, vol, atten);
|
||||
frik_sound (e, chan, samp, vol, atten);
|
||||
if (samp == "items/inv3.wav")
|
||||
return;
|
||||
else if (e.classname == "player")
|
||||
e.b_sound = time + 1;
|
||||
else if (other.classname == "player")
|
||||
other.b_sound = time + 1;
|
||||
|
||||
};
|
||||
|
||||
void(float to, float f) WriteByte =
|
||||
{
|
||||
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
|
||||
return;
|
||||
frik_WriteByte(to, f);
|
||||
frik_WriteByte (to, f);
|
||||
};
|
||||
|
||||
void(float to, float f) WriteChar =
|
||||
{
|
||||
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
|
||||
return;
|
||||
frik_WriteChar(to, f);
|
||||
frik_WriteChar (to, f);
|
||||
};
|
||||
|
||||
void(float to, float f) WriteShort =
|
||||
{
|
||||
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
|
||||
return;
|
||||
frik_WriteShort(to, f);
|
||||
frik_WriteShort (to, f);
|
||||
};
|
||||
|
||||
void(float to, float f) WriteLong =
|
||||
{
|
||||
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
|
||||
return;
|
||||
frik_WriteLong(to, f);
|
||||
frik_WriteLong (to, f);
|
||||
};
|
||||
|
||||
void(float to, float f) WriteCoord =
|
||||
{
|
||||
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
|
||||
return;
|
||||
frik_WriteCoord(to, f);
|
||||
frik_WriteCoord (to, f);
|
||||
};
|
||||
|
||||
void(float to, float f) WriteAngle =
|
||||
{
|
||||
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
|
||||
return;
|
||||
frik_WriteAngle(to, f);
|
||||
frik_WriteAngle (to, f);
|
||||
};
|
||||
|
||||
void(float to, string s) WriteString =
|
||||
{
|
||||
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
|
||||
return;
|
||||
frik_WriteString(to, s);
|
||||
frik_WriteString (to, s);
|
||||
};
|
||||
|
||||
void(float to, entity s) WriteEntity =
|
||||
{
|
||||
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
|
||||
return;
|
||||
frik_WriteEntity(to, s);
|
||||
frik_WriteEntity (to, s);
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -447,12 +460,12 @@ Bot Cam, see what the bot sees (or any other player)
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
float() botcam =
|
||||
{
|
||||
if (self.classname != "botcam")
|
||||
return FALSE;
|
||||
setorigin(self, self.enemy.origin);
|
||||
|
||||
setorigin (self, self.enemy.origin);
|
||||
self.items = self.enemy.items;
|
||||
self.weapon = self.enemy.weapon;
|
||||
self.weaponmodel = self.enemy.weaponmodel;
|
||||
|
@ -471,22 +484,20 @@ float() botcam =
|
|||
self.punchangle = self.enemy.punchangle;
|
||||
self.deadflag = self.enemy.deadflag;
|
||||
msg_entity = self;
|
||||
WriteByte (MSG_ONE,5);
|
||||
WriteByte (MSG_ONE, 5);
|
||||
WriteEntity (MSG_ONE, self.enemy);
|
||||
WriteByte (MSG_ONE, 10);
|
||||
WriteAngle (MSG_ONE,self.enemy.v_angle_x);
|
||||
WriteAngle (MSG_ONE,self.enemy.v_angle_y);
|
||||
WriteAngle (MSG_ONE,self.enemy.v_angle_z);
|
||||
WriteAngle (MSG_ONE, self.enemy.v_angle_x);
|
||||
WriteAngle (MSG_ONE, self.enemy.v_angle_y);
|
||||
WriteAngle (MSG_ONE, self.enemy.v_angle_z);
|
||||
self.modelindex = 0;
|
||||
|
||||
self.impulse = 0;
|
||||
return TRUE;
|
||||
|
||||
};
|
||||
|
||||
void() botcam_u =
|
||||
{
|
||||
|
||||
// sloppy cycling code
|
||||
if (self.classname != "botcam") {
|
||||
self.enemy = player_head;
|
||||
|
@ -506,26 +517,23 @@ void() botcam_u =
|
|||
self.movetype = MOVETYPE_NONE;
|
||||
self.takedamage = DAMAGE_NO;
|
||||
|
||||
|
||||
if (!self.enemy) {
|
||||
sprint(self, "No one left to track!\n");
|
||||
sprint (self, "No one left to track!\n");
|
||||
msg_entity = self;
|
||||
WriteByte (MSG_ONE,5);
|
||||
WriteEntity (MSG_ONE, self);
|
||||
PutClientInServer();
|
||||
PutClientInServer ();
|
||||
return;
|
||||
}
|
||||
if (!self.enemy.ishuman) {
|
||||
self.enemy.dmg_take = 0;
|
||||
self.enemy.dmg_save = 0;
|
||||
}
|
||||
sprint(self, "Now tracking ");
|
||||
sprint(self, self.enemy.netname);
|
||||
sprint(self, "\n");
|
||||
sprint (self, "Now tracking ");
|
||||
sprint (self, self.enemy.netname);
|
||||
sprint (self, "\n");
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -538,8 +546,10 @@ it just links the bot into the mod
|
|||
void() ClientFixRankings =
|
||||
{
|
||||
local float cno;
|
||||
|
||||
if (self.switch_wallhug > time)
|
||||
return;
|
||||
|
||||
self.switch_wallhug = 0;
|
||||
|
||||
b_temp2 = nextent(NIL);
|
||||
|
@ -556,6 +566,7 @@ void() ClientFixRankings =
|
|||
void() ClientInRankings =
|
||||
{
|
||||
local float cno;
|
||||
|
||||
if (player_head)
|
||||
player_head._last = self;
|
||||
|
||||
|
@ -576,14 +587,13 @@ void() ClientInRankings =
|
|||
}
|
||||
cno = self.colormap - 1;
|
||||
BotInvalidClientNo (cno);
|
||||
active_clients = active_clients | ClientBitFlag(cno);
|
||||
active_clients |= ClientBitFlag (cno);
|
||||
|
||||
self.b_clientno = cno;
|
||||
self.ishuman = TRUE;
|
||||
self.switch_wallhug = time + 1;
|
||||
};
|
||||
|
||||
|
||||
void() ClientDisconnected =
|
||||
{
|
||||
if (player_head == self)
|
||||
|
@ -593,8 +603,9 @@ void() ClientDisconnected =
|
|||
if (self._last)
|
||||
self._last._next = self._next;
|
||||
|
||||
active_clients = active_clients - active_clients & ClientBitFlag(self.b_clientno);
|
||||
active_clients &= ~(ClientBitFlag (self.b_clientno));
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -614,20 +625,19 @@ float () BotPreFrame =
|
|||
return TRUE;
|
||||
}
|
||||
if (self.b_frags != self.frags) {
|
||||
|
||||
if (self.b_frags > self.frags) {
|
||||
if (pointcontents(self.origin) == CONTENT_LAVA)
|
||||
bot_start_topic(10);
|
||||
if (pointcontents (self.origin) == CONTENT_LAVA)
|
||||
bot_start_topic (10);
|
||||
else
|
||||
bot_start_topic(9);
|
||||
}
|
||||
else
|
||||
bot_start_topic(2);
|
||||
bot_start_topic (9);
|
||||
} else
|
||||
bot_start_topic (2);
|
||||
self.b_frags = self.frags;
|
||||
}
|
||||
DynamicWaypoint();
|
||||
DynamicWaypoint ();
|
||||
return FALSE;
|
||||
};
|
||||
|
||||
float () BotPostFrame =
|
||||
{
|
||||
if (self.b_clientno == -1)
|
||||
|
@ -656,24 +666,26 @@ The rest of this code is in bot_misc.qc
|
|||
*/
|
||||
void(string h) BotSay = // simulate talking by composing a 'chat' message
|
||||
{
|
||||
WriteByte(MSG_ALL, 8);
|
||||
WriteByte(MSG_ALL, 1);
|
||||
WriteString(MSG_ALL, self.netname);
|
||||
WriteByte(MSG_ALL, 8);
|
||||
WriteByte(MSG_ALL, 2);
|
||||
WriteString(MSG_ALL, h);
|
||||
WriteByte (MSG_ALL, 8);
|
||||
WriteByte (MSG_ALL, 1);
|
||||
WriteString (MSG_ALL, self.netname);
|
||||
WriteByte (MSG_ALL, 8);
|
||||
WriteByte (MSG_ALL, 2);
|
||||
WriteString (MSG_ALL, h);
|
||||
};
|
||||
|
||||
void() BotSayInit =
|
||||
{
|
||||
WriteByte(MSG_ALL, 8);
|
||||
WriteByte(MSG_ALL, 1);
|
||||
WriteString(MSG_ALL, self.netname);
|
||||
WriteByte (MSG_ALL, 8);
|
||||
WriteByte (MSG_ALL, 1);
|
||||
WriteString (MSG_ALL, self.netname);
|
||||
};
|
||||
|
||||
void(string h) BotSay2 =
|
||||
{
|
||||
WriteByte(MSG_ALL, 8);
|
||||
WriteByte(MSG_ALL, 2);
|
||||
WriteString(MSG_ALL, h);
|
||||
WriteByte (MSG_ALL, 8);
|
||||
WriteByte (MSG_ALL, 2);
|
||||
WriteString (MSG_ALL, h);
|
||||
};
|
||||
void(string h) BotSayTeam =
|
||||
{
|
||||
|
@ -681,21 +693,22 @@ void(string h) BotSayTeam =
|
|||
if (!teamplay)
|
||||
return;
|
||||
t = player_head;
|
||||
while(t) {
|
||||
while (t) {
|
||||
if (t.team == self.team) {
|
||||
msg_entity = t;
|
||||
WriteByte(MSG_ONE, 8);
|
||||
WriteByte(MSG_ONE, 1);
|
||||
WriteByte(MSG_ONE, 40);
|
||||
WriteString(MSG_ONE, self.netname);
|
||||
WriteByte(MSG_ONE, 8);
|
||||
WriteByte(MSG_ONE, 2);
|
||||
WriteByte(MSG_ONE, 41);
|
||||
WriteString(MSG_ONE, h);
|
||||
WriteByte (MSG_ONE, 8);
|
||||
WriteByte (MSG_ONE, 1);
|
||||
WriteByte (MSG_ONE, 40);
|
||||
WriteString (MSG_ONE, self.netname);
|
||||
WriteByte (MSG_ONE, 8);
|
||||
WriteByte (MSG_ONE, 2);
|
||||
WriteByte (MSG_ONE, 41);
|
||||
WriteString (MSG_ONE, h);
|
||||
}
|
||||
t = t._next;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -703,28 +716,25 @@ BotInit
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
|
||||
void() BotInit =
|
||||
{
|
||||
local entity ent, fisent;
|
||||
local float numents;
|
||||
|
||||
// spawn entities for the physics
|
||||
ent = nextent(NIL);
|
||||
ent = nextent (NIL);
|
||||
max_clients = 0;
|
||||
|
||||
while(ent != NIL) {
|
||||
max_clients = max_clients + 1;
|
||||
ent = nextent(ent);
|
||||
while (ent != NIL) {
|
||||
max_clients++;
|
||||
ent = nextent (ent);
|
||||
}
|
||||
if (max_clients > 16)
|
||||
max_clients = 16;
|
||||
|
||||
ent = nextent(NIL);
|
||||
ent = nextent (NIL);
|
||||
fisent = NIL;
|
||||
while (numents < max_clients) {
|
||||
|
||||
phys_head = spawn();
|
||||
if (fisent)
|
||||
fisent._next = phys_head;
|
||||
|
@ -733,28 +743,27 @@ void() BotInit =
|
|||
ent.phys_obj = phys_head;
|
||||
phys_head.classname = "phys_obj";
|
||||
phys_head.owner = ent;
|
||||
numents = numents + 1;
|
||||
ent = nextent(ent);
|
||||
numents++;
|
||||
ent = nextent (ent);
|
||||
}
|
||||
precache_model("progs/s_light.spr");
|
||||
precache_model("progs/s_bubble.spr");
|
||||
precache_model ("progs/s_light.spr");
|
||||
precache_model ("progs/s_bubble.spr");
|
||||
// the bots return!
|
||||
b_options = cvar("saved1");
|
||||
b_options = cvar ("saved1");
|
||||
if (coop || (b_options & OPT_SAVEBOTS)) {
|
||||
saved_bots = cvar("scratch1");
|
||||
saved_skills1 = cvar("scratch2");
|
||||
saved_skills2 = cvar("scratch3");
|
||||
saved_bots = cvar ("scratch1");
|
||||
saved_skills1 = cvar ("scratch2");
|
||||
saved_skills2 = cvar ("scratch3");
|
||||
}
|
||||
cvar_set ("saved4", "0");
|
||||
if (max_clients > 1) {
|
||||
localcmd("exec maps/");
|
||||
localcmd(mapname);
|
||||
localcmd(".way\n");
|
||||
localcmd ("exec maps/");
|
||||
localcmd (mapname);
|
||||
localcmd (".way\n");
|
||||
waypoint_mode = WM_DYNAMIC;
|
||||
bot_map_load();
|
||||
bot_map_load ();
|
||||
} else
|
||||
waypoint_mode = WM_LOADED;
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -768,7 +777,6 @@ signs on to the server.
|
|||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
|
||||
void(entity who) UpdateClient =
|
||||
{
|
||||
WriteByte (MSG_ALL, SVC_UPDATENAME);
|
||||
|
@ -785,39 +793,42 @@ void(entity who) UpdateClient =
|
|||
float(float clientno) ClientBitFlag =
|
||||
{
|
||||
// bigger, but faster
|
||||
if (clientno == 0)
|
||||
switch (clientno) {
|
||||
case 0:
|
||||
return 1;
|
||||
else if (clientno == 1)
|
||||
case 1:
|
||||
return 2;
|
||||
else if (clientno == 2)
|
||||
case 2:
|
||||
return 4;
|
||||
else if (clientno == 3)
|
||||
case 3:
|
||||
return 8;
|
||||
else if (clientno == 4)
|
||||
case 4:
|
||||
return 16;
|
||||
else if (clientno == 5)
|
||||
case 5:
|
||||
return 32;
|
||||
else if (clientno == 6)
|
||||
case 6:
|
||||
return 64;
|
||||
else if (clientno == 7)
|
||||
case 7:
|
||||
return 128;
|
||||
else if (clientno == 8)
|
||||
case 8:
|
||||
return 256;
|
||||
else if (clientno == 9)
|
||||
case 9:
|
||||
return 512;
|
||||
else if (clientno == 10)
|
||||
case 10:
|
||||
return 1024;
|
||||
else if (clientno == 11)
|
||||
case 11:
|
||||
return 2048;
|
||||
else if (clientno == 12)
|
||||
case 12:
|
||||
return 4096;
|
||||
else if (clientno == 13)
|
||||
case 13:
|
||||
return 8192;
|
||||
else if (clientno == 14)
|
||||
case 14:
|
||||
return 16384;
|
||||
else if (clientno == 15)
|
||||
case 15:
|
||||
return 32768;
|
||||
return 0;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
float() ClientNextAvailable =
|
||||
|
@ -825,10 +836,10 @@ float() ClientNextAvailable =
|
|||
local float clientno;
|
||||
|
||||
clientno = max_clients;
|
||||
while(clientno > 0) {
|
||||
clientno = clientno - 1;
|
||||
while (clientno > 0) {
|
||||
clientno--;
|
||||
|
||||
if(!(active_clients & ClientBitFlag(clientno)))
|
||||
if (!(active_clients & ClientBitFlag (clientno)))
|
||||
return clientno;
|
||||
}
|
||||
|
||||
|
@ -862,19 +873,19 @@ Team finding code
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
float(float tcolor) FindAnotherColor =
|
||||
{
|
||||
local float bestbet, scolor, pcount, bestp;
|
||||
|
||||
bestbet = -1;
|
||||
bestp = 16;
|
||||
while(scolor < 14) {
|
||||
while (scolor < 14) {
|
||||
if (scolor != tcolor) {
|
||||
b_temp2 = player_head;
|
||||
pcount = 0;
|
||||
while(b_temp2 != NIL) {
|
||||
while (b_temp2 != NIL) {
|
||||
if (b_temp2.team == scolor + 1)
|
||||
pcount = pcount + 1;
|
||||
pcount++;
|
||||
b_temp2 = b_temp2._next;
|
||||
}
|
||||
if ((pcount < bestp) && pcount) {
|
||||
|
@ -882,12 +893,12 @@ float(float tcolor) FindAnotherColor =
|
|||
bestp = pcount;
|
||||
}
|
||||
}
|
||||
scolor = scolor + 1;
|
||||
scolor++;
|
||||
}
|
||||
if (bestbet < 0) {
|
||||
bestbet = tcolor;
|
||||
while (bestbet == tcolor) {
|
||||
bestbet = floor(random() * 13);
|
||||
bestbet = floor (13 * random ());
|
||||
}
|
||||
}
|
||||
return bestbet;
|
||||
|
@ -904,10 +915,10 @@ entity(float num) GetClientEntity =
|
|||
{
|
||||
local entity upsy;
|
||||
upsy = NIL;
|
||||
num = num + 1;
|
||||
num++;
|
||||
while (num > 0) {
|
||||
num = num - 1;
|
||||
upsy = nextent(upsy);
|
||||
num--;
|
||||
upsy = nextent (upsy);
|
||||
}
|
||||
return upsy;
|
||||
};
|
||||
|
@ -918,27 +929,26 @@ void(float whichteam, float whatbot, float whatskill) BotConnect =
|
|||
local string h;
|
||||
local entity uself;
|
||||
|
||||
f = ClientNextAvailable();
|
||||
f = ClientNextAvailable ();
|
||||
uself = self;
|
||||
if(f == -1) {
|
||||
if (f == -1) {
|
||||
bprint("Unable to connect a bot, server is full.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// chat thing
|
||||
|
||||
active_clients = active_clients | ClientBitFlag(f);
|
||||
bot_count = bot_count + 1;
|
||||
self = GetClientEntity(f);
|
||||
active_clients |= ClientBitFlag (f);
|
||||
bot_count++;
|
||||
self = GetClientEntity (f);
|
||||
if (!saved_bots)
|
||||
bot_start_topic(1);
|
||||
bot_start_topic (1);
|
||||
self.b_clientno = f;
|
||||
self.colormap = f + 1;
|
||||
if (whatbot)
|
||||
self.netname = BotName(whatbot);
|
||||
self.netname = BotName (whatbot);
|
||||
else
|
||||
self.netname = PickARandomName();
|
||||
|
||||
self.netname = PickARandomName ();
|
||||
|
||||
// players can set skill all weird, so leave these checks in
|
||||
whatskill = rint(whatskill);
|
||||
|
@ -950,40 +960,40 @@ void(float whichteam, float whatbot, float whatskill) BotConnect =
|
|||
|
||||
if (teamplay && !coop) {
|
||||
if (whichteam)
|
||||
self.b_pants = FindAnotherColor(uself.team - 1);
|
||||
self.b_pants = FindAnotherColor (uself.team - 1);
|
||||
else
|
||||
self.b_pants = uself.team - 1;
|
||||
self.b_shirt = self.b_pants;
|
||||
}
|
||||
|
||||
self.team = self.b_pants + 1;
|
||||
UpdateClient(self);
|
||||
SetNewParms();
|
||||
UpdateClient (self);
|
||||
SetNewParms ();
|
||||
self.ishuman = 2;
|
||||
ClientConnect();
|
||||
PutClientInServer();
|
||||
ClientConnect ();
|
||||
PutClientInServer ();
|
||||
|
||||
// this is risky... could corrupt .way files if done wrong
|
||||
// If you're not the gambling type, comment this out
|
||||
|
||||
f = ClientBitFlag(self.b_num - 1);
|
||||
current_bots = current_bots | f;
|
||||
f = ClientBitFlag (self.b_num - 1);
|
||||
current_bots |= f;
|
||||
|
||||
// FIXME: ugh
|
||||
if (self.b_num <= 8)
|
||||
saved_skills1 = (saved_skills1 & (65536 - (3 * f)) | (self.b_skill * f));
|
||||
else {
|
||||
f = ClientBitFlag(self.b_num - 9);
|
||||
f = ClientBitFlag (self.b_num - 9);
|
||||
saved_skills2 = (saved_skills2 & (65536 - (3 * f)) | (self.b_skill * f));
|
||||
}
|
||||
|
||||
h = ftos(current_bots);
|
||||
cvar_set("scratch1", h);
|
||||
h = ftos(saved_skills1);
|
||||
cvar_set("scratch2", h);
|
||||
h = ftos(saved_skills2);
|
||||
cvar_set("scratch3", h);
|
||||
h = ftos (current_bots);
|
||||
cvar_set ("scratch1", h);
|
||||
h = ftos (saved_skills1);
|
||||
cvar_set ("scratch2", h);
|
||||
h = ftos (saved_skills2);
|
||||
cvar_set ("scratch3", h);
|
||||
self = uself;
|
||||
|
||||
};
|
||||
|
||||
void(entity bot) BotDisconnect =
|
||||
|
@ -993,13 +1003,12 @@ void(entity bot) BotDisconnect =
|
|||
uself = self;
|
||||
self = bot;
|
||||
|
||||
bot_count = bot_count - 1;
|
||||
current_bots = current_bots - (current_bots & ClientBitFlag(self.b_num - 1));
|
||||
h = ftos(current_bots);
|
||||
cvar_set("scratch1", h);
|
||||
bot_count--;
|
||||
current_bots &= ~(ClientBitFlag (self.b_num - 1));
|
||||
h = ftos (current_bots);
|
||||
cvar_set ("scratch1", h);
|
||||
|
||||
|
||||
ClientDisconnect();
|
||||
ClientDisconnect ();
|
||||
|
||||
if (self.b_clientno != -1) {
|
||||
// the bot's client number is not in use by a real player so we
|
||||
|
@ -1015,12 +1024,13 @@ void(entity bot) BotDisconnect =
|
|||
self.b_pants = 0;
|
||||
self.b_shirt = 0;
|
||||
self.ammo_shells = self.ammo_nails = self.ammo_rockets = self.ammo_cells = 0;
|
||||
UpdateClient(self);
|
||||
active_clients = active_clients - (active_clients & ClientBitFlag(self.b_clientno));
|
||||
UpdateClient (self);
|
||||
active_clients &= ~(ClientBitFlag (self.b_clientno));
|
||||
self.b_clientno = -1;
|
||||
}
|
||||
self = uself;
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -1029,18 +1039,17 @@ kicks a bot if a player connects and takes the bot's space
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void(float clientno) BotInvalidClientNo =
|
||||
{
|
||||
local entity bot;
|
||||
|
||||
bot = GetClientEntity(clientno);
|
||||
if(bot.b_clientno > 0) {
|
||||
if (bot.b_clientno > 0) {
|
||||
if (!bot.ishuman) {
|
||||
bot.b_clientno = -1;
|
||||
BotDisconnect(bot);
|
||||
active_clients = active_clients | ClientBitFlag(self.b_clientno);
|
||||
BotConnect(0, bot.b_num, bot.b_skill);
|
||||
BotDisconnect (bot);
|
||||
active_clients |= ClientBitFlag (self.b_clientno);
|
||||
BotConnect (0, bot.b_num, bot.b_skill);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1058,19 +1067,20 @@ void() LoadWaypoint =
|
|||
local vector org;
|
||||
local entity tep;
|
||||
local float r;
|
||||
org_x = cvar("saved1");
|
||||
org_y = cvar("saved2");
|
||||
org_z = cvar("saved3");
|
||||
|
||||
org_x = cvar ("saved1");
|
||||
org_y = cvar ("saved2");
|
||||
org_z = cvar ("saved3");
|
||||
|
||||
tep = make_waypoint(org);
|
||||
tep = make_waypoint (org);
|
||||
|
||||
r = cvar("saved4");
|
||||
r = cvar ("saved4");
|
||||
|
||||
tep.b_aiflags = floor(r / 4);
|
||||
tep.b_pants = cvar("scratch1");
|
||||
tep.b_skill = cvar("scratch2");
|
||||
tep.b_shirt = cvar("scratch3");
|
||||
tep.b_frags = cvar("scratch4");
|
||||
tep.b_aiflags = floor (r / 4);
|
||||
tep.b_pants = cvar ("scratch1");
|
||||
tep.b_skill = cvar ("scratch2");
|
||||
tep.b_shirt = cvar ("scratch3");
|
||||
tep.b_frags = cvar ("scratch4");
|
||||
};
|
||||
|
||||
void() bot_return =
|
||||
|
@ -1079,28 +1089,43 @@ void() bot_return =
|
|||
if ((waypoint_mode == WM_DYNAMIC) || (waypoint_mode == WM_LOADED)) {
|
||||
// minor precaution
|
||||
|
||||
if (saved_bots & 1) BotConnect(0, 1, saved_skills1 & 3);
|
||||
if (saved_bots & 2) BotConnect(0, 2, (saved_skills1 & 12) / 4);
|
||||
if (saved_bots & 4) BotConnect(0, 3, (saved_skills1 & 48) / 16);
|
||||
if (saved_bots & 8) BotConnect(0, 4, (saved_skills1 & 192) / 64);
|
||||
if (saved_bots & 16) BotConnect(0, 5, (saved_skills1 & 768) / 256);
|
||||
if (saved_bots & 32) BotConnect(0, 6, (saved_skills1 & 3072) / 1024);
|
||||
if (saved_bots & 64) BotConnect(0, 7, (saved_skills1 & 12288) / 4096);
|
||||
if (saved_bots & 128) BotConnect(0, 8, (saved_skills1 & 49152) / 16384);
|
||||
if (saved_bots & 256) BotConnect(0, 9, saved_skills2 & 3);
|
||||
if (saved_bots & 512) BotConnect(0, 10, (saved_skills2 & 12) / 4);
|
||||
if (saved_bots & 1024) BotConnect(0, 11, (saved_skills2& 48) / 16);
|
||||
if (saved_bots & 2048) BotConnect(0, 12, (saved_skills2 & 192) / 64);
|
||||
if (saved_bots & 4096) BotConnect(0, 13, (saved_skills2 & 768) / 256);
|
||||
if (saved_bots & 8192) BotConnect(0, 14, (saved_skills2 & 3072) / 1024);
|
||||
if (saved_bots & 16384) BotConnect(0, 15, (saved_skills2 & 12288) / 4096);
|
||||
if (saved_bots & 32768) BotConnect(0, 16, (saved_skills2 & 49152) / 16384);
|
||||
if (saved_bots & 1)
|
||||
BotConnect (0, 1, saved_skills1 & 3);
|
||||
if (saved_bots & 2)
|
||||
BotConnect (0, 2, (saved_skills1 & 12) / 4);
|
||||
if (saved_bots & 4)
|
||||
BotConnect (0, 3, (saved_skills1 & 48) / 16);
|
||||
if (saved_bots & 8)
|
||||
BotConnect (0, 4, (saved_skills1 & 192) / 64);
|
||||
if (saved_bots & 16)
|
||||
BotConnect (0, 5, (saved_skills1 & 768) / 256);
|
||||
if (saved_bots & 32)
|
||||
BotConnect (0, 6, (saved_skills1 & 3072) / 1024);
|
||||
if (saved_bots & 64)
|
||||
BotConnect (0, 7, (saved_skills1 & 12288) / 4096);
|
||||
if (saved_bots & 128)
|
||||
BotConnect (0, 8, (saved_skills1 & 49152) / 16384);
|
||||
if (saved_bots & 256)
|
||||
BotConnect (0, 9, saved_skills2 & 3);
|
||||
if (saved_bots & 512)
|
||||
BotConnect (0, 10, (saved_skills2 & 12) / 4);
|
||||
if (saved_bots & 1024)
|
||||
BotConnect (0, 11, (saved_skills2& 48) / 16);
|
||||
if (saved_bots & 2048)
|
||||
BotConnect (0, 12, (saved_skills2 & 192) / 64);
|
||||
if (saved_bots & 4096)
|
||||
BotConnect (0, 13, (saved_skills2 & 768) / 256);
|
||||
if (saved_bots & 8192)
|
||||
BotConnect (0, 14, (saved_skills2 & 3072) / 1024);
|
||||
if (saved_bots & 16384)
|
||||
BotConnect (0, 15, (saved_skills2 & 12288) / 4096);
|
||||
if (saved_bots & 32768)
|
||||
BotConnect (0, 16, (saved_skills2 & 49152) / 16384);
|
||||
saved_bots = 0;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void() WaypointWatch =
|
||||
{
|
||||
// Waypoint Baywatch
|
||||
|
@ -1110,55 +1135,56 @@ void() WaypointWatch =
|
|||
if (max_clients < 2)
|
||||
return;
|
||||
if (waypoint_mode != WM_UNINIT) {
|
||||
bigboobs = cvar("saved4");
|
||||
bigboobs = cvar ("saved4");
|
||||
if (bigboobs != 0) {
|
||||
if ((bigboobs & 3) == 1)
|
||||
ClearAllWays();
|
||||
else if ((bigboobs & 3) == 3) {
|
||||
FixWaypoints();
|
||||
h = ftos(b_options);
|
||||
cvar_set("saved1", h);
|
||||
cvar_set("saved4", "0");
|
||||
cvar_set("scratch1", "0");
|
||||
FixWaypoints ();
|
||||
h = ftos (b_options);
|
||||
cvar_set ("saved1", h);
|
||||
cvar_set ("saved4", "0");
|
||||
cvar_set ("scratch1", "0");
|
||||
waypoint_mode = WM_LOADED;
|
||||
return;
|
||||
}
|
||||
LoadWaypoint();
|
||||
LoadWaypoint ();
|
||||
waypoint_mode = WM_LOADING;
|
||||
cvar_set("saved4", "0");
|
||||
cvar_set ("saved4", "0");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void() BotFrame =
|
||||
{
|
||||
local float num;
|
||||
|
||||
// for the sake of speed
|
||||
sv_maxspeed = cvar("sv_maxspeed");
|
||||
sv_gravity = cvar("sv_gravity");
|
||||
sv_friction = cvar("sv_friction");
|
||||
sv_accelerate = cvar("sv_accelerate");
|
||||
sv_stopspeed = cvar("sv_stopspeed");
|
||||
sv_maxspeed = cvar ("sv_maxspeed");
|
||||
sv_gravity = cvar ("sv_gravity");
|
||||
sv_friction = cvar ("sv_friction");
|
||||
sv_accelerate = cvar ("sv_accelerate");
|
||||
sv_stopspeed = cvar ("sv_stopspeed");
|
||||
real_frametime = frametime; // in NQ this is alright
|
||||
|
||||
self = nextent(NIL);
|
||||
|
||||
self = nextent (NIL);
|
||||
num = 0;
|
||||
while (num < max_clients) {
|
||||
if (self.ishuman == FALSE) {
|
||||
if (active_clients & ClientBitFlag(num)) {
|
||||
frik_obstacles();
|
||||
CL_KeyMove();
|
||||
SV_ClientThink();
|
||||
SV_Physics_Client();
|
||||
frik_obstacles ();
|
||||
CL_KeyMove ();
|
||||
SV_ClientThink ();
|
||||
SV_Physics_Client ();
|
||||
}
|
||||
}
|
||||
self = nextent(self);
|
||||
num = num + 1;
|
||||
self = nextent (self);
|
||||
num++;
|
||||
}
|
||||
WaypointWatch();
|
||||
WaypointWatch ();
|
||||
|
||||
if (saved_bots)
|
||||
bot_return();
|
||||
bot_return ();
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1169,28 +1195,30 @@ related functions.
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() BotImpulses =
|
||||
{
|
||||
local float f;
|
||||
|
||||
if (self.impulse == 100) {
|
||||
f = cvar("skill");
|
||||
BotConnect(0, 0, f);
|
||||
} else if (self.impulse == 101) {
|
||||
f = cvar("skill");
|
||||
BotConnect(1, 0, f);
|
||||
} else if (self.impulse == 102)
|
||||
KickABot();
|
||||
else if (self.impulse == 103)
|
||||
botcam_u();
|
||||
else if (self.impulse == 104)
|
||||
switch (self.impulse) {
|
||||
case 100:
|
||||
f = cvar ("skill");
|
||||
BotConnect (0, 0, f);
|
||||
break;
|
||||
case 101:
|
||||
f = cvar ("skill");
|
||||
BotConnect (1, 0, f);
|
||||
break;
|
||||
case 102:
|
||||
KickABot ();
|
||||
break;
|
||||
case 103:
|
||||
botcam_u ();
|
||||
break;
|
||||
case 104:
|
||||
bot_way_edit();
|
||||
else
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
|
||||
}
|
||||
self.impulse = 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
|
345
fbxa/bot_ai.qc
345
fbxa/bot_ai.qc
|
@ -53,7 +53,6 @@ checks to see if an entity is on the bot's stack
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
float(entity scot) target_onstack =
|
||||
{
|
||||
if (scot == NIL)
|
||||
|
@ -80,13 +79,13 @@ LIFO stack, this will be the bot's new target1
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void(entity ent) target_add =
|
||||
{
|
||||
if (ent == NIL)
|
||||
return;
|
||||
if (target_onstack(ent))
|
||||
if (target_onstack (ent))
|
||||
return;
|
||||
|
||||
self.target4 = self.target3;
|
||||
self.target3 = self.target2;
|
||||
self.target2 = self.target1;
|
||||
|
@ -94,7 +93,6 @@ void(entity ent) target_add =
|
|||
self.search_time = time + 5;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -108,26 +106,29 @@ is gone too.
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void(entity ent) target_drop =
|
||||
{
|
||||
local float tg;
|
||||
|
||||
tg = target_onstack(ent);
|
||||
if (tg == 1) {
|
||||
switch (target_onstack (ent)) {
|
||||
case 1:
|
||||
self.target1 = self.target2;
|
||||
self.target2 = self.target3;
|
||||
self.target3 = self.target4;
|
||||
self.target4 = NIL;
|
||||
} else if (tg == 2) {
|
||||
break;
|
||||
case 2:
|
||||
self.target1 = self.target3;
|
||||
self.target2 = self.target4;
|
||||
self.target3 = self.target4 = NIL;
|
||||
} else if (tg == 3) {
|
||||
break;
|
||||
case 3:
|
||||
self.target1 = self.target4;
|
||||
self.target2 = self.target3 = self.target4 = NIL;
|
||||
} else if (tg == 4)
|
||||
break;
|
||||
case 4:
|
||||
self.target1 = self.target2 = self.target3 = self.target4 = NIL;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
self.search_time = time + 5;
|
||||
};
|
||||
|
||||
|
@ -140,7 +141,6 @@ Bot has lost its target.
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void(entity targ, float success) bot_lost =
|
||||
{
|
||||
if (!targ)
|
||||
|
@ -148,18 +148,18 @@ void(entity targ, float success) bot_lost =
|
|||
|
||||
target_drop(targ);
|
||||
if (targ.classname == "waypoint")
|
||||
targ.b_sound = targ.b_sound - (targ.b_sound & ClientBitFlag(self.b_clientno));
|
||||
targ.b_sound &= ~(ClientBitFlag (self.b_clientno));
|
||||
|
||||
// find a new route
|
||||
if (!success) {
|
||||
self.target1 = self.target2 = self.target3 = self.target4 = NIL;
|
||||
self.last_way = FindWayPoint(self.current_way);
|
||||
ClearMyRoute();
|
||||
self.last_way = FindWayPoint (self.current_way);
|
||||
ClearMyRoute ();
|
||||
self.b_aiflags = 0;
|
||||
} else {
|
||||
if (targ.classname == "item_artifact_invisibility")
|
||||
if (self.items & 524288)
|
||||
bot_start_topic(3);
|
||||
bot_start_topic (3);
|
||||
|
||||
if (targ.flags & FL_ITEM) {
|
||||
if (!targ.model)
|
||||
|
@ -169,7 +169,6 @@ void(entity targ, float success) bot_lost =
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
if (targ.classname != "player")
|
||||
targ.search_time = time + 5;
|
||||
};
|
||||
|
@ -187,73 +186,73 @@ removed.
|
|||
void(entity targ) bot_check_lost =
|
||||
{
|
||||
local vector dist;
|
||||
dist = realorigin(targ) - self.origin;
|
||||
|
||||
dist = realorigin (targ) - self.origin;
|
||||
dist_z = 0;
|
||||
|
||||
if (targ == NIL)
|
||||
return;
|
||||
|
||||
// waypoints and items are lost if you get close enough to them
|
||||
|
||||
else if (targ.flags & FL_ITEM) {
|
||||
if (vlen(targ.origin - self.origin) < 32)
|
||||
bot_lost(targ, TRUE);
|
||||
if (targ.flags & FL_ITEM) {
|
||||
if (vlen (targ.origin - self.origin) < 32)
|
||||
bot_lost (targ, TRUE);
|
||||
else if (!targ.model)
|
||||
bot_lost(targ, TRUE);
|
||||
bot_lost (targ, TRUE);
|
||||
} else if (targ.classname == "waypoint") {
|
||||
if (!(self.b_aiflags & (AI_SNIPER | AI_AMBUSH))) {
|
||||
if (self.b_aiflags & AI_RIDE_TRAIN) {
|
||||
if (vlen(targ.origin - self.origin) < 48)
|
||||
bot_lost(targ, TRUE);
|
||||
if (vlen (targ.origin - self.origin) < 48)
|
||||
bot_lost (targ, TRUE);
|
||||
} else if (self.b_aiflags & AI_PRECISION) {
|
||||
if (vlen(targ.origin - self.origin) < 24)
|
||||
bot_lost(targ, TRUE);
|
||||
} else if (vlen(targ.origin - self.origin) < 32)
|
||||
bot_lost(targ, TRUE);
|
||||
if (vlen (targ.origin - self.origin) < 24)
|
||||
bot_lost (targ, TRUE);
|
||||
} else if (vlen (targ.origin - self.origin) < 32)
|
||||
bot_lost (targ, TRUE);
|
||||
}
|
||||
} else if (targ.classname == "temp_waypoint") {
|
||||
if (vlen(targ.origin - self.origin) < 32)
|
||||
bot_lost(targ, TRUE);
|
||||
if (vlen (targ.origin - self.origin) < 32)
|
||||
bot_lost (targ, TRUE);
|
||||
} else if (targ.classname == "player") {
|
||||
if (targ.health <= 0)
|
||||
bot_lost(targ, TRUE);
|
||||
bot_lost (targ, TRUE);
|
||||
else if ((coop) || (teamplay && targ.team == self.team)) {
|
||||
if (targ.target1.classname == "player") {
|
||||
if (!targ.target1.ishuman)
|
||||
bot_lost(targ, TRUE);
|
||||
bot_lost (targ, TRUE);
|
||||
} else if (targ.teleport_time > time) {
|
||||
// try not to telefrag teammates
|
||||
self.keys = self.keys & 960;
|
||||
} else if (vlen(targ.origin - self.origin) < 128) {
|
||||
if (vlen(targ.origin - self.origin) < 48)
|
||||
frik_walkmove(self.origin - targ.origin);
|
||||
self.keys &= 960;
|
||||
} else if (vlen (targ.origin - self.origin) < 128) {
|
||||
if (vlen (targ.origin - self.origin) < 48)
|
||||
frik_walkmove (self.origin - targ.origin);
|
||||
else {
|
||||
self.keys = self.keys & 960;
|
||||
bot_start_topic(4);
|
||||
self.keys &= 960;
|
||||
bot_start_topic (4);
|
||||
}
|
||||
self.search_time = time + 5; // never time out
|
||||
} else if (!fisible(targ))
|
||||
bot_lost(targ, FALSE);
|
||||
bot_lost (targ, FALSE);
|
||||
} else if (waypoint_mode > WM_LOADED) {
|
||||
if (vlen(targ.origin - self.origin) < 128) {
|
||||
bot_lost(targ, TRUE);
|
||||
if (vlen (targ.origin - self.origin) < 128) {
|
||||
bot_lost (targ, TRUE);
|
||||
}
|
||||
}
|
||||
} else if (targ.classname == "func_button") {
|
||||
// buttons are lost of their frame changes
|
||||
if (targ.frame) {
|
||||
bot_lost(targ, TRUE);
|
||||
bot_lost (targ, TRUE);
|
||||
if (self.enemy == targ)
|
||||
self.enemy = NIL;
|
||||
//if (self.target1)
|
||||
// bot_get_path(self.target1, TRUE);
|
||||
|
||||
// if (self.target1)
|
||||
// bot_get_path (self.target1, TRUE);
|
||||
}
|
||||
} else if ((targ.movetype == MOVETYPE_NONE) && (targ.solid == SOLID_TRIGGER)) {
|
||||
// trigger_multiple style triggers are lost if their thinktime changes
|
||||
if (targ.nextthink >= time) {
|
||||
bot_lost(targ, TRUE);
|
||||
//if (self.target1)
|
||||
// bot_get_path(self.target1, TRUE);
|
||||
bot_lost (targ, TRUE);
|
||||
// if (self.target1)
|
||||
// bot_get_path (self.target1, TRUE);
|
||||
}
|
||||
}
|
||||
// lose any target way above the bot's head
|
||||
|
@ -261,20 +260,19 @@ void(entity targ) bot_check_lost =
|
|||
if ((targ.origin_z - self.origin_z) > 64) {
|
||||
dist = targ.origin - self.origin;
|
||||
dist_z = 0;
|
||||
if (vlen(dist) < 32)
|
||||
if (vlen (dist) < 32)
|
||||
if (self.flags & FL_ONGROUND)
|
||||
if(!frik_recognize_plat(FALSE))
|
||||
bot_lost(targ, FALSE);
|
||||
if (!frik_recognize_plat (FALSE))
|
||||
bot_lost (targ, FALSE);
|
||||
} else if (targ.classname == "train") {
|
||||
if (frik_recognize_plat(FALSE))
|
||||
bot_lost(targ, TRUE);
|
||||
if (frik_recognize_plat (FALSE))
|
||||
bot_lost (targ, TRUE);
|
||||
}
|
||||
// targets are lost if the bot's search time has expired
|
||||
if (time > self.search_time)
|
||||
bot_lost(targ, FALSE);
|
||||
bot_lost (targ, FALSE);
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -285,7 +283,6 @@ based b_aiflags.
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() bot_handle_ai =
|
||||
{
|
||||
local entity newt;
|
||||
|
@ -297,36 +294,36 @@ void() bot_handle_ai =
|
|||
// wait is used by the ai to stop the bot until his search time expires / or route changes
|
||||
|
||||
if (self.b_aiflags & AI_WAIT)
|
||||
self.keys = self.keys & 960;
|
||||
self.keys &= 960;
|
||||
|
||||
if (self.b_aiflags & AI_DOORFLAG) {
|
||||
// was on a door when spawned
|
||||
b_temp3 = self;
|
||||
self = self.last_way;
|
||||
// if there is nothing there now
|
||||
if (!frik_recognize_plat(FALSE)) {
|
||||
newt = FindThing("door"); // this is likely the door responsible (crossfingers)
|
||||
if (!frik_recognize_plat (FALSE)) {
|
||||
newt = FindThing ("door"); // this is likely the door responsible (crossfingers)
|
||||
self = b_temp3;
|
||||
|
||||
if (self.b_aiflags & AI_DOOR_NO_OPEN) {
|
||||
if (newt.nextthink)
|
||||
self.keys = self.keys & 960; // wait until it closes
|
||||
self.keys &= 960; // wait until it closes
|
||||
else {
|
||||
bot_lost(self.last_way, FALSE);
|
||||
bot_lost (self.last_way, FALSE);
|
||||
}
|
||||
} else {
|
||||
if (newt.targetname) {
|
||||
newt = find(NIL, target, newt.targetname);
|
||||
newt = find (NIL, target, newt.targetname);
|
||||
if (newt.health > 0) {
|
||||
self.enemy = newt;
|
||||
bot_weapon_switch(1);
|
||||
bot_weapon_switch (1);
|
||||
} else {
|
||||
// target_drop(self.last_way);
|
||||
target_add(newt);
|
||||
// bot_get_path(newt, TRUE);
|
||||
// target_drop (self.last_way);
|
||||
target_add (newt);
|
||||
// bot_get_path (newt, TRUE);
|
||||
}
|
||||
}
|
||||
self.b_aiflags = self.b_aiflags - AI_DOORFLAG;
|
||||
self.b_aiflags &= ~AI_DOORFLAG;
|
||||
}
|
||||
} else
|
||||
self = b_temp3;
|
||||
|
@ -334,21 +331,20 @@ void() bot_handle_ai =
|
|||
|
||||
if (self.b_aiflags & AI_JUMP) {
|
||||
if (self.flags & FL_ONGROUND) {
|
||||
bot_jump();
|
||||
self.b_aiflags = self.b_aiflags - AI_JUMP;
|
||||
bot_jump ();
|
||||
self.b_aiflags &= ~AI_JUMP;
|
||||
}
|
||||
} else if (self.b_aiflags & AI_SUPER_JUMP) {
|
||||
if (self.weapon != 32)
|
||||
self.impulse = 7;
|
||||
else if (self.flags & FL_ONGROUND) {
|
||||
self.b_aiflags = self.b_aiflags - AI_SUPER_JUMP;
|
||||
if (bot_can_rj(self)) {
|
||||
bot_jump();
|
||||
self.b_aiflags &= ~AI_SUPER_JUMP;
|
||||
if (bot_can_rj (self)) {
|
||||
bot_jump ();
|
||||
self.v_angle_x = self.b_angle_x = 80;
|
||||
self.button0 = TRUE;
|
||||
} else
|
||||
bot_lost(self.target1, FALSE);
|
||||
|
||||
bot_lost (self.target1, FALSE);
|
||||
}
|
||||
}
|
||||
if (self.b_aiflags & AI_SURFACE) {
|
||||
|
@ -356,7 +352,7 @@ void() bot_handle_ai =
|
|||
self.keys = KEY_MOVEUP;
|
||||
self.button2 = TRUE; // swim!
|
||||
} else
|
||||
self.b_aiflags = self.b_aiflags - AI_SURFACE;
|
||||
self.b_aiflags &= ~AI_SURFACE;
|
||||
}
|
||||
if (self.b_aiflags & AI_RIDE_TRAIN) {
|
||||
// simple, but effective
|
||||
|
@ -364,54 +360,53 @@ void() bot_handle_ai =
|
|||
// things, not just trains (door elevators come to mind)
|
||||
b_temp3 = self;
|
||||
self = self.last_way;
|
||||
|
||||
|
||||
if (!frik_recognize_plat(FALSE)) {
|
||||
// if there is nothing there now
|
||||
self = b_temp3;
|
||||
self.keys = self.keys & 960;
|
||||
self.keys &= 960;
|
||||
} else {
|
||||
self = b_temp3;
|
||||
if (frik_recognize_plat(FALSE)) {
|
||||
v = realorigin(trace_ent) + trace_ent.origin - self.origin;
|
||||
if (frik_recognize_plat (FALSE)) {
|
||||
v = realorigin (trace_ent) + trace_ent.origin - self.origin;
|
||||
v_z = 0;
|
||||
if (vlen(v) < 24)
|
||||
self.keys = self.keys & 960;
|
||||
if (vlen (v) < 24)
|
||||
self.keys &= 960;
|
||||
else {
|
||||
self.b_aiflags = self.b_aiflags | AI_PRECISION;
|
||||
self.keys = frik_KeysForDir(v);
|
||||
self.b_aiflags |= AI_PRECISION;
|
||||
self.keys = frik_KeysForDir (v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (self.b_aiflags & AI_PLAT_BOTTOM) {
|
||||
newt = FindThing("plat");
|
||||
newt = FindThing ("plat");
|
||||
if (newt.state != 1) {
|
||||
v = self.origin - realorigin(newt);
|
||||
v = self.origin - realorigin (newt);
|
||||
v_z = 0;
|
||||
if (vlen(v) > 96)
|
||||
self.keys = self.keys & 960;
|
||||
if (vlen (v) > 96)
|
||||
self.keys &= 960;
|
||||
else
|
||||
frik_walkmove(v);
|
||||
frik_walkmove (v);
|
||||
} else
|
||||
self.b_aiflags = self.b_aiflags - AI_PLAT_BOTTOM;
|
||||
self.b_aiflags &= ~AI_PLAT_BOTTOM;
|
||||
}
|
||||
if (self.b_aiflags & AI_DIRECTIONAL) {
|
||||
if ((normalize(self.last_way.origin - self.origin) * self.b_dir) > 0.4) {
|
||||
self.b_aiflags = self.b_aiflags - AI_DIRECTIONAL;
|
||||
bot_lost(self.target1, TRUE);
|
||||
if ((normalize (self.last_way.origin - self.origin) * self.b_dir) > 0.4) {
|
||||
self.b_aiflags &= ~AI_DIRECTIONAL;
|
||||
bot_lost (self.target1, TRUE);
|
||||
}
|
||||
}
|
||||
if (self.b_aiflags & AI_SNIPER) {
|
||||
self.b_aiflags = (self.b_aiflags | AI_WAIT | AI_PRECISION) - AI_SNIPER;
|
||||
self.b_aiflags |= AI_WAIT | AI_PRECISION | AI_SNIPER;
|
||||
// FIXME: Add a switch to wep command
|
||||
// FIXME: increase delay?
|
||||
}
|
||||
if (self.b_aiflags & AI_AMBUSH) {
|
||||
self.b_aiflags = (self.b_aiflags | AI_WAIT) - AI_AMBUSH;
|
||||
self.b_aiflags |= AI_WAIT | AI_AMBUSH;
|
||||
// FIXME: Add a switch to wep command
|
||||
// FIXME: increase delay?
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -432,21 +427,21 @@ void() bot_path =
|
|||
|
||||
local entity jj, tele;
|
||||
|
||||
bot_check_lost(self.target1);
|
||||
bot_check_lost (self.target1);
|
||||
if (!self.target1) {
|
||||
self.keys=0;
|
||||
return;
|
||||
}
|
||||
if (target_onstack(self.last_way))
|
||||
if (target_onstack (self.last_way))
|
||||
return; // old waypoint still being hunted
|
||||
|
||||
jj = FindRoute(self.last_way);
|
||||
jj = FindRoute (self.last_way);
|
||||
if (!jj) {
|
||||
// this is an ugly hack
|
||||
if (self.target1.current_way != self.last_way) {
|
||||
if (self.target1.classname != "temp_waypoint")
|
||||
if (self.target1.classname != "player")
|
||||
bot_lost(self.target1, FALSE);
|
||||
bot_lost (self.target1, FALSE);
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -458,14 +453,14 @@ void() bot_path =
|
|||
// point types are AI flags that should be executed once reaching a waypoint
|
||||
|
||||
self.b_aiflags = (jj.b_aiflags & AI_READAHEAD_TYPES) | (self.last_way.b_aiflags & AI_POINT_TYPES);
|
||||
target_add(jj);
|
||||
target_add (jj);
|
||||
if (self.last_way) {
|
||||
if (CheckLinked(self.last_way, jj) == 2) {
|
||||
if (CheckLinked (self.last_way, jj) == 2) {
|
||||
// waypoints are telelinked
|
||||
tele = FindThing("trigger_teleport"); // this is probbly the teleport responsible
|
||||
target_add(tele);
|
||||
tele = FindThing ("trigger_teleport"); // this is probbly the teleport responsible
|
||||
target_add (tele);
|
||||
}
|
||||
traceline(self.last_way.origin, jj.origin, FALSE, self); // check for blockage
|
||||
traceline (self.last_way.origin, jj.origin, FALSE, self); // check for blockage
|
||||
if (trace_fraction != 1) {
|
||||
if (trace_ent.classname == "door" && !(self.b_aiflags & AI_DOOR_NO_OPEN)) {
|
||||
// a door blocks the way
|
||||
|
@ -474,35 +469,34 @@ void() bot_path =
|
|||
trace_ent = trace_ent.owner;
|
||||
if ((trace_ent.health > 0) && (self.enemy == NIL)) {
|
||||
self.enemy = trace_ent;
|
||||
bot_weapon_switch(1);
|
||||
bot_weapon_switch (1);
|
||||
self.b_aiflags = self.b_aiflags | AI_BLIND; // nick knack paddy hack
|
||||
} else if (trace_ent.targetname) {
|
||||
tele = find(NIL, target, trace_ent.targetname);
|
||||
tele = find (NIL, target, trace_ent.targetname);
|
||||
if (tele.health > 0) {
|
||||
self.enemy = tele;
|
||||
bot_weapon_switch(1);
|
||||
bot_weapon_switch (1);
|
||||
} else {
|
||||
// target_drop(jj);
|
||||
target_add(tele);
|
||||
// bot_get_path(tele, TRUE);
|
||||
self.b_aiflags = self.b_aiflags | AI_BLIND; // give a bot a bone
|
||||
// target_drop (jj);
|
||||
target_add (tele);
|
||||
// bot_get_path (tele, TRUE);
|
||||
self.b_aiflags |= AI_BLIND; // give a bot a bone
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if (trace_ent.classname == "func_wall") {
|
||||
// give up
|
||||
bot_lost(self.target1, FALSE);
|
||||
bot_lost (self.target1, FALSE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// this is used for AI_DRIECTIONAL
|
||||
self.b_dir = normalize(jj.origin - self.last_way.origin);
|
||||
self.b_dir = normalize (jj.origin - self.last_way.origin);
|
||||
|
||||
self.last_way = jj;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -522,13 +516,13 @@ the bot finds things it wants to kill/grab.
|
|||
float(entity thing) priority_for_thing =
|
||||
{
|
||||
local float thisp;
|
||||
|
||||
thisp = 0;
|
||||
// This is the most executed function in the bot. Careful what you do here.
|
||||
|
||||
if ((thing.flags & FL_ITEM) && thing.model && thing.search_time < time) {
|
||||
// ugly hack
|
||||
if (thing._last != self)
|
||||
thisp = 20;
|
||||
if (thing._last != self)
|
||||
thisp = 20;
|
||||
if (thing.classname == "item_artifact_super_damage")
|
||||
thisp = 65;
|
||||
else if (thing.classname == "item_artifact_invulnerability")
|
||||
|
@ -592,7 +586,7 @@ float(entity thing) priority_for_thing =
|
|||
else if (thing.b_aiflags & AI_AMBUSH)
|
||||
thisp = 30;
|
||||
}
|
||||
if (pointcontents(thing.origin) < -3)
|
||||
if (pointcontents (thing.origin) < -3)
|
||||
return 0;
|
||||
if (thisp) {
|
||||
if (thing.current_way) {
|
||||
|
@ -600,8 +594,7 @@ float(entity thing) priority_for_thing =
|
|||
if (thing.current_way.items == -1)
|
||||
return 0;
|
||||
else
|
||||
thisp = thisp + (13000 - thing.current_way.items) * 0.05;
|
||||
|
||||
thisp += (13000 - thing.current_way.items) * 0.05;
|
||||
}
|
||||
}
|
||||
return thisp;
|
||||
|
@ -613,36 +606,35 @@ void(float scope) bot_look_for_crap =
|
|||
local float thatp, bestp, dist;
|
||||
|
||||
if (scope == 1)
|
||||
foe = findradius(self.origin, 13000);
|
||||
foe = findradius (self.origin, 13000);
|
||||
else
|
||||
foe = findradius(self.origin, 500);
|
||||
foe = findradius (self.origin, 500);
|
||||
|
||||
bestp = 1;
|
||||
while(foe) {
|
||||
thatp = priority_for_thing(foe);
|
||||
while (foe) {
|
||||
thatp = priority_for_thing (foe);
|
||||
if (thatp)
|
||||
if (!scope)
|
||||
if (!sisible(foe))
|
||||
if (!sisible (foe))
|
||||
thatp = 0;
|
||||
if (thatp > bestp) {
|
||||
bestp = thatp;
|
||||
best = foe;
|
||||
dist = vlen(self.origin - foe.origin);
|
||||
dist = vlen (self.origin - foe.origin);
|
||||
}
|
||||
foe = foe.chain;
|
||||
}
|
||||
if (best == NIL)
|
||||
return;
|
||||
if (!target_onstack(best)) {
|
||||
target_add(best);
|
||||
if (!target_onstack (best)) {
|
||||
target_add (best);
|
||||
if (scope) {
|
||||
bot_get_path(best, FALSE);
|
||||
self.b_aiflags = self.b_aiflags | AI_WAIT;
|
||||
bot_get_path (best, FALSE);
|
||||
self.b_aiflags |= AI_WAIT;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -654,7 +646,6 @@ generally making the bot look good.
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() bot_angle_set =
|
||||
{
|
||||
local float h;
|
||||
|
@ -662,38 +653,38 @@ void() bot_angle_set =
|
|||
|
||||
if (self.enemy) {
|
||||
if (self.enemy.items & 524288)
|
||||
if (random() > 0.2)
|
||||
if (random () > 0.2)
|
||||
return;
|
||||
if (self.missile_speed == 0)
|
||||
self.missile_speed = 10000;
|
||||
if (self.enemy.solid == SOLID_BSP) {
|
||||
view = (((self.enemy.absmin + self.enemy.absmax) * 0.5) - self.origin);
|
||||
} else {
|
||||
h = vlen(self.enemy.origin - self.origin) / self.missile_speed;
|
||||
h = vlen (self.enemy.origin - self.origin) / self.missile_speed;
|
||||
if (self.enemy.flags & FL_ONGROUND)
|
||||
view = self.enemy.velocity * h;
|
||||
else
|
||||
view = (self.enemy.velocity - (sv_gravity * '0 0 1') * h) * h;
|
||||
view = self.enemy.origin + view;
|
||||
// FIXME: ?
|
||||
traceline(self.enemy.origin, view, FALSE, self);
|
||||
traceline (self.enemy.origin, view, FALSE, self);
|
||||
view = trace_endpos;
|
||||
|
||||
if (self.weapon == 32)
|
||||
view = view - '0 0 22';
|
||||
|
||||
view = normalize(view - self.origin);
|
||||
view = normalize (view - self.origin);
|
||||
}
|
||||
view = vectoangles(view);
|
||||
view = vectoangles (view);
|
||||
view_x = view_x * -1;
|
||||
self.b_angle = view;
|
||||
} else if (self.target1) {
|
||||
view = realorigin(self.target1);
|
||||
view = realorigin (self.target1);
|
||||
if (self.target1.flags & FL_ITEM)
|
||||
view = view + '0 0 48';
|
||||
view = view - (self.origin + self.view_ofs);
|
||||
view = vectoangles(view);
|
||||
view_x = view_x * -1;
|
||||
view -= (self.origin + self.view_ofs);
|
||||
view = vectoangles (view);
|
||||
view_x *= -1;
|
||||
self.b_angle = view;
|
||||
} else
|
||||
self.b_angle_x = 0;
|
||||
|
@ -704,31 +695,30 @@ void() bot_angle_set =
|
|||
self.keys = self.keys & 63;
|
||||
self.v_angle = self.b_angle;
|
||||
while (self.v_angle_x < -180)
|
||||
self.v_angle_x = self.v_angle_x + 360;
|
||||
self.v_angle_x += 360;
|
||||
while (self.v_angle_x > 180)
|
||||
self.v_angle_x = self.v_angle_x - 360;
|
||||
|
||||
self.v_angle_x -= 360;
|
||||
} else if ((self.enemy == NIL || self.enemy.movetype == MOVETYPE_PUSH) && self.target1.classname != "player") {
|
||||
self.keys = self.keys & 63;
|
||||
self.v_angle = self.b_angle;
|
||||
while (self.v_angle_x < -180)
|
||||
self.v_angle_x = self.v_angle_x + 360;
|
||||
self.v_angle_x += 360;
|
||||
while (self.v_angle_x > 180)
|
||||
self.v_angle_x = self.v_angle_x - 360;
|
||||
self.v_angle_x -= 360;
|
||||
} else if (self.b_skill < 2) {
|
||||
// skill 2 handled in bot_phys
|
||||
if (self.b_angle_x > 180)
|
||||
self.b_angle_x = self.b_angle_x - 360;
|
||||
self.b_angle_x -= 360;
|
||||
self.keys = self.keys & 63;
|
||||
|
||||
if (angcomp(self.b_angle_y, self.v_angle_y) > 10)
|
||||
self.keys = self.keys | KEY_LOOKLEFT;
|
||||
if (angcomp (self.b_angle_y, self.v_angle_y) > 10)
|
||||
self.keys = KEY_LOOKLEFT;
|
||||
else if (angcomp(self.b_angle_y, self.v_angle_y) < -10)
|
||||
self.keys = self.keys | KEY_LOOKRIGHT;
|
||||
self.keys |= KEY_LOOKRIGHT;
|
||||
if (angcomp(self.b_angle_x, self.v_angle_x) < -10)
|
||||
self.keys = self.keys | KEY_LOOKUP;
|
||||
else if (angcomp(self.b_angle_x, self.v_angle_x) > 10)
|
||||
self.keys = self.keys | KEY_LOOKDOWN;
|
||||
self.keys |= KEY_LOOKUP;
|
||||
else if (angcomp (self.b_angle_x, self.v_angle_x) > 10)
|
||||
self.keys |= KEY_LOOKDOWN;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -751,11 +741,11 @@ void() BotAI =
|
|||
// status bars, and the mod probably already compensated for that
|
||||
|
||||
if (self.health < 1) {
|
||||
self.button0 = floor(random() * 2);
|
||||
self.button0 = floor (random() * 2);
|
||||
self.button2 = 0;
|
||||
self.keys = 0;
|
||||
self.b_aiflags = 0;
|
||||
ClearMyRoute();
|
||||
ClearMyRoute ();
|
||||
self.target1 = self.target2 = self.target3 = self.target4 = self.enemy = NIL;
|
||||
self.last_way = NIL;
|
||||
return;
|
||||
|
@ -770,19 +760,17 @@ void() BotAI =
|
|||
self.ai_time = time + 0.05;
|
||||
if (bot_count > 0) {
|
||||
if ((time - stagger_think) < (0.1 / bot_count))
|
||||
self.ai_time = self.ai_time + 0.1 / (2 * bot_count);
|
||||
self.ai_time += 0.1 / (2 * bot_count);
|
||||
} else
|
||||
return;
|
||||
}
|
||||
if (self.view_ofs == '0 0 0')
|
||||
bot_start_topic(7);
|
||||
bot_start_topic (7);
|
||||
stagger_think = time;
|
||||
|
||||
// shut the bot's buttons off, various functions will turn them on by AI end
|
||||
|
||||
self.button2 = 0;
|
||||
self.button0 = 0;
|
||||
|
||||
|
||||
// target1 is like goalentity in normal Quake monster AI.
|
||||
// it's the bot's most immediate target
|
||||
|
@ -794,15 +782,15 @@ void() BotAI =
|
|||
self.b_aiflags = 0;
|
||||
self.keys = 0;
|
||||
} else if (self.target1) {
|
||||
frik_movetogoal();
|
||||
bot_path();
|
||||
frik_movetogoal ();
|
||||
bot_path ();
|
||||
} else {
|
||||
if (waypoint_mode < WM_EDITOR) {
|
||||
if(self.route_failed) {
|
||||
if (self.route_failed) {
|
||||
frik_bot_roam();
|
||||
self.route_failed = 0;
|
||||
} else if(!begin_route()) {
|
||||
bot_look_for_crap(FALSE);
|
||||
} else if (!begin_route()) {
|
||||
bot_look_for_crap (FALSE);
|
||||
}
|
||||
self.keys = 0;
|
||||
} else {
|
||||
|
@ -812,24 +800,23 @@ void() BotAI =
|
|||
}
|
||||
|
||||
// bot_angle_set points the bot at it's goal (self.enemy or target1)
|
||||
bot_angle_set ();
|
||||
|
||||
bot_angle_set();
|
||||
|
||||
// fight my enemy. Enemy is probably a field QC coders will most likely use a lot
|
||||
// for their own needs, since it's unused on a normal player
|
||||
// fight my enemy. Enemy is probably a field QC coders will most likely
|
||||
// use a lot for their own needs, since it's unused on a normal player
|
||||
// FIXME
|
||||
if (self.enemy)
|
||||
bot_fight_style();
|
||||
else if (random() < 0.2)
|
||||
if (random() < 0.2)
|
||||
bot_weapon_switch(-1);
|
||||
bot_dodge_stuff();
|
||||
bot_fight_style ();
|
||||
else if (random () < 0.2)
|
||||
if (random () < 0.2)
|
||||
bot_weapon_switch (-1);
|
||||
bot_dodge_stuff ();
|
||||
|
||||
// checks to see if bot needs to start going up for air
|
||||
if (self.waterlevel > 2) {
|
||||
if (time > (self.air_finished - 2)) {
|
||||
traceline (self.origin, self.origin + '0 0 6800', TRUE, self);
|
||||
if (trace_inopen) {
|
||||
if (trace_inopen) {
|
||||
self.keys = KEY_MOVEUP;
|
||||
self.button2 = TRUE; // swim!
|
||||
return; // skip ai flags for now - this is life or death
|
||||
|
@ -838,10 +825,8 @@ void() BotAI =
|
|||
}
|
||||
|
||||
// b_aiflags handling
|
||||
|
||||
|
||||
if (self.b_aiflags)
|
||||
bot_handle_ai();
|
||||
bot_handle_ai ();
|
||||
else
|
||||
bot_chat(); // don't want chat to screw him up if he's rjing or something
|
||||
bot_chat (); // don't want chat to screw him up if he's rjing or something
|
||||
};
|
||||
|
|
455
fbxa/bot_ed.qc
455
fbxa/bot_ed.qc
|
@ -6,7 +6,6 @@
|
|||
***********************************************/
|
||||
|
||||
/*
|
||||
|
||||
This program is in the Public Domain. My crack legal
|
||||
team would like to add:
|
||||
|
||||
|
@ -39,7 +38,6 @@ with applicable reexport restrictions.
|
|||
|
||||
Any reproduction of this software must contain
|
||||
this notice in its entirety.
|
||||
|
||||
*/
|
||||
|
||||
#include "libfrikbot.h"
|
||||
|
@ -63,9 +61,9 @@ float MENU_WAYLIST = 7;
|
|||
// 14 = Teleport to way
|
||||
// 15 = confirmation of delete point
|
||||
|
||||
void() BSPDumpWaypoints;
|
||||
void() QCDumpWaypoints;
|
||||
void() DumpWaypoints;
|
||||
void () BSPDumpWaypoints;
|
||||
void () QCDumpWaypoints;
|
||||
void () DumpWaypoints;
|
||||
/*
|
||||
// source for the menu strings...
|
||||
|
||||
|
@ -157,58 +155,68 @@ void() DumpWaypoints;
|
|||
[8] [#] QC output \n
|
||||
[9] [#] BSP ents output \n
|
||||
[0] Main Menu \n
|
||||
|
||||
*/
|
||||
|
||||
void() bot_menu_display =
|
||||
void ()
|
||||
bot_menu_display =
|
||||
{
|
||||
// build options
|
||||
// build options
|
||||
local string s1, s2, s3, s4, s5, s6, s7, h;
|
||||
local entity t;
|
||||
|
||||
// check impulses
|
||||
// check impulses
|
||||
if (self.impulse > 0 && self.impulse < 11 && self.b_menu) {
|
||||
if (self.b_menu == MENU_MAIN) {
|
||||
if (self.impulse == 1) {
|
||||
switch (self.impulse) {
|
||||
case 1:
|
||||
self.b_menu = MENU_WAYPOINTS;
|
||||
self.b_menu_time = time;
|
||||
break;
|
||||
} else if (self.impulse == 2) {
|
||||
self.b_menu = MENU_LINKS;
|
||||
self.b_menu_time = time;
|
||||
break;
|
||||
} else if (self.impulse == 3) {
|
||||
self.b_menu = MENU_FLAGS;
|
||||
self.b_menu_time = time;
|
||||
break;
|
||||
} else if (self.impulse == 4) {
|
||||
self.b_menu = MENU_BOTS;
|
||||
self.b_menu_time = time;
|
||||
break;
|
||||
} else if (self.impulse == 5) {
|
||||
self.b_menu = MENU_WAYLIST;
|
||||
self.b_menu_time = time;
|
||||
break;
|
||||
} else if (self.impulse == 6) {
|
||||
if (self.movetype == MOVETYPE_NOCLIP)
|
||||
self.movetype = MOVETYPE_WALK;
|
||||
else
|
||||
self.movetype = MOVETYPE_NOCLIP;
|
||||
self.b_menu_time = time;
|
||||
|
||||
break;
|
||||
} else if (self.impulse == 7) {
|
||||
if (self.flags & FL_GODMODE)
|
||||
self.flags = self.flags - FL_GODMODE;
|
||||
self.flags &= ~FL_GODMODE;
|
||||
else
|
||||
self.flags = self.flags | FL_GODMODE;
|
||||
self.flags |= FL_GODMODE;
|
||||
self.b_menu_time = time;
|
||||
|
||||
} else if (self.impulse == 8) {
|
||||
break;
|
||||
case 8:
|
||||
if (self.b_aiflags & AI_HOLD_SELECT)
|
||||
self.b_aiflags = self.b_aiflags - AI_HOLD_SELECT;
|
||||
self.b_aiflags &= ~AI_HOLD_SELECT;
|
||||
else
|
||||
self.b_aiflags = self.b_aiflags | AI_HOLD_SELECT;
|
||||
self.b_aiflags |= AI_HOLD_SELECT;
|
||||
self.b_menu_time = time;
|
||||
} else if (self.impulse == 9) {
|
||||
break;
|
||||
case 9:
|
||||
self.b_menu = 14;
|
||||
self.b_menu_time = time;
|
||||
} else if (self.impulse == 10)
|
||||
bot_way_edit();
|
||||
break;
|
||||
case 10:
|
||||
bot_way_edit ();
|
||||
break;
|
||||
}
|
||||
} else if (self.b_menu == MENU_WAYPOINTS) {
|
||||
if (self.impulse == 1) {
|
||||
if (self.current_way)
|
||||
|
@ -219,75 +227,82 @@ void() bot_menu_display =
|
|||
self.b_menu_time = time;
|
||||
self.last_way = self.current_way;
|
||||
}
|
||||
} else if (self.impulse == 3) {
|
||||
make_waypoint(self.origin + self.view_ofs);
|
||||
} else if (self.impulse == 4) {
|
||||
t = make_waypoint(self.origin + self.view_ofs);
|
||||
if (!LinkWays(self.current_way, t))
|
||||
sprint(self, "Unable to link them\n");
|
||||
} else if (self.impulse == 5) {
|
||||
t = make_waypoint(self.origin + self.view_ofs);
|
||||
if (!LinkWays(self.current_way, t))
|
||||
sprint(self, "Unable to link old to new\n");
|
||||
LinkWays(t, self.current_way);
|
||||
} else if (self.impulse == 6) {
|
||||
t = make_waypoint(self.origin + self.view_ofs);
|
||||
if (!TeleLinkWays(self.current_way, t))
|
||||
sprint(self, "Unable to link them\n");
|
||||
} else if (self.impulse == 7) {
|
||||
case 3:
|
||||
make_waypoint (self.origin + self.view_ofs);
|
||||
break;
|
||||
case 4:
|
||||
t = make_waypoint (self.origin + self.view_ofs);
|
||||
if (!LinkWays (self.current_way, t))
|
||||
sprint (self, "Unable to link them\n");
|
||||
break;
|
||||
case 5:
|
||||
t = make_waypoint (self.origin + self.view_ofs);
|
||||
if (!LinkWays (self.current_way, t))
|
||||
sprint (self, "Unable to link old to new\n");
|
||||
LinkWays (t, self.current_way);
|
||||
break;
|
||||
case 6:
|
||||
t = make_waypoint (self.origin + self.view_ofs);
|
||||
if (!TeleLinkWays (self.current_way, t))
|
||||
sprint (self, "Unable to link them\n");
|
||||
break;
|
||||
case 7:
|
||||
if (self.current_way) {
|
||||
sprint(self, "\nwaypoint info for waypoint #");
|
||||
h = ftos(self.current_way.count);
|
||||
sprint(self, h);
|
||||
sprint(self, "\nAI Flag value: ");
|
||||
h = ftos(self.current_way.b_aiflags);
|
||||
sprint(self, h);
|
||||
sprint (self, "\nwaypoint info for waypoint #");
|
||||
h = ftos (self.current_way.count);
|
||||
sprint (self, h);
|
||||
sprint (self, "\nAI Flag value: ");
|
||||
h = ftos (self.current_way.b_aiflags);
|
||||
sprint (self, h);
|
||||
|
||||
if (self.current_way.target1) {
|
||||
h = ftos(self.current_way.target1.count);
|
||||
h = ftos (self.current_way.target1.count);
|
||||
if (self.current_way.b_aiflags & AI_TELELINK_1)
|
||||
sprint(self, "\nTelelink1 to:");
|
||||
sprint (self, "\nTelelink1 to:");
|
||||
else
|
||||
sprint(self, "\nLink1 to:");
|
||||
sprint(self, h);
|
||||
sprint (self, "\nLink1 to:");
|
||||
sprint (self, h);
|
||||
}
|
||||
if (self.current_way.target2) {
|
||||
h = ftos(self.current_way.target2.count);
|
||||
h = ftos (self.current_way.target2.count);
|
||||
if (self.current_way.b_aiflags & AI_TELELINK_2)
|
||||
sprint(self, "\nTelelink2 to:");
|
||||
sprint (self, "\nTelelink2 to:");
|
||||
else
|
||||
sprint(self, "\nLink2 to:");
|
||||
sprint(self, h);
|
||||
sprint (self, "\nLink2 to:");
|
||||
sprint (self, h);
|
||||
}
|
||||
if (self.current_way.target3) {
|
||||
h = ftos(self.current_way.target3.count);
|
||||
h = ftos (self.current_way.target3.count);
|
||||
if (self.current_way.b_aiflags & AI_TELELINK_3)
|
||||
sprint(self, "\nTelelink3 to:");
|
||||
sprint (self, "\nTelelink3 to:");
|
||||
else
|
||||
sprint(self, "\nLink3 to:");
|
||||
sprint(self, h);
|
||||
sprint (self, "\nLink3 to:");
|
||||
sprint (self, h);
|
||||
}
|
||||
if (self.current_way.target4) {
|
||||
h = ftos(self.current_way.target4.count);
|
||||
h = ftos (self.current_way.target4.count);
|
||||
if (self.current_way.b_aiflags & AI_TELELINK_4)
|
||||
sprint(self, "\nTelelink4 to:");
|
||||
sprint (self, "\nTelelink4 to:");
|
||||
else
|
||||
sprint(self, "\nLink4 to:");
|
||||
sprint(self, h);
|
||||
sprint (self, "\nLink4 to:");
|
||||
sprint (self, h);
|
||||
}
|
||||
sprint(self, "\n\n");
|
||||
sprint (self, "\n\n");
|
||||
}
|
||||
|
||||
}
|
||||
if (self.impulse == 8) {
|
||||
break;
|
||||
case 8:
|
||||
self.b_menu = MENU_LINKS;
|
||||
self.b_menu_time = time;
|
||||
} else if (self.impulse == 9) {
|
||||
break;
|
||||
case 9:
|
||||
self.b_menu = MENU_FLAGS;
|
||||
self.b_menu_time = time;
|
||||
} else if (self.impulse == 10) {
|
||||
break;
|
||||
case 10:
|
||||
self.b_menu = MENU_MAIN;
|
||||
self.b_menu_time = time;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if (self.b_menu == MENU_LINKS) {
|
||||
if (self.impulse == 1) {
|
||||
|
@ -762,19 +777,20 @@ void() bot_menu_display =
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
// engage menu
|
||||
void() bot_way_edit =
|
||||
void ()
|
||||
bot_way_edit =
|
||||
{
|
||||
local entity t;
|
||||
local float f;
|
||||
|
||||
if (self.b_menu_value) {
|
||||
if (self.b_menu == 14) {
|
||||
t = WaypointForNum(self.b_menu_value);
|
||||
t = WaypointForNum (self.b_menu_value);
|
||||
if (t)
|
||||
setorigin(self, t.origin - self.view_ofs);
|
||||
setorigin (self, t.origin - self.view_ofs);
|
||||
else
|
||||
sprint(self, "No waypoint with that number\n");
|
||||
sprint (self, "No waypoint with that number\n");
|
||||
|
||||
self.b_menu = MENU_MAIN;
|
||||
self.b_menu_time = time;
|
||||
|
@ -786,40 +802,40 @@ void() bot_way_edit =
|
|||
self.b_menu = MENU_MAIN;
|
||||
waypoint_mode = WM_EDITOR;
|
||||
self.b_menu_time = 0;
|
||||
cvar_set("saved2", "0");
|
||||
WriteByte(MSG_ALL, 8);
|
||||
WriteByte(MSG_ALL, 1);
|
||||
WriteString(MSG_ALL, "MAKE SURE THE FOLLOWING LINE CONTAINS -CONDEBUG BEFORE PROCEEDING\n");
|
||||
localcmd("cmdline\n");
|
||||
cvar_set ("saved2", "0");
|
||||
WriteByte (MSG_ALL, 8);
|
||||
WriteByte (MSG_ALL, 1);
|
||||
WriteString (MSG_ALL, "MAKE SURE THE FOLLOWING LINE CONTAINS "
|
||||
"-CONDEBUG BEFORE PROCEEDING\n");
|
||||
localcmd ("cmdline\n");
|
||||
t = way_head;
|
||||
while (t) {
|
||||
setmodel(t, "progs/s_bubble.spr"); // show the waypoints
|
||||
setmodel (t, "progs/s_bubble.spr"); // show the waypoints
|
||||
t = t._next;
|
||||
}
|
||||
if (self.current_way)
|
||||
setmodel(self.current_way, "progs/s_light.spr");
|
||||
setmodel (self.current_way, "progs/s_light.spr");
|
||||
} else {
|
||||
saved2 = cvar("saved2");
|
||||
saved2 = cvar ("saved2");
|
||||
if (saved2 != 0) {
|
||||
f = self.b_menu;
|
||||
self.b_menu = floor(saved2/16);
|
||||
self.b_menu = floor (saved2 / 16);
|
||||
self.impulse = saved2 & 15;
|
||||
bot_menu_display();
|
||||
bot_menu_display ();
|
||||
self.b_menu = f;
|
||||
cvar_set("saved2", "0");
|
||||
cvar_set ("saved2", "0");
|
||||
return;
|
||||
}
|
||||
self.b_menu = 0;
|
||||
waypoint_mode = WM_LOADED;
|
||||
t = way_head;
|
||||
while (t) {
|
||||
setmodel(t, string_null); // hide the waypoints
|
||||
setmodel (t, string_null); // hide the waypoints
|
||||
t = t._next;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -828,14 +844,14 @@ Waypoint Saving to file.
|
|||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
|
||||
// bytecount is really iffy
|
||||
// since there is no true way to determine the length of an ftos
|
||||
// it uses an approximate of 5
|
||||
// various other things are guesses, but I don't cut it at the absolute
|
||||
// max so it should be okay
|
||||
|
||||
void() PrintWaypoint =
|
||||
void ()
|
||||
PrintWaypoint =
|
||||
{
|
||||
local entity t;
|
||||
local float needcolon;
|
||||
|
@ -846,136 +862,138 @@ void() PrintWaypoint =
|
|||
else
|
||||
t = self.enemy._next;
|
||||
if (bytecounter >= 8000) {
|
||||
bprint("exec maps/");
|
||||
bprint(mapname);
|
||||
bprint(".wa");
|
||||
h = ftos(filecount);
|
||||
bprint(h);
|
||||
filecount = filecount + 1;
|
||||
bprint("\n// **** break here **** \n");
|
||||
bprint ("exec maps/");
|
||||
bprint (mapname);
|
||||
bprint (".wa");
|
||||
h = ftos (filecount);
|
||||
bprint (h);
|
||||
filecount++;
|
||||
bprint ("\n// **** break here **** \n");
|
||||
bytecounter = 26;
|
||||
}
|
||||
if (t == NIL) {
|
||||
remove(self);
|
||||
remove (self);
|
||||
fixer = NIL;
|
||||
bprint("saved4 3\n// end waypoint dump\n");
|
||||
bytecounter = bytecounter + 27;
|
||||
bytecounter += 27;
|
||||
return;
|
||||
}
|
||||
if ((t.origin_x != saved1) || (t.count == 1)) {
|
||||
bprint("saved1 ");
|
||||
h = ftos(t.origin_x);
|
||||
bprint(h);
|
||||
bprint ("saved1 ");
|
||||
h = ftos (t.origin_x);
|
||||
bprint (h);
|
||||
saved1 = t.origin_x;
|
||||
bytecounter = bytecounter + 12;
|
||||
bytecounter += 12;
|
||||
needcolon = TRUE;
|
||||
}
|
||||
if ((t.origin_y != saved2) || (t.count == 1)) {
|
||||
if (needcolon) {
|
||||
bprint("; ");
|
||||
bytecounter = bytecounter + 2;
|
||||
bprint ("; ");
|
||||
bytecounter += 2;
|
||||
} else
|
||||
needcolon = TRUE;
|
||||
bprint("saved2 ");
|
||||
h = ftos(t.origin_y);
|
||||
bprint(h);
|
||||
bytecounter = bytecounter + 12;
|
||||
bprint ("saved2 ");
|
||||
h = ftos (t.origin_y);
|
||||
bprint (h);
|
||||
bytecounter += 12;
|
||||
saved2 = t.origin_y;
|
||||
}
|
||||
if ((t.origin_z != saved3) || (t.count == 1)) {
|
||||
if (needcolon) {
|
||||
bprint("; ");
|
||||
bytecounter = bytecounter + 2;
|
||||
bprint ("; ");
|
||||
bytecounter += 2;
|
||||
} else
|
||||
needcolon = TRUE;
|
||||
bprint("saved3 ");
|
||||
h = ftos(t.origin_z);
|
||||
bprint(h);
|
||||
bytecounter = bytecounter + 12;
|
||||
bprint ("saved3 ");
|
||||
h = ftos (t.origin_z);
|
||||
bprint (h);
|
||||
bytecounter += 12;
|
||||
saved3 = t.origin_z;
|
||||
}
|
||||
bytecounter = bytecounter + 1;
|
||||
bprint("\n");
|
||||
bytecounter++;
|
||||
bprint ("\n");
|
||||
needcolon = FALSE;
|
||||
if ((scratch1 != t.target1.count) || t.count == 1) {
|
||||
needcolon = TRUE;
|
||||
bprint("scratch1 ");
|
||||
bytecounter = bytecounter + 14;
|
||||
h = ftos(t.target1.count);
|
||||
bprint(h);
|
||||
bprint ("scratch1 ");
|
||||
bytecounter += 14;
|
||||
h = ftos (t.target1.count);
|
||||
bprint (h);
|
||||
scratch1 = t.target1.count;
|
||||
}
|
||||
if ((scratch2 != t.target2.count) || t.count == 1) {
|
||||
if (needcolon) {
|
||||
bprint("; ");
|
||||
bytecounter = bytecounter + 2;
|
||||
bprint ("; ");
|
||||
bytecounter += 2;
|
||||
} else
|
||||
needcolon = TRUE;
|
||||
bprint("scratch2 ");
|
||||
bytecounter = bytecounter + 14;
|
||||
h = ftos(t.target2.count);
|
||||
bprint(h);
|
||||
bprint ("scratch2 ");
|
||||
bytecounter += 14;
|
||||
h = ftos (t.target2.count);
|
||||
bprint (h);
|
||||
scratch2 = t.target2.count;
|
||||
}
|
||||
if ((scratch3 != t.target3.count) || t.count == 1) {
|
||||
if (needcolon) {
|
||||
bprint("; ");
|
||||
bytecounter = bytecounter + 2;
|
||||
bprint ("; ");
|
||||
bytecounter += 2;
|
||||
} else
|
||||
needcolon = TRUE;
|
||||
bprint("scratch3 ");
|
||||
bytecounter = bytecounter + 14;
|
||||
h = ftos(t.target3.count);
|
||||
bprint(h);
|
||||
bprint ("scratch3 ");
|
||||
bytecounter += 14;
|
||||
h = ftos (t.target3.count);
|
||||
bprint (h);
|
||||
scratch3 = t.target3.count;
|
||||
}
|
||||
if ((scratch4 != t.target4.count) || t.count == 1) {
|
||||
if (needcolon) {
|
||||
bprint("; ");
|
||||
bprint ("; ");
|
||||
bytecounter = bytecounter + 2;
|
||||
} else
|
||||
needcolon = TRUE;
|
||||
bprint("scratch4 ");
|
||||
bprint ("scratch4 ");
|
||||
bytecounter = bytecounter + 14;
|
||||
h = ftos(t.target4.count);
|
||||
bprint(h);
|
||||
h = ftos (t.target4.count);
|
||||
bprint (h);
|
||||
scratch4 = t.target4.count;
|
||||
}
|
||||
bprint("\nsaved4 ");
|
||||
bytecounter = bytecounter + 19;
|
||||
bprint ("\nsaved4 ");
|
||||
bytecounter += 19;
|
||||
if (t.count != 1)
|
||||
h = ftos(t.b_aiflags * 4 + 2);
|
||||
h = ftos (t.b_aiflags * 4 + 2);
|
||||
else
|
||||
h = ftos(t.b_aiflags * 4 + 1);
|
||||
bprint(h);
|
||||
h = ftos (t.b_aiflags * 4 + 1);
|
||||
bprint (h);
|
||||
bprint ("; wait\n");
|
||||
self.nextthink = time + 0.01;
|
||||
self.enemy = t;
|
||||
};
|
||||
|
||||
// to allow for 100+ waypoints, we need to trick the runaway loop counter
|
||||
void() DumpWaypoints =
|
||||
void ()
|
||||
DumpWaypoints =
|
||||
{
|
||||
bytecounter = 50;
|
||||
filecount = 1;
|
||||
|
||||
bprint("// ");
|
||||
bprint(world.message);
|
||||
bprint("- maps/");
|
||||
bprint(mapname);
|
||||
bprint(".way\n");
|
||||
bprint("// Ways by ");
|
||||
bprint(self.netname);
|
||||
bprint("\n");
|
||||
bprint ("// ");
|
||||
bprint (world.message);
|
||||
bprint ("- maps/");
|
||||
bprint (mapname);
|
||||
bprint (".way\n");
|
||||
bprint ("// Ways by ");
|
||||
bprint (self.netname);
|
||||
bprint ("\n");
|
||||
if (!fixer) {
|
||||
fixer = spawn();
|
||||
fixer = spawn ();
|
||||
fixer.nextthink = time + 0.01;
|
||||
fixer.think = PrintWaypoint;
|
||||
fixer.enemy = NIL;
|
||||
}
|
||||
};
|
||||
|
||||
void() PrintQCWaypoint =
|
||||
void ()
|
||||
PrintQCWaypoint =
|
||||
{
|
||||
local entity t;
|
||||
local string h;
|
||||
|
@ -986,58 +1004,61 @@ void() PrintQCWaypoint =
|
|||
t = self.enemy._next;
|
||||
|
||||
if (t == NIL) {
|
||||
remove(self);
|
||||
remove (self);
|
||||
fixer = NIL;
|
||||
bprint("};\n\n// End dump\n");
|
||||
bprint ("};\n\n// End dump\n");
|
||||
return;
|
||||
}
|
||||
bprint(" make_way(");
|
||||
h = vtos(t.origin);
|
||||
bprint(h);
|
||||
bprint(", '");
|
||||
h = ftos(t.target1.count);
|
||||
bprint(h);
|
||||
bprint(" ");
|
||||
h = ftos(t.target2.count);
|
||||
bprint(h);
|
||||
bprint(" ");
|
||||
h = ftos(t.target3.count);
|
||||
bprint(h);
|
||||
bprint("', ");
|
||||
h = ftos(t.target4.count);
|
||||
bprint(h);
|
||||
bprint(", ");
|
||||
h = ftos(t.b_aiflags);
|
||||
bprint(h);
|
||||
bprint(");\n");
|
||||
bprint (" make_way(");
|
||||
h = vtos (t.origin);
|
||||
bprint (h);
|
||||
bprint (", '");
|
||||
h = ftos (t.target1.count);
|
||||
bprint (h);
|
||||
bprint (" ");
|
||||
h = ftos (t.target2.count);
|
||||
bprint (h);
|
||||
bprint (" ");
|
||||
h = ftos (t.target3.count);
|
||||
bprint (h);
|
||||
bprint ("', ");
|
||||
h = ftos (t.target4.count);
|
||||
bprint (h);
|
||||
bprint (", ");
|
||||
h = ftos (t.b_aiflags);
|
||||
bprint (h);
|
||||
bprint (");\n");
|
||||
self.nextthink = time + 0.01;
|
||||
self.enemy = t;
|
||||
|
||||
};
|
||||
void() QCDumpWaypoints =
|
||||
|
||||
void ()
|
||||
QCDumpWaypoints =
|
||||
{
|
||||
bprint("/* QC Waypoint Dump - src/frikbot/map_");
|
||||
bprint ("/* QC Waypoint Dump - src/frikbot/map_");
|
||||
|
||||
bprint(mapname);
|
||||
bprint(".qc\nFor instructions please read the\nreadme.html that comes with FrikBot */\n\nvoid(vector org, vector bit1, float bit4, float flargs) make_way;\n");
|
||||
bprint("// Ways by ");
|
||||
bprint(self.netname);
|
||||
bprint("\n\n");
|
||||
|
||||
bprint("void() map_");
|
||||
bprint(mapname);
|
||||
bprint(" =\n{\n");
|
||||
bprint (mapname);
|
||||
bprint (".qc\nFor instructions please read the\nreadme.html that comes "
|
||||
"with FrikBot */\n\nvoid(vector org, vector bit1, float bit4, "
|
||||
"float flargs) make_way;\n");
|
||||
bprint ("// Ways by ");
|
||||
bprint (self.netname);
|
||||
bprint ("\n\n");
|
||||
|
||||
bprint ("void() map_");
|
||||
bprint (mapname);
|
||||
bprint (" =\n{\n");
|
||||
|
||||
if (!fixer) {
|
||||
fixer = spawn();
|
||||
fixer = spawn ();
|
||||
fixer.nextthink = time + 0.01;
|
||||
fixer.think = PrintQCWaypoint;
|
||||
fixer.enemy = NIL;
|
||||
}
|
||||
};
|
||||
|
||||
void() PrintBSPWaypoint =
|
||||
void ()
|
||||
PrintBSPWaypoint =
|
||||
{
|
||||
local entity t;
|
||||
local string h;
|
||||
|
@ -1048,59 +1069,61 @@ void() PrintBSPWaypoint =
|
|||
t = self.enemy._next;
|
||||
|
||||
if (t == NIL) {
|
||||
bprint("\n\n// End dump\n");
|
||||
remove(self);
|
||||
bprint ("\n\n// End dump\n");
|
||||
remove (self);
|
||||
fixer = NIL;
|
||||
return;
|
||||
}
|
||||
bprint("{\n\"classname\" \"waypoint\"\n\"origin\" \"");
|
||||
h = ftos(t.origin_x);
|
||||
bprint(h);
|
||||
bprint(" ");
|
||||
h = ftos(t.origin_y);
|
||||
bprint(h);
|
||||
bprint(" ");
|
||||
h = ftos(t.origin_z);
|
||||
bprint(h);
|
||||
bprint ("{\n\"classname\" \"waypoint\"\n\"origin\" \"");
|
||||
h = ftos (t.origin_x);
|
||||
bprint (h);
|
||||
bprint (" ");
|
||||
h = ftos (t.origin_y);
|
||||
bprint (h);
|
||||
bprint (" ");
|
||||
h = ftos (t.origin_z);
|
||||
bprint (h);
|
||||
if (t.target1.count) {
|
||||
bprint("\"\n\"b_pants\" \"");
|
||||
h = ftos(t.target1.count);
|
||||
bprint(h);
|
||||
bprint ("\"\n\"b_pants\" \"");
|
||||
h = ftos (t.target1.count);
|
||||
bprint (h);
|
||||
}
|
||||
if (t.target2.count) {
|
||||
bprint("\"\n\"b_skill\" \"");
|
||||
h = ftos(t.target2.count);
|
||||
bprint(h);
|
||||
bprint ("\"\n\"b_skill\" \"");
|
||||
h = ftos (t.target2.count);
|
||||
bprint (h);
|
||||
}
|
||||
if (t.target3.count) {
|
||||
bprint("\"\n\"b_shirt\" \"");
|
||||
h = ftos(t.target3.count);
|
||||
bprint(h);
|
||||
bprint ("\"\n\"b_shirt\" \"");
|
||||
h = ftos (t.target3.count);
|
||||
bprint (h);
|
||||
}
|
||||
if (t.target4.count) {
|
||||
bprint("\"\n\"b_frags\" \"");
|
||||
h = ftos(t.target4.count);
|
||||
bprint(h);
|
||||
bprint ("\"\n\"b_frags\" \"");
|
||||
h = ftos (t.target4.count);
|
||||
bprint (h);
|
||||
}
|
||||
if (t.b_aiflags) {
|
||||
bprint("\"\n\"b_aiflags\" \"");
|
||||
h = ftos(t.b_aiflags);
|
||||
bprint(h);
|
||||
bprint ("\"\n\"b_aiflags\" \"");
|
||||
h = ftos (t.b_aiflags);
|
||||
bprint (h);
|
||||
}
|
||||
bprint("\"\n}\n");
|
||||
bprint ("\"\n}\n");
|
||||
self.nextthink = time + 0.01;
|
||||
self.enemy = t;
|
||||
|
||||
};
|
||||
void() BSPDumpWaypoints =
|
||||
{
|
||||
bprint("/* BSP entities Dump - maps/");
|
||||
|
||||
bprint(mapname);
|
||||
bprint(".ent\nFor instructions please read the\nreadme.html that comes with FrikBot */\n\n\n");
|
||||
void ()
|
||||
BSPDumpWaypoints =
|
||||
{
|
||||
bprint ("/* BSP entities Dump - maps/");
|
||||
|
||||
bprint (mapname);
|
||||
bprint (".ent\nFor instructions please read the\nreadme.html that comes "
|
||||
"with FrikBot */\n\n\n");
|
||||
|
||||
if (!fixer) {
|
||||
fixer = spawn();
|
||||
fixer = spawn ();
|
||||
fixer.nextthink = time + 0.01;
|
||||
fixer.think = PrintBSPWaypoint;
|
||||
fixer.enemy = NIL;
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
***********************************************/
|
||||
|
||||
/*
|
||||
|
||||
This program is in the Public Domain. My crack legal
|
||||
team would like to add:
|
||||
|
||||
|
@ -39,79 +38,92 @@ with applicable reexport restrictions.
|
|||
|
||||
Any reproduction of this software must contain
|
||||
this notice in its entirety.
|
||||
|
||||
*/
|
||||
|
||||
#include "libfrikbot.h"
|
||||
|
||||
.entity avoid;
|
||||
|
||||
float(entity e) bot_size_player =
|
||||
float (entity e)
|
||||
bot_size_player =
|
||||
{
|
||||
local float sz;
|
||||
local float sz;
|
||||
|
||||
sz = e.health + e.armorvalue * e.armortype;
|
||||
if (e.weapon == 32)
|
||||
sz = sz + 60;
|
||||
else if (e.weapon == 64)
|
||||
sz = sz + 60;
|
||||
else if (e.weapon == 16)
|
||||
sz = sz + 50;
|
||||
else if (e.weapon == 8)
|
||||
sz = sz + 50;
|
||||
else if (e.weapon == 4)
|
||||
sz = sz + 40;
|
||||
else if (e.weapon == 2)
|
||||
sz = sz + 40;
|
||||
else if (e.weapon == 1)
|
||||
sz = sz + 10;
|
||||
else if (e.weapon == 4096)
|
||||
sz = sz - 50;
|
||||
switch (e.weapon) {
|
||||
case 4096:
|
||||
sz -= 50;
|
||||
break;
|
||||
case 64:
|
||||
sz += 60;
|
||||
break;
|
||||
case 32:
|
||||
sz += 60;
|
||||
break;
|
||||
case 16:
|
||||
sz += 50;
|
||||
break;
|
||||
case 8:
|
||||
sz += 50;
|
||||
break;
|
||||
case 4:
|
||||
sz += 40;
|
||||
break;
|
||||
case 2:
|
||||
sz += 40;
|
||||
break;
|
||||
case 1:
|
||||
sz += 10;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (e.items & 4194304) // Quad
|
||||
sz = sz + 200;
|
||||
sz += 200;
|
||||
if (e.items & 1048576) // Invul
|
||||
sz = sz + 300;
|
||||
sz += 300;
|
||||
if (e.items & 524288) // Invis
|
||||
sz = sz + 250;
|
||||
sz += 250;
|
||||
return sz;
|
||||
};
|
||||
|
||||
void() bot_dodge_stuff =
|
||||
void ()
|
||||
bot_dodge_stuff =
|
||||
{
|
||||
local entity foe;
|
||||
local float foedist, avdist, foesz, flen, tsz;
|
||||
local vector v;
|
||||
local entity foe;
|
||||
local float foedist, avdist, foesz, flen, tsz;
|
||||
local vector v;
|
||||
|
||||
if (waypoint_mode > WM_LOADED)
|
||||
return;
|
||||
|
||||
self.avoid = NIL;
|
||||
|
||||
|
||||
if (self.enemy) {
|
||||
v = self.origin - realorigin(self.enemy);
|
||||
foedist = vlen(v);
|
||||
foesz = bot_size_player(self.enemy);
|
||||
v = self.origin - realorigin (self.enemy);
|
||||
foedist = vlen (v);
|
||||
foesz = bot_size_player (self.enemy);
|
||||
} else {
|
||||
foedist = 3000;
|
||||
foesz = 9999999;
|
||||
}
|
||||
avdist = 256;
|
||||
|
||||
foe = find(NIL, classname, "grenade");
|
||||
while(foe) {
|
||||
flen = vlen(foe.origin - self.origin);
|
||||
foe = find (NIL, classname, "grenade");
|
||||
while (foe) {
|
||||
flen = vlen (foe.origin - self.origin);
|
||||
if (flen < avdist) {
|
||||
avdist = flen;
|
||||
self.avoid = foe;
|
||||
}
|
||||
foe = find(foe, classname, "grenade");
|
||||
foe = find (foe, classname, "grenade");
|
||||
}
|
||||
if (!self.avoid) {
|
||||
foe = find(NIL, classname, "missile");
|
||||
while(foe) {
|
||||
foe = find (NIL, classname, "missile");
|
||||
while (foe) {
|
||||
if (foe.owner != self) {
|
||||
flen = vlen(foe.origin - self.origin);
|
||||
flen = vlen (foe.origin - self.origin);
|
||||
if (flen < avdist) {
|
||||
avdist = flen;
|
||||
self.avoid = foe;
|
||||
|
@ -121,7 +133,7 @@ void() bot_dodge_stuff =
|
|||
}
|
||||
if (!self.avoid) {
|
||||
foe = find(NIL, classname, "spike");
|
||||
while(foe) {
|
||||
while (foe) {
|
||||
if (foe.owner != self) {
|
||||
flen = vlen(foe.origin - self.origin);
|
||||
if (flen < avdist) {
|
||||
|
@ -129,21 +141,21 @@ void() bot_dodge_stuff =
|
|||
self.avoid = foe;
|
||||
}
|
||||
}
|
||||
foe = find(foe, classname, "spike");
|
||||
foe = find (foe, classname, "spike");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (coop) {
|
||||
if (!self.enemy) {
|
||||
foe = findradius(self.origin, foedist);
|
||||
while(foe) {
|
||||
if(foe.flags & FL_MONSTER) {
|
||||
if(foe.health > 0) {
|
||||
flen = vlen(foe.origin - self.origin);
|
||||
foe = findradius (self.origin, foedist);
|
||||
while (foe) {
|
||||
if (foe.flags & FL_MONSTER) {
|
||||
if (foe.health > 0) {
|
||||
flen = vlen (foe.origin - self.origin);
|
||||
if (flen < foedist) {
|
||||
tsz = bot_size_player(foe);
|
||||
tsz = bot_size_player (foe);
|
||||
if (tsz < foesz) {
|
||||
if (fisible(foe)) {
|
||||
if (fisible (foe)) {
|
||||
self.enemy = foe;
|
||||
foedist = flen;
|
||||
foesz = tsz;
|
||||
|
@ -164,14 +176,14 @@ void() bot_dodge_stuff =
|
|||
if (foe.modelindex != 0) {
|
||||
if (foe.health > 0) {
|
||||
if (!(teamplay && self.team == foe.team)) {
|
||||
flen = vlen(foe.origin - self.origin);
|
||||
flen = vlen (foe.origin - self.origin);
|
||||
if (flen < foedist) {
|
||||
tsz = bot_size_player(foe);
|
||||
if (tsz < foesz) {
|
||||
if (fov(foe) || foe.b_sound > time || self.b_skill == 3) {
|
||||
if (fisible(foe)) {
|
||||
if (fisible (foe)) {
|
||||
self.enemy = foe;
|
||||
foedist = vlen(foe.origin - self.origin);
|
||||
foedist = vlen (foe.origin - self.origin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -184,76 +196,71 @@ void() bot_dodge_stuff =
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
weapon_range
|
||||
|
||||
_x "sweet spot range" - try to maintain this range if possible
|
||||
_y minimum range bot can be to be effective (rl/gl) (move away)
|
||||
_z maximum range bot can be to be effective (lg/axe) (move in)
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
vector(float wep) weapon_range =
|
||||
vector (float wep)
|
||||
weapon_range =
|
||||
{
|
||||
if (wep == 4096) // IT_AXE
|
||||
switch (wep) {
|
||||
case 4096: // IT_AXE
|
||||
return '48 0 64';
|
||||
else if (wep == 1) // IT_SHOTGUN
|
||||
case 1: // IT_SHOTGUN
|
||||
return '128 0 99999';
|
||||
else if (wep == 2) // IT_SUPER_SHOTGUN
|
||||
case 2: // IT_SUPER_SHOTGUN
|
||||
return '128 0 99999';
|
||||
else if (wep == 4) // IT_NAILGUN
|
||||
case 4: // IT_NAILGUN
|
||||
return '180 0 3000';
|
||||
else if (wep == 8) // IT_SUPER_NAILGUN
|
||||
case 8: // IT_SUPER_NAILGUN
|
||||
return '180 0 3000';
|
||||
else if (wep == 16) // IT_GRENADE_LAUNCHER
|
||||
case 16: // IT_GRENADE_LAUNCHER
|
||||
return '180 48 3000';
|
||||
else if (wep == 32) // IT_ROCKET_LAUNCHER
|
||||
case 32: // IT_ROCKET_LAUNCHER
|
||||
return '180 48 3000';
|
||||
else if (wep == 64) // IT_LIGHTNING
|
||||
case 64: // IT_LIGHTNING
|
||||
return '350 0 512';
|
||||
default:
|
||||
break;
|
||||
}
|
||||
};
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
/*
|
||||
bot_weapon_switch
|
||||
|
||||
Pick a weapon based on range / ammo
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void(float brange) bot_weapon_switch =
|
||||
void (float brange)
|
||||
bot_weapon_switch =
|
||||
{
|
||||
local float it, flag = 0, pulse = 0;
|
||||
local vector v;
|
||||
local float it, flag = 0, pulse = 0;
|
||||
local vector v;
|
||||
|
||||
it = self.items & 127;
|
||||
|
||||
while(it) {
|
||||
while (it) {
|
||||
if ((self.ammo_rockets >= 1) && (it & 32)) {
|
||||
flag = 32;
|
||||
pulse = 7;
|
||||
} else if (self.waterlevel <= 1 && self.ammo_cells >= 1 && (it & 64)) {
|
||||
flag = 64;
|
||||
pulse = 8;
|
||||
} else if(self.ammo_nails >= 2 && (it & 8)) {
|
||||
} else if (self.ammo_nails >= 2 && (it & 8)) {
|
||||
flag = 8;
|
||||
pulse = 5;
|
||||
} else if ((self.ammo_rockets >= 1) && (it & 16)) {
|
||||
flag = 16;
|
||||
pulse = 6;
|
||||
} else if(self.ammo_shells >= 2 && (it & 2)) {
|
||||
} else if (self.ammo_shells >= 2 && (it & 2)) {
|
||||
flag = 2;
|
||||
pulse = 3;
|
||||
} else if(self.ammo_nails >= 1 && (it & 4)) {
|
||||
} else if (self.ammo_nails >= 1 && (it & 4)) {
|
||||
flag = 4;
|
||||
pulse = 4;
|
||||
} else if(self.ammo_shells >= 1 && (it & 1)) {
|
||||
} else if (self.ammo_shells >= 1 && (it & 1)) {
|
||||
flag = 1;
|
||||
pulse = 2;
|
||||
} else {
|
||||
|
@ -268,7 +275,7 @@ void(float brange) bot_weapon_switch =
|
|||
return;
|
||||
}
|
||||
|
||||
v = weapon_range(flag);
|
||||
v = weapon_range (flag);
|
||||
if (brange < v_y || brange > v_z)
|
||||
it = it - flag;
|
||||
else {
|
||||
|
@ -279,35 +286,32 @@ void(float brange) bot_weapon_switch =
|
|||
}
|
||||
};
|
||||
|
||||
void() bot_shoot =
|
||||
void ()
|
||||
bot_shoot =
|
||||
{
|
||||
// quick little function to stop making him shoot the wrong way ! Argh
|
||||
local float g;
|
||||
g = angcomp(self.v_angle_x, self.b_angle_x);
|
||||
if (fabs(g) > 30)
|
||||
|
||||
g = angcomp (self.v_angle_x, self.b_angle_x);
|
||||
if (fabs (g) > 30)
|
||||
return; // argh, too far away
|
||||
g = angcomp(self.v_angle_y, self.b_angle_y);
|
||||
if (fabs(g) > 30)
|
||||
g = angcomp (self.v_angle_y, self.b_angle_y);
|
||||
if (fabs (g) > 30)
|
||||
return; // not again!
|
||||
self.button0 = TRUE;
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Bot_fight_style
|
||||
|
||||
This is the core of the bot's thinking when
|
||||
attacking an enemy.
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() bot_fight_style =
|
||||
void ()
|
||||
bot_fight_style =
|
||||
{
|
||||
local vector v, v1 = '0 0 0', v2 = '0 0 0', org;
|
||||
local float foedist, mysz, foesz;
|
||||
|
||||
local float foedist, mysz, foesz;
|
||||
local vector v, v1 = '0 0 0', v2 = '0 0 0', org;
|
||||
|
||||
if (self.enemy.health <= 0) {
|
||||
self.enemy = NIL;
|
||||
|
@ -315,42 +319,40 @@ void() bot_fight_style =
|
|||
} else if (!self.enemy.takedamage) {
|
||||
self.enemy = NIL;
|
||||
return;
|
||||
} else if (!fisible(self.enemy)) {
|
||||
} else if (!fisible (self.enemy)) {
|
||||
self.enemy = NIL;
|
||||
return;
|
||||
}
|
||||
|
||||
org = realorigin(self.enemy);
|
||||
makevectors(self.v_angle);
|
||||
org = realorigin (self.enemy);
|
||||
makevectors (self.v_angle);
|
||||
|
||||
// decide if I should shoot
|
||||
|
||||
foedist = vlen(org - self.origin);
|
||||
v = weapon_range(self.weapon);
|
||||
foedist = vlen (org - self.origin);
|
||||
v = weapon_range (self.weapon);
|
||||
if (foedist > v_y && foedist < v_z) {
|
||||
traceline(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * v_z, FALSE, self);
|
||||
traceline (self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * v_z, FALSE, self);
|
||||
if (vlen(trace_endpos - (self.origin + self.view_ofs)) >= v_y) {
|
||||
// try to avoid shooting teammates
|
||||
if (trace_ent.classname == "player")
|
||||
if ((trace_ent.team == self.team && teamplay) || (coop))
|
||||
return;
|
||||
bot_shoot();
|
||||
bot_shoot ();
|
||||
}
|
||||
} else
|
||||
bot_weapon_switch(foedist);
|
||||
bot_weapon_switch (foedist);
|
||||
|
||||
if (!(self.b_aiflags & (AI_PRECISION | AI_BLIND | AI_OBSTRUCTED))) {
|
||||
foesz = bot_size_player(self.enemy);
|
||||
mysz = bot_size_player(self) + 5;
|
||||
foesz = bot_size_player (self.enemy);
|
||||
mysz = bot_size_player (self) + 5;
|
||||
|
||||
if (foesz > mysz) {
|
||||
if (teamplay) {
|
||||
if (random() < 0.02) {
|
||||
bot_start_topic(5);
|
||||
if (random () < 0.02) {
|
||||
bot_start_topic (5);
|
||||
self.b_chattime = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
} else if (mysz < 140)
|
||||
return;
|
||||
|
@ -358,36 +360,34 @@ void() bot_fight_style =
|
|||
if (self.avoid.velocity)
|
||||
v = self.avoid.velocity;
|
||||
else
|
||||
v = normalize(self.avoid.origin - self.origin);
|
||||
v = normalize (self.avoid.origin - self.origin);
|
||||
v1_x = v_y;
|
||||
v1_y = v_y * -1;
|
||||
v2_x = v_y;
|
||||
v2_y = v_y * -1;
|
||||
foedist = vlen(self.avoid.origin - (self.origin + v1));
|
||||
if (foedist < vlen(self.avoid.origin - (self.origin + v2)))
|
||||
frik_walkmove(v2);
|
||||
foedist = vlen (self.avoid.origin - (self.origin + v1));
|
||||
if (foedist < vlen (self.avoid.origin - (self.origin + v2)))
|
||||
frik_walkmove (v2);
|
||||
else
|
||||
frik_walkmove(v1);
|
||||
frik_walkmove (v1);
|
||||
} else if (!(self.enemy.flags & FL_MONSTER)) {
|
||||
if (foedist + 32 < v_x)
|
||||
frik_walkmove(self.origin - org);
|
||||
frik_walkmove (self.origin - org);
|
||||
else if (foedist - 32 > v_x)
|
||||
frik_walkmove(org - self.origin);
|
||||
frik_walkmove (org - self.origin);
|
||||
else if (self.wallhug)
|
||||
frik_walkmove(v_right);
|
||||
frik_walkmove (v_right);
|
||||
else
|
||||
frik_walkmove(v_right * -1);
|
||||
frik_walkmove (v_right * -1);
|
||||
}
|
||||
} else {
|
||||
foesz = bot_size_player(self.enemy);
|
||||
mysz = bot_size_player(self) + 5;
|
||||
foesz = bot_size_player (self.enemy);
|
||||
mysz = bot_size_player (self) + 5;
|
||||
|
||||
if (foesz > mysz)
|
||||
return;
|
||||
else if (mysz < 140)
|
||||
return;
|
||||
self.keys = self.keys & 960;
|
||||
self.keys &= 960;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
592
fbxa/bot_misc.qc
592
fbxa/bot_misc.qc
|
@ -38,90 +38,91 @@ with applicable reexport restrictions.
|
|||
|
||||
Any reproduction of this software must contain
|
||||
this notice in its entirety.
|
||||
|
||||
*/
|
||||
|
||||
#include "libfrikbot.h"
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
BotName
|
||||
|
||||
Sets bot's name and colors
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
string(float r) BotName =
|
||||
string (float r)
|
||||
BotName =
|
||||
{
|
||||
self.b_num = r;
|
||||
if (r == 1) {
|
||||
switch (r) {
|
||||
case 1:
|
||||
self.b_pants = 11;
|
||||
self.b_shirt = 0;
|
||||
return "Vincent";
|
||||
} else if (r == 2) {
|
||||
case 2:
|
||||
self.b_pants = 1;
|
||||
self.b_shirt = 3;
|
||||
return "Bishop";
|
||||
} else if (r == 3) {
|
||||
case 3:
|
||||
self.b_pants = 13;
|
||||
self.b_shirt = 2;
|
||||
return "Nomad";
|
||||
} else if (r == 4) {
|
||||
case 4:
|
||||
self.b_pants = 7;
|
||||
self.b_shirt = 6;
|
||||
return "Hudson";
|
||||
} else if (r == 5) {
|
||||
case 5:
|
||||
self.b_pants = 12;
|
||||
self.b_shirt = 6;
|
||||
return "Lore";
|
||||
} else if (r == 6) {
|
||||
case 6:
|
||||
self.b_pants = 4;
|
||||
self.b_shirt = 4;
|
||||
return "Servo";
|
||||
} else if (r == 7) {
|
||||
case 7:
|
||||
self.b_pants = 2;
|
||||
self.b_shirt = 5;
|
||||
return "Gort";
|
||||
} else if (r == 8) {
|
||||
case 8:
|
||||
self.b_pants = 10;
|
||||
self.b_shirt = 3;
|
||||
return "Kryten";
|
||||
} else if (r == 9) {
|
||||
case 9:
|
||||
self.b_pants = 9;
|
||||
self.b_shirt = 4;
|
||||
return "Pimp Bot";
|
||||
} else if (r == 10) {
|
||||
case 10:
|
||||
self.b_pants = 4;
|
||||
self.b_shirt = 7;
|
||||
return "Max";
|
||||
} else if (r == 11) {
|
||||
case 11:
|
||||
self.b_pants = 3;
|
||||
self.b_shirt = 11;
|
||||
return "Marvin";
|
||||
} else if (r == 12) {
|
||||
case 12:
|
||||
self.b_pants = 13;
|
||||
self.b_shirt = 12;
|
||||
return "Erwin";
|
||||
} else if (r == 13) {
|
||||
case 13:
|
||||
self.b_pants = 11;
|
||||
self.b_shirt = 2;
|
||||
return "FrikBot";
|
||||
} else if (r == 14) {
|
||||
case 14:
|
||||
self.b_pants = 0;
|
||||
self.b_shirt = 2;
|
||||
return "Krosis";
|
||||
} else if (r == 15) {
|
||||
case 15:
|
||||
self.b_pants = 8;
|
||||
self.b_shirt = 9;
|
||||
return "Gypsy";
|
||||
} else if (r == 16) {
|
||||
case 16:
|
||||
self.b_pants = 5;
|
||||
self.b_shirt = 10;
|
||||
return "Hal";
|
||||
default:
|
||||
break;
|
||||
}
|
||||
};
|
||||
string () PickARandomName =
|
||||
|
||||
string ()
|
||||
PickARandomName =
|
||||
{
|
||||
if (bot_count > 16)
|
||||
return "player";
|
||||
|
@ -130,18 +131,16 @@ string () PickARandomName =
|
|||
local string h;
|
||||
local entity t;
|
||||
y = TRUE;
|
||||
while(y) {
|
||||
test = ceil(random() * 16);
|
||||
h = BotName(test);
|
||||
t = find(NIL, netname, h);
|
||||
while (y) {
|
||||
test = ceil (16 * random ());
|
||||
h = BotName (test);
|
||||
t = find (NIL, netname, h);
|
||||
if (t == NIL)
|
||||
y = FALSE;
|
||||
}
|
||||
return h;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// I didn't like the old code so this is very stripped down
|
||||
|
||||
entity b_originator;
|
||||
|
@ -163,10 +162,9 @@ b_originator == self
|
|||
10 - ridicule lost frag (lava)
|
||||
11 - lag
|
||||
b_originator == targ
|
||||
|
||||
|
||||
*/
|
||||
void(float tpic) bot_start_topic =
|
||||
void (float tpic)
|
||||
bot_start_topic =
|
||||
{
|
||||
if (random() < 0.2) {
|
||||
b_topic = tpic;
|
||||
|
@ -175,217 +173,293 @@ void(float tpic) bot_start_topic =
|
|||
b_topic = 0;
|
||||
};
|
||||
|
||||
void() bot_chat =
|
||||
void ()
|
||||
bot_chat =
|
||||
{
|
||||
local float r;
|
||||
|
||||
if (b_options & OPT_NOCHAT)
|
||||
return;
|
||||
r = ceil (random() * 6);
|
||||
|
||||
r = ceil (6 * random ());
|
||||
|
||||
if (self.b_chattime > time) {
|
||||
if (self.b_skill < 2)
|
||||
self.keys = self.button0 = self.button2 = 0;
|
||||
return;
|
||||
} else if (self.b_chattime) {
|
||||
if (b_topic == 1) {
|
||||
switch (b_topic) {
|
||||
case 1:
|
||||
if (b_originator == self) {
|
||||
if (r == 1) {
|
||||
BotSay(": lo all\n");
|
||||
bot_start_topic(8);
|
||||
} else if (r == 2) {
|
||||
BotSay(": hey everyone\n");
|
||||
bot_start_topic(8);
|
||||
} else if (r == 3) {
|
||||
BotSay(": prepare to be fragged!\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 4) {
|
||||
BotSay(": boy this is laggy\n");
|
||||
bot_start_topic(11);
|
||||
} else if (r == 5) {
|
||||
BotSay(": #mm getting some lag here\n");
|
||||
bot_start_topic(11);
|
||||
} else {
|
||||
switch (r) {
|
||||
case 1:
|
||||
BotSay (": lo all\n");
|
||||
bot_start_topic (8);
|
||||
break;
|
||||
case 2:
|
||||
BotSay (": hey everyone\n");
|
||||
bot_start_topic (8);
|
||||
break;
|
||||
case 3:
|
||||
BotSay (": prepare to be fragged!\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 4:
|
||||
BotSay (": boy this is laggy\n");
|
||||
bot_start_topic (11);
|
||||
break;
|
||||
case 5:
|
||||
BotSay (": #mm getting some lag here\n");
|
||||
bot_start_topic (11);
|
||||
break;
|
||||
default:
|
||||
BotSay(": hi everyone\n");
|
||||
bot_start_topic(8);
|
||||
bot_start_topic (8);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (b_topic == 2) {
|
||||
break;
|
||||
case 2:
|
||||
if (b_originator == self) {
|
||||
if (r == 1)
|
||||
BotSay(": take that\n");
|
||||
else if (r == 2)
|
||||
BotSay(": yehaww!\n");
|
||||
else if (r == 3)
|
||||
BotSay(": wh00p\n");
|
||||
else if (r == 4)
|
||||
BotSay(": j00_sawk();\n");
|
||||
else if (r == 5)
|
||||
BotSay(": i rule\n");
|
||||
else
|
||||
BotSay(": eat that\n");
|
||||
bot_start_topic(0);
|
||||
switch (r) {
|
||||
case 1:
|
||||
BotSay (": take that\n");
|
||||
break;
|
||||
case 2:
|
||||
BotSay (": yehaww!\n");
|
||||
break;
|
||||
case 3:
|
||||
BotSay (": wh00p\n");
|
||||
break;
|
||||
case 4:
|
||||
BotSay (": j00_sawk();\n");
|
||||
break;
|
||||
case 5:
|
||||
BotSay (": i rule\n");
|
||||
break;
|
||||
default:
|
||||
BotSay (": eat that\n");
|
||||
break;
|
||||
}
|
||||
bot_start_topic (0);
|
||||
}
|
||||
} else if (b_topic == 3) {
|
||||
break;
|
||||
case 3:
|
||||
if (b_originator == self) {
|
||||
if (r < 3)
|
||||
BotSayTeam(": friendly eyes\n");
|
||||
BotSayTeam (": friendly eyes\n");
|
||||
else
|
||||
BotSayTeam(": team eyes\n");
|
||||
bot_start_topic(0);
|
||||
BotSayTeam (": team eyes\n");
|
||||
bot_start_topic (0);
|
||||
}
|
||||
} else if (b_topic == 4) {
|
||||
break;
|
||||
case 4:
|
||||
if (b_originator == self) {
|
||||
if (r < 3)
|
||||
BotSayTeam(": on your back\n");
|
||||
BotSayTeam (": on your back\n");
|
||||
else
|
||||
BotSayTeam(": I'm with you\n");
|
||||
bot_start_topic(0);
|
||||
BotSayTeam (": I'm with you\n");
|
||||
bot_start_topic (0);
|
||||
}
|
||||
} else if (b_topic == 5) {
|
||||
break;
|
||||
case 5:
|
||||
if (b_originator == self) {
|
||||
if (r < 3)
|
||||
BotSayTeam(": I need help\n");
|
||||
BotSayTeam (": I need help\n");
|
||||
else
|
||||
BotSayTeam(": need backup\n");
|
||||
bot_start_topic(0);
|
||||
BotSayTeam (": need backup\n");
|
||||
bot_start_topic (0);
|
||||
}
|
||||
} else if (b_topic == 6) {
|
||||
break;
|
||||
case 6:
|
||||
if (b_originator == self) {
|
||||
if (r == 1) {
|
||||
BotSay(": sun got in my eyes\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 2) {
|
||||
BotSay(": mouse needs cleaning\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 3) {
|
||||
BotSay(": i meant to do that\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 4) {
|
||||
BotSay(": lag\n");
|
||||
bot_start_topic(11);
|
||||
} else if (r == 5) {
|
||||
BotSay(": killer lag\n");
|
||||
bot_start_topic(11);
|
||||
} else {
|
||||
BotSay(": 100% lag\n");
|
||||
bot_start_topic(11);
|
||||
switch (r) {
|
||||
case 1:
|
||||
BotSay (": sun got in my eyes\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 2:
|
||||
BotSay (": mouse needs cleaning\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 3:
|
||||
BotSay (": i meant to do that\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 4:
|
||||
BotSay (": lag\n");
|
||||
bot_start_topic (11);
|
||||
break;
|
||||
case 5:
|
||||
BotSay (": killer lag\n");
|
||||
bot_start_topic (11);
|
||||
break;
|
||||
default:
|
||||
BotSay (": 100% lag\n");
|
||||
bot_start_topic (11);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (b_topic == 7) {
|
||||
if (r == 1)
|
||||
BotSay(": gg\n");
|
||||
else if (r == 2)
|
||||
BotSay(": gg all\n");
|
||||
else if (r == 3)
|
||||
BotSay(": that was fun\n");
|
||||
else if (r == 4)
|
||||
BotSay(": good game\n");
|
||||
else if (r == 5)
|
||||
BotSay(": pah\n");
|
||||
else
|
||||
BotSay(": hrm\n");
|
||||
bot_start_topic(0);
|
||||
} else if (b_topic == 8) {
|
||||
break;
|
||||
case 7:
|
||||
switch (r) {
|
||||
case 1:
|
||||
BotSay (": gg\n");
|
||||
break;
|
||||
case 2:
|
||||
BotSay (": gg all\n");
|
||||
break;
|
||||
case 3:
|
||||
BotSay (": that was fun\n");
|
||||
break;
|
||||
case 4:
|
||||
BotSay (": good game\n");
|
||||
break;
|
||||
case 5:
|
||||
BotSay (": pah\n");
|
||||
break;
|
||||
default:
|
||||
BotSay (": hrm\n");
|
||||
break;
|
||||
}
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 8:
|
||||
if (b_originator != self) {
|
||||
if (r == 1) {
|
||||
BotSay(": heya\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 2) {
|
||||
BotSay(": welcome\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 3) {
|
||||
BotSayInit();
|
||||
BotSay2(": hi ");
|
||||
BotSay2(b_originator.netname);
|
||||
BotSay2("\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 4) {
|
||||
BotSayInit();
|
||||
BotSay2(": hey ");
|
||||
BotSay2(b_originator.netname);
|
||||
BotSay2("\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 5) {
|
||||
BotSay(": howdy\n");
|
||||
bot_start_topic(0);
|
||||
} else {
|
||||
switch (r) {
|
||||
case 1:
|
||||
BotSay (": heya\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 2:
|
||||
BotSay (": welcome\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 3:
|
||||
BotSayInit ();
|
||||
BotSay2 (": hi ");
|
||||
BotSay2 (b_originator.netname);
|
||||
BotSay2 ("\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 5:
|
||||
BotSayInit ();
|
||||
BotSay2 (": hey ");
|
||||
BotSay2 (b_originator.netname);
|
||||
BotSay2 ("\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 5:
|
||||
BotSay (": howdy\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
default:
|
||||
BotSay(": lo\n");
|
||||
bot_start_topic(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (b_topic == 9) {
|
||||
break;
|
||||
case 9:
|
||||
if (b_originator != self) {
|
||||
if (r == 1)
|
||||
BotSay(": hah\n");
|
||||
else if (r == 2)
|
||||
BotSay(": heheh\n");
|
||||
else if (r == 3) {
|
||||
BotSayInit();
|
||||
BotSay2(": good work ");
|
||||
BotSay2(b_originator.netname);
|
||||
BotSay2("\n");
|
||||
} else if (r == 4) {
|
||||
BotSayInit();
|
||||
BotSay2(": nice1 ");
|
||||
BotSay2(b_originator.netname);
|
||||
BotSay2("\n");
|
||||
} else if (r == 5)
|
||||
BotSay(": lol\n");
|
||||
else
|
||||
BotSay(": :)\n");
|
||||
switch (r) {
|
||||
case 1:
|
||||
BotSay (": hah\n");
|
||||
break;
|
||||
case 2:
|
||||
BotSay (": heheh\n");
|
||||
break;
|
||||
case 3:
|
||||
BotSayInit ();
|
||||
BotSay2 (": good work ");
|
||||
BotSay2 (b_originator.netname);
|
||||
BotSay2 ("\n");
|
||||
break;
|
||||
case 4:
|
||||
BotSayInit ();
|
||||
BotSay2 (": nice1 ");
|
||||
BotSay2 (b_originator.netname);
|
||||
BotSay2 ("\n");
|
||||
break;
|
||||
case 5:
|
||||
BotSay (": lol\n");
|
||||
break;
|
||||
default:
|
||||
BotSay (": :)\n");
|
||||
break;
|
||||
}
|
||||
b_topic = 6;
|
||||
}
|
||||
} else if (b_topic == 10) {
|
||||
break;
|
||||
case 10:
|
||||
if (b_originator != self) {
|
||||
if (r == 1)
|
||||
BotSay(": have a nice dip?\n");
|
||||
else if (r == 2)
|
||||
BotSay(": bah I hate levels with lava\n");
|
||||
else if (r == 3) {
|
||||
switch (r) {
|
||||
case 1:
|
||||
BotSay (": have a nice dip?\n");
|
||||
break;
|
||||
case 2:
|
||||
BotSay (": bah I hate levels with lava\n");
|
||||
break;
|
||||
case 3:
|
||||
BotSayInit();
|
||||
BotSay2(": good job ");
|
||||
BotSay2(b_originator.netname);
|
||||
BotSay2("\n");
|
||||
} else if (r == 4) {
|
||||
BotSayInit();
|
||||
BotSay2(": nice backflip ");
|
||||
BotSay2(b_originator.netname);
|
||||
BotSay2("\n");
|
||||
} else if (r == 5)
|
||||
BotSay(": watch your step\n");
|
||||
else
|
||||
BotSay(": hehe\n");
|
||||
BotSay2 (": good job ");
|
||||
BotSay2 (b_originator.netname);
|
||||
BotSay2 ("\n");
|
||||
break;
|
||||
case 4:
|
||||
BotSayInit ();
|
||||
BotSay2 (": nice backflip ");
|
||||
BotSay2 (b_originator.netname);
|
||||
BotSay2 ("\n");
|
||||
break;
|
||||
case 5:
|
||||
BotSay (": watch your step\n");
|
||||
break;
|
||||
default:
|
||||
BotSay (": hehe\n");
|
||||
break;
|
||||
}
|
||||
b_topic = 6;
|
||||
}
|
||||
} else if (b_topic == 11) {
|
||||
break;
|
||||
case 11:
|
||||
if (b_originator != self) {
|
||||
if (r == 1) {
|
||||
BotSayInit();
|
||||
BotSay2(": yeah right ");
|
||||
BotSay2(b_originator.netname);
|
||||
BotSay2("\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 2) {
|
||||
BotSay(": ping\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 3) {
|
||||
BotSay(": shuddup, you're an lpb\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 4) {
|
||||
BotSay(": lag my eye\n");
|
||||
bot_start_topic(0);
|
||||
} else if (r == 5) {
|
||||
BotSay(": yeah\n");
|
||||
bot_start_topic(11);
|
||||
} else {
|
||||
BotSay(": totally\n");
|
||||
bot_start_topic(11);
|
||||
switch (r) {
|
||||
case 1:
|
||||
BotSayInit ();
|
||||
BotSay2 (": yeah right ");
|
||||
BotSay2 (b_originator.netname);
|
||||
BotSay2 ("\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 2:
|
||||
BotSay (": ping\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 3:
|
||||
BotSay (": shuddup, you're an lpb\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 4:
|
||||
BotSay (": lag my eye\n");
|
||||
bot_start_topic (0);
|
||||
break;
|
||||
case 5:
|
||||
BotSay (": yeah\n");
|
||||
bot_start_topic (11);
|
||||
break;
|
||||
default:
|
||||
BotSay (": totally\n");
|
||||
bot_start_topic (11);
|
||||
break;
|
||||
}
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
self.b_chattime = 0;
|
||||
} else if (b_topic) {
|
||||
if (random() < 0.5) {
|
||||
if (random () < 0.5) {
|
||||
if (self == b_originator) {
|
||||
if (b_topic <= 7)
|
||||
self.b_chattime = time + 2;
|
||||
|
@ -397,64 +471,47 @@ void() bot_chat =
|
|||
}
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Kick A Bot.
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() KickABot =
|
||||
void ()
|
||||
KickABot =
|
||||
{
|
||||
local entity ty;
|
||||
ty = find(NIL, classname, "player");
|
||||
|
||||
ty = find (NIL, classname, "player");
|
||||
while (ty != NIL) {
|
||||
if (!(ty.ishuman)) {
|
||||
|
||||
BotDisconnect(ty);
|
||||
BotDisconnect (ty);
|
||||
ty.ishuman = TRUE;
|
||||
ty = NIL;
|
||||
} else
|
||||
ty = find(ty, classname, "player");
|
||||
ty = find (ty, classname, "player");
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Simplified origin checking.
|
||||
|
||||
God, I wish I had inline
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
vector(entity ent) realorigin =
|
||||
vector (entity ent)
|
||||
realorigin =
|
||||
{
|
||||
// even more simplified...
|
||||
// even more simplified...
|
||||
return (ent.absmin + ent.absmax) * 0.5;
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
fisible
|
||||
|
||||
a version of visible that checks for corners
|
||||
of the bounding boxes
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
float (entity targ) fisible =
|
||||
float (entity targ)
|
||||
fisible =
|
||||
{
|
||||
local float thruwater = 0, pc1 = 0, pc2 = 0;
|
||||
local vector spot1, org;
|
||||
local float thruwater = 0, pc1 = 0, pc2 = 0;
|
||||
|
||||
org = realorigin(targ);
|
||||
|
||||
org = realorigin (targ);
|
||||
spot1 = self.origin + self.view_ofs;
|
||||
|
||||
if (targ.solid == SOLID_BSP) {
|
||||
|
@ -465,8 +522,8 @@ float (entity targ) fisible =
|
|||
return TRUE;
|
||||
return FALSE;
|
||||
} else {
|
||||
pc1 = pointcontents(org);
|
||||
pc2 = pointcontents(spot1);
|
||||
pc1 = pointcontents (org);
|
||||
pc2 = pointcontents (spot1);
|
||||
if (targ.classname == "player")
|
||||
thruwater = FALSE;
|
||||
else if (pc1 == CONTENT_LAVA)
|
||||
|
@ -523,26 +580,21 @@ float (entity targ) fisible =
|
|||
return FALSE;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Wisible
|
||||
|
||||
goes through movable brushes/entities, used
|
||||
for waypoints
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
// this is used for waypoint stuff....
|
||||
float (entity targ1, entity targ2) wisible =
|
||||
float (entity targ1, entity targ2)
|
||||
wisible =
|
||||
{
|
||||
local entity ignore;
|
||||
local vector spot1, spot2;
|
||||
local entity ignore;
|
||||
|
||||
spot1 = targ1.origin;
|
||||
spot2 = realorigin(targ2);
|
||||
spot2 = realorigin (targ2);
|
||||
|
||||
ignore = self;
|
||||
do {
|
||||
|
@ -556,19 +608,14 @@ float (entity targ1, entity targ2) wisible =
|
|||
return FALSE;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
sisible
|
||||
|
||||
Now this is getting ridiculous. Simple visible,
|
||||
used when we need just a simple traceline nothing else
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
float (entity targ) sisible =
|
||||
float (entity targ)
|
||||
sisible =
|
||||
{
|
||||
traceline (self.origin, targ.origin, TRUE, self);
|
||||
if (trace_ent == targ)
|
||||
|
@ -576,65 +623,54 @@ float (entity targ) sisible =
|
|||
else if (trace_fraction == 1)
|
||||
return TRUE;
|
||||
};
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
/*
|
||||
angcomp
|
||||
|
||||
subtracts one angle from another
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
float (float y1, float y2) angcomp =
|
||||
float (float y1, float y2)
|
||||
angcomp =
|
||||
{
|
||||
y1 = frik_anglemod(y1);
|
||||
y2 = frik_anglemod(y2);
|
||||
|
||||
local float answer;
|
||||
|
||||
y1 = frik_anglemod (y1);
|
||||
y2 = frik_anglemod (y2);
|
||||
|
||||
answer = y1 - y2;
|
||||
if (answer > 180)
|
||||
answer = (360 - answer) * -1;
|
||||
answer -= 360;
|
||||
else if (answer < -180)
|
||||
answer = answer + 360;
|
||||
answer += 360;
|
||||
return answer;
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
fov
|
||||
|
||||
is the entity in the bot's field of view
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
float (entity targ) fov =
|
||||
float (entity targ)
|
||||
fov =
|
||||
{
|
||||
local vector yawn;
|
||||
local float g;
|
||||
yawn = realorigin(targ);
|
||||
local float g;
|
||||
local vector yawn;
|
||||
|
||||
yawn = realorigin (targ);
|
||||
yawn = (yawn + targ.view_ofs) - (self.origin + self.view_ofs);
|
||||
yawn = normalize(yawn);
|
||||
yawn = vectoangles(yawn);
|
||||
g = angcomp(self.v_angle_x, yawn_x);
|
||||
if (fabs(g) > 45)
|
||||
yawn = normalize (yawn);
|
||||
yawn = vectoangles (yawn);
|
||||
g = angcomp (self.v_angle_x, yawn_x);
|
||||
if (fabs (g) > 45)
|
||||
return FALSE;
|
||||
g = angcomp(self.v_angle_y, yawn_y);
|
||||
if (fabs(g) > 60)
|
||||
g = angcomp (self.v_angle_y, yawn_y);
|
||||
if (fabs (g) > 60)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
frik_anglemod
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
float(float v) frik_anglemod =
|
||||
float (float v)
|
||||
frik_anglemod =
|
||||
{
|
||||
return v - floor(v/360) * 360;
|
||||
return v - floor (v / 360) * 360;
|
||||
};
|
||||
|
|
206
fbxa/bot_move.qc
206
fbxa/bot_move.qc
|
@ -6,7 +6,6 @@
|
|||
***********************************************/
|
||||
|
||||
/*
|
||||
|
||||
This program is in the Public Domain. My crack legal
|
||||
team would like to add:
|
||||
|
||||
|
@ -39,18 +38,19 @@ with applicable reexport restrictions.
|
|||
|
||||
Any reproduction of this software must contain
|
||||
this notice in its entirety.
|
||||
|
||||
*/
|
||||
|
||||
#include "libfrikbot.h"
|
||||
|
||||
void() bot_jump =
|
||||
void ()
|
||||
bot_jump =
|
||||
{
|
||||
// TODO check for precision, etc.
|
||||
self.button2 = TRUE;
|
||||
};
|
||||
|
||||
float(entity e) bot_can_rj =
|
||||
float (entity e)
|
||||
bot_can_rj =
|
||||
{
|
||||
// this returns true of the bot can rocket/superjump/hook
|
||||
// if your mod doesn't have an RL you can just return FALSE all the time
|
||||
|
@ -79,20 +79,21 @@ float(entity e) bot_can_rj =
|
|||
return FALSE;
|
||||
};
|
||||
|
||||
float(float flag) frik_recognize_plat =
|
||||
float (float flag)
|
||||
frik_recognize_plat =
|
||||
{
|
||||
if ((self.classname != "waypoint") && !(self.flags & FL_ONGROUND))
|
||||
return FALSE;
|
||||
traceline(self.origin, self.origin - '0 0 64', TRUE, self);
|
||||
traceline (self.origin, self.origin - '0 0 64', TRUE, self);
|
||||
if (trace_ent != NIL) {
|
||||
if (flag) {
|
||||
// afect bot movement too
|
||||
if (self.keys & KEY_MOVEUP) {
|
||||
if (trace_ent.velocity_z > 0)
|
||||
self.keys = self.keys & 960; // 960 is all view keys
|
||||
self.keys &= 960; // 960 is all view keys
|
||||
} else if (self.keys & KEY_MOVEDOWN) {
|
||||
if (trace_ent.velocity_z < 0)
|
||||
self.keys = self.keys & 960;
|
||||
self.keys &= 960;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
|
@ -100,60 +101,56 @@ float(float flag) frik_recognize_plat =
|
|||
return FALSE;
|
||||
};
|
||||
|
||||
float(vector sdir) frik_KeysForDir =
|
||||
float (vector sdir)
|
||||
frik_KeysForDir =
|
||||
{
|
||||
|
||||
local vector keydir;
|
||||
local float outkeys, tang;
|
||||
local vector keydir;
|
||||
|
||||
outkeys = 0;
|
||||
if (sdir_x || sdir_y) {
|
||||
// Everything is tested against 60 degrees,
|
||||
// this allows the bot to overlap the keys
|
||||
// 30 degrees on each diagonal 45 degrees
|
||||
// might look more realistic
|
||||
// Everything is tested against 60 degrees, this allows the bot to
|
||||
// overlap the keys 30 degrees on each diagonal 45 degrees might look
|
||||
// more realistic
|
||||
|
||||
keydir = vectoangles(sdir);
|
||||
tang = angcomp(keydir_y, self.v_angle_y);
|
||||
keydir = vectoangles (sdir);
|
||||
tang = angcomp (keydir_y, self.v_angle_y);
|
||||
if ((tang <= 150) && (tang >= 30))
|
||||
outkeys = outkeys + KEY_MOVELEFT;
|
||||
outkeys |= KEY_MOVELEFT;
|
||||
else if ((tang >= -150) && (tang <= -30))
|
||||
outkeys = outkeys + KEY_MOVERIGHT;
|
||||
outkeys |= KEY_MOVERIGHT;
|
||||
if (fabs(tang) <= 60)
|
||||
outkeys = outkeys + KEY_MOVEFORWARD;
|
||||
outkeys |= KEY_MOVEFORWARD;
|
||||
else if (fabs(tang) >= 120)
|
||||
outkeys = outkeys + KEY_MOVEBACK;
|
||||
outkeys |= KEY_MOVEBACK;
|
||||
}
|
||||
if (sdir_z > 0.7)
|
||||
outkeys = outkeys + KEY_MOVEUP;
|
||||
outkeys |= KEY_MOVEUP;
|
||||
else if (sdir_z < 0.7)
|
||||
outkeys = outkeys + KEY_MOVEDOWN;
|
||||
outkeys |= KEY_MOVEDOWN;
|
||||
return outkeys;
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
frik_obstructed
|
||||
|
||||
Bot has hit a ledge or wall that he should
|
||||
manuever around.
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void(vector whichway, float danger) frik_obstructed =
|
||||
void (vector whichway, float danger)
|
||||
frik_obstructed =
|
||||
{
|
||||
local float dist;
|
||||
local vector disway, org;
|
||||
|
||||
// TODO: something
|
||||
if (self.b_aiflags & AI_BLIND)
|
||||
return;
|
||||
org = realorigin(self.target1);
|
||||
|
||||
if (danger) {
|
||||
self.b_aiflags = self.b_aiflags | AI_DANGER;
|
||||
self.keys = frik_KeysForDir('0 0 0' - whichway);
|
||||
self.b_aiflags |= AI_DANGER;
|
||||
self.keys = frik_KeysForDir ('0 0 0' - whichway);
|
||||
}
|
||||
if (self.b_aiflags & AI_PRECISION)
|
||||
return;
|
||||
|
@ -162,7 +159,7 @@ void(vector whichway, float danger) frik_obstructed =
|
|||
if (self.target1) {
|
||||
if (self.b_aiflags & AI_OBSTRUCTED) {
|
||||
if (!(self.b_aiflags & AI_DANGER)) {
|
||||
self.b_aiflags = self.b_aiflags - AI_OBSTRUCTED;
|
||||
self.b_aiflags &= ~AI_OBSTRUCTED;
|
||||
return;
|
||||
} else if (!danger)
|
||||
return;
|
||||
|
@ -171,40 +168,35 @@ void(vector whichway, float danger) frik_obstructed =
|
|||
disway_x = whichway_y * -1;
|
||||
disway_y = whichway_x;
|
||||
disway_z = 0;
|
||||
dist = vlen(org - (self.origin + disway));
|
||||
dist = vlen (org - (self.origin + disway));
|
||||
disway_x = whichway_y;
|
||||
disway_y = whichway_x * -1;
|
||||
self.wallhug = (vlen(org - (self.origin + disway)) > dist) ? 1.0 : 0.0;
|
||||
self.b_aiflags = self.b_aiflags | AI_OBSTRUCTED;
|
||||
self.wallhug = (vlen (org - (self.origin + disway)) > dist) ? 1.0 : 0.0;
|
||||
self.b_aiflags |= AI_OBSTRUCTED;
|
||||
|
||||
} else {
|
||||
disway_x = whichway_y * -1;
|
||||
disway_y = whichway_x;
|
||||
disway_z = 0;
|
||||
dist = vlen(disway - self.obs_dir);
|
||||
dist = vlen (disway - self.obs_dir);
|
||||
disway_x = whichway_y;
|
||||
disway_y = whichway_x * -1;
|
||||
self.wallhug = (vlen(disway - self.obs_dir) < dist) ? 1.0 : 0.0;
|
||||
self.wallhug = (vlen (disway - self.obs_dir) < dist) ? 1.0 : 0.0;
|
||||
self.obs_dir = whichway;
|
||||
|
||||
self.b_aiflags = self.b_aiflags | AI_OBSTRUCTED;
|
||||
self.b_aiflags |= AI_OBSTRUCTED;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
frik_obstacles
|
||||
|
||||
Detects small bumps the bot needs to jump over
|
||||
or ledges the bot should avoid falling in.
|
||||
|
||||
Also responsible for jumping gaps.
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() frik_obstacles =
|
||||
void ()
|
||||
frik_obstacles =
|
||||
{
|
||||
local vector start, stop, ang;
|
||||
local float test, conts, dist, hgt;
|
||||
|
@ -220,7 +212,7 @@ void() frik_obstacles =
|
|||
start_z = self.origin_z + self.maxs_z;
|
||||
stop = start;
|
||||
stop_z = self.origin_z + self.mins_z;
|
||||
traceline(start, stop - '0 0 256', TRUE, self);
|
||||
traceline (start, stop - '0 0 256', TRUE, self);
|
||||
if (trace_allsolid || trace_startsolid)
|
||||
return;
|
||||
hgt = trace_endpos_z - stop_z;
|
||||
|
@ -232,27 +224,27 @@ void() frik_obstacles =
|
|||
if (hgt >= 0)
|
||||
return;
|
||||
|
||||
conts = pointcontents(trace_endpos + '0 0 4');
|
||||
conts = pointcontents (trace_endpos + '0 0 4');
|
||||
start = stop - '0 0 8';
|
||||
stop = start + ang * 256;
|
||||
traceline(start, stop, TRUE, self);
|
||||
traceline (start, stop, TRUE, self);
|
||||
test = vlen(trace_endpos - start);
|
||||
if (test <= 20)
|
||||
return; // it's a walkable gap, do nothing
|
||||
ang_x = self.velocity_y * -1;
|
||||
ang_y = self.velocity_x;
|
||||
ang = normalize(ang);
|
||||
traceline(start - (ang * 10), start + (ang * 10), TRUE, self);
|
||||
ang = normalize (ang);
|
||||
traceline (start - (ang * 10), start + (ang * 10), TRUE, self);
|
||||
if ((trace_fraction != 1) || trace_startsolid)
|
||||
return; // gap is only 20 wide, walkable
|
||||
ang = self.velocity;
|
||||
ang_z = 0;
|
||||
dist = ((540 / sv_gravity) * vlen(ang))/* + 32*/;
|
||||
dist = ((540 / sv_gravity) * vlen (ang))/* + 32*/;
|
||||
if (test > dist) {
|
||||
// I can't make it
|
||||
if (conts < -3) {
|
||||
// bad stuff down dare
|
||||
frik_obstructed(ang, TRUE);
|
||||
frik_obstructed (ang, TRUE);
|
||||
return;
|
||||
} else {
|
||||
if (self.target1) {
|
||||
|
@ -260,13 +252,13 @@ void() frik_obstacles =
|
|||
if ((stop_z - self.origin_z) < -32)
|
||||
return; // safe to fall
|
||||
}
|
||||
frik_obstructed(ang, FALSE);
|
||||
frik_obstructed (ang, FALSE);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
ang = normalize(ang);
|
||||
//look for a ledge
|
||||
traceline(self.origin, self.origin + (ang * (test + 20)), TRUE, self);
|
||||
traceline (self.origin, self.origin + (ang * (test + 20)), TRUE, self);
|
||||
if (trace_fraction != 1) {
|
||||
if (conts < -3) {
|
||||
// bad stuff down dare
|
||||
|
@ -278,21 +270,21 @@ void() frik_obstacles =
|
|||
if ((stop_z - self.origin_z) < -32)
|
||||
return; // safe to fall
|
||||
}
|
||||
frik_obstructed(ang, FALSE);
|
||||
frik_obstructed (ang, FALSE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (self.target1) {
|
||||
// getting furter away from my target?
|
||||
test = vlen(self.target1.origin - (ang + self.origin));
|
||||
if (test > vlen(self.target1.origin - self.origin)) {
|
||||
test = vlen (self.target1.origin - (ang + self.origin));
|
||||
if (test > vlen (self.target1.origin - self.origin)) {
|
||||
if (conts < -3) {
|
||||
// bad stuff down dare
|
||||
frik_obstructed(ang, TRUE);
|
||||
frik_obstructed (ang, TRUE);
|
||||
return;
|
||||
} else {
|
||||
frik_obstructed(ang, FALSE);
|
||||
frik_obstructed (ang, FALSE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -300,36 +292,33 @@ void() frik_obstacles =
|
|||
}
|
||||
if (hgt < -18) {
|
||||
if (self.target1) {
|
||||
stop = realorigin(self.target1);
|
||||
stop = realorigin (self.target1);
|
||||
if ((stop_z - self.origin_z) < -32)
|
||||
return; // safe to fall
|
||||
}
|
||||
bot_jump();
|
||||
bot_jump ();
|
||||
}
|
||||
// go for it
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
After frik_obstructed, the bot uses the
|
||||
After frik_obstructed, the bot uses the
|
||||
following funtion to move "around" the obstacle
|
||||
|
||||
I have no idea how well it will work
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() frik_dodge_obstruction =
|
||||
void ()
|
||||
frik_dodge_obstruction =
|
||||
{
|
||||
local vector way, org;
|
||||
local float oflags, yaw;
|
||||
|
||||
if (!(self.b_aiflags & AI_OBSTRUCTED))
|
||||
return;
|
||||
if ((self.b_aiflags & (AI_BLIND | AI_PRECISION)) || !(self.flags & FL_ONGROUND)) {
|
||||
self.b_aiflags = self.b_aiflags - AI_OBSTRUCTED;
|
||||
if ((self.b_aiflags & (AI_BLIND | AI_PRECISION))
|
||||
|| !(self.flags & FL_ONGROUND)) {
|
||||
self.b_aiflags &= ~AI_OBSTRUCTED;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -340,9 +329,9 @@ void() frik_dodge_obstruction =
|
|||
oflags = self.flags;
|
||||
org = self.origin;
|
||||
|
||||
yaw = vectoyaw(self.obs_dir);
|
||||
if (walkmove(yaw, 32))
|
||||
self.b_aiflags = self.b_aiflags - AI_OBSTRUCTED;
|
||||
yaw = vectoyaw (self.obs_dir);
|
||||
if (walkmove (yaw, 32))
|
||||
self.b_aiflags &= ~AI_OBSTRUCTED;
|
||||
else {
|
||||
if (self.b_aiflags & AI_DANGER) {
|
||||
way = '0 0 0' - self.obs_dir;
|
||||
|
@ -354,26 +343,22 @@ void() frik_dodge_obstruction =
|
|||
way_y = self.obs_dir_x * -1;
|
||||
}
|
||||
way_z = 0;
|
||||
self.keys = self.keys & 960 + frik_KeysForDir(way);
|
||||
self.keys &= 960;
|
||||
self.keys |= frik_KeysForDir (way);
|
||||
}
|
||||
|
||||
// fix the bot
|
||||
|
||||
self.origin = org;
|
||||
self.flags = oflags;
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
movetogoal and walkmove replacements
|
||||
|
||||
blah
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() frik_movetogoal =
|
||||
void ()
|
||||
frik_movetogoal =
|
||||
{
|
||||
local vector way;
|
||||
local float g;
|
||||
|
@ -389,40 +374,41 @@ void() frik_movetogoal =
|
|||
return;
|
||||
}
|
||||
|
||||
way = normalize(way);
|
||||
self.keys = self.keys & 960 + frik_KeysForDir(way);
|
||||
way = normalize (way);
|
||||
self.keys &= 960;
|
||||
self.keys |= frik_KeysForDir (way);
|
||||
|
||||
frik_dodge_obstruction();
|
||||
frik_recognize_plat(TRUE);
|
||||
frik_dodge_obstruction ();
|
||||
frik_recognize_plat (TRUE);
|
||||
|
||||
if (self.b_aiflags & AI_PRECISION) {
|
||||
g = angcomp(self.v_angle_x, self.b_angle_x);
|
||||
g = angcomp (self.v_angle_x, self.b_angle_x);
|
||||
if (fabs (g) > 10)
|
||||
self.keys &= 960;
|
||||
g = angcomp (self.v_angle_y, self.b_angle_y);
|
||||
if (fabs(g) > 10)
|
||||
self.keys = self.keys & 960;
|
||||
g = angcomp(self.v_angle_y, self.b_angle_y);
|
||||
if (fabs(g) > 10)
|
||||
self.keys = self.keys & 960;
|
||||
self.keys &= 960;
|
||||
}
|
||||
};
|
||||
|
||||
float(vector weird) frik_walkmove =
|
||||
float (vector weird)
|
||||
frik_walkmove =
|
||||
{
|
||||
// okay so it's not walkmove
|
||||
// sue me
|
||||
self.keys = self.keys & 960 + frik_KeysForDir(weird);
|
||||
self.keys &= 960;
|
||||
self.keys |= frik_KeysForDir (weird);
|
||||
|
||||
frik_dodge_obstruction();
|
||||
frik_recognize_plat(TRUE);
|
||||
frik_dodge_obstruction ();
|
||||
frik_recognize_plat (TRUE);
|
||||
if (self.b_aiflags & AI_OBSTRUCTED)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
The "hook" method of navigation. This nav
|
||||
system is copyrighted 1999 by Ryan "Frika C"
|
||||
Smith, keep that in mind when you steal it.
|
||||
|
@ -430,39 +416,39 @@ Smith, keep that in mind when you steal it.
|
|||
I brought this back because normal roaming
|
||||
won't work - the bot gets distracted by it's
|
||||
own waypoints.
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() frik_bot_roam =
|
||||
void ()
|
||||
frik_bot_roam =
|
||||
{
|
||||
local vector org, ang, org1;
|
||||
local float loopcount, flag, dist;
|
||||
local vector org, ang, org1;
|
||||
|
||||
loopcount = 26;
|
||||
flag = FALSE;
|
||||
while((loopcount > 0) && !flag) {
|
||||
loopcount = loopcount - 1;
|
||||
while ((loopcount > 0) && !flag) {
|
||||
loopcount--;
|
||||
org = self.origin + self.view_ofs;
|
||||
ang = self.angles;
|
||||
ang_y = frik_anglemod(ang_y - 90 + (random() * 180));
|
||||
ang_y = frik_anglemod (ang_y - 90 + (180 * random ()));
|
||||
ang_x = 0; // avoid upward sloping
|
||||
makevectors(ang);
|
||||
traceline(org, org + v_forward * 2300, TRUE, self);
|
||||
makevectors (ang);
|
||||
traceline (org, org + v_forward * 2300, TRUE, self);
|
||||
if (trace_fraction != 1) {
|
||||
org1 = trace_endpos;
|
||||
ang = normalize(trace_plane_normal);
|
||||
ang = normalize (trace_plane_normal);
|
||||
ang_z = 0; // avoid upward sloping
|
||||
traceline(org1, org1 + (ang * 2300), TRUE, self);
|
||||
traceline (org1, org1 + (ang * 2300), TRUE, self);
|
||||
if ((trace_fraction != 1) && (vlen(trace_endpos - org1) >= 64)) {
|
||||
org = trace_endpos;
|
||||
traceline(org, self.origin + self.view_ofs, TRUE, self);
|
||||
traceline (org, self.origin + self.view_ofs, TRUE, self);
|
||||
if (trace_fraction != 1) {
|
||||
dist = vlen(org1 - org) /2;
|
||||
dist = vlen (org1 - org) /2;
|
||||
org = org1 + (ang * dist);
|
||||
traceline(org, org - '0 0 48', TRUE, self);
|
||||
if (trace_fraction != 1) {
|
||||
SpawnTempWaypoint(org);
|
||||
SpawnTempWaypoint (org);
|
||||
flag = TRUE;
|
||||
}
|
||||
}
|
||||
|
|
241
fbxa/bot_phys.qc
241
fbxa/bot_phys.qc
|
@ -68,17 +68,17 @@ void() CL_KeyMove = // CL_BaseMove + CL_AdjustAngles
|
|||
|
||||
if (self.keys != self.oldkeys) {
|
||||
self.movevect = '0 0 0';
|
||||
self.movevect_y = self.movevect_y + (350 * CL_KeyState(KEY_MOVERIGHT));
|
||||
self.movevect_y = self.movevect_y + (350 * CL_KeyState (KEY_MOVERIGHT));
|
||||
// 350 is the default cl_sidespeed
|
||||
self.movevect_y = self.movevect_y - (350 * CL_KeyState(KEY_MOVELEFT));
|
||||
self.movevect_y = self.movevect_y - (350 * CL_KeyState (KEY_MOVELEFT));
|
||||
// 350 is the default cl_sidespeed
|
||||
self.movevect_x = self.movevect_x + (200 * CL_KeyState(KEY_MOVEFORWARD));
|
||||
self.movevect_x = self.movevect_x + (200 * CL_KeyState (KEY_MOVEFORWARD));
|
||||
// 200 is the default cl_forwardspeed
|
||||
self.movevect_x = self.movevect_x - (200 * CL_KeyState(KEY_MOVEBACK));
|
||||
self.movevect_x = self.movevect_x - (200 * CL_KeyState (KEY_MOVEBACK));
|
||||
// 200 is the default cl_backspeed
|
||||
self.movevect_z = self.movevect_z + (200 * CL_KeyState(KEY_MOVEUP));
|
||||
self.movevect_z = self.movevect_z + (200 * CL_KeyState (KEY_MOVEUP));
|
||||
// 200 is the default cl_upspeed
|
||||
self.movevect_z = self.movevect_z - (200 * CL_KeyState(KEY_MOVEDOWN));
|
||||
self.movevect_z = self.movevect_z - (200 * CL_KeyState (KEY_MOVEDOWN));
|
||||
// 200 is the default cl_upspeed
|
||||
if (!(self.b_aiflags & AI_PRECISION))
|
||||
self.movevect = self.movevect * 2;
|
||||
|
@ -88,27 +88,27 @@ void() CL_KeyMove = // CL_BaseMove + CL_AdjustAngles
|
|||
|
||||
if (self.b_skill != 2) {
|
||||
// use mouse emulation
|
||||
anglespeed = 1.5 * real_frametime;
|
||||
anglespeed = 1.5 * real_frametime;
|
||||
// 1.5 is the default cl_anglespeedkey & bot always has +speed
|
||||
self.v_angle_y = self.v_angle_y + anglespeed * CL_KeyState(KEY_LOOKLEFT) * 140;
|
||||
self.v_angle_y = self.v_angle_y + anglespeed * CL_KeyState (KEY_LOOKLEFT) * 140;
|
||||
// 140 is default cl_yawspeed
|
||||
self.v_angle_y = self.v_angle_y - anglespeed * CL_KeyState(KEY_LOOKRIGHT) * 140;
|
||||
self.v_angle_y = self.v_angle_y - anglespeed * CL_KeyState (KEY_LOOKRIGHT) * 140;
|
||||
// 140 is default cl_yawspeed
|
||||
self.v_angle_x = self.v_angle_x - anglespeed * CL_KeyState(KEY_LOOKUP) * 150;
|
||||
self.v_angle_x = self.v_angle_x - anglespeed * CL_KeyState (KEY_LOOKUP) * 150;
|
||||
// 150 is default cl_pitchspeed
|
||||
self.v_angle_x = self.v_angle_x + anglespeed * CL_KeyState(KEY_LOOKDOWN) * 150;
|
||||
self.v_angle_x = self.v_angle_x + anglespeed * CL_KeyState (KEY_LOOKDOWN) * 150;
|
||||
// 150 is default cl_pitchspeed
|
||||
} else {
|
||||
view_x = angcomp(self.b_angle_x, self.v_angle_x);
|
||||
view_y = angcomp(self.b_angle_y, self.v_angle_y);
|
||||
view_x = angcomp (self.b_angle_x, self.v_angle_x);
|
||||
view_y = angcomp (self.b_angle_y, self.v_angle_y);
|
||||
view_z = 0;
|
||||
if (vlen(view) > 30) {
|
||||
if (vlen (view) > 30) {
|
||||
self.mouse_emu = self.mouse_emu + (view * 30);
|
||||
if (vlen(self.mouse_emu) > 180)
|
||||
self.mouse_emu = normalize(self.mouse_emu) * 180;
|
||||
} else
|
||||
self.mouse_emu = normalize (self.mouse_emu) * 180;
|
||||
} else
|
||||
self.mouse_emu = view * (1 / real_frametime);
|
||||
self.v_angle = self.v_angle + self.mouse_emu * real_frametime;
|
||||
self.v_angle += self.mouse_emu * real_frametime;
|
||||
|
||||
|
||||
}
|
||||
|
@ -121,7 +121,7 @@ void() CL_KeyMove = // CL_BaseMove + CL_AdjustAngles
|
|||
self.v_angle_z = 50;
|
||||
else if (self.v_angle_z < -50)
|
||||
self.v_angle_z = -50;
|
||||
self.v_angle_y = frik_anglemod(self.v_angle_y);
|
||||
self.v_angle_y = frik_anglemod (self.v_angle_y);
|
||||
|
||||
};
|
||||
|
||||
|
@ -139,7 +139,7 @@ void() SV_UserFriction =
|
|||
|
||||
vel = self.velocity;
|
||||
vel_z =0;
|
||||
sped = vlen(vel);
|
||||
sped = vlen (vel);
|
||||
vel = self.velocity;
|
||||
|
||||
if (!sped)
|
||||
|
@ -152,7 +152,7 @@ void() SV_UserFriction =
|
|||
start_z = self.origin_z + self.mins_z;
|
||||
stop_z = start_z - 34;
|
||||
|
||||
traceline(start, stop, TRUE, self);
|
||||
traceline (start, stop, TRUE, self);
|
||||
|
||||
if (trace_fraction == 1)
|
||||
friction = sv_friction * 2; // 2 is default edgefriction, removed for QW compatability
|
||||
|
@ -174,7 +174,7 @@ void() SV_UserFriction =
|
|||
void() SV_WaterJump =
|
||||
{
|
||||
if (time > self.teleport_time || !self.waterlevel) {
|
||||
self.flags = self.flags - (self.flags & FL_WATERJUMP);
|
||||
self.flags &= ~FL_WATERJUMP;
|
||||
self.teleport_time = 0;
|
||||
}
|
||||
self.velocity_x = self.movedir_x;
|
||||
|
@ -185,20 +185,20 @@ void() DropPunchAngle =
|
|||
{
|
||||
local float len;
|
||||
|
||||
len = vlen(self.punchangle);
|
||||
self.punchangle = normalize(self.punchangle);
|
||||
len = len - 10 * real_frametime;
|
||||
len = vlen (self.punchangle);
|
||||
self.punchangle = normalize (self.punchangle);
|
||||
len -= 10 * real_frametime;
|
||||
if (len < 0)
|
||||
len = 0;
|
||||
self.punchangle = self.punchangle * len;
|
||||
self.punchangle *= len;
|
||||
};
|
||||
|
||||
void(vector wishvel) SV_AirAccelerate =
|
||||
{
|
||||
local float addspeed, wishspd, accelspeed, currentspeed;
|
||||
|
||||
wishspd = vlen(wishvel);
|
||||
wishvel = normalize(wishvel);
|
||||
wishspd = vlen (wishvel);
|
||||
wishvel = normalize (wishvel);
|
||||
if (wishspd > 30)
|
||||
wishspd = 30;
|
||||
currentspeed = self.velocity * wishvel;
|
||||
|
@ -209,15 +209,15 @@ void(vector wishvel) SV_AirAccelerate =
|
|||
if (accelspeed > addspeed)
|
||||
accelspeed = addspeed;
|
||||
|
||||
self.velocity = self.velocity + accelspeed * wishvel;
|
||||
self.velocity += accelspeed * wishvel;
|
||||
};
|
||||
|
||||
void(vector wishvel) SV_Accelerate =
|
||||
{
|
||||
local float addspeed, wishspd, accelspeed, currentspeed;
|
||||
|
||||
wishspd = vlen(wishvel);
|
||||
wishvel = normalize(wishvel);
|
||||
wishspd = vlen (wishvel);
|
||||
wishvel = normalize (wishvel);
|
||||
|
||||
currentspeed = self.velocity * wishvel;
|
||||
addspeed = wishspd - currentspeed;
|
||||
|
@ -227,7 +227,7 @@ void(vector wishvel) SV_Accelerate =
|
|||
if (accelspeed > addspeed)
|
||||
accelspeed = addspeed;
|
||||
|
||||
self.velocity = self.velocity + accelspeed * wishvel;
|
||||
self.velocity += accelspeed * wishvel;
|
||||
};
|
||||
|
||||
void() SV_WaterMove =
|
||||
|
@ -235,13 +235,13 @@ void() SV_WaterMove =
|
|||
local vector wishvel;
|
||||
local float wishspeed, addspeed, cspeed, newspeed;
|
||||
|
||||
makevectors(self.v_angle);
|
||||
makevectors (self.v_angle);
|
||||
wishvel = v_right * self.movevect_y + v_forward * self.movevect_x;
|
||||
|
||||
if (self.movevect == '0 0 0')
|
||||
wishvel_z = wishvel_z - 60;
|
||||
wishvel_z -= 60;
|
||||
else
|
||||
wishvel_z = wishvel_z + self.movevect_z;
|
||||
wishvel_z += self.movevect_z;
|
||||
wishspeed = vlen(wishvel);
|
||||
|
||||
if (wishspeed > sv_maxspeed) {
|
||||
|
@ -249,12 +249,12 @@ void() SV_WaterMove =
|
|||
wishspeed = sv_maxspeed;
|
||||
}
|
||||
wishspeed = wishspeed * 0.7;
|
||||
cspeed = vlen(self.velocity);
|
||||
cspeed = vlen (self.velocity);
|
||||
if (cspeed) {
|
||||
newspeed = cspeed - (real_frametime * cspeed * sv_friction);
|
||||
if (newspeed < 0)
|
||||
newspeed = 0;
|
||||
self.velocity = self.velocity * (newspeed / cspeed);
|
||||
self.velocity *= (newspeed / cspeed);
|
||||
|
||||
} else
|
||||
newspeed = 0;
|
||||
|
@ -268,7 +268,7 @@ void() SV_WaterMove =
|
|||
cspeed = sv_accelerate * wishspeed * real_frametime;
|
||||
if (cspeed > addspeed)
|
||||
cspeed = addspeed;
|
||||
self.velocity = self.velocity + cspeed * wishvel;
|
||||
self.velocity += cspeed * wishvel;
|
||||
};
|
||||
|
||||
void() SV_AirMove =
|
||||
|
@ -277,7 +277,7 @@ void() SV_AirMove =
|
|||
|
||||
vangle = self.v_angle;
|
||||
vangle_x = vangle_z = 0;
|
||||
makevectors(vangle);
|
||||
makevectors (vangle);
|
||||
if (time < self.teleport_time && (self.movevect_x < 0))
|
||||
self.movevect_x = 0;
|
||||
wishvel = v_right * self.movevect_y + v_forward * self.movevect_x;
|
||||
|
@ -287,13 +287,13 @@ void() SV_AirMove =
|
|||
wishvel_z = self.movevect_z;
|
||||
else
|
||||
wishvel_z = 0;
|
||||
if (vlen(wishvel) > sv_maxspeed)
|
||||
wishvel = normalize(wishvel) * sv_maxspeed;
|
||||
if (vlen (wishvel) > sv_maxspeed)
|
||||
wishvel = normalize (wishvel) * sv_maxspeed;
|
||||
if (self.movetype == MOVETYPE_NOCLIP)
|
||||
self.velocity = wishvel;
|
||||
else if (self.flags & FL_ONGROUND) {
|
||||
SV_UserFriction();
|
||||
SV_Accelerate(wishvel);
|
||||
SV_UserFriction ();
|
||||
SV_Accelerate (wishvel);
|
||||
} else
|
||||
SV_AirAccelerate (wishvel);
|
||||
};
|
||||
|
@ -308,7 +308,7 @@ void() SV_ClientThink =
|
|||
if (self.health <= 0)
|
||||
return;
|
||||
self.v_angle_z = 0; // V_CalcRoll removed, sucks
|
||||
self.angles_z = self.v_angle_z * 4;
|
||||
self.angles_z *= 4;
|
||||
vangle = self.v_angle + self.punchangle;
|
||||
if (!self.fixangle) {
|
||||
self.angles_x = (vangle_x / -3);
|
||||
|
@ -318,14 +318,14 @@ void() SV_ClientThink =
|
|||
self.fixangle = 0;
|
||||
}
|
||||
if (self.flags & FL_WATERJUMP) {
|
||||
SV_WaterJump();
|
||||
SV_WaterJump ();
|
||||
return;
|
||||
}
|
||||
if ((self.waterlevel >= 2) && (self.movetype != MOVETYPE_NOCLIP)) {
|
||||
SV_WaterMove();
|
||||
SV_WaterMove ();
|
||||
return;
|
||||
}
|
||||
SV_AirMove();
|
||||
SV_AirMove ();
|
||||
|
||||
};
|
||||
|
||||
|
@ -350,7 +350,7 @@ float() SV_RunThink =
|
|||
self.nextthink = 0;
|
||||
time = thinktime;
|
||||
other = NIL;
|
||||
makevectors(self.v_angle); // hack
|
||||
makevectors (self.v_angle); // hack
|
||||
self.think();
|
||||
time = bkuptime;
|
||||
return TRUE;
|
||||
|
@ -358,7 +358,7 @@ float() SV_RunThink =
|
|||
|
||||
void(float scale) SV_AddGravity =
|
||||
{
|
||||
self.velocity_z = self.velocity_z - (scale * sv_gravity * real_frametime);
|
||||
self.velocity_z -= (scale * sv_gravity * real_frametime);
|
||||
};
|
||||
|
||||
float() SV_CheckWater =
|
||||
|
@ -371,16 +371,16 @@ float() SV_CheckWater =
|
|||
self.waterlevel = 0;
|
||||
self.watertype = CONTENT_EMPTY;
|
||||
point_z = self.origin_z + self.mins_z + 1;
|
||||
cont = pointcontents(point);
|
||||
cont = pointcontents (point);
|
||||
if (cont <= CONTENT_WATER) {
|
||||
self.watertype = cont;
|
||||
self.waterlevel = 1;
|
||||
point_z = self.origin_z + (self.mins_z + self.maxs_z) * 0.5;
|
||||
cont = pointcontents(point);
|
||||
cont = pointcontents (point);
|
||||
if (cont <= CONTENT_WATER) {
|
||||
self.waterlevel = 2;
|
||||
point_z = self.origin_z + self.view_ofs_z;
|
||||
cont = pointcontents(point);
|
||||
cont = pointcontents (point);
|
||||
if (cont <= CONTENT_WATER)
|
||||
self.waterlevel = 3;
|
||||
}
|
||||
|
@ -395,13 +395,13 @@ void() RemoveThud = // well sometimes
|
|||
|
||||
if (other == NIL) {
|
||||
if (self.flags & FL_ONGROUND) {
|
||||
self.flags = self.flags - FL_ONGROUND;
|
||||
self.flags &= ~FL_ONGROUND;
|
||||
}
|
||||
} else {
|
||||
if (other.solid == SOLID_BSP && (self.flags & FL_ONGROUND)) {
|
||||
// RM: Does this break anything?
|
||||
// If not, then some more thuds have been removed.
|
||||
self.flags = self.flags - FL_ONGROUND;
|
||||
self.flags &= ~FL_ONGROUND;
|
||||
}
|
||||
if (other == self.owner)
|
||||
return;
|
||||
|
@ -412,7 +412,7 @@ void() RemoveThud = // well sometimes
|
|||
self = oself;
|
||||
if (self.solid == SOLID_BSP)
|
||||
if (self.touch)
|
||||
self.touch();
|
||||
self.touch ();
|
||||
}
|
||||
|
||||
};
|
||||
|
@ -424,8 +424,8 @@ void() SV_CheckOnGround =
|
|||
|
||||
org = self.origin;
|
||||
currentflags = self.flags;
|
||||
self.flags = self.flags | FL_ONGROUND | FL_PARTIALGROUND;
|
||||
walkmove(0,0); // perform C touch function
|
||||
self.flags |= FL_ONGROUND | FL_PARTIALGROUND;
|
||||
walkmove (0,0); // perform C touch function
|
||||
self.flags = currentflags | FL_ONGROUND;
|
||||
if ((org_x != self.origin_x) || (org_y != self.origin_y))
|
||||
org = self.origin;
|
||||
|
@ -435,15 +435,15 @@ void() SV_CheckOnGround =
|
|||
v_z = self.maxs_z + org_z + 1;
|
||||
traceline (org, v, TRUE, self);
|
||||
if ((self.waterlevel == 3) && (self.movetype == MOVETYPE_WALK))
|
||||
self.flags = self.flags - FL_ONGROUND;
|
||||
self.flags &= ~FL_ONGROUND;
|
||||
else if ((trace_plane_normal_z <= 0.7) && (trace_fraction != 1))
|
||||
self.flags = self.flags - FL_ONGROUND;
|
||||
self.flags &= ~FL_ONGROUND;
|
||||
else if (!droptofloor ())
|
||||
self.flags = self.flags - FL_ONGROUND;
|
||||
self.flags &= ~FL_ONGROUND;
|
||||
else if (org_z - self.origin_z < 2)
|
||||
self.flags = self.flags | FL_ONGROUND;
|
||||
self.flags |= FL_ONGROUND;
|
||||
else
|
||||
self.flags = self.flags - FL_ONGROUND;
|
||||
self.flags &= ~FL_ONGROUND;
|
||||
setorigin(self, org);
|
||||
};
|
||||
|
||||
|
@ -457,23 +457,23 @@ float(vector dir) botCheckForStep =
|
|||
currentorigin = self.origin;
|
||||
currentflags = self.flags;
|
||||
self.flags = FL_ONGROUND | FL_PARTIALGROUND;
|
||||
dir = normalize(dir);
|
||||
dir = normalize (dir);
|
||||
dir_z = 0;
|
||||
yaw = vectoyaw(dir);
|
||||
if(walkmove(yaw, 3)) {
|
||||
if(droptofloor ()) {
|
||||
yaw = vectoyaw (dir);
|
||||
if (walkmove (yaw, 3)) {
|
||||
if (droptofloor ()) {
|
||||
stepdistance = self.origin_z - currentorigin_z;
|
||||
v = self.origin - currentorigin;
|
||||
v_z = 0;
|
||||
movedistance = vlen(v);
|
||||
if((stepdistance > 0 && stepdistance <= 16) && movedistance != 0) {
|
||||
movedistance = vlen (v);
|
||||
if ((stepdistance > 0 && stepdistance <= 16) && movedistance != 0) {
|
||||
self.flags = currentflags | FL_PARTIALGROUND;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
self.flags = currentflags;
|
||||
setorigin(self, currentorigin);
|
||||
setorigin (self, currentorigin);
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
@ -485,31 +485,31 @@ void(vector dir) BruteForceStep =
|
|||
|
||||
currentorigin = self.origin;
|
||||
currentflags = self.flags;
|
||||
len = vlen(dir);
|
||||
len = vlen (dir);
|
||||
if (len > 16)
|
||||
dir = normalize(dir) * 16;
|
||||
dir = normalize (dir) * 16;
|
||||
|
||||
setorigin(self, currentorigin + dir);
|
||||
setorigin (self, currentorigin + dir);
|
||||
|
||||
while(i < 18 && !walkmove(0, 0)) {
|
||||
while(i < 18 && !walkmove (0, 0)) {
|
||||
self.origin_z = currentorigin_z + i;
|
||||
i = i + 2;
|
||||
i += 2;
|
||||
}
|
||||
self.flags = currentflags;
|
||||
if (i >=18)
|
||||
setorigin(self, currentorigin);
|
||||
if (i >= 18)
|
||||
setorigin (self, currentorigin);
|
||||
};
|
||||
|
||||
void() PostPhysics =
|
||||
{
|
||||
local vector obstr, org;
|
||||
local float back, dst,cflags;
|
||||
local float back, dst, cflags;
|
||||
|
||||
self = self.owner;
|
||||
|
||||
self.velocity = self.velocity - self.phys_obj.dest1 + self.phys_obj.velocity;
|
||||
self.velocity += self.phys_obj.velocity - self.phys_obj.dest1;
|
||||
if (self.phys_obj.dest2 == self.origin) {
|
||||
setorigin(self, self.phys_obj.origin);
|
||||
setorigin (self, self.phys_obj.origin);
|
||||
// might've been moved during other person's physics
|
||||
// (teleporters / plats)
|
||||
|
||||
|
@ -519,29 +519,29 @@ void() PostPhysics =
|
|||
if ((self.flags & FL_ONGROUND) || (self.waterlevel <= 2)) {
|
||||
obstr = self.phys_obj.movedir - self.origin;
|
||||
obstr_z = 0;
|
||||
if (vlen(obstr) > 0.1) {
|
||||
dst = vlen(obstr);
|
||||
back = vectoyaw(obstr);
|
||||
if (vlen (obstr) > 0.1) {
|
||||
dst = vlen (obstr);
|
||||
back = vectoyaw (obstr);
|
||||
cflags = self.flags;
|
||||
self.flags = self.flags | FL_PARTIALGROUND;
|
||||
if(walkmove(back, dst)) {
|
||||
self.flags |= FL_PARTIALGROUND;
|
||||
if (walkmove (back, dst)) {
|
||||
self.flags = cflags;
|
||||
self.phys_obj.dest1_z = 0;
|
||||
self.velocity = self.velocity + self.phys_obj.dest1 - self.phys_obj.velocity;
|
||||
self.velocity += self.phys_obj.dest1 - self.phys_obj.velocity;
|
||||
} else {
|
||||
if (dst > 1)
|
||||
frik_obstructed(obstr, FALSE);
|
||||
frik_obstructed (obstr, FALSE);
|
||||
|
||||
org = self.origin;
|
||||
self.flags = cflags;
|
||||
obstr = self.phys_obj.dest1;
|
||||
obstr_x = 0;
|
||||
if (!botCheckForStep(obstr)) {
|
||||
if (!botCheckForStep (obstr)) {
|
||||
obstr = self.phys_obj.dest1;
|
||||
obstr_y = 0;
|
||||
if (!botCheckForStep(obstr)) {
|
||||
if (!botCheckForStep (obstr)) {
|
||||
// if no steps were found, bot is really obstucted
|
||||
BruteForceStep(self.phys_obj.dest1);
|
||||
BruteForceStep (self.phys_obj.dest1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -551,10 +551,10 @@ void() PostPhysics =
|
|||
}
|
||||
}
|
||||
|
||||
SV_CheckOnGround();
|
||||
SV_CheckOnGround ();
|
||||
|
||||
PlayerPostThink();
|
||||
BotAI();
|
||||
PlayerPostThink ();
|
||||
BotAI ();
|
||||
self.dmg_take = self.dmg_save = 0;
|
||||
|
||||
};
|
||||
|
@ -566,11 +566,12 @@ void() SV_FlyMove =
|
|||
// This is nothing like the Quake function.
|
||||
|
||||
if (self.phys_obj == NIL) {
|
||||
self.phys_obj = find(NIL,classname,"phys_obj");
|
||||
self.phys_obj = find(NIL, classname, "phys_obj");
|
||||
while (self.phys_obj.owner != self) {
|
||||
self.phys_obj = find(self.phys_obj,classname,"phys_obj");
|
||||
self.phys_obj = find (self.phys_obj, classname, "phys_obj");
|
||||
if (self.phys_obj == NIL) {
|
||||
error("No physics entity spawned!\nMake sure BotInit was called\n");
|
||||
error ("No physics entity spawned!\nMake sure BotInit was "
|
||||
"called\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -580,12 +581,12 @@ void() SV_FlyMove =
|
|||
|
||||
self.phys_obj.solid = SOLID_TRIGGER;
|
||||
self.phys_obj.touch = RemoveThud;
|
||||
setsize(self.phys_obj, self.mins, self.maxs);
|
||||
setsize (self.phys_obj, self.mins, self.maxs);
|
||||
self.phys_obj.dest2 = self.phys_obj.origin = self.origin;
|
||||
self.phys_obj.watertype = 0;
|
||||
self.phys_obj.movedir = self.origin + real_frametime * self.velocity;
|
||||
self.phys_obj.dest1 = self.phys_obj.velocity = self.velocity;
|
||||
self.phys_obj.velocity_z = self.phys_obj.velocity_z + sv_gravity * real_frametime;
|
||||
self.phys_obj.velocity_z += sv_gravity * real_frametime;
|
||||
self.phys_obj.flags = 0;
|
||||
self.phys_obj.think = PostPhysics;
|
||||
self.phys_obj.nextthink = time;
|
||||
|
@ -593,59 +594,55 @@ void() SV_FlyMove =
|
|||
|
||||
void() SV_Physics_Toss =
|
||||
{
|
||||
if (!SV_RunThink())
|
||||
if (!SV_RunThink ())
|
||||
return;
|
||||
if (self.flags & FL_ONGROUND) {
|
||||
self.velocity = '0 0 0';
|
||||
BotAI();
|
||||
BotAI ();
|
||||
return;
|
||||
}
|
||||
if (self.movetype != MOVETYPE_FLY)
|
||||
SV_AddGravity(1);
|
||||
self.angles = self.angles + real_frametime * self.avelocity;
|
||||
SV_FlyMove();
|
||||
SV_AddGravity (1);
|
||||
self.angles += real_frametime * self.avelocity;
|
||||
SV_FlyMove ();
|
||||
|
||||
};
|
||||
|
||||
void() SV_Physics_Client =
|
||||
void ()
|
||||
SV_Physics_Client =
|
||||
{
|
||||
PlayerPreThink();
|
||||
|
||||
PlayerPreThink ();
|
||||
switch (self.movetype) {
|
||||
case MOVETYPE_NONE:
|
||||
if (!SV_RunThink())
|
||||
if (!SV_RunThink ())
|
||||
return;
|
||||
PlayerPostThink();
|
||||
BotAI();
|
||||
PlayerPostThink ();
|
||||
BotAI ();
|
||||
break;
|
||||
|
||||
case MOVETYPE_WALK:
|
||||
case MOVETYPE_STEP:
|
||||
if (!SV_RunThink())
|
||||
if (!SV_RunThink ())
|
||||
return;
|
||||
if (!(SV_CheckWater()) && (!(self.flags & FL_WATERJUMP)))
|
||||
SV_AddGravity(1);
|
||||
SV_FlyMove();
|
||||
if (!(SV_CheckWater ()) && (!(self.flags & FL_WATERJUMP)))
|
||||
SV_AddGravity (1);
|
||||
SV_FlyMove ();
|
||||
break;
|
||||
|
||||
case MOVETYPE_TOSS:
|
||||
case MOVETYPE_BOUNCE:
|
||||
SV_Physics_Toss();
|
||||
SV_Physics_Toss ();
|
||||
break;
|
||||
|
||||
case MOVETYPE_FLY:
|
||||
if (!SV_RunThink())
|
||||
if (!SV_RunThink ())
|
||||
return;
|
||||
SV_FlyMove();
|
||||
SV_FlyMove ();
|
||||
break;
|
||||
|
||||
case MOVETYPE_NOCLIP:
|
||||
if (!SV_RunThink())
|
||||
if (!SV_RunThink ())
|
||||
return;
|
||||
self.origin = self.origin + real_frametime * self.velocity;
|
||||
self.origin += real_frametime * self.velocity;
|
||||
|
||||
PlayerPostThink();
|
||||
BotAI();
|
||||
PlayerPostThink ();
|
||||
BotAI ();
|
||||
break;
|
||||
default:
|
||||
error ("SV_Physics_Client: Bad Movetype (BOT)");
|
||||
|
|
300
fbxa/bot_qw.qc
300
fbxa/bot_qw.qc
|
@ -1,4 +1,3 @@
|
|||
|
||||
/*
|
||||
======================================
|
||||
FrikBot X (Version 0.10.0) QW
|
||||
|
@ -37,7 +36,6 @@ with applicable reexport restrictions.
|
|||
Any reproduction of this software must contain
|
||||
this notice in its entirety.
|
||||
|
||||
|
||||
======================================
|
||||
These installation instructions only apply to QuakeWorld (as does this entire
|
||||
file). For Normal Quake, please refer to bot.qc
|
||||
|
@ -77,32 +75,36 @@ ClientFixRankings(); // FrikBot
|
|||
|
||||
#include "libfrikbot.h"
|
||||
|
||||
void() bot_map_load =
|
||||
void ()
|
||||
bot_map_load =
|
||||
{
|
||||
// place your qc loaded waypoints here
|
||||
|
||||
if (mapname == "dm1")
|
||||
map_dm1();
|
||||
else if (mapname == "dm2")
|
||||
map_dm2();
|
||||
else if (mapname == "dm3")
|
||||
map_dm3();
|
||||
else if (mapname == "dm4")
|
||||
map_dm4();
|
||||
else if (mapname == "dm5")
|
||||
map_dm5();
|
||||
else if (mapname == "dm6")
|
||||
map_dm6();
|
||||
switch (mapname) {
|
||||
case "dm1":
|
||||
map_dm1 ();
|
||||
break;
|
||||
case "dm2":
|
||||
map_dm2 ();
|
||||
break;
|
||||
case "dm3":
|
||||
map_dm3 ();
|
||||
break;
|
||||
case "dm4":
|
||||
map_dm4 ();
|
||||
break;
|
||||
case "dm5":
|
||||
map_dm5 ();
|
||||
break;
|
||||
case "dm6":
|
||||
map_dm6 ();
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Variables and shtuff
|
||||
|
||||
bot.qc has become pretty much a header file
|
||||
for all variable in the bot...
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
|
@ -131,7 +133,6 @@ entity [32] phys_objects;
|
|||
.vector dyn_dest;
|
||||
.vector punchangle; // HACK - Don't want to screw with bot_phys
|
||||
|
||||
|
||||
// -------globals-----
|
||||
integer max_clients;
|
||||
float real_frametime;
|
||||
|
@ -161,8 +162,7 @@ void (entity e, integer ping) SV_SetPing = #0;
|
|||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Function redclarations. These allow function
|
||||
Function redeclarations. These allow function
|
||||
designed to work for clients (sprint, so forth)
|
||||
to mainly not complain when working with a bot
|
||||
|
||||
|
@ -170,26 +170,28 @@ Although these shouldn't be needed anymore,
|
|||
as the bots truly are clients now, if you don't
|
||||
stop the SZ_ buffer from filling up by disabling
|
||||
direct messages to the bots, it crashes quake :-(
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
void(entity e) setspawnparms =
|
||||
void (entity e)
|
||||
setspawnparms =
|
||||
{
|
||||
if (e.ishuman)
|
||||
frik_setspawnparms(e);
|
||||
frik_setspawnparms (e);
|
||||
else
|
||||
SetNewParms();
|
||||
SetNewParms ();
|
||||
};
|
||||
|
||||
vector(entity e, float sped) aim =
|
||||
vector (entity e, float sped)
|
||||
aim =
|
||||
{
|
||||
e.missile_speed = sped;
|
||||
return frik_aim(e, sped);
|
||||
return frik_aim (e, sped);
|
||||
};
|
||||
|
||||
void(entity e, float chan, string samp, float vol, float atten) sound =
|
||||
void (entity e, float chan, string samp, float vol, float atten)
|
||||
sound =
|
||||
{
|
||||
frik_sound(e, chan, samp, vol, atten);
|
||||
frik_sound (e, chan, samp, vol, atten);
|
||||
if (samp == "items/inv3.wav")
|
||||
return;
|
||||
else if (e.classname == "player")
|
||||
|
@ -200,34 +202,34 @@ void(entity e, float chan, string samp, float vol, float atten) sound =
|
|||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Stuff mentioned up top
|
||||
it just links the bot into the mod
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() ClientFixRankings =
|
||||
void ()
|
||||
ClientFixRankings =
|
||||
{
|
||||
local integer cno;
|
||||
if (self.switch_wallhug > time)
|
||||
return;
|
||||
self.switch_wallhug = 0;
|
||||
|
||||
b_temp2 = nextent(NIL);
|
||||
b_temp2 = nextent (NIL);
|
||||
cno = 0;
|
||||
|
||||
while (cno < max_clients) {
|
||||
if (!b_temp2.ishuman) {
|
||||
if (players[cno])
|
||||
UpdateClient(b_temp2);
|
||||
UpdateClient (b_temp2);
|
||||
}
|
||||
cno++;
|
||||
b_temp2 = nextent(b_temp2);
|
||||
b_temp2 = nextent (b_temp2);
|
||||
}
|
||||
};
|
||||
|
||||
void() ClientInRankings =
|
||||
void ()
|
||||
ClientInRankings =
|
||||
{
|
||||
local float cno;
|
||||
local integer cl_no = ClientNumber (self);
|
||||
|
@ -248,12 +250,13 @@ void() ClientInRankings =
|
|||
self.switch_wallhug = time + 1;
|
||||
};
|
||||
|
||||
|
||||
void() ClientDisconnected =
|
||||
void ()
|
||||
ClientDisconnected =
|
||||
{
|
||||
local integer cl_no = ClientNumber (self);
|
||||
players[cl_no] = NIL;
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -262,39 +265,42 @@ bot easier to install
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
float () BotPreFrame =
|
||||
float ()
|
||||
BotPreFrame =
|
||||
{
|
||||
if (self.b_clientno == -1)
|
||||
return TRUE;
|
||||
if (self.ishuman)
|
||||
if (self.switch_wallhug)
|
||||
ClientFixRankings();
|
||||
ClientFixRankings ();
|
||||
if (self.b_frags != self.frags) {
|
||||
if (self.b_frags > self.frags) {
|
||||
if (pointcontents(self.origin) == CONTENT_LAVA)
|
||||
bot_start_topic(10);
|
||||
if (pointcontents (self.origin) == CONTENT_LAVA)
|
||||
bot_start_topic (10);
|
||||
else
|
||||
bot_start_topic(9);
|
||||
bot_start_topic (9);
|
||||
} else
|
||||
bot_start_topic(2);
|
||||
bot_start_topic (2);
|
||||
self.b_frags = self.frags;
|
||||
if (!self.ishuman) {
|
||||
WriteByte(2, 14);
|
||||
WriteByte(2, (float)self.b_clientno);
|
||||
WriteShort(2, self.frags);
|
||||
WriteByte (2, 14);
|
||||
WriteByte (2, (float)self.b_clientno);
|
||||
WriteShort (2, self.frags);
|
||||
}
|
||||
}
|
||||
DynamicWaypoint();
|
||||
return FALSE;
|
||||
};
|
||||
float () BotPostFrame =
|
||||
float ()
|
||||
BotPostFrame =
|
||||
{
|
||||
if (self.b_clientno == -1)
|
||||
return TRUE;
|
||||
if (self.ishuman)
|
||||
BotImpulses();
|
||||
BotImpulses ();
|
||||
return FALSE;
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
|
@ -304,87 +310,87 @@ The rest of this code is in bot_rank.qc
|
|||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
void(string h) BotSay = // simulate talking by composing a 'chat' message
|
||||
void (string h)
|
||||
BotSay = // simulate talking by composing a 'chat' message
|
||||
{
|
||||
WriteByte(MSG_ALL, 8);
|
||||
WriteByte(MSG_ALL, 3);
|
||||
WriteByte(MSG_ALL, 1);
|
||||
WriteString(MSG_ALL, self.netname);
|
||||
WriteByte(MSG_ALL, 8);
|
||||
WriteByte(MSG_ALL, 3);
|
||||
WriteByte(MSG_ALL, 2);
|
||||
WriteString(MSG_ALL, h);
|
||||
WriteByte (MSG_ALL, 8);
|
||||
WriteByte (MSG_ALL, 3);
|
||||
WriteByte (MSG_ALL, 1);
|
||||
WriteString (MSG_ALL, self.netname);
|
||||
WriteByte (MSG_ALL, 8);
|
||||
WriteByte (MSG_ALL, 3);
|
||||
WriteByte (MSG_ALL, 2);
|
||||
WriteString (MSG_ALL, h);
|
||||
};
|
||||
void() BotSayInit =
|
||||
|
||||
void ()
|
||||
BotSayInit =
|
||||
{
|
||||
WriteByte(MSG_ALL, 8);
|
||||
WriteByte(MSG_ALL, 3);
|
||||
WriteByte(MSG_ALL, 1);
|
||||
WriteString(MSG_ALL, self.netname);
|
||||
WriteByte (MSG_ALL, 8);
|
||||
WriteByte (MSG_ALL, 3);
|
||||
WriteByte (MSG_ALL, 1);
|
||||
WriteString (MSG_ALL, self.netname);
|
||||
};
|
||||
void(string h) BotSay2 =
|
||||
void (string h)
|
||||
BotSay2 =
|
||||
{
|
||||
WriteByte(MSG_ALL, 8);
|
||||
WriteByte(MSG_ALL, 3);
|
||||
WriteByte(MSG_ALL, 2);
|
||||
WriteString(MSG_ALL, h);
|
||||
WriteByte (MSG_ALL, 8);
|
||||
WriteByte (MSG_ALL, 3);
|
||||
WriteByte (MSG_ALL, 2);
|
||||
WriteString (MSG_ALL, h);
|
||||
};
|
||||
void(string h) BotSayTeam =
|
||||
void (string h)
|
||||
BotSayTeam =
|
||||
{
|
||||
// FBX QW doesn't support teamplay...yet
|
||||
};
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
BotInit
|
||||
// BotInit ====================================================================
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
|
||||
void() BotInit =
|
||||
void ()
|
||||
BotInit =
|
||||
{
|
||||
local entity ent;
|
||||
local integer numents = 0;
|
||||
|
||||
// spawn entities for the physics
|
||||
ent = nextent(NIL);
|
||||
ent = nextent (NIL);
|
||||
max_clients = 0;
|
||||
|
||||
while(ent != NIL) {
|
||||
max_clients = max_clients + 1;
|
||||
ent = nextent(ent);
|
||||
while (ent != NIL) {
|
||||
max_clients++;
|
||||
ent = nextent (ent);
|
||||
}
|
||||
|
||||
ent = nextent(NIL);
|
||||
ent = nextent (NIL);
|
||||
while (numents < max_clients) {
|
||||
|
||||
phys_objects[numents] = spawn();
|
||||
phys_objects[numents] = spawn ();
|
||||
phys_objects[numents].classname = "phys_obj";
|
||||
phys_objects[numents].owner = ent;
|
||||
numents++;
|
||||
ent = nextent(ent);
|
||||
ent = nextent (ent);
|
||||
}
|
||||
bot_map_load();
|
||||
bot_map_load ();
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Rankings 'utilities'. Written by Alan Kivlin,
|
||||
this code just fools clients by sending precisely
|
||||
the same network messages as when a real player
|
||||
signs on to the server.
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
|
||||
void(entity who) UpdateClient =
|
||||
void (entity who)
|
||||
UpdateClient =
|
||||
{
|
||||
local string bottomcolor = ftos (who.b_pants);
|
||||
local string topcolor = ftos (who.b_shirt);
|
||||
dprint (who.netname); dprint ("\n");
|
||||
|
||||
dprint (who.netname);
|
||||
dprint ("\n");
|
||||
SV_SetPing (who, 100 * (3 - who.b_skill));
|
||||
SV_SetUserinfo (who, "\\bottomcolor\\" + bottomcolor
|
||||
+ "\\topcolor\\" + topcolor
|
||||
|
@ -392,54 +398,55 @@ dprint (who.netname); dprint ("\n");
|
|||
// FIXME: do teams properly
|
||||
};
|
||||
|
||||
float(integer clientno) ClientBitFlag =
|
||||
float (integer clientno)
|
||||
ClientBitFlag =
|
||||
{
|
||||
local float bitflag;
|
||||
|
||||
bitflag = 1;
|
||||
while(clientno > 0) {
|
||||
bitflag = bitflag * 2;
|
||||
clientno = clientno - 1;
|
||||
while (clientno > 0) {
|
||||
bitflag *= 2;
|
||||
clientno--;
|
||||
}
|
||||
return bitflag;
|
||||
};
|
||||
|
||||
integer() ClientNextAvailable =
|
||||
integer ()
|
||||
ClientNextAvailable =
|
||||
{
|
||||
local integer clientno;
|
||||
|
||||
// I want to do this top down, but QW won't let me
|
||||
clientno = 0;
|
||||
while(clientno < max_clients) {
|
||||
clientno = clientno + 1;
|
||||
while (clientno < max_clients) {
|
||||
clientno++;
|
||||
|
||||
//FIXME if(!ClientIsActive(clientno))
|
||||
//FIXME if (!ClientIsActive (clientno))
|
||||
return clientno;
|
||||
}
|
||||
return -1;
|
||||
};
|
||||
|
||||
|
||||
void(entity e1, entity e2, float flag) DeveloperLightning = {};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
// BotConnect and related functions. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
BotConnect and related functions.
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
entity(float num) GetClientEntity =
|
||||
entity (float num)
|
||||
GetClientEntity =
|
||||
{
|
||||
local entity upsy;
|
||||
|
||||
upsy = NIL;
|
||||
num = num + 1;
|
||||
num++;
|
||||
while (num > 0) {
|
||||
num = num - 1;
|
||||
upsy = nextent(upsy);
|
||||
num--;
|
||||
upsy = nextent (upsy);
|
||||
}
|
||||
return upsy;
|
||||
};
|
||||
|
||||
integer (entity cl) ClientNumber =
|
||||
integer (entity cl)
|
||||
ClientNumber =
|
||||
{
|
||||
local entity e = NIL;
|
||||
local integer f = -1;
|
||||
|
@ -451,7 +458,8 @@ integer (entity cl) ClientNumber =
|
|||
return f;
|
||||
};
|
||||
|
||||
void(float whatbot, integer whatskill) BotConnect =
|
||||
void (float whatbot, integer whatskill)
|
||||
BotConnect =
|
||||
{
|
||||
local integer f;
|
||||
local entity uself;
|
||||
|
@ -460,19 +468,19 @@ void(float whatbot, integer whatskill) BotConnect =
|
|||
uself = self;
|
||||
self = SV_AllocClient ();
|
||||
if (!self) {
|
||||
bprint(PRINT_HIGH, "Unable to connect a bot, server is full.\n");
|
||||
bprint (PRINT_HIGH, "Unable to connect a bot, server is full.\n");
|
||||
self = uself;
|
||||
return;
|
||||
}
|
||||
bot_count++;
|
||||
bot_start_topic(1);
|
||||
bot_start_topic (1);
|
||||
f = ClientNumber (self) + 1;
|
||||
self.b_clientno = f;
|
||||
self.colormap = (float) f;
|
||||
if (whatbot)
|
||||
self.netname = BotName(whatbot);
|
||||
self.netname = BotName (whatbot);
|
||||
else
|
||||
self.netname = PickARandomName();
|
||||
self.netname = PickARandomName ();
|
||||
|
||||
// players can set skill all weird, so leave these checks in
|
||||
if (whatskill > 3)
|
||||
|
@ -482,55 +490,58 @@ void(float whatbot, integer whatskill) BotConnect =
|
|||
self.b_skill = whatskill;
|
||||
self.b_entertime = time;
|
||||
self.team = self.b_pants + 1;
|
||||
UpdateClient(self);
|
||||
SetNewParms();
|
||||
UpdateClient (self);
|
||||
SetNewParms ();
|
||||
self.ishuman = 2;
|
||||
ClientConnect();
|
||||
PutClientInServer();
|
||||
ClientConnect ();
|
||||
PutClientInServer ();
|
||||
self = uself;
|
||||
};
|
||||
|
||||
void(entity bot) BotDisconnect =
|
||||
void (entity bot)
|
||||
BotDisconnect =
|
||||
{
|
||||
local entity uself;
|
||||
|
||||
uself = self;
|
||||
self = bot;
|
||||
|
||||
bot_count = bot_count - 1;
|
||||
bot_count--;
|
||||
|
||||
ClientDisconnect();
|
||||
ClientDisconnect ();
|
||||
|
||||
setmodel (self.phys_obj, "");
|
||||
SV_FreeClient (self);
|
||||
self = uself;
|
||||
};
|
||||
|
||||
void() BotFrame =
|
||||
void ()
|
||||
BotFrame =
|
||||
{
|
||||
local integer num;
|
||||
local string h;
|
||||
|
||||
h = infokey(NIL, "bot_options");
|
||||
b_options = stof(h);
|
||||
h = infokey (NIL, "bot_options");
|
||||
b_options = stof (h);
|
||||
|
||||
// for the sake of speed
|
||||
sv_maxspeed = cvar("sv_maxspeed");
|
||||
sv_gravity = cvar("sv_gravity");
|
||||
sv_friction = cvar("sv_friction");
|
||||
sv_accelerate = cvar("sv_accelerate");
|
||||
sv_stopspeed = cvar("sv_stopspeed");
|
||||
sv_maxspeed = cvar ("sv_maxspeed");
|
||||
sv_gravity = cvar ("sv_gravity");
|
||||
sv_friction = cvar ("sv_friction");
|
||||
sv_accelerate = cvar ("sv_accelerate");
|
||||
sv_stopspeed = cvar ("sv_stopspeed");
|
||||
real_frametime = time - lasttime; // in QW frametime is fuxx0red
|
||||
lasttime = time;
|
||||
|
||||
self = nextent(NIL);
|
||||
self = nextent (NIL);
|
||||
num = 0;
|
||||
while (num < max_clients) {
|
||||
if (self.ishuman == FALSE) {
|
||||
if (self.b_clientno > 0) {
|
||||
frik_obstacles();
|
||||
CL_KeyMove();
|
||||
SV_ClientThink();
|
||||
SV_Physics_Client();
|
||||
frik_obstacles ();
|
||||
CL_KeyMove ();
|
||||
SV_ClientThink ();
|
||||
SV_Physics_Client ();
|
||||
// this is sickening
|
||||
if (self.phys_obj) {
|
||||
if (self.phys_obj.modelindex != self.modelindex) {
|
||||
|
@ -544,31 +555,26 @@ void() BotFrame =
|
|||
}
|
||||
}
|
||||
}
|
||||
self = nextent(self);
|
||||
num = num + 1;
|
||||
self = nextent (self);
|
||||
num++;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Bot Impulses. Allows the player to perform bot
|
||||
related functions.
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() BotImpulses =
|
||||
void () BotImpulses =
|
||||
{
|
||||
local integer f;
|
||||
local string h;
|
||||
|
||||
if (self.impulse == 100) {
|
||||
h = infokey(NIL, "skill");
|
||||
f = (integer) stof(h);
|
||||
BotConnect(0, f);
|
||||
h = infokey (NIL, "skill");
|
||||
f = (integer) stof (h);
|
||||
BotConnect (0, f);
|
||||
} else if (self.impulse == 102)
|
||||
KickABot();
|
||||
KickABot ();
|
||||
else
|
||||
return;
|
||||
self.impulse = 0;
|
||||
|
|
166
fbxa/bot_way.qc
166
fbxa/bot_way.qc
|
@ -44,22 +44,15 @@ this notice in its entirety.
|
|||
|
||||
#include "libfrikbot.h"
|
||||
|
||||
// Waypoint Linking code ======================================================
|
||||
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Waypoint Linking code
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
|
||||
float (entity e1, entity e2) CheckLinked =
|
||||
float (entity e1, entity e2)
|
||||
CheckLinked =
|
||||
{
|
||||
if ((e1 == e2) || (e2 == NIL) || (e1 == NIL))
|
||||
return FALSE;
|
||||
else if (e1.target1 == e2) {
|
||||
|
||||
if (e1.target1 == e2) {
|
||||
if (e1.b_aiflags & AI_TELELINK_1)
|
||||
return 2;
|
||||
else
|
||||
|
@ -83,12 +76,12 @@ float (entity e1, entity e2) CheckLinked =
|
|||
return FALSE;
|
||||
};
|
||||
|
||||
|
||||
float (entity e1, entity e2) LinkWays =
|
||||
float (entity e1, entity e2)
|
||||
LinkWays =
|
||||
{
|
||||
if ((e1 == e2) || (e2 == NIL) || (e1 == NIL))
|
||||
return FALSE;
|
||||
else if (CheckLinked(e1, e2))
|
||||
else if (CheckLinked (e1, e2))
|
||||
return FALSE; // already linked!!!
|
||||
|
||||
if (e1.target1 == NIL) {
|
||||
|
@ -103,42 +96,40 @@ float (entity e1, entity e2) LinkWays =
|
|||
} else if (e1.target4 == NIL) {
|
||||
e1.target4 = e2;
|
||||
return TRUE;
|
||||
}
|
||||
else return FALSE;
|
||||
|
||||
} else return FALSE;
|
||||
};
|
||||
// Link Ways part 2, used only for teleporters
|
||||
|
||||
float (entity e1, entity e2) TeleLinkWays =
|
||||
// Link Ways part 2, used only for teleporters
|
||||
float (entity e1, entity e2)
|
||||
TeleLinkWays =
|
||||
{
|
||||
if ((e1 == e2) || (e2 == NIL) || (e1 == NIL))
|
||||
return FALSE;
|
||||
else if (CheckLinked(e1, e2))
|
||||
else if (CheckLinked (e1, e2))
|
||||
return FALSE; // already linked!!!
|
||||
|
||||
if (e1.target1 == NIL) {
|
||||
e1.target1 = e2;
|
||||
e1.b_aiflags = e1.b_aiflags | AI_TELELINK_1;
|
||||
e1.b_aiflags |= AI_TELELINK_1;
|
||||
return TRUE;
|
||||
} else if (e1.target2 == NIL) {
|
||||
e1.target2 = e2;
|
||||
e1.b_aiflags = e1.b_aiflags | AI_TELELINK_2;
|
||||
e1.b_aiflags |= AI_TELELINK_2;
|
||||
return TRUE;
|
||||
} else if (e1.target3 == NIL) {
|
||||
e1.target3 = e2;
|
||||
e1.b_aiflags = e1.b_aiflags | AI_TELELINK_3;
|
||||
e1.b_aiflags |= AI_TELELINK_3;
|
||||
return TRUE;
|
||||
} else if (e1.target4 == NIL) {
|
||||
e1.target4 = e2;
|
||||
e1.b_aiflags = e1.b_aiflags | AI_TELELINK_4;
|
||||
e1.b_aiflags |= AI_TELELINK_4;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
} else
|
||||
return FALSE;
|
||||
|
||||
};
|
||||
|
||||
void (entity e1, entity e2) UnlinkWays =
|
||||
void (entity e1, entity e2)
|
||||
UnlinkWays =
|
||||
{
|
||||
if ((e1 == e2) || (e2 == NIL) || (e1 == NIL))
|
||||
return;
|
||||
|
@ -146,62 +137,56 @@ void (entity e1, entity e2) UnlinkWays =
|
|||
return;
|
||||
|
||||
if (e1.target1 == e2) {
|
||||
e1.b_aiflags = e1.b_aiflags - (e1.b_aiflags & AI_TELELINK_1);
|
||||
e1.b_aiflags &= ~AI_TELELINK_1;
|
||||
e1.target1 = NIL;
|
||||
}
|
||||
if (e1.target2 == e2) {
|
||||
e1.b_aiflags = e1.b_aiflags - (e1.b_aiflags & AI_TELELINK_2);
|
||||
e1.b_aiflags &= ~AI_TELELINK_2;
|
||||
e1.target2 = NIL;
|
||||
}
|
||||
if (e1.target3 == e2) {
|
||||
e1.b_aiflags = e1.b_aiflags - (e1.b_aiflags & AI_TELELINK_3);
|
||||
e1.b_aiflags &= ~AI_TELELINK_3;
|
||||
e1.target3 = NIL;
|
||||
}
|
||||
if (e1.target4 == e2) {
|
||||
e1.b_aiflags = e1.b_aiflags - (e1.b_aiflags & AI_TELELINK_4);
|
||||
e1.b_aiflags &= ~AI_TELELINK_4;
|
||||
e1.target4 = NIL;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
FindWaypoint
|
||||
|
||||
This is used quite a bit, by many different
|
||||
functions big lag causer
|
||||
|
||||
Finds the closest, fisible, waypoint to e
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
entity(entity start) FindWayPoint =
|
||||
entity (entity start)
|
||||
FindWayPoint =
|
||||
{
|
||||
local entity t;
|
||||
local vector org;
|
||||
local entity best, t;
|
||||
local float dst, tdst;
|
||||
local entity best;
|
||||
local vector org;
|
||||
|
||||
org = realorigin(self);
|
||||
org = realorigin (self);
|
||||
|
||||
t = way_head;
|
||||
t = way_head;
|
||||
if (start != NIL) {
|
||||
dst = vlen(start.origin - org);
|
||||
dst = vlen (start.origin - org);
|
||||
best = start;
|
||||
} else {
|
||||
dst = 100000;
|
||||
best = NIL;
|
||||
}
|
||||
while(t) {
|
||||
while (t) {
|
||||
// real players cut through ignore types
|
||||
if (dst < 20)
|
||||
return best;
|
||||
if (!(t.b_aiflags & AI_IGNORE_TYPES) || self.ishuman) {
|
||||
tdst = vlen(t.origin - org);
|
||||
tdst = vlen (t.origin - org);
|
||||
if (tdst < dst) {
|
||||
if (sisible(t)) {
|
||||
if (sisible (t)) {
|
||||
dst = tdst;
|
||||
best = t;
|
||||
}
|
||||
|
@ -212,29 +197,25 @@ entity(entity start) FindWayPoint =
|
|||
return best;
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Waypoint Spawning Code
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
// Waypoint Spawning Code =====================================================
|
||||
|
||||
entity way_foot; // Ugh. Do I need a foot for this or not?
|
||||
|
||||
entity(vector org) make_waypoint =
|
||||
entity (vector org)
|
||||
make_waypoint =
|
||||
{
|
||||
local entity point;
|
||||
point = spawn();
|
||||
|
||||
point = spawn ();
|
||||
point.classname = "waypoint";
|
||||
point.search_time = time; // don't double back for me;
|
||||
point.solid = SOLID_TRIGGER;
|
||||
point.movetype = MOVETYPE_NONE;
|
||||
point.items = -1;
|
||||
setorigin(point, org);
|
||||
setorigin (point, org);
|
||||
|
||||
setsize(point, VEC_HULL_MIN, VEC_HULL_MAX);
|
||||
waypoints = waypoints + 1;
|
||||
setsize (point, VEC_HULL_MIN, VEC_HULL_MAX);
|
||||
waypoints++;
|
||||
if (!way_head) {
|
||||
way_head = point;
|
||||
way_foot = point;
|
||||
|
@ -246,20 +227,16 @@ entity(vector org) make_waypoint =
|
|||
|
||||
point.count = waypoints;
|
||||
if (waypoint_mode > WM_LOADED) // editor modes
|
||||
setmodel(point, "progs/s_bubble.spr");
|
||||
setmodel (point, "progs/s_bubble.spr");
|
||||
return point;
|
||||
};
|
||||
|
||||
/*
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
|
||||
Dynamic Waypoint spawning and linking. Not
|
||||
very good all things considered.
|
||||
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
*/
|
||||
|
||||
void() DynamicWaypoint =
|
||||
void ()
|
||||
DynamicWaypoint =
|
||||
{
|
||||
local entity t;
|
||||
local float dist, dynlink = 0, dynpoint = 0, editor = 0;
|
||||
|
@ -268,17 +245,16 @@ void() DynamicWaypoint =
|
|||
if (!(self.flags & FL_WATERJUMP)) {
|
||||
self.dyn_flags = 2;
|
||||
if (!self.ishuman) {
|
||||
bot_lost(self.target1, TRUE);
|
||||
bot_lost (self.target1, TRUE);
|
||||
self.enemy = NIL;
|
||||
}
|
||||
}
|
||||
self.portal_time = self.teleport_time;
|
||||
}
|
||||
// stacking everything on waypoint_mode might've been good for the editor,
|
||||
// but it sucks to beat hell for this code.
|
||||
// stacking everything on waypoint_mode might've been good for the editor,
|
||||
// but it sucks to beat hell for this code.
|
||||
|
||||
|
||||
// convert waypoint_mode to something more usable..
|
||||
// convert waypoint_mode to something more usable..
|
||||
if (waypoint_mode > WM_LOADED) {
|
||||
if (self.ishuman) {
|
||||
if (waypoint_mode == WM_EDITOR_DYNLINK)
|
||||
|
@ -290,28 +266,27 @@ void() DynamicWaypoint =
|
|||
} else if (waypoint_mode == WM_DYNAMIC)
|
||||
dynlink = dynpoint = 1;
|
||||
|
||||
// if there's nothing for dynamic to do..
|
||||
// if there's nothing for dynamic to do..
|
||||
if (!dynpoint) {
|
||||
if (!editor)
|
||||
return;
|
||||
}
|
||||
// for speed sake, I won't have bots dynamic waypoint in coop
|
||||
// for speed sake, I won't have bots dynamic waypoint in coop
|
||||
if (!self.ishuman)
|
||||
if (coop)
|
||||
return;
|
||||
|
||||
// don't waypoint in single player
|
||||
// don't waypoint in single player
|
||||
if (max_clients < 2)
|
||||
return;
|
||||
// if you're dead
|
||||
// if you're dead
|
||||
else if (self.health <= 0) {
|
||||
if (dynpoint) {
|
||||
if (self.current_way) {
|
||||
if (pointcontents(self.origin) < -4) {
|
||||
if (self.current_way.b_aiflags & AI_BLIND)
|
||||
self.current_way.b_aiflags = self.current_way.b_aiflags | AI_PRECISION;
|
||||
self.current_way.b_aiflags |= AI_PRECISION;
|
||||
else
|
||||
self.current_way.b_aiflags = self.current_way.b_aiflags | AI_BLIND;
|
||||
self.current_way.b_aiflags |= AI_BLIND;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -321,7 +296,7 @@ void() DynamicWaypoint =
|
|||
return;
|
||||
}
|
||||
|
||||
// you shouldn't be making waypoints mid air
|
||||
// you shouldn't be making waypoints mid air
|
||||
if (dynpoint) {
|
||||
if (!((self.flags & FL_ONGROUND) || self.waterlevel == 3)) {
|
||||
if (self.dyn_flags != 2) {
|
||||
|
@ -330,42 +305,45 @@ void() DynamicWaypoint =
|
|||
return;
|
||||
}
|
||||
}
|
||||
// keep from doing the rest of this every frame
|
||||
// keep from doing the rest of this every frame
|
||||
if (self.dyn_time > time)
|
||||
return;
|
||||
self.dyn_time = time + 0.2;
|
||||
|
||||
// display the links for editor mode
|
||||
// display the links for editor mode
|
||||
if (editor) {
|
||||
if (self.current_way) {
|
||||
if (self.current_way.target1)
|
||||
DeveloperLightning(self.current_way, self.current_way.target1, self.current_way.b_aiflags & AI_TELELINK_1);
|
||||
DeveloperLightning (self.current_way, self.current_way.target1,
|
||||
self.current_way.b_aiflags & AI_TELELINK_1);
|
||||
if (self.current_way.target2)
|
||||
DeveloperLightning(self.current_way, self.current_way.target2, self.current_way.b_aiflags & AI_TELELINK_2);
|
||||
DeveloperLightning (self.current_way, self.current_way.target2,
|
||||
self.current_way.b_aiflags & AI_TELELINK_2);
|
||||
if (self.current_way.target3)
|
||||
DeveloperLightning(self.current_way, self.current_way.target3, self.current_way.b_aiflags & AI_TELELINK_3);
|
||||
DeveloperLightning (self.current_way, self.current_way.target3,
|
||||
self.current_way.b_aiflags & AI_TELELINK_3);
|
||||
if (self.current_way.target4)
|
||||
DeveloperLightning(self.current_way, self.current_way.target4, self.current_way.b_aiflags & AI_TELELINK_4);
|
||||
DeveloperLightning (self.current_way, self.current_way.target4,
|
||||
self.current_way.b_aiflags & AI_TELELINK_4);
|
||||
}
|
||||
if (self.b_aiflags & AI_HOLD_SELECT)
|
||||
return;
|
||||
}
|
||||
|
||||
t = FindWayPoint(self.current_way);
|
||||
t = FindWayPoint (self.current_way);
|
||||
if (t) {
|
||||
dist = vlen(self.origin - t.origin);
|
||||
dist = vlen (self.origin - t.origin);
|
||||
if (dist < 192) {
|
||||
if (dist < 64) {
|
||||
|
||||
if (t != self.current_way) {
|
||||
if (dynlink) {
|
||||
if (!self.dyn_flags) {
|
||||
if (wisible(t, self.current_way))
|
||||
LinkWays(t, self.current_way);
|
||||
if (wisible (t, self.current_way))
|
||||
LinkWays (t, self.current_way);
|
||||
}
|
||||
if (self.dyn_flags == 2)
|
||||
TeleLinkWays(self.current_way, t);
|
||||
else if (wisible(t, self.current_way))
|
||||
TeleLinkWays (self.current_way, t);
|
||||
else if (wisible (t, self.current_way))
|
||||
LinkWays(self.current_way, t);
|
||||
}
|
||||
if (editor) {
|
||||
|
|
|
@ -5,49 +5,50 @@ readme.html that comes with FrikBot */
|
|||
#include "libfrikbot.h"
|
||||
// Ways by Electro
|
||||
|
||||
void() map_dm1 =
|
||||
void ()
|
||||
map_dm1 =
|
||||
{
|
||||
make_way('639.9 716.3 46.0', '2 22 0', 0, 0);
|
||||
make_way('1040.1 749.3 94.0', '1 3 0', 0, 0);
|
||||
make_way('1053.5 1321.0 94.0', '2 4 0', 0, 0);
|
||||
make_way('782.5 1313.2 46.0', '6 41 0', 0, 0);
|
||||
make_way('584.6 882.9 46.0', '4 6 41', 0, 0);
|
||||
make_way('934.2 1048.0 46.0', '4 5 41', 0, 0);
|
||||
make_way('447.8 1313.4 42.0', '41 31 8', 0, 0);
|
||||
make_way('435.8 1562.0 46.0', '7 9 0', 0, 0);
|
||||
make_way('238.3 1592.6 46.0', '8 10 19', 0, 0);
|
||||
make_way('-122.1 1582.6 -98.0', '9 11 0', 0, 0);
|
||||
make_way('-127.2 1414.0 -98.0', '10 12 0', 0, 0);
|
||||
make_way('113.2 1416.1 -98.0', '11 13 0', 0, 0);
|
||||
make_way('108.8 1286.5 -98.0', '12 14 15', 35, 0);
|
||||
make_way('417.0 1258.0 -98.0', '13 39 35', 0, 0);
|
||||
make_way('152.0 951.8 -98.0', '13 16 35', 0, 0);
|
||||
make_way('168.6 776.6 -98.0', '15 17 0', 0, 0);
|
||||
make_way('-283.5 879.9 -98.0', '16 42 0', 0, 0);
|
||||
make_way('396.7 1594.7 -98.0', '39 7 0', 0, 2);
|
||||
make_way('253.6 1416.7 46.0', '9 20 0', 0, 128);
|
||||
make_way('-126.0 1418.0 50.8', '19 21 0', 0, 32784);
|
||||
make_way('-359.5 1398.6 46.0', '40 0 0', 0, 0);
|
||||
make_way('596.8 603.6 46.0', '1 23 0', 0, 0);
|
||||
make_way('484.9 598.6 46.0', '22 24 38', 0, 0);
|
||||
make_way('77.0 614.3 46.0', '23 25 0', 0, 0);
|
||||
make_way('56.8 738.3 46.0', '24 26 15', 42, 0);
|
||||
make_way('-501.1 769.8 46.0', '25 27 0', 0, 0);
|
||||
make_way('-534.0 988.3 46.0', '26 28 0', 0, 0);
|
||||
make_way('-654.8 991.8 46.0', '27 29 0', 0, 0);
|
||||
make_way('-650.7 1227.0 46.0', '28 30 36', 0, 0);
|
||||
make_way('-523.7 1591.5 46.0', '29 10 43', 0, 128);
|
||||
make_way('443.3 1145.0 46.0', '7 32 33', 0, 0);
|
||||
make_way('220.2 1235.6 46.0', '31 34 0', 0, 0);
|
||||
make_way('177.9 1026.7 46.0', '31 34 0', 0, 0);
|
||||
make_way('28.2 1157.3 46.0', '33 32 35', 0, 128);
|
||||
make_way('178.2 1111.7 -98.0', '13 15 42', 14, 0);
|
||||
make_way('-307.0 1218.6 94.0', '29 37 43', 0, 0);
|
||||
make_way('-292.1 1100.2 94.0', '36 17 42', 0, 0);
|
||||
make_way('463.9 816.7 46.0', '23 16 15', 0, 128);
|
||||
make_way('434.7 1451.0 -98.0', '18 0 0', 0, 128);
|
||||
make_way('-314.2 1410.9 46.0', '11 0 0', 0, 256);
|
||||
make_way('599.9 1309.0 46.0', '4 5 7', 6, 0);
|
||||
make_way('-321.9 1006.5 -98.0', '17 35 0', 0, 0);
|
||||
make_way('-542.5 1222.3 46.0', '30 36 0', 0, 0);
|
||||
make_way ('639.9 716.3 46.0', '2 22 0', 0, 0);
|
||||
make_way ('1040.1 749.3 94.0', '1 3 0', 0, 0);
|
||||
make_way ('1053.5 1321.0 94.0', '2 4 0', 0, 0);
|
||||
make_way ('782.5 1313.2 46.0', '6 41 0', 0, 0);
|
||||
make_way ('584.6 882.9 46.0', '4 6 41', 0, 0);
|
||||
make_way ('934.2 1048.0 46.0', '4 5 41', 0, 0);
|
||||
make_way ('447.8 1313.4 42.0', '41 31 8', 0, 0);
|
||||
make_way ('435.8 1562.0 46.0', '7 9 0', 0, 0);
|
||||
make_way ('238.3 1592.6 46.0', '8 10 19', 0, 0);
|
||||
make_way ('-122.1 1582.6 -98.0', '9 11 0', 0, 0);
|
||||
make_way ('-127.2 1414.0 -98.0', '10 12 0', 0, 0);
|
||||
make_way ('113.2 1416.1 -98.0', '11 13 0', 0, 0);
|
||||
make_way ('108.8 1286.5 -98.0', '12 14 15', 35, 0);
|
||||
make_way ('417.0 1258.0 -98.0', '13 39 35', 0, 0);
|
||||
make_way ('152.0 951.8 -98.0', '13 16 35', 0, 0);
|
||||
make_way ('168.6 776.6 -98.0', '15 17 0', 0, 0);
|
||||
make_way ('-283.5 879.9 -98.0', '16 42 0', 0, 0);
|
||||
make_way ('396.7 1594.7 -98.0', '39 7 0', 0, 2);
|
||||
make_way ('253.6 1416.7 46.0', '9 20 0', 0, 128);
|
||||
make_way ('-126.0 1418.0 50.8', '19 21 0', 0, 32784);
|
||||
make_way ('-359.5 1398.6 46.0', '40 0 0', 0, 0);
|
||||
make_way ('596.8 603.6 46.0', '1 23 0', 0, 0);
|
||||
make_way ('484.9 598.6 46.0', '22 24 38', 0, 0);
|
||||
make_way ('77.0 614.3 46.0', '23 25 0', 0, 0);
|
||||
make_way ('56.8 738.3 46.0', '24 26 15', 42, 0);
|
||||
make_way ('-501.1 769.8 46.0', '25 27 0', 0, 0);
|
||||
make_way ('-534.0 988.3 46.0', '26 28 0', 0, 0);
|
||||
make_way ('-654.8 991.8 46.0', '27 29 0', 0, 0);
|
||||
make_way ('-650.7 1227.0 46.0', '28 30 36', 0, 0);
|
||||
make_way ('-523.7 1591.5 46.0', '29 10 43', 0, 128);
|
||||
make_way ('443.3 1145.0 46.0', '7 32 33', 0, 0);
|
||||
make_way ('220.2 1235.6 46.0', '31 34 0', 0, 0);
|
||||
make_way ('177.9 1026.7 46.0', '31 34 0', 0, 0);
|
||||
make_way ('28.2 1157.3 46.0', '33 32 35', 0, 128);
|
||||
make_way ('178.2 1111.7 -98.0', '13 15 42', 14, 0);
|
||||
make_way ('-307.0 1218.6 94.0', '29 37 43', 0, 0);
|
||||
make_way ('-292.1 1100.2 94.0', '36 17 42', 0, 0);
|
||||
make_way ('463.9 816.7 46.0', '23 16 15', 0, 128);
|
||||
make_way ('434.7 1451.0 -98.0', '18 0 0', 0, 128);
|
||||
make_way ('-314.2 1410.9 46.0', '11 0 0', 0, 256);
|
||||
make_way ('599.9 1309.0 46.0', '4 5 7', 6, 0);
|
||||
make_way ('-321.9 1006.5 -98.0', '17 35 0', 0, 0);
|
||||
make_way ('-542.5 1222.3 46.0', '30 36 0', 0, 0);
|
||||
};
|
||||
|
|
175
fbxa/map_dm2.qc
175
fbxa/map_dm2.qc
|
@ -5,94 +5,95 @@ readme.html that comes with FrikBot */
|
|||
#include "libfrikbot.h"
|
||||
// Ways by Frika C
|
||||
|
||||
void() map_dm2 =
|
||||
void ()
|
||||
map_dm2 =
|
||||
{
|
||||
make_way('2441.0 -189.1 46.0', '2 72 0', 0, 0);
|
||||
make_way('2036.7 -141.6 46.0', '26 1 41', 46, 0);
|
||||
make_way('2126.7 238.6 46.0', '0 43 41', 0, 0);
|
||||
make_way('2615.4 -7.7 142.0', '68 41 0', 0, 0);
|
||||
make_way('2614.6 -781.7 142.0', '73 6 62', 0, 0);
|
||||
make_way('2455.8 -830.3 142.0', '5 7 48', 62, 0);
|
||||
make_way('2511.8 -1395.2 46.0', '8 11 62', 0, 0);
|
||||
make_way('2481.5 -1681.3 46.0', '28 9 7', 0, 0);
|
||||
make_way('2391.6 -1861.9 46.0', '10 8 0', 0, 0);
|
||||
make_way('2184.0 -1867.0 46.0', '53 9 0', 0, 0);
|
||||
make_way('2741.6 -1424.7 46.0', '7 12 0', 0, 0);
|
||||
make_way('2735.0 -1693.3 142.0', '11 47 0', 0, 0);
|
||||
make_way('2927.9 -1852.4 142.0', '47 14 0', 0, 16);
|
||||
make_way('2946.4 -1993.7 142.0', '13 37 0', 0, 16);
|
||||
make_way('2254.5 -185.3 -114.0', '16 0 0', 0, 0);
|
||||
make_way('2249.8 -27.2 -114.0', '15 17 0', 0, 0);
|
||||
make_way('2611.8 -8.2 -50.0', '44 16 45', 0, 0);
|
||||
make_way('1347.5 -1024.0 366.0', '59 58 0', 0, 0);
|
||||
make_way('2002.3 -1024.0 366.0', '35 0 0', 0, 0);
|
||||
make_way('1330.1 -714.6 366.0', '18 0 59', 0, 1024);
|
||||
make_way('1323.0 -381.6 206.0', '22 24 0', 0, 0);
|
||||
make_way('1328.2 -487.0 206.0', '21 20 61', 0, 0);
|
||||
make_way('1559.7 -654.4 206.0', '0 60 0', 0, 0);
|
||||
make_way('1837.4 -363.6 206.0', '21 25 0', 0, 0);
|
||||
make_way('1877.0 -652.0 206.0', '24 26 0', 0, 0);
|
||||
make_way('2038.3 -473.0 126.0', '2 27 50', 0, 0);
|
||||
make_way('1683.4 -506.8 46.0', '26 64 63', 71, 0);
|
||||
make_way('1699.3 -1694.6 46.0', '65 8 0', 0, 65536);
|
||||
make_way('1697.9 -1336.4 42.0', '35 31 30', 65, 32784);
|
||||
make_way('2058.4 -1354.2 158.0', '29 33 0', 0, 0);
|
||||
make_way('1307.4 -1338.4 166.0', '29 32 0', 0, 0);
|
||||
make_way('1315.8 -1034.8 222.0', '31 36 0', 0, 0);
|
||||
make_way('2043.6 -1030.7 222.0', '30 34 0', 0, 0);
|
||||
make_way('2043.6 -904.3 54.0', '35 0 0', 0, 1);
|
||||
make_way('1696.0 -1037.4 42.0', '64 29 55', 56, 32784);
|
||||
make_way('1307.4 -872.6 54.0', '35 0 0', 0, 1);
|
||||
make_way('2733.5 -2008.2 142.0', '38 0 0', 0, 0);
|
||||
make_way('2731.0 -2283.1 142.0', '37 39 0', 0, 0);
|
||||
make_way('2425.1 -2305.7 142.0', '38 40 0', 0, 0);
|
||||
make_way('2423.1 -2444.5 142.0', '39 67 31', 0, 4);
|
||||
make_way('2175.6 -55.9 46.0', '4 2 0', 3, 0);
|
||||
make_way('2181.9 -2388.8 222.0', '67 70 0', 0, 0);
|
||||
make_way('2347.3 317.0 30.0', '3 74 0', 0, 0);
|
||||
make_way('2644.7 235.2 -50.0', '74 17 0', 0, 0);
|
||||
make_way('2806.9 -27.3 -50.0', '18 0 0', 0, 1);
|
||||
make_way('2408.5 -401.3 30.0', '2 0 0', 0, 0);
|
||||
make_way('2742.7 -1857.6 142.0', '12 13 0', 0, 0);
|
||||
make_way('2352.0 -858.9 78.0', '49 0 0', 0, 0);
|
||||
make_way('2375.9 -685.3 78.0', '48 46 0', 0, 0);
|
||||
make_way('1971.3 -556.1 126.0', '25 0 0', 0, 4096);
|
||||
make_way('2429.1 -1968.0 142.0', '52 66 0', 0, 128);
|
||||
make_way('2280.0 -1968.0 142.0', '51 53 0', 0, 160);
|
||||
make_way('2170.1 -1977.8 94.0', '10 69 0', 0, 160);
|
||||
make_way('2189.7 -2258.8 106.0', '42 0 0', 0, 4096);
|
||||
make_way('1424.0 -944.4 42.0', '35 0 0', 0, 32768);
|
||||
make_way('1908.5 -928.4 42.0', '35 0 0', 0, 32768);
|
||||
make_way('1825.4 -1029.8 366.0', '19 0 0', 0, 2048);
|
||||
make_way('1512.9 -1015.2 366.0', '18 57 0', 0, 2048);
|
||||
make_way('1264.0 -721.5 366.0', '20 22 18', 0, 0);
|
||||
make_way('1440.6 -673.6 206.0', '23 61 0', 0, 32);
|
||||
make_way('1449.1 -566.9 206.0', '60 22 63', 0, 32);
|
||||
make_way('2525.9 -867.2 142.0', '6 0 5', 0, 1024);
|
||||
make_way('1545.7 -488.4 46.0', '27 0 0', 0, 128);
|
||||
make_way('1687.9 -744.0 42.0', '27 35 0', 0, 32784);
|
||||
make_way('1700.6 -1513.2 46.0', '29 28 0', 0, 0);
|
||||
make_way('2553.9 -1971.9 142.0', '51 0 0', 0, 160);
|
||||
make_way('2160.2 -2469.1 222.0', '42 40 0', 0, 0);
|
||||
make_way('2601.2 -176.0 142.0', '4 73 0', 0, 0);
|
||||
make_way('2178.2 -2134.2 106.0', '53 54 70', 0, 0);
|
||||
make_way('2172.0 -2347.6 110.0', '69 75 0', 0, 0);
|
||||
make_way('1622.4 -528.7 46.0', '61 0 0', 0, 4096);
|
||||
make_way('2576.0 -192.1 54.0', '1 0 0', 0, 0);
|
||||
make_way('2611.3 -441.3 142.0', '5 68 0', 0, 0);
|
||||
make_way('2456.5 297.3 -34.0', '43 44 0', 0, 0);
|
||||
make_way('2168.4 -2336.3 110.0', '76 0 0', 0, 16);
|
||||
make_way('2165.7 -1808.0 46.0', '77 0 0', 0, 0);
|
||||
make_way('2529.4 -1844.5 46.0', '78 0 0', 0, 0);
|
||||
make_way('2585.1 -1394.2 46.0', '79 0 0', 0, 0);
|
||||
make_way('2752.6 -1389.0 46.0', '80 0 0', 0, 0);
|
||||
make_way('2734.7 -1822.2 142.0', '81 0 0', 0, 0);
|
||||
make_way('2980.3 -1832.3 142.0', '82 0 0', 0, 16);
|
||||
make_way('2957.0 -2032.2 142.0', '83 0 0', 0, 16);
|
||||
make_way('2720.9 -2057.8 150.0', '84 0 0', 0, 0);
|
||||
make_way('2693.6 -2275.7 142.0', '85 0 0', 0, 0);
|
||||
make_way('2429.9 -2295.8 142.0', '86 0 0', 0, 0);
|
||||
make_way('2431.5 -2115.8 142.0', '51 0 0', 0, 32784);
|
||||
make_way ('2441.0 -189.1 46.0', '2 72 0', 0, 0);
|
||||
make_way ('2036.7 -141.6 46.0', '26 1 41', 46, 0);
|
||||
make_way ('2126.7 238.6 46.0', '0 43 41', 0, 0);
|
||||
make_way ('2615.4 -7.7 142.0', '68 41 0', 0, 0);
|
||||
make_way ('2614.6 -781.7 142.0', '73 6 62', 0, 0);
|
||||
make_way ('2455.8 -830.3 142.0', '5 7 48', 62, 0);
|
||||
make_way ('2511.8 -1395.2 46.0', '8 11 62', 0, 0);
|
||||
make_way ('2481.5 -1681.3 46.0', '28 9 7', 0, 0);
|
||||
make_way ('2391.6 -1861.9 46.0', '10 8 0', 0, 0);
|
||||
make_way ('2184.0 -1867.0 46.0', '53 9 0', 0, 0);
|
||||
make_way ('2741.6 -1424.7 46.0', '7 12 0', 0, 0);
|
||||
make_way ('2735.0 -1693.3 142.0', '11 47 0', 0, 0);
|
||||
make_way ('2927.9 -1852.4 142.0', '47 14 0', 0, 16);
|
||||
make_way ('2946.4 -1993.7 142.0', '13 37 0', 0, 16);
|
||||
make_way ('2254.5 -185.3 -114.0', '16 0 0', 0, 0);
|
||||
make_way ('2249.8 -27.2 -114.0', '15 17 0', 0, 0);
|
||||
make_way ('2611.8 -8.2 -50.0', '44 16 45', 0, 0);
|
||||
make_way ('1347.5 -1024.0 366.0', '59 58 0', 0, 0);
|
||||
make_way ('2002.3 -1024.0 366.0', '35 0 0', 0, 0);
|
||||
make_way ('1330.1 -714.6 366.0', '18 0 59', 0, 1024);
|
||||
make_way ('1323.0 -381.6 206.0', '22 24 0', 0, 0);
|
||||
make_way ('1328.2 -487.0 206.0', '21 20 61', 0, 0);
|
||||
make_way ('1559.7 -654.4 206.0', '0 60 0', 0, 0);
|
||||
make_way ('1837.4 -363.6 206.0', '21 25 0', 0, 0);
|
||||
make_way ('1877.0 -652.0 206.0', '24 26 0', 0, 0);
|
||||
make_way ('2038.3 -473.0 126.0', '2 27 50', 0, 0);
|
||||
make_way ('1683.4 -506.8 46.0', '26 64 63', 71, 0);
|
||||
make_way ('1699.3 -1694.6 46.0', '65 8 0', 0, 65536);
|
||||
make_way ('1697.9 -1336.4 42.0', '35 31 30', 65, 32784);
|
||||
make_way ('2058.4 -1354.2 158.0', '29 33 0', 0, 0);
|
||||
make_way ('1307.4 -1338.4 166.0', '29 32 0', 0, 0);
|
||||
make_way ('1315.8 -1034.8 222.0', '31 36 0', 0, 0);
|
||||
make_way ('2043.6 -1030.7 222.0', '30 34 0', 0, 0);
|
||||
make_way ('2043.6 -904.3 54.0', '35 0 0', 0, 1);
|
||||
make_way ('1696.0 -1037.4 42.0', '64 29 55', 56, 32784);
|
||||
make_way ('1307.4 -872.6 54.0', '35 0 0', 0, 1);
|
||||
make_way ('2733.5 -2008.2 142.0', '38 0 0', 0, 0);
|
||||
make_way ('2731.0 -2283.1 142.0', '37 39 0', 0, 0);
|
||||
make_way ('2425.1 -2305.7 142.0', '38 40 0', 0, 0);
|
||||
make_way ('2423.1 -2444.5 142.0', '39 67 31', 0, 4);
|
||||
make_way ('2175.6 -55.9 46.0', '4 2 0', 3, 0);
|
||||
make_way ('2181.9 -2388.8 222.0', '67 70 0', 0, 0);
|
||||
make_way ('2347.3 317.0 30.0', '3 74 0', 0, 0);
|
||||
make_way ('2644.7 235.2 -50.0', '74 17 0', 0, 0);
|
||||
make_way ('2806.9 -27.3 -50.0', '18 0 0', 0, 1);
|
||||
make_way ('2408.5 -401.3 30.0', '2 0 0', 0, 0);
|
||||
make_way ('2742.7 -1857.6 142.0', '12 13 0', 0, 0);
|
||||
make_way ('2352.0 -858.9 78.0', '49 0 0', 0, 0);
|
||||
make_way ('2375.9 -685.3 78.0', '48 46 0', 0, 0);
|
||||
make_way ('1971.3 -556.1 126.0', '25 0 0', 0, 4096);
|
||||
make_way ('2429.1 -1968.0 142.0', '52 66 0', 0, 128);
|
||||
make_way ('2280.0 -1968.0 142.0', '51 53 0', 0, 160);
|
||||
make_way ('2170.1 -1977.8 94.0', '10 69 0', 0, 160);
|
||||
make_way ('2189.7 -2258.8 106.0', '42 0 0', 0, 4096);
|
||||
make_way ('1424.0 -944.4 42.0', '35 0 0', 0, 32768);
|
||||
make_way ('1908.5 -928.4 42.0', '35 0 0', 0, 32768);
|
||||
make_way ('1825.4 -1029.8 366.0', '19 0 0', 0, 2048);
|
||||
make_way ('1512.9 -1015.2 366.0', '18 57 0', 0, 2048);
|
||||
make_way ('1264.0 -721.5 366.0', '20 22 18', 0, 0);
|
||||
make_way ('1440.6 -673.6 206.0', '23 61 0', 0, 32);
|
||||
make_way ('1449.1 -566.9 206.0', '60 22 63', 0, 32);
|
||||
make_way ('2525.9 -867.2 142.0', '6 0 5', 0, 1024);
|
||||
make_way ('1545.7 -488.4 46.0', '27 0 0', 0, 128);
|
||||
make_way ('1687.9 -744.0 42.0', '27 35 0', 0, 32784);
|
||||
make_way ('1700.6 -1513.2 46.0', '29 28 0', 0, 0);
|
||||
make_way ('2553.9 -1971.9 142.0', '51 0 0', 0, 160);
|
||||
make_way ('2160.2 -2469.1 222.0', '42 40 0', 0, 0);
|
||||
make_way ('2601.2 -176.0 142.0', '4 73 0', 0, 0);
|
||||
make_way ('2178.2 -2134.2 106.0', '53 54 70', 0, 0);
|
||||
make_way ('2172.0 -2347.6 110.0', '69 75 0', 0, 0);
|
||||
make_way ('1622.4 -528.7 46.0', '61 0 0', 0, 4096);
|
||||
make_way ('2576.0 -192.1 54.0', '1 0 0', 0, 0);
|
||||
make_way ('2611.3 -441.3 142.0', '5 68 0', 0, 0);
|
||||
make_way ('2456.5 297.3 -34.0', '43 44 0', 0, 0);
|
||||
make_way ('2168.4 -2336.3 110.0', '76 0 0', 0, 16);
|
||||
make_way ('2165.7 -1808.0 46.0', '77 0 0', 0, 0);
|
||||
make_way ('2529.4 -1844.5 46.0', '78 0 0', 0, 0);
|
||||
make_way ('2585.1 -1394.2 46.0', '79 0 0', 0, 0);
|
||||
make_way ('2752.6 -1389.0 46.0', '80 0 0', 0, 0);
|
||||
make_way ('2734.7 -1822.2 142.0', '81 0 0', 0, 0);
|
||||
make_way ('2980.3 -1832.3 142.0', '82 0 0', 0, 16);
|
||||
make_way ('2957.0 -2032.2 142.0', '83 0 0', 0, 16);
|
||||
make_way ('2720.9 -2057.8 150.0', '84 0 0', 0, 0);
|
||||
make_way ('2693.6 -2275.7 142.0', '85 0 0', 0, 0);
|
||||
make_way ('2429.9 -2295.8 142.0', '86 0 0', 0, 0);
|
||||
make_way ('2431.5 -2115.8 142.0', '51 0 0', 0, 32784);
|
||||
};
|
||||
|
||||
// End dump
|
||||
|
|
281
fbxa/map_dm3.qc
281
fbxa/map_dm3.qc
|
@ -5,145 +5,146 @@ wayedit.txt that comes with FrikBot */
|
|||
#include "libfrikbot.h"
|
||||
// Ways by Frika C
|
||||
|
||||
void() map_dm3 =
|
||||
void ()
|
||||
map_dm3 =
|
||||
{
|
||||
make_way('-888.8 -71.0 6.0', '44 3 2', 0, 0);
|
||||
make_way('-937.4 19.2 6.0', '3 1 45', 0, 0);
|
||||
make_way('-827.2 26.1 6.0', '1 2 4', 0, 0);
|
||||
make_way('-801.5 366.8 6.0', '3 5 0', 0, 0);
|
||||
make_way('-783.8 774.2 6.0', '4 6 0', 0, 0);
|
||||
make_way('-550.2 759.6 6.0', '5 7 0', 0, 0);
|
||||
make_way('-574.0 368.0 6.0', '6 8 0', 0, 0);
|
||||
make_way('-430.2 378.3 6.0', '7 9 0', 0, 0);
|
||||
make_way('-406.9 784.0 6.0', '8 10 0', 0, 0);
|
||||
make_way('-259.9 772.3 6.0', '9 11 12', 0, 0);
|
||||
make_way('-243.7 250.5 14.0', '10 12 0', 0, 0);
|
||||
make_way('-35.8 581.6 62.0', '10 11 13', 14, 0);
|
||||
make_way(' 29.5 647.5 62.0', '12 15 49', 0, 0);
|
||||
make_way('521.9 603.4 78.0', '12 15 0', 0, 0);
|
||||
make_way('507.6 514.3 78.0', '14 13 16', 0, 0);
|
||||
make_way('504.3 308.4 78.0', '15 20 17', 0, 0);
|
||||
make_way('175.2 -34.7 78.0', '16 19 20', 18, 0);
|
||||
make_way('485.8 -387.2 78.0', '17 21 19', 0, 0);
|
||||
make_way('368.0 -201.7 78.0', '17 18 51', 0, 0);
|
||||
make_way('397.0 124.9 78.0', '16 17 51', 0, 0);
|
||||
make_way('496.0 -558.1 78.0', '18 22 58', 31, 0);
|
||||
make_way('147.5 -528.0 174.0', '21 23 0', 0, 128);
|
||||
make_way('-213.3 -528.0 174.0', '22 24 0', 0, 128);
|
||||
make_way('-229.6 -865.0 174.0', '23 25 0', 0, 128);
|
||||
make_way('339.0 -873.6 286.0', '24 26 0', 0, 128);
|
||||
make_way('341.2 -538.2 286.0', '25 27 0', 0, 128);
|
||||
make_way('-143.0 -535.0 350.0', '26 28 0', 0, 128);
|
||||
make_way('-143.3 -696.6 350.0', '27 29 0', 0, 128);
|
||||
make_way('283.6 -703.7 350.0', '28 30 0', 0, 128);
|
||||
make_way('371.0 -699.8 286.0', '31 0 0', 0, 128);
|
||||
make_way('416.0 -691.3 6.0', '33 32 0', 0, 0);
|
||||
make_way('253.9 -794.9 6.0', '31 57 34', 0, 0);
|
||||
make_way('253.7 -610.4 6.0', '57 31 0', 0, 0);
|
||||
make_way('-64.0 -727.5 6.0', '32 35 36', 37, 0);
|
||||
make_way('-40.6 -874.3 6.0', '34 37 58', 0, 128);
|
||||
make_way(' 43.7 -535.1 6.0', '37 57 34', 56, 0);
|
||||
make_way('-172.1 -560.9 6.0', '38 36 35', 34, 0);
|
||||
make_way('-298.6 -563.7 6.0', '39 37 0', 0, 0);
|
||||
make_way('-318.6 -710.5 6.0', '38 40 0', 0, 0);
|
||||
make_way('-629.4 -683.2 6.0', '39 41 0', 0, 0);
|
||||
make_way('-626.9 -449.0 6.0', '40 42 43', 0, 0);
|
||||
make_way('-565.7 -449.0 6.0', '41 19 0', 0, 2);
|
||||
make_way('-654.9 -271.1 6.0', '41 44 0', 0, 0);
|
||||
make_way('-873.3 -247.0 6.0', '43 1 0', 0, 0);
|
||||
make_way('-939.9 347.7 142.0', '46 2 0', 0, 0);
|
||||
make_way('-912.7 821.5 142.0', '47 45 5', 0, 0);
|
||||
make_way('-577.0 859.7 142.0', '50 46 48', 0, 0);
|
||||
make_way('-556.0 784.6 142.0', '47 6 59', 0, 256);
|
||||
make_way('-98.5 799.3 142.0', '13 50 0', 0, 0);
|
||||
make_way('-198.8 861.0 142.0', '49 47 10', 0, 0);
|
||||
make_way('584.5 -30.1 -146.0', '52 69 71', 0, 0);
|
||||
make_way('288.5 -27.4 -154.0', '53 51 0', 0, 0);
|
||||
make_way('126.7 -188.8 -154.0', '54 52 0', 0, 0);
|
||||
make_way('-164.4 -210.3 -154.0', '55 53 0', 0, 0);
|
||||
make_way('-177.9 -425.6 -90.0', '56 54 0', 0, 0);
|
||||
make_way(' 52.6 -443.0 -10.0', '36 55 0', 0, 0);
|
||||
make_way(' 71.4 -634.1 6.0', '36 33 32', 0, 0);
|
||||
make_way('496.0 -880.0 78.0', '35 21 31', 0, 128);
|
||||
make_way('-528.0 664.4 142.0', '60 6 0', 0, 65536);
|
||||
make_way('-496.8 461.0 142.0', '59 8 7', 61, 65792);
|
||||
make_way('-466.9 320.2 142.0', '62 11 7', 60, 65824);
|
||||
make_way('-459.7 277.2 166.0', '63 0 0', 0, 65824);
|
||||
make_way('-467.3 208.0 198.0', '11 64 0', 0, 65536);
|
||||
make_way('-719.9 208.0 206.0', '63 68 0', 0, 65664);
|
||||
make_way('-825.0 251.2 206.0', '68 66 3', 0, 65792);
|
||||
make_way('-799.7 108.2 206.0', '67 2 0', 0, 65568);
|
||||
make_way('-688.0 99.6 206.0', '66 0 0', 0, 65536);
|
||||
make_way('-797.7 318.5 206.0', '65 64 45', 0, 65664);
|
||||
make_way('822.8 -265.4 -162.0', '51 70 0', 0, 0);
|
||||
make_way('1000.0 -29.9 -162.0', '71 69 122', 0, 0);
|
||||
make_way('827.2 198.1 -162.0', '51 70 0', 0, 0);
|
||||
make_way('1970.0 -31.5 -146.0', '123 78 73', 0, 0);
|
||||
make_way('1982.6 197.3 -66.0', '72 74 0', 0, 0);
|
||||
make_way('1964.1 437.3 -66.0', '73 75 76', 0, 0);
|
||||
make_way('1544.8 491.8 -66.0', '74 76 0', 0, 0);
|
||||
make_way('1693.0 400.0 -66.0', '75 74 77', 0, 256);
|
||||
make_way('1695.4 362.0 -42.0', '132 131 0', 0, 0);
|
||||
make_way('1963.1 -436.8 -2.0', '72 79 0', 0, 0);
|
||||
make_way('1380.4 -427.4 -2.0', '78 102 80', 0, 0);
|
||||
make_way('1186.5 -681.2 -2.0', '81 79 121', 0, 0);
|
||||
make_way('1322.4 -745.5 -2.0', '82 80 0', 0, 0);
|
||||
make_way('1461.8 -756.2 -2.0', '85 83 81', 0, 0);
|
||||
make_way('1432.7 -944.0 -2.0', '82 84 0', 0, 0);
|
||||
make_way('1248.5 -926.6 -2.0', '83 101 0', 0, 2);
|
||||
make_way('1707.9 -715.7 -2.0', '86 82 0', 0, 0);
|
||||
make_way('1821.0 -850.6 -2.0', '87 85 0', 0, 0);
|
||||
make_way('1531.5 -899.7 110.0', '88 86 82', 85, 0);
|
||||
make_way('1125.5 -896.2 110.0', '89 87 0', 0, 0);
|
||||
make_way('986.5 -799.6 110.0', '90 88 80', 121, 0);
|
||||
make_way('811.1 -657.7 110.0', '91 89 0', 0, 0);
|
||||
make_way('658.1 -638.4 110.0', '92 90 0', 0, 0);
|
||||
make_way('656.0 -356.4 78.0', '93 91 0', 0, 0);
|
||||
make_way('824.9 -256.7 78.0', '94 92 51', 0, 0);
|
||||
make_way('952.1 -32.8 78.0', '95 93 0', 0, 0);
|
||||
make_way('817.3 175.9 78.0', '96 94 51', 0, 0);
|
||||
make_way('633.2 323.0 78.0', '97 95 0', 0, 0);
|
||||
make_way('631.7 415.3 78.0', '98 96 0', 0, 0);
|
||||
make_way('822.9 444.2 78.0', '99 101 97', 0, 0);
|
||||
make_way('1111.5 624.0 78.0', '101 100 98', 0, 256);
|
||||
make_way('1114.6 651.3 102.0', '111 0 0', 0, 768);
|
||||
make_way('1338.2 383.4 78.0', '102 99 98', 0, 0);
|
||||
make_way('1366.0 -48.8 -2.0', '79 101 123', 122, 0);
|
||||
make_way('1355.8 65.9 -370.0', '128 125 132', 104, 65600);
|
||||
make_way('1362.6 635.0 -334.0', '103 135 0', 0, 65792);
|
||||
make_way('1366.7 875.6 -274.0', '135 111 0', 0, 0);
|
||||
make_way('841.8 1105.2 -242.0', '111 112 107', 0, 0);
|
||||
make_way('1439.7 1113.7 -213.0', '106 108 0', 0, 0);
|
||||
make_way('1871.4 990.6 -191.0', '107 109 0', 0, 0);
|
||||
make_way('1851.0 655.5 -158.0', '108 110 0', 0, 0);
|
||||
make_way('1542.3 802.5 -274.0', '105 104 0', 0, 0);
|
||||
make_way('1074.9 805.1 -274.0', '105 112 106', 135, 0);
|
||||
make_way('703.5 681.7 -242.0', '111 106 113', 0, 1024);
|
||||
make_way('608.0 681.2 -82.0', '114 0 0', 0, 0);
|
||||
make_way('612.4 789.1 -82.0', '115 111 0', 0, 1024);
|
||||
make_way('614.1 858.3 46.0', '116 0 0', 0, 0);
|
||||
make_way('618.9 1020.4 46.0', '115 117 0', 0, 0);
|
||||
make_way('539.7 1025.0 62.0', '116 118 0', 0, 0);
|
||||
make_way('516.6 923.8 62.0', '117 119 0', 0, 1024);
|
||||
make_way('511.4 848.0 238.0', '120 0 0', 0, 0);
|
||||
make_way('504.8 654.8 238.0', '119 14 0', 0, 0);
|
||||
make_way('1112.4 -706.8 -2.0', '89 80 0', 0, 4096);
|
||||
make_way('1124.4 -31.4 -146.0', '138 70 124', 126, 0);
|
||||
make_way('1654.0 -38.6 -146.0', '137 72 131', 129, 0);
|
||||
make_way('1160.0 78.5 -147.2', '125 122 0', 0, 512);
|
||||
make_way('1137.3 45.9 -370.0', '124 103 127', 0, 65536);
|
||||
make_way('1161.1 -144.4 -148.3', '122 127 0', 0, 66048);
|
||||
make_way('1159.7 -167.3 -370.0', '126 125 128', 134, 65536);
|
||||
make_way('1468.4 -211.2 -370.0', '129 103 133', 130, 65536);
|
||||
make_way('1654.8 -127.0 -162.2', '123 128 134', 0, 65600);
|
||||
make_way('1798.0 -355.0 -370.0', '128 133 0', 0, 65536);
|
||||
make_way('1660.2 51.5 -152.0', '132 123 0', 0, 64);
|
||||
make_way('1657.1 71.4 -370.0', '103 131 133', 0, 65536);
|
||||
make_way('1621.6 -110.8 -370.0', '128 132 130', 0, 65536);
|
||||
make_way('1344.8 -141.7 -370.0', '127 103 128', 129, 65536);
|
||||
make_way('1368.7 785.3 -271.1', '105 104 0', 0, 0);
|
||||
make_way('1365.6 -34.1 -146.0', '138 137 0', 0, 0);
|
||||
make_way('1536.2 -35.6 -146.0', '136 123 0', 0, 0);
|
||||
make_way('1197.9 -32.8 -146.0', '122 136 0', 0, 0);
|
||||
make_way('1537.0 8.8 -146.0', '123 102 0', 0, 4096);
|
||||
make_way ('-888.8 -71.0 6.0', '44 3 2', 0, 0);
|
||||
make_way ('-937.4 19.2 6.0', '3 1 45', 0, 0);
|
||||
make_way ('-827.2 26.1 6.0', '1 2 4', 0, 0);
|
||||
make_way ('-801.5 366.8 6.0', '3 5 0', 0, 0);
|
||||
make_way ('-783.8 774.2 6.0', '4 6 0', 0, 0);
|
||||
make_way ('-550.2 759.6 6.0', '5 7 0', 0, 0);
|
||||
make_way ('-574.0 368.0 6.0', '6 8 0', 0, 0);
|
||||
make_way ('-430.2 378.3 6.0', '7 9 0', 0, 0);
|
||||
make_way ('-406.9 784.0 6.0', '8 10 0', 0, 0);
|
||||
make_way ('-259.9 772.3 6.0', '9 11 12', 0, 0);
|
||||
make_way ('-243.7 250.5 14.0', '10 12 0', 0, 0);
|
||||
make_way ('-35.8 581.6 62.0', '10 11 13', 14, 0);
|
||||
make_way (' 29.5 647.5 62.0', '12 15 49', 0, 0);
|
||||
make_way ('521.9 603.4 78.0', '12 15 0', 0, 0);
|
||||
make_way ('507.6 514.3 78.0', '14 13 16', 0, 0);
|
||||
make_way ('504.3 308.4 78.0', '15 20 17', 0, 0);
|
||||
make_way ('175.2 -34.7 78.0', '16 19 20', 18, 0);
|
||||
make_way ('485.8 -387.2 78.0', '17 21 19', 0, 0);
|
||||
make_way ('368.0 -201.7 78.0', '17 18 51', 0, 0);
|
||||
make_way ('397.0 124.9 78.0', '16 17 51', 0, 0);
|
||||
make_way ('496.0 -558.1 78.0', '18 22 58', 31, 0);
|
||||
make_way ('147.5 -528.0 174.0', '21 23 0', 0, 128);
|
||||
make_way ('-213.3 -528.0 174.0', '22 24 0', 0, 128);
|
||||
make_way ('-229.6 -865.0 174.0', '23 25 0', 0, 128);
|
||||
make_way ('339.0 -873.6 286.0', '24 26 0', 0, 128);
|
||||
make_way ('341.2 -538.2 286.0', '25 27 0', 0, 128);
|
||||
make_way ('-143.0 -535.0 350.0', '26 28 0', 0, 128);
|
||||
make_way ('-143.3 -696.6 350.0', '27 29 0', 0, 128);
|
||||
make_way ('283.6 -703.7 350.0', '28 30 0', 0, 128);
|
||||
make_way ('371.0 -699.8 286.0', '31 0 0', 0, 128);
|
||||
make_way ('416.0 -691.3 6.0', '33 32 0', 0, 0);
|
||||
make_way ('253.9 -794.9 6.0', '31 57 34', 0, 0);
|
||||
make_way ('253.7 -610.4 6.0', '57 31 0', 0, 0);
|
||||
make_way ('-64.0 -727.5 6.0', '32 35 36', 37, 0);
|
||||
make_way ('-40.6 -874.3 6.0', '34 37 58', 0, 128);
|
||||
make_way (' 43.7 -535.1 6.0', '37 57 34', 56, 0);
|
||||
make_way ('-172.1 -560.9 6.0', '38 36 35', 34, 0);
|
||||
make_way ('-298.6 -563.7 6.0', '39 37 0', 0, 0);
|
||||
make_way ('-318.6 -710.5 6.0', '38 40 0', 0, 0);
|
||||
make_way ('-629.4 -683.2 6.0', '39 41 0', 0, 0);
|
||||
make_way ('-626.9 -449.0 6.0', '40 42 43', 0, 0);
|
||||
make_way ('-565.7 -449.0 6.0', '41 19 0', 0, 2);
|
||||
make_way ('-654.9 -271.1 6.0', '41 44 0', 0, 0);
|
||||
make_way ('-873.3 -247.0 6.0', '43 1 0', 0, 0);
|
||||
make_way ('-939.9 347.7 142.0', '46 2 0', 0, 0);
|
||||
make_way ('-912.7 821.5 142.0', '47 45 5', 0, 0);
|
||||
make_way ('-577.0 859.7 142.0', '50 46 48', 0, 0);
|
||||
make_way ('-556.0 784.6 142.0', '47 6 59', 0, 256);
|
||||
make_way ('-98.5 799.3 142.0', '13 50 0', 0, 0);
|
||||
make_way ('-198.8 861.0 142.0', '49 47 10', 0, 0);
|
||||
make_way ('584.5 -30.1 -146.0', '52 69 71', 0, 0);
|
||||
make_way ('288.5 -27.4 -154.0', '53 51 0', 0, 0);
|
||||
make_way ('126.7 -188.8 -154.0', '54 52 0', 0, 0);
|
||||
make_way ('-164.4 -210.3 -154.0', '55 53 0', 0, 0);
|
||||
make_way ('-177.9 -425.6 -90.0', '56 54 0', 0, 0);
|
||||
make_way (' 52.6 -443.0 -10.0', '36 55 0', 0, 0);
|
||||
make_way (' 71.4 -634.1 6.0', '36 33 32', 0, 0);
|
||||
make_way ('496.0 -880.0 78.0', '35 21 31', 0, 128);
|
||||
make_way ('-528.0 664.4 142.0', '60 6 0', 0, 65536);
|
||||
make_way ('-496.8 461.0 142.0', '59 8 7', 61, 65792);
|
||||
make_way ('-466.9 320.2 142.0', '62 11 7', 60, 65824);
|
||||
make_way ('-459.7 277.2 166.0', '63 0 0', 0, 65824);
|
||||
make_way ('-467.3 208.0 198.0', '11 64 0', 0, 65536);
|
||||
make_way ('-719.9 208.0 206.0', '63 68 0', 0, 65664);
|
||||
make_way ('-825.0 251.2 206.0', '68 66 3', 0, 65792);
|
||||
make_way ('-799.7 108.2 206.0', '67 2 0', 0, 65568);
|
||||
make_way ('-688.0 99.6 206.0', '66 0 0', 0, 65536);
|
||||
make_way ('-797.7 318.5 206.0', '65 64 45', 0, 65664);
|
||||
make_way ('822.8 -265.4 -162.0', '51 70 0', 0, 0);
|
||||
make_way ('1000.0 -29.9 -162.0', '71 69 122', 0, 0);
|
||||
make_way ('827.2 198.1 -162.0', '51 70 0', 0, 0);
|
||||
make_way ('1970.0 -31.5 -146.0', '123 78 73', 0, 0);
|
||||
make_way ('1982.6 197.3 -66.0', '72 74 0', 0, 0);
|
||||
make_way ('1964.1 437.3 -66.0', '73 75 76', 0, 0);
|
||||
make_way ('1544.8 491.8 -66.0', '74 76 0', 0, 0);
|
||||
make_way ('1693.0 400.0 -66.0', '75 74 77', 0, 256);
|
||||
make_way ('1695.4 362.0 -42.0', '132 131 0', 0, 0);
|
||||
make_way ('1963.1 -436.8 -2.0', '72 79 0', 0, 0);
|
||||
make_way ('1380.4 -427.4 -2.0', '78 102 80', 0, 0);
|
||||
make_way ('1186.5 -681.2 -2.0', '81 79 121', 0, 0);
|
||||
make_way ('1322.4 -745.5 -2.0', '82 80 0', 0, 0);
|
||||
make_way ('1461.8 -756.2 -2.0', '85 83 81', 0, 0);
|
||||
make_way ('1432.7 -944.0 -2.0', '82 84 0', 0, 0);
|
||||
make_way ('1248.5 -926.6 -2.0', '83 101 0', 0, 2);
|
||||
make_way ('1707.9 -715.7 -2.0', '86 82 0', 0, 0);
|
||||
make_way ('1821.0 -850.6 -2.0', '87 85 0', 0, 0);
|
||||
make_way ('1531.5 -899.7 110.0', '88 86 82', 85, 0);
|
||||
make_way ('1125.5 -896.2 110.0', '89 87 0', 0, 0);
|
||||
make_way ('986.5 -799.6 110.0', '90 88 80', 121, 0);
|
||||
make_way ('811.1 -657.7 110.0', '91 89 0', 0, 0);
|
||||
make_way ('658.1 -638.4 110.0', '92 90 0', 0, 0);
|
||||
make_way ('656.0 -356.4 78.0', '93 91 0', 0, 0);
|
||||
make_way ('824.9 -256.7 78.0', '94 92 51', 0, 0);
|
||||
make_way ('952.1 -32.8 78.0', '95 93 0', 0, 0);
|
||||
make_way ('817.3 175.9 78.0', '96 94 51', 0, 0);
|
||||
make_way ('633.2 323.0 78.0', '97 95 0', 0, 0);
|
||||
make_way ('631.7 415.3 78.0', '98 96 0', 0, 0);
|
||||
make_way ('822.9 444.2 78.0', '99 101 97', 0, 0);
|
||||
make_way ('1111.5 624.0 78.0', '101 100 98', 0, 256);
|
||||
make_way ('1114.6 651.3 102.0', '111 0 0', 0, 768);
|
||||
make_way ('1338.2 383.4 78.0', '102 99 98', 0, 0);
|
||||
make_way ('1366.0 -48.8 -2.0', '79 101 123', 122, 0);
|
||||
make_way ('1355.8 65.9 -370.0', '128 125 132', 104, 65600);
|
||||
make_way ('1362.6 635.0 -334.0', '103 135 0', 0, 65792);
|
||||
make_way ('1366.7 875.6 -274.0', '135 111 0', 0, 0);
|
||||
make_way ('841.8 1105.2 -242.0', '111 112 107', 0, 0);
|
||||
make_way ('1439.7 1113.7 -213.0', '106 108 0', 0, 0);
|
||||
make_way ('1871.4 990.6 -191.0', '107 109 0', 0, 0);
|
||||
make_way ('1851.0 655.5 -158.0', '108 110 0', 0, 0);
|
||||
make_way ('1542.3 802.5 -274.0', '105 104 0', 0, 0);
|
||||
make_way ('1074.9 805.1 -274.0', '105 112 106', 135, 0);
|
||||
make_way ('703.5 681.7 -242.0', '111 106 113', 0, 1024);
|
||||
make_way ('608.0 681.2 -82.0', '114 0 0', 0, 0);
|
||||
make_way ('612.4 789.1 -82.0', '115 111 0', 0, 1024);
|
||||
make_way ('614.1 858.3 46.0', '116 0 0', 0, 0);
|
||||
make_way ('618.9 1020.4 46.0', '115 117 0', 0, 0);
|
||||
make_way ('539.7 1025.0 62.0', '116 118 0', 0, 0);
|
||||
make_way ('516.6 923.8 62.0', '117 119 0', 0, 1024);
|
||||
make_way ('511.4 848.0 238.0', '120 0 0', 0, 0);
|
||||
make_way ('504.8 654.8 238.0', '119 14 0', 0, 0);
|
||||
make_way ('1112.4 -706.8 -2.0', '89 80 0', 0, 4096);
|
||||
make_way ('1124.4 -31.4 -146.0', '138 70 124', 126, 0);
|
||||
make_way ('1654.0 -38.6 -146.0', '137 72 131', 129, 0);
|
||||
make_way ('1160.0 78.5 -147.2', '125 122 0', 0, 512);
|
||||
make_way ('1137.3 45.9 -370.0', '124 103 127', 0, 65536);
|
||||
make_way ('1161.1 -144.4 -148.3', '122 127 0', 0, 66048);
|
||||
make_way ('1159.7 -167.3 -370.0', '126 125 128', 134, 65536);
|
||||
make_way ('1468.4 -211.2 -370.0', '129 103 133', 130, 65536);
|
||||
make_way ('1654.8 -127.0 -162.2', '123 128 134', 0, 65600);
|
||||
make_way ('1798.0 -355.0 -370.0', '128 133 0', 0, 65536);
|
||||
make_way ('1660.2 51.5 -152.0', '132 123 0', 0, 64);
|
||||
make_way ('1657.1 71.4 -370.0', '103 131 133', 0, 65536);
|
||||
make_way ('1621.6 -110.8 -370.0', '128 132 130', 0, 65536);
|
||||
make_way ('1344.8 -141.7 -370.0', '127 103 128', 129, 65536);
|
||||
make_way ('1368.7 785.3 -271.1', '105 104 0', 0, 0);
|
||||
make_way ('1365.6 -34.1 -146.0', '138 137 0', 0, 0);
|
||||
make_way ('1536.2 -35.6 -146.0', '136 123 0', 0, 0);
|
||||
make_way ('1197.9 -32.8 -146.0', '122 136 0', 0, 0);
|
||||
make_way ('1537.0 8.8 -146.0', '123 102 0', 0, 4096);
|
||||
};
|
||||
|
|
|
@ -4,47 +4,48 @@ wayedit.txt that comes with FrikBot */
|
|||
|
||||
#include "libfrikbot.h"
|
||||
|
||||
void() map_dm4 =
|
||||
void ()
|
||||
map_dm4 =
|
||||
{
|
||||
make_way('-114.0 529.9 -274.0', '0 38 0', 0, 128);
|
||||
make_way('-21.9 -216.6 -274.0', '0 33 37', 0, 128);
|
||||
make_way('344.2 -524.5 -82.0', '4 15 14', 36, 128);
|
||||
make_way('220.5 -432.0 -82.0', '3 0 0', 0, 160);
|
||||
make_way('362.8 -237.4 -274.0', '0 6 7', 37, 128);
|
||||
make_way('362.8 -4.9 -274.0', '5 0 0', 0, 128);
|
||||
make_way('605.3 -238.8 -274.0', '8 5 0', 0, 128);
|
||||
make_way('614.0 49.8 -274.0', '9 7 0', 0, 1);
|
||||
make_way('312.0 -923.0 46.0', '10 16 0', 0, 0);
|
||||
make_way('326.1 -1067.7 46.0', '11 9 0', 0, 0);
|
||||
make_way('329.8 -1219.7 -2.0', '12 10 13', 0, 0);
|
||||
make_way('113.8 -1191.1 -82.0', '13 11 14', 0, 0);
|
||||
make_way(' 89.9 -980.1 -82.0', '14 12 36', 0, 0);
|
||||
make_way('326.0 -896.1 -82.0', '3 13 12', 36, 0);
|
||||
make_way('553.1 -287.3 -82.0', '30 32 41', 3, 128);
|
||||
make_way('355.7 -527.4 46.0', '17 26 9', 0, 128);
|
||||
make_way('518.1 -475.3 46.0', '18 16 41', 0, 128);
|
||||
make_way('603.5 -188.0 46.0', '19 17 32', 0, 128);
|
||||
make_way('847.2 -182.0 46.0', '20 18 0', 0, 0);
|
||||
make_way('855.5 -554.8 46.0', '21 22 19', 0, 0);
|
||||
make_way('1092.6 -573.4 46.0', '20 0 0', 0, 0);
|
||||
make_way('1007.5 -432.0 -82.0', '23 39 0', 0, 0);
|
||||
make_way('777.1 -458.1 -82.0', '24 0 0', 0, 0);
|
||||
make_way('772.6 -642.4 -138.7', '25 23 0', 0, 0);
|
||||
make_way('773.9 -853.5 -210.0', '6 24 0', 0, 1);
|
||||
make_way('112.0 -486.9 46.0', '27 16 0', 0, 128);
|
||||
make_way('136.7 -272.5 -34.0', '40 28 26', 0, 128);
|
||||
make_way('-106.0 -235.8 -50.0', '29 27 0', 0, 0);
|
||||
make_way('-124.8 -568.3 -50.0', '19 28 0', 0, 1);
|
||||
make_way('627.7 -426.3 -98.0', '7 15 32', 0, 1);
|
||||
make_way('224.0 81.0 -82.0', '37 0 0', 0, 0);
|
||||
make_way('506.2 -96.8 -82.0', '15 30 6', 0, 128);
|
||||
make_way('-70.0 78.4 -274.0', '34 2 0', 38, 128);
|
||||
make_way(' 88.6 71.9 -274.0', '33 0 0', 0, 160);
|
||||
make_way('112.0 -176.0 -415.1', '0 0 0', 0, 0);
|
||||
make_way('337.6 -687.8 -82.0', '14 3 13', 0, 0);
|
||||
make_way('159.2 -250.3 -274.0', '5 2 0', 0, 128);
|
||||
make_way('-77.0 287.6 -274.0', '33 1 0', 0, 160);
|
||||
make_way('964.6 -623.9 -82.0', '0 24 22', 0, 0);
|
||||
make_way('150.1 -191.5 -50.0', '31 0 0', 0, 384);
|
||||
make_way('502.7 -271.1 -82.0', '15 0 0', 0, 0);
|
||||
make_way ('-114.0 529.9 -274.0', '0 38 0', 0, 128);
|
||||
make_way ('-21.9 -216.6 -274.0', '0 33 37', 0, 128);
|
||||
make_way ('344.2 -524.5 -82.0', '4 15 14', 36, 128);
|
||||
make_way ('220.5 -432.0 -82.0', '3 0 0', 0, 160);
|
||||
make_way ('362.8 -237.4 -274.0', '0 6 7', 37, 128);
|
||||
make_way ('362.8 -4.9 -274.0', '5 0 0', 0, 128);
|
||||
make_way ('605.3 -238.8 -274.0', '8 5 0', 0, 128);
|
||||
make_way ('614.0 49.8 -274.0', '9 7 0', 0, 1);
|
||||
make_way ('312.0 -923.0 46.0', '10 16 0', 0, 0);
|
||||
make_way ('326.1 -1067.7 46.0', '11 9 0', 0, 0);
|
||||
make_way ('329.8 -1219.7 -2.0', '12 10 13', 0, 0);
|
||||
make_way ('113.8 -1191.1 -82.0', '13 11 14', 0, 0);
|
||||
make_way (' 89.9 -980.1 -82.0', '14 12 36', 0, 0);
|
||||
make_way ('326.0 -896.1 -82.0', '3 13 12', 36, 0);
|
||||
make_way ('553.1 -287.3 -82.0', '30 32 41', 3, 128);
|
||||
make_way ('355.7 -527.4 46.0', '17 26 9', 0, 128);
|
||||
make_way ('518.1 -475.3 46.0', '18 16 41', 0, 128);
|
||||
make_way ('603.5 -188.0 46.0', '19 17 32', 0, 128);
|
||||
make_way ('847.2 -182.0 46.0', '20 18 0', 0, 0);
|
||||
make_way ('855.5 -554.8 46.0', '21 22 19', 0, 0);
|
||||
make_way ('1092.6 -573.4 46.0', '20 0 0', 0, 0);
|
||||
make_way ('1007.5 -432.0 -82.0', '23 39 0', 0, 0);
|
||||
make_way ('777.1 -458.1 -82.0', '24 0 0', 0, 0);
|
||||
make_way ('772.6 -642.4 -138.7', '25 23 0', 0, 0);
|
||||
make_way ('773.9 -853.5 -210.0', '6 24 0', 0, 1);
|
||||
make_way ('112.0 -486.9 46.0', '27 16 0', 0, 128);
|
||||
make_way ('136.7 -272.5 -34.0', '40 28 26', 0, 128);
|
||||
make_way ('-106.0 -235.8 -50.0', '29 27 0', 0, 0);
|
||||
make_way ('-124.8 -568.3 -50.0', '19 28 0', 0, 1);
|
||||
make_way ('627.7 -426.3 -98.0', '7 15 32', 0, 1);
|
||||
make_way ('224.0 81.0 -82.0', '37 0 0', 0, 0);
|
||||
make_way ('506.2 -96.8 -82.0', '15 30 6', 0, 128);
|
||||
make_way ('-70.0 78.4 -274.0', '34 2 0', 38, 128);
|
||||
make_way (' 88.6 71.9 -274.0', '33 0 0', 0, 160);
|
||||
make_way ('112.0 -176.0 -415.1', '0 0 0', 0, 0);
|
||||
make_way ('337.6 -687.8 -82.0', '14 3 13', 0, 0);
|
||||
make_way ('159.2 -250.3 -274.0', '5 2 0', 0, 128);
|
||||
make_way ('-77.0 287.6 -274.0', '33 1 0', 0, 160);
|
||||
make_way ('964.6 -623.9 -82.0', '0 24 22', 0, 0);
|
||||
make_way ('150.1 -191.5 -50.0', '31 0 0', 0, 384);
|
||||
make_way ('502.7 -271.1 -82.0', '15 0 0', 0, 0);
|
||||
};
|
||||
|
|
|
@ -5,52 +5,53 @@ readme.html that comes with FrikBot */
|
|||
#include "libfrikbot.h"
|
||||
// Ways by Electro
|
||||
|
||||
void() map_dm5 =
|
||||
void ()
|
||||
map_dm5 =
|
||||
{
|
||||
make_way('90.2 -380.0 62.0', '2 11 0', 0, 0);
|
||||
make_way('-88.5 -373.4 62.0', '3 1 28', 0, 0);
|
||||
make_way('-71.1 321.2 62.0', '12 0 2', 37, 0);
|
||||
make_way('288.7 451.8 14.0', '3 5 6', 37, 0);
|
||||
make_way('500.1 370.9 14.0', '4 0 0', 0, 0);
|
||||
make_way('287.3 374.0 -10.0', '4 7 0', 0, 0);
|
||||
make_way('296.2 -97.3 -90.0', '6 8 0', 0, 0);
|
||||
make_way('657.0 -24.1 14.0', '7 45 0', 0, 0);
|
||||
make_way('280.9 -314.6 -90.0', '7 45 0', 0, 0);
|
||||
make_way('265.3 -582.0 -90.0', '9 43 0', 0, 0);
|
||||
make_way('90.5 -582.4 -90.0', '10 0 0', 0, 0);
|
||||
make_way('-72.3 511.6 62.0', '13 3 0', 0, 0);
|
||||
make_way('106.7 693.8 142.0', '14 12 0', 0, 0);
|
||||
make_way('286.6 704.6 142.0', '17 13 15', 16, 0);
|
||||
make_way('286.5 208.0 142.0', '14 36 0', 0, 32768);
|
||||
make_way('259.1 938.8 142.0', '0 39 0', 0, 0);
|
||||
make_way('450.5 686.4 142.0', '18 14 0', 0, 0);
|
||||
make_way('694.2 466.0 238.0', '19 17 0', 0, 0);
|
||||
make_way('729.0 367.2 238.0', '27 18 20', 0, 1);
|
||||
make_way('305.5 371.9 238.0', '19 21 15', 36, 0);
|
||||
make_way('-85.4 351.2 238.0', '20 22 34', 12, 0);
|
||||
make_way('-98.1 -226.8 238.0', '21 33 32', 23, 0);
|
||||
make_way('-96.1 -776.4 238.0', '24 22 38', 11, 0);
|
||||
make_way('362.9 -768.2 238.0', '23 46 35', 0, 0);
|
||||
make_way('611.0 -762.8 238.0', '26 46 0', 0, 0);
|
||||
make_way('893.3 -768.3 238.0', '31 25 27', 0, 0);
|
||||
make_way('1048.0 -769.1 238.0', '19 26 0', 0, 1);
|
||||
make_way('-105.7 -761.0 62.0', '2 29 0', 0, 0);
|
||||
make_way('309.1 -759.3 142.0', '35 28 30', 0, 0);
|
||||
make_way('338.1 -388.8 142.0', '35 9 29', 42, 0);
|
||||
make_way('889.2 -228.7 238.0', '32 26 0', 0, 0);
|
||||
make_way('320.6 -223.8 238.0', '22 31 30', 0, 0);
|
||||
make_way('-180.2 -200.8 189.9', '2 0 0', 0, 0);
|
||||
make_way('-178.1 376.2 185.4', '3 0 0', 0, 0);
|
||||
make_way('399.5 -577.5 174.0', '42 29 30', 0, 0);
|
||||
make_way('286.3 475.6 142.0', '5 37 14', 0, 0);
|
||||
make_way('96.3 482.8 14.0', '4 3 6', 0, 0);
|
||||
make_way('-168.6 -824.8 187.8', '28 0 0', 0, 0);
|
||||
make_way('288.1 1006.5 142.0', '16 14 0', 0, 32768);
|
||||
make_way('615.7 -451.0 158.0', '41 25 42', 0, 0);
|
||||
make_way('662.5 -326.1 142.0', '40 0 0', 0, 0);
|
||||
make_way('479.8 -463.0 158.0', '35 30 40', 0, 0);
|
||||
make_way('407.3 -392.4 -90.0', '44 10 0', 0, 0);
|
||||
make_way('547.8 -309.4 -90.0', '45 43 0', 0, 0);
|
||||
make_way('544.3 -52.9 -90.0', '9 8 44', 0, 0);
|
||||
make_way('488.5 -769.3 238.0', '25 24 0', 0, 0);
|
||||
make_way ('90.2 -380.0 62.0', '2 11 0', 0, 0);
|
||||
make_way ('-88.5 -373.4 62.0', '3 1 28', 0, 0);
|
||||
make_way ('-71.1 321.2 62.0', '12 0 2', 37, 0);
|
||||
make_way ('288.7 451.8 14.0', '3 5 6', 37, 0);
|
||||
make_way ('500.1 370.9 14.0', '4 0 0', 0, 0);
|
||||
make_way ('287.3 374.0 -10.0', '4 7 0', 0, 0);
|
||||
make_way ('296.2 -97.3 -90.0', '6 8 0', 0, 0);
|
||||
make_way ('657.0 -24.1 14.0', '7 45 0', 0, 0);
|
||||
make_way ('280.9 -314.6 -90.0', '7 45 0', 0, 0);
|
||||
make_way ('265.3 -582.0 -90.0', '9 43 0', 0, 0);
|
||||
make_way ('90.5 -582.4 -90.0', '10 0 0', 0, 0);
|
||||
make_way ('-72.3 511.6 62.0', '13 3 0', 0, 0);
|
||||
make_way ('106.7 693.8 142.0', '14 12 0', 0, 0);
|
||||
make_way ('286.6 704.6 142.0', '17 13 15', 16, 0);
|
||||
make_way ('286.5 208.0 142.0', '14 36 0', 0, 32768);
|
||||
make_way ('259.1 938.8 142.0', '0 39 0', 0, 0);
|
||||
make_way ('450.5 686.4 142.0', '18 14 0', 0, 0);
|
||||
make_way ('694.2 466.0 238.0', '19 17 0', 0, 0);
|
||||
make_way ('729.0 367.2 238.0', '27 18 20', 0, 1);
|
||||
make_way ('305.5 371.9 238.0', '19 21 15', 36, 0);
|
||||
make_way ('-85.4 351.2 238.0', '20 22 34', 12, 0);
|
||||
make_way ('-98.1 -226.8 238.0', '21 33 32', 23, 0);
|
||||
make_way ('-96.1 -776.4 238.0', '24 22 38', 11, 0);
|
||||
make_way ('362.9 -768.2 238.0', '23 46 35', 0, 0);
|
||||
make_way ('611.0 -762.8 238.0', '26 46 0', 0, 0);
|
||||
make_way ('893.3 -768.3 238.0', '31 25 27', 0, 0);
|
||||
make_way ('1048.0 -769.1 238.0', '19 26 0', 0, 1);
|
||||
make_way ('-105.7 -761.0 62.0', '2 29 0', 0, 0);
|
||||
make_way ('309.1 -759.3 142.0', '35 28 30', 0, 0);
|
||||
make_way ('338.1 -388.8 142.0', '35 9 29', 42, 0);
|
||||
make_way ('889.2 -228.7 238.0', '32 26 0', 0, 0);
|
||||
make_way ('320.6 -223.8 238.0', '22 31 30', 0, 0);
|
||||
make_way ('-180.2 -200.8 189.9', '2 0 0', 0, 0);
|
||||
make_way ('-178.1 376.2 185.4', '3 0 0', 0, 0);
|
||||
make_way ('399.5 -577.5 174.0', '42 29 30', 0, 0);
|
||||
make_way ('286.3 475.6 142.0', '5 37 14', 0, 0);
|
||||
make_way ('96.3 482.8 14.0', '4 3 6', 0, 0);
|
||||
make_way ('-168.6 -824.8 187.8', '28 0 0', 0, 0);
|
||||
make_way ('288.1 1006.5 142.0', '16 14 0', 0, 32768);
|
||||
make_way ('615.7 -451.0 158.0', '41 25 42', 0, 0);
|
||||
make_way ('662.5 -326.1 142.0', '40 0 0', 0, 0);
|
||||
make_way ('479.8 -463.0 158.0', '35 30 40', 0, 0);
|
||||
make_way ('407.3 -392.4 -90.0', '44 10 0', 0, 0);
|
||||
make_way ('547.8 -309.4 -90.0', '45 43 0', 0, 0);
|
||||
make_way ('544.3 -52.9 -90.0', '9 8 44', 0, 0);
|
||||
make_way ('488.5 -769.3 238.0', '25 24 0', 0, 0);
|
||||
};
|
||||
|
|
125
fbxa/map_dm6.qc
125
fbxa/map_dm6.qc
|
@ -5,67 +5,68 @@ readme.html that comes with FrikBot */
|
|||
#include "libfrikbot.h"
|
||||
// Ways by Electro
|
||||
|
||||
void() map_dm6 =
|
||||
void ()
|
||||
map_dm6 =
|
||||
{
|
||||
make_way('760.0 -1080.0 278.0', '2 8 51', 0, 0);
|
||||
make_way('830.4 -879.6 278.0', '1 3 0', 0, 0);
|
||||
make_way('994.1 -851.7 278.0', '2 4 0', 0, 0);
|
||||
make_way('1212.9 -877.9 278.0', '3 5 0', 0, 0);
|
||||
make_way('1301.3 -1089.0 278.0', '4 6 0', 10, 0);
|
||||
make_way('1199.4 -1302.0 278.0', '5 7 0', 0, 0);
|
||||
make_way('1040.4 -1348.9 278.0', '6 8 0', 0, 0);
|
||||
make_way('855.7 -1312.7 278.0', '7 1 0', 0, 0);
|
||||
make_way('1033.2 -1465.7 278.0', '7 0 0', 0, 0);
|
||||
make_way('1519.3 -1087.3 231.4', '11 5 0', 0, 0);
|
||||
make_way('1758.3 -1065.6 190.0', '10 12 0', 0, 0);
|
||||
make_way('1763.4 -907.5 190.0', '11 13 58', 0, 0);
|
||||
make_way('1763.9 -706.4 190.0', '12 14 57', 0, 0);
|
||||
make_way('1765.6 -418.0 190.0', '13 18 15', 23, 0);
|
||||
make_way('1882.8 -419.8 190.0', '14 16 0', 0, 0);
|
||||
make_way('1890.5 -157.4 190.0', '15 17 0', 0, 0);
|
||||
make_way('1628.3 -158.2 190.0', '16 18 0', 0, 0);
|
||||
make_way('1629.0 -277.9 190.0', '17 19 14', 23, 0);
|
||||
make_way('1317.8 -318.6 190.0', '18 21 23', 0, 0);
|
||||
make_way('87.4 -1522.2 62.0', '43 0 0', 0, 0);
|
||||
make_way('1293.0 -554.7 190.0', '19 22 0', 0, 0);
|
||||
make_way('1670.4 -535.4 62.0', '23 32 21', 0, 0);
|
||||
make_way('1555.7 -437.5 62.0', '22 24 56', 0, 0);
|
||||
make_way('1380.5 -428.9 62.0', '23 25 0', 0, 0);
|
||||
make_way('1032.9 -439.3 62.0', '24 26 0', 0, 0);
|
||||
make_way('1021.2 -928.0 -2.0', '27 33 25', 0, 0);
|
||||
make_way('852.4 -1085.0 -22.0', '28 34 61', 26, 4);
|
||||
make_way('831.8 -1085.0 -258.0', '29 0 0', 0, 0);
|
||||
make_way('512.6 -1091.4 -258.0', '28 33 0', 0, 2);
|
||||
make_way('1379.5 -1096.0 14.0', '33 31 0', 0, 0);
|
||||
make_way('1699.0 -1086.0 62.0', '30 32 0', 0, 0);
|
||||
make_way('1720.4 -824.1 62.0', '31 22 0', 0, 0);
|
||||
make_way('1158.1 -1096.0 -18.0', '30 34 26', 37, 8);
|
||||
make_way('1019.9 -1256.6 -2.0', '33 35 27', 0, 0);
|
||||
make_way('1020.0 -1664.8 62.0', '34 36 0', 0, 0);
|
||||
make_way('684.6 -1661.8 62.0', '35 37 0', 0, 0);
|
||||
make_way('505.0 -1663.7 62.0', '52 61 42', 36, 0);
|
||||
make_way('275.2 -1087.1 134.0', '59 41 0', 0, 4);
|
||||
make_way('422.0 -1086.3 150.0', '38 40 0', 0, 0);
|
||||
make_way('682.5 -1090.1 89.9', '27 39 34', 26, 0);
|
||||
make_way('195.9 -961.6 150.0', '38 37 59', 0, 2);
|
||||
make_way('246.5 -1653.8 62.0', '37 43 61', 60, 0);
|
||||
make_way('87.1 -1612.3 62.0', '42 44 60', 0, 0);
|
||||
make_way('64.8 -1782.9 62.0', '60 43 45', 55, 0);
|
||||
make_way('66.4 -1997.2 110.0', '44 46 0', 0, 0);
|
||||
make_way('261.6 -1998.1 142.0', '45 47 0', 0, 0);
|
||||
make_way('446.0 -1999.7 190.0', '46 48 0', 0, 0);
|
||||
make_way('452.0 -1681.0 254.0', '47 49 42', 61, 0);
|
||||
make_way('450.4 -1576.2 278.0', '48 50 0', 0, 0);
|
||||
make_way('446.6 -1364.6 278.0', '49 51 0', 0, 0);
|
||||
make_way('456.1 -1092.5 278.0', '50 1 0', 0, 0);
|
||||
make_way('512.0 -1901.4 62.0', '37 53 55', 0, 0);
|
||||
make_way('506.6 -2037.3 62.0', '52 54 0', 0, 0);
|
||||
make_way('354.8 -2040.3 62.0', '53 55 61', 0, 0);
|
||||
make_way('216.7 -1863.2 78.0', '44 54 52', 0, 0);
|
||||
make_way('1613.3 -426.0 62.0', '14 18 0', 0, 4096);
|
||||
make_way('1648.0 -701.8 136.9', '32 22 0', 0, 0);
|
||||
make_way('1648.0 -911.3 128.4', '31 32 0', 0, 0);
|
||||
make_way('194.1 -1234.7 134.0', '38 41 0', 0, 0);
|
||||
make_way('150.9 -1784.8 70.0', '44 43 55', 41, 8);
|
||||
make_way('323.0 -1785.1 78.0', '42 54 37', 41, 8);
|
||||
make_way ('760.0 -1080.0 278.0', '2 8 51', 0, 0);
|
||||
make_way ('830.4 -879.6 278.0', '1 3 0', 0, 0);
|
||||
make_way ('994.1 -851.7 278.0', '2 4 0', 0, 0);
|
||||
make_way ('1212.9 -877.9 278.0', '3 5 0', 0, 0);
|
||||
make_way ('1301.3 -1089.0 278.0', '4 6 0', 10, 0);
|
||||
make_way ('1199.4 -1302.0 278.0', '5 7 0', 0, 0);
|
||||
make_way ('1040.4 -1348.9 278.0', '6 8 0', 0, 0);
|
||||
make_way ('855.7 -1312.7 278.0', '7 1 0', 0, 0);
|
||||
make_way ('1033.2 -1465.7 278.0', '7 0 0', 0, 0);
|
||||
make_way ('1519.3 -1087.3 231.4', '11 5 0', 0, 0);
|
||||
make_way ('1758.3 -1065.6 190.0', '10 12 0', 0, 0);
|
||||
make_way ('1763.4 -907.5 190.0', '11 13 58', 0, 0);
|
||||
make_way ('1763.9 -706.4 190.0', '12 14 57', 0, 0);
|
||||
make_way ('1765.6 -418.0 190.0', '13 18 15', 23, 0);
|
||||
make_way ('1882.8 -419.8 190.0', '14 16 0', 0, 0);
|
||||
make_way ('1890.5 -157.4 190.0', '15 17 0', 0, 0);
|
||||
make_way ('1628.3 -158.2 190.0', '16 18 0', 0, 0);
|
||||
make_way ('1629.0 -277.9 190.0', '17 19 14', 23, 0);
|
||||
make_way ('1317.8 -318.6 190.0', '18 21 23', 0, 0);
|
||||
make_way ('87.4 -1522.2 62.0', '43 0 0', 0, 0);
|
||||
make_way ('1293.0 -554.7 190.0', '19 22 0', 0, 0);
|
||||
make_way ('1670.4 -535.4 62.0', '23 32 21', 0, 0);
|
||||
make_way ('1555.7 -437.5 62.0', '22 24 56', 0, 0);
|
||||
make_way ('1380.5 -428.9 62.0', '23 25 0', 0, 0);
|
||||
make_way ('1032.9 -439.3 62.0', '24 26 0', 0, 0);
|
||||
make_way ('1021.2 -928.0 -2.0', '27 33 25', 0, 0);
|
||||
make_way ('852.4 -1085.0 -22.0', '28 34 61', 26, 4);
|
||||
make_way ('831.8 -1085.0 -258.0', '29 0 0', 0, 0);
|
||||
make_way ('512.6 -1091.4 -258.0', '28 33 0', 0, 2);
|
||||
make_way ('1379.5 -1096.0 14.0', '33 31 0', 0, 0);
|
||||
make_way ('1699.0 -1086.0 62.0', '30 32 0', 0, 0);
|
||||
make_way ('1720.4 -824.1 62.0', '31 22 0', 0, 0);
|
||||
make_way ('1158.1 -1096.0 -18.0', '30 34 26', 37, 8);
|
||||
make_way ('1019.9 -1256.6 -2.0', '33 35 27', 0, 0);
|
||||
make_way ('1020.0 -1664.8 62.0', '34 36 0', 0, 0);
|
||||
make_way ('684.6 -1661.8 62.0', '35 37 0', 0, 0);
|
||||
make_way ('505.0 -1663.7 62.0', '52 61 42', 36, 0);
|
||||
make_way ('275.2 -1087.1 134.0', '59 41 0', 0, 4);
|
||||
make_way ('422.0 -1086.3 150.0', '38 40 0', 0, 0);
|
||||
make_way ('682.5 -1090.1 89.9', '27 39 34', 26, 0);
|
||||
make_way ('195.9 -961.6 150.0', '38 37 59', 0, 2);
|
||||
make_way ('246.5 -1653.8 62.0', '37 43 61', 60, 0);
|
||||
make_way ('87.1 -1612.3 62.0', '42 44 60', 0, 0);
|
||||
make_way ('64.8 -1782.9 62.0', '60 43 45', 55, 0);
|
||||
make_way ('66.4 -1997.2 110.0', '44 46 0', 0, 0);
|
||||
make_way ('261.6 -1998.1 142.0', '45 47 0', 0, 0);
|
||||
make_way ('446.0 -1999.7 190.0', '46 48 0', 0, 0);
|
||||
make_way ('452.0 -1681.0 254.0', '47 49 42', 61, 0);
|
||||
make_way ('450.4 -1576.2 278.0', '48 50 0', 0, 0);
|
||||
make_way ('446.6 -1364.6 278.0', '49 51 0', 0, 0);
|
||||
make_way ('456.1 -1092.5 278.0', '50 1 0', 0, 0);
|
||||
make_way ('512.0 -1901.4 62.0', '37 53 55', 0, 0);
|
||||
make_way ('506.6 -2037.3 62.0', '52 54 0', 0, 0);
|
||||
make_way ('354.8 -2040.3 62.0', '53 55 61', 0, 0);
|
||||
make_way ('216.7 -1863.2 78.0', '44 54 52', 0, 0);
|
||||
make_way ('1613.3 -426.0 62.0', '14 18 0', 0, 4096);
|
||||
make_way ('1648.0 -701.8 136.9', '32 22 0', 0, 0);
|
||||
make_way ('1648.0 -911.3 128.4', '31 32 0', 0, 0);
|
||||
make_way ('194.1 -1234.7 134.0', '38 41 0', 0, 0);
|
||||
make_way ('150.9 -1784.8 70.0', '44 43 55', 41, 8);
|
||||
make_way ('323.0 -1785.1 78.0', '42 54 37', 41, 8);
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue