pre cw with probe and a bunch script to read game behavior

This commit is contained in:
CAtlas0784 committed 2026-10-21 20:40:13 +07:00
1 parent 5120219ae2
commit da8a32f60d
310 files changed
+219693 -872

No files matched your search

+32 -5
View File
@@ -1,6 +1,7 @@
package gameserver
import (
"fmt"
"net"
"sync"
"sync/atomic"
@@ -14,10 +15,11 @@ import (
// mihoyo KCP handshake (20-byte NetOperation) and dispatching KCP payloads
// to sessions.
type Gateway struct {
conn *net.UDPConn
idSeq atomic.Uint32
mu sync.Mutex
sessions map[uint32]*Session
conn *net.UDPConn
idSeq atomic.Uint32
mu sync.Mutex
sessions map[uint32]*Session
publicSDKURL string
}
func NewGateway(host string, port uint16) (*Gateway, error) {
@@ -26,6 +28,24 @@ func NewGateway(host string, port uint16) (*Gateway, error) {
return nil, err
}
playerUID = cfg.PlayerUID
playerName = cfg.AccountName
world, err := loadWorldBattleResources()
if err != nil {
return nil, err
}
playerWorldLevel = world.WorldLevel
if _, err := loadPropRules(); err != nil {
return nil, err
}
if _, err := loadNavigationProfiles(); err != nil {
return nil, err
}
if _, err := common.LoadPlayerCosmetics(); err != nil {
return nil, err
}
if _, err := common.LoadCurrencyWarsCatalog(); err != nil {
return nil, err
}
addr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(host, itoa(int(port))))
if err != nil {
return nil, err
@@ -34,7 +54,7 @@ func NewGateway(host string, port uint16) (*Gateway, error) {
if err != nil {
return nil, err
}
return &Gateway{conn: conn, sessions: map[uint32]*Session{}}, nil
return &Gateway{conn: conn, sessions: map[uint32]*Session{}, publicSDKURL: cfg.PublicSDKURL}, nil
}
func itoa(v int) string {
@@ -103,12 +123,15 @@ func (g *Gateway) establishSession(op *NetOperation, addr *net.UDPAddr) error {
_, err := g.conn.WriteToUDP(payload, addr)
return err
}, conv, token)
session.publicSDKURL = g.publicSDKURL
if data, err := common.LoadFreesrData(); err == nil {
session.SetJSON(data)
PacketLog("[KCP] FreesrData loaded successfully")
} else {
PacketLog("[ERROR] Failed to load initial freesr-data.json: " + err.Error())
session.Close()
return fmt.Errorf("refuse session with invalid player data: %w", err)
}
// file watcher: reload freesr-data.json when the SRTools overwrites it
@@ -192,6 +215,7 @@ func (g *Gateway) processKCPPayload(data []byte, addr *net.UDPAddr) {
// and re-syncs the player in real-time when changed.
func watchFreesrData(session *Session) {
var lastModFreesr time.Time
var lastRejectedFreesr time.Time
if st, err := statFile("freesr-data.json"); err == nil {
lastModFreesr = st
}
@@ -221,6 +245,9 @@ func watchFreesrData(session *Session) {
lastModFreesr = stFreesr
Log("player data updated & live synced to client")
}
} else if !stFreesr.Equal(lastRejectedFreesr) {
Log("[PLAYER DATA REJECTED] keeping previous session data: " + err.Error())
lastRejectedFreesr = stFreesr
}
session.stateMu.Unlock()
}