Ignore offline players when sending overdue packets.

This commit is contained in:
Kristian S. Stangeland 2012-10-02 23:05:31 +02:00
parent 1e1875cbd8
commit 3f1b5d49e9
6 changed files with 64 additions and 6 deletions

View File

@ -6,6 +6,8 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.PriorityBlockingQueue;
import org.bukkit.entity.Player;
import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.reflect.FieldAccessException; import com.comphenix.protocol.reflect.FieldAccessException;
@ -112,7 +114,10 @@ class PacketSendingQueue {
if (marker.isProcessed() || marker.hasExpired()) { if (marker.isProcessed() || marker.hasExpired()) {
if (marker.isProcessed() && !current.isCancelled()) { if (marker.isProcessed() && !current.isCancelled()) {
sendPacket(current); // Silently skip players that have logged out
if (isOnline(current.getPlayer())) {
sendPacket(current);
}
} }
sendingQueue.poll(); sendingQueue.poll();
@ -125,6 +130,10 @@ class PacketSendingQueue {
} }
} }
private boolean isOnline(Player player) {
return player != null && player.isOnline();
}
/** /**
* Send every packet, regardless of the processing state. * Send every packet, regardless of the processing state.
*/ */

View File

@ -13,6 +13,7 @@ import org.bukkit.Server;
import com.comphenix.protocol.reflect.FieldUtils; import com.comphenix.protocol.reflect.FieldUtils;
import com.comphenix.protocol.reflect.FuzzyReflection; import com.comphenix.protocol.reflect.FuzzyReflection;
import com.comphenix.protocol.reflect.ObjectCloner;
import com.comphenix.protocol.reflect.VolatileField; import com.comphenix.protocol.reflect.VolatileField;
/** /**

View File

@ -18,6 +18,7 @@ import org.bukkit.entity.Player;
import com.comphenix.protocol.events.PacketListener; import com.comphenix.protocol.events.PacketListener;
import com.comphenix.protocol.reflect.FieldUtils; import com.comphenix.protocol.reflect.FieldUtils;
import com.comphenix.protocol.reflect.FuzzyReflection; import com.comphenix.protocol.reflect.FuzzyReflection;
import com.comphenix.protocol.reflect.ObjectCloner;
import com.comphenix.protocol.reflect.instances.CollectionGenerator; import com.comphenix.protocol.reflect.instances.CollectionGenerator;
import com.comphenix.protocol.reflect.instances.DefaultInstances; import com.comphenix.protocol.reflect.instances.DefaultInstances;
import com.comphenix.protocol.reflect.instances.ExistingGenerator; import com.comphenix.protocol.reflect.instances.ExistingGenerator;

View File

@ -403,6 +403,8 @@ public final class PacketFilterManager implements ProtocolManager {
if (packet == null) if (packet == null)
throw new IllegalArgumentException("packet cannot be NULL."); throw new IllegalArgumentException("packet cannot be NULL.");
sender.is
PlayerInjector injector = getInjector(sender); PlayerInjector injector = getInjector(sender);
Packet mcPacket = packet.getHandle(); Packet mcPacket = packet.getHandle();
@ -503,10 +505,21 @@ public final class PacketFilterManager implements ProtocolManager {
try { try {
injector = getHookInstance(player, currentHook); injector = getHookInstance(player, currentHook);
injector.injectManager(); injector.injectManager();
DataInputStream inputStream = injector.getInputStream(false);
if (!player.isOnline() || inputStream == null) {
throw new PlayerLoggedOutException();
}
playerInjection.put(player, injector); playerInjection.put(player, injector);
connectionLookup.put(injector.getInputStream(false), player); connectionLookup.put(inputStream, player);
break; break;
} catch (PlayerLoggedOutException e) {
throw e;
} catch (Exception e) { } catch (Exception e) {
// Mark this injection attempt as a failure // Mark this injection attempt as a failure

View File

@ -0,0 +1,36 @@
package com.comphenix.protocol.injector;
/**
* Invoked when attempting to use a player that has already logged out.
*
* @author Kristian
*/
public class PlayerLoggedOutException extends RuntimeException {
public PlayerLoggedOutException() {
// Default error message
super("Cannot inject a player that has already logged out.");
}
public PlayerLoggedOutException(String message, Throwable cause) {
super(message, cause);
}
public PlayerLoggedOutException(String message) {
super(message);
}
public PlayerLoggedOutException(Throwable cause) {
super(cause);
}
/**
* Construct an exception from a formatted message.
* @param message - the message to format.
* @param params - parameters.
* @return The formated exception
*/
public static PlayerLoggedOutException fromFormat(String message, Object... params) {
return new PlayerLoggedOutException(String.format(message, params));
}
}

View File

@ -1,17 +1,15 @@
package com.comphenix.protocol.injector; package com.comphenix.protocol.reflect;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import com.comphenix.protocol.reflect.FieldAccessException;
import com.comphenix.protocol.reflect.StructureModifier;
/** /**
* Can copy an object field by field. * Can copy an object field by field.
* *
* @author Kristian * @author Kristian
*/ */
class ObjectCloner { public class ObjectCloner {
// Cache structure modifiers // Cache structure modifiers
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")