Merge branch 'less_insane_debugging' into 'master'
Less insane debugging See merge request AttorneyOnline/AO2-Client!75
This commit is contained in:
commit
2a5d569511
@ -22,6 +22,7 @@
|
|||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
|
#include <QScreen>
|
||||||
|
|
||||||
class NetworkManager;
|
class NetworkManager;
|
||||||
class Lobby;
|
class Lobby;
|
||||||
|
@ -35,8 +35,10 @@ protected:
|
|||||||
void enterEvent(QEvent *e);
|
void enterEvent(QEvent *e);
|
||||||
void leaveEvent(QEvent *e);
|
void leaveEvent(QEvent *e);
|
||||||
void mouseDoubleClickEvent(QMouseEvent *e);
|
void mouseDoubleClickEvent(QMouseEvent *e);
|
||||||
|
/*
|
||||||
void dragLeaveEvent(QMouseEvent *e);
|
void dragLeaveEvent(QMouseEvent *e);
|
||||||
void dragEnterEvent(QMouseEvent *e);
|
void dragEnterEvent(QMouseEvent *e);
|
||||||
|
*/
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void evidence_clicked(int p_id);
|
void evidence_clicked(int p_id);
|
||||||
|
@ -35,7 +35,6 @@
|
|||||||
#include <QSlider>
|
#include <QSlider>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <QCloseEvent>
|
#include <QCloseEvent>
|
||||||
#include <QSignalMapper>
|
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QTextBrowser>
|
#include <QTextBrowser>
|
||||||
#include <QSpinBox>
|
#include <QSpinBox>
|
||||||
@ -273,8 +272,6 @@ private:
|
|||||||
QVector<QString> arup_cms;
|
QVector<QString> arup_cms;
|
||||||
QVector<QString> arup_locks;
|
QVector<QString> arup_locks;
|
||||||
|
|
||||||
QSignalMapper *char_button_mapper;
|
|
||||||
|
|
||||||
QVector<chatlogpiece> ic_chatlog_history;
|
QVector<chatlogpiece> ic_chatlog_history;
|
||||||
|
|
||||||
// These map music row items and area row items to their actual IDs.
|
// These map music row items and area row items to their actual IDs.
|
||||||
@ -538,6 +535,7 @@ private:
|
|||||||
void construct_char_select();
|
void construct_char_select();
|
||||||
void set_char_select();
|
void set_char_select();
|
||||||
void set_char_select_page();
|
void set_char_select_page();
|
||||||
|
void char_clicked(int n_char);
|
||||||
void put_button_in_place(int starting, int chars_on_this_page);
|
void put_button_in_place(int starting, int chars_on_this_page);
|
||||||
void filter_character_list();
|
void filter_character_list();
|
||||||
|
|
||||||
@ -652,14 +650,12 @@ private slots:
|
|||||||
|
|
||||||
void on_char_select_left_clicked();
|
void on_char_select_left_clicked();
|
||||||
void on_char_select_right_clicked();
|
void on_char_select_right_clicked();
|
||||||
void on_char_search_changed(const QString& newtext);
|
void on_char_search_changed();
|
||||||
void on_char_taken_clicked(int newstate);
|
void on_char_taken_clicked();
|
||||||
void on_char_passworded_clicked(int newstate);
|
void on_char_passworded_clicked();
|
||||||
|
|
||||||
void on_spectator_clicked();
|
void on_spectator_clicked();
|
||||||
|
|
||||||
void char_clicked(int n_char);
|
|
||||||
|
|
||||||
void on_switch_area_music_clicked();
|
void on_switch_area_music_clicked();
|
||||||
|
|
||||||
void on_casing_clicked();
|
void on_casing_clicked();
|
||||||
|
@ -44,13 +44,14 @@ public:
|
|||||||
QString ms_nosrv_hostname = "master.aceattorneyonline.com";
|
QString ms_nosrv_hostname = "master.aceattorneyonline.com";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const int ms_port = 27016;
|
const quint16 ms_port = 27016;
|
||||||
const int timeout_milliseconds = 2000;
|
const int timeout_milliseconds = 2000;
|
||||||
|
|
||||||
const int ms_reconnect_delay_ms = 7000;
|
// in seconds
|
||||||
|
const int ms_reconnect_delay = 7;
|
||||||
|
|
||||||
// kind of arbitrary max buffer size
|
// kind of arbitrary max buffer size
|
||||||
const size_t buffer_max_size = 16384;
|
#define BUFFER_MAX_SIZE 16384
|
||||||
|
|
||||||
bool ms_partial_packet = false;
|
bool ms_partial_packet = false;
|
||||||
QString ms_temp_packet = "";
|
QString ms_temp_packet = "";
|
||||||
|
@ -37,9 +37,9 @@ void AOApplication::construct_lobby()
|
|||||||
w_lobby = new Lobby(this);
|
w_lobby = new Lobby(this);
|
||||||
lobby_constructed = true;
|
lobby_constructed = true;
|
||||||
|
|
||||||
QRect screenGeometry = QApplication::desktop()->screenGeometry();
|
QRect geometry = QGuiApplication::primaryScreen()->geometry();
|
||||||
int x = (screenGeometry.width()-w_lobby->width()) / 2;
|
int x = (geometry.width()-w_lobby->width()) / 2;
|
||||||
int y = (screenGeometry.height()-w_lobby->height()) / 2;
|
int y = (geometry.height()-w_lobby->height()) / 2;
|
||||||
w_lobby->move(x, y);
|
w_lobby->move(x, y);
|
||||||
|
|
||||||
if (is_discord_enabled())
|
if (is_discord_enabled())
|
||||||
@ -72,9 +72,9 @@ void AOApplication::construct_courtroom()
|
|||||||
w_courtroom = new Courtroom(this);
|
w_courtroom = new Courtroom(this);
|
||||||
courtroom_constructed = true;
|
courtroom_constructed = true;
|
||||||
|
|
||||||
QRect screenGeometry = QApplication::desktop()->screenGeometry();
|
QRect geometry = QGuiApplication::primaryScreen()->geometry();
|
||||||
int x = (screenGeometry.width()-w_courtroom->width()) / 2;
|
int x = (geometry.width()-w_courtroom->width()) / 2;
|
||||||
int y = (screenGeometry.height()-w_courtroom->height()) / 2;
|
int y = (geometry.height()-w_courtroom->height()) / 2;
|
||||||
w_courtroom->move(x, y);
|
w_courtroom->move(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,7 +161,7 @@ void AOApplication::ms_connect_finished(bool connected, bool will_retry)
|
|||||||
{
|
{
|
||||||
if (lobby_constructed)
|
if (lobby_constructed)
|
||||||
w_lobby->append_error("Error connecting to master server. Will try again in "
|
w_lobby->append_error("Error connecting to master server. Will try again in "
|
||||||
+ QString::number(net_manager->ms_reconnect_delay_ms / 1000.f) + " seconds.");
|
+ QString::number(net_manager->ms_reconnect_delay) + " seconds.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -86,6 +86,7 @@ void AOEvidenceButton::mouseDoubleClickEvent(QMouseEvent *e)
|
|||||||
evidence_double_clicked(m_id);
|
evidence_double_clicked(m_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void AOEvidenceButton::dragLeaveEvent(QMouseEvent *e)
|
void AOEvidenceButton::dragLeaveEvent(QMouseEvent *e)
|
||||||
{
|
{
|
||||||
//QWidget::dragLeaveEvent(e);
|
//QWidget::dragLeaveEvent(e);
|
||||||
@ -99,6 +100,7 @@ void AOEvidenceButton::dragEnterEvent(QMouseEvent *e)
|
|||||||
|
|
||||||
qDebug() << "drag enter event";
|
qDebug() << "drag enter event";
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void AOEvidenceButton::enterEvent(QEvent * e)
|
void AOEvidenceButton::enterEvent(QEvent * e)
|
||||||
{
|
{
|
||||||
|
@ -44,7 +44,6 @@ void Courtroom::construct_char_select()
|
|||||||
|
|
||||||
set_size_and_pos(ui_char_buttons, "char_buttons");
|
set_size_and_pos(ui_char_buttons, "char_buttons");
|
||||||
|
|
||||||
connect (char_button_mapper, SIGNAL(mapped(int)), this, SLOT(char_clicked(int)));
|
|
||||||
connect(ui_back_to_lobby, SIGNAL(clicked()), this, SLOT(on_back_to_lobby_clicked()));
|
connect(ui_back_to_lobby, SIGNAL(clicked()), this, SLOT(on_back_to_lobby_clicked()));
|
||||||
|
|
||||||
connect(ui_char_select_left, SIGNAL(clicked()), this, SLOT(on_char_select_left_clicked()));
|
connect(ui_char_select_left, SIGNAL(clicked()), this, SLOT(on_char_select_left_clicked()));
|
||||||
@ -52,9 +51,9 @@ void Courtroom::construct_char_select()
|
|||||||
|
|
||||||
connect(ui_spectator, SIGNAL(clicked()), this, SLOT(on_spectator_clicked()));
|
connect(ui_spectator, SIGNAL(clicked()), this, SLOT(on_spectator_clicked()));
|
||||||
|
|
||||||
connect(ui_char_search, SIGNAL(textEdited(const QString&)), this, SLOT(on_char_search_changed(const QString&)));
|
connect(ui_char_search, SIGNAL(textEdited(const QString&)), this, SLOT(on_char_search_changed()));
|
||||||
connect(ui_char_passworded, SIGNAL(stateChanged(int)), this, SLOT(on_char_passworded_clicked(int)));
|
connect(ui_char_passworded, SIGNAL(stateChanged(int)), this, SLOT(on_char_passworded_clicked()));
|
||||||
connect(ui_char_taken, SIGNAL(stateChanged(int)), this, SLOT(on_char_taken_clicked(int)));
|
connect(ui_char_taken, SIGNAL(stateChanged(int)), this, SLOT(on_char_taken_clicked()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Courtroom::set_char_select()
|
void Courtroom::set_char_select()
|
||||||
@ -197,14 +196,15 @@ void Courtroom::character_loading_finished()
|
|||||||
// Later on, we'll be revealing buttons as we need them.
|
// Later on, we'll be revealing buttons as we need them.
|
||||||
for (int n = 0; n < char_list.size(); n++)
|
for (int n = 0; n < char_list.size(); n++)
|
||||||
{
|
{
|
||||||
AOCharButton* character = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken);
|
AOCharButton* char_button = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken);
|
||||||
character->reset();
|
char_button->reset();
|
||||||
character->hide();
|
char_button->hide();
|
||||||
character->set_image(char_list.at(n).name);
|
char_button->set_image(char_list.at(n).name);
|
||||||
ui_char_button_list.append(character);
|
ui_char_button_list.append(char_button);
|
||||||
|
|
||||||
connect(character, SIGNAL(clicked()), char_button_mapper, SLOT(map()));
|
connect(char_button, &AOCharButton::clicked, [this, n](){
|
||||||
char_button_mapper->setMapping(character, ui_char_button_list.size() - 1);
|
this->char_clicked(n);
|
||||||
|
});
|
||||||
|
|
||||||
// This part here serves as a way of showing to the player that the game is still running, it is
|
// This part here serves as a way of showing to the player that the game is still running, it is
|
||||||
// just loading the pictures of the characters.
|
// just loading the pictures of the characters.
|
||||||
@ -252,17 +252,17 @@ void Courtroom::filter_character_list()
|
|||||||
set_char_select_page();
|
set_char_select_page();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Courtroom::on_char_search_changed(const QString& newtext)
|
void Courtroom::on_char_search_changed()
|
||||||
{
|
{
|
||||||
filter_character_list();
|
filter_character_list();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Courtroom::on_char_passworded_clicked(int newstate)
|
void Courtroom::on_char_passworded_clicked()
|
||||||
{
|
{
|
||||||
filter_character_list();
|
filter_character_list();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Courtroom::on_char_taken_clicked(int newstate)
|
void Courtroom::on_char_taken_clicked()
|
||||||
{
|
{
|
||||||
filter_character_list();
|
filter_character_list();
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
|
|||||||
|
|
||||||
// Change the default audio output device to be the one the user has given
|
// Change the default audio output device to be the one the user has given
|
||||||
// in his config.ini file for now.
|
// in his config.ini file for now.
|
||||||
int a = 0;
|
unsigned int a = 0;
|
||||||
BASS_DEVICEINFO info;
|
BASS_DEVICEINFO info;
|
||||||
|
|
||||||
if (ao_app->get_audio_output_device() == "default")
|
if (ao_app->get_audio_output_device() == "default")
|
||||||
@ -21,7 +21,7 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
|
|||||||
if (ao_app->get_audio_output_device() == info.name)
|
if (ao_app->get_audio_output_device() == info.name)
|
||||||
{
|
{
|
||||||
BASS_SetDevice(a);
|
BASS_SetDevice(a);
|
||||||
BASS_Init(a, 48000, BASS_DEVICE_LATENCY, nullptr, nullptr);
|
BASS_Init(static_cast<int>(a), 48000, BASS_DEVICE_LATENCY, nullptr, nullptr);
|
||||||
load_bass_opus_plugin();
|
load_bass_opus_plugin();
|
||||||
qDebug() << info.name << "was set as the default audio output device.";
|
qDebug() << info.name << "was set as the default audio output device.";
|
||||||
break;
|
break;
|
||||||
@ -49,8 +49,6 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
|
|||||||
testimony_hide_timer = new QTimer(this);
|
testimony_hide_timer = new QTimer(this);
|
||||||
testimony_hide_timer->setSingleShot(true);
|
testimony_hide_timer->setSingleShot(true);
|
||||||
|
|
||||||
char_button_mapper = new QSignalMapper(this);
|
|
||||||
|
|
||||||
music_player = new AOMusicPlayer(this, ao_app);
|
music_player = new AOMusicPlayer(this, ao_app);
|
||||||
music_player->set_volume(0);
|
music_player->set_volume(0);
|
||||||
sfx_player = new AOSfxPlayer(this, ao_app);
|
sfx_player = new AOSfxPlayer(this, ao_app);
|
||||||
@ -2223,11 +2221,7 @@ void Courtroom::chat_tick()
|
|||||||
case INLINE_GREY:
|
case INLINE_GREY:
|
||||||
ui_vp_message->insertHtml("<font color=\""+ get_text_color("_inline_grey").name() +"\">" + f_character + "</font>");
|
ui_vp_message->insertHtml("<font color=\""+ get_text_color("_inline_grey").name() +"\">" + f_character + "</font>");
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
ui_vp_message->insertHtml(f_character);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -11,10 +11,10 @@ Discord::Discord()
|
|||||||
qInfo() << "Discord RPC ready";
|
qInfo() << "Discord RPC ready";
|
||||||
};
|
};
|
||||||
handlers.disconnected = [](int errorCode, const char* message) {
|
handlers.disconnected = [](int errorCode, const char* message) {
|
||||||
qInfo() << "Discord RPC disconnected! " << message;
|
qInfo() << "Discord RPC disconnected! " << message << errorCode;
|
||||||
};
|
};
|
||||||
handlers.errored = [](int errorCode, const char* message) {
|
handlers.errored = [](int errorCode, const char* message) {
|
||||||
qWarning() << "Discord RPC errored out! " << message;
|
qWarning() << "Discord RPC errored out! " << message << errorCode;
|
||||||
};
|
};
|
||||||
qInfo() << "Initializing Discord RPC";
|
qInfo() << "Initializing Discord RPC";
|
||||||
Discord_Initialize(APPLICATION_ID, &handlers, 1, nullptr);
|
Discord_Initialize(APPLICATION_ID, &handlers, 1, nullptr);
|
||||||
|
@ -5,12 +5,12 @@
|
|||||||
#if (defined (_WIN32) || defined (_WIN64))
|
#if (defined (_WIN32) || defined (_WIN64))
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
DWORD dwVolSerial;
|
static DWORD dwVolSerial;
|
||||||
BOOL bIsRetrieved;
|
static BOOL bIsRetrieved;
|
||||||
|
|
||||||
QString get_hdid()
|
QString get_hdid()
|
||||||
{
|
{
|
||||||
bIsRetrieved = GetVolumeInformation(TEXT("C:\\"), NULL, NULL, &dwVolSerial, NULL, NULL, NULL, NULL);
|
bIsRetrieved = GetVolumeInformation(TEXT("C:\\"), nullptr, 0, &dwVolSerial, nullptr, nullptr, nullptr, 0);
|
||||||
|
|
||||||
if (bIsRetrieved)
|
if (bIsRetrieved)
|
||||||
return QString::number(dwVolSerial, 16);
|
return QString::number(dwVolSerial, 16);
|
||||||
@ -18,7 +18,6 @@ QString get_hdid()
|
|||||||
//a totally random string
|
//a totally random string
|
||||||
//what could possibly go wrong
|
//what could possibly go wrong
|
||||||
return "gxsps32sa9fnwic92mfbs0";
|
return "gxsps32sa9fnwic92mfbs0";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif (defined (LINUX) || defined (__linux__))
|
#elif (defined (LINUX) || defined (__linux__))
|
||||||
|
@ -78,9 +78,9 @@ void NetworkManager::ship_server_packet(QString p_packet)
|
|||||||
|
|
||||||
void NetworkManager::handle_ms_packet()
|
void NetworkManager::handle_ms_packet()
|
||||||
{
|
{
|
||||||
char buffer[buffer_max_size];
|
char buffer[BUFFER_MAX_SIZE];
|
||||||
std::memset(buffer, 0, buffer_max_size);
|
std::memset(buffer, 0, BUFFER_MAX_SIZE);
|
||||||
ms_socket->read(buffer, buffer_max_size);
|
ms_socket->read(buffer, BUFFER_MAX_SIZE);
|
||||||
|
|
||||||
QString in_data = buffer;
|
QString in_data = buffer;
|
||||||
|
|
||||||
@ -137,7 +137,9 @@ void NetworkManager::on_srv_lookup()
|
|||||||
|
|
||||||
for (const QDnsServiceRecord &record : srv_records)
|
for (const QDnsServiceRecord &record : srv_records)
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_NETWORK
|
||||||
qDebug() << "Connecting to " << record.target() << ":" << record.port();
|
qDebug() << "Connecting to " << record.target() << ":" << record.port();
|
||||||
|
#endif
|
||||||
ms_socket->connectToHost(record.target(), record.port());
|
ms_socket->connectToHost(record.target(), record.port());
|
||||||
QTime timer;
|
QTime timer;
|
||||||
timer.start();
|
timer.start();
|
||||||
@ -206,7 +208,7 @@ void NetworkManager::on_ms_socket_error(QAbstractSocket::SocketError error)
|
|||||||
|
|
||||||
emit ms_connect_finished(false, true);
|
emit ms_connect_finished(false, true);
|
||||||
|
|
||||||
ms_reconnect_timer->start(ms_reconnect_delay_ms);
|
ms_reconnect_timer->start(ms_reconnect_delay * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkManager::retry_ms_connect()
|
void NetworkManager::retry_ms_connect()
|
||||||
@ -217,9 +219,9 @@ void NetworkManager::retry_ms_connect()
|
|||||||
|
|
||||||
void NetworkManager::handle_server_packet()
|
void NetworkManager::handle_server_packet()
|
||||||
{
|
{
|
||||||
char buffer[buffer_max_size];
|
char buffer[BUFFER_MAX_SIZE];
|
||||||
std::memset(buffer, 0, buffer_max_size);
|
std::memset(buffer, 0, BUFFER_MAX_SIZE);
|
||||||
server_socket->read(buffer, buffer_max_size);
|
server_socket->read(buffer, BUFFER_MAX_SIZE);
|
||||||
|
|
||||||
QString in_data = buffer;
|
QString in_data = buffer;
|
||||||
|
|
||||||
|
@ -14,8 +14,10 @@ void AOApplication::ms_packet_received(AOPacket *p_packet)
|
|||||||
QString header = p_packet->get_header();
|
QString header = p_packet->get_header();
|
||||||
QStringList f_contents = p_packet->get_contents();
|
QStringList f_contents = p_packet->get_contents();
|
||||||
|
|
||||||
|
#ifdef DEBUG_NETWORK
|
||||||
if (header != "CHECK")
|
if (header != "CHECK")
|
||||||
qDebug() << "R(ms):" << p_packet->to_string();
|
qDebug() << "R(ms):" << p_packet->to_string();
|
||||||
|
#endif
|
||||||
|
|
||||||
if (header == "ALL")
|
if (header == "ALL")
|
||||||
{
|
{
|
||||||
@ -127,8 +129,10 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
|
|||||||
QStringList f_contents = p_packet->get_contents();
|
QStringList f_contents = p_packet->get_contents();
|
||||||
QString f_packet = p_packet->to_string();
|
QString f_packet = p_packet->to_string();
|
||||||
|
|
||||||
|
#ifdef DEBUG_NETWORK
|
||||||
if (header != "checkconnection")
|
if (header != "checkconnection")
|
||||||
qDebug() << "R:" << f_packet;
|
qDebug() << "R:" << f_packet;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (header == "decryptor")
|
if (header == "decryptor")
|
||||||
{
|
{
|
||||||
@ -677,7 +681,9 @@ void AOApplication::send_ms_packet(AOPacket *p_packet)
|
|||||||
|
|
||||||
net_manager->ship_ms_packet(f_packet);
|
net_manager->ship_ms_packet(f_packet);
|
||||||
|
|
||||||
|
#ifdef DEBUG_NETWORK
|
||||||
qDebug() << "S(ms):" << f_packet;
|
qDebug() << "S(ms):" << f_packet;
|
||||||
|
#endif
|
||||||
|
|
||||||
delete p_packet;
|
delete p_packet;
|
||||||
}
|
}
|
||||||
@ -691,14 +697,18 @@ void AOApplication::send_server_packet(AOPacket *p_packet, bool encoded)
|
|||||||
|
|
||||||
if (encryption_needed)
|
if (encryption_needed)
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_NETWORK
|
||||||
qDebug() << "S(e):" << f_packet;
|
qDebug() << "S(e):" << f_packet;
|
||||||
|
#endif
|
||||||
|
|
||||||
p_packet->encrypt_header(s_decryptor);
|
p_packet->encrypt_header(s_decryptor);
|
||||||
f_packet = p_packet->to_string();
|
f_packet = p_packet->to_string();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_NETWORK
|
||||||
qDebug() << "S:" << f_packet;
|
qDebug() << "S:" << f_packet;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
net_manager->ship_server_packet(f_packet);
|
net_manager->ship_server_packet(f_packet);
|
||||||
|
Loading…
Reference in New Issue
Block a user