From 7c1037c6b3e5d0c4a5e956954f0e0363ec4d320d Mon Sep 17 00:00:00 2001 From: terencehill Date: Fri, 3 Nov 2017 15:41:02 +0100 Subject: [PATCH] Implement goal removal when bot returns the flag in a cleaner way --- qcsrc/server/bot/api.qh | 3 --- qcsrc/server/mutators/mutator/gamemode_ctf.qc | 13 ++++++++----- qcsrc/server/mutators/mutator/gamemode_ctf.qh | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/qcsrc/server/bot/api.qh b/qcsrc/server/bot/api.qh index cde97db88..12f05c752 100644 --- a/qcsrc/server/bot/api.qh +++ b/qcsrc/server/bot/api.qh @@ -108,6 +108,3 @@ void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, fl void waypoint_spawn_fromeditor(entity pl); entity waypoint_spawn(vector m1, vector m2, float f); void waypoint_unreachable(entity pl); - -.entity goalcurrent; -void navigation_clearroute(entity this); diff --git a/qcsrc/server/mutators/mutator/gamemode_ctf.qc b/qcsrc/server/mutators/mutator/gamemode_ctf.qc index 739f672ca..ae26c7e39 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ctf.qc +++ b/qcsrc/server/mutators/mutator/gamemode_ctf.qc @@ -597,6 +597,8 @@ void ctf_Handle_Capture(entity flag, entity toucher, int capturetype) { GameRules_scoring_add_team(enemy_flag.ctf_dropper, SCORE, ((enemy_flag.score_assist) ? enemy_flag.score_assist : autocvar_g_ctf_score_capture_assist)); } } + flag.enemy = toucher; + // reset the flag player.next_take_time = time + autocvar_g_ctf_flag_collect_delay; ctf_RespawnFlag(enemy_flag); @@ -639,6 +641,8 @@ void ctf_Handle_Return(entity flag, entity player) if(player.flagcarried == flag) WaypointSprite_Kill(player.wps_flagcarrier); + flag.enemy = player; + // reset the flag ctf_RespawnFlag(flag); } @@ -776,6 +780,7 @@ void ctf_CheckFlagReturn(entity flag, int returntype) } _sound(flag, CH_TRIGGER, flag.snd_flag_respawn, VOL_BASE, ATTEN_NONE); ctf_EventLog("returned", flag.team, NULL); + flag.enemy = NULL; ctf_RespawnFlag(flag); } } @@ -1179,8 +1184,9 @@ void ctf_RespawnFlag(entity flag) void ctf_Reset(entity this) { if(this.owner && IS_PLAYER(this.owner)) - ctf_Handle_Throw(this.owner, NULL, DROP_RESET); + ctf_Handle_Throw(this.owner, NULL, DROP_RESET); + this.enemy = NULL; ctf_RespawnFlag(this); } @@ -1863,11 +1869,8 @@ void havocbot_role_ctf_retriever(entity this) mf = havocbot_ctf_find_flag(this); if(mf.ctf_status==FLAG_BASE) { - if(this.goalcurrent == mf) - { - navigation_clearroute(this); + if (mf.enemy == this) // did this bot return the flag? navigation_goalrating_timeout_force(this); - } havocbot_ctf_reset_role(this); return; } diff --git a/qcsrc/server/mutators/mutator/gamemode_ctf.qh b/qcsrc/server/mutators/mutator/gamemode_ctf.qh index 0b86a57f8..33d64a074 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ctf.qh +++ b/qcsrc/server/mutators/mutator/gamemode_ctf.qh @@ -133,6 +133,7 @@ float ctf_captimerecord; // record time for capturing the flag .float next_take_time; .bool ctf_flagdamaged_byworld; int ctf_teams; +.entity enemy; // when flag is back in the base, it remembers last player who carried/touched the flag, useful to bots // passing/throwing properties .float pass_distance; -- 2.39.2