don't mask Ep3 NTE game commands
This commit is contained in:
@@ -5506,6 +5506,8 @@ struct G_CardBattleCommandHeader {
|
|||||||
// set_mask_for_ep3_game_command in SendCommands.cc. The Episode 3 client
|
// set_mask_for_ep3_game_command in SendCommands.cc. The Episode 3 client
|
||||||
// never sends commands that have a nonzero value in this field, but it does
|
// never sends commands that have a nonzero value in this field, but it does
|
||||||
// properly handle received commands with nonzero values in this field.
|
// properly handle received commands with nonzero values in this field.
|
||||||
|
// This only applies to Episode 3 final - the Trial Edition does not support
|
||||||
|
// masking and may send uninitialized data in this field.
|
||||||
uint8_t mask_key = 0x00;
|
uint8_t mask_key = 0x00;
|
||||||
uint8_t unused2 = 0x00;
|
uint8_t unused2 = 0x00;
|
||||||
} __packed__;
|
} __packed__;
|
||||||
|
|||||||
@@ -203,6 +203,7 @@ void Server::send(const void* data, size_t size, uint8_t command, bool enable_ma
|
|||||||
|
|
||||||
string masked_data;
|
string masked_data;
|
||||||
if (enable_masking &&
|
if (enable_masking &&
|
||||||
|
(l->base_version != Version::GC_EP3_NTE) &&
|
||||||
!(this->options.behavior_flags & BehaviorFlag::DISABLE_MASKING) &&
|
!(this->options.behavior_flags & BehaviorFlag::DISABLE_MASKING) &&
|
||||||
(size >= 8)) {
|
(size >= 8)) {
|
||||||
masked_data.assign(reinterpret_cast<const char*>(data), size);
|
masked_data.assign(reinterpret_cast<const char*>(data), size);
|
||||||
|
|||||||
@@ -987,7 +987,7 @@ static HandlerResult S_6x(shared_ptr<ProxyServer::LinkedSession> ses, uint16_t,
|
|||||||
(static_cast<uint8_t>(data[0]) == 0xB4) ||
|
(static_cast<uint8_t>(data[0]) == 0xB4) ||
|
||||||
(static_cast<uint8_t>(data[0]) == 0xB5))) {
|
(static_cast<uint8_t>(data[0]) == 0xB5))) {
|
||||||
const auto& header = check_size_t<G_CardBattleCommandHeader>(data, 0xFFFF);
|
const auto& header = check_size_t<G_CardBattleCommandHeader>(data, 0xFFFF);
|
||||||
if (header.mask_key) {
|
if (header.mask_key && (ses->version() != Version::GC_EP3_NTE)) {
|
||||||
set_mask_for_ep3_game_command(data.data(), data.size(), 0);
|
set_mask_for_ep3_game_command(data.data(), data.size(), 0);
|
||||||
modified = true;
|
modified = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1294,7 +1294,7 @@ static bool add_next_game_client(shared_ptr<Lobby> l) {
|
|||||||
state_cmd.state.first_team_turn = 0xFF;
|
state_cmd.state.first_team_turn = 0xFF;
|
||||||
state_cmd.state.tournament_flag = 0x01;
|
state_cmd.state.tournament_flag = 0x01;
|
||||||
state_cmd.state.client_sc_card_types.clear(Episode3::CardType::INVALID_FF);
|
state_cmd.state.client_sc_card_types.clear(Episode3::CardType::INVALID_FF);
|
||||||
if (!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) {
|
if ((c->version() != Version::GC_EP3_NTE) && !(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) {
|
||||||
uint8_t mask_key = (random_object<uint32_t>() % 0xFF) + 1;
|
uint8_t mask_key = (random_object<uint32_t>() % 0xFF) + 1;
|
||||||
set_mask_for_ep3_game_command(&state_cmd, sizeof(state_cmd), mask_key);
|
set_mask_for_ep3_game_command(&state_cmd, sizeof(state_cmd), mask_key);
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-4
@@ -3109,7 +3109,8 @@ void send_ep3_set_tournament_player_decks(shared_ptr<Client> c) {
|
|||||||
add_entries_for_team(match->preceding_a->winner_team, 0);
|
add_entries_for_team(match->preceding_a->winner_team, 0);
|
||||||
add_entries_for_team(match->preceding_b->winner_team, 2);
|
add_entries_for_team(match->preceding_b->winner_team, 2);
|
||||||
|
|
||||||
if (!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) {
|
if ((c->version() != Version::GC_EP3_NTE) &&
|
||||||
|
!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) {
|
||||||
uint8_t mask_key = (random_object<uint32_t>() % 0xFF) + 1;
|
uint8_t mask_key = (random_object<uint32_t>() % 0xFF) + 1;
|
||||||
set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key);
|
set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key);
|
||||||
}
|
}
|
||||||
@@ -3170,7 +3171,8 @@ void send_ep3_tournament_match_result(shared_ptr<Lobby> l, uint32_t meseta_rewar
|
|||||||
cmd.winner_team_id = (match->preceding_b->winner_team == match->winner_team);
|
cmd.winner_team_id = (match->preceding_b->winner_team == match->winner_team);
|
||||||
cmd.meseta_amount = meseta_reward;
|
cmd.meseta_amount = meseta_reward;
|
||||||
cmd.meseta_reward_text.encode("You got %s meseta!", 1);
|
cmd.meseta_reward_text.encode("You got %s meseta!", 1);
|
||||||
if (!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) {
|
if ((lc->version() != Version::GC_EP3_NTE) &&
|
||||||
|
!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) {
|
||||||
uint8_t mask_key = (random_object<uint32_t>() % 0xFF) + 1;
|
uint8_t mask_key = (random_object<uint32_t>() % 0xFF) + 1;
|
||||||
set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key);
|
set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key);
|
||||||
}
|
}
|
||||||
@@ -3197,7 +3199,8 @@ void send_ep3_update_game_metadata(shared_ptr<Lobby> l) {
|
|||||||
{
|
{
|
||||||
G_SetGameMetadata_GC_Ep3_6xB4x52 cmd;
|
G_SetGameMetadata_GC_Ep3_6xB4x52 cmd;
|
||||||
cmd.total_spectators = total_spectators;
|
cmd.total_spectators = total_spectators;
|
||||||
if (!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) {
|
if ((l->base_version != Version::GC_EP3_NTE) &&
|
||||||
|
!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) {
|
||||||
uint8_t mask_key = (random_object<uint32_t>() % 0xFF) + 1;
|
uint8_t mask_key = (random_object<uint32_t>() % 0xFF) + 1;
|
||||||
set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key);
|
set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key);
|
||||||
}
|
}
|
||||||
@@ -3235,7 +3238,8 @@ void send_ep3_update_game_metadata(shared_ptr<Lobby> l) {
|
|||||||
cmd.total_spectators = total_spectators;
|
cmd.total_spectators = total_spectators;
|
||||||
cmd.text_size = text.size();
|
cmd.text_size = text.size();
|
||||||
cmd.text.encode(text, 1);
|
cmd.text.encode(text, 1);
|
||||||
if (!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) {
|
if ((watcher_l->base_version != Version::GC_EP3_NTE) &&
|
||||||
|
!(s->ep3_behavior_flags & Episode3::BehaviorFlag::DISABLE_MASKING)) {
|
||||||
uint8_t mask_key = (random_object<uint32_t>() % 0xFF) + 1;
|
uint8_t mask_key = (random_object<uint32_t>() % 0xFF) + 1;
|
||||||
set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key);
|
set_mask_for_ep3_game_command(&cmd, sizeof(cmd), mask_key);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user