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