diff --git a/component/components/lockstep.go b/component/components/lockstep.go index 0c39242..b2d4f0e 100644 --- a/component/components/lockstep.go +++ b/component/components/lockstep.go @@ -65,7 +65,7 @@ func (slf *Lockstep[ClientID, Command]) StartBroadcast() { frames := slf.frames.Map() for clientId, client := range slf.clients.Map() { for i := slf.clientCurrentFrame[clientId]; i <= currentFrame; i++ { - if err := client.Send(slf.serialization(i, frames[i])); err != nil { + if err := client.SyncSend(slf.serialization(i, frames[i])); err != nil { log.Error("Lockstep.StartBroadcast", zap.Any("ClientID", client.GetID()), zap.Int("Frame", i), zap.Error(err)) break } diff --git a/game/builtin/player.go b/game/builtin/player.go index e13ff83..90c1704 100644 --- a/game/builtin/player.go +++ b/game/builtin/player.go @@ -24,6 +24,11 @@ func (slf *Player[ID]) Send(packet []byte, messageType ...int) { slf.conn.Write(packet, messageType...) } +// SyncSend 向该玩家同步发送数据 +func (slf *Player[ID]) SyncSend(packet []byte, messageType ...int) error { + return slf.conn.SyncWrite(packet, messageType...) +} + // Close 关闭玩家 func (slf *Player[ID]) Close() { slf.conn.Close() diff --git a/game/player.go b/game/player.go index dd8ec32..0e25cd1 100644 --- a/game/player.go +++ b/game/player.go @@ -7,6 +7,8 @@ type Player[ID comparable] interface { // Send 发送数据包 // - messageType: websocket模式中指定消息类型 Send(packet []byte, messageType ...int) + // SyncSend 同步发送数据包 + SyncSend(packet []byte, messageType ...int) error // Close 关闭玩家并且释放其资源 Close() } diff --git a/server/conn.go b/server/conn.go index 0a2c4a1..6c33798 100644 --- a/server/conn.go +++ b/server/conn.go @@ -106,6 +106,29 @@ func (slf *Conn) Write(data []byte, messageType ...int) { slf.mutex.Unlock() } +func (slf *Conn) SyncWrite(data []byte, messageType ...int) error { + if slf.server.network == NetworkWebsocket { + if len(messageType) > 0 { + return slf.ws.WriteMessage(messageType[0], data) + } else { + return slf.ws.WriteMessage(slf.server.websocketWriteMessageType, data) + } + } else { + if slf.gn != nil { + switch slf.server.network { + case NetworkUdp, NetworkUdp4, NetworkUdp6: + return slf.gn.SendTo(data) + default: + return slf.gn.AsyncWrite(data) + } + } else if slf.kcp != nil { + _, err := slf.kcp.Write(data) + return err + } + } + return nil +} + // Close 关闭连接 func (slf *Conn) Close() { slf.mutex.Lock() @@ -192,7 +215,13 @@ func (slf *Conn) writeLoop() { err = slf.ws.WriteMessage(data.websocketMessageType, data.packet) } else { if slf.gn != nil { - err = slf.gn.AsyncWrite(data.packet) + switch slf.server.network { + case NetworkUdp, NetworkUdp4, NetworkUdp6: + err = slf.gn.SendTo(data.packet) + default: + err = slf.gn.AsyncWrite(data.packet) + } + } else if slf.kcp != nil { _, err = slf.kcp.Write(data.packet) }