fix objects not appearing in boss rooms after rejoining persisted game

This commit is contained in:
Martin Michelsen
2024-09-27 22:52:01 -07:00
parent c8b8bf43f7
commit aa4a773095
3 changed files with 6 additions and 22 deletions
+2 -18
View File
@@ -1849,29 +1849,13 @@ static void server_command_warp(shared_ptr<Client> c, const std::string& args, b
auto s = c->require_server_state();
auto l = c->require_lobby();
check_is_game(l, true);
check_cheats_enabled(l, c);
uint32_t floor = stoul(args, nullptr, 0);
if (c->floor == floor) {
if (!is_warpall && (c->floor == floor)) {
return;
}
// Special case: $warp[me] 0 is allowed in boss arenas if the boss is already
// defeated, even if cheats are disabled. This is because if a player returns
// to a boss arena after a persistence gap in the game, the exit warp won't
// exist, so they need a way to get out.
bool should_check_cheats = is_warpall || (floor != 0) || !floor_is_boss_arena(l->episode, c->floor);
if (!should_check_cheats) {
for (const auto* event : l->map->get_events(c->floor)) {
if (!(event->flags & 0x18)) {
should_check_cheats = true;
break;
}
}
}
if (should_check_cheats) {
check_cheats_enabled(l, c);
}
size_t limit = floor_limit_for_episode(l->episode);
if (limit == 0) {
return;
+2 -2
View File
@@ -2999,8 +2999,8 @@ static void on_set_entity_set_flag(shared_ptr<Client> c, uint8_t command, uint8_
l->log.info("(W-%02hhX-%" PRIX32 " script) construct_objects %04hX %04hX", event->floor, event->event_id, section, group);
for (auto* obj : l->map->get_objects(event->floor, section, group)) {
if (!(obj->set_flags & 0x0A)) {
l->log.info("(W-%02hhX-%" PRIX32 " script) Setting flags 0012 on object K-%hX", event->floor, event->event_id, obj->object_id);
obj->set_flags |= 0x12;
l->log.info("(W-%02hhX-%" PRIX32 " script) Setting flags 0010 on object K-%hX", event->floor, event->event_id, obj->object_id);
obj->set_flags |= 0x10;
}
}
break;