X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator%2Fgamemode_ctf.qc;h=3cf560ebedf752c3fc99b33cfc2aa3248bcaad2b;hb=d1542fb195d451b4c1d62fce9d960ccaf81a0238;hp=c1698c554a0161e4e5a52523c60a0d74c425d689;hpb=b283d314c0c619a12b54c6094ade99ed69daed67;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 c1698c554..3cf560ebe 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ctf.qc +++ b/qcsrc/server/mutators/mutator/gamemode_ctf.qc @@ -1,43 +1,8 @@ #include "gamemode_ctf.qh" -#ifndef CSQC #include -void ctf_Initialize(); - -REGISTER_MUTATOR(ctf, false) -{ - MUTATOR_ONADD - { - if (time > 1) // game loads at time 1 - error("This is a game type and it cannot be added at runtime."); - ctf_Initialize(); - - ActivateTeamplay(); - SetLimits(autocvar_capturelimit_override, autocvar_captureleadlimit_override, autocvar_timelimit_override, -1); - have_team_spawns = -1; // request team spawns - } - - MUTATOR_ONROLLBACK_OR_REMOVE - { - // we actually cannot roll back ctf_Initialize here - // BUT: we don't need to! If this gets called, adding always - // succeeds. - } - - MUTATOR_ONREMOVE - { - LOG_INFO("This is a game type and it cannot be removed at runtime."); - return -1; - } - - return 0; -} -#endif - -#ifdef SVQC #include #include -#endif #include @@ -278,10 +243,10 @@ bool ctf_CaptureShield_CheckStatus(entity p) if(ctf_captureshield_max_ratio <= 0) return false; - s = PlayerScore_Add(p, SP_CTF_CAPS, 0); - s2 = PlayerScore_Add(p, SP_CTF_PICKUPS, 0); - s3 = PlayerScore_Add(p, SP_CTF_RETURNS, 0); - s4 = PlayerScore_Add(p, SP_CTF_FCKILLS, 0); + s = GameRules_scoring_add(p, CTF_CAPS, 0); + s2 = GameRules_scoring_add(p, CTF_PICKUPS, 0); + s3 = GameRules_scoring_add(p, CTF_RETURNS, 0); + s4 = GameRules_scoring_add(p, CTF_FCKILLS, 0); sr = ((s - s2) + (s3 + s4)); @@ -292,10 +257,10 @@ bool ctf_CaptureShield_CheckStatus(entity p) FOREACH_CLIENT(IS_PLAYER(it), { if(DIFF_TEAM(it, p)) continue; - se = PlayerScore_Add(it, SP_CTF_CAPS, 0); - se2 = PlayerScore_Add(it, SP_CTF_PICKUPS, 0); - se3 = PlayerScore_Add(it, SP_CTF_RETURNS, 0); - se4 = PlayerScore_Add(it, SP_CTF_FCKILLS, 0); + se = GameRules_scoring_add(it, CTF_CAPS, 0); + se2 = GameRules_scoring_add(it, CTF_PICKUPS, 0); + se3 = GameRules_scoring_add(it, CTF_RETURNS, 0); + se4 = GameRules_scoring_add(it, CTF_FCKILLS, 0); ser = ((se - se2) + (se3 + se4)); @@ -387,8 +352,8 @@ void ctf_Handle_Drop(entity flag, entity player, int droptype) ctf_EventLog("dropped", player.team, player); // scoring - PlayerTeamScore_AddScore(player, -((flag.score_drop) ? flag.score_drop : autocvar_g_ctf_score_penalty_drop)); - PlayerScore_Add(player, SP_CTF_DROPS, 1); + GameRules_scoring_add_team(player, SCORE, -((flag.score_drop) ? flag.score_drop : autocvar_g_ctf_score_penalty_drop)); + GameRules_scoring_add(player, CTF_DROPS, 1); // waypoints if(autocvar_g_ctf_flag_dropped_waypoint) { @@ -419,6 +384,7 @@ void ctf_Handle_Retrieve(entity flag, entity player) // transfer flag to player flag.owner = player; flag.owner.flagcarried = flag; + GameRules_scoring_vip(player, true); // reset flag if(player.vehicle) @@ -476,6 +442,7 @@ void ctf_Handle_Throw(entity player, entity receiver, int droptype) setattachment(flag, NULL, ""); setorigin(flag, player.origin + FLAG_DROP_OFFSET); flag.owner.flagcarried = NULL; + GameRules_scoring_vip(flag.owner, false); flag.owner = NULL; flag.solid = SOLID_TRIGGER; flag.ctf_dropper = player; @@ -602,16 +569,16 @@ void ctf_Handle_Capture(entity flag, entity toucher, int capturetype) 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)); + GameRules_scoring_add_team(player, SCORE, ((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)); + GameRules_scoring_add_team(player, CTF_CAPS, ((capscore) ? capscore : 1)); - old_time = PlayerScore_Add(player, SP_CTF_CAPTIME, 0); + old_time = GameRules_scoring_add(player, CTF_CAPTIME, 0); new_time = TIME_ENCODE(time - enemy_flag.ctf_pickuptime); if(!old_time || new_time < old_time) - PlayerScore_Add(player, SP_CTF_CAPTIME, new_time - old_time); + GameRules_scoring_add(player, CTF_CAPTIME, new_time - old_time); // effects Send_Effect_(flag.capeffect, flag.origin, '0 0 0', 1); @@ -624,7 +591,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, ((enemy_flag.score_assist) ? enemy_flag.score_assist : autocvar_g_ctf_score_capture_assist)); } + { GameRules_scoring_add_team(enemy_flag.ctf_dropper, SCORE, ((enemy_flag.score_assist) ? enemy_flag.score_assist : autocvar_g_ctf_score_capture_assist)); } } // reset the flag @@ -650,8 +617,8 @@ void ctf_Handle_Return(entity flag, entity player) // scoring if(IS_PLAYER(player)) { - 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 + GameRules_scoring_add_team(player, SCORE, ((flag.score_return) ? flag.score_return : autocvar_g_ctf_score_return)); // reward for return + GameRules_scoring_add(player, CTF_RETURNS, 1); // add to count of returns nades_GiveBonus(player,autocvar_g_nades_bonus_score_medium); } @@ -660,7 +627,7 @@ void ctf_Handle_Return(entity flag, entity player) if(flag.ctf_dropper) { - PlayerScore_Add(flag.ctf_dropper, SP_SCORE, -autocvar_g_ctf_score_penalty_returned); // punish the player who dropped the flag + GameRules_scoring_add(flag.ctf_dropper, SCORE, -autocvar_g_ctf_score_penalty_returned); // punish the player who dropped the flag ctf_CaptureShield_Update(flag.ctf_dropper, 0); // shield player from picking up flag flag.ctf_dropper.next_take_time = time + autocvar_g_ctf_flag_collect_delay; // set next take time } @@ -681,6 +648,7 @@ void ctf_Handle_Pickup(entity flag, entity player, int pickuptype) // attach the flag to the player flag.owner = player; player.flagcarried = flag; + GameRules_scoring_vip(player, true); if(player.vehicle) { setattachment(flag, player.vehicle, ""); @@ -735,13 +703,13 @@ void ctf_Handle_Pickup(entity flag, entity player, int pickuptype) _sound(player, CH_TRIGGER, flag.snd_flag_taken, VOL_BASE, ATTEN_NONE); // scoring - PlayerScore_Add(player, SP_CTF_PICKUPS, 1); + GameRules_scoring_add(player, CTF_PICKUPS, 1); nades_GiveBonus(player, autocvar_g_nades_bonus_score_minor); switch(pickuptype) { case PICKUP_BASE: { - PlayerTeamScore_AddScore(player, ((flag.score_pickup) ? flag.score_pickup : autocvar_g_ctf_score_pickup_base)); + GameRules_scoring_add_team(player, SCORE, ((flag.score_pickup) ? flag.score_pickup : autocvar_g_ctf_score_pickup_base)); ctf_EventLog("steal", flag.team, player); break; } @@ -751,7 +719,7 @@ void ctf_Handle_Pickup(entity flag, entity player, int pickuptype) pickup_dropped_score = (autocvar_g_ctf_flag_return_time ? bound(0, ((flag.ctf_droptime + autocvar_g_ctf_flag_return_time) - time) / autocvar_g_ctf_flag_return_time, 1) : 1); pickup_dropped_score = floor((autocvar_g_ctf_score_pickup_dropped_late * (1 - pickup_dropped_score) + autocvar_g_ctf_score_pickup_dropped_early * pickup_dropped_score) + 0.5); LOG_TRACE("pickup_dropped_score is ", ftos(pickup_dropped_score)); - PlayerTeamScore_AddScore(player, pickup_dropped_score); + GameRules_scoring_add_team(player, SCORE, pickup_dropped_score); ctf_EventLog("pickup", flag.team, player); break; } @@ -1167,6 +1135,7 @@ void ctf_RespawnFlag(entity flag) WaypointSprite_Kill(flag.wps_flagcarrier); flag.owner.flagcarried = NULL; + GameRules_scoring_vip(flag.owner, false); if(flag.speedrunning) ctf_FakeTimeLimit(flag.owner, -1); @@ -2170,8 +2139,8 @@ MUTATOR_HOOKFUNCTION(ctf, PlayerDies) if((frag_attacker != frag_target) && (IS_PLAYER(frag_attacker)) && (frag_target.flagcarried)) { - PlayerTeamScore_AddScore(frag_attacker, ((SAME_TEAM(frag_attacker, frag_target)) ? -autocvar_g_ctf_score_kill : autocvar_g_ctf_score_kill)); - PlayerScore_Add(frag_attacker, SP_CTF_FCKILLS, 1); + GameRules_scoring_add_team(frag_attacker, SCORE, ((SAME_TEAM(frag_attacker, frag_target)) ? -autocvar_g_ctf_score_kill : autocvar_g_ctf_score_kill)); + GameRules_scoring_add(frag_attacker, CTF_FCKILLS, 1); } if(frag_target.flagcarried) @@ -2238,7 +2207,7 @@ MUTATOR_HOOKFUNCTION(ctf, GetPressedKeys) entity player = M_ARGV(0, entity); - if(player.cvar_cl_allow_uidtracking == 1 && player.cvar_cl_allow_uid2name == 1) + if(CS(player).cvar_cl_allow_uidtracking == 1 && CS(player).cvar_cl_allow_uid2name == 1) { if (!player.stored_netname) player.stored_netname = strzone(uid2name(player.crypto_idfp)); @@ -2690,15 +2659,15 @@ spawnfunc(team_CTL_bluelolly) { spawnfunc_item_flag_team2(this); } void ctf_ScoreRules(int teams) { CheckAllowedTeams(NULL); - ScoreRules_basics(teams, SFL_SORT_PRIO_PRIMARY, 0, true); - ScoreInfo_SetLabel_TeamScore (ST_CTF_CAPS, "caps", SFL_SORT_PRIO_PRIMARY); - ScoreInfo_SetLabel_PlayerScore(SP_CTF_CAPS, "caps", SFL_SORT_PRIO_SECONDARY); - ScoreInfo_SetLabel_PlayerScore(SP_CTF_CAPTIME, "captime", SFL_LOWER_IS_BETTER | SFL_TIME); - ScoreInfo_SetLabel_PlayerScore(SP_CTF_PICKUPS, "pickups", 0); - ScoreInfo_SetLabel_PlayerScore(SP_CTF_FCKILLS, "fckills", 0); - ScoreInfo_SetLabel_PlayerScore(SP_CTF_RETURNS, "returns", 0); - ScoreInfo_SetLabel_PlayerScore(SP_CTF_DROPS, "drops", SFL_LOWER_IS_BETTER); - ScoreRules_basics_end(); + GameRules_scoring(teams, SFL_SORT_PRIO_PRIMARY, 0, { + field_team(ST_CTF_CAPS, "caps", SFL_SORT_PRIO_PRIMARY); + field(SP_CTF_CAPS, "caps", SFL_SORT_PRIO_SECONDARY); + field(SP_CTF_CAPTIME, "captime", SFL_LOWER_IS_BETTER | SFL_TIME); + field(SP_CTF_PICKUPS, "pickups", 0); + field(SP_CTF_FCKILLS, "fckills", 0); + field(SP_CTF_RETURNS, "returns", 0); + field(SP_CTF_DROPS, "drops", SFL_LOWER_IS_BETTER); + }); } // code from here on is just to support maps that don't have flag and team entities