// legacy bot roles
.float race_checkpoint;
-.float race_oldcheckpoint;
-.bool startspeed_recorded;
-.float startspeed;
-.float race_avgspeed_sum;
-.float race_avgspeed_time;
-.float race_avgspeed_best;
-.float race_topspeed;
-.float race_topspeed_best;
void havocbot_role_cts(entity this)
{
if(IS_DEAD(this))
player.strafe_efficiency_sum += calculate_strafe_efficiency(player, CS(player).movement, dt) * dt;
if(player.race_started)
{
- if(!player.startspeed_recorded && player.race_checkpoint != 0 && player.race_oldcheckpoint == 0)
- {
- float new_startspeed = vlen(vec2(player.velocity));
- player.startspeed_recorded = true;
- if(new_startspeed > player.startspeed)
- {
- player.startspeed = new_startspeed;
- PlayerScore_Set(player, SP_CTS_STARTSPEED, player.startspeed * 100);
- }
- }
-
- float current_speed = vlen(vec2(player.velocity));
- if(player.race_topspeed < current_speed)
- {
- player.race_topspeed = current_speed;
- }
- player.race_avgspeed_sum += current_speed * dt;
- player.race_avgspeed_time += dt;
+ float current_speed = vlen(vec2(player.velocity));
+ if(player.race_topspeed < current_speed)
+ {
+ player.race_topspeed = current_speed;
+ }
+ player.race_avgspeed_sum += current_speed * dt;
+ player.race_avgspeed_time += dt;
}
else
{
- player.startspeed_recorded = false;
- player.race_avgspeed_sum = player.race_avgspeed_time = player.race_topspeed = 0;
+ player.race_startspeed = player.race_avgspeed_sum = player.race_avgspeed_time = player.race_topspeed = 0;
}
- player.race_oldcheckpoint = player.race_checkpoint;
}
MUTATOR_HOOKFUNCTION(cts, reset_map_global)
FOREACH_CLIENT(true, {
it.strafe_efficiency_best = -2;
+ it.strafe_efficiency_sum = it.strafe_efficiency_time = 0;
PlayerScore_Set(it, SP_CTS_STRAFE, -20000);
- it.startspeed_recorded = false;
- it.race_oldcheckpoint = 0;
+ it.race_startspeed_best = it.race_avgspeed_best = it.race_topspeed_best = -1;
+ it.race_startspeed = it.race_avgspeed_sum = it.race_avgspeed_time = it.race_topspeed = 0;
PlayerScore_Set(it, SP_CTS_STARTSPEED, -1);
- it.race_avgspeed_sum = it.race_avgspeed_time = it.race_topspeed = 0;
- it.race_avgspeed_best = it.race_topspeed_best = -1;
- PlayerScore_Set(it, SP_CTS_AVGSPEED, -1);
- PlayerScore_Set(it, SP_CTS_TOPSPEED, -1);
+ PlayerScore_Set(it, SP_CTS_AVGSPEED, -1);
+ PlayerScore_Set(it, SP_CTS_TOPSPEED, -1);
if(it.race_place)
{
race_PreparePlayer(player);
player.race_checkpoint = -1;
- player.strafe_efficiency_sum = player.strafe_efficiency_time = 0;
player.strafe_efficiency_best = -2;
+ player.strafe_efficiency_sum = player.strafe_efficiency_time = 0;
PlayerScore_Set(player, SP_CTS_STRAFE, -20000);
- player.startspeed_recorded = false;
- player.race_oldcheckpoint = 0;
+ player.race_startspeed_best = player.race_avgspeed_best = player.race_topspeed_best = -1;
+ player.race_startspeed = player.race_avgspeed_sum = player.race_avgspeed_time = player.race_topspeed = 0;
PlayerScore_Set(player, SP_CTS_STARTSPEED, -1);
- player.race_avgspeed_sum = player.race_avgspeed_time = player.race_topspeed = 0;
- player.race_avgspeed_best = player.race_topspeed_best = -1;
- PlayerScore_Set(player, SP_CTS_AVGSPEED, -1);
- PlayerScore_Set(player, SP_CTS_TOPSPEED, -1);
+ PlayerScore_Set(player, SP_CTS_AVGSPEED, -1);
+ PlayerScore_Set(player, SP_CTS_TOPSPEED, -1);
race_SendAll(player, false);
}
race_AbandonRaceCheck(frag_target);
frag_target.strafe_efficiency_sum = frag_target.strafe_efficiency_time = 0;
- frag_target.startspeed_recorded = false;
- frag_target.race_avgspeed_sum = frag_target.race_avgspeed_time = frag_target.race_topspeed = 0;
+ frag_target.race_startspeed = frag_target.race_avgspeed_sum = frag_target.race_avgspeed_time = frag_target.race_topspeed = 0;
if(autocvar_g_cts_removeprojectiles)
{
MUTATOR_HOOKFUNCTION(cts, Race_FinalCheckpoint)
{
entity player = M_ARGV(0, entity);
- float strafe_efficiency_average = player.strafe_efficiency_sum / player.strafe_efficiency_time;
-
- if(player.strafe_efficiency_best < strafe_efficiency_average)
- {
- player.strafe_efficiency_best = strafe_efficiency_average;
- PlayerScore_Set(player, SP_CTS_STRAFE, player.strafe_efficiency_best * 10000);
- }
-
- float race_speed_average = player.race_avgspeed_sum / player.race_avgspeed_time;
- if(player.race_avgspeed_best < race_speed_average)
- {
- player.race_avgspeed_best = race_speed_average;
- PlayerScore_Set(player, SP_CTS_AVGSPEED, player.race_avgspeed_best * 100);
- }
-
- if(player.race_topspeed_best < player.race_topspeed)
- {
- player.race_topspeed_best = player.race_topspeed;
- PlayerScore_Set(player, SP_CTS_TOPSPEED, player.race_topspeed_best * 100);
- }
// useful to prevent cheating by running back to the start line and starting out with more speed
if(autocvar_g_cts_finish_kill_delay)
#include <server/spawnpoints.qh>
#include <server/weapons/common.qh>
#include <server/world.qh>
+#include <server/strafe.qh>
.string stored_netname; // TODO: store this information independently of race-based gamemodes
+.float race_startspeed;
+.float race_startspeed_best;
+.float race_avgspeed_sum;
+.float race_avgspeed_time;
+.float race_avgspeed_best;
+.float race_topspeed;
+.float race_topspeed_best;
+
string uid2name(string myuid)
{
string s = db_get(ServerProgsDB, strcat("/uid2name/", myuid));
{
int s = GameRules_scoring_add(e, RACE_FASTEST, 0);
if(!s || t < s)
+ {
GameRules_scoring_add(e, RACE_FASTEST, t - s);
+
+ e.strafe_efficiency_best = e.strafe_efficiency_sum / e.strafe_efficiency_time;
+ PlayerScore_Set(e, SP_CTS_STRAFE, e.strafe_efficiency_best * 10000);
+
+ e.race_startspeed_best = e.race_startspeed;
+ PlayerScore_Set(e, SP_CTS_STARTSPEED, e.race_startspeed_best * 100);
+
+ e.race_avgspeed_best = e.race_avgspeed_sum / e.race_avgspeed_time;
+ PlayerScore_Set(e, SP_CTS_AVGSPEED, e.race_avgspeed_best * 100);
+
+ e.race_topspeed_best = e.race_topspeed;
+ PlayerScore_Set(e, SP_CTS_TOPSPEED, e.race_topspeed_best * 100);
+ }
if(!g_race_qualifying)
{
s = GameRules_scoring_add(e, RACE_TIME, 0);
if(!this.race_checkpoint) // start line
{
+ player.race_startspeed = vlen(vec2(player.velocity));
player.race_laptime = time;
player.race_movetime = player.race_movetime_frac = player.race_movetime_count = 0;
player.race_penalty_accumulator = 0;