pre cw with probe and a bunch script to read game behavior
This commit is contained in:
1 parent
5120219ae2
commit
da8a32f60d
310 files changed
+219693
-872
No files matched your search
@@ -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()
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user