paritally working with the new server bot support (half borked, though)

This commit is contained in:
Bill Currie 2003-03-04 07:29:42 +00:00
parent 4ab3a55325
commit e260183d85
3 changed files with 70 additions and 267 deletions

View file

@ -179,9 +179,10 @@ void() bot_dodge_stuff =
} }
else else
{ {
foe = player_head; local integer i = 0;
while(foe) for (i = 0; i < 32; i++) {
{ if (!(foe = players[i]))
continue;
if(foe != self) if(foe != self)
{ {
if (foe.modelindex != 0) if (foe.modelindex != 0)

View file

@ -63,11 +63,6 @@ frikbot/bot_misc.qc
frikbot/bot_phys.qc frikbot/bot_phys.qc
frikbot/bot_move.qc frikbot/bot_move.qc
-------------------------------------- --------------------------------------
* Comment out the following functions in defs.qc
sound, stuffcmd, sprint, aim, centerprint, setspawnparms
WriteByte, WriteChar, WriteShort, WriteLong, WriteCoord
WriteAngle, WriteString, WriteEntity
--------------------------------------
* Add this to worldspawn() in world.qc, right at the very top, before InitBodyQue(); * Add this to worldspawn() in world.qc, right at the very top, before InitBodyQue();
BotInit(); // FrikBot BotInit(); // FrikBot
-------------------------------------- --------------------------------------
@ -124,9 +119,13 @@ for all variable in the bot...
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
*/ */
entity [32] players;
entity [32] phys_objects;
// ----- entity fields --- // ----- entity fields ---
.float wallhug, keys, oldkeys, ishuman; .float wallhug, keys, oldkeys, ishuman;
.float b_frags, b_clientno, b_shirt, b_pants; .float b_frags, b_shirt, b_pants;
.integer b_clientno;
.float priority, ai_time, b_sound, missile_speed; .float priority, ai_time, b_sound, missile_speed;
.float portal_time, b_skill, switch_wallhug; .float portal_time, b_skill, switch_wallhug;
.float b_aiflags, b_num, b_chattime; .float b_aiflags, b_num, b_chattime;
@ -145,8 +144,8 @@ for all variable in the bot...
// -------globals----- // -------globals-----
float active_clients1, active_clients2; integer max_clients;
float max_clients, real_frametime; float real_frametime;
float bot_count, b_options, lasttime; float bot_count, b_options, lasttime;
float waypoint_mode, dump_mode; float waypoint_mode, dump_mode;
float waypoints, direct_route, userid; float waypoints, direct_route, userid;
@ -155,150 +154,16 @@ float sv_accelerate, sv_maxspeed, sv_stopspeed;
entity fixer; entity fixer;
entity route_table; entity route_table;
entity b_temp1, b_temp2, b_temp3; entity b_temp1, b_temp2, b_temp3;
entity player_head, player_tail, phys_head, way_head; entity way_head;
float busy_waypoints; float busy_waypoints;
float coop = 0; // hack float coop = 0; // hack
// ----------Commands--------- entity () SV_AllocClient = #0;
void(entity e, float chan, string samp, float vol, float atten) frik_sound = #8; void (entity e) SV_FreeClient = #0;
void(entity client, string s) frik_stuffcmd = #21;
void(entity client, float level, string s) frik_sprint = #24;
vector(entity e, float sped) frik_aim = #44;
void(entity client, string s) frik_centerprint = #73;
void(entity e) frik_setspawnparms = #78;
void(float to, float f) frik_WriteByte = #52;
void(float to, float f) frik_WriteChar = #53;
void(float to, float f) frik_WriteShort = #54;
void(float to, float f) frik_WriteLong = #55;
void(float to, float f) frik_WriteCoord = #56;
void(float to, float f) frik_WriteAngle = #57;
void(float to, string s) frik_WriteString = #58;
void(float to, entity s) frik_WriteEntity = #59;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
/*
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Function redclarations. These allow function
designed to work for clients (sprint, so forth)
to mainly not complain when working with a bot
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 client, string s) stuffcmd =
{
if (client.ishuman)
frik_stuffcmd(client, s);
};
void(entity e) setspawnparms =
{
if (e.ishuman)
frik_setspawnparms(e);
else
SetNewParms();
};
void(entity client, float level, string s) sprint =
{
if (client.ishuman)
frik_sprint(client, level, s);
};
void(entity client, string s) centerprint =
{
if (client.ishuman)
frik_centerprint(client, s);
};
vector(entity e, float sped) aim =
{
e.missile_speed = 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);
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);
};
void(float to, float f) WriteChar =
{
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
return;
frik_WriteChar(to, f);
};
void(float to, float f) WriteShort =
{
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
return;
frik_WriteShort(to, f);
};
void(float to, float f) WriteLong =
{
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
return;
frik_WriteLong(to, f);
};
void(float to, float f) WriteCoord =
{
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
return;
frik_WriteCoord(to, f);
};
void(float to, float f) WriteAngle =
{
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
return;
frik_WriteAngle(to, f);
};
void(float to, string s) WriteString =
{
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
return;
frik_WriteString(to, s);
};
void(float to, entity s) WriteEntity =
{
if ((to == MSG_ONE) && (msg_entity.ishuman != TRUE))
return;
frik_WriteEntity(to, s);
};
float(float clientno) ClientIsActive =
{
if(clientno > 16)
{
if(active_clients2 & ClientBitFlag(clientno - 16))
return TRUE;
else
return FALSE;
}
else
{
if(active_clients1 & ClientBitFlag(clientno))
return TRUE;
else
return FALSE;
}
};
/* /*
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@ -311,7 +176,7 @@ it just links the bot into the mod
void() ClientFixRankings = void() ClientFixRankings =
{ {
local float cno; local integer cno;
if (self.switch_wallhug > time) if (self.switch_wallhug > time)
return; return;
self.switch_wallhug = 0; self.switch_wallhug = 0;
@ -323,10 +188,10 @@ void() ClientFixRankings =
{ {
if (!b_temp2.ishuman) if (!b_temp2.ishuman)
{ {
if (ClientIsActive(cno)) if (players[cno])
UpdateClient(b_temp2); UpdateClient(b_temp2);
} }
cno = cno + 1; cno++;
b_temp2 = nextent(b_temp2); b_temp2 = nextent(b_temp2);
} }
}; };
@ -334,62 +199,14 @@ void() ClientFixRankings =
void() ClientInRankings = void() ClientInRankings =
{ {
local float cno; local float cno;
local integer cl_no = ClientNumber (self);
if (!self.phys_obj) { players[cl_no] = self;
// oh no, the server killed our data. THE BASTARD! self.b_clientno = cl_no + 1;
// ie, incoming player
local entity e;
// repair the link
if (player_head != self) {
e = player_head;
while (e) {
if (e._next == self) {
self._last = e;
e = NIL;
} else {
e = e._next;
}
}
}
if (player_tail != self) {
e = player_tail;
while (e) {
if (e._last == self) {
self._next = e;
e = NIL;
} else {
e = e._last;
}
}
}
// unlink it again
if (self._last)
self._last._next = self._next;
else if (self._next)
player_head = self._next;
if (self._next)
self._next._last = self._last;
else if (self._last)
player_tail = self._last;
self._last = self._next = NIL;
}
if (player_head)
player_head._last = self;
self._next = player_head;
player_head = self;
if (!player_tail)
player_tail = self;
userid = userid + 1; userid = userid + 1;
self.b_userid = userid; self.b_userid = userid;
if (!self.phys_obj) self.phys_obj = phys_objects[cl_no];
{
b_temp2 = phys_head;
while (b_temp2 != NIL && b_temp2.owner != self)
b_temp2 = b_temp2._next;
self.phys_obj = b_temp2;
}
if (self.ishuman == 2) if (self.ishuman == 2)
{ {
@ -398,11 +215,7 @@ void() ClientInRankings =
} }
cno = self.colormap - 1; cno = self.colormap - 1;
BotInvalidClientNo (cno); BotInvalidClientNo (cno);
if(cno > 16) self.b_clientno = (integer) cno;
active_clients2 = active_clients2 | ClientBitFlag(cno - 16);
else
active_clients1 = active_clients1 | ClientBitFlag(cno);
self.b_clientno = cno;
self.ishuman = TRUE; self.ishuman = TRUE;
self.switch_wallhug = time + 1; self.switch_wallhug = time + 1;
}; };
@ -410,18 +223,8 @@ void() ClientInRankings =
void() ClientDisconnected = void() ClientDisconnected =
{ {
if (player_head == self) local integer cl_no = ClientNumber (self);
player_head = self._next; players[cl_no] = NIL;
if (player_tail == self)
player_tail = self._last;
if (self._next)
self._next._last = self._last;
if (self._last)
self._last._next = self._next;
if(self.b_clientno > 16)
active_clients2 = active_clients2 - (active_clients2 & ClientBitFlag(self.b_clientno - 16));
else
active_clients1 = active_clients1 - (active_clients1 & ClientBitFlag(self.b_clientno));
}; };
/* /*
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@ -453,7 +256,7 @@ float () BotPreFrame =
if (!self.ishuman) if (!self.ishuman)
{ {
WriteByte(2, 14); WriteByte(2, 14);
WriteByte(2, self.b_clientno); WriteByte(2, (float)self.b_clientno);
WriteShort(2, self.frags); WriteShort(2, self.frags);
} }
} }
@ -517,8 +320,8 @@ BotInit
void() BotInit = void() BotInit =
{ {
local entity ent, fisent; local entity ent;
local float numents = 0; local integer numents = 0;
// spawn entities for the physics // spawn entities for the physics
ent = nextent(NIL); ent = nextent(NIL);
@ -531,19 +334,13 @@ void() BotInit =
} }
ent = nextent(NIL); ent = nextent(NIL);
fisent = NIL;
while (numents < max_clients) while (numents < max_clients)
{ {
phys_head = spawn(); phys_objects[numents] = spawn();
if (fisent) phys_objects[numents].classname = "phys_obj";
fisent._next = phys_head; phys_objects[numents].owner = ent;
phys_head._last = fisent; numents++;
fisent = phys_head;
ent.phys_obj = phys_head;
phys_head.classname = "phys_obj";
phys_head.owner = ent;
numents = numents + 1;
ent = nextent(ent); ent = nextent(ent);
} }
bot_map_load(); bot_map_load();
@ -564,16 +361,16 @@ signs on to the server.
void(entity who) UpdateClient = void(entity who) UpdateClient =
{ {
WriteByte(2, 14 ); WriteByte(2, 14 );
WriteByte(2, who.b_clientno); WriteByte(2, (float)who.b_clientno);
WriteShort(2, who.frags); WriteShort(2, who.frags);
WriteByte(2, 36); WriteByte(2, 36);
WriteByte(2, who.b_clientno); WriteByte(2, (float)who.b_clientno);
WriteShort(2, 100 * (3 - who.b_skill)); WriteShort(2, 100 * (3 - who.b_skill));
WriteByte(2, 37); // update entertime WriteByte(2, 37); // update entertime
WriteByte(2, who.b_clientno); // client number WriteByte(2, (float)who.b_clientno); // client number
WriteLong(2, time - who.b_entertime); // client entertime WriteLong(2, time - who.b_entertime); // client entertime
WriteByte(2, 40 ); // update userinfo WriteByte(2, 40 ); // update userinfo
WriteByte(2, who.b_clientno); // client number WriteByte(2, (float)who.b_clientno); // client number
WriteLong(2, who.b_userid); // client userid WriteLong(2, who.b_userid); // client userid
WriteByte(2, 92); // '\' WriteByte(2, 92); // '\'
WriteByte(2, 98); // 'b' WriteByte(2, 98); // 'b'
@ -642,7 +439,7 @@ void(entity who) UpdateClient =
WriteString( 2, who.netname); WriteString( 2, who.netname);
}; };
float(float clientno) ClientBitFlag = float(integer clientno) ClientBitFlag =
{ {
local float bitflag; local float bitflag;
bitflag = 1; bitflag = 1;
@ -654,16 +451,16 @@ float(float clientno) ClientBitFlag =
return bitflag; return bitflag;
}; };
float() ClientNextAvailable = integer() ClientNextAvailable =
{ {
local float clientno; local integer clientno;
// I want to do this top down, but QW won't let me // I want to do this top down, but QW won't let me
clientno = 0; clientno = 0;
while(clientno < max_clients) while(clientno < max_clients)
{ {
clientno = clientno + 1; clientno = clientno + 1;
if(!ClientIsActive(clientno)) //FIXME if(!ClientIsActive(clientno))
return clientno; return clientno;
} }
return -1; return -1;
@ -692,27 +489,36 @@ entity(float num) GetClientEntity =
return upsy; return upsy;
}; };
integer (entity cl) ClientNumber =
{
local entity e = NIL;
local integer f = -1;
do {
f++;
e = nextent (e);
} while (e != cl);
return f;
};
void(float whatbot, float whatskill) BotConnect = void(float whatbot, float whatskill) BotConnect =
{ {
local float f; local integer f;
local entity uself; local entity uself;
f = ClientNextAvailable(); //f = ClientNextAvailable();
uself = self; uself = self;
if(f == -1) 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; return;
} }
if(f > 16) bot_count++;
active_clients2 = active_clients2 | ClientBitFlag(f - 16);
else
active_clients1 = active_clients1 | ClientBitFlag(f);
bot_count = bot_count + 1;
self = GetClientEntity(f);
bot_start_topic(1); bot_start_topic(1);
f = ClientNumber (self) + 1;
self.b_clientno = f; self.b_clientno = f;
self.colormap = f + 1; self.colormap = (float) f + 1;
if (whatbot) if (whatbot)
self.netname = BotName(whatbot); self.netname = BotName(whatbot);
else else
@ -761,10 +567,6 @@ void(entity bot) BotDisconnect =
self.b_shirt = 0; self.b_shirt = 0;
self.ammo_shells = self.ammo_nails = self.ammo_rockets = self.ammo_cells = 0; self.ammo_shells = self.ammo_nails = self.ammo_rockets = self.ammo_cells = 0;
UpdateClient(self); UpdateClient(self);
if(self.b_clientno > 16)
active_clients2 = active_clients2 - (active_clients2 & ClientBitFlag(self.b_clientno - 16));
else
active_clients1 = active_clients1 | (active_clients1 & ClientBitFlag(self.b_clientno));
self.b_clientno = -1; self.b_clientno = -1;
} }
self = uself; self = uself;
@ -789,10 +591,6 @@ void(float clientno) BotInvalidClientNo =
{ {
bot.b_clientno = -1; bot.b_clientno = -1;
BotDisconnect(bot); BotDisconnect(bot);
if(self.b_clientno > 16)
active_clients2 = active_clients2 | ClientBitFlag(self.b_clientno - 16);
else
active_clients1 = active_clients1 | ClientBitFlag(self.b_clientno);
//BotConnect(bot.b_num, bot.b_skill); //BotConnect(bot.b_num, bot.b_skill);
return; return;
} }
@ -801,7 +599,7 @@ void(float clientno) BotInvalidClientNo =
void() BotFrame = void() BotFrame =
{ {
local float num; local integer num;
local string h; local string h;
h = infokey(NIL, "bot_options"); h = infokey(NIL, "bot_options");

View file

@ -3,7 +3,9 @@
// ----- entity fields --- // ----- entity fields ---
@extern .float wallhug, keys, oldkeys, ishuman; @extern .float wallhug, keys, oldkeys, ishuman;
@extern .float b_frags, b_clientno, b_shirt, b_pants; @extern .float b_frags;
@extern .integer b_clientno;
@extern .float b_shirt, b_pants;
@extern .float priority, ai_time, b_sound, missile_speed; @extern .float priority, ai_time, b_sound, missile_speed;
@extern .float portal_time, b_skill, switch_wallhug; @extern .float portal_time, b_skill, switch_wallhug;
@extern .float b_aiflags, b_num, b_chattime; @extern .float b_aiflags, b_num, b_chattime;
@ -83,8 +85,9 @@
#define OPT_NOCHAT 2 #define OPT_NOCHAT 2
// -------globals----- // -------globals-----
@extern float active_clients1, active_clients2; @extern entity [32] players;
@extern float max_clients, real_frametime; @extern integer max_clients;
@extern float real_frametime;
@extern float bot_count, b_options, lasttime; @extern float bot_count, b_options, lasttime;
@extern float waypoint_mode, dump_mode; @extern float waypoint_mode, dump_mode;
@extern float waypoints, direct_route, userid; @extern float waypoints, direct_route, userid;
@ -93,7 +96,7 @@
@extern entity fixer; @extern entity fixer;
@extern entity route_table; @extern entity route_table;
@extern entity b_temp1, b_temp2, b_temp3; @extern entity b_temp1, b_temp2, b_temp3;
@extern entity player_head, player_tail, phys_head, way_head; @extern entity way_head;
@extern float busy_waypoints; @extern float busy_waypoints;
@extern float coop; @extern float coop;
@ -110,8 +113,9 @@
@extern void() bot_dodge_stuff; @extern void() bot_dodge_stuff;
// rankings // rankings
@extern float(float clientno) ClientBitFlag; @extern integer (entity e) ClientNumber;
@extern float() ClientNextAvailable; @extern float(integer clientno) ClientBitFlag;
@extern integer() ClientNextAvailable;
@extern void(float whatbot, float whatskill) BotConnect; @extern void(float whatbot, float whatskill) BotConnect;
@extern void(entity bot) BotDisconnect; @extern void(entity bot) BotDisconnect;
@extern void(float clientno) BotInvalidClientNo; @extern void(float clientno) BotInvalidClientNo;