X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Frace.qc;h=f6ca98682c3d91eb7b4af582118c06dfed317e41;hb=a38bd26ab63d03aa74bd96fbbae0dd3d38794cda;hp=8482351bac8fc7b8ee1fd0a5344f46be9593b8dc;hpb=78937c7a783f7ad37ea9ea3e49e3074c47c7d03b;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/race.qc b/qcsrc/server/race.qc index 8482351ba..f6ca98682 100644 --- a/qcsrc/server/race.qc +++ b/qcsrc/server/race.qc @@ -104,7 +104,7 @@ void race_send_recordtime(float msg) WriteByte(msg, SVC_TEMPENTITY); WriteByte(msg, TE_CSQC_RACE); WriteByte(msg, RACE_NET_SERVER_RECORD); - WriteInt24_t(msg, race_readTime(1)); + WriteInt24_t(msg, race_readTime(GetMapname(), 1)); } void race_SendRankings(float pos, float prevpos, float del, float msg) @@ -115,27 +115,28 @@ void race_SendRankings(float pos, float prevpos, float del, float msg) WriteShort(msg, pos); WriteShort(msg, prevpos); WriteShort(msg, del); - WriteString(msg, race_readName(pos)); - WriteInt24_t(msg, race_readTime(pos)); + WriteString(msg, race_readName(GetMapname(), pos)); + WriteInt24_t(msg, race_readTime(GetMapname(), pos)); } -void race_SendStatus(float id, string mynetname) +void race_SendStatus(float id, entity e) { float msg; if (id == 0) msg = MSG_ONE; else msg = MSG_ALL; + msg_entity = e; WRITESPECTATABLE_MSG_ONE_VARNAME(dummy3, { WriteByte(msg, SVC_TEMPENTITY); WriteByte(msg, TE_CSQC_RACE); WriteByte(msg, RACE_NET_SERVER_STATUS); WriteShort(msg, id); - WriteString(msg, mynetname); + WriteString(msg, e.netname); }); } -void race_setTime(string map, float t, string myuid, string mynetname) { // netname only used TEMPORARILY for printing +void race_setTime(string map, float t, string myuid, string mynetname, entity e) { // netname only used TEMPORARILY for printing float newpos, player_prevpos; newpos = race_readPos(map, t); @@ -147,42 +148,39 @@ void race_setTime(string map, float t, string myuid, string mynetname) { // netn } float oldrec; - string recorddifference; + string recorddifference, oldrec_holder; if (player_prevpos && (player_prevpos < newpos || !newpos)) { - oldrec = race_readTime(player_prevpos); + oldrec = race_readTime(GetMapname(), player_prevpos); recorddifference = strcat(" ^1[+", TIME_ENCODED_TOSTRING(t - oldrec), "]"); bprint(mynetname, "^7 couldn't break their ", race_placeName(player_prevpos), " place record of ", TIME_ENCODED_TOSTRING(oldrec), recorddifference, "\n"); race_SendStatus(0, e); // "fail" + Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_FAIL, MSG_RACE); return; } else if (!newpos) { // no ranking, time worse than the worst ranked - recorddifference = strcat(" ^1[+", TIME_ENCODED_TOSTRING(t - race_readTime(MapInfo_Map_bspname, RANKINGS_CNT)), "]"); - bprint(mynetname, "^7 couldn't break the ", race_placeName(RANKINGS_CNT), " place record of ", TIME_ENCODED_TOSTRING(race_readTime(MapInfo_Map_bspname)), recorddifference, "\n"); + recorddifference = strcat(" ^1[+", TIME_ENCODED_TOSTRING(t - race_readTime(GetMapname(), RANKINGS_CNT)), "]"); + bprint(mynetname, "^7 couldn't break the ", race_placeName(RANKINGS_CNT), " place record of ", TIME_ENCODED_TOSTRING(race_readTime(GetMapname(), RANKINGS_CNT)), recorddifference, "\n"); race_SendStatus(0, e); // "fail" + Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_FAIL, MSG_RACE); return; } // if we didn't hit a return yet, we have a new record! - oldrec = race_readTime(MapInfo_Map_bspname, newpos); - oldrec_holder = race_readName(MapInfo_Map_bspname, newpos); - - // move other rankings out of the way - float i; - if (player_prevpos) { // player improved his existing record, only have to iterate on ranks between new and old recs - for (i=player_prevpos;i>pos;--i) { - race_writeTime(GetMapname(), race_readTime(GetMapname(), newpos-1), race_readUID(GetMapname(), newpos-1)); - } - } else { // player has no ranked record yet - for (i=RANKINGS_CNT;i>pos;--i) { - race_writeTime(GetMapname(), race_readTime(GetMapname(), newpos-1), race_readUID(GetMapname(), newpos-1)); - } + // if the player does not have a UID we can unfortunately not store the record, as the rankings system relies on UIDs + if(myuid == "") + { + bprint(mynetname, "^1 scored a new record with ^7", TIME_ENCODED_TOSTRING(t), "^1, but lacks a UID, so the record will unfortunately be lost.\n"); + return; } + + oldrec = race_readTime(GetMapname(), newpos); + oldrec_holder = race_readName(GetMapname(), newpos); // store new ranking - race_writeTime(GetMapname(), t, e.crypto_idfp); + race_writeTime(GetMapname(), t, myuid); - if (pos == 1) { + if (newpos == 1) { write_recordmarker(e, time - TIME_DECODE(t), TIME_DECODE(t)); race_send_recordtime(MSG_ALL); } @@ -191,8 +189,8 @@ void race_setTime(string map, float t, string myuid, string mynetname) { // netn if(rankings_reply) strunzone(rankings_reply); rankings_reply = strzone(getrankings()); - if(pos == 1) { - if(pos == player_prevpos) { + if(newpos == 1) { + if(newpos == player_prevpos) { recorddifference = strcat(" ^2[-", TIME_ENCODED_TOSTRING(oldrec - t), "]"); bprint(mynetname, "^1 improved their 1st place record with ", TIME_ENCODED_TOSTRING(t), recorddifference, "\n"); } else if (oldrec == 0) { @@ -202,31 +200,42 @@ void race_setTime(string map, float t, string myuid, string mynetname) { // netn bprint(mynetname, "^1 broke ", oldrec_holder, "^1's 1st place record with ", strcat(TIME_ENCODED_TOSTRING(t), recorddifference, "\n")); } race_SendStatus(3, e); // "new server record" + Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_SERVER_RECORD, MSG_RACE); } else { - if(pos == player_prevpos) { + if(newpos == player_prevpos) { recorddifference = strcat(" ^2[-", TIME_ENCODED_TOSTRING(oldrec - t), "]"); bprint(mynetname, "^5 improved their ", race_placeName(newpos), " ^5place record with ", TIME_ENCODED_TOSTRING(t), recorddifference, "\n"); race_SendStatus(1, e); // "new time" + Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_NEW_TIME, MSG_RACE); } else if (oldrec == 0) { bprint(mynetname, "^2 set the ", race_placeName(newpos), " ^2place record with ", TIME_ENCODED_TOSTRING(t), "\n"); race_SendStatus(2, e); // "new rank" + Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_NEW_RANK, MSG_RACE); } else { recorddifference = strcat(" ^2[-", TIME_ENCODED_TOSTRING(oldrec - t), "]"); bprint(mynetname, "^2 broke ", oldrec_holder, "^2's ", race_placeName(newpos), " ^2place record with ", strcat(TIME_ENCODED_TOSTRING(t), recorddifference, "\n")); race_SendStatus(2, e); // "new rank" + Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_NEW_TIME, MSG_RACE); } } } -void race_DeleteTime(float pos) { - float i; +void race_deleteTime(string map, float pos) { + string rr; + if(g_cts) + rr = CTS_RECORD; + else + rr = RACE_RECORD; + float i; for (i = pos; i <= RANKINGS_CNT; ++i) { if (i == RANKINGS_CNT) { - race_writeTime(GetMapname(), string_null, string_null); + db_put(ServerProgsDB, strcat(map, rr, "time", ftos(i)), string_null); + db_put(ServerProgsDB, strcat(map, rr, "crypto_idfp", ftos(i)), string_null); } else { - race_writeTime(GetMapname(), race_readTime(GetMapname(), newpos-1), race_readUID(GetMapname(), pos+1)); + db_put(ServerProgsDB, strcat(map, rr, "time", ftos(i)), ftos(race_readTime(GetMapname(), i+1))); + db_put(ServerProgsDB, strcat(map, rr, "crypto_idfp", ftos(i)), race_readUID(GetMapname(), i+1)); } } @@ -268,8 +277,8 @@ void race_SendTime(entity e, float cp, float t, float tvalid) PlayerScore_Add(e, SP_RACE_TIME, snew - s); l = PlayerTeamScore_Add(e, SP_RACE_LAPS, ST_RACE_LAPS, 1); - if(cvar("fraglimit")) - if(l >= cvar("fraglimit")) + if(autocvar_fraglimit) + if(l >= autocvar_fraglimit) race_StartCompleting(); if(race_completing) @@ -296,13 +305,12 @@ void race_SendTime(entity e, float cp, float t, float tvalid) if(t != 0) { if(cp == race_timed_checkpoint) { - msg_entity = e; - race_setTime(MapInfo_Map_bspname, t, e.crypto_idfp, e.netname); - if(g_cts && cvar("g_cts_finish_kill_delay")) + race_setTime(GetMapname(), t, e.crypto_idfp, e.netname, e); + if(g_cts && autocvar_g_cts_finish_kill_delay) { - CTS_ClientKill(cvar("g_cts_finish_kill_delay")); + CTS_ClientKill(e); } - + } if(t < recordtime || recordtime == 0) { race_checkpoint_records[cp] = t; @@ -734,11 +742,21 @@ void trigger_race_checkpoint_verify() for(trigger = world; (trigger = find(trigger, classname, "trigger_multiple")); ) for(targ = world; (targ = find(targ, targetname, trigger.target)); ) if (targ.classname == "target_checkpoint" || targ.classname == "target_startTimer" || targ.classname == "target_stopTimer") { - targ.wait = -2; + trigger.wait = 0; + trigger.delay = 0; + targ.wait = 0; targ.delay = 0; - setsize(targ, trigger.mins, trigger.maxs); - setorigin(targ, trigger.origin); + // These just make the game crash on some maps with oddly shaped triggers. + // (on the other hand they used to fix the case when two players ran through a checkpoint at once, + // and often one of them just passed through without being registered. Hope it's fixed in a better way now. + // (happened on item triggers too) + // + //targ.wait = -2; + //targ.delay = 0; + + //setsize(targ, trigger.mins, trigger.maxs); + //setorigin(targ, trigger.origin); //remove(trigger); } } @@ -787,9 +805,9 @@ void spawnfunc_trigger_race_checkpoint() if(!self.race_penalty) { if(self.race_checkpoint) - WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite); + WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite, RADARICON_NONE, '1 0.5 0'); else - WaypointSprite_SpawnFixed("race-finish", o, self, sprite); + WaypointSprite_SpawnFixed("race-start-finish", o, self, sprite, RADARICON_NONE, '1 0.5 0'); } self.sprite.waypointsprite_visible_for_player = race_waypointsprite_visible_for_player; @@ -833,9 +851,9 @@ void spawnfunc_target_checkpoint() // defrag entity race_timed_checkpoint = 1; if(self.race_checkpoint == 0) - WaypointSprite_SpawnFixed("race-start", o, self, sprite); + WaypointSprite_SpawnFixed("race-start", o, self, sprite, RADARICON_NONE, '1 0.5 0'); else - WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite); + WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite, RADARICON_NONE, '1 0.5 0'); self.sprite.waypointsprite_visible_for_player = race_waypointsprite_visible_for_player;