add Ep3 codepaths to B2 enabler
This commit is contained in:
+2
-9
@@ -37,9 +37,6 @@ void Client::Config::set_flags_for_version(Version version, int64_t sub_version)
|
||||
|
||||
switch (sub_version) {
|
||||
case -1: // Initial check (before sub_version recognition)
|
||||
// Note: BB does not appear here because we always get its sub_version in
|
||||
// the very first command; there is no way to get here for a BB client
|
||||
// before we know the client's sub_version.
|
||||
switch (version) {
|
||||
case Version::PC_PATCH:
|
||||
case Version::BB_PATCH:
|
||||
@@ -127,10 +124,9 @@ void Client::Config::set_flags_for_version(Version version, int64_t sub_version)
|
||||
this->set_flag(Flag::IS_CLIENT_CUSTOMIZATION);
|
||||
[[fallthrough]];
|
||||
case 0x36: // GC Ep1&2 US v1.2 (Plus)
|
||||
this->set_flag(Flag::CAN_RECEIVE_ENABLE_B2_QUEST);
|
||||
[[fallthrough]];
|
||||
case 0x39: // GC Ep1&2 JP v1.5 (Plus)
|
||||
this->set_flag(Flag::NO_D6_AFTER_LOBBY);
|
||||
this->set_flag(Flag::CAN_RECEIVE_ENABLE_B2_QUEST);
|
||||
break;
|
||||
case 0x40: // GC Ep3 JP and Trial Edition (and BB)
|
||||
this->set_flag(Flag::NO_D6_AFTER_LOBBY);
|
||||
@@ -141,13 +137,10 @@ void Client::Config::set_flags_for_version(Version version, int64_t sub_version)
|
||||
// instead look at header.flag in the 61 command and set the version then.
|
||||
break;
|
||||
case 0x41: // GC Ep3 US (and BB)
|
||||
this->set_flag(Flag::NO_D6_AFTER_LOBBY);
|
||||
this->set_flag(Flag::USE_OVERFLOW_FOR_SEND_FUNCTION_CALL);
|
||||
this->set_flag(Flag::SEND_FUNCTION_CALL_NO_CACHE_PATCH);
|
||||
break;
|
||||
case 0x42: // GC Ep3 EU 50Hz
|
||||
case 0x43: // GC Ep3 EU 60Hz
|
||||
this->set_flag(Flag::NO_D6_AFTER_LOBBY);
|
||||
this->set_flag(Flag::CAN_RECEIVE_ENABLE_B2_QUEST);
|
||||
break;
|
||||
default:
|
||||
throw runtime_error(string_printf("unknown sub_version %" PRIX64, sub_version));
|
||||
|
||||
@@ -48,7 +48,6 @@ public:
|
||||
ENCRYPTED_SEND_FUNCTION_CALL = 0x0000000000002000,
|
||||
SEND_FUNCTION_CALL_CHECKSUM_ONLY = 0x0000000000004000,
|
||||
SEND_FUNCTION_CALL_NO_CACHE_PATCH = 0x0000000000008000,
|
||||
USE_OVERFLOW_FOR_SEND_FUNCTION_CALL = 0x0000000000010000,
|
||||
CAN_RECEIVE_ENABLE_B2_QUEST = 0x0000000000020000,
|
||||
AWAITING_ENABLE_B2_QUEST = 0x0000000000040000, // Server-side only
|
||||
|
||||
|
||||
+20
-31
@@ -236,20 +236,6 @@ static void send_proxy_destinations_menu(shared_ptr<Client> c) {
|
||||
send_menu(c, s->proxy_destinations_menu(c->version()));
|
||||
}
|
||||
|
||||
static bool send_enable_send_function_call_if_applicable(shared_ptr<Client> c) {
|
||||
auto s = c->require_server_state();
|
||||
if (function_compiler_available() && c->config.check_flag(Client::Flag::USE_OVERFLOW_FOR_SEND_FUNCTION_CALL)) {
|
||||
if (s->ep3_send_function_call_enabled) {
|
||||
send_quest_buffer_overflow(c);
|
||||
} else {
|
||||
c->config.clear_flag(Client::Flag::HAS_SEND_FUNCTION_CALL);
|
||||
}
|
||||
c->config.clear_flag(Client::Flag::USE_OVERFLOW_FOR_SEND_FUNCTION_CALL);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void on_connect(std::shared_ptr<Client> c) {
|
||||
@@ -379,7 +365,6 @@ void on_login_server_login_complete(shared_ptr<Client> c) {
|
||||
c->config.check_flag(Client::Flag::NO_D6) ||
|
||||
!c->config.check_flag(Client::Flag::AT_WELCOME_MESSAGE)) {
|
||||
c->config.clear_flag(Client::Flag::AT_WELCOME_MESSAGE);
|
||||
send_enable_send_function_call_if_applicable(c);
|
||||
send_update_client_config(c, false);
|
||||
send_main_menu(c);
|
||||
} else {
|
||||
@@ -398,10 +383,27 @@ void on_login_complete(shared_ptr<Client> c) {
|
||||
|
||||
if (c->config.check_flag(Client::Flag::CAN_RECEIVE_ENABLE_B2_QUEST) &&
|
||||
!c->config.check_flag(Client::Flag::HAS_SEND_FUNCTION_CALL) &&
|
||||
(s->ep12_plus_send_function_call_quest_num >= 0)) {
|
||||
auto q = s->quest_index(c->version())->get(s->ep12_plus_send_function_call_quest_num);
|
||||
(s->enable_send_function_call_quest_num >= 0)) {
|
||||
auto q = s->default_quest_index->get(s->enable_send_function_call_quest_num);
|
||||
if (q) {
|
||||
auto vq = q->version(c->version(), (c->sub_version == 0x39 ? 0 : 1));
|
||||
uint8_t q_language;
|
||||
switch (c->sub_version) {
|
||||
case 0x39:
|
||||
q_language = 0; // Japanese (JP Plus v1.5)
|
||||
break;
|
||||
case 0x42:
|
||||
case 0x43:
|
||||
q_language = 2; // German (EU Ep3)
|
||||
break;
|
||||
case 0x41:
|
||||
q_language = 4; // Spanish (US Ep3)
|
||||
break;
|
||||
case 0x36:
|
||||
case 0x3A:
|
||||
default:
|
||||
q_language = 1; // English (US Plus v1.2 + customizations)
|
||||
}
|
||||
auto vq = q->version(is_ep3(c->version()) ? Version::GC_V3 : c->version(), q_language);
|
||||
if (vq) {
|
||||
c->config.set_flag(Client::Flag::HAS_SEND_FUNCTION_CALL);
|
||||
c->config.set_flag(Client::Flag::SEND_FUNCTION_CALL_NO_CACHE_PATCH);
|
||||
@@ -908,18 +910,6 @@ static void on_9D_9E(shared_ptr<Client> c, uint16_t command, uint32_t, string& d
|
||||
c->channel.language = base_cmd->language;
|
||||
set_console_client_flags(c, base_cmd->sub_version);
|
||||
|
||||
// See system/client-functions/Episode3USAQuestBufferOverflow.ppc.s for where
|
||||
// this value gets set. We use this to determine if the client has already run
|
||||
// the code or not; sending it again when the client has already run it will
|
||||
// likely cause the client to crash.
|
||||
if (base_cmd->unused1 == 0x5F5CA297) {
|
||||
c->config.clear_flag(Client::Flag::USE_OVERFLOW_FOR_SEND_FUNCTION_CALL);
|
||||
c->config.set_flag(Client::Flag::HAS_SEND_FUNCTION_CALL);
|
||||
} else if (!s->ep3_send_function_call_enabled && c->config.check_flag(Client::Flag::USE_OVERFLOW_FOR_SEND_FUNCTION_CALL)) {
|
||||
c->config.clear_flag(Client::Flag::USE_OVERFLOW_FOR_SEND_FUNCTION_CALL);
|
||||
c->config.clear_flag(Client::Flag::HAS_SEND_FUNCTION_CALL);
|
||||
}
|
||||
|
||||
try {
|
||||
switch (c->version()) {
|
||||
case Version::DC_V2: {
|
||||
@@ -1775,7 +1765,6 @@ static void on_D6_V3(shared_ptr<Client> c, uint16_t, uint32_t, string& data) {
|
||||
send_menu(c, s->information_menu(c->version()));
|
||||
} else if (c->config.check_flag(Client::Flag::AT_WELCOME_MESSAGE)) {
|
||||
c->config.clear_flag(Client::Flag::AT_WELCOME_MESSAGE);
|
||||
send_enable_send_function_call_if_applicable(c);
|
||||
send_update_client_config(c, false);
|
||||
send_main_menu(c);
|
||||
}
|
||||
|
||||
+1
-2
@@ -793,8 +793,7 @@ void ServerState::load_config_early() {
|
||||
this->default_rare_notifs_enabled_v3_v4 = this->default_rare_notifs_enabled_v1_v2;
|
||||
this->default_rare_notifs_enabled_v1_v2 = this->config_json->get_bool("RareNotificationsEnabledByDefaultV1V2", this->default_rare_notifs_enabled_v1_v2);
|
||||
this->default_rare_notifs_enabled_v3_v4 = this->config_json->get_bool("RareNotificationsEnabledByDefaultV3V4", this->default_rare_notifs_enabled_v3_v4);
|
||||
this->ep12_plus_send_function_call_quest_num = this->config_json->get_int("PSOPlusSendFunctionCallQuestNumber", -1);
|
||||
this->ep3_send_function_call_enabled = this->config_json->get_bool("EnableEpisode3SendFunctionCall", false);
|
||||
this->enable_send_function_call_quest_num = this->config_json->get_int("EnableSendFunctionCallQuestNumber", -1);
|
||||
this->enable_v3_v4_protected_subcommands = this->config_json->get_bool("EnableV3V4ProtectedSubcommands", false);
|
||||
this->catch_handler_exceptions = this->config_json->get_bool("CatchHandlerExceptions", true);
|
||||
|
||||
|
||||
+1
-2
@@ -120,8 +120,7 @@ struct ServerState : public std::enable_shared_from_this<ServerState> {
|
||||
std::unordered_map<uint16_t, IntegralExpression> quest_flag_rewrites_v4;
|
||||
std::unordered_map<std::string, std::pair<uint8_t, uint32_t>> quest_counter_fields; // For $qfread command
|
||||
uint64_t persistent_game_idle_timeout_usecs = 0;
|
||||
int64_t ep12_plus_send_function_call_quest_num = -1;
|
||||
bool ep3_send_function_call_enabled = false;
|
||||
int64_t enable_send_function_call_quest_num = -1;
|
||||
bool enable_v3_v4_protected_subcommands = false;
|
||||
bool catch_handler_exceptions = true;
|
||||
bool ep3_infinite_meseta = false;
|
||||
|
||||
Reference in New Issue
Block a user