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) {
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)
}

View File

@ -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

View File

@ -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
}