make $exit command work in games
This commit is contained in:
@@ -297,6 +297,9 @@ static void server_command_exit(shared_ptr<ServerState> s, shared_ptr<Lobby> l,
|
||||
if (l->is_game()) {
|
||||
if (c->flags & Client::Flag::IS_EPISODE_3) {
|
||||
c->channel.send(0xED, 0x00);
|
||||
} else if (l->flags & (Lobby::Flag::QUEST_IN_PROGRESS | Lobby::Flag::JOINABLE_QUEST_IN_PROGRESS)) {
|
||||
G_UnusedHeader cmd = {0x73, 0x01, 0x0000};
|
||||
c->channel.send(0x60, 0x00, cmd);
|
||||
} else {
|
||||
send_text_message(c, u"$C6You must return to\nthe lobby first");
|
||||
}
|
||||
@@ -318,6 +321,9 @@ static void proxy_command_exit(shared_ptr<ServerState>,
|
||||
if (session.is_in_game) {
|
||||
if (session.newserv_client_config.cfg.flags & Client::Flag::IS_EPISODE_3) {
|
||||
session.client_channel.send(0xED, 0x00);
|
||||
} else if (session.is_in_quest) {
|
||||
G_UnusedHeader cmd = {0x73, 0x01, 0x0000};
|
||||
session.client_channel.send(0x60, 0x00, cmd);
|
||||
} else {
|
||||
send_text_message(session.client_channel, u"$C6You must return to\nthe lobby first");
|
||||
}
|
||||
|
||||
+15
-1
@@ -1281,6 +1281,7 @@ static HandlerResult S_65_67_68_EB(shared_ptr<ServerState>,
|
||||
if (command == 0x67) {
|
||||
session.clear_lobby_players(12);
|
||||
session.is_in_game = false;
|
||||
session.is_in_quest = false;
|
||||
session.area = 0x0F;
|
||||
|
||||
// This command can cause the client to no longer send D6 responses when
|
||||
@@ -1360,6 +1361,7 @@ static HandlerResult S_64(shared_ptr<ServerState>,
|
||||
session.clear_lobby_players(4);
|
||||
session.area = 0;
|
||||
session.is_in_game = true;
|
||||
session.is_in_quest = false;
|
||||
|
||||
bool modified = false;
|
||||
|
||||
@@ -1412,6 +1414,7 @@ static HandlerResult S_E8(shared_ptr<ServerState>,
|
||||
session.clear_lobby_players(12);
|
||||
session.area = 0;
|
||||
session.is_in_game = true;
|
||||
session.is_in_quest = false;
|
||||
|
||||
bool modified = false;
|
||||
|
||||
@@ -1457,6 +1460,16 @@ static HandlerResult S_E8(shared_ptr<ServerState>,
|
||||
return modified ? HandlerResult::Type::MODIFIED : HandlerResult::Type::FORWARD;
|
||||
}
|
||||
|
||||
static HandlerResult S_AC(shared_ptr<ServerState>,
|
||||
ProxyServer::LinkedSession& session, uint16_t, uint32_t, string&) {
|
||||
if (!session.is_in_game) {
|
||||
return HandlerResult::Type::SUPPRESS;
|
||||
} else {
|
||||
session.is_in_quest = true;
|
||||
return HandlerResult::Type::FORWARD;
|
||||
}
|
||||
}
|
||||
|
||||
static HandlerResult S_66_69_E9(shared_ptr<ServerState>,
|
||||
ProxyServer::LinkedSession& session, uint16_t, uint32_t, string& data) {
|
||||
const auto& cmd = check_size_t<S_LeaveLobby_66_69_Ep3_E9>(data);
|
||||
@@ -1481,6 +1494,7 @@ static HandlerResult C_98(shared_ptr<ServerState> s,
|
||||
ProxyServer::LinkedSession& session, uint16_t command, uint32_t flag, string& data) {
|
||||
session.area = 0x0F;
|
||||
session.is_in_game = false;
|
||||
session.is_in_quest = false;
|
||||
if (session.version == GameVersion::GC ||
|
||||
session.version == GameVersion::XB ||
|
||||
session.version == GameVersion::BB) {
|
||||
@@ -1852,7 +1866,7 @@ static on_command_t handlers[0x100][6][2] = {
|
||||
/* A9 */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}},
|
||||
/* AA */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}},
|
||||
/* AB */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}},
|
||||
/* AC */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}, {nullptr, nullptr}},
|
||||
/* AC */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_AC, nullptr}, {S_AC, nullptr}, {S_AC, nullptr}},
|
||||
/* AD */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}},
|
||||
/* AE */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}},
|
||||
/* AF */ {{S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}, {S_invalid, nullptr}},
|
||||
|
||||
+2
-1
@@ -473,7 +473,8 @@ ProxyServer::LinkedSession::LinkedSession(
|
||||
area(0),
|
||||
x(0.0),
|
||||
z(0.0),
|
||||
is_in_game(false) {
|
||||
is_in_game(false),
|
||||
is_in_quest(false) {
|
||||
this->last_switch_enabled_command.header.subcommand = 0;
|
||||
memset(this->prev_server_command_bytes, 0, sizeof(this->prev_server_command_bytes));
|
||||
}
|
||||
|
||||
@@ -89,6 +89,7 @@ public:
|
||||
float x;
|
||||
float z;
|
||||
bool is_in_game;
|
||||
bool is_in_quest;
|
||||
|
||||
std::shared_ptr<PSOBBMultiKeyDetectorEncryption> detector_crypt;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user