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:
Crystalwarrior 2022-03-20 01:18:27 +03:00 committed by GitHub
parent df1c8ccd83
commit aa2a29f091
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 12 deletions

View File

@ -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;

View File

@ -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#%";