From: Samual Lenks Date: Mon, 10 Sep 2012 19:24:45 +0000 (-0400) Subject: Do the same for freezetag X-Git-Tag: xonotic-v0.7.0~240^2~5 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=c5f3d8aee411e6f5a0f7b34937f2c7140aab1c6f;p=xonotic%2Fxonotic-data.pk3dir.git Do the same for freezetag --- diff --git a/qcsrc/server/attic/bot/havocbot/role_freezetag.qc b/qcsrc/server/attic/bot/havocbot/role_freezetag.qc new file mode 100644 index 000000000..4e5669eb2 --- /dev/null +++ b/qcsrc/server/attic/bot/havocbot/role_freezetag.qc @@ -0,0 +1,109 @@ +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(); + } +} + +void havocbot_chooserole_ft() +{ + if(self.deadflag != DEAD_NO) + return; + + if (random() < 0.5) + self.havocbot_role = havocbot_role_ft_freeing; + else + self.havocbot_role = havocbot_role_ft_offense; +} 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/role_freezetag.qc b/qcsrc/server/bot/havocbot/role_freezetag.qc deleted file mode 100644 index 4e5669eb2..000000000 --- a/qcsrc/server/bot/havocbot/role_freezetag.qc +++ /dev/null @@ -1,109 +0,0 @@ -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(); - } -} - -void havocbot_chooserole_ft() -{ - if(self.deadflag != DEAD_NO) - return; - - if (random() < 0.5) - self.havocbot_role = havocbot_role_ft_freeing; - else - self.havocbot_role = havocbot_role_ft_offense; -} 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 {