Allow user-code create server.Player

This commit is contained in:
Tnze
2022-03-10 14:13:26 +08:00
parent 7d197ebba4
commit 442993d3b1
3 changed files with 33 additions and 26 deletions

View File

@ -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) { func (g *Game) AcceptPlayer(name string, id uuid.UUID, protocol int32, conn *net.Conn) {
p := &Player{ p := NewPlayer(conn, name, id, g.newEID(), 1)
Conn: conn, defer p.Close()
Name: name,
UUID: id,
EntityID: g.newEID(),
Gamemode: 1,
packetQueue: NewPacketQueue(),
errChan: make(chan error, 1),
}
dimInfo := g.Dim.Info() dimInfo := g.Dim.Info()
err := p.Conn.WritePacket(pk.Marshal( err := p.Conn.WritePacket(pk.Marshal(
packetid.ClientboundLogin, packetid.ClientboundLogin,
@ -114,21 +107,6 @@ func (g *Game) AcceptPlayer(name string, id uuid.UUID, protocol int32, conn *net
return 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) g.Dim.PlayerJoin(p)
defer g.Dim.PlayerQuit(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 { if err := p.GetErr(); err != nil {
return return
} }
//goland:noinspection GoDeferInLoop
defer c.RemovePlayer(p) defer c.RemovePlayer(p)
} }

View File

@ -22,6 +22,36 @@ type Player struct {
errChan chan error 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. // Packet758 is a packet in protocol 757.
// We are using type system to force programmers to update packets. // We are using type system to force programmers to update packets.
type Packet758 pk.Packet type Packet758 pk.Packet

View File

@ -17,7 +17,7 @@ import (
type PlayerList struct { type PlayerList struct {
maxPlayer int maxPlayer int
players map[uuid.UUID]*Player 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. // Because others field never change after created.
playersLock sync.Mutex playersLock sync.Mutex
} }