package packets import ( "time" "eq2emu/internal/opcodes" ) // EQ2 protocol packet type EQ2Packet struct { Opcode opcodes.ProtocolOpcode Data []byte Sequence uint16 } // EQ2 application packet type AppPacket struct { Opcode opcodes.AppOpcode Data []byte Compressed bool } // Session for EQ2 connection state type Session struct { ID uint32 Established bool NextSeq uint16 LastKeep time.Time Compressed bool Fragments map[uint16]*FragmentBuffer } // Fragment reassembly type FragmentBuffer struct { Fragments map[uint16][]byte Total uint16 Received uint16 Timestamp time.Time } // Packet pools type PacketPool struct { eq2Packets chan *EQ2Packet appPackets chan *AppPacket } func NewPacketPool(size int) *PacketPool { return &PacketPool{ eq2Packets: make(chan *EQ2Packet, size), appPackets: make(chan *AppPacket, size), } } func (p *PacketPool) GetEQ2Packet() *EQ2Packet { select { case packet := <-p.eq2Packets: return packet default: return &EQ2Packet{} } } func (p *PacketPool) PutEQ2Packet(packet *EQ2Packet) { packet.Data = packet.Data[:0] packet.Opcode = 0 select { case p.eq2Packets <- packet: default: } } func (p *PacketPool) GetAppPacket() *AppPacket { select { case packet := <-p.appPackets: return packet default: return &AppPacket{} } } func (p *PacketPool) PutAppPacket(packet *AppPacket) { packet.Data = packet.Data[:0] packet.Opcode = 0 select { case p.appPackets <- packet: default: } }