feat(player): estat EXITED i porta oberta despawna jugadors via player_exited
This commit is contained in:
1 parent
377e5d0b97
commit
5c5cd1d5da
5 files changed
+93
-22
No files matched your search
@@ -66,15 +66,22 @@ void Door::update(float delta_time) {
|
||||
}
|
||||
|
||||
void Door::onPlayerContact(Player* player) {
|
||||
if (state_ != State::OPEN || level_complete_emitted_) { return; }
|
||||
// Només la porta OPEN despawna jugadors. CLOSED/OPENING ignoren el
|
||||
// contacte (i a més, en CLOSED, el `Map::collides` ja bloqueja el
|
||||
// moviment, així que el contacte no es dóna en condicions normals).
|
||||
if (state_ != State::OPEN || player == nullptr || player->isExited()) { return; }
|
||||
// Marquem el jugador com a EXITED i publiquem l'event d'agregació.
|
||||
// El check `isExited` de la guarda anterior garanteix que només
|
||||
// emetem l'event en la primera transició — `EntityManager` compta
|
||||
// emissions per decidir quan publicar `level_complete`.
|
||||
player->exit();
|
||||
if (bus_ != nullptr) {
|
||||
bus_->publish(Event{
|
||||
.name = "level_complete",
|
||||
.name = "player_exited",
|
||||
.payload = std::monostate{},
|
||||
.player_id = (player != nullptr) ? player->getId() : -1,
|
||||
.player_id = player->getId(),
|
||||
});
|
||||
}
|
||||
level_complete_emitted_ = true;
|
||||
}
|
||||
|
||||
void Door::open() {
|
||||
|
||||
Reference in new issue
Block a user