diff --git a/server/gameplay.go b/server/gameplay.go index 10c3778..d325d7d 100644 --- a/server/gameplay.go +++ b/server/gameplay.go @@ -79,15 +79,8 @@ func (g *Game) Run(ctx context.Context) { } func (g *Game) AcceptPlayer(name string, id uuid.UUID, protocol int32, conn *net.Conn) { - p := &Player{ - Conn: conn, - Name: name, - UUID: id, - EntityID: g.newEID(), - Gamemode: 1, - packetQueue: NewPacketQueue(), - errChan: make(chan error, 1), - } + p := NewPlayer(conn, name, id, g.newEID(), 1) + defer p.Close() dimInfo := g.Dim.Info() err := p.Conn.WritePacket(pk.Marshal( packetid.ClientboundLogin, @@ -114,21 +107,6 @@ func (g *Game) AcceptPlayer(name string, id uuid.UUID, protocol int32, conn *net return } - go func() { - for { - packet, ok := p.packetQueue.Pull() - if !ok { - break - } - err := p.Conn.WritePacket(packet) - if err != nil { - p.PutErr(err) - break - } - } - }() - defer p.packetQueue.Close() - g.Dim.PlayerJoin(p) defer g.Dim.PlayerQuit(p) @@ -137,7 +115,6 @@ func (g *Game) AcceptPlayer(name string, id uuid.UUID, protocol int32, conn *net if err := p.GetErr(); err != nil { return } - //goland:noinspection GoDeferInLoop defer c.RemovePlayer(p) } diff --git a/server/player.go b/server/player.go index 9cae52f..98d2616 100644 --- a/server/player.go +++ b/server/player.go @@ -22,6 +22,36 @@ type Player struct { errChan chan error } +func NewPlayer(conn *net.Conn, name string, id uuid.UUID, eid int32, gamemode byte) (p *Player) { + p = &Player{ + Conn: conn, + Name: name, + UUID: id, + EntityID: eid, + Gamemode: gamemode, + packetQueue: NewPacketQueue(), + errChan: make(chan error, 1), + } + go func() { + for { + packet, ok := p.packetQueue.Pull() + if !ok { + break + } + err := p.Conn.WritePacket(packet) + if err != nil { + p.PutErr(err) + break + } + } + }() + return +} + +func (p *Player) Close() { + p.packetQueue.Close() +} + // Packet758 is a packet in protocol 757. // We are using type system to force programmers to update packets. type Packet758 pk.Packet diff --git a/server/playerlist.go b/server/playerlist.go index c70bdee..4a29055 100644 --- a/server/playerlist.go +++ b/server/playerlist.go @@ -17,7 +17,7 @@ import ( type PlayerList struct { maxPlayer int players map[uuid.UUID]*Player - // Only the linked-list is protected by this Mutex. + // Only the field players is protected by this Mutex. // Because others field never change after created. playersLock sync.Mutex }