diff --git a/include/aoclient.h b/include/aoclient.h index 6c87fff..039d73a 100644 --- a/include/aoclient.h +++ b/include/aoclient.h @@ -59,6 +59,13 @@ class AOClient : public QObject { QString ooc_name = ""; QString showname = ""; bool global_enabled = true; + struct ClientVersion { + QString string; + int release = -1; + int major = -1; + int minor = -1; + } + ClientVersion version; QMap ACLFlags { {"NONE", 0ULL}, diff --git a/src/packets.cpp b/src/packets.cpp index 669eba2..cc3c67b 100644 --- a/src/packets.cpp +++ b/src/packets.cpp @@ -54,6 +54,30 @@ void AOClient::pktSoftwareId(AreaData* area, int argc, QStringList argv, AOPacke "y_offset" }; + + // Extremely cursed client version string validation + // Ideally version strings should be X.X.X but it can be literally anything + // so we have to be super careful + version->string = argv[1]; + QString version_raw = argv[1].split("."); + bool ok; + int release_version = version_raw[0].toInt(&ok); + if (ok && version_raw.size() >= 1) + version.release = release_version; + if (ok && version_raw.size() >= 2) { + int major_version = version_raw[1].toInt(&ok); + if (ok) + version.major = major_version; + } + if (ok && version_raw.size() >= 3) { + int minor_version = version_raw[2].toInt(&ok); + if (ok) + version.minor = minor_version; + } + + + + sendPacket("PN", {QString::number(server->player_count), max_players}); sendPacket("FL", feature_list); } @@ -456,8 +480,17 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) // self offset offset = incoming_args[17].toString(); - args.append(offset); - args.append(other_offset); + // versions 2.6-2.8 cannot validate y-offset so we send them just the x-offset + if ((version.release == 2) && (version.major == 6 || version.major == 7 || version.major == 8)) { + QString x_offset = offset.split("&")[0]; + args.append(x_offset); + QString other_x_offset = other_offset.split("&")[0]; + args.append(other_x_offset); + } + else { + args.append(offset); + args.append(other_offset); + } args.append(other_flip); // noninterrupting preanim