fix: improve endgame clock and gameplay stability
This commit is contained in:
1 parent
ce6aabfc55
commit
658298ee86
46 files changed
+1915
-99
No files matched your search
@@ -35,8 +35,9 @@ type Session struct {
|
||||
stateMu sync.Mutex // serializes packet handlers and hot reload mutations
|
||||
json *common.FreesrData
|
||||
|
||||
kcpMu sync.Mutex
|
||||
kcp *kcplib.KCP
|
||||
kcpMu sync.Mutex
|
||||
kcp *kcplib.KCP
|
||||
levelRewardAwaitingAck bool // guarded by kcpMu
|
||||
|
||||
startTime time.Time
|
||||
nextSceneSave int64
|
||||
@@ -129,6 +130,10 @@ func (s *Session) Consume(data []byte) error {
|
||||
s.kcpMu.Unlock()
|
||||
return err
|
||||
}
|
||||
if s.levelRewardAwaitingAck && s.kcp.PendingSends() == 0 {
|
||||
Log("[KCP] outstanding responses including level rewards acknowledged")
|
||||
s.levelRewardAwaitingAck = false
|
||||
}
|
||||
if err := s.kcp.Update(s.sessionTimeMs()); err != nil {
|
||||
s.kcpMu.Unlock()
|
||||
return err
|
||||
@@ -141,9 +146,13 @@ func (s *Session) Consume(data []byte) error {
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
pkt, err := DecodeNetPacket(buf[:n])
|
||||
// DecodeNetPacket returns slices backed by its input. Keep each frame
|
||||
// independent before the next Recv overwrites the shared buffer.
|
||||
frame := append([]byte(nil), buf[:n]...)
|
||||
pkt, err := DecodeNetPacket(frame)
|
||||
if err != nil {
|
||||
PacketLog(fmt.Sprintf("[ERROR] bad packet: %v", err))
|
||||
Log(fmt.Sprintf("[PACKET] invalid frame: %v", err))
|
||||
continue
|
||||
}
|
||||
packets = append(packets, pkt)
|
||||
@@ -213,7 +222,14 @@ func (s *Session) SendRaw(pkt *NetPacket) error {
|
||||
if _, err := s.kcp.Send(payload); err != nil {
|
||||
return err
|
||||
}
|
||||
return s.kcp.Flush()
|
||||
if err := s.kcp.Flush(); err != nil {
|
||||
return err
|
||||
}
|
||||
if pkt.CmdType == uint16(goproto.CmdIDByName["GetLevelRewardTakenListScRsp"]) {
|
||||
s.levelRewardAwaitingAck = s.kcp.PendingSends() > 0
|
||||
Log(fmt.Sprintf("[KCP] level rewards response queued; pending segments=%d", s.kcp.PendingSends()))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DriveUpdate is called by the gateway ticker to run retransmissions.
|
||||
|
||||
Reference in new issue
Block a user