From ae6a6f7e94d8a1cef10bbffa8f1983e0dcd1c8f8 Mon Sep 17 00:00:00 2001 From: scatterflower Date: Mon, 5 Oct 2020 15:57:30 -0500 Subject: [PATCH] implement pairing and other ic features --- include/aoclient.h | 10 ++++-- src/aoclient.cpp | 8 +++-- src/logger.cpp | 2 +- src/packets.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++-- src/server.cpp | 2 +- 5 files changed, 92 insertions(+), 10 deletions(-) diff --git a/include/aoclient.h b/include/aoclient.h index 8b408c3..fa61788 100644 --- a/include/aoclient.h +++ b/include/aoclient.h @@ -39,9 +39,9 @@ class AOClient : public QObject { ~AOClient(); QString getHwid(); - void setHwid(QString p_hwid); - QString getIpid(); + Server* getServer(); + void setHwid(QString p_hwid); QHostAddress remote_ip; QString password; @@ -51,7 +51,6 @@ class AOClient : public QObject { bool authenticated = false; QString moderator_name = ""; QString ooc_name = ""; - Server* server; QMap ACLFlags { {"NONE", 0ULL}, @@ -71,6 +70,7 @@ class AOClient : public QObject { private: QTcpSocket* socket; + Server* server; enum ARUPType { PLAYER_COUNT, @@ -112,6 +112,10 @@ class AOClient : public QObject { // Packet helper global variables bool last_msg_blankpost = false; int char_id = -1; + int pairing_with = -1; + QString emote = ""; + QString offset = ""; + QString flipping = ""; struct PacketInfo { unsigned long long acl_mask; diff --git a/src/aoclient.cpp b/src/aoclient.cpp index 3cace87..5d2f87d 100644 --- a/src/aoclient.cpp +++ b/src/aoclient.cpp @@ -55,7 +55,7 @@ void AOClient::clientData() void AOClient::clientDisconnected() { - qDebug() << remote_ip.toString() << "disconnected"; + //qDebug() << remote_ip.toString() << "disconnected"; if (joined) { server->player_count--; server->areas[current_area]->player_count--; @@ -70,7 +70,7 @@ void AOClient::clientDisconnected() void AOClient::handlePacket(AOPacket packet) { - // qDebug() << "Received packet:" << packet.header << ":" << packet.contents << "args length:" << packet.contents.length(); + qDebug() << "Received packet:" << packet.header << ":" << packet.contents << "args length:" << packet.contents.length(); AreaData* area = server->areas[current_area]; PacketInfo info = packets.value(packet.header, {false, 0, &AOClient::pktDefault}); @@ -174,7 +174,7 @@ void AOClient::fullArup() { void AOClient::sendPacket(AOPacket packet) { - // qDebug() << "Sent packet:" << packet.header << ":" << packet.contents; + qDebug() << "Sent packet:" << packet.header << ":" << packet.contents; socket->write(packet.toUtf8()); socket->flush(); } @@ -241,6 +241,8 @@ bool AOClient::checkAuth(unsigned long long acl_mask) QString AOClient::getIpid() { return ipid; } +Server* AOClient::getServer() { return server; }; + AOClient::~AOClient() { socket->deleteLater(); } diff --git a/src/logger.cpp b/src/logger.cpp index 125c1e4..7a0f483 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -25,7 +25,7 @@ Logger::Logger(int p_max_length) void Logger::logIC(AOClient *client, AOPacket *packet) { QString time = QDateTime::currentDateTime().toString("ddd MMMM d yyyy | hh:mm:ss"); - QString area_name = client->server->area_names.value(client->current_area); + QString area_name = client->getServer()->area_names.value(client->current_area); QString char_name = client->current_char; QString ipid = client->getIpid(); QString message = packet->contents[4]; diff --git a/src/packets.cpp b/src/packets.cpp index 7d7b8d6..cbad1d4 100644 --- a/src/packets.cpp +++ b/src/packets.cpp @@ -290,7 +290,8 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) args.append(incoming_args[2].toString()); // emote - args.append(incoming_args[3].toString()); + emote = incoming_args[3].toString(); + args.append(emote); // message text QString incoming_msg = incoming_args[4].toString().trimmed(); @@ -359,7 +360,8 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) int flip = incoming_args[12].toInt(); if (flip != 0 && flip != 1) return invalid; - args.append(QString::number(flip)); + flipping = QString::number(flip); + args.append(flipping); // realization int realization = incoming_args[13].toInt(); @@ -375,13 +377,87 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) // 2.6 packet extensions if (incoming_args.length() > 15) { + // showname + args.append(incoming_args[15].toString()); + // other char id + // things get a bit hairy here + // don't ask me how this works, because i don't know either + QStringList pair_data = incoming_args[16].toString().split("^"); + pairing_with = pair_data[0].toInt(); + QString front_back = ""; + if (pair_data.length() > 1) + front_back = "^" + pair_data[1]; + int other_charid = pairing_with; + bool pairing = false; + QString other_name = "0"; + QString other_emote = "0"; + QString other_offset = "0"; + QString other_flip = "0"; + for (AOClient* client : server->clients) { + if (client->pairing_with == char_id && other_charid != char_id && client->char_id == pairing_with) { + other_name = server->characters.at(other_charid); + other_emote = client->emote; + other_offset = client->offset; + other_flip = client->flipping; + pairing = true; + } + } + if (!pairing) { + other_charid = -1; + front_back = ""; + } + args.append(QString::number(other_charid) + front_back); + args.append(other_name); + args.append(other_emote); + + // self offset + offset = incoming_args[17].toString(); + args.append(offset); + args.append(other_offset); + args.append(other_flip); + + // noninterrupting preanim + int ni_pa = incoming_args[18].toInt(); + if (ni_pa != 1 && ni_pa != 0) + return invalid; + args.append(QString::number(ni_pa)); } // 2.8 packet extensions if (incoming_args.length() > 19) { + // sfx looping + int sfx_loop = incoming_args[19].toInt(); + if (sfx_loop != 0 && sfx_loop != 1) + return invalid; + args.append(QString::number(sfx_loop)); + // screenshake + int screenshake = incoming_args[20].toInt(); + if (screenshake != 0 && screenshake != 1) + return invalid; + args.append(QString::number(screenshake)); + + // frames shake + args.append(incoming_args[21].toString()); + + // frames realization + args.append(incoming_args[22].toString()); + + // frames sfx + args.append(incoming_args[23].toString()); + + // additive + int additive = incoming_args[24].toInt(); + if (additive != 0 && additive != 1) + return invalid; + args.append(QString::number(additive)); + + // effect + args.append(incoming_args[25].toString()); } + qDebug() << args.length(); + return AOPacket("MS", args); } diff --git a/src/server.cpp b/src/server.cpp index 74f175f..65a8dbc 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -109,7 +109,7 @@ void Server::clientConnected() // completely in any client 2.4.3 or newer client->sendPacket(decryptor); - qDebug() << client->remote_ip.toString() << "connected"; + //qDebug() << client->remote_ip.toString() << "connected"; } void Server::updateCharsTaken(AreaData* area)