mirror of
https://github.com/Minestom/Minestom.git
synced 2024-11-18 00:25:30 +01:00
Server packet listener now takes a collection of player, for future network optimization
This commit is contained in:
parent
a0fccca1c6
commit
0739b57dd1
@ -339,7 +339,6 @@ public class Player extends LivingEntity implements CommandSender {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(long time) {
|
public void update(long time) {
|
||||||
|
|
||||||
// Network tick
|
// Network tick
|
||||||
this.playerConnection.update();
|
this.playerConnection.update();
|
||||||
|
|
||||||
|
@ -2,23 +2,21 @@ package net.minestom.server.listener.manager;
|
|||||||
|
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
import net.minestom.server.network.ConnectionManager;
|
import net.minestom.server.network.ConnectionManager;
|
||||||
|
import net.minestom.server.network.packet.client.ClientPlayPacket;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface used to add a listener for incoming/outgoing packets with
|
* Interface used to add a listener for incoming packets with {@link ConnectionManager#onPacketReceive(ClientPacketConsumer)}.
|
||||||
* {@link ConnectionManager#onPacketReceive(PacketConsumer)} and {@link ConnectionManager#onPacketSend(PacketConsumer)}.
|
|
||||||
*
|
|
||||||
* @param <T> the packet type
|
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface PacketConsumer<T> {
|
public interface ClientPacketConsumer {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a packet is received/sent from/to a client.
|
* Called when a packet is received from a client.
|
||||||
*
|
*
|
||||||
* @param player the player concerned by the packet
|
* @param player the player concerned by the packet
|
||||||
* @param packetController the packet controller, can be used to cancel the packet
|
* @param packetController the packet controller, can be used to cancel the packet
|
||||||
* @param packet the packet
|
* @param packet the packet
|
||||||
*/
|
*/
|
||||||
void accept(@NotNull Player player, @NotNull PacketController packetController, @NotNull T packet);
|
void accept(@NotNull Player player, @NotNull PacketController packetController, @NotNull ClientPlayPacket packet);
|
||||||
}
|
}
|
@ -1,9 +1,14 @@
|
|||||||
package net.minestom.server.listener.manager;
|
package net.minestom.server.listener.manager;
|
||||||
|
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
|
import net.minestom.server.network.packet.client.ClientPlayPacket;
|
||||||
|
import net.minestom.server.network.packet.server.ServerPacket;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to control the output of a packet in {@link PacketConsumer#accept(Player, PacketController, Object)}.
|
* Used to control the output of a packet in {@link ClientPacketConsumer#accept(Player, PacketController, ClientPlayPacket)}
|
||||||
|
* and {@link ServerPacketConsumer#accept(Collection, PacketController, ServerPacket)}.
|
||||||
*/
|
*/
|
||||||
public class PacketController {
|
public class PacketController {
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@ -74,8 +75,8 @@ public final class PacketListenerManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final PacketController packetController = new PacketController();
|
final PacketController packetController = new PacketController();
|
||||||
for (PacketConsumer<ClientPlayPacket> packetConsumer : CONNECTION_MANAGER.getReceivePacketConsumers()) {
|
for (ClientPacketConsumer clientPacketConsumer : CONNECTION_MANAGER.getReceivePacketConsumers()) {
|
||||||
packetConsumer.accept(player, packetController, packet);
|
clientPacketConsumer.accept(player, packetController, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packetController.isCancel())
|
if (packetController.isCancel())
|
||||||
@ -86,22 +87,21 @@ public final class PacketListenerManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the consumers from {@link ConnectionManager#onPacketSend(PacketConsumer)}.
|
* Executes the consumers from {@link ConnectionManager#onPacketSend(ServerPacketConsumer)}.
|
||||||
*
|
*
|
||||||
* @param packet the packet to process
|
* @param packet the packet to process
|
||||||
* @param player the player which should receive the packet
|
* @param players the players which should receive the packet
|
||||||
* @param <T> the packet type
|
|
||||||
* @return true if the packet is not cancelled, false otherwise
|
* @return true if the packet is not cancelled, false otherwise
|
||||||
*/
|
*/
|
||||||
public <T extends ServerPacket> boolean processServerPacket(@NotNull T packet, @NotNull Player player) {
|
public boolean processServerPacket(@NotNull ServerPacket packet, @NotNull Collection<Player> players) {
|
||||||
final List<PacketConsumer<ServerPacket>> consumers = CONNECTION_MANAGER.getSendPacketConsumers();
|
final List<ServerPacketConsumer> consumers = CONNECTION_MANAGER.getSendPacketConsumers();
|
||||||
if (consumers.isEmpty()) {
|
if (consumers.isEmpty()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
final PacketController packetController = new PacketController();
|
final PacketController packetController = new PacketController();
|
||||||
for (PacketConsumer<ServerPacket> packetConsumer : consumers) {
|
for (ServerPacketConsumer serverPacketConsumer : consumers) {
|
||||||
packetConsumer.accept(player, packetController, packet);
|
serverPacketConsumer.accept(players, packetController, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
return !packetController.isCancel();
|
return !packetController.isCancel();
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
package net.minestom.server.listener.manager;
|
||||||
|
|
||||||
|
import net.minestom.server.entity.Player;
|
||||||
|
import net.minestom.server.network.ConnectionManager;
|
||||||
|
import net.minestom.server.network.packet.server.ServerPacket;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface used to add a listener for outgoing packets with {@link ConnectionManager#onPacketSend(ServerPacket)}.
|
||||||
|
*
|
||||||
|
* @param <T> the packet type
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface ServerPacketConsumer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a packet is sent to a client.
|
||||||
|
*
|
||||||
|
* @param players the players who will receive the packet
|
||||||
|
* @param packetController the packet controller, can be used for cancelling
|
||||||
|
* @param packet the packet to send
|
||||||
|
*/
|
||||||
|
void accept(@NotNull Collection<Player> players, @NotNull PacketController packetController, @NotNull ServerPacket packet);
|
||||||
|
|
||||||
|
}
|
@ -3,10 +3,9 @@ package net.minestom.server.network;
|
|||||||
import net.minestom.server.chat.JsonMessage;
|
import net.minestom.server.chat.JsonMessage;
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
import net.minestom.server.entity.fakeplayer.FakePlayer;
|
import net.minestom.server.entity.fakeplayer.FakePlayer;
|
||||||
import net.minestom.server.listener.manager.PacketConsumer;
|
import net.minestom.server.listener.manager.ClientPacketConsumer;
|
||||||
import net.minestom.server.network.packet.client.ClientPlayPacket;
|
import net.minestom.server.listener.manager.ServerPacketConsumer;
|
||||||
import net.minestom.server.network.packet.client.login.LoginStartPacket;
|
import net.minestom.server.network.packet.client.login.LoginStartPacket;
|
||||||
import net.minestom.server.network.packet.server.ServerPacket;
|
|
||||||
import net.minestom.server.network.packet.server.login.LoginSuccessPacket;
|
import net.minestom.server.network.packet.server.login.LoginSuccessPacket;
|
||||||
import net.minestom.server.network.packet.server.play.ChatMessagePacket;
|
import net.minestom.server.network.packet.server.play.ChatMessagePacket;
|
||||||
import net.minestom.server.network.player.PlayerConnection;
|
import net.minestom.server.network.player.PlayerConnection;
|
||||||
@ -29,9 +28,9 @@ public final class ConnectionManager {
|
|||||||
private final Map<PlayerConnection, Player> connectionPlayerMap = Collections.synchronizedMap(new HashMap<>());
|
private final Map<PlayerConnection, Player> connectionPlayerMap = Collections.synchronizedMap(new HashMap<>());
|
||||||
|
|
||||||
// All the consumers to call once a packet is received
|
// All the consumers to call once a packet is received
|
||||||
private final List<PacketConsumer<ClientPlayPacket>> receivePacketConsumers = new CopyOnWriteArrayList<>();
|
private final List<ClientPacketConsumer> receiveClientPacketConsumers = new CopyOnWriteArrayList<>();
|
||||||
// All the consumers to call once a packet is sent
|
// All the consumers to call once a packet is sent
|
||||||
private final List<PacketConsumer<ServerPacket>> sendPacketConsumers = new CopyOnWriteArrayList<>();
|
private final List<ServerPacketConsumer> sendClientPacketConsumers = new CopyOnWriteArrayList<>();
|
||||||
// The uuid provider once a player login
|
// The uuid provider once a player login
|
||||||
private UuidProvider uuidProvider;
|
private UuidProvider uuidProvider;
|
||||||
// The player provider to have your own Player implementation
|
// The player provider to have your own Player implementation
|
||||||
@ -148,17 +147,17 @@ public final class ConnectionManager {
|
|||||||
* @return a list of packet's consumers
|
* @return a list of packet's consumers
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
public List<PacketConsumer<ClientPlayPacket>> getReceivePacketConsumers() {
|
public List<ClientPacketConsumer> getReceivePacketConsumers() {
|
||||||
return receivePacketConsumers;
|
return receiveClientPacketConsumers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a consumer to call once a packet is received.
|
* Adds a consumer to call once a packet is received.
|
||||||
*
|
*
|
||||||
* @param packetConsumer the packet consumer
|
* @param clientPacketConsumer the packet consumer
|
||||||
*/
|
*/
|
||||||
public void onPacketReceive(@NotNull PacketConsumer<ClientPlayPacket> packetConsumer) {
|
public void onPacketReceive(@NotNull ClientPacketConsumer clientPacketConsumer) {
|
||||||
this.receivePacketConsumers.add(packetConsumer);
|
this.receiveClientPacketConsumers.add(clientPacketConsumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -167,21 +166,17 @@ public final class ConnectionManager {
|
|||||||
* @return a list of packet's consumers
|
* @return a list of packet's consumers
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
public List<PacketConsumer<ServerPacket>> getSendPacketConsumers() {
|
public List<ServerPacketConsumer> getSendPacketConsumers() {
|
||||||
return Collections.unmodifiableList(sendPacketConsumers);
|
return Collections.unmodifiableList(sendClientPacketConsumers);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a consumer to call once a packet is sent.
|
* Adds a consumer to call once a packet is sent.
|
||||||
* <p>
|
|
||||||
* Be aware that it is possible for the same packet instance to be used multiple time,
|
|
||||||
* changing the object fields could lead to issues.
|
|
||||||
* (consider canceling the packet instead and send your own)
|
|
||||||
*
|
*
|
||||||
* @param packetConsumer the packet consumer
|
* @param serverPacketConsumer the packet consumer
|
||||||
*/
|
*/
|
||||||
public void onPacketSend(@NotNull PacketConsumer<ServerPacket> packetConsumer) {
|
public void onPacketSend(@NotNull ServerPacketConsumer serverPacketConsumer) {
|
||||||
this.sendPacketConsumers.add(packetConsumer);
|
this.sendClientPacketConsumers.add(serverPacketConsumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -4,8 +4,8 @@ import net.minestom.server.MinecraftServer;
|
|||||||
import net.minestom.server.chat.ChatColor;
|
import net.minestom.server.chat.ChatColor;
|
||||||
import net.minestom.server.chat.ColoredText;
|
import net.minestom.server.chat.ColoredText;
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
import net.minestom.server.listener.manager.PacketConsumer;
|
|
||||||
import net.minestom.server.listener.manager.PacketListenerManager;
|
import net.minestom.server.listener.manager.PacketListenerManager;
|
||||||
|
import net.minestom.server.listener.manager.ServerPacketConsumer;
|
||||||
import net.minestom.server.network.ConnectionManager;
|
import net.minestom.server.network.ConnectionManager;
|
||||||
import net.minestom.server.network.ConnectionState;
|
import net.minestom.server.network.ConnectionState;
|
||||||
import net.minestom.server.network.packet.server.ServerPacket;
|
import net.minestom.server.network.packet.server.ServerPacket;
|
||||||
@ -15,6 +15,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -92,7 +93,7 @@ public abstract class PlayerConnection {
|
|||||||
/**
|
/**
|
||||||
* Serializes the packet and send it to the client.
|
* Serializes the packet and send it to the client.
|
||||||
* <p>
|
* <p>
|
||||||
* Also responsible for executing {@link ConnectionManager#onPacketSend(PacketConsumer)} consumers.
|
* Also responsible for executing {@link ConnectionManager#onPacketSend(ServerPacketConsumer)} consumers.
|
||||||
*
|
*
|
||||||
* @param serverPacket the packet to send
|
* @param serverPacket the packet to send
|
||||||
* @see #shouldSendPacket(ServerPacket)
|
* @see #shouldSendPacket(ServerPacket)
|
||||||
@ -100,7 +101,8 @@ public abstract class PlayerConnection {
|
|||||||
public abstract void sendPacket(@NotNull ServerPacket serverPacket);
|
public abstract void sendPacket(@NotNull ServerPacket serverPacket);
|
||||||
|
|
||||||
protected boolean shouldSendPacket(@NotNull ServerPacket serverPacket) {
|
protected boolean shouldSendPacket(@NotNull ServerPacket serverPacket) {
|
||||||
return player == null || PACKET_LISTENER_MANAGER.processServerPacket(serverPacket, player);
|
return player == null ||
|
||||||
|
PACKET_LISTENER_MANAGER.processServerPacket(serverPacket, Collections.singleton(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user