diff --git a/engine/src/main/java/org/terasology/engine/network/events/BeforeDisconnectEvent.java b/engine/src/main/java/org/terasology/engine/network/events/BeforeDisconnectEvent.java new file mode 100644 index 00000000000..6992ffdb35a --- /dev/null +++ b/engine/src/main/java/org/terasology/engine/network/events/BeforeDisconnectEvent.java @@ -0,0 +1,15 @@ +// Copyright 2022 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + +package org.terasology.engine.network.events; + +import org.terasology.gestalt.entitysystem.event.Event; + +/** + * Event notifying of a client scheduled for disconnect. + */ +public class BeforeDisconnectEvent implements Event { + + public BeforeDisconnectEvent() { + } +} diff --git a/engine/src/main/java/org/terasology/engine/network/internal/NetworkSystemImpl.java b/engine/src/main/java/org/terasology/engine/network/internal/NetworkSystemImpl.java index 7aa65acc640..39e51653daf 100644 --- a/engine/src/main/java/org/terasology/engine/network/internal/NetworkSystemImpl.java +++ b/engine/src/main/java/org/terasology/engine/network/internal/NetworkSystemImpl.java @@ -53,6 +53,7 @@ import org.terasology.engine.network.NetworkMode; import org.terasology.engine.network.NetworkSystem; import org.terasology.engine.network.Server; +import org.terasology.engine.network.events.BeforeDisconnectEvent; import org.terasology.engine.network.events.ConnectedEvent; import org.terasology.engine.network.events.DisconnectedEvent; import org.terasology.engine.network.exceptions.HostingFailedException; @@ -354,7 +355,10 @@ private void processPendingDisconnects() { if (!disconnectedClients.isEmpty()) { List removedPlayers = Lists.newArrayListWithExpectedSize(disconnectedClients.size()); disconnectedClients.drainTo(removedPlayers); - removedPlayers.forEach(this::processRemovedClient); + for (NetClient client : removedPlayers) { + client.getEntity().send(new BeforeDisconnectEvent()); + processRemovedClient(client); + } } }