X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmapvoting.qc;h=a4e68e7da7bd3e9b5766c30925b54434a7d52b85;hb=a6210ece94f39abfa716f2ab7629f04add0a195f;hp=ac64f630ff1d5181372a33c21fb4e67bde03588a;hpb=d44927502027bfa3ccd6ccc98d9b7d6285c182c3;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mapvoting.qc b/qcsrc/server/mapvoting.qc index ac64f630f..a4e68e7da 100644 --- a/qcsrc/server/mapvoting.qc +++ b/qcsrc/server/mapvoting.qc @@ -1,20 +1,19 @@ #include "mapvoting.qh" -#include -#include -#include -#include -#include -#include "world.qh" -#include "command/cmd.qh" -#include "command/getreplies.qh" -#include "../common/constants.qh" +#include +#include #include -#include "../common/mapinfo.qh" -#include "../common/playerstats.qh" +#include #include -#include "../common/util.qh" - +#include +#include +#include +#include +#include +#include +#include +#include +#include // definitions @@ -49,10 +48,10 @@ entity mapvote_ent; */ Gametype GameTypeVote_Type_FromString(string type_name) { - Gametype type = MapInfo_Type_FromString(type_name, false); + Gametype type = MapInfo_Type_FromString(type_name, false, false); if (type == NULL) type = MapInfo_Type_FromString(cvar_string( - strcat("sv_vote_gametype_",type_name,"_type")), false); + strcat("sv_vote_gametype_",type_name,"_type")), false, false); return type; } @@ -60,11 +59,11 @@ int GameTypeVote_AvailabilityStatus(string type_name) { int flag = GTV_FORBIDDEN; - Gametype type = MapInfo_Type_FromString(type_name, false); + Gametype type = MapInfo_Type_FromString(type_name, false, false); if ( type == NULL ) { type = MapInfo_Type_FromString(cvar_string( - strcat("sv_vote_gametype_",type_name,"_type")), false); + strcat("sv_vote_gametype_",type_name,"_type")), false, false); flag |= GTV_CUSTOM; } @@ -338,6 +337,8 @@ void GameTypeVote_SendOption(int i) } } +int mapvote_winner; +float mapvote_winner_time; bool MapVote_SendEntity(entity this, entity to, int sf) { int i; @@ -345,6 +346,9 @@ bool MapVote_SendEntity(entity this, entity to, int sf) if(sf & 1) sf &= ~2; // if we send 1, we don't need to also send 2 + if (!mapvote_winner_time) + sf &= ~8; // no winner yet + WriteHeader(MSG_ENTITY, ENT_CLIENT_MAPVOTE); WriteByte(MSG_ENTITY, sf); @@ -402,12 +406,17 @@ bool MapVote_SendEntity(entity this, entity to, int sf) WriteByte(MSG_ENTITY, to.mapvote); } + if(sf & 8) + { + WriteByte(MSG_ENTITY, mapvote_winner + 1); + } + return true; } void MapVote_Spawn() { - Net_LinkEntity(mapvote_ent = spawn(), false, 0, MapVote_SendEntity); + Net_LinkEntity(mapvote_ent = new(mapvote_ent), false, 0, MapVote_SendEntity); } void MapVote_TouchMask() @@ -420,6 +429,13 @@ void MapVote_TouchVotes(entity voter) mapvote_ent.SendFlags |= 4; } +void MapVote_Winner(int mappos) +{ + mapvote_ent.SendFlags |= 8; + mapvote_winner_time = time; + mapvote_winner = mappos; +} + bool MapVote_Finished(int mappos) { if(alreadychangedlevel) @@ -471,8 +487,7 @@ bool MapVote_Finished(int mappos) return false; } - Map_Goto_SetStr(mapvote_maps[mappos]); - Map_Goto(0); + MapVote_Winner(mappos); alreadychangedlevel = true; return true; @@ -586,17 +601,23 @@ bool MapVote_CheckRules_2() void MapVote_Tick() { - MapVote_CheckRules_1(); // count if(MapVote_CheckRules_2()) // decide return; int totalvotes = 0; - FOREACH_CLIENT(IS_REAL_CLIENT(it), { + FOREACH_CLIENT(true, { + if(!IS_REAL_CLIENT(it)) + { + // apply the same special health value to bots too for consistency's sake + if(GetResource(it, RES_HEALTH) != 2342) + SetResourceExplicit(it, RES_HEALTH, 2342); + continue; + } // hide scoreboard again if(GetResource(it, RES_HEALTH) != 2342) { - SetResourceExplicit(it, RES_HEALTH, 2342); + SetResourceExplicit(it, RES_HEALTH, 2342); // health in the voting phase CS(it).impulse = 0; msg_entity = it; @@ -641,6 +662,16 @@ void MapVote_Think() if(!mapvote_run) return; + if (mapvote_winner_time) + { + if (time > mapvote_winner_time + 1) + { + Map_Goto_SetStr(mapvote_maps[mapvote_winner]); + Map_Goto(0); + } + return; + } + if(alreadychangedlevel) return; @@ -649,6 +680,8 @@ void MapVote_Think() //dprint("tick\n"); mapvote_nextthink = time + 0.5; + if (mapvote_nextthink > mapvote_timeout - 0.1) // make sure there's no delay when map vote times out + mapvote_nextthink = mapvote_timeout + 0.001; if(!mapvote_initialized) {