From 85b699da6acb226ab365eaedd835a288ab22c349 Mon Sep 17 00:00:00 2001 From: div0 Date: Mon, 30 Apr 2007 20:46:00 +0000 Subject: [PATCH] keyhunt: improved bots; fix minplayers changing bot_number git-svn-id: svn://svn.icculus.org/nexuiz/trunk@2424 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/bots.qc | 32 ++++++++--------- data/qcsrc/server/havocbot_roles.qc | 56 ++++++++++++++++++----------- data/qcsrc/server/keyhunt.qc | 55 +++++++++++++++------------- data/qcsrc/server/keyhunt.qh | 1 + 4 files changed, 84 insertions(+), 60 deletions(-) diff --git a/data/qcsrc/server/bots.qc b/data/qcsrc/server/bots.qc index 47334f9e3..e5be3df65 100644 --- a/data/qcsrc/server/bots.qc +++ b/data/qcsrc/server/bots.qc @@ -2018,6 +2018,7 @@ void() botframe_updatedangerousobjects = float botframe_spawnedwaypoints; +float botframe_nextthink; void() bot_serverframe = { float realplayers, bots; @@ -2038,17 +2039,13 @@ void() bot_serverframe = { 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 @@ void() bot_serverframe = 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 @@ void() bot_serverframe = localcmd("quit\n"); } - if (bots > 0 || cvar("g_waypointeditor")) + if (currentbots > 0 || cvar("g_waypointeditor")) if (!botframe_spawnedwaypoints) { botframe_spawnedwaypoints = TRUE; diff --git a/data/qcsrc/server/havocbot_roles.qc b/data/qcsrc/server/havocbot_roles.qc index 2cc004c55..397e70778 100644 --- a/data/qcsrc/server/havocbot_roles.qc +++ b/data/qcsrc/server/havocbot_roles.qc @@ -538,7 +538,6 @@ void() havocbot_role_kh_offense; 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 @@ void() havocbot_role_kh_carrier = 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(enemies_have_keys) - havocbot_goalrating_kh(4000, 4000, 100); + if(kh_Key_AllOwnedByWhichTeam() == self.team) + havocbot_goalrating_kh(10000, 1, 1); // bring home else - havocbot_goalrating_kh(10000, 10000, 1); + havocbot_goalrating_kh(4000, 4000, 100); // play defensively + havocbot_goalrating_items(10000, self.origin, 10000); navigation_goalrating_end(); } @@ -596,9 +583,18 @@ void() havocbot_role_kh_defense = 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 @@ void() havocbot_role_kh_offense = 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 @@ void() havocbot_role_kh_freelancer = 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(); } diff --git a/data/qcsrc/server/keyhunt.qc b/data/qcsrc/server/keyhunt.qc index afd8f12b3..9fbc0187c 100644 --- a/data/qcsrc/server/keyhunt.qc +++ b/data/qcsrc/server/keyhunt.qc @@ -252,6 +252,25 @@ void kh_Key_Remove(entity key) 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 @@ void kh_Key_Collect(entity key, entity player) 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 @@ void kh_Key_Think() 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_Key_waypointsprite_for_player(entity e) 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 @@ float kh_KeyCarrier_waypointsprite_for_player(entity e) // 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) diff --git a/data/qcsrc/server/keyhunt.qh b/data/qcsrc/server/keyhunt.qh index fcd93d07a..bb16bbe03 100644 --- a/data/qcsrc/server/keyhunt.qh +++ b/data/qcsrc/server/keyhunt.qh @@ -23,3 +23,4 @@ float kh_KeyCarrier_waypointsprite_for_player(entity e); float kh_Key_waypointsprite_for_player(entity e); void kh_setstatus(); float kh_HandleFrags(entity attacker, entity targ, float f); +float kh_Key_AllOwnedByWhichTeam(); -- 2.39.2