X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmapvoting.qc;h=b5a6014462ea141adf7379172adf8fb9a853cd2c;hp=3e1a86620314020cfe4ac7e6c8a61fd58480e377;hb=c5fcf672c473edef7139d4250398184b8ae17224;hpb=bbd25803840bd247e33b88250a402b31c196b717 diff --git a/qcsrc/server/mapvoting.qc b/qcsrc/server/mapvoting.qc index 3e1a86620..b5a601446 100644 --- a/qcsrc/server/mapvoting.qc +++ b/qcsrc/server/mapvoting.qc @@ -1,18 +1,79 @@ -float GameTypeVote_AvailabilityStatus(string gtname) -{ - float type = MapInfo_Type_FromString(gtname); - if( type == 0 ) - return GTV_FORBIDDEN; - +#include "mapvoting.qh" + +#include "g_world.qh" +#include "command/cmd.qh" +#include "command/getreplies.qh" +#include "../common/constants.qh" +#include +#include "../common/mapinfo.qh" +#include "../common/playerstats.qh" +#include "../common/util.qh" + + +// definitions + +float mapvote_nextthink; +float mapvote_keeptwotime; +float mapvote_timeout; +const float MAPVOTE_SCREENSHOT_DIRS_COUNT = 4; +string mapvote_screenshot_dirs[MAPVOTE_SCREENSHOT_DIRS_COUNT]; +float mapvote_screenshot_dirs_count; + +float mapvote_count; +float mapvote_count_real; +string mapvote_maps[MAPVOTE_COUNT]; +float mapvote_maps_screenshot_dir[MAPVOTE_COUNT]; +string mapvote_maps_pakfile[MAPVOTE_COUNT]; +float mapvote_maps_suggested[MAPVOTE_COUNT]; +string mapvote_suggestions[MAPVOTE_COUNT]; +float mapvote_suggestion_ptr; +float mapvote_voters; +float mapvote_selections[MAPVOTE_COUNT]; +float mapvote_maps_flags[MAPVOTE_COUNT]; +float mapvote_run; +float mapvote_detail; +float mapvote_abstain; +.float mapvote; + +entity mapvote_ent; + +/** + * Returns the gamtype ID from its name, if type_name isn't a real gametype it + * checks for sv_vote_gametype_(type_name)_type + */ +Gametype GameTypeVote_Type_FromString(string type_name) +{ + Gametype type = MapInfo_Type_FromString(type_name); + if (type == NULL) + type = MapInfo_Type_FromString(cvar_string( + strcat("sv_vote_gametype_",type_name,"_type"))); + return type; +} + +int GameTypeVote_AvailabilityStatus(string type_name) +{ + int flag = GTV_FORBIDDEN; + + Gametype type = MapInfo_Type_FromString(type_name); + if ( type == NULL ) + { + type = MapInfo_Type_FromString(cvar_string( + strcat("sv_vote_gametype_",type_name,"_type"))); + flag |= GTV_CUSTOM; + } + + if( type == NULL ) + return flag; + if ( autocvar_nextmap != "" ) { - if ( !MapInfo_Get_ByName(autocvar_nextmap, FALSE, 0) ) - return GTV_FORBIDDEN; - if (!(MapInfo_Map_supportedGametypes & type)) - return GTV_FORBIDDEN; + if ( !MapInfo_Get_ByName(autocvar_nextmap, false, NULL) ) + return flag; + if (!(MapInfo_Map_supportedGametypes & type.m_flags)) + return flag; } - - return GTV_AVAILABLE; + + return flag | GTV_AVAILABLE; } float GameTypeVote_GetMask() @@ -22,7 +83,7 @@ float GameTypeVote_GetMask() n = min(MAPVOTE_COUNT, n); gametype_mask = 0; for(j = 0; j < n; ++j) - gametype_mask |= MapInfo_Type_FromString(argv(j)); + gametype_mask |= GameTypeVote_Type_FromString(argv(j)).m_flags; return gametype_mask; } @@ -31,15 +92,14 @@ string GameTypeVote_MapInfo_FixName(string m) if ( autocvar_sv_vote_gametype ) { MapInfo_Enumerate(); - MapInfo_FilterGametype(GameTypeVote_GetMask(), 0, MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0); + _MapInfo_FilterGametype(GameTypeVote_GetMask(), 0, MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0); } return MapInfo_FixName(m); } void MapVote_ClearAllVotes() { - FOR_EACH_CLIENT(other) - other.mapvote = 0; + FOREACH_CLIENT(true, LAMBDA(it.mapvote = 0)); } void MapVote_UnzoneStrings() @@ -60,7 +120,7 @@ void MapVote_UnzoneStrings() } } -string MapVote_Suggest(string m) +string MapVote_Suggest(entity this, string m) { float i; if(m == "") @@ -96,7 +156,7 @@ string MapVote_Suggest(string m) strunzone(mapvote_suggestions[i]); mapvote_suggestions[i] = strzone(m); if(autocvar_sv_eventlog) - GameLogEcho(strcat(":vote:suggested:", m, ":", ftos(self.playerid))); + GameLogEcho(strcat(":vote:suggested:", m, ":", ftos(this.playerid))); return strcat("Suggestion of ", m, " accepted."); } @@ -131,12 +191,12 @@ void MapVote_AddVotable(string nextMap, float isSuggestion) } if(i >= mapvote_screenshot_dirs_count) i = 0; // FIXME maybe network this error case, as that means there is no mapshot on the server? - for(o = strstr(pakfile, "/", 0)+1; o > 0; o = strstr(pakfile, "/", 0)+1) + for(o = strstrofs(pakfile, "/", 0)+1; o > 0; o = strstrofs(pakfile, "/", 0)+1) pakfile = substring(pakfile, o, -1); mapvote_maps_screenshot_dir[mapvote_count] = i; mapvote_maps_pakfile[mapvote_count] = strzone(pakfile); - mapvote_maps_availability[mapvote_count] = GTV_AVAILABLE; + mapvote_maps_flags[mapvote_count] = GTV_AVAILABLE; mapvote_count += 1; } @@ -169,10 +229,10 @@ void MapVote_Init() if(mapvote_suggestion_ptr) for(i = 0; i < 100 && mapvote_count < smax; ++i) - MapVote_AddVotable(mapvote_suggestions[floor(random() * mapvote_suggestion_ptr)], TRUE); + MapVote_AddVotable(mapvote_suggestions[floor(random() * mapvote_suggestion_ptr)], true); for(i = 0; i < 100 && mapvote_count < nmax; ++i) - MapVote_AddVotable(GetNextMap(), FALSE); + MapVote_AddVotable(GetNextMap(), false); if(mapvote_count == 0) { @@ -182,7 +242,7 @@ void MapVote_Init() ShuffleMaplist(); localcmd("\nmenu_cmd sync\n"); for(i = 0; i < 100 && mapvote_count < nmax; ++i) - MapVote_AddVotable(GetNextMap(), FALSE); + MapVote_AddVotable(GetNextMap(), false); } mapvote_count_real = mapvote_count; @@ -195,16 +255,14 @@ void MapVote_Init() mapvote_timeout = time + autocvar_g_maplist_votable_timeout; if(mapvote_count_real < 3 || mapvote_keeptwotime <= time) mapvote_keeptwotime = 0; - mapvote_message = "Choose a map and press its key!"; MapVote_Spawn(); } -void MapVote_SendPicture(float id) +void MapVote_SendPicture(entity to, int id) { - msg_entity = self; - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_PICTURE); + msg_entity = to; + WriteHeader(MSG_ONE, TE_CSQC_PICTURE); WriteByte(MSG_ONE, id); WritePicture(MSG_ONE, strcat(mapvote_screenshot_dirs[mapvote_maps_screenshot_dir[id]], "/", mapvote_maps[id]), 3072); } @@ -212,15 +270,15 @@ void MapVote_SendPicture(float id) void MapVote_WriteMask() { - float i; if ( mapvote_count < 24 ) { - float mask,power; - mask = 0; - for(i = 0, power = 1; i < mapvote_count; ++i, power *= 2) - if(mapvote_maps_availability[i] == GTV_AVAILABLE ) - mask |= power; - + int mask = 0; + for(int j = 0; j < mapvote_count; ++j) + { + if(mapvote_maps_flags[j] & GTV_AVAILABLE) + mask |= BIT(j); + } + if(mapvote_count < 8) WriteByte(MSG_ENTITY, mask); else if (mapvote_count < 16) @@ -230,19 +288,67 @@ void MapVote_WriteMask() } else { - for ( i = 0; i < mapvote_count; ++i ) - WriteByte(MSG_ENTITY, mapvote_maps_availability[i]); + for (int j = 0; j < mapvote_count; ++j) + WriteByte(MSG_ENTITY, mapvote_maps_flags[j]); } } -float MapVote_SendEntity(entity to, float sf) +/* + * Sends a single map vote option to the client + */ +void MapVote_SendOption(int i) +{ + // abstain + if(mapvote_abstain && i == mapvote_count - 1) + { + WriteString(MSG_ENTITY, ""); // abstain needs no text + WriteString(MSG_ENTITY, ""); // abstain needs no pack + WriteByte(MSG_ENTITY, 0); // abstain needs no screenshot dir + } + else + { + WriteString(MSG_ENTITY, mapvote_maps[i]); + WriteString(MSG_ENTITY, mapvote_maps_pakfile[i]); + WriteByte(MSG_ENTITY, mapvote_maps_screenshot_dir[i]); + } +} + +/* + * Sends a single gametype vote option to the client + */ +void GameTypeVote_SendOption(int i) +{ + // abstain + if(mapvote_abstain && i == mapvote_count - 1) + { + WriteString(MSG_ENTITY, ""); // abstain needs no text + WriteByte(MSG_ENTITY, GTV_AVAILABLE); + } + else + { + string type_name = mapvote_maps[i]; + WriteString(MSG_ENTITY, type_name); + WriteByte(MSG_ENTITY, mapvote_maps_flags[i]); + if ( mapvote_maps_flags[i] & GTV_CUSTOM ) + { + WriteString(MSG_ENTITY, cvar_string( + strcat("sv_vote_gametype_",type_name,"_name"))); + WriteString(MSG_ENTITY, cvar_string( + strcat("sv_vote_gametype_",type_name,"_description"))); + WriteString(MSG_ENTITY, cvar_string( + strcat("sv_vote_gametype_",type_name,"_type"))); + } + } +} + +bool MapVote_SendEntity(entity this, entity to, int sf) { float i; if(sf & 1) sf &= ~2; // if we send 1, we don't need to also send 2 - WriteByte(MSG_ENTITY, ENT_CLIENT_MAPVOTE); + WriteHeader(MSG_ENTITY, ENT_CLIENT_MAPVOTE); WriteByte(MSG_ENTITY, sf); if(sf & 1) @@ -255,7 +361,7 @@ float MapVote_SendEntity(entity to, float sf) WriteByte(MSG_ENTITY, mapvote_abstain); WriteByte(MSG_ENTITY, mapvote_detail); WriteCoord(MSG_ENTITY, mapvote_timeout); - + if ( gametypevote ) { // gametype vote @@ -264,7 +370,7 @@ float MapVote_SendEntity(entity to, float sf) } else if ( autocvar_sv_vote_gametype ) { - // map vote but gametype has been chosen via voting screen + // map vote but gametype has been chosen via voting screen WriteByte(MSG_ENTITY, 2); WriteString(MSG_ENTITY, MapInfo_Type_ToText(MapInfo_CurrentGametype())); } @@ -273,22 +379,13 @@ float MapVote_SendEntity(entity to, float sf) MapVote_WriteMask(); + // Send data for the vote options for(i = 0; i < mapvote_count; ++i) { - if(mapvote_abstain && i == mapvote_count - 1) - { - WriteString(MSG_ENTITY, ""); // abstain needs no text - WriteString(MSG_ENTITY, ""); // abstain needs no pack - WriteByte(MSG_ENTITY, 0); // abstain needs no screenshot dir - WriteByte(MSG_ENTITY, GTV_AVAILABLE); - } + if(gametypevote) + GameTypeVote_SendOption(i); else - { - WriteString(MSG_ENTITY, mapvote_maps[i]); - WriteString(MSG_ENTITY, mapvote_maps_pakfile[i]); - WriteByte(MSG_ENTITY, mapvote_maps_screenshot_dir[i]); - WriteByte(MSG_ENTITY, mapvote_maps_availability[i]); - } + MapVote_SendOption(i); } } @@ -302,18 +399,18 @@ float MapVote_SendEntity(entity to, float sf) { if(mapvote_detail) for(i = 0; i < mapvote_count; ++i) - if ( mapvote_maps_availability[i] == GTV_AVAILABLE ) + if ( mapvote_maps_flags[i] & GTV_AVAILABLE ) WriteByte(MSG_ENTITY, mapvote_selections[i]); WriteByte(MSG_ENTITY, to.mapvote); } - return TRUE; + return true; } void MapVote_Spawn() { - Net_LinkEntity(mapvote_ent = spawn(), FALSE, 0, MapVote_SendEntity); + Net_LinkEntity(mapvote_ent = spawn(), false, 0, MapVote_SendEntity); } void MapVote_TouchMask() @@ -329,7 +426,7 @@ void MapVote_TouchVotes(entity voter) float MapVote_Finished(float mappos) { if(alreadychangedlevel) - return FALSE; + return false; string result; float i; @@ -341,7 +438,7 @@ float MapVote_Finished(float mappos) result = strcat(result, ":", ftos(mapvote_selections[mappos]), "::"); didntvote = mapvote_voters; for(i = 0; i < mapvote_count; ++i) - if(mapvote_maps_availability[i] == GTV_AVAILABLE ) + if(mapvote_maps_flags[i] & GTV_AVAILABLE ) { didntvote -= mapvote_selections[i]; if(i != mappos) @@ -357,56 +454,52 @@ float MapVote_Finished(float mappos) GameLogEcho(strcat(":vote:suggestion_accepted:", mapvote_maps[mappos])); } - FOR_EACH_REALCLIENT(other) - FixClientCvars(other); + FOREACH_CLIENT(IS_REAL_CLIENT(it), LAMBDA(FixClientCvars(it))); if(gametypevote) { if ( GameTypeVote_Finished(mappos) ) { - gametypevote = FALSE; + gametypevote = false; if(autocvar_nextmap != "") { Map_Goto_SetStr(autocvar_nextmap); Map_Goto(0); - alreadychangedlevel = TRUE; - return TRUE; + alreadychangedlevel = true; + return true; } else MapVote_Init(); } - return FALSE; + return false; } - + Map_Goto_SetStr(mapvote_maps[mappos]); Map_Goto(0); - alreadychangedlevel = TRUE; - - return TRUE; + alreadychangedlevel = true; + + return true; } void MapVote_CheckRules_1() { - float i; - - for(i = 0; i < mapvote_count; ++i) - if( mapvote_maps_availability[i] == GTV_AVAILABLE ) + for (int i = 0; i < mapvote_count; ++i) + if (mapvote_maps_flags[i] & GTV_AVAILABLE) { //dprint("Map ", ftos(i), ": "); dprint(mapvote_maps[i], "\n"); mapvote_selections[i] = 0; } mapvote_voters = 0; - FOR_EACH_REALCLIENT(other) - { + FOREACH_CLIENT(IS_REAL_CLIENT(it), { ++mapvote_voters; - if(other.mapvote) + if (it.mapvote) { - i = other.mapvote - 1; - //dprint("Player ", other.netname, " vote = ", ftos(other.mapvote - 1), "\n"); - mapvote_selections[i] = mapvote_selections[i] + 1; + int idx = it.mapvote - 1; + //dprint("Player ", it.netname, " vote = ", ftos(idx), "\n"); + ++mapvote_selections[idx]; } - } + }); } float MapVote_CheckRules_2() @@ -427,10 +520,10 @@ float MapVote_CheckRules_2() RandomSelection_Init(); currentPlace = 0; currentVotes = -1; - for(i = 0; i < mapvote_count_real; ++i) - if ( mapvote_maps_availability[i] == GTV_AVAILABLE ) + for(i = 0; i < mapvote_count_real; ++i) + if ( mapvote_maps_flags[i] & GTV_AVAILABLE ) { - RandomSelection_Add(world, i, string_null, 1, mapvote_selections[i]); + RandomSelection_AddFloat(i, 1, mapvote_selections[i]); if ( gametypevote && mapvote_maps[i] == MapInfo_Type_ToString(MapInfo_CurrentGametype()) ) { currentVotes = mapvote_selections[i]; @@ -442,15 +535,15 @@ float MapVote_CheckRules_2() firstPlace = currentPlace; else firstPlace = RandomSelection_chosen_float; - + //dprint("First place: ", ftos(firstPlace), "\n"); //dprint("First place votes: ", ftos(firstPlaceVotes), "\n"); RandomSelection_Init(); for(i = 0; i < mapvote_count_real; ++i) if(i != firstPlace) - if ( mapvote_maps_availability[i] == GTV_AVAILABLE ) - RandomSelection_Add(world, i, string_null, 1, mapvote_selections[i]); + if ( mapvote_maps_flags[i] & GTV_AVAILABLE ) + RandomSelection_AddFloat(i, 1, mapvote_selections[i]); secondPlace = RandomSelection_chosen_float; secondPlaceVotes = RandomSelection_best_priority; //dprint("Second place: ", ftos(secondPlace), "\n"); @@ -467,7 +560,6 @@ float MapVote_CheckRules_2() { float didntvote; MapVote_TouchMask(); - mapvote_message = "Now decide between the TOP TWO!"; mapvote_keeptwotime = 0; result = strcat(":vote:keeptwo:", mapvote_maps[firstPlace]); result = strcat(result, ":", ftos(firstPlaceVotes)); @@ -484,7 +576,7 @@ float MapVote_CheckRules_2() result = strcat(result, ":", ftos(mapvote_selections[i])); if(i < mapvote_count_real) { - mapvote_maps_availability[i] = GTV_FORBIDDEN; + mapvote_maps_flags[i] &= ~GTV_AVAILABLE; } } } @@ -493,66 +585,60 @@ float MapVote_CheckRules_2() GameLogEcho(result); } - return FALSE; + return false; } void MapVote_Tick() { - float keeptwo; float totalvotes; - keeptwo = mapvote_keeptwotime; MapVote_CheckRules_1(); // count if(MapVote_CheckRules_2()) // decide return; totalvotes = 0; - FOR_EACH_REALCLIENT(other) - { + FOREACH_CLIENT(IS_REAL_CLIENT(it), LAMBDA( // hide scoreboard again - if(other.health != 2342) + if(it.health != 2342) { - other.health = 2342; - other.impulse = 0; - if(IS_REAL_CLIENT(other)) - { - msg_entity = other; - WriteByte(MSG_ONE, SVC_FINALE); - WriteString(MSG_ONE, ""); - } + it.health = 2342; + it.impulse = 0; + + msg_entity = it; + WriteByte(MSG_ONE, SVC_FINALE); + WriteString(MSG_ONE, ""); } // clear possibly invalid votes - if ( mapvote_maps_availability[other.mapvote-1] != GTV_AVAILABLE ) - other.mapvote = 0; + if ( !(mapvote_maps_flags[it.mapvote-1] & GTV_AVAILABLE) ) + it.mapvote = 0; // use impulses as new vote - if(other.impulse >= 1 && other.impulse <= mapvote_count) - if( mapvote_maps_availability[other.impulse - 1] == GTV_AVAILABLE ) + if(it.impulse >= 1 && it.impulse <= mapvote_count) + if( mapvote_maps_flags[it.impulse - 1] & GTV_AVAILABLE ) { - other.mapvote = other.impulse; - MapVote_TouchVotes(other); + it.mapvote = it.impulse; + MapVote_TouchVotes(it); } - other.impulse = 0; + it.impulse = 0; - if(other.mapvote) + if(it.mapvote) ++totalvotes; - } + )); MapVote_CheckRules_1(); // just count } void MapVote_Start() { - if(mapvote_run) - return; + // if mapvote is already running, don't do this initialization again + if(mapvote_run) { return; } - // wait for stats to be sent first - if(!playerstats_waitforme) - return; + // don't start mapvote until after playerstats gamereport is sent + if(PlayerStats_GameReport_DelayMapVote) { return; } MapInfo_Enumerate(); if(MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1)) - mapvote_run = TRUE; + mapvote_run = true; } void MapVote_Think() @@ -591,7 +677,7 @@ void MapVote_Think() cvar_set("rescan_pending", "0"); } - mapvote_initialized = TRUE; + mapvote_initialized = true; if(DoNextMapOverride(0)) return; if(!autocvar_g_maplist_votable || player_count <= 0) @@ -599,7 +685,7 @@ void MapVote_Think() GotoNextMap(0); return; } - + if(autocvar_sv_vote_gametype) { GameTypeVote_Start(); } else if(autocvar_nextmap == "") { MapVote_Init(); } } @@ -607,12 +693,12 @@ void MapVote_Think() MapVote_Tick(); } -float GameTypeVote_SetGametype(float type) +float GameTypeVote_SetGametype(Gametype type) { if (MapInfo_CurrentGametype() == type) - return TRUE; - - float tsave = MapInfo_CurrentGametype(); + return true; + + Gametype tsave = MapInfo_CurrentGametype(); MapInfo_SwitchGameType(type); @@ -630,7 +716,7 @@ float GameTypeVote_SetGametype(float type) bprint("Cannot use this game type: no map for it found\n"); MapInfo_SwitchGameType(tsave); MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0); - return FALSE; + return false; } //localcmd("gametype ", MapInfo_Type_ToString(type), "\n"); @@ -639,48 +725,48 @@ float GameTypeVote_SetGametype(float type) if(autocvar_g_maplist_shuffle) ShuffleMaplist(); - return TRUE; + return true; } float gametypevote_finished; float GameTypeVote_Finished(float pos) { if(!gametypevote || gametypevote_finished) - return FALSE; - - if ( !GameTypeVote_SetGametype(MapInfo_Type_FromString(mapvote_maps[pos])) ) + return false; + + if ( !GameTypeVote_SetGametype(GameTypeVote_Type_FromString(mapvote_maps[pos])) ) { - dprint("Selected gametype is not supported by any map"); + LOG_TRACE("Selected gametype is not supported by any map"); } - + localcmd("sv_vote_gametype_hook_all\n"); localcmd("sv_vote_gametype_hook_", mapvote_maps[pos], "\n"); - - gametypevote_finished = TRUE; - - return TRUE; + + gametypevote_finished = true; + + return true; } float GameTypeVote_AddVotable(string nextMode) { float j; - if ( nextMode == "" || MapInfo_Type_FromString(nextMode) == 0 ) - return FALSE; + if ( nextMode == "" || GameTypeVote_Type_FromString(nextMode) == NULL ) + return false; for(j = 0; j < mapvote_count; ++j) if(mapvote_maps[j] == nextMode) - return FALSE; - + return false; + mapvote_maps[mapvote_count] = strzone(nextMode); - mapvote_maps_suggested[mapvote_count] = FALSE; + mapvote_maps_suggested[mapvote_count] = false; mapvote_maps_screenshot_dir[mapvote_count] = 0; mapvote_maps_pakfile[mapvote_count] = strzone(""); - mapvote_maps_availability[mapvote_count] = GameTypeVote_AvailabilityStatus(nextMode); + mapvote_maps_flags[mapvote_count] = GameTypeVote_AvailabilityStatus(nextMode); mapvote_count += 1; - - return TRUE; - + + return true; + } float GameTypeVote_Start() @@ -688,22 +774,22 @@ float GameTypeVote_Start() float j; MapVote_ClearAllVotes(); MapVote_UnzoneStrings(); - + mapvote_count = 0; mapvote_timeout = time + autocvar_sv_vote_gametype_timeout; mapvote_abstain = 0; mapvote_detail = !autocvar_g_maplist_votable_nodetail; - + float n = tokenizebyseparator(autocvar_sv_vote_gametype_options, " "); n = min(MAPVOTE_COUNT, n); - + float really_available, which_available; really_available = 0; which_available = -1; for(j = 0; j < n; ++j) { if ( GameTypeVote_AddVotable(argv(j)) ) - if ( mapvote_maps_availability[j] == GTV_AVAILABLE ) + if ( mapvote_maps_flags[j] & GTV_AVAILABLE ) { really_available++; which_available = j; @@ -711,9 +797,9 @@ float GameTypeVote_Start() } mapvote_count_real = mapvote_count; - + gametypevote = 1; - + if ( really_available == 0 ) { if ( mapvote_count > 0 ) @@ -721,22 +807,22 @@ float GameTypeVote_Start() mapvote_maps[0] = strzone(MapInfo_Type_ToString(MapInfo_CurrentGametype())); //GameTypeVote_Finished(0); MapVote_Finished(0); - return FALSE; + return false; } if ( really_available == 1 ) { //GameTypeVote_Finished(which_available); MapVote_Finished(which_available); - return FALSE; + return false; } - + mapvote_count_real = mapvote_count; mapvote_keeptwotime = time + autocvar_sv_vote_gametype_keeptwotime; if(mapvote_count_real < 3 || mapvote_keeptwotime <= time) mapvote_keeptwotime = 0; - + MapVote_Spawn(); - - return TRUE; + + return true; }