r2424 - trunk/data/qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Mon Apr 30 16:46:00 EDT 2007
Author: div0
Date: 2007-04-30 16:46:00 -0400 (Mon, 30 Apr 2007)
New Revision: 2424
Modified:
trunk/data/qcsrc/server/bots.qc
trunk/data/qcsrc/server/havocbot_roles.qc
trunk/data/qcsrc/server/keyhunt.qc
trunk/data/qcsrc/server/keyhunt.qh
Log:
keyhunt: improved bots; fix minplayers changing bot_number
Modified: trunk/data/qcsrc/server/bots.qc
===================================================================
--- trunk/data/qcsrc/server/bots.qc 2007-04-30 18:40:03 UTC (rev 2423)
+++ trunk/data/qcsrc/server/bots.qc 2007-04-30 20:46:00 UTC (rev 2424)
@@ -2018,6 +2018,7 @@
float botframe_spawnedwaypoints;
+float botframe_nextthink;
void() bot_serverframe =
{
float realplayers, bots;
@@ -2038,17 +2039,13 @@
{
float realminplayers, minplayers;
realminplayers = cvar("minplayers");
- minplayers = bound(0, floor(realminplayers), maxclients - 1);
- if (realminplayers != minplayers)
- cvar_set("minplayers", ftos(minplayers));
+ minplayers = max(0, floor(realminplayers));
float realminbots, minbots;
realminbots = cvar("bot_number");
- minbots = bound(0, floor(realminbots), maxclients - 1);
- if (realminbots != minbots)
- cvar_set("bot_number", ftos(minbots));
+ minbots = max(0, floor(realminbots));
- bots = bound(minbots, minplayers - realplayers, maxclients);
+ bots = min(max(minbots, minplayers - realplayers), maxclients - realplayers);
}
else
{
@@ -2059,18 +2056,21 @@
bot_ignore_bots = cvar("bot_ignore_bots");
// only add one bot per frame to avoid utter chaos
- while (currentbots < bots)
+ if(time > botframe_nextthink)
{
- if (bot_spawn() == world)
+ //dprint(ftos(bots), " ? ", ftos(currentbots), "\n");
+ while (currentbots < bots)
{
- bprint("Can not add bot, server full.\n");
- cvar_set("bot_number", ftos(currentbots));
- bots = currentbots;
- break;
+ if (bot_spawn() == world)
+ {
+ bprint("Can not add bot, server full.\n");
+ botframe_nextthink = time + 10;
+ break;
+ }
}
+ while (currentbots > bots)
+ bot_removenewest();
}
- while (currentbots > bots)
- bot_removenewest();
if(botframe_spawnedwaypoints)
{
@@ -2078,7 +2078,7 @@
localcmd("quit\n");
}
- if (bots > 0 || cvar("g_waypointeditor"))
+ if (currentbots > 0 || cvar("g_waypointeditor"))
if (!botframe_spawnedwaypoints)
{
botframe_spawnedwaypoints = TRUE;
Modified: trunk/data/qcsrc/server/havocbot_roles.qc
===================================================================
--- trunk/data/qcsrc/server/havocbot_roles.qc 2007-04-30 18:40:03 UTC (rev 2423)
+++ trunk/data/qcsrc/server/havocbot_roles.qc 2007-04-30 20:46:00 UTC (rev 2424)
@@ -538,7 +538,6 @@
void() havocbot_role_kh_freelancer;
void() havocbot_role_kh_carrier =
{
- local entity head;
if (!(self.items & IT_KEY1))
{
dprint("changing role to freelancer\n");
@@ -549,26 +548,14 @@
if (self.bot_strategytime < time)
{
- float enemies_have_keys;
-
self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
navigation_goalrating_start();
- enemies_have_keys = FALSE;
- for(head = world; (head = find(head, classname, "item_kh_key")); )
- {
- if(head.owner)
- if(head.team != self.team)
- {
- enemies_have_keys = TRUE;
- break;
- }
- }
+ if(kh_Key_AllOwnedByWhichTeam() == self.team)
+ havocbot_goalrating_kh(10000, 1, 1); // bring home
+ else
+ havocbot_goalrating_kh(4000, 4000, 100); // play defensively
- if(enemies_have_keys)
- havocbot_goalrating_kh(4000, 4000, 100);
- else
- havocbot_goalrating_kh(10000, 10000, 1);
havocbot_goalrating_items(10000, self.origin, 10000);
navigation_goalrating_end();
}
@@ -596,9 +583,18 @@
if (self.bot_strategytime < time)
{
+ float key_owner_team;
self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
navigation_goalrating_start();
- havocbot_goalrating_kh(4000, 1000, 1);
+
+ key_owner_team = kh_Key_AllOwnedByWhichTeam();
+ if(key_owner_team == self.team)
+ havocbot_goalrating_kh(10000, 1, 1); // defend key carriers
+ else if(key_owner_team == -1)
+ havocbot_goalrating_kh(4000, 1000, 1); // play defensively
+ else
+ havocbot_goalrating_kh(1, 1, 10000); // ATTACK ANYWAY
+
havocbot_goalrating_items(10000, self.origin, 10000);
navigation_goalrating_end();
}
@@ -626,9 +622,19 @@
if (self.bot_strategytime < time)
{
+ float key_owner_team;
+
self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
navigation_goalrating_start();
- havocbot_goalrating_kh(1, 1000, 4000);
+
+ key_owner_team = kh_Key_AllOwnedByWhichTeam();
+ if(key_owner_team == self.team)
+ havocbot_goalrating_kh(10000, 1, 1); // defend anyway
+ else if(key_owner_team == -1)
+ havocbot_goalrating_kh(1, 1000, 4000); // play offensively
+ else
+ havocbot_goalrating_kh(1, 1, 10000); // ATTACK! EMERGENCY!
+
havocbot_goalrating_items(10000, self.origin, 10000);
navigation_goalrating_end();
}
@@ -664,9 +670,19 @@
if (self.bot_strategytime < time)
{
+ float key_owner_team;
+
self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
navigation_goalrating_start();
- havocbot_goalrating_kh(1000, 4000, 1000);
+
+ key_owner_team = kh_Key_AllOwnedByWhichTeam();
+ if(key_owner_team == self.team)
+ havocbot_goalrating_kh(10000, 1, 1); // defend anyway
+ else if(key_owner_team == -1)
+ havocbot_goalrating_kh(1000, 4000, 1000); // prefer dropped keys
+ else
+ havocbot_goalrating_kh(1, 1, 10000); // ATTACK ANYWAY
+
havocbot_goalrating_items(10000, self.origin, 10000);
navigation_goalrating_end();
}
Modified: trunk/data/qcsrc/server/keyhunt.qc
===================================================================
--- trunk/data/qcsrc/server/keyhunt.qc 2007-04-30 18:40:03 UTC (rev 2423)
+++ trunk/data/qcsrc/server/keyhunt.qc 2007-04-30 20:46:00 UTC (rev 2424)
@@ -252,6 +252,25 @@
remove(key);
}
+// -1 when no team completely owns all keys yet
+float kh_Key_AllOwnedByWhichTeam()
+{
+ entity key;
+ float teem;
+
+ teem = -1;
+ FOR_EACH_KH_KEY(key)
+ {
+ if(!key.owner)
+ return -1;
+ if(teem == -1)
+ teem = key.team;
+ else if(teem != key.team)
+ return -1;
+ }
+ return teem;
+}
+
void kh_Key_Collect(entity key, entity player)
{
sound(key, CHAN_AUTO, kh_sound_collect, 1, ATTN_NORM);
@@ -260,12 +279,11 @@
bprint(player.netname, "^7 collected the ", key.netname, "\n");
kh_Key_AssignTo(key, player, TRUE);
- FOR_EACH_KH_KEY(key)
- if(!key.owner || key.team != player.team)
- goto notallowned;
- kh_interferemsg_time = time + 0.2;
- kh_interferemsg_team = player.team;
-:notallowned
+ if(kh_Key_AllOwnedByWhichTeam() != -1)
+ {
+ kh_interferemsg_time = time + 0.2;
+ kh_interferemsg_team = player.team;
+ }
}
void kh_Key_DropAll(entity player)
@@ -334,23 +352,15 @@
kh_LoserTeam(self.team, self);
if(self.owner)
+ if(kh_Key_AllOwnedByWhichTeam() != -1)
{
entity key;
vector p;
- float teem;
- teem = self.team;
p = self.owner.origin;
FOR_EACH_KH_KEY(key)
- {
- if(key.owner == self.owner)
- continue;
- if(key.owner)
- if(key.team == teem)
- if(vlen(key.owner.origin - p) < cvar("g_balance_keyhunt_maxdist"))
- continue;
- goto not_winning;
- }
- kh_WinnerTeam(teem);
+ if(vlen(key.owner.origin - p) > cvar("g_balance_keyhunt_maxdist"))
+ goto not_winning;
+ kh_WinnerTeam(self.team);
:not_winning
}
@@ -568,8 +578,6 @@
float kh_KeyCarrier_waypointsprite_for_player(entity e)
{
- entity key;
-
if(e.classname != "player" || self.team != e.team)
if(!kh_tracking_enabled)
return 0;
@@ -584,11 +592,10 @@
// e is a key carrier: if any key is dropped or owned by another team, show
// the carrier sprite; otherwise show run here
- FOR_EACH_KH_KEY(key)
- if(!key.owner || key.team != e.team)
- return kh_GetCarrierSprite(self.team, e.team);
+ if(kh_Key_AllOwnedByWhichTeam() == e.team)
+ return kh_sprite_finish;
- return kh_sprite_finish;
+ return kh_GetCarrierSprite(self.team, e.team);
}
float kh_HandleFrags(entity attacker, entity targ, float f)
Modified: trunk/data/qcsrc/server/keyhunt.qh
===================================================================
--- trunk/data/qcsrc/server/keyhunt.qh 2007-04-30 18:40:03 UTC (rev 2423)
+++ trunk/data/qcsrc/server/keyhunt.qh 2007-04-30 20:46:00 UTC (rev 2424)
@@ -23,3 +23,4 @@
float kh_Key_waypointsprite_for_player(entity e);
void kh_setstatus();
float kh_HandleFrags(entity attacker, entity targ, float f);
+float kh_Key_AllOwnedByWhichTeam();
More information about the nexuiz-commits
mailing list