X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Frace.qc;h=0cac389aaf753368f18ce4e52b23a5fb6357d5a1;hb=f34e36384aea3cb5e6c6818de704e6da2ee125b5;hp=94f3100a40cb7bd76d9d4f710d5e98586e3573c8;hpb=9dd43f196ca7bc0979f94a0fb0f87cdd82a951c7;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/race.qc b/qcsrc/server/race.qc index 94f3100a4..0cac389aa 100644 --- a/qcsrc/server/race.qc +++ b/qcsrc/server/race.qc @@ -15,6 +15,13 @@ #include "../lib/warpzone/common.qh" #include "../common/mutators/mutator/waypoints/waypointsprites.qh" +void race_InitSpectator() +{ + if(g_race_qualifying) + if(msg_entity.enemy.race_laptime) + race_SendNextCheckpoint(msg_entity.enemy, 1); +} + void W_Porto_Fail(float failhard); float race_readTime(string map, float pos) @@ -164,9 +171,8 @@ void race_SendNextCheckpoint(entity e, float spec) // qualifying only if(!spec) msg_entity = e; - WRITESPECTATABLE_MSG_ONE({ - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_RACE); + WRITESPECTATABLE_MSG_ONE(msg_entity, { + WriteHeader(MSG_ONE, TE_CSQC_RACE); if(spec) { WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_NEXT_SPEC_QUALIFYING); @@ -184,8 +190,7 @@ void race_SendNextCheckpoint(entity e, float spec) // qualifying only void race_send_recordtime(float msg) { // send the server best time - WriteByte(msg, SVC_TEMPENTITY); - WriteByte(msg, TE_CSQC_RACE); + WriteHeader(msg, TE_CSQC_RACE); WriteByte(msg, RACE_NET_SERVER_RECORD); WriteInt24_t(msg, race_readTime(GetMapname(), 1)); } @@ -194,8 +199,7 @@ void race_send_recordtime(float msg) void race_send_speedaward(float msg) { // send the best speed of the round - WriteByte(msg, SVC_TEMPENTITY); - WriteByte(msg, TE_CSQC_RACE); + WriteHeader(msg, TE_CSQC_RACE); WriteByte(msg, RACE_NET_SPEED_AWARD); WriteInt24_t(msg, floor(speedaward_speed+0.5)); WriteString(msg, speedaward_holder); @@ -204,8 +208,7 @@ void race_send_speedaward(float msg) void race_send_speedaward_alltimebest(float msg) { // send the best speed - WriteByte(msg, SVC_TEMPENTITY); - WriteByte(msg, TE_CSQC_RACE); + WriteHeader(msg, TE_CSQC_RACE); WriteByte(msg, RACE_NET_SPEED_AWARD_BEST); WriteInt24_t(msg, floor(speedaward_alltimebest+0.5)); WriteString(msg, speedaward_alltimebest_holder); @@ -213,8 +216,7 @@ void race_send_speedaward_alltimebest(float msg) void race_SendRankings(float pos, float prevpos, float del, float msg) { - WriteByte(msg, SVC_TEMPENTITY); - WriteByte(msg, TE_CSQC_RACE); + WriteHeader(msg, TE_CSQC_RACE); WriteByte(msg, RACE_NET_SERVER_RANKINGS); WriteShort(msg, pos); WriteShort(msg, prevpos); @@ -234,9 +236,8 @@ void race_SendStatus(float id, entity e) else msg = MSG_ALL; msg_entity = e; - WRITESPECTATABLE_MSG_ONE_VARNAME(dummy3, { - WriteByte(msg, SVC_TEMPENTITY); - WriteByte(msg, TE_CSQC_RACE); + WRITESPECTATABLE_MSG_ONE(msg_entity, { + WriteHeader(msg, TE_CSQC_RACE); WriteByte(msg, RACE_NET_SERVER_STATUS); WriteShort(msg, id); WriteString(msg, e.netname); @@ -334,8 +335,8 @@ void race_deleteTime(string map, float pos) { if (i == RANKINGS_CNT) { - db_put(ServerProgsDB, strcat(map, rr, "time", ftos(i)), string_null); - db_put(ServerProgsDB, strcat(map, rr, "crypto_idfp", ftos(i)), string_null); + db_remove(ServerProgsDB, strcat(map, rr, "time", ftos(i))); + db_remove(ServerProgsDB, strcat(map, rr, "crypto_idfp", ftos(i))); } else { @@ -356,7 +357,6 @@ void race_deleteTime(string map, float pos) void race_SendTime(entity e, float cp, float t, float tvalid) { float snew, l; - entity p; if(g_race_qualifying) t += e.race_penalty_accumulator; @@ -416,10 +416,7 @@ void race_SendTime(entity e, float cp, float t, float tvalid) if(cp == race_timed_checkpoint) { race_setTime(GetMapname(), t, e.crypto_idfp, e.netname, e); - if(g_cts && autocvar_g_cts_finish_kill_delay) - { - CTS_ClientKill(e); - } + MUTATOR_CALLHOOK(Race_FinalCheckpoint, e); } if(t < recordtime || recordtime == 0) { @@ -429,9 +426,7 @@ void race_SendTime(entity e, float cp, float t, float tvalid) race_checkpoint_recordholders[cp] = strzone(e.netname); if(g_race_qualifying) { - FOR_EACH_REALPLAYER(p) - if(p.race_checkpoint == cp) - race_SendNextCheckpoint(p, 0); + FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && it.race_checkpoint == cp, LAMBDA(race_SendNextCheckpoint(it, 0))); } } } @@ -449,9 +444,8 @@ void race_SendTime(entity e, float cp, float t, float tvalid) msg_entity = e; if(g_race_qualifying) { - WRITESPECTATABLE_MSG_ONE_VARNAME(dummy1, { - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_RACE); + WRITESPECTATABLE_MSG_ONE(msg_entity, { + 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 @@ -478,9 +472,8 @@ void race_SendTime(entity e, float cp, float t, float tvalid) if(IS_REAL_CLIENT(e)) { msg_entity = e; - WRITESPECTATABLE_MSG_ONE_VARNAME(dummy2, { - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_RACE); + WRITESPECTATABLE_MSG_ONE(msg_entity, { + WriteHeader(MSG_ONE, TE_CSQC_RACE); WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_HIT_RACE); WriteByte(MSG_ONE, race_CheckpointNetworkID(cp)); // checkpoint the player now is at if(e == oth) @@ -505,9 +498,8 @@ void race_SendTime(entity e, float cp, float t, float tvalid) if(IS_REAL_CLIENT(oth)) { msg_entity = oth; - WRITESPECTATABLE_MSG_ONE_VARNAME(dummy3, { - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_RACE); + WRITESPECTATABLE_MSG_ONE(msg_entity, { + WriteHeader(MSG_ONE, TE_CSQC_RACE); WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_HIT_RACE_BY_OPPONENT); WriteByte(MSG_ONE, race_CheckpointNetworkID(cp)); // checkpoint the player now is at if(e == oth) @@ -539,9 +531,8 @@ void race_ClearTime(entity e) return; msg_entity = e; - WRITESPECTATABLE_MSG_ONE({ - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_RACE); + WRITESPECTATABLE_MSG_ONE(msg_entity, { + WriteHeader(MSG_ONE, TE_CSQC_RACE); WriteByte(MSG_ONE, RACE_NET_CHECKPOINT_CLEAR); // next }); } @@ -674,7 +665,7 @@ void checkpoint_passed() other.race_checkpoint = race_NextCheckpoint(self.race_checkpoint); other.race_started = 1; - race_SendTime(other, self.race_checkpoint, other.race_movetime, !!other.race_laptime); + race_SendTime(other, self.race_checkpoint, other.race_movetime, boolean(other.race_laptime)); if(!self.race_checkpoint) // start line { @@ -749,7 +740,7 @@ void trigger_race_checkpoint_verify() qual = g_race_qualifying; setself(spawn()); - self.classname = "player"; + self.classname = STR_PLAYER; if(g_race) { @@ -943,7 +934,7 @@ spawnfunc(trigger_race_checkpoint) self.touch = checkpoint_touch; o = (self.absmin + self.absmax) * 0.5; - tracebox(o, PL_MIN, PL_MAX, o - '0 0 1' * (o.z - self.absmin.z), MOVE_NORMAL, self); + tracebox(o, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), o - '0 0 1' * (o.z - self.absmin.z), MOVE_NORMAL, self); waypoint_spawnforitem_force(self, trace_endpos); self.nearestwaypointtimeout = time + 1000000000; @@ -992,7 +983,7 @@ spawnfunc(target_checkpoint) // defrag entity self.touch = checkpoint_touch; o = (self.absmin + self.absmax) * 0.5; - tracebox(o, PL_MIN, PL_MAX, o - '0 0 1' * (o.z - self.absmin.z), MOVE_NORMAL, self); + tracebox(o, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), o - '0 0 1' * (o.z - self.absmin.z), MOVE_NORMAL, self); waypoint_spawnforitem_force(self, trace_endpos); self.nearestwaypointtimeout = time + 1000000000; @@ -1036,11 +1027,8 @@ void race_AbandonRaceCheck(entity p) void race_StartCompleting() { - entity p; race_completing = 1; - FOR_EACH_PLAYER(p) - if(p.deadflag != DEAD_NO) - race_AbandonRaceCheck(p); + FOREACH_CLIENT(IS_PLAYER(it) && IS_DEAD(it), LAMBDA(race_AbandonRaceCheck(it))); } void race_PreparePlayer() @@ -1085,13 +1073,11 @@ void race_ClearRecords() race_checkpoint_recordholders[i] = string_null; } - entity e; - FOR_EACH_CLIENT(e) - { - float p = e.race_place; - WITH(entity, self, e, race_PreparePlayer()); - e.race_place = p; - } + FOREACH_CLIENT(true, LAMBDA( + float p = it.race_place; + WITH(entity, self, it, race_PreparePlayer()); + it.race_place = p; + )); } void race_ImposePenaltyTime(entity pl, float penalty, string reason) @@ -1102,9 +1088,8 @@ void race_ImposePenaltyTime(entity pl, float penalty, string reason) if(IS_REAL_CLIENT(pl)) { msg_entity = pl; - WRITESPECTATABLE_MSG_ONE({ - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_RACE); + WRITESPECTATABLE_MSG_ONE(msg_entity, { + WriteHeader(MSG_ONE, TE_CSQC_RACE); WriteByte(MSG_ONE, RACE_NET_PENALTY_QUALIFYING); WriteShort(MSG_ONE, TIME_ENCODE(penalty)); WriteString(MSG_ONE, reason); @@ -1117,9 +1102,8 @@ void race_ImposePenaltyTime(entity pl, float penalty, string reason) if(IS_REAL_CLIENT(pl)) { msg_entity = pl; - WRITESPECTATABLE_MSG_ONE_VARNAME(dummy, { - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_RACE); + WRITESPECTATABLE_MSG_ONE(msg_entity, { + WriteHeader(MSG_ONE, TE_CSQC_RACE); WriteByte(MSG_ONE, RACE_NET_PENALTY_RACE); WriteShort(MSG_ONE, TIME_ENCODE(penalty)); WriteString(MSG_ONE, reason); @@ -1145,6 +1129,9 @@ void penalty_use() spawnfunc(trigger_race_penalty) { + // TODO: find out why this wasnt done: + //if(!g_cts && !g_race) { remove(self); return; } + EXACTTRIGGER_INIT; self.use = penalty_use;