Allow user-code create server.Player
This commit is contained in:
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user