X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator%2Fgamemode_ctf.qc;h=1847473cf9f57eb51fd768d94ac072fe242e8c56;hb=fbd313c7ceb26a09310d8062926f4ac2468623a8;hp=cd891b6bfb4a8dc49c99798bd9adca340e687f29;hpb=3970638a3718b851b497e57ae7eb2b70a76c1401;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/mutator/gamemode_ctf.qc b/qcsrc/server/mutators/mutator/gamemode_ctf.qc index cd891b6bf..1847473cf 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ctf.qc +++ b/qcsrc/server/mutators/mutator/gamemode_ctf.qc @@ -304,7 +304,7 @@ void ctf_CaptureShield_Touch(entity this, entity toucher) vector mymid = (this.absmin + this.absmax) * 0.5; vector theirmid = (toucher.absmin + toucher.absmax) * 0.5; - Damage(toucher, this, this, 0, DEATH_HURTTRIGGER.m_id, mymid, normalize(theirmid - mymid) * ctf_captureshield_force); + Damage(toucher, this, this, 0, DEATH_HURTTRIGGER.m_id, DMG_NOWEP, mymid, normalize(theirmid - mymid) * ctf_captureshield_force); if(IS_REAL_CLIENT(toucher)) { Send_Notification(NOTIF_ONE, toucher, MSG_CENTER, CENTER_CTF_CAPTURESHIELD_SHIELDED); } } @@ -540,6 +540,9 @@ void ctf_Handle_Capture(entity flag, entity toucher, int capturetype) if(CTF_DIFFTEAM(player, flag)) { return; } if((flag.cnt || enemy_flag.cnt) && flag.cnt != enemy_flag.cnt) { return; } // this should catch some edge cases (capturing grouped flag at ungrouped flag disallowed etc) + if (toucher.goalentity == flag.bot_basewaypoint) + toucher.goalentity_lock_timeout = 0; + if(ctf_oneflag) for(tmp_entity = ctf_worldflaglist; tmp_entity; tmp_entity = tmp_entity.ctf_worldflagnext) if(SAME_TEAM(tmp_entity, player)) @@ -594,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); @@ -636,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); } @@ -773,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); } } @@ -857,7 +865,7 @@ void ctf_CheckStalemate() } } -void ctf_FlagDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) +void ctf_FlagDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force) { if(ITEM_DAMAGE_NEEDKILL(deathtype)) { @@ -1176,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); } @@ -1669,13 +1678,24 @@ void havocbot_role_ctf_carrier(entity this) navigation_goalrating_timeout_set(this); + entity head = ctf_worldflaglist; + while (head) + { + if (this.goalentity == head.bot_basewaypoint) + { + this.goalentity_lock_timeout = time + 5; + break; + } + head = head.ctf_worldflagnext; + } + if (this.goalentity) this.havocbot_cantfindflag = time + 10; else if (time > this.havocbot_cantfindflag) { // Can't navigate to my own base, suicide! // TODO: drop it and wander around - Damage(this, this, this, 100000, DEATH_KILL.m_id, this.origin, '0 0 0'); + Damage(this, this, this, 100000, DEATH_KILL.m_id, DMG_NOWEP, this.origin, '0 0 0'); return; } } @@ -1849,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; } @@ -2017,7 +2034,8 @@ void havocbot_role_ctf_setrole(entity bot, int role) bot.havocbot_role = havocbot_role_ctf_carrier; bot.havocbot_role_timeout = 0; bot.havocbot_cantfindflag = time + 10; - navigation_goalrating_timeout_force(bot); + if (bot.havocbot_previous_role != bot.havocbot_role) + navigation_goalrating_timeout_force(bot); break; case HAVOCBOT_CTF_ROLE_DEFENSE: s = "defense"; @@ -2039,14 +2057,16 @@ void havocbot_role_ctf_setrole(entity bot, int role) bot.havocbot_previous_role = bot.havocbot_role; bot.havocbot_role = havocbot_role_ctf_retriever; bot.havocbot_role_timeout = time + 10; - navigation_goalrating_timeout_force(bot); + if (bot.havocbot_previous_role != bot.havocbot_role) + navigation_goalrating_timeout_expire(bot, 2); break; case HAVOCBOT_CTF_ROLE_ESCORT: s = "escort"; bot.havocbot_previous_role = bot.havocbot_role; bot.havocbot_role = havocbot_role_ctf_escort; bot.havocbot_role_timeout = time + 30; - navigation_goalrating_timeout_force(bot); + if (bot.havocbot_previous_role != bot.havocbot_role) + navigation_goalrating_timeout_expire(bot, 2); break; } LOG_TRACE(bot.netname, " switched to ", s); @@ -2065,7 +2085,7 @@ MUTATOR_HOOKFUNCTION(ctf, PlayerPreThink) bool b1 = false, b2 = false, b3 = false, b4 = false, b5 = false; // TODO: kill this, we WANT to show the other flags, somehow! (note: also means you don't see if you're FC) // initially clear items so they can be set as necessary later. - player.ctf_flagstatus &= ~(CTF_RED_FLAG_CARRYING | CTF_RED_FLAG_TAKEN | CTF_RED_FLAG_LOST + STAT(CTF_FLAGSTATUS, player) &= ~(CTF_RED_FLAG_CARRYING | CTF_RED_FLAG_TAKEN | CTF_RED_FLAG_LOST | CTF_BLUE_FLAG_CARRYING | CTF_BLUE_FLAG_TAKEN | CTF_BLUE_FLAG_LOST | CTF_YELLOW_FLAG_CARRYING | CTF_YELLOW_FLAG_TAKEN | CTF_YELLOW_FLAG_LOST | CTF_PINK_FLAG_CARRYING | CTF_PINK_FLAG_TAKEN | CTF_PINK_FLAG_LOST @@ -2079,7 +2099,7 @@ MUTATOR_HOOKFUNCTION(ctf, PlayerPreThink) if(flag.team == NUM_TEAM_2 && !b2) { b2 = true; t = CTF_BLUE_FLAG_CARRYING; t2 = CTF_BLUE_FLAG_TAKEN; t3 = CTF_BLUE_FLAG_LOST; } if(flag.team == NUM_TEAM_3 && !b3) { b3 = true; t = CTF_YELLOW_FLAG_CARRYING; t2 = CTF_YELLOW_FLAG_TAKEN; t3 = CTF_YELLOW_FLAG_LOST; } if(flag.team == NUM_TEAM_4 && !b4) { b4 = true; t = CTF_PINK_FLAG_CARRYING; t2 = CTF_PINK_FLAG_TAKEN; t3 = CTF_PINK_FLAG_LOST; } - if(flag.team == 0 && !b5) { b5 = true; t = CTF_NEUTRAL_FLAG_CARRYING; t2 = CTF_NEUTRAL_FLAG_TAKEN; t3 = CTF_NEUTRAL_FLAG_LOST; player.ctf_flagstatus |= CTF_FLAG_NEUTRAL; } + if(flag.team == 0 && !b5) { b5 = true; t = CTF_NEUTRAL_FLAG_CARRYING; t2 = CTF_NEUTRAL_FLAG_TAKEN; t3 = CTF_NEUTRAL_FLAG_LOST; STAT(CTF_FLAGSTATUS, player) |= CTF_FLAG_NEUTRAL; } switch(flag.ctf_status) { @@ -2087,14 +2107,14 @@ MUTATOR_HOOKFUNCTION(ctf, PlayerPreThink) case FLAG_CARRY: { if((flag.owner == player) || (flag.pass_sender == player)) - player.ctf_flagstatus |= t; // carrying: player is currently carrying the flag + STAT(CTF_FLAGSTATUS, player) |= t; // carrying: player is currently carrying the flag else - player.ctf_flagstatus |= t2; // taken: someone else is carrying the flag + STAT(CTF_FLAGSTATUS, player) |= t2; // taken: someone else is carrying the flag break; } case FLAG_DROPPED: { - player.ctf_flagstatus |= t3; // lost: the flag is dropped somewhere on the map + STAT(CTF_FLAGSTATUS, player) |= t3; // lost: the flag is dropped somewhere on the map break; } } @@ -2102,10 +2122,10 @@ MUTATOR_HOOKFUNCTION(ctf, PlayerPreThink) // item for stopping players from capturing the flag too often if(player.ctf_captureshielded) - player.ctf_flagstatus |= CTF_SHIELDED; + STAT(CTF_FLAGSTATUS, player) |= CTF_SHIELDED; if(ctf_stalemate) - player.ctf_flagstatus |= CTF_STALEMATE; + STAT(CTF_FLAGSTATUS, player) |= CTF_STALEMATE; // update the health of the flag carrier waypointsprite if(player.wps_flagcarrier) @@ -2208,7 +2228,9 @@ MUTATOR_HOOKFUNCTION(ctf, ClientConnect) if(IS_REAL_CLIENT(player)) { - for(int i = 1; i <= RANKINGS_CNT; ++i) + int m = min(RANKINGS_CNT, autocvar_g_cts_send_rankings_cnt); + race_send_rankings_cnt(MSG_ONE); + for (int i = 1; i <= m; ++i) { race_SendRankings(i, 0, 0, MSG_ONE); } @@ -2229,8 +2251,7 @@ MUTATOR_HOOKFUNCTION(ctf, GetPressedKeys) if(player.stored_netname != player.netname) { db_put(ServerProgsDB, strcat("/uid2name/", player.crypto_idfp), player.netname); - strunzone(player.stored_netname); - player.stored_netname = strzone(player.netname); + strcpy(player.stored_netname, player.netname); } } } @@ -2455,7 +2476,7 @@ MUTATOR_HOOKFUNCTION(ctf, SpectateCopy) entity spectatee = M_ARGV(0, entity); entity client = M_ARGV(1, entity); - client.ctf_flagstatus = spectatee.ctf_flagstatus; + STAT(CTF_FLAGSTATUS, client) = STAT(CTF_FLAGSTATUS, spectatee); } MUTATOR_HOOKFUNCTION(ctf, GetRecords)