]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/minigames/minigame/pong.qc
Merge branch 'terencehill/minigame_flood_control' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / minigames / minigame / pong.qc
index 30bdd80665ff739f8e97daa4f6c640db8efc233a..b6c0988c7d5682c9871dc60dd25c47ead69fd9e6 100644 (file)
@@ -18,6 +18,7 @@ const int PONG_KEY_BOTH     = 0x03; // Player jamming keys at ramdom
 
 // fields
 const int PONG_MAX_PLAYERS = 4;
+const int PONG_SPECTATOR_TEAM = 255; // must be above max teams and equal to or below 255
 .int    pong_score;                    // (minigame_player) number of goals
 .int    pong_keys;                     // (client) pressed keys
 .entity pong_paddles[PONG_MAX_PLAYERS];// (minigame) paddles
@@ -161,7 +162,7 @@ void pong_ball_think(entity this)
        this.SendFlags |= MINIG_SF_UPDATE;
 
        int i;
-       for ( i = 1; i <= PONG_MAX_PLAYERS; i++ )
+       for ( i = 1; i <= PONG_MAX_PLAYERS; ++i )
                if ( pong_paddle_hit(this, i) )
                {
                        pong_paddle_bounce(this,i);
@@ -352,11 +353,11 @@ int pong_server_event(entity minigame, string event, ...)
                {
                        // Don't allow joining a match that is already running
                        if ( minigame.minigame_flags & PONG_STATUS_PLAY )
-                               return false;
+                               return PONG_SPECTATOR_TEAM;
 
                        entity player = ...(0,entity);
                        int i;
-                       for ( i = 0; i < PONG_MAX_PLAYERS; i++ )
+                       for ( i = 0; i < PONG_MAX_PLAYERS; ++i )
                        {
                                if ( minigame.pong_paddles[i] == NULL )
                                {
@@ -365,7 +366,7 @@ int pong_server_event(entity minigame, string event, ...)
                                }
                        }
 
-                       return false;
+                       return PONG_SPECTATOR_TEAM;
                }
                case "part":
                {
@@ -373,7 +374,7 @@ int pong_server_event(entity minigame, string event, ...)
                        entity paddle;
                        entity ai;
                        int i;
-                       for ( i = 0; i < PONG_MAX_PLAYERS; i++ )
+                       for ( i = 0; i < PONG_MAX_PLAYERS; ++i )
                        {
                                paddle = minigame.pong_paddles[i];
                                if ( paddle != NULL && paddle.realowner == player )
@@ -389,9 +390,12 @@ int pong_server_event(entity minigame, string event, ...)
                case "cmd":
                {
                        entity player = ...(0,entity);
+                       bool event_blocked = (player.team == PONG_SPECTATOR_TEAM);
                        switch(argv(0))
                        {
                                case "throw":
+                                       if(event_blocked)
+                                               return true;
                                        if ( minigame.minigame_flags & PONG_STATUS_WAIT )
                                        {
                                                minigame.minigame_flags = PONG_STATUS_PLAY |
@@ -399,7 +403,7 @@ int pong_server_event(entity minigame, string event, ...)
                                                minigame.SendFlags |= MINIG_SF_UPDATE;
 
                                                entity ball;
-                                               for ( int j = 0; j < autocvar_sv_minigames_pong_ball_number; j++ )
+                                               for ( int j = 0; j < autocvar_sv_minigames_pong_ball_number; ++j )
                                                {
                                                        ball = msle_spawn(minigame,new(pong_ball));
                                                        ball.pong_length = autocvar_sv_minigames_pong_ball_radius;
@@ -410,29 +414,41 @@ int pong_server_event(entity minigame, string event, ...)
                                        }
                                        return true;
                                case "+movei":
+                                       if(event_blocked)
+                                               return true;
                                        player.pong_keys |= PONG_KEY_INCREASE;
                                        return true;
                                case "+moved":
+                                       if(event_blocked)
+                                               return true;
                                        player.pong_keys |= PONG_KEY_DECREASE;
                                        return true;
                                case "-movei":
+                                       if(event_blocked)
+                                               return true;
                                        player.pong_keys &= ~PONG_KEY_INCREASE;
                                        return true;
                                case "-moved":
+                                       if(event_blocked)
+                                               return true;
                                        player.pong_keys &= ~PONG_KEY_DECREASE;
                                        return true;
                                case "move":
+                                       if(event_blocked)
+                                               return true;
                                        if(argv(1))
                                                player.pong_keys = stoi(argv(1));
                                        return true;
                                case "pong_aimore":
                                {
+                                       if(event_blocked)
+                                               return true;
                                        // keep declaration here, moving it into for() reverses weapon order
                                        // potentially compiler bug
                                        int j;
                                        if ( minigame.minigame_flags & PONG_STATUS_WAIT )
-                                               for ( j = 0; j < PONG_MAX_PLAYERS; j++ )
-                                               //for ( int j = 0; j < PONG_MAX_PLAYERS; j++ )
+                                               for ( j = 0; j < PONG_MAX_PLAYERS; ++j )
+                                               //for ( int j = 0; j < PONG_MAX_PLAYERS; ++j )
                                                {
                                                        if ( minigame.pong_paddles[j] == NULL )
                                                        {
@@ -445,10 +461,12 @@ int pong_server_event(entity minigame, string event, ...)
                                }
                                case "pong_ailess":
                                {
+                                       if(event_blocked)
+                                               return true;
                                        if ( minigame.minigame_flags & PONG_STATUS_WAIT )
                                        {
                                                entity paddle;
-                                               for ( int j = PONG_MAX_PLAYERS-1; j >= 0; j-- )
+                                               for ( int j = PONG_MAX_PLAYERS-1; j >= 0; --j )
                                                {
                                                        paddle = minigame.pong_paddles[j];
                                                        if ( paddle != NULL &&
@@ -557,6 +575,8 @@ void pong_hud_board(vector pos, vector mySize)
 
                }
        }
+
+       minigame_show_allspecs(pos, mySize);
 }
 
 // Required function, draw the game status panel
@@ -578,12 +598,12 @@ void pong_hud_status(vector pos, vector mySize)
        entity e;
        FOREACH_MINIGAME_ENTITY(e)
        {
-               if ( e.classname == "minigame_player" || e.classname == "pong_ai" )
+               if ( (e.classname == "minigame_player" || e.classname == "pong_ai") && e.team != PONG_SPECTATOR_TEAM )
                {
                        mypos = pos;
                        mypos_y  += (e.team-1) * (player_fontsize_y + ts_y);
 
-                       drawfill(mypos, ts, pong_team_to_color(e.team), 0.25, DRAWFLAG_ADDITIVE);
+                       drawfill(mypos, ts, pong_team_to_color(e.team), 0.25 * panel_fg_alpha, DRAWFLAG_ADDITIVE);
 
                        minigame_drawcolorcodedstring_trunc(mySize_x,mypos,
                                (e.minigame_playerslot ? entcs_GetName(e.minigame_playerslot-1) : _("AI")),
@@ -602,7 +622,9 @@ void pong_hud_status(vector pos, vector mySize)
 string pong_message(int mgflags)
 {
        string rmessage = "";
-       if (mgflags & PONG_STATUS_WAIT)
+       if(minigame_self.team == PONG_SPECTATOR_TEAM)
+               rmessage = _("You are spectating");
+       else if (mgflags & PONG_STATUS_WAIT)
                rmessage = _("Press ^1Start Match^7 to start the match with the current players");
        return rmessage;
 }
@@ -621,7 +643,7 @@ int pong_client_event(entity minigame, string event, ...)
                }
                case "key_pressed":
                case "key_released":
-                       if ((minigame.minigame_flags & PONG_STATUS_PLAY))
+                       if ((minigame.minigame_flags & PONG_STATUS_PLAY) && minigame_self.team != PONG_SPECTATOR_TEAM)
                                switch ( ...(0,int) )
                                {
                                        case K_UPARROW:
@@ -683,7 +705,7 @@ int pong_client_event(entity minigame, string event, ...)
                case "menu_click":
                {
                        string cmd = ...(0,string);
-                       if( cmd == "pong_throw" && minigame.minigame_flags & PONG_STATUS_WAIT )
+                       if( cmd == "pong_throw" && ( minigame.minigame_flags & PONG_STATUS_WAIT ) )
                        {
                                minigame_cmd("throw");
                        }