//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;
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)
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
}
// scoring
- PlayerTeamScore_AddScore(player, autocvar_g_ctf_score_capture);
+ PlayerTeamScore_AddScore(player, ((enemy_flag.score_capture) ? enemy_flag.score_capture : autocvar_g_ctf_score_capture));
PlayerTeamScore_Add(player, SP_CTF_CAPS, ST_CTF_CAPS, 1);
old_time = PlayerScore_Add(player, SP_CTF_CAPTIME, 0);
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
// 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);
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);
{
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;
}
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;
flag.nextthink = time + FLAG_THINKRATE;
flag.ctf_status = FLAG_BASE;
+ // crudely force them all to 0
+ if(autocvar_g_ctf_score_ignore_fields)
+ flag.score_assist = 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; }
entity f;
vector s = '0 0 0';
vector fo = '0 0 0';
- float n = 0;
+ int n = 0;
f = ctf_worldflaglist;
while (f)
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);
}
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);
player.throw_antispam = time + autocvar_g_ctf_pass_wait;
return true;
}
- else if(player.flagcarried)
+ else if(player.flagcarried && !head.flagcarried)
{
if(closest_target)
{