X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator%2Fgamemode_ctf.qc;h=4681b0ef1641c7ba821bcbec28fcbc7737cc084a;hb=b39c34ddf85197bc841a9bf730fe60f7b559b39e;hp=2e8707b26cfc18d4b7ffa140dc99f36dad7a0fe4;hpb=b9b7114ea4f553130e727a77029eece79a041cee;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 2e8707b26..4681b0ef1 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ctf.qc +++ b/qcsrc/server/mutators/mutator/gamemode_ctf.qc @@ -91,6 +91,7 @@ float autocvar_g_ctf_flagcarrier_forcefactor; //float autocvar_g_ctf_flagcarrier_waypointforenemy_spotting; bool autocvar_g_ctf_fullbrightflags; bool autocvar_g_ctf_ignore_frags; +bool autocvar_g_ctf_score_ignore_fields; int autocvar_g_ctf_score_capture; int autocvar_g_ctf_score_capture_assist; int autocvar_g_ctf_score_kill; @@ -153,6 +154,9 @@ void ctf_CaptureRecord(entity flag, entity player) db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"), player.netname); write_recordmarker(player, (time - cap_time), cap_time); } + + if(autocvar_g_ctf_leaderboard && !ctf_oneflag) + race_setTime(GetMapname(), TIME_ENCODE(cap_time), player.crypto_idfp, player.netname, player, false); } bool ctf_Immediate_Return_Allowed(entity flag, entity toucher) @@ -382,7 +386,7 @@ void ctf_Handle_Drop(entity flag, entity player, int droptype) ctf_EventLog("dropped", player.team, player); // scoring - PlayerTeamScore_AddScore(player, -autocvar_g_ctf_score_penalty_drop); + PlayerTeamScore_AddScore(player, -((flag.score_drop) ? flag.score_drop : autocvar_g_ctf_score_penalty_drop)); PlayerScore_Add(player, SP_CTF_DROPS, 1); // waypoints @@ -565,6 +569,7 @@ void ctf_Handle_Capture(entity flag, entity toucher, int capturetype) if(!player) { return; } // without someone to give the reward to, we can't possibly cap 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(ctf_oneflag) for(tmp_entity = ctf_worldflaglist; tmp_entity; tmp_entity = tmp_entity.ctf_worldflagnext) @@ -592,8 +597,14 @@ void ctf_Handle_Capture(entity flag, entity toucher, int capturetype) } // scoring - PlayerTeamScore_AddScore(player, autocvar_g_ctf_score_capture); - PlayerTeamScore_Add(player, SP_CTF_CAPS, ST_CTF_CAPS, 1); + float pscore = 0; + if(enemy_flag.score_capture || flag.score_capture) + pscore = floor((max(1, enemy_flag.score_capture) + max(1, flag.score_capture)) * 0.5); + PlayerTeamScore_AddScore(player, ((pscore) ? pscore : autocvar_g_ctf_score_capture)); + float capscore = 0; + if(enemy_flag.score_team_capture || flag.score_team_capture) + capscore = floor((max(1, enemy_flag.score_team_capture) + max(1, flag.score_team_capture)) * 0.5); + PlayerTeamScore_Add(player, SP_CTF_CAPS, ST_CTF_CAPS, ((capscore) ? capscore : 1)); old_time = PlayerScore_Add(player, SP_CTF_CAPTIME, 0); new_time = TIME_ENCODE(time - enemy_flag.ctf_pickuptime); @@ -611,7 +622,7 @@ void ctf_Handle_Capture(entity flag, entity toucher, int capturetype) if(flag.speedrunning) { ctf_FakeTimeLimit(player, -1); } if((enemy_flag.ctf_dropper) && (player != enemy_flag.ctf_dropper)) - { PlayerTeamScore_AddScore(enemy_flag.ctf_dropper, autocvar_g_ctf_score_capture_assist); } + { PlayerTeamScore_AddScore(enemy_flag.ctf_dropper, ((enemy_flag.score_assist) ? enemy_flag.score_assist : autocvar_g_ctf_score_capture_assist)); } } // reset the flag @@ -637,7 +648,7 @@ void ctf_Handle_Return(entity flag, entity player) // scoring if(IS_PLAYER(player)) { - PlayerTeamScore_AddScore(player, autocvar_g_ctf_score_return); // reward for return + PlayerTeamScore_AddScore(player, ((flag.score_return) ? flag.score_return : autocvar_g_ctf_score_return)); // reward for return PlayerScore_Add(player, SP_CTF_RETURNS, 1); // add to count of returns nades_GiveBonus(player,autocvar_g_nades_bonus_score_medium); @@ -703,7 +714,7 @@ void ctf_Handle_Pickup(entity flag, entity player, int pickuptype) else if(CTF_DIFFTEAM(player, flag)) Send_Notification(NOTIF_ONE, player, MSG_CENTER, APP_TEAM_NUM(flag.team, CENTER_CTF_PICKUP)); else - Send_Notification(NOTIF_ONE, player, MSG_CENTER, ((SAME_TEAM(player, flag)) ? CENTER_CTF_PICKUP_TEAM : CENTER_CTF_PICKUP_TEAM_ENEMY), Team_ColorCode(flag.team)); + Send_Notification(NOTIF_ONE, player, MSG_CENTER, ((SAME_TEAM(player, flag)) ? CENTER_CTF_PICKUP_RETURN : CENTER_CTF_PICKUP_RETURN_ENEMY), Team_ColorCode(flag.team)); Send_Notification(NOTIF_TEAM_EXCEPT, player, MSG_CHOICE, APP_NUM(flag.team, CHOICE_CTF_PICKUP_TEAM), Team_ColorCode(player.team), player.netname); @@ -728,7 +739,7 @@ void ctf_Handle_Pickup(entity flag, entity player, int pickuptype) { case PICKUP_BASE: { - PlayerTeamScore_AddScore(player, autocvar_g_ctf_score_pickup_base); + PlayerTeamScore_AddScore(player, ((flag.score_pickup) ? flag.score_pickup : autocvar_g_ctf_score_pickup_base)); ctf_EventLog("steal", flag.team, player); break; } @@ -1129,7 +1140,7 @@ METHOD(Flag, giveTo, bool(Flag this, entity flag, entity toucher)) else if(is_not_monster && (!toucher.flagcarried)) ctf_Handle_Pickup(flag, toucher, PICKUP_DROPPED); } - else + else if(!toucher.flagcarried) ctf_Handle_Retrieve(flag, toucher); } break; @@ -1200,7 +1211,12 @@ void ctf_Reset(entity this) bool ctf_FlagBase_Customize(entity this, entity client) { - if(client.flagcarried && CTF_SAMETEAM(client, client.flagcarried)) + entity e = WaypointSprite_getviewentity(client); + entity wp_owner = this.owner; + entity flag = e.flagcarried; + if(flag && CTF_SAMETEAM(e, flag)) + return false; + if(flag && (flag.cnt || wp_owner.cnt) && wp_owner.cnt != flag.cnt) return false; return true; } @@ -1269,6 +1285,10 @@ void ctf_FlagSetup(int teamnumber, entity flag) // called when spawning a flag e flag.nextthink = time + FLAG_THINKRATE; flag.ctf_status = FLAG_BASE; + // crudely force them all to 0 + if(autocvar_g_ctf_score_ignore_fields) + flag.cnt = flag.score_assist = flag.score_team_capture = flag.score_capture = flag.score_drop = flag.score_pickup = flag.score_return = 0; + string teamname = Static_Team_ColorName_Lower(teamnumber); // appearence if(!flag.scale) { flag.scale = FLAG_SCALE; } @@ -1357,7 +1377,7 @@ void havocbot_calculate_middlepoint() entity f; vector s = '0 0 0'; vector fo = '0 0 0'; - float n = 0; + int n = 0; f = ctf_worldflaglist; while (f) @@ -1365,11 +1385,12 @@ void havocbot_calculate_middlepoint() fo = f.origin; s = s + fo; f = f.ctf_worldflagnext; + n++; } if(!n) return; - havocbot_ctf_middlepoint = s * (1.0 / n); - havocbot_ctf_middlepoint_radius = vlen(fo - havocbot_ctf_middlepoint); + havocbot_ctf_middlepoint = s / n; + havocbot_ctf_middlepoint_radius = vlen(fo - havocbot_ctf_middlepoint); } @@ -2170,6 +2191,42 @@ MUTATOR_HOOKFUNCTION(ctf, ClientDisconnect) ctf_RemovePlayer(player); } +MUTATOR_HOOKFUNCTION(ctf, ClientConnect) +{ + if(!autocvar_g_ctf_leaderboard) + return; + + entity player = M_ARGV(0, entity); + + if(IS_REAL_CLIENT(player)) + { + for(int i = 1; i <= RANKINGS_CNT; ++i) + { + race_SendRankings(i, 0, 0, MSG_ONE); + } + } +} + +MUTATOR_HOOKFUNCTION(ctf, GetPressedKeys) +{ + if(!autocvar_g_ctf_leaderboard) + return; + + entity player = M_ARGV(0, entity); + + if(player.cvar_cl_allow_uidtracking == 1 && player.cvar_cl_allow_uid2name == 1) + { + if (!player.stored_netname) + player.stored_netname = strzone(uid2name(player.crypto_idfp)); + 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); + } + } +} + MUTATOR_HOOKFUNCTION(ctf, PortalTeleport) { entity player = M_ARGV(0, entity); @@ -2220,7 +2277,7 @@ MUTATOR_HOOKFUNCTION(ctf, PlayerUseKey) player.throw_antispam = time + autocvar_g_ctf_pass_wait; return true; } - else if(player.flagcarried) + else if(player.flagcarried && !head.flagcarried) { if(closest_target) {