diff --git a/Server/src/main/java/core/net/packet/OutgoingPacket.java b/Server/src/main/java/core/net/packet/OutgoingPacket.java index 8fee2ba95..0c33f8cd9 100644 --- a/Server/src/main/java/core/net/packet/OutgoingPacket.java +++ b/Server/src/main/java/core/net/packet/OutgoingPacket.java @@ -5,12 +5,12 @@ package core.net.packet; * @author Emperor * @param The context type. */ -public interface OutgoingPacket { +public interface OutgoingPacket { /** * Sends the packet. * @param context The context. */ - public void send(T context); + public void send(Context context); } \ No newline at end of file diff --git a/Server/src/main/java/core/net/packet/PacketRepository.java b/Server/src/main/java/core/net/packet/PacketRepository.java index d3b3e83c1..8d4433642 100644 --- a/Server/src/main/java/core/net/packet/PacketRepository.java +++ b/Server/src/main/java/core/net/packet/PacketRepository.java @@ -4,6 +4,7 @@ import core.net.packet.in.*; import core.net.packet.out.GrandExchangePacket; import core.net.packet.out.*; import rs09.game.system.SystemLogger; +import rs09.net.packet.PacketWriteQueue; import rs09.net.packet.in.ItemOnGroundItemPacket; import rs09.net.packet.in.QuickChatPacketHandler; @@ -19,7 +20,7 @@ public final class PacketRepository { /** * The outgoing packets mapping. */ - private final static Map, OutgoingPacket> OUTGOING_PACKETS = new HashMap<>(); + public final static Map, OutgoingPacket> OUTGOING_PACKETS = new HashMap<>(); /** * The incoming packets mapping. @@ -189,8 +190,9 @@ public final class PacketRepository { SystemLogger.logErr("Invalid outgoing packet [handler=" + clazz + ", context=" + context + "]."); return; } - if(!context.getPlayer().isArtificial()) - p.send(context); + if(!context.getPlayer().isArtificial()) { + PacketWriteQueue.handle(p, context); + } } /** diff --git a/Server/src/main/kotlin/rs09/game/content/global/action/EquipHandler.kt b/Server/src/main/kotlin/rs09/game/content/global/action/EquipHandler.kt index 30f389b6f..99d125d8a 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/action/EquipHandler.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/action/EquipHandler.kt @@ -25,12 +25,7 @@ class EquipHandler : InteractionListener() { override fun defineListeners() { on(ITEM,"equip","wield","wear"){player,node -> - GameWorld.Pulser.submit(object : Pulse(){ - override fun pulse(): Boolean { - handleEquip(player,node) - return true - } - }) + handleEquip(player,node) return@on true } diff --git a/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt b/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt new file mode 100644 index 000000000..8e295f332 --- /dev/null +++ b/Server/src/main/kotlin/rs09/net/packet/PacketWriteQueue.kt @@ -0,0 +1,46 @@ +package rs09.net.packet + +import core.net.packet.OutgoingPacket +import core.net.packet.out.* +import rs09.game.system.SystemLogger +import java.util.* + +object PacketWriteQueue { + private val PacketsToWrite: Queue> = LinkedList>() + + @JvmStatic + fun handle(packet: OutgoingPacket, context: T){ + when(packet){ + is UpdateSceneGraph, + is BuildDynamicScene, + is InstancedLocationUpdate -> packet.send(context) + else -> queue(packet,context) + } + } + + @JvmStatic + fun queue(packet: OutgoingPacket, context: T){ + PacketsToWrite.add(QueuedPacket(packet,context)) + } + + @JvmStatic + fun flush(){ + while(!PacketsToWrite.isEmpty()){ + val p = PacketsToWrite.poll() + write(p.out,p.context) + } + } + + @Suppress("UNCHECKED_CAST") + fun write(out: OutgoingPacket<*>, context: T){ + val pack = out as? OutgoingPacket + val ctx = context as? T + if(pack == null || ctx == null){ + SystemLogger.logWarn("Failed packet casting") + return + } + pack.send(ctx) + } +} + +class QueuedPacket(val out: OutgoingPacket, val context: T) \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/worker/MajorUpdateWorker.kt b/Server/src/main/kotlin/rs09/worker/MajorUpdateWorker.kt index 79cf109fb..56a18ee0d 100644 --- a/Server/src/main/kotlin/rs09/worker/MajorUpdateWorker.kt +++ b/Server/src/main/kotlin/rs09/worker/MajorUpdateWorker.kt @@ -13,6 +13,7 @@ import rs09.ServerConstants import rs09.game.world.GameWorld import rs09.game.world.repository.Repository import rs09.game.world.update.UpdateSequence +import rs09.net.packet.PacketWriteQueue import rs09.tools.stringtools.colorize import java.text.SimpleDateFormat import java.util.* @@ -48,6 +49,7 @@ class MajorUpdateWorker { sequence.start() sequence.run() sequence.end() + PacketWriteQueue.flush() //increment global ticks variable GameWorld.pulse() //disconnect all players waiting to be disconnected