fix quest expr checks from lobby
This commit is contained in:
+21
-6
@@ -350,6 +350,7 @@ shared_ptr<const TeamIndex::Team> Client::team() const {
|
|||||||
|
|
||||||
bool Client::evaluate_quest_availability_expression(
|
bool Client::evaluate_quest_availability_expression(
|
||||||
shared_ptr<const QuestAvailabilityExpression> expr,
|
shared_ptr<const QuestAvailabilityExpression> expr,
|
||||||
|
shared_ptr<const Lobby> game,
|
||||||
uint8_t event,
|
uint8_t event,
|
||||||
uint8_t difficulty,
|
uint8_t difficulty,
|
||||||
size_t num_players,
|
size_t num_players,
|
||||||
@@ -360,10 +361,12 @@ bool Client::evaluate_quest_availability_expression(
|
|||||||
if (!expr) {
|
if (!expr) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
auto l = this->lobby.lock();
|
if (game && !game->quest_flag_values) {
|
||||||
|
throw logic_error("quest flags are missing from game");
|
||||||
|
}
|
||||||
auto p = this->character();
|
auto p = this->character();
|
||||||
QuestAvailabilityExpression::Env env = {
|
QuestAvailabilityExpression::Env env = {
|
||||||
.flags = (l && !l->quest_flags_known) ? &l->quest_flag_values->data.at(difficulty) : &p->quest_flags.data.at(difficulty),
|
.flags = (game && !game->quest_flags_known) ? &game->quest_flag_values->data.at(difficulty) : &p->quest_flags.data.at(difficulty),
|
||||||
.challenge_records = &p->challenge_records,
|
.challenge_records = &p->challenge_records,
|
||||||
.team = this->team(),
|
.team = this->team(),
|
||||||
.num_players = num_players,
|
.num_players = num_players,
|
||||||
@@ -378,12 +381,24 @@ bool Client::evaluate_quest_availability_expression(
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Client::can_see_quest(shared_ptr<const Quest> q, uint8_t event, uint8_t difficulty, size_t num_players, bool v1_present) const {
|
bool Client::can_see_quest(
|
||||||
return this->evaluate_quest_availability_expression(q->available_expression, event, difficulty, num_players, v1_present);
|
shared_ptr<const Quest> q,
|
||||||
|
shared_ptr<const Lobby> game,
|
||||||
|
uint8_t event,
|
||||||
|
uint8_t difficulty,
|
||||||
|
size_t num_players,
|
||||||
|
bool v1_present) const {
|
||||||
|
return this->evaluate_quest_availability_expression(q->available_expression, game, event, difficulty, num_players, v1_present);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Client::can_play_quest(shared_ptr<const Quest> q, uint8_t event, uint8_t difficulty, size_t num_players, bool v1_present) const {
|
bool Client::can_play_quest(
|
||||||
return this->evaluate_quest_availability_expression(q->enabled_expression, event, difficulty, num_players, v1_present);
|
shared_ptr<const Quest> q,
|
||||||
|
shared_ptr<const Lobby> game,
|
||||||
|
uint8_t event,
|
||||||
|
uint8_t difficulty,
|
||||||
|
size_t num_players,
|
||||||
|
bool v1_present) const {
|
||||||
|
return this->evaluate_quest_availability_expression(q->enabled_expression, game, event, difficulty, num_players, v1_present);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Client::can_use_chat_commands() const {
|
bool Client::can_use_chat_commands() const {
|
||||||
|
|||||||
+15
-2
@@ -294,12 +294,25 @@ public:
|
|||||||
|
|
||||||
bool evaluate_quest_availability_expression(
|
bool evaluate_quest_availability_expression(
|
||||||
std::shared_ptr<const QuestAvailabilityExpression> expr,
|
std::shared_ptr<const QuestAvailabilityExpression> expr,
|
||||||
|
std::shared_ptr<const Lobby> game,
|
||||||
|
uint8_t event,
|
||||||
|
uint8_t difficulty,
|
||||||
|
size_t num_players,
|
||||||
|
bool v1_present) const;
|
||||||
|
bool can_see_quest(
|
||||||
|
std::shared_ptr<const Quest> q,
|
||||||
|
std::shared_ptr<const Lobby> game,
|
||||||
|
uint8_t event,
|
||||||
|
uint8_t difficulty,
|
||||||
|
size_t num_players,
|
||||||
|
bool v1_present) const;
|
||||||
|
bool can_play_quest(
|
||||||
|
std::shared_ptr<const Quest> q,
|
||||||
|
std::shared_ptr<const Lobby> game,
|
||||||
uint8_t event,
|
uint8_t event,
|
||||||
uint8_t difficulty,
|
uint8_t difficulty,
|
||||||
size_t num_players,
|
size_t num_players,
|
||||||
bool v1_present) const;
|
bool v1_present) const;
|
||||||
bool can_see_quest(std::shared_ptr<const Quest> q, uint8_t event, uint8_t difficulty, size_t num_players, bool v1_present) const;
|
|
||||||
bool can_play_quest(std::shared_ptr<const Quest> q, uint8_t event, uint8_t difficulty, size_t num_players, bool v1_present) const;
|
|
||||||
|
|
||||||
bool can_use_chat_commands() const;
|
bool can_use_chat_commands() const;
|
||||||
|
|
||||||
|
|||||||
+6
-4
@@ -816,8 +816,9 @@ Lobby::JoinError Lobby::join_error_for_client(std::shared_ptr<Client> c, const s
|
|||||||
if (this->quest) {
|
if (this->quest) {
|
||||||
size_t num_clients = this->count_clients() + 1;
|
size_t num_clients = this->count_clients() + 1;
|
||||||
bool v1_present = is_v1(c->version()) || this->any_v1_clients_present();
|
bool v1_present = is_v1(c->version()) || this->any_v1_clients_present();
|
||||||
if (!c->can_see_quest(this->quest, this->event, this->difficulty, num_clients, v1_present) ||
|
auto this_sh = this->shared_from_this();
|
||||||
!c->can_play_quest(this->quest, this->event, this->difficulty, num_clients, v1_present)) {
|
if (!c->can_see_quest(this->quest, this_sh, this->event, this->difficulty, num_clients, v1_present) ||
|
||||||
|
!c->can_play_quest(this->quest, this_sh, this->event, this->difficulty, num_clients, v1_present)) {
|
||||||
return JoinError::NO_ACCESS_TO_QUEST;
|
return JoinError::NO_ACCESS_TO_QUEST;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -930,10 +931,11 @@ QuestIndex::IncludeCondition Lobby::quest_include_condition() const {
|
|||||||
return [this, num_players, v1_present](shared_ptr<const Quest> q) -> QuestIndex::IncludeState {
|
return [this, num_players, v1_present](shared_ptr<const Quest> q) -> QuestIndex::IncludeState {
|
||||||
bool is_enabled = true;
|
bool is_enabled = true;
|
||||||
for (const auto& lc : this->clients) {
|
for (const auto& lc : this->clients) {
|
||||||
if (lc && !lc->can_see_quest(q, this->event, this->difficulty, num_players, v1_present)) {
|
auto this_sh = this->shared_from_this();
|
||||||
|
if (lc && !lc->can_see_quest(q, this_sh, this->event, this->difficulty, num_players, v1_present)) {
|
||||||
return QuestIndex::IncludeState::HIDDEN;
|
return QuestIndex::IncludeState::HIDDEN;
|
||||||
}
|
}
|
||||||
if (lc && !lc->can_play_quest(q, this->event, this->difficulty, num_players, v1_present)) {
|
if (lc && !lc->can_play_quest(q, this_sh, this->event, this->difficulty, num_players, v1_present)) {
|
||||||
is_enabled = false;
|
is_enabled = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user