mirror of
https://github.com/dmulloy2/ProtocolLib.git
synced 2024-06-27 07:14:42 +02:00
To note: this is yet another compatibility change for my Geyser work, but https://github.com/PaperMC/Paper/pull/5611 will also break without these changes as Unix domain sockets don't implement SocketChannel. The temporary player method delegation directed the isOnline and getName methods to functions that require the channel to be an instance of SocketChannel, when this won't always be the case. To solve this, this PR redirects `getSocket().getRemoteSocketAddress()` to `injector.getAddress()` which returns the same value. To determine if the player is online, a new method is created in SocketInjector to determine if a connection is online (which also returns the same value as before this commit).
89 lines
2.3 KiB
Java
89 lines
2.3 KiB
Java
package com.comphenix.protocol.injector.server;
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.net.Socket;
|
|
import java.net.SocketAddress;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import com.comphenix.protocol.events.NetworkMarker;
|
|
|
|
public class BukkitSocketInjector implements SocketInjector {
|
|
private Player player;
|
|
|
|
// Queue of server packets
|
|
private List<QueuedSendPacket> syncronizedQueue = Collections.synchronizedList(new ArrayList<QueuedSendPacket>());
|
|
|
|
/**
|
|
* Represents a temporary socket injector.
|
|
* @param player - a temporary player.
|
|
*/
|
|
public BukkitSocketInjector(Player player) {
|
|
if (player == null)
|
|
throw new IllegalArgumentException("Player cannot be NULL.");
|
|
this.player = player;
|
|
}
|
|
|
|
@Override
|
|
public Socket getSocket() throws IllegalAccessException {
|
|
throw new UnsupportedOperationException("Cannot get socket from Bukkit player.");
|
|
}
|
|
|
|
@Override
|
|
public SocketAddress getAddress() throws IllegalAccessException {
|
|
return player.getAddress();
|
|
}
|
|
|
|
@Override
|
|
public void disconnect(String message) throws InvocationTargetException {
|
|
player.kickPlayer(message);
|
|
}
|
|
|
|
@Override
|
|
public void sendServerPacket(Object packet, NetworkMarker marker, boolean filtered)
|
|
throws InvocationTargetException {
|
|
QueuedSendPacket command = new QueuedSendPacket(packet, marker, filtered);
|
|
|
|
// Queue until we can find something better
|
|
syncronizedQueue.add(command);
|
|
}
|
|
|
|
@Override
|
|
public Player getPlayer() {
|
|
return player;
|
|
}
|
|
|
|
@Override
|
|
public Player getUpdatedPlayer() {
|
|
return player;
|
|
}
|
|
|
|
@Override
|
|
public void transferState(SocketInjector delegate) {
|
|
// Transmit all queued packets to a different injector.
|
|
try {
|
|
synchronized(syncronizedQueue) {
|
|
for (QueuedSendPacket command : syncronizedQueue) {
|
|
delegate.sendServerPacket(command.getPacket(), command.getMarker(), command.isFiltered());
|
|
}
|
|
syncronizedQueue.clear();
|
|
}
|
|
} catch (InvocationTargetException e) {
|
|
throw new RuntimeException("Unable to transmit packets to " + delegate + " from old injector.", e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setUpdatedPlayer(Player updatedPlayer) {
|
|
this.player = updatedPlayer;
|
|
}
|
|
|
|
@Override
|
|
public boolean isConnected() {
|
|
return player.isOnline();
|
|
}
|
|
}
|