fix: improve endgame clock and gameplay stability

This commit is contained in:
CAtlas0784 committed 2026-11-04 15:59:48 +07:00
1 parent ce6aabfc55
commit 658298ee86
46 files changed
+1915 -99

No files matched your search

+20 -4
View File
@@ -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.