diff --git a/Server/src/main/java/core/net/IoEventHandler.java b/Server/src/main/java/core/net/IoEventHandler.java index dfcd684db..abf3e6295 100644 --- a/Server/src/main/java/core/net/IoEventHandler.java +++ b/Server/src/main/java/core/net/IoEventHandler.java @@ -72,7 +72,8 @@ public class IoEventHandler { } catch (IOException e) { if (e.getMessage().contains("reset by peer")) { session.disconnect(); - session.getPlayer().clear(true); + if (session.getPlayer() != null) + session.getPlayer().clear(true); } else e.printStackTrace(); } buffer.flip(); diff --git a/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt b/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt index b975c3118..aa2be3b2f 100644 --- a/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt +++ b/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt @@ -6,6 +6,7 @@ import core.net.packet.out.* import rs09.game.system.SystemLogger import java.util.* import java.util.concurrent.locks.ReentrantLock +import kotlin.NoSuchElementException import kotlin.collections.ArrayList class PacketWriteQueue : TickListener { @@ -15,8 +16,8 @@ class PacketWriteQueue : TickListener { companion object { private val queueLock = ReentrantLock() - private val packetsToQueue = ArrayList>(1000) - private val packetsToWrite = LinkedList>() + private val packetsToQueue = ArrayList?>(1000) + private val packetsToWrite = LinkedList?>() @JvmStatic fun handle(packet: OutgoingPacket, context: T) { @@ -39,25 +40,24 @@ class PacketWriteQueue : TickListener { packetsToWrite.add(QueuedPacket(packet, context)) } - @JvmStatic - fun pop(): QueuedPacket<*>? { - return try { - packetsToWrite.pop() - } catch (e: NoSuchElementException) { - null - } - } - @JvmStatic fun flush() { queueLock.lock() - var packet: QueuedPacket<*>? - while (pop().also { packet = it } != null) - write(packet?.out ?: break, packet?.context ?: break) + + var hasEnded = false + while (!hasEnded) { + try { + val packet = packetsToWrite.pop() + write(packet?.out ?: continue, packet.context ?: continue) + } catch (e: NoSuchElementException) { + hasEnded = true + } + } + if (packetsToWrite.isNotEmpty()) { SystemLogger.logWarn("Packet queue was NOT empty! Remaining packets: ${packetsToWrite.size}") try { - for (pkt in packetsToWrite) SystemLogger.logWarn("${pkt.out.javaClass.simpleName} <- ${pkt.context}") + for (pkt: QueuedPacket<*>? in packetsToWrite) SystemLogger.logWarn("${pkt?.out?.javaClass?.simpleName ?: "NULL"} <- ${pkt?.context ?: "NULL"}") } catch (e: Exception) { e.printStackTrace() @@ -65,12 +65,14 @@ class PacketWriteQueue : TickListener { packetsToWrite.clear() } } + + queueLock.unlock() + val queueIter = packetsToQueue.iterator() while (queueIter.hasNext()) { packetsToWrite.add(queueIter.next()) queueIter.remove() } - queueLock.unlock() } @Suppress("UNCHECKED_CAST")