diff options
Diffstat (limited to 'packet_distribution.cpp')
| -rw-r--r-- | packet_distribution.cpp | 195 |
1 files changed, 185 insertions, 10 deletions
diff --git a/packet_distribution.cpp b/packet_distribution.cpp index 5250dfab..163c744d 100644 --- a/packet_distribution.cpp +++ b/packet_distribution.cpp @@ -1,6 +1,7 @@ #include "aoapplication.h" #include "lobby.h" +#include "courtroom.h" #include "networkmanager.h" #include "encryption_functions.h" #include "hardware_functions.h" @@ -62,8 +63,7 @@ void AOApplication::ms_packet_received(AOPacket *p_packet) } if (courtroom_constructed) { - //T0D0: uncomment this when it's implemented - //w_courtroom->append_ms_chat_message(message_line); + w_courtroom->append_ms_chatmessage(message_line); } } } @@ -76,7 +76,8 @@ void AOApplication::server_packet_received(AOPacket *p_packet) QStringList f_contents = p_packet->get_contents(); QString f_packet = p_packet->to_string(); - qDebug() << "R: " << f_packet; + if (header != "checkconnection") + qDebug() << "R: " << f_packet; if (header == "decryptor") { @@ -91,15 +92,18 @@ void AOApplication::server_packet_received(AOPacket *p_packet) AOPacket *hi_packet = new AOPacket("HI#" + f_hdid + "#%"); send_server_packet(hi_packet); - - delete hi_packet; } else if (header == "ID") { if (f_contents.size() < 1) return; - //T0D0: save server version here, somehow(it's in the HI# packet usually) + s_pv = f_contents.at(0).toInt(); + + if (f_contents.size() < 2) + return; + + //T0D0: store server version } else if (header == "CT") { @@ -109,10 +113,9 @@ void AOApplication::server_packet_received(AOPacket *p_packet) return; } - //QString message_line = f_contents.at(0) + ": " + f_contents.at(1); + QString message_line = f_contents.at(0) + ": " + f_contents.at(1); - //T0D0, uncomment when implemented - //w_courtroom->append_ooc_chatmessage(message_line) + w_courtroom->append_server_chatmessage(message_line); } else if (header == "PN") { @@ -121,6 +124,175 @@ void AOApplication::server_packet_received(AOPacket *p_packet) w_lobby->set_player_count(f_contents.at(0).toInt(), f_contents.at(1).toInt()); } + else if (header == "SI") + { + if (f_contents.size() < 3) + return; + + char_list_size = f_contents.at(0).toInt(); + loaded_chars = 0; + evidence_list_size = f_contents.at(1).toInt(); + loaded_evidence = 0; + music_list_size = f_contents.at(2).toInt(); + loaded_music = 0; + + destruct_courtroom(); + + construct_courtroom(); + + w_lobby->show_loading_overlay(); + w_lobby->set_loading_text("Loading"); + + AOPacket *f_packet = new AOPacket("askchar2#%"); + send_server_packet(f_packet); + } + else if (header == "CI") + { + if (!courtroom_constructed) + return; + + for (int n_element = 0 ; n_element < f_contents.size() ; n_element += 2) + { + if (f_contents.at(n_element).toInt() != loaded_chars) + break; + + //this means we are on the last element and checking n + 1 element will be game over so + if (n_element == f_contents.size() - 1) + break; + + QStringList sub_elements = f_contents.at(n_element + 1).split("&"); + if (sub_elements.size() < 2) + break; + + char_type f_char; + f_char.name = sub_elements.at(0); + f_char.description = sub_elements.at(1); + //temporary. the CharsCheck packet sets this properly + f_char.taken = false; + + ++loaded_chars; + + w_lobby->set_loading_text("Loading chars:\n" + QString::number(loaded_chars) + "/" + QString::number(char_list_size)); + + w_courtroom->append_char(f_char); + } + + if (loaded_chars < char_list_size) + { + QString next_packet_number = QString::number(((loaded_chars - 1) / 10) + 1); + send_server_packet(new AOPacket("AN#" + next_packet_number + "#%")); + } + + else + { + if (evidence_list_size == 0) + send_server_packet(new AOPacket("AM#0#%")); + else + send_server_packet(new AOPacket("AE#0#%")); + } + } + else if (header == "EI"){ + if (!courtroom_constructed) + return; + + + // +1 because evidence starts at 1 rather than 0 for whatever reason + //enjoy fanta + if (f_contents.at(0).toInt() != loaded_evidence + 1) + return; + + if (f_contents.size() < 2) + return; + + QStringList sub_elements = f_contents.at(1).split("&"); + if (sub_elements.size() < 4) + return; + + evi_type f_evi; + f_evi.name = sub_elements.at(0); + f_evi.description = sub_elements.at(1); + //no idea what the number at position 2 is. probably an identifier? + f_evi.image = sub_elements.at(3); + + ++loaded_evidence; + + w_lobby->set_loading_text("Loading evidence:\n" + QString::number(loaded_evidence) + "/" + QString::number(evidence_list_size)); + + w_courtroom->append_evidence(f_evi); + + if (loaded_evidence < evidence_list_size) + { + qDebug() << "loaded evidence: " << loaded_evidence; + QString next_packet_number = QString::number(loaded_evidence); + send_server_packet(new AOPacket("AE#" + next_packet_number + "#%")); + } + else + { + send_server_packet(new AOPacket("AM#0#%")); + } + } + else if (header == "EM") + { + if (!courtroom_constructed) + return; + + for (int n_element = 0 ; n_element < f_contents.size() ; n_element += 2) + { + if (f_contents.at(n_element).toInt() != loaded_music) + break; + + if (n_element == f_contents.size() - 1) + break; + + QString f_music = f_contents.at(n_element + 1); + + ++loaded_music; + + w_lobby->set_loading_text("Loading music:\n" + QString::number(loaded_music) + "/" + QString::number(music_list_size)); + + w_courtroom->append_music(f_music); + } + + //apparently we need to intentionally send another AM packet to get onwards in the loading process + //in spite of the fact that we actually received all the music + //enjoy fanta + //if (loaded_music < music_list_size) + //{ + QString next_packet_number = QString::number(((loaded_music - 1) / 10) + 1); + send_server_packet(new AOPacket("AM#" + next_packet_number + "#%")); + //} + } + if (header == "CharsCheck") + { + for (int n_char = 0 ; n_char < f_contents.size() ; ++n_char) + { + if (f_contents.at(n_char) == "-1") + w_courtroom->set_taken(n_char, true); + else + w_courtroom->set_taken(n_char, false); + } + } + if (header == "DONE") + { + if (!courtroom_constructed) + return; + + w_courtroom->set_char_select_page(); + + w_courtroom->append_ms_chatmessage(w_lobby->get_chatlog()); + + w_courtroom->show(); + + destruct_lobby(); + } + //server accepting char request(CC) packet + if (header == "PV") + { + if (f_contents.size() < 3) + return; + + w_courtroom->enter_courtroom(f_contents.at(2).toInt()); + } } void AOApplication::send_ms_packet(AOPacket *p_packet) @@ -132,6 +304,8 @@ void AOApplication::send_ms_packet(AOPacket *p_packet) net_manager->ship_ms_packet(f_packet); qDebug() << "S(ms):" << f_packet; + + delete p_packet; } void AOApplication::send_server_packet(AOPacket *p_packet) @@ -142,7 +316,7 @@ void AOApplication::send_server_packet(AOPacket *p_packet) if (encryption_needed) { - qDebug() << "S:(e)" << f_packet; + qDebug() << "S(e):" << f_packet; p_packet->encrypt_header(s_decryptor); f_packet = p_packet->to_string(); @@ -154,4 +328,5 @@ void AOApplication::send_server_packet(AOPacket *p_packet) net_manager->ship_server_packet(f_packet); + delete p_packet; } |
