]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mapvoting.qc
Use the constants for player hitbox size when applicable (should fix observer hitbox)
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mapvoting.qc
index ed17d86e8e2a26ddc97cf47bde011cbc65649766..b5a6014462ea141adf7379172adf8fb9a853cd2c 100644 (file)
@@ -4,6 +4,7 @@
 #include "command/cmd.qh"
 #include "command/getreplies.qh"
 #include "../common/constants.qh"
+#include <common/net_linked.qh>
 #include "../common/mapinfo.qh"
 #include "../common/playerstats.qh"
 #include "../common/util.qh"
@@ -14,7 +15,6 @@
 float mapvote_nextthink;
 float mapvote_keeptwotime;
 float mapvote_timeout;
-string mapvote_message;
 const float MAPVOTE_SCREENSHOT_DIRS_COUNT = 4;
 string mapvote_screenshot_dirs[MAPVOTE_SCREENSHOT_DIRS_COUNT];
 float mapvote_screenshot_dirs_count;
@@ -41,10 +41,10 @@ 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
  */
-float GameTypeVote_Type_FromString(string type_name)
+Gametype GameTypeVote_Type_FromString(string type_name)
 {
-       float type = MapInfo_Type_FromString(type_name);
-       if ( type == 0 )
+       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;
@@ -54,22 +54,22 @@ int GameTypeVote_AvailabilityStatus(string type_name)
 {
        int flag = GTV_FORBIDDEN;
 
-       float type = MapInfo_Type_FromString(type_name);
-       if ( type == 0 )
+       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 == 0 )
+       if( type == NULL )
                return flag;
 
        if ( autocvar_nextmap != "" )
        {
-               if ( !MapInfo_Get_ByName(autocvar_nextmap, false, 0) )
+               if ( !MapInfo_Get_ByName(autocvar_nextmap, false, NULL) )
                        return flag;
-               if (!(MapInfo_Map_supportedGametypes & type))
+               if (!(MapInfo_Map_supportedGametypes & type.m_flags))
                        return flag;
        }
 
@@ -83,7 +83,7 @@ float GameTypeVote_GetMask()
        n = min(MAPVOTE_COUNT, n);
        gametype_mask = 0;
        for(j = 0; j < n; ++j)
-               gametype_mask |= GameTypeVote_Type_FromString(argv(j));
+               gametype_mask |= GameTypeVote_Type_FromString(argv(j)).m_flags;
        return gametype_mask;
 }
 
@@ -92,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()
@@ -121,8 +120,8 @@ void MapVote_UnzoneStrings()
        }
 }
 
-string MapVote_Suggest(string m)
-{SELFPARAM();
+string MapVote_Suggest(entity this, string m)
+{
        float i;
        if(m == "")
                return "That's not how to use this command.";
@@ -157,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.");
 }
 
@@ -192,7 +191,7 @@ 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;
@@ -256,14 +255,13 @@ 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)
-{SELFPARAM();
-       msg_entity = self;
+void MapVote_SendPicture(entity to, int id)
+{
+       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);
@@ -272,14 +270,14 @@ 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_flags[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);
@@ -290,8 +288,8 @@ void MapVote_WriteMask()
        }
        else
        {
-               for ( i = 0; i < mapvote_count; ++i )
-                       WriteByte(MSG_ENTITY, mapvote_maps_flags[i]);
+               for (int j = 0; j < mapvote_count; ++j)
+                       WriteByte(MSG_ENTITY, mapvote_maps_flags[j]);
        }
 }
 
@@ -337,6 +335,8 @@ void GameTypeVote_SendOption(int i)
                                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")));
                }
        }
 }
@@ -454,8 +454,7 @@ 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)
        {
@@ -484,26 +483,23 @@ float MapVote_Finished(float mappos)
 
 void MapVote_CheckRules_1()
 {
-       float i;
-
-       for(i = 0; i < mapvote_count; ++i)
-               if( mapvote_maps_flags[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()
@@ -527,7 +523,7 @@ float MapVote_CheckRules_2()
        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];
@@ -547,7 +543,7 @@ float MapVote_CheckRules_2()
        for(i = 0; i < mapvote_count_real; ++i)
                if(i != firstPlace)
                if ( mapvote_maps_flags[i] & GTV_AVAILABLE )
-                       RandomSelection_Add(world, i, string_null, 1, mapvote_selections[i]);
+                       RandomSelection_AddFloat(i, 1, mapvote_selections[i]);
        secondPlace = RandomSelection_chosen_float;
        secondPlaceVotes = RandomSelection_best_priority;
        //dprint("Second place: ", ftos(secondPlace), "\n");
@@ -564,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));
@@ -595,45 +590,40 @@ float MapVote_CheckRules_2()
 
 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_flags[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_flags[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
 }
@@ -703,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();
+       Gametype tsave = MapInfo_CurrentGametype();
 
        MapInfo_SwitchGameType(type);
 
@@ -760,7 +750,7 @@ float GameTypeVote_Finished(float pos)
 float GameTypeVote_AddVotable(string nextMode)
 {
        float j;
-       if ( nextMode == "" || GameTypeVote_Type_FromString(nextMode) == 0 )
+       if ( nextMode == "" || GameTypeVote_Type_FromString(nextMode) == NULL )
                return false;
        for(j = 0; j < mapvote_count; ++j)
                if(mapvote_maps[j] == nextMode)