Fix demoserver max_wait skips happening even when they're not supposed to (#680)
* Fix demoserver max_wait logic being absolutely bonkers, causing random skips that make no sense actually comment this piece of code * Add /debug command to demos which allows you to see the remaining time for each packet, allowing you to visualize wait packets. Co-authored-by: oldmud0 <oldmud0@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									df1c8ccd83
								
							
						
					
					
						commit
						aa2a29f091
					
				@ -31,6 +31,7 @@ private:
 | 
			
		||||
    QTcpSocket* client_sock = nullptr;
 | 
			
		||||
    bool client_connected = false;
 | 
			
		||||
    bool partial_packet = false;
 | 
			
		||||
    bool debug_mode = false;
 | 
			
		||||
    QString temp_packet = "";
 | 
			
		||||
    QQueue<QString> demo_data;
 | 
			
		||||
    QString sc_packet;
 | 
			
		||||
 | 
			
		||||
@ -233,9 +233,39 @@ void DemoServer::handle_packet(AOPacket packet)
 | 
			
		||||
            QString packet = "CT#DEMO#" + tr("min_wait is deprecated. Use the client Settings for minimum wait instead!") + "#1#%";
 | 
			
		||||
            client_sock->write(packet.toUtf8());
 | 
			
		||||
        }
 | 
			
		||||
        else if (contents[1].startsWith("/debug"))
 | 
			
		||||
        {
 | 
			
		||||
            QStringList args = contents[1].split(" ");
 | 
			
		||||
            if (args.size() > 1)
 | 
			
		||||
            {
 | 
			
		||||
              bool ok;
 | 
			
		||||
              int toggle = args.at(1).toInt(&ok);
 | 
			
		||||
              if (ok && (toggle == 0 || toggle == 1)) {
 | 
			
		||||
                debug_mode = toggle == 1;
 | 
			
		||||
                QString packet = "CT#DEMO#" + tr("Setting debug mode to %1").arg(static_cast<int>(debug_mode)) + "#1#%";
 | 
			
		||||
                client_sock->write(packet.toUtf8());
 | 
			
		||||
                // Debug mode disabled?
 | 
			
		||||
                if (!debug_mode) {
 | 
			
		||||
                  // Reset the timer
 | 
			
		||||
                  client_sock->write("TI#4#1#0#%");
 | 
			
		||||
                  client_sock->write("TI#4#3#0#%");
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
              else
 | 
			
		||||
              {
 | 
			
		||||
                QString packet = "CT#DEMO#" + tr("Valid values are 1 or 0!") + "#1#%";
 | 
			
		||||
                client_sock->write(packet.toUtf8());
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
              QString packet = "CT#DEMO#" + tr("Set debug mode using /debug 1 to enable, and /debug 0 to disable, which will use the fifth timer (TI#4) to show the remaining time until next demo line.") + "#1#%";
 | 
			
		||||
              client_sock->write(packet.toUtf8());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else if (contents[1].startsWith("/help"))
 | 
			
		||||
        {
 | 
			
		||||
            QString packet = "CT#DEMO#" + tr("Available commands:\nload, reload, play, pause, max_wait, help") + "#1#%";
 | 
			
		||||
            QString packet = "CT#DEMO#" + tr("Available commands:\nload, reload, play, pause, max_wait, debug, help") + "#1#%";
 | 
			
		||||
            client_sock->write(packet.toUtf8());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -321,8 +351,8 @@ void DemoServer::reset_state()
 | 
			
		||||
    client_sock->write("LE##%");
 | 
			
		||||
 | 
			
		||||
    // Reset timers
 | 
			
		||||
    client_sock->write("TI#0#3#0#%");
 | 
			
		||||
    client_sock->write("TI#0#1#0#%");
 | 
			
		||||
    client_sock->write("TI#0#3#0#%");
 | 
			
		||||
    client_sock->write("TI#1#1#0#%");
 | 
			
		||||
    client_sock->write("TI#1#3#0#%");
 | 
			
		||||
    client_sock->write("TI#2#1#0#%");
 | 
			
		||||
@ -359,19 +389,25 @@ void DemoServer::playback()
 | 
			
		||||
        AOPacket wait_packet = AOPacket(current_packet);
 | 
			
		||||
 | 
			
		||||
        int duration = wait_packet.get_contents().at(0).toInt();
 | 
			
		||||
        if (max_wait != -1) {
 | 
			
		||||
          if (duration + elapsed_time > max_wait) {
 | 
			
		||||
            duration = qMax(0, max_wait - elapsed_time);
 | 
			
		||||
            // Skip the difference on the timers
 | 
			
		||||
            emit skip_timers(wait_packet.get_contents().at(0).toInt() - duration);
 | 
			
		||||
          }
 | 
			
		||||
          else if (timer->interval() != 0 && duration + elapsed_time > timer->interval()) {
 | 
			
		||||
              duration = qMax(0, timer->interval() - elapsed_time);
 | 
			
		||||
              emit skip_timers(wait_packet.get_contents().at(0).toInt() - duration);
 | 
			
		||||
          }
 | 
			
		||||
        // Max wait reached
 | 
			
		||||
        if (max_wait != -1 && duration + elapsed_time > max_wait) {
 | 
			
		||||
          duration = qMax(0, max_wait - elapsed_time);
 | 
			
		||||
          qDebug() << "Max_wait of " << max_wait << " reached. Forcing duration to " << duration << "ms";
 | 
			
		||||
          // Skip the difference on the timers
 | 
			
		||||
          emit skip_timers(wait_packet.get_contents().at(0).toInt() - duration);
 | 
			
		||||
        }
 | 
			
		||||
        // Manual user skip, such as with >
 | 
			
		||||
        else if (timer->remainingTime() > 0) {
 | 
			
		||||
          qDebug() << "Timer of interval " << timer->interval() << " is being skipped. Forcing to skip " << timer->remainingTime() << "ms on TI# clocks";
 | 
			
		||||
          emit skip_timers(timer->remainingTime());
 | 
			
		||||
        }
 | 
			
		||||
        elapsed_time += duration;
 | 
			
		||||
        timer->start(duration);
 | 
			
		||||
        if (debug_mode) {
 | 
			
		||||
          client_sock->write("TI#4#2#%");
 | 
			
		||||
          QString debug_timer = "TI#4#0#" + QString::number(duration) + "#%";
 | 
			
		||||
          client_sock->write(debug_timer.toUtf8());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      QString end_packet = "CT#DEMO#" + tr("Reached the end of the demo file. Send /play or > in OOC to restart, or /load to open a new file.") + "#1#%";
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user