From c5f3d8aee411e6f5a0f7b34937f2c7140aab1c6f Mon Sep 17 00:00:00 2001 From: Samual Lenks Date: Mon, 10 Sep 2012 15:24:45 -0400 Subject: [PATCH] Do the same for freezetag --- .../bot/havocbot/role_freezetag.qc | 0 qcsrc/server/bot/havocbot/havocbot.qc | 1 - qcsrc/server/bot/havocbot/roles.qc | 2 - qcsrc/server/mutators/gamemode_freezetag.qc | 123 ++++++++++++++++++ 4 files changed, 123 insertions(+), 3 deletions(-) rename qcsrc/server/{ => attic}/bot/havocbot/role_freezetag.qc (100%) diff --git a/qcsrc/server/bot/havocbot/role_freezetag.qc b/qcsrc/server/attic/bot/havocbot/role_freezetag.qc similarity index 100% rename from qcsrc/server/bot/havocbot/role_freezetag.qc rename to qcsrc/server/attic/bot/havocbot/role_freezetag.qc diff --git a/qcsrc/server/bot/havocbot/havocbot.qc b/qcsrc/server/bot/havocbot/havocbot.qc index a8366e5bb..1b9178b17 100644 --- a/qcsrc/server/bot/havocbot/havocbot.qc +++ b/qcsrc/server/bot/havocbot/havocbot.qc @@ -1,7 +1,6 @@ #include "havocbot.qh" #include "role_onslaught.qc" #include "role_keyhunt.qc" -#include "role_freezetag.qc" #include "role_assault.qc" #include "roles.qc" diff --git a/qcsrc/server/bot/havocbot/roles.qc b/qcsrc/server/bot/havocbot/roles.qc index a20c23f7c..ad3bb2367 100644 --- a/qcsrc/server/bot/havocbot/roles.qc +++ b/qcsrc/server/bot/havocbot/roles.qc @@ -303,8 +303,6 @@ void havocbot_chooserole() havocbot_chooserole_race(); else if (g_onslaught) havocbot_chooserole_ons(); - else if (g_freezetag) - havocbot_chooserole_ft(); else if (g_assault) havocbot_chooserole_ast(); else // assume anything else is deathmatch diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc index df75dfa12..aedfd6364 100644 --- a/qcsrc/server/mutators/gamemode_freezetag.qc +++ b/qcsrc/server/mutators/gamemode_freezetag.qc @@ -129,6 +129,115 @@ void freezetag_Unfreeze(entity attacker) WaypointSprite_Kill(self.waypointsprite_attached); } + +// ================ +// Bot player logic +// ================ + +void() havocbot_role_ft_freeing; +void() havocbot_role_ft_offense; + +void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradius) +{ + entity head; + float distance; + + FOR_EACH_PLAYER(head) + { + if ((head != self) && (head.team == self.team)) + { + if (head.freezetag_frozen) + { + distance = vlen(head.origin - org); + if (distance > sradius) + continue; + navigation_routerating(head, ratingscale, 2000); + } + else + { + // If teamate is not frozen still seek them out as fight better + // in a group. + navigation_routerating(head, ratingscale/3, 2000); + } + } + } +} + +void havocbot_role_ft_offense() +{ + entity head; + float unfrozen; + + if(self.deadflag != DEAD_NO) + return; + + if (!self.havocbot_role_timeout) + self.havocbot_role_timeout = time + random() * 10 + 20; + + // Count how many players on team are unfrozen. + unfrozen = 0; + FOR_EACH_PLAYER(head) + { + if ((head.team == self.team) && (!head.freezetag_frozen)) + unfrozen++; + } + + // If only one left on team or if role has timed out then start trying to free players. + if (((unfrozen == 0) && (!self.freezetag_frozen)) || (time > self.havocbot_role_timeout)) + { + dprint("changing role to freeing\n"); + self.havocbot_role = havocbot_role_ft_freeing; + self.havocbot_role_timeout = 0; + return; + } + + if (time > self.bot_strategytime) + { + self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; + + navigation_goalrating_start(); + havocbot_goalrating_items(10000, self.origin, 10000); + havocbot_goalrating_enemyplayers(20000, self.origin, 10000); + havocbot_goalrating_freeplayers(9000, self.origin, 10000); + //havocbot_goalrating_waypoints(1, self.origin, 1000); + navigation_goalrating_end(); + } +} + +void havocbot_role_ft_freeing() +{ + if(self.deadflag != DEAD_NO) + return; + + if (!self.havocbot_role_timeout) + self.havocbot_role_timeout = time + random() * 10 + 20; + + if (time > self.havocbot_role_timeout) + { + dprint("changing role to offense\n"); + self.havocbot_role = havocbot_role_ft_offense; + self.havocbot_role_timeout = 0; + return; + } + + if (time > self.bot_strategytime) + { + self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; + + navigation_goalrating_start(); + havocbot_goalrating_items(8000, self.origin, 10000); + havocbot_goalrating_enemyplayers(10000, self.origin, 10000); + havocbot_goalrating_freeplayers(20000, self.origin, 10000); + //havocbot_goalrating_waypoints(1, self.origin, 1000); + navigation_goalrating_end(); + } +} + + +// ============== +// Hook Functions +// ============== + MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer) { if(self.freezetag_frozen == 0 && self.health >= 1) @@ -334,6 +443,19 @@ MUTATOR_HOOKFUNCTION(freezetag_ForbidThrowCurrentWeapon) return 0; } +MUTATOR_HOOKFUNCTION(freezetag_BotRoles) +{ + if not(self.deadflag) + { + if (random() < 0.5) + self.havocbot_role = havocbot_role_ft_freeing; + else + self.havocbot_role = havocbot_role_ft_offense; + } + + return TRUE; +} + MUTATOR_DEFINITION(gamemode_freezetag) { MUTATOR_HOOK(MakePlayerObserver, freezetag_RemovePlayer, CBC_ORDER_ANY); @@ -345,6 +467,7 @@ MUTATOR_DEFINITION(gamemode_freezetag) MUTATOR_HOOK(PlayerPhysics, freezetag_PlayerPhysics, CBC_ORDER_FIRST); MUTATOR_HOOK(PlayerDamage_Calculate, freezetag_PlayerDamage_Calculate, CBC_ORDER_ANY); MUTATOR_HOOK(ForbidThrowCurrentWeapon, freezetag_ForbidThrowCurrentWeapon, CBC_ORDER_FIRST); //first, last or any? dunno. + MUTATOR_HOOK(HavocBot_ChooseRule, freezetag_BotRoles, CBC_ORDER_ANY); MUTATOR_ONADD { -- 2.39.2