#include "race.qh"
+#include <server/defs.qh>
+#include <server/miscfunctions.qh>
#include "client.qh"
#include "portals.qh"
#include "scores.qh"
#include "../common/deathtypes/all.qh"
#include "../common/notifications/all.qh"
#include "../common/mapinfo.qh"
+#include <common/gamemodes/rules.qh>
#include <common/net_linked.qh>
+#include <common/state.qh>
#include "../common/triggers/subs.qh"
#include "../lib/warpzone/util_server.qh"
#include "../lib/warpzone/common.qh"
if(tvalid)
if(cp == race_timed_checkpoint) // finish line
- if (!e.race_completed)
+ if (!CS(e).race_completed)
{
float s;
if(g_race_qualifying)
{
- s = PlayerScore_Add(e, SP_RACE_FASTEST, 0);
+ s = GameRules_scoring_add(e, RACE_FASTEST, 0);
if(!s || t < s)
- PlayerScore_Add(e, SP_RACE_FASTEST, t - s);
+ GameRules_scoring_add(e, RACE_FASTEST, t - s);
}
else
{
- s = PlayerScore_Add(e, SP_RACE_FASTEST, 0);
+ s = GameRules_scoring_add(e, RACE_FASTEST, 0);
if(!s || t < s)
- PlayerScore_Add(e, SP_RACE_FASTEST, t - s);
+ GameRules_scoring_add(e, RACE_FASTEST, t - s);
- s = PlayerScore_Add(e, SP_RACE_TIME, 0);
+ s = GameRules_scoring_add(e, RACE_TIME, 0);
snew = TIME_ENCODE(time - game_starttime);
- PlayerScore_Add(e, SP_RACE_TIME, snew - s);
- l = PlayerTeamScore_Add(e, SP_RACE_LAPS, ST_RACE_LAPS, 1);
+ GameRules_scoring_add(e, RACE_TIME, snew - s);
+ l = GameRules_scoring_add_team(e, RACE_LAPS, 1);
if(autocvar_fraglimit)
if(l >= autocvar_fraglimit)
if(race_completing)
{
- e.race_completed = 1;
+ CS(e).race_completed = 1;
MAKE_INDEPENDENT_PLAYER(e);
Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_RACE_FINISHED, e.netname);
ClientData_Touch(e);
race_setTime(GetMapname(), t, e.crypto_idfp, e.netname, e, true);
MUTATOR_CALLHOOK(Race_FinalCheckpoint, e);
}
+ if(t < myrecordtime || myrecordtime == 0)
+ e.race_checkpoint_record[cp] = t; // resending done below
+
if(t < recordtime || recordtime == 0)
{
race_checkpoint_records[cp] = t;
strunzone(race_checkpoint_recordholders[cp]);
race_checkpoint_recordholders[cp] = strzone(e.netname);
if(g_race_qualifying)
- FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && it.race_checkpoint == cp, LAMBDA(race_SendNextCheckpoint(it, 0)));
+ FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && it.race_checkpoint == cp, { race_SendNextCheckpoint(it, 0); });
}
- if(t < myrecordtime || myrecordtime == 0)
- e.race_checkpoint_record[cp] = t; // resending done below
}
}
else
if(IS_REAL_CLIENT(e))
{
- msg_entity = e;
if(g_race_qualifying)
{
- WRITESPECTATABLE_MSG_ONE(e, {
- WriteHeader(MSG_ONE, TE_CSQC_RACE);
- WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_HIT_QUALIFYING);
- WriteByte(MSG_ONE, race_CheckpointNetworkID(cp)); // checkpoint the player now is at
- WriteInt24_t(MSG_ONE, t); // time to that intermediate
- WriteInt24_t(MSG_ONE, recordtime); // previously best time
- WriteInt24_t(MSG_ONE, ((tvalid) ? it.race_checkpoint_record[cp] : 0)); // previously best time
- WriteString(MSG_ONE, recordholder); // record holder
+ FOREACH_CLIENT(IS_REAL_CLIENT(it),
+ {
+ if(it == e || (IS_SPEC(it) && it.enemy == e))
+ {
+ msg_entity = it;
+ WriteHeader(MSG_ONE, TE_CSQC_RACE);
+ WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_HIT_QUALIFYING);
+ WriteByte(MSG_ONE, race_CheckpointNetworkID(cp)); // checkpoint the player now is at
+ WriteInt24_t(MSG_ONE, t); // time to that intermediate
+ WriteInt24_t(MSG_ONE, recordtime); // previously best time
+ WriteInt24_t(MSG_ONE, ((tvalid) ? it.race_checkpoint_record[cp] : 0)); // previously best time
+ WriteString(MSG_ONE, recordholder); // record holder
+ }
});
}
}
entity oth = race_checkpoint_lastplayers[cp];
if(oth)
{
- mylaps = PlayerScore_Add(e, SP_RACE_LAPS, 0);
+ mylaps = GameRules_scoring_add(e, RACE_LAPS, 0);
lother = race_checkpoint_lastlaps[cp];
othtime = race_checkpoint_lasttimes[cp];
}
else
{
if(this.spawnflags & 4)
- Damage (player, this, this, 10000, DEATH_HURTTRIGGER.m_id, player.origin, '0 0 0');
+ Damage (player, this, this, 10000, DEATH_HURTTRIGGER.m_id, DMG_NOWEP, player.origin, '0 0 0');
}
}
g_race_qualifying = qual;
- IL_EACH(g_race_targets, true,
+ IL_EACH(g_race_targets, it.classname == "target_checkpoint" || it.classname == "target_startTimer" || it.classname == "target_stopTimer",
{
+ if(it.targetname == "" || !it.targetname) // somehow this is a case...
+ continue;
entity cpt = it;
FOREACH_ENTITY_STRING(target, cpt.targetname,
{
if (race_timed_checkpoint) {
if (defrag_ents) {
- IL_EACH(g_race_targets, true,
+ IL_EACH(g_race_targets, it.classname == "target_checkpoint" || it.classname == "target_startTimer" || it.classname == "target_stopTimer",
{
entity cpt = it;
if(it.classname == "target_startTimer" || it.classname == "target_stopTimer") {
+ if(it.targetname == "" || !it.targetname) // somehow this is a case...
+ continue;
FOREACH_ENTITY_STRING(target, cpt.targetname, {
- WaypointSprite_UpdateSprites(it.sprite, ((cpt.classname == "target_startTimer") ? WP_RaceStart : WP_RaceFinish), WP_Null, WP_Null);
+ if(it.sprite)
+ WaypointSprite_UpdateSprites(it.sprite, ((cpt.classname == "target_startTimer") ? WP_RaceStart : WP_RaceFinish), WP_Null, WP_Null);
});
}
if(it.classname == "target_checkpoint") {
void race_AbandonRaceCheck(entity p)
{
- if(race_completing && !p.race_completed)
+ if(race_completing && !CS(p).race_completed)
{
- p.race_completed = 1;
+ CS(p).race_completed = 1;
MAKE_INDEPENDENT_PLAYER(p);
Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_RACE_ABANDONED, p.netname);
ClientData_Touch(p);
void race_StartCompleting()
{
race_completing = 1;
- FOREACH_CLIENT(IS_PLAYER(it) && IS_DEAD(it), LAMBDA(race_AbandonRaceCheck(it)));
+ FOREACH_CLIENT(IS_PLAYER(it) && IS_DEAD(it), { race_AbandonRaceCheck(it); });
}
void race_PreparePlayer(entity this)
race_checkpoint_recordholders[j] = string_null;
}
- FOREACH_CLIENT(true, LAMBDA(
+ FOREACH_CLIENT(true, {
float p = it.race_place;
race_PreparePlayer(it);
it.race_place = p;
- ));
+ });
}
void race_ImposePenaltyTime(entity pl, float penalty, string reason)
// links on CP entities)
float l;
- l = PlayerScore_Add(e, SP_RACE_LAPS, 0);
- if(e.race_completed)
+ l = GameRules_scoring_add(e, RACE_LAPS, 0);
+ if(CS(e).race_completed)
return l; // not fractional
vector o0, o1;