diff --git a/src/Map.cc b/src/Map.cc index b09d549e..ff8a7b70 100644 --- a/src/Map.cc +++ b/src/Map.cc @@ -1480,23 +1480,29 @@ void Map::add_event(uint32_t event_id, uint16_t flags, uint8_t floor, uint16_t s ev.flags = flags; ev.floor = floor; ev.action_stream_offset = action_stream_offset; - uint64_t k = (static_cast(floor) << 32) | event_id; - if (!this->floor_and_event_id_to_index.emplace(k, index).second) { - this->log.warning("Duplicate event ID: W-%02hhX-%" PRIX32, floor, event_id); - } + uint64_t k = (static_cast(floor) << 32) | event_id; + this->floor_and_event_id_to_index.emplace(k, index); k = section_index_key(floor, section, wave_number); this->floor_section_and_wave_number_to_event_index.emplace(k, index); } -Map::Event& Map::get_event(uint8_t floor, uint32_t event_id) { +vector Map::get_events(uint8_t floor, uint32_t event_id) { uint64_t k = (static_cast(floor) << 32) | event_id; - return this->events.at(this->floor_and_event_id_to_index.at(k)); + vector ret; + for (auto its = this->floor_and_event_id_to_index.equal_range(k); its.first != its.second; its.first++) { + ret.emplace_back(&this->events.at(its.first->second)); + } + return ret; } -const Map::Event& Map::get_event(uint8_t floor, uint32_t event_id) const { +vector Map::get_events(uint8_t floor, uint32_t event_id) const { uint64_t k = (static_cast(floor) << 32) | event_id; - return this->events.at(this->floor_and_event_id_to_index.at(k)); + vector ret; + for (auto its = this->floor_and_event_id_to_index.equal_range(k); its.first != its.second; its.first++) { + ret.emplace_back(&this->events.at(its.first->second)); + } + return ret; } void Map::add_events_from_map_data(uint8_t floor, const void* data, size_t size) { diff --git a/src/Map.hh b/src/Map.hh index cd970812..375e7546 100644 --- a/src/Map.hh +++ b/src/Map.hh @@ -330,8 +330,8 @@ struct Map { uint16_t section, uint16_t wave_number, uint32_t action_stream_offset); - Event& get_event(uint8_t floor, uint32_t event_id); - const Event& get_event(uint8_t floor, uint32_t event_id) const; + std::vector get_events(uint8_t floor, uint32_t event_id); + std::vector get_events(uint8_t floor, uint32_t event_id) const; void add_events_from_map_data(uint8_t floor, const void* data, size_t size); struct DATSectionsForFloor { @@ -373,7 +373,7 @@ struct Map { std::vector rare_enemy_indexes; std::vector events; std::string event_action_stream; - std::map floor_and_event_id_to_index; + std::multimap floor_and_event_id_to_index; std::unordered_multimap floor_section_and_group_to_object_index; std::unordered_multimap floor_section_and_wave_number_to_enemy_index; std::unordered_multimap floor_section_and_wave_number_to_event_index; diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 87287adc..c390bacb 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -2924,12 +2924,12 @@ static void on_trigger_set_event(shared_ptr c, uint8_t command, uint8_t const auto& cmd = check_size_t(data, size); if (l->map) { - try { - l->map->get_event(cmd.floor, cmd.event_id).flags |= 0x04; - l->log.info("Client triggered set event W-%02" PRIX32 "-%" PRIX32, cmd.floor.load(), cmd.event_id.load()); - } catch (const out_of_range&) { - l->log.warning("Client triggered missing set event W-%02" PRIX32 "-%" PRIX32, cmd.floor.load(), cmd.event_id.load()); + auto events = l->map->get_events(cmd.floor, cmd.event_id); + for (auto* event : events) { + event->flags |= 0x04; } + l->log.info("Client triggered set event W-%02" PRIX32 "-%" PRIX32 " (%zu events)", + cmd.floor.load(), cmd.event_id.load(), events.size()); } forward_subcommand(c, command, flag, data, size);