From bb3d4ac8476327f05352f3913708f8589ed34556 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 9 Dec 2023 10:38:48 -0800 Subject: [PATCH] disable $bank when character overlay is present --- src/ChatCommands.cc | 3 +++ src/Client.cc | 10 +++++++++- src/ReceiveCommands.cc | 3 +++ src/ReceiveSubcommands.cc | 1 + 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ChatCommands.cc b/src/ChatCommands.cc index 5a960314..2387628d 100644 --- a/src/ChatCommands.cc +++ b/src/ChatCommands.cc @@ -1001,6 +1001,9 @@ static void server_command_change_bank(shared_ptr c, const std::string& if (c->config.check_flag(Client::Flag::AT_BANK_COUNTER)) { throw runtime_error("cannot change banks while at the bank counter"); } + if (c->has_overlay()) { + throw runtime_error("cannot change banks while Battle or Challenge is in progress"); + } ssize_t new_char_index = args.empty() ? (c->bb_character_index + 1) : stol(args, nullptr, 0); diff --git a/src/Client.cc b/src/Client.cc index b7f3cfaf..c731302c 100644 --- a/src/Client.cc +++ b/src/Client.cc @@ -926,13 +926,21 @@ void Client::use_default_bank() { bool Client::use_shared_bank() { this->use_default_bank(); + string filename = this->shared_bank_filename(); - if (isfile(filename)) { + auto files_manager = this->require_server_state()->player_files_manager; + this->external_bank = files_manager->get_bank(filename); + if (this->external_bank) { + player_data_log.info("Using loaded shared bank %s", filename.c_str()); + return true; + } else if (isfile(filename)) { this->external_bank = make_shared(load_object_file(filename)); + files_manager->set_bank(filename, this->external_bank); player_data_log.info("Loaded shared bank %s", filename.c_str()); return true; } else { this->external_bank = make_shared(); + files_manager->set_bank(filename, this->external_bank); player_data_log.info("Created shared bank for %s", filename.c_str()); return false; } diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index d511d86d..eb9a1ebf 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -1896,9 +1896,11 @@ static void on_quest_loaded(shared_ptr l) { if (l->base_version != Version::BB_V4) { lc->delete_overlay(); if (l->quest->battle_rules) { + lc->use_default_bank(); lc->create_battle_overlay(l->quest->battle_rules, s->level_table); lc->log.info("Created battle overlay"); } else if (l->quest->challenge_template_index >= 0) { + lc->use_default_bank(); lc->create_challenge_overlay(lc->version(), l->quest->challenge_template_index, s->level_table); lc->log.info("Created challenge overlay"); l->assign_inventory_and_bank_item_ids(lc); @@ -3463,6 +3465,7 @@ static void on_DF_BB(shared_ptr c, uint16_t command, uint32_t, string& d for (auto lc : l->clients) { if (lc) { + lc->use_default_bank(); lc->create_challenge_overlay(lc->version(), l->quest->challenge_template_index, s->level_table); lc->log.info("Created challenge overlay"); l->assign_inventory_and_bank_item_ids(lc); diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 0e03c0fd..61ae607a 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -2440,6 +2440,7 @@ static void on_battle_restart_bb(shared_ptr c, uint8_t, uint8_t, const v for (auto& lc : l->clients) { if (lc) { lc->delete_overlay(); + lc->use_default_bank(); lc->create_battle_overlay(new_rules, s->level_table); } }