implement quest stats command
This commit is contained in:
+22
-4
@@ -1096,11 +1096,29 @@ struct S_QuestMenuEntry_BB_A2_A4 {
|
|||||||
// download quest menu is closed, either by downloading a quest or canceling,
|
// download quest menu is closed, either by downloading a quest or canceling,
|
||||||
// the client sends A0 instead.
|
// the client sends A0 instead.
|
||||||
|
|
||||||
// AA: Invalid command
|
// AA (C->S): Update quest statistics
|
||||||
// TODO: Sylverant defines this as quest stats, specifically used during Maximum
|
// This command is used in Maximum Attack 2, but its format is unlikely to be
|
||||||
// Attack 2. Verify this and document if needed.
|
// specific to that quest. The structure here represents the only instance I've
|
||||||
|
// seen so far.
|
||||||
|
// The server will respond with an AB command.
|
||||||
|
|
||||||
// AB (S->C): Unknown (BB)
|
struct C_UpdateQuestStatistics_AA {
|
||||||
|
le_uint32_t quest_internal_id;
|
||||||
|
le_uint16_t request_token;
|
||||||
|
le_uint16_t unknown_a1;
|
||||||
|
le_uint32_t unknown_a2;
|
||||||
|
le_uint32_t kill_count;
|
||||||
|
le_uint32_t time_taken; // in seconds
|
||||||
|
parray<uint8_t, 0x14> unknown_a3;
|
||||||
|
};
|
||||||
|
|
||||||
|
// AB (S->C): Confirm update quest statistics
|
||||||
|
|
||||||
|
struct S_ConfirmUpdateQuestStatistics_AB {
|
||||||
|
le_uint32_t unknown_a1; // 0
|
||||||
|
le_uint16_t request_token; // Should match token sent in AA command
|
||||||
|
le_uint16_t unknown_a2; // Schtserv always sends 0xBFFF here
|
||||||
|
};
|
||||||
|
|
||||||
// AC: Quest barrier
|
// AC: Quest barrier
|
||||||
// No arguments
|
// No arguments
|
||||||
|
|||||||
+21
-4
@@ -1025,6 +1025,23 @@ void process_quest_ready(shared_ptr<ServerState> s, shared_ptr<Client> c,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void process_update_quest_statistics(shared_ptr<ServerState> s,
|
||||||
|
shared_ptr<Client> c, uint16_t, uint32_t, const string& data) { // AA
|
||||||
|
const auto& cmd = check_size_t<C_UpdateQuestStatistics_AA>(data);
|
||||||
|
|
||||||
|
auto l = s->find_lobby(c->lobby_id);
|
||||||
|
if (!l || !l->is_game() || !l->loading_quest.get() ||
|
||||||
|
(l->loading_quest->internal_id != cmd.quest_internal_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
S_ConfirmUpdateQuestStatistics_AB response;
|
||||||
|
response.unknown_a1 = 0;
|
||||||
|
response.request_token = cmd.request_token;
|
||||||
|
response.unknown_a2 = 0xBFFF;
|
||||||
|
send_command_t(c, 0xAB, 0x00, response);
|
||||||
|
}
|
||||||
|
|
||||||
void process_gba_file_request(shared_ptr<ServerState>, shared_ptr<Client> c,
|
void process_gba_file_request(shared_ptr<ServerState>, shared_ptr<Client> c,
|
||||||
uint16_t, uint32_t, const string& data) { // D7
|
uint16_t, uint32_t, const string& data) { // D7
|
||||||
string filename(data);
|
string filename(data);
|
||||||
@@ -1835,7 +1852,7 @@ static process_command_t dc_handlers[0x100] = {
|
|||||||
// A0
|
// A0
|
||||||
process_change_ship, process_change_block, process_quest_list_request, nullptr,
|
process_change_ship, process_change_block, process_quest_list_request, nullptr,
|
||||||
nullptr, nullptr, nullptr, nullptr,
|
nullptr, nullptr, nullptr, nullptr,
|
||||||
nullptr, process_ignored_command, nullptr, nullptr,
|
nullptr, process_ignored_command, process_update_quest_statistics, nullptr,
|
||||||
process_quest_ready, nullptr, nullptr, nullptr,
|
process_quest_ready, nullptr, nullptr, nullptr,
|
||||||
|
|
||||||
// B0
|
// B0
|
||||||
@@ -1918,7 +1935,7 @@ static process_command_t pc_handlers[0x100] = {
|
|||||||
// A0
|
// A0
|
||||||
process_change_ship, process_change_block, process_quest_list_request, nullptr,
|
process_change_ship, process_change_block, process_quest_list_request, nullptr,
|
||||||
nullptr, nullptr, nullptr, nullptr,
|
nullptr, nullptr, nullptr, nullptr,
|
||||||
nullptr, process_ignored_command, nullptr, nullptr,
|
nullptr, process_ignored_command, process_update_quest_statistics, nullptr,
|
||||||
process_quest_ready, nullptr, nullptr, nullptr,
|
process_quest_ready, nullptr, nullptr, nullptr,
|
||||||
|
|
||||||
// B0
|
// B0
|
||||||
@@ -2002,7 +2019,7 @@ static process_command_t gc_handlers[0x100] = {
|
|||||||
// A0
|
// A0
|
||||||
process_change_ship, process_change_block, process_quest_list_request, nullptr,
|
process_change_ship, process_change_block, process_quest_list_request, nullptr,
|
||||||
nullptr, nullptr, process_ignored_command, process_ignored_command,
|
nullptr, nullptr, process_ignored_command, process_ignored_command,
|
||||||
nullptr, process_ignored_command, nullptr, nullptr,
|
nullptr, process_ignored_command, process_update_quest_statistics, nullptr,
|
||||||
process_quest_ready, nullptr, nullptr, nullptr,
|
process_quest_ready, nullptr, nullptr, nullptr,
|
||||||
|
|
||||||
// B0
|
// B0
|
||||||
@@ -2091,7 +2108,7 @@ static process_command_t bb_handlers[0x100] = {
|
|||||||
// A0
|
// A0
|
||||||
process_change_ship, process_change_block, process_quest_list_request, nullptr,
|
process_change_ship, process_change_block, process_quest_list_request, nullptr,
|
||||||
nullptr, nullptr, nullptr, nullptr,
|
nullptr, nullptr, nullptr, nullptr,
|
||||||
nullptr, process_ignored_command, nullptr, nullptr,
|
nullptr, process_ignored_command, process_update_quest_statistics, nullptr,
|
||||||
process_quest_ready, nullptr, nullptr, nullptr,
|
process_quest_ready, nullptr, nullptr, nullptr,
|
||||||
|
|
||||||
// B0
|
// B0
|
||||||
|
|||||||
Reference in New Issue
Block a user