allow v2 and v3 clients to load quests in the same game
This commit is contained in:
+17
-24
@@ -2162,28 +2162,7 @@ void set_lobby_quest(shared_ptr<Lobby> l, shared_ptr<const Quest> q, bool substi
|
|||||||
}
|
}
|
||||||
l->create_item_creator();
|
l->create_item_creator();
|
||||||
|
|
||||||
// There is no such thing as command AC on PSO V1 and V2 - quests just start
|
size_t num_clients_with_loading_flag = 0;
|
||||||
// immediately when they're done downloading. (This is also the case on V3
|
|
||||||
// Trial Edition.) There are also no chunk acknowledgements (C->S 13 commands)
|
|
||||||
// like there are on GC. So, for pre-V3 clients, we can just not set the
|
|
||||||
// loading flag, since we never need to check/clear it later.
|
|
||||||
size_t num_clients_need_loading_flag = 0;
|
|
||||||
size_t num_clients_skip_loading_flag = 0;
|
|
||||||
for (auto lc : l->clients) {
|
|
||||||
if (!lc) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (is_v3(lc->version()) || is_v4(lc->version())) {
|
|
||||||
num_clients_need_loading_flag++;
|
|
||||||
} else {
|
|
||||||
num_clients_skip_loading_flag++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((num_clients_need_loading_flag == 0) == (num_clients_skip_loading_flag == 0)) {
|
|
||||||
throw runtime_error("not all clients in the lobby have the same loading flag behavior");
|
|
||||||
}
|
|
||||||
bool use_loading_flag = (num_clients_need_loading_flag != 0);
|
|
||||||
|
|
||||||
for (size_t client_id = 0; client_id < l->max_clients; client_id++) {
|
for (size_t client_id = 0; client_id < l->max_clients; client_id++) {
|
||||||
auto lc = l->clients[client_id];
|
auto lc = l->clients[client_id];
|
||||||
if (!lc) {
|
if (!lc) {
|
||||||
@@ -2206,16 +2185,30 @@ void set_lobby_quest(shared_ptr<Lobby> l, shared_ptr<const Quest> q, bool substi
|
|||||||
send_open_quest_file(lc, bin_filename, bin_filename, xb_filename, vq->quest_number, QuestFileType::ONLINE, vq->bin_contents);
|
send_open_quest_file(lc, bin_filename, bin_filename, xb_filename, vq->quest_number, QuestFileType::ONLINE, vq->bin_contents);
|
||||||
send_open_quest_file(lc, dat_filename, dat_filename, xb_filename, vq->quest_number, QuestFileType::ONLINE, vq->dat_contents);
|
send_open_quest_file(lc, dat_filename, dat_filename, xb_filename, vq->quest_number, QuestFileType::ONLINE, vq->dat_contents);
|
||||||
|
|
||||||
if (use_loading_flag) {
|
// There is no such thing as command AC (quest barrier) on PSO V1 and V2;
|
||||||
|
// quests just start immediately when they're done downloading. (This is
|
||||||
|
// also the case on GC Trial Edition.) There are also no chunk
|
||||||
|
// acknowledgements (C->S 13 commands) like there are on v3 and later. So,
|
||||||
|
// for pre-V3 clients, we can just not set the loading flag, since we
|
||||||
|
// won't be told when to clear it later.
|
||||||
|
// TODO: For V3 and V4 clients, the quest doesn't finish loading here, so
|
||||||
|
// technically we should queue up commands sent by pre-V3 clients, since
|
||||||
|
// they might start the quest before V3/V4 clients do. We can probably use
|
||||||
|
// a method similar to game_join_command_queue.
|
||||||
|
if (!is_v1_or_v2(lc->version())) {
|
||||||
|
num_clients_with_loading_flag++;
|
||||||
lc->config.set_flag(Client::Flag::LOADING_QUEST);
|
lc->config.set_flag(Client::Flag::LOADING_QUEST);
|
||||||
lc->log.info("LOADING_QUEST flag set");
|
lc->log.info("LOADING_QUEST flag set");
|
||||||
lc->disconnect_hooks.emplace(QUEST_BARRIER_DISCONNECT_HOOK_NAME, [l]() -> void {
|
lc->disconnect_hooks.emplace(QUEST_BARRIER_DISCONNECT_HOOK_NAME, [l]() -> void {
|
||||||
send_quest_barrier_if_all_clients_ready(l);
|
send_quest_barrier_if_all_clients_ready(l);
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
lc->log.info("LOADING_QUEST flag skipped");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!use_loading_flag) {
|
if (num_clients_with_loading_flag == 0) {
|
||||||
|
l->log.info("No clients require the LOADING_QUEST flag; starting quest now");
|
||||||
on_quest_loaded(l);
|
on_quest_loaded(l);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-6
@@ -162,12 +162,9 @@ static string get_quoted_string(string& s) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
CommandDefinition c_nop1(
|
CommandDefinition c_nop1("", nullptr, false, +[](CommandArgs&) {});
|
||||||
"", nullptr, false, +[](CommandArgs&) {});
|
CommandDefinition c_nop2("//", nullptr, false, +[](CommandArgs&) {});
|
||||||
CommandDefinition c_nop2(
|
CommandDefinition c_nop3("#", nullptr, false, +[](CommandArgs&) {});
|
||||||
"//", nullptr, false, +[](CommandArgs&) {});
|
|
||||||
CommandDefinition c_nop3(
|
|
||||||
"#", nullptr, false, +[](CommandArgs&) {});
|
|
||||||
|
|
||||||
CommandDefinition c_help(
|
CommandDefinition c_help(
|
||||||
"help", "help\n\
|
"help", "help\n\
|
||||||
|
|||||||
Reference in New Issue
Block a user