From fa8e1a93d7784a1b5b8b1ebe6284869c5269cd43 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 17 Mar 2026 10:13:51 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/backend/server.go | 53 +++++--- src/server/conf/json.go | 1 + src/server/conf/server.json | 1 + src/server/db/Mysql.go | 6 + src/server/db/SqlStruct.go | 13 ++ src/server/game/GameLogic.go | 11 ++ src/server/game/activity_mgr.go | 61 ++++++++- src/server/game/external.go | 2 +- src/server/game/register_network_func.go | 2 - src/server/go.mod | 11 +- src/server/go.sum | 15 ++- src/server/main.go | 3 +- src/server/msg/Gameapi_grpc.pb.go | 121 ++++++++++++++++++ .../pkg/github.com/name5566/leaf/leaf.go | 3 +- src/server/sql/Merge_Pet.sql | 21 ++- src/server/test/fix_test.go | 25 ++++ 16 files changed, 312 insertions(+), 37 deletions(-) create mode 100644 src/server/msg/Gameapi_grpc.pb.go diff --git a/src/server/backend/server.go b/src/server/backend/server.go index 99762d47..b86db4b8 100644 --- a/src/server/backend/server.go +++ b/src/server/backend/server.go @@ -1,24 +1,39 @@ package backend -func Start() { - // addr := net.JoinHostPort("localhost", "9090") - // handler := NewGameServiceHandler() +import ( + "context" + "net" + "server/conf" + "server/msg" + "server/pkg/github.com/name5566/leaf/log" - // //创建处理器 - // processor := backend.NewGameAdminServiceProcessor(handler) + "google.golang.org/grpc" +) - // transportFactory := thrift.NewTBufferedTransportFactory(8192) - // protocolFactory := thrift.NewTBinaryProtocolFactoryConf(&thrift.TConfiguration{}) - - // tcpAddr, err := net.ResolveTCPAddr("tcp", addr) - // if err != nil { - // fmt.Printf("Failed to resolve address %s: %v\n", addr, err) - // return - // } - // serverTransport := thrift.NewTServerSocketFromAddrTimeout(tcpAddr, 0) - // server := thrift.NewTSimpleServer4(processor, serverTransport, transportFactory, protocolFactory) - // fmt.Printf("Starting the server on %s...\n", addr) - // if err := server.Serve(); err != nil { - // fmt.Printf("Error starting the server: %v\n", err) - // } +type backendServer struct { + msg.UnimplementedBackendServer +} + +func (s *backendServer) ReloadActivity(ctx context.Context, req *msg.ReqActivityCfgReload) (*msg.ResActivityCfgReload, error) { + return nil, nil +} + +func Start() { + if conf.Server.RPCAddr == "" { + log.Debug("RPC server address not configured, skipping gRPC server startup") + return + } + lis, err := net.Listen("tcp", conf.Server.RPCAddr) + if err != nil { + log.Error("failed to listen: %v", err) + return + } + + s := grpc.NewServer() + msg.RegisterBackendServer(s, &backendServer{}) + + log.Debug("gRPC server listening on %s", conf.Server.RPCAddr) + if err := s.Serve(lis); err != nil { + log.Error("server exited with error: %v", err) + } } diff --git a/src/server/conf/json.go b/src/server/conf/json.go index aabca98f..d958cd74 100644 --- a/src/server/conf/json.go +++ b/src/server/conf/json.go @@ -14,6 +14,7 @@ var Server struct { LogLevel string LogPath string WSAddr string + RPCAddr string CertFile string KeyFile string TCPAddr string diff --git a/src/server/conf/server.json b/src/server/conf/server.json index ff105c9d..3b390e3c 100644 --- a/src/server/conf/server.json +++ b/src/server/conf/server.json @@ -4,6 +4,7 @@ "LogPath": "./log", "TCPAddr": ":3602", "WSAddr": ":3567", + "RPCAddr": ":9003", "MySqlAddr": "127.0.0.1", "MySqlPort": "3306", "MySqlUsr": "root", diff --git a/src/server/db/Mysql.go b/src/server/db/Mysql.go index e2581d95..fce92539 100644 --- a/src/server/db/Mysql.go +++ b/src/server/db/Mysql.go @@ -413,6 +413,12 @@ func GetServerMailData(data *[]*SqlServerMailStruct) error { return err } +func GetActivityData(data *[]*SqlActivityCfgStruct) error { + sql := "select `id`, `type`, `title`, `mail_title`, `mail_content`, `level_limit`, `start_time`, `end_time`, `reward`, `extra` from t_activity_mod" + err := SqlDb.Select(data, sql) + return err +} + func CreateOrderSn(Uid, ChargeId int, OrderSn, Platform, Channel string, Price float64, Currency, Extra string) error { sql := "insert into t_player_charge (`Uid`,`OrderId`, `ProductId`, `Price`,`Currency`, `CreateTime`, `PayPlatform`, `PayChannel`, `PayChannelExtra`) Values (?,?,?,?,?,?,?,?,?)" Now := GoUtil.Now() diff --git a/src/server/db/SqlStruct.go b/src/server/db/SqlStruct.go index 9bd732f7..9eed9bd1 100644 --- a/src/server/db/SqlStruct.go +++ b/src/server/db/SqlStruct.go @@ -497,6 +497,19 @@ type SqlServerMailStruct struct { CreateTime int64 `db:"create_time"` } +type SqlActivityCfgStruct struct { + Id int `db:"id"` + Type int `db:"type"` + Title string `db:"title"` + MailTitle string `db:"mail_title"` + MailContent string `db:"mail_content"` + Level int `db:"level_limit"` + Start_time int64 `db:"start_time"` + End_time int64 `db:"end_time"` + RewardItem string `db:"reward"` + Extra string `db:"extra"` +} + type SqlChargeOrderStruct struct { Id int `db:"id"` Uid int `db:"Uid"` diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index e3ea35e7..78569f8a 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -84,6 +84,7 @@ type GameLogic struct { VarMgr *VarMgr // 变量管理器 StartTime int64 // 服务器启动时间 MessageMgr *MessageMgr // 消息管理器 + ActivityMgr *ActivityMgr // 活动管理器 } type ServerInfo struct { @@ -293,6 +294,14 @@ func (ad *GameLogic) CreateMailMgr() { ad.MailMgr.Init() } +// 活动管理器 +func (ad *GameLogic) CreateActivityMgr() { + ad.ActivityMgr = &ActivityMgr{ + ServerMod: new(ServerMod), + } + ad.ActivityMgr.Init() +} + func (ad *GameLogic) CreateMessageMgr() { ad.MessageMgr = &MessageMgr{ ServerMod: new(ServerMod), @@ -478,6 +487,8 @@ func G_getGameLogic() *GameLogic { // G_GameLogicPtr.CreateFriendMgr() //创建好友管理器 G_GameLogicPtr.CreateChampshipMgr() // 创建竞标赛管理器 G_GameLogicPtr.CreateVarMgr() // 创建变量管理器 + } else { + G_GameLogicPtr.CreateActivityMgr() //创建活动管理器 } G_GameLogicPtr.CreateRankMgr() //创建排行榜管理器 G_GameLogicPtr.CreateMailMgr() //创建邮件管理器 diff --git a/src/server/game/activity_mgr.go b/src/server/game/activity_mgr.go index df6c2c82..962ed367 100644 --- a/src/server/game/activity_mgr.go +++ b/src/server/game/activity_mgr.go @@ -1,7 +1,11 @@ package game import ( + "encoding/json" + "fmt" + "server/db" "server/game/mod/msg" + "server/pkg/github.com/name5566/leaf/log" "sync" ) @@ -27,15 +31,21 @@ type ActivityCfg struct { Extra map[string]interface{} } +func (ac *ActivityCfg) String() string { + return fmt.Sprintf("Id: %d, Type: %d, StartTime: %d, EndTime: %d, Level: %d, Title: %s, MailTitle: %s, MailContent: %s, RewardItem: %v, Extra: %v", + ac.Id, ac.Type, ac.Strartime, ac.Endtime, ac.Level, ac.Title, ac.MailTitle, ac.MailContent, ac.RewardItem, ac.Extra) +} + const () func (r *ActivityMgr) Init() { - r.key = RANK_MGR_KEY + r.key = ACTIVITY_MGR_KEY r.data = &ActivityData{ List: make(map[int]*ActivityCfg, 0), } // 注册处理函数 r.init() + r.Reload() } func (r *ActivityMgr) getData() *ActivityData { @@ -58,3 +68,52 @@ func (r ActivityMgr) GetActivityCfg(Id int) ActivityCfg { } return *cfg } + +func (r *ActivityMgr) Reload() error { + // 重新加载活动配置 + // 从数据库加载邮件 + log.Debug("reload activity data") + data := r.getData() + data.mu.Lock() + defer data.mu.Unlock() + cfgList := make([]*db.SqlActivityCfgStruct, 0) + err := db.GetActivityData(&cfgList) + if err != nil { + log.Error("LoadActivityData error: %v", err) + return err + } + data.List = make(map[int]*ActivityCfg, 0) + for _, v := range cfgList { + reward := make(map[string]interface{}) + if v.RewardItem != "" { + err := json.Unmarshal([]byte(v.RewardItem), &reward) + if err != nil { + log.Error("Unmarshal reward error: %v", err) + continue + } + } + extra := make(map[string]interface{}) + if v.Extra != "" { + err := json.Unmarshal([]byte(v.Extra), &extra) + if err != nil { + log.Error("Unmarshal extra error: %v", err) + continue + } + } + cfg := &ActivityCfg{ + Id: v.Id, + Type: v.Type, + Strartime: v.Start_time, + Endtime: v.End_time, + Level: v.Level, + Title: v.Title, + MailTitle: v.MailTitle, + MailContent: v.MailContent, + RewardItem: reward, + Extra: extra, + } + log.Debug("load activity cfg: %v", cfg) + data.List[v.Id] = cfg + } + return nil +} diff --git a/src/server/game/external.go b/src/server/game/external.go index 4742cbba..5691856e 100644 --- a/src/server/game/external.go +++ b/src/server/game/external.go @@ -34,7 +34,7 @@ func RegisterHandlerRPC(param []interface{}) { handler(&msg.AdminReq{}, HandleAdminReq) } -func init() { +func Init() { register() db.InitDB() db.InitRedis() diff --git a/src/server/game/register_network_func.go b/src/server/game/register_network_func.go index bced11dd..7bab0909 100644 --- a/src/server/game/register_network_func.go +++ b/src/server/game/register_network_func.go @@ -2894,8 +2894,6 @@ func ReqSetPetName(player *Player, buf []byte) error { }) player.PlayMod.save() player.BackUserInfo() - PlayroomMod := player.PlayMod.getPlayroomMod() - PlayroomMod.UnLock(BaseMod.GetLevel()) player.LimitedTimePlayroomTrigger() player.UpdateUserInfo() player.TeLog("petname_set", map[string]interface{}{ diff --git a/src/server/go.mod b/src/server/go.mod index f8e477c8..2e581db8 100644 --- a/src/server/go.mod +++ b/src/server/go.mod @@ -1,6 +1,6 @@ module server -go 1.23 +go 1.25.0 require ( github.com/alibabacloud-go/cloudauth-20190307/v4 v4.9.2 @@ -13,10 +13,12 @@ require ( github.com/go-sql-driver/mysql v1.8.1 github.com/gorilla/websocket v1.5.3 github.com/jmoiron/sqlx v1.4.0 + github.com/oschwald/geoip2-golang v1.13.0 github.com/redis/go-redis/v9 v9.6.1 github.com/robfig/cron/v3 v3.0.1 github.com/shirou/gopsutil v3.21.11+incompatible - google.golang.org/protobuf v1.36.2 + google.golang.org/grpc v1.64.0 + google.golang.org/protobuf v1.36.11 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 ) @@ -36,7 +38,6 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/stretchr/testify v1.9.0 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.8.0 // indirect @@ -47,10 +48,10 @@ require ( ) require ( - github.com/apache/thrift v0.22.0 // indirect - github.com/oschwald/geoip2-golang v1.13.0 // indirect github.com/oschwald/maxminddb-golang v1.13.0 // indirect golang.org/x/sys v0.29.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect ) require ( diff --git a/src/server/go.sum b/src/server/go.sum index b152ad73..7853a80e 100644 --- a/src/server/go.sum +++ b/src/server/go.sum @@ -73,8 +73,6 @@ github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmP github.com/aliyun/credentials-go v1.4.5/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= github.com/aliyun/credentials-go v1.4.6 h1:CG8rc/nxCNKfXbZWpWDzI9GjF4Tuu3Es14qT8Y0ClOk= github.com/aliyun/credentials-go v1.4.6/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= -github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= -github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= @@ -114,8 +112,9 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -282,6 +281,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -303,18 +304,22 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c h1:xgCzyF2LFIO/0X2UAoVRiXKU5Xg6VjToG4i2/ecSswk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU= -google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/src/server/main.go b/src/server/main.go index d56aa3a8..cbe3439b 100644 --- a/src/server/main.go +++ b/src/server/main.go @@ -26,9 +26,10 @@ func main() { lconf.ListenAddr = conf.Server.ListenAddr lconf.CenterAddr = conf.Server.CenterAddr lconf.PendingWriteNum = conf.PendingWriteNum - // 当内存>256M时开始GC + // 当内存>512M时开始GC debug.SetGCPercent(50) debug.SetMemoryLimit(512 << 20) + game.Init() // 启动 pprof(仅绑定本地) go func() { // 如果需要绑定所有接口改为 ":6060" diff --git a/src/server/msg/Gameapi_grpc.pb.go b/src/server/msg/Gameapi_grpc.pb.go new file mode 100644 index 00000000..c6fb135f --- /dev/null +++ b/src/server/msg/Gameapi_grpc.pb.go @@ -0,0 +1,121 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.6.1 +// - protoc v5.28.2 +// source: proto/Gameapi.proto + +package msg + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + Backend_ReloadActivity_FullMethodName = "/tutorial.Backend/ReloadActivity" +) + +// BackendClient is the client API for Backend service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type BackendClient interface { + ReloadActivity(ctx context.Context, in *ReqActivityCfgReload, opts ...grpc.CallOption) (*ResActivityCfgReload, error) +} + +type backendClient struct { + cc grpc.ClientConnInterface +} + +func NewBackendClient(cc grpc.ClientConnInterface) BackendClient { + return &backendClient{cc} +} + +func (c *backendClient) ReloadActivity(ctx context.Context, in *ReqActivityCfgReload, opts ...grpc.CallOption) (*ResActivityCfgReload, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResActivityCfgReload) + err := c.cc.Invoke(ctx, Backend_ReloadActivity_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// BackendServer is the server API for Backend service. +// All implementations must embed UnimplementedBackendServer +// for forward compatibility. +type BackendServer interface { + ReloadActivity(context.Context, *ReqActivityCfgReload) (*ResActivityCfgReload, error) + mustEmbedUnimplementedBackendServer() +} + +// UnimplementedBackendServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedBackendServer struct{} + +func (UnimplementedBackendServer) ReloadActivity(context.Context, *ReqActivityCfgReload) (*ResActivityCfgReload, error) { + return nil, status.Error(codes.Unimplemented, "method ReloadActivity not implemented") +} +func (UnimplementedBackendServer) mustEmbedUnimplementedBackendServer() {} +func (UnimplementedBackendServer) testEmbeddedByValue() {} + +// UnsafeBackendServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to BackendServer will +// result in compilation errors. +type UnsafeBackendServer interface { + mustEmbedUnimplementedBackendServer() +} + +func RegisterBackendServer(s grpc.ServiceRegistrar, srv BackendServer) { + // If the following call panics, it indicates UnimplementedBackendServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&Backend_ServiceDesc, srv) +} + +func _Backend_ReloadActivity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReqActivityCfgReload) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BackendServer).ReloadActivity(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Backend_ReloadActivity_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BackendServer).ReloadActivity(ctx, req.(*ReqActivityCfgReload)) + } + return interceptor(ctx, in, info, handler) +} + +// Backend_ServiceDesc is the grpc.ServiceDesc for Backend service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Backend_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "tutorial.Backend", + HandlerType: (*BackendServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ReloadActivity", + Handler: _Backend_ReloadActivity_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "proto/Gameapi.proto", +} diff --git a/src/server/pkg/github.com/name5566/leaf/leaf.go b/src/server/pkg/github.com/name5566/leaf/leaf.go index b7ad1ac6..8fdc725e 100644 --- a/src/server/pkg/github.com/name5566/leaf/leaf.go +++ b/src/server/pkg/github.com/name5566/leaf/leaf.go @@ -3,6 +3,7 @@ package leaf import ( "os" "os/signal" + "server/backend" mergeCluster "server/cluster" sconf "server/conf" "server/game" @@ -32,7 +33,7 @@ func Run(mods ...module.Module) { } log.Release("服务器版本: %s", "1.0.02") log.Release("%s 启动, 节点类型: %s, 区服id: %d", sconf.Server.GameName, sconf.Server.ServerType, sconf.Server.ServerID) - + go backend.Start() // module for i := 0; i < len(mods); i++ { module.Register(mods[i]) diff --git a/src/server/sql/Merge_Pet.sql b/src/server/sql/Merge_Pet.sql index 0ea2a541..6b31ae65 100644 --- a/src/server/sql/Merge_Pet.sql +++ b/src/server/sql/Merge_Pet.sql @@ -141,11 +141,28 @@ CREATE TABLE IF NOT EXISTS `system_mail_info` ( ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '系统邮件'; /*==============================================================*/ -/* Table: t_player_data 系统模块表 */ +/* Table: t_server_mod 系统模块表 */ /*==============================================================*/ CREATE TABLE IF NOT EXISTS t_server_mod ( `id` int NOT NULL AUTO_INCREMENT primary key, `key` varchar(128) DEFAULT '' COMMENT '模块key', `mData` mediumblob DEFAULT NULL COMMENT '数据', `updateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间' -) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE utf8mb4_general_ci COMMENT = '系统模块表'; \ No newline at end of file +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE utf8mb4_general_ci COMMENT = '系统模块表'; + +/*==============================================================*/ +/* Table: t_activity_mod 系统活动表 */ +/*==============================================================*/ +CREATE TABLE IF NOT EXISTS t_activity_mod ( + `id` int NOT NULL AUTO_INCREMENT primary key, + `type` int DEFAULT 0 COMMENT '活动类型', + `title` varchar(128) DEFAULT '' COMMENT '活动标题', + `mail_title` varchar(128) DEFAULT '' COMMENT '活动邮件标题', + `mail_content` varchar(2048) DEFAULT '' COMMENT '活动邮件内容', + `start_time` int unsigned NOT NULL DEFAULT '0' COMMENT '活动开始时间', + `end_time` int unsigned NOT NULL DEFAULT '0' COMMENT '活动结束时间', + `level_limit` int unsigned NOT NULL DEFAULT '0' COMMENT '等级限制', + `reward` varchar(2048) DEFAULT '' COMMENT '活动奖励', + `extra` varchar(2048) DEFAULT '' COMMENT '活动额外数据', + `updateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间' +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE utf8mb4_general_ci COMMENT = '系统活动表'; \ No newline at end of file diff --git a/src/server/test/fix_test.go b/src/server/test/fix_test.go index 22d304b7..6cf9ae0c 100644 --- a/src/server/test/fix_test.go +++ b/src/server/test/fix_test.go @@ -113,6 +113,7 @@ func TestLevelUp(t *testing.T) { } func TestEndless(t *testing.T) { + game.Init() p1 := new(game.Player) p1.InitPlayer("3625212") p1.ZeroUpdate(nil) @@ -292,3 +293,27 @@ func TestGeoIp(t *testing.T) { code, _ := GoUtil.GetCountryByIP(ip) fmt.Printf("IP: %s, Country Code: %s\n", ip, code) } + +func TestSearchPlayer(t *testing.T) { + db.InitDB() + db.InitRedis() + uids := []int{} + err := db.SqlDb.Select(&uids, "select dwUin from t_player_baseinfo") + if err != nil { + fmt.Printf("Error fetching UIDs: %v\n", err) + return + } + var i int + for _, uid := range uids { + p1 := new(game.Player) + p1.M_DwUin = int64(uid) + p1.InitPlayerOnly() + if p1.GetBaseMod().GetLevel() < 16 { + continue + } + if len(p1.GetPlayroomMod().Physiology) < 6 { + i++ + } + } + fmt.Printf("Number of players with level >= 16 and less than 6 physiology: %d\n", i) +} From 76e18cac7b0c1f0b8f2dfbd33853625827bc53ac Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:57:01 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/db/Mysql.go | 2 +- src/server/db/SqlStruct.go | 2 +- src/server/game/activity_mgr.go | 15 ++++----------- src/server/game/player_data.go | 1 + src/server/sql/Merge_Pet.sql | 5 +++-- 5 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/server/db/Mysql.go b/src/server/db/Mysql.go index fce92539..fb37d20d 100644 --- a/src/server/db/Mysql.go +++ b/src/server/db/Mysql.go @@ -414,7 +414,7 @@ func GetServerMailData(data *[]*SqlServerMailStruct) error { } func GetActivityData(data *[]*SqlActivityCfgStruct) error { - sql := "select `id`, `type`, `title`, `mail_title`, `mail_content`, `level_limit`, `start_time`, `end_time`, `reward`, `extra` from t_activity_mod" + sql := "select `id`, `type`, `title`, `mail_title`, `mail_content`, `level_limit`, `start_time`, `end_time`, `cfg`, `extra` from t_activity_mod" err := SqlDb.Select(data, sql) return err } diff --git a/src/server/db/SqlStruct.go b/src/server/db/SqlStruct.go index 9eed9bd1..c60bd90a 100644 --- a/src/server/db/SqlStruct.go +++ b/src/server/db/SqlStruct.go @@ -506,7 +506,7 @@ type SqlActivityCfgStruct struct { Level int `db:"level_limit"` Start_time int64 `db:"start_time"` End_time int64 `db:"end_time"` - RewardItem string `db:"reward"` + Cfg []byte `db:"cfg_buf"` Extra string `db:"extra"` } diff --git a/src/server/game/activity_mgr.go b/src/server/game/activity_mgr.go index 962ed367..2adcea32 100644 --- a/src/server/game/activity_mgr.go +++ b/src/server/game/activity_mgr.go @@ -27,13 +27,13 @@ type ActivityCfg struct { Title string MailTitle string MailContent string - RewardItem map[string]interface{} + cfg map[string]interface{} Extra map[string]interface{} } func (ac *ActivityCfg) String() string { - return fmt.Sprintf("Id: %d, Type: %d, StartTime: %d, EndTime: %d, Level: %d, Title: %s, MailTitle: %s, MailContent: %s, RewardItem: %v, Extra: %v", - ac.Id, ac.Type, ac.Strartime, ac.Endtime, ac.Level, ac.Title, ac.MailTitle, ac.MailContent, ac.RewardItem, ac.Extra) + return fmt.Sprintf("Id: %d, Type: %d, StartTime: %d, EndTime: %d, Level: %d, Title: %s, MailTitle: %s, MailContent: %s, cfg: %v, Extra: %v", + ac.Id, ac.Type, ac.Strartime, ac.Endtime, ac.Level, ac.Title, ac.MailTitle, ac.MailContent, ac.cfg, ac.Extra) } const () @@ -85,13 +85,6 @@ func (r *ActivityMgr) Reload() error { data.List = make(map[int]*ActivityCfg, 0) for _, v := range cfgList { reward := make(map[string]interface{}) - if v.RewardItem != "" { - err := json.Unmarshal([]byte(v.RewardItem), &reward) - if err != nil { - log.Error("Unmarshal reward error: %v", err) - continue - } - } extra := make(map[string]interface{}) if v.Extra != "" { err := json.Unmarshal([]byte(v.Extra), &extra) @@ -109,7 +102,7 @@ func (r *ActivityMgr) Reload() error { Title: v.Title, MailTitle: v.MailTitle, MailContent: v.MailContent, - RewardItem: reward, + cfg: reward, Extra: extra, } log.Debug("load activity cfg: %v", cfg) diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 3434b743..e07d254b 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -69,6 +69,7 @@ type Player struct { stopOnce sync.Once msgChanOnce sync.Once func_time int + config_list map[string]interface{} } type PlayerBackUp struct { diff --git a/src/server/sql/Merge_Pet.sql b/src/server/sql/Merge_Pet.sql index 6b31ae65..73041ad2 100644 --- a/src/server/sql/Merge_Pet.sql +++ b/src/server/sql/Merge_Pet.sql @@ -162,7 +162,8 @@ CREATE TABLE IF NOT EXISTS t_activity_mod ( `start_time` int unsigned NOT NULL DEFAULT '0' COMMENT '活动开始时间', `end_time` int unsigned NOT NULL DEFAULT '0' COMMENT '活动结束时间', `level_limit` int unsigned NOT NULL DEFAULT '0' COMMENT '等级限制', - `reward` varchar(2048) DEFAULT '' COMMENT '活动奖励', - `extra` varchar(2048) DEFAULT '' COMMENT '活动额外数据', + `cfg` TEXT DEFAULT '' COMMENT '活动配置', + `cfg_buf` BLOB DEFAULT NULL COMMENT '活动配置buf', + `extra` TEXT DEFAULT '' COMMENT '活动额外数据', `updateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间' ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE utf8mb4_general_ci COMMENT = '系统活动表'; \ No newline at end of file From 66f985f758dc0cec93083b641acaf07b01bef582 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 14:41:18 +0800 Subject: [PATCH 3/7] 1 --- src/server/game/external.go | 2 +- src/server/main.go | 1 - src/server/test/fix_test.go | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/server/game/external.go b/src/server/game/external.go index 5691856e..4742cbba 100644 --- a/src/server/game/external.go +++ b/src/server/game/external.go @@ -34,7 +34,7 @@ func RegisterHandlerRPC(param []interface{}) { handler(&msg.AdminReq{}, HandleAdminReq) } -func Init() { +func init() { register() db.InitDB() db.InitRedis() diff --git a/src/server/main.go b/src/server/main.go index cbe3439b..97229a0c 100644 --- a/src/server/main.go +++ b/src/server/main.go @@ -29,7 +29,6 @@ func main() { // 当内存>512M时开始GC debug.SetGCPercent(50) debug.SetMemoryLimit(512 << 20) - game.Init() // 启动 pprof(仅绑定本地) go func() { // 如果需要绑定所有接口改为 ":6060" diff --git a/src/server/test/fix_test.go b/src/server/test/fix_test.go index 6cf9ae0c..42ad4cf4 100644 --- a/src/server/test/fix_test.go +++ b/src/server/test/fix_test.go @@ -113,7 +113,6 @@ func TestLevelUp(t *testing.T) { } func TestEndless(t *testing.T) { - game.Init() p1 := new(game.Player) p1.InitPlayer("3625212") p1.ZeroUpdate(nil) From 1e7fac37b8250a35d621cae020d738222a4940ca Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:26:05 +0800 Subject: [PATCH 4/7] 1 --- .gitignore | 1 + src/server/db/Mysql.go | 2 +- src/server/game/GameLogic.go | 4 +-- src/server/game/activity_mgr.go | 44 +++++++++++++++++++-------------- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index 623c746c..ab614cb0 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ src/server/msg/Gameapi.pb.go src/server/gen-go src/server/GeoLite2-Country src/server/test/GeoLite2-Country +src/server/msg/Gameapi_grpc.pb.go diff --git a/src/server/db/Mysql.go b/src/server/db/Mysql.go index fb37d20d..81e8a3fb 100644 --- a/src/server/db/Mysql.go +++ b/src/server/db/Mysql.go @@ -414,7 +414,7 @@ func GetServerMailData(data *[]*SqlServerMailStruct) error { } func GetActivityData(data *[]*SqlActivityCfgStruct) error { - sql := "select `id`, `type`, `title`, `mail_title`, `mail_content`, `level_limit`, `start_time`, `end_time`, `cfg`, `extra` from t_activity_mod" + sql := "select `id`, `type`, `title`, `mail_title`, `mail_content`, `level_limit`, `start_time`, `end_time`, `cfg_buf`, `extra` from t_activity_mod" err := SqlDb.Select(data, sql) return err } diff --git a/src/server/game/GameLogic.go b/src/server/game/GameLogic.go index 78569f8a..08862a37 100644 --- a/src/server/game/GameLogic.go +++ b/src/server/game/GameLogic.go @@ -296,9 +296,7 @@ func (ad *GameLogic) CreateMailMgr() { // 活动管理器 func (ad *GameLogic) CreateActivityMgr() { - ad.ActivityMgr = &ActivityMgr{ - ServerMod: new(ServerMod), - } + ad.ActivityMgr = &ActivityMgr{} ad.ActivityMgr.Init() } diff --git a/src/server/game/activity_mgr.go b/src/server/game/activity_mgr.go index 2adcea32..a108e185 100644 --- a/src/server/game/activity_mgr.go +++ b/src/server/game/activity_mgr.go @@ -1,16 +1,18 @@ package game import ( - "encoding/json" "fmt" "server/db" "server/game/mod/msg" + protoMsg "server/msg" "server/pkg/github.com/name5566/leaf/log" "sync" + + "google.golang.org/protobuf/proto" ) type ActivityMgr struct { - *ServerMod + data *ActivityData } type ActivityData struct { @@ -27,7 +29,7 @@ type ActivityCfg struct { Title string MailTitle string MailContent string - cfg map[string]interface{} + cfg interface{} Extra map[string]interface{} } @@ -39,17 +41,14 @@ func (ac *ActivityCfg) String() string { const () func (r *ActivityMgr) Init() { - r.key = ACTIVITY_MGR_KEY r.data = &ActivityData{ List: make(map[int]*ActivityCfg, 0), } - // 注册处理函数 - r.init() r.Reload() } func (r *ActivityMgr) getData() *ActivityData { - return r.data.(*ActivityData) + return r.data } // 零点更新 重置榜单 @@ -57,7 +56,7 @@ func (r *ActivityMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) { return nil, nil } -func (r ActivityMgr) GetActivityCfg(Id int) ActivityCfg { +func (r *ActivityMgr) GetActivityCfg(Id int) ActivityCfg { // 获取活动配置 data := r.getData() data.mu.Lock() @@ -84,14 +83,10 @@ func (r *ActivityMgr) Reload() error { } data.List = make(map[int]*ActivityCfg, 0) for _, v := range cfgList { - reward := make(map[string]interface{}) - extra := make(map[string]interface{}) - if v.Extra != "" { - err := json.Unmarshal([]byte(v.Extra), &extra) - if err != nil { - log.Error("Unmarshal extra error: %v", err) - continue - } + activityCfg, err := unmarshalActivityCfg(v.Type, []byte(v.Cfg)) + if err != nil { + log.Error("Unmarshal activity cfg error: %v", err) + continue } cfg := &ActivityCfg{ Id: v.Id, @@ -102,11 +97,24 @@ func (r *ActivityMgr) Reload() error { Title: v.Title, MailTitle: v.MailTitle, MailContent: v.MailContent, - cfg: reward, - Extra: extra, + cfg: activityCfg, } log.Debug("load activity cfg: %v", cfg) data.List[v.Id] = cfg } return nil } + +func unmarshalActivityCfg(atype int, buf []byte) (interface{}, error) { + switch atype { + case 1: + cfg := &protoMsg.MiningCfg{} + err := proto.Unmarshal(buf, cfg) + if err != nil { + return nil, err + } + return cfg, nil + } + return nil, fmt.Errorf("unknown activity type: %d", atype) + +} From 32d66d96fd0b5da83f8584fc79dcee719050a845 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:58:54 +0800 Subject: [PATCH 5/7] 1 --- src/server/game/activity_mgr.go | 12 ++++++++++++ src/server/game/player_data.go | 19 +++++++------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/server/game/activity_mgr.go b/src/server/game/activity_mgr.go index a108e185..1b00de48 100644 --- a/src/server/game/activity_mgr.go +++ b/src/server/game/activity_mgr.go @@ -56,6 +56,18 @@ func (r *ActivityMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) { return nil, nil } +func (r *ActivityMgr) GetActivityList() []ActivityCfg { + // 获取活动列表 + data := r.getData() + data.mu.Lock() + defer data.mu.Unlock() + list := make([]ActivityCfg, 0, len(data.List)) + for _, v := range data.List { + list = append(list, *v) + } + return list +} + func (r *ActivityMgr) GetActivityCfg(Id int) ActivityCfg { // 获取活动配置 data := r.getData() diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index e07d254b..7629f8bd 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -7,7 +7,6 @@ import ( "errors" "math" "server/conf" - activityCfg "server/conf/activity" cardCfg "server/conf/card" chargeCfg "server/conf/charge" fur_cfg "server/conf/fur" @@ -1192,9 +1191,8 @@ func (p *Player) TeLog(Type string, Param map[string]interface{}) { // 初始化活动 func (p *Player) InitActivity() { p.activity = make(map[int]*ActivityInfo) - ActivityList := activityCfg.GetActivityList() + ActivityList := G_GameLogicPtr.ActivityMgr.GetActivityList() Level := p.GetPlayerBaseMod().GetLevel() - ActivityMod := p.PlayMod.getActivityMod() now := GoUtil.Now() var startduration int64 var minduration int64 @@ -1203,24 +1201,21 @@ func (p *Player) InitActivity() { if v.Level > Level { continue } - Status := ActivityMod.GetActivityStatus(v) - if Status == 0 { - continue - } - startduration = v.StartTime - now - endduration = v.EndTime - now + 1 + Status := 1 + startduration = v.Strartime - now + endduration = v.Endtime - now + 1 if startduration > 0 && (minduration == 0 || minduration > startduration) { minduration = startduration } if endduration > 0 && (minduration == 0 || minduration > endduration) { minduration = endduration } - if v.StartTime > now || v.EndTime < now { + if v.Strartime > now || v.Endtime < now { continue } p.activity[v.Id] = &ActivityInfo{ - StartT: v.StartTime, - EndT: v.EndTime, + StartT: v.Strartime, + EndT: v.Endtime, Id: v.Id, Type: v.Type, Status: Status, From 57d2ab0f69539dd0e8277b3640ab9fb33b41f7d3 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 19 Mar 2026 15:06:12 +0800 Subject: [PATCH 6/7] 1 --- src/server/conf/activity/activity_cfg.go | 12 ------------ src/server/game/activity_func.go | 10 +++++----- src/server/game/activity_mgr.go | 10 ++++++---- src/server/game/player_data.go | 6 +++--- 4 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/server/conf/activity/activity_cfg.go b/src/server/conf/activity/activity_cfg.go index b1cac0ea..e1b915ab 100644 --- a/src/server/conf/activity/activity_cfg.go +++ b/src/server/conf/activity/activity_cfg.go @@ -1,11 +1,9 @@ package activityCfg import ( - languageCfg "server/conf/language" "server/game/mod/item" GoUtil "server/game_util" "server/gamedata" - "server/msg" "server/pkg/github.com/name5566/leaf/log" "strconv" ) @@ -136,16 +134,6 @@ func GetActivityRewardItems(ActId int) []*item.Item { return nil } -func GetActivityTitle(ActId int) (string, string) { - data, err := gamedata.GetDataByIntKey(CFG_ACTIVITY, ActId) - if err != nil { - log.Debug("GetActivityTitle err:%v", err) - return "", "" - } - title := gamedata.GetStringValue(data, "Title") - return languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, title), languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, title) -} - func GetActivityRecycleMail(ActId int) (string, string, string) { data, err := gamedata.GetDataByIntKey(CFG_ACTIVITY, ActId) if err != nil { diff --git a/src/server/game/activity_func.go b/src/server/game/activity_func.go index 79bbbe4e..66a061fb 100644 --- a/src/server/game/activity_func.go +++ b/src/server/game/activity_func.go @@ -460,7 +460,7 @@ func (p *Player) CatnipBackData() { func (p *Player) GetChampshipActivityId() (int, int) { var todayActivityId int var yesterdayActivityId int - activiyCfgList := activityCfg.GetActivityListOrigin() + activiyCfgList := G_GameLogicPtr.ActivityMgr.GetActivityList() Now := GoUtil.Now() YesterDay := GoUtil.ZeroTimestamp() - 1 level := p.GetBaseMod().GetLevel() @@ -472,10 +472,10 @@ func (p *Player) GetChampshipActivityId() (int, int) { if v.Level > level { continue } - if v.StartTime <= Now && v.EndTime >= Now { + if v.Startime <= Now && v.Endtime >= Now { todayActivityId = v.Id } - if v.StartTime <= YesterDay && v.EndTime >= YesterDay { + if v.Startime <= YesterDay && v.Endtime >= YesterDay { yesterdayActivityId = v.Id } } @@ -484,7 +484,7 @@ func (p *Player) GetChampshipActivityId() (int, int) { func (p *Player) GetDailyTaskActivityId() int { var activityId int - activiyCfgList := activityCfg.GetActivityListOrigin() + activiyCfgList := G_GameLogicPtr.ActivityMgr.GetActivityList() Now := GoUtil.Now() level := p.GetBaseMod().GetLevel() activityIds := dailyTaskCfg.GetActivityIds() @@ -495,7 +495,7 @@ func (p *Player) GetDailyTaskActivityId() int { if v.Level > level { continue } - if v.StartTime <= Now && v.EndTime >= Now { + if v.Startime <= Now && v.Endtime >= Now { activityId = v.Id break } diff --git a/src/server/game/activity_mgr.go b/src/server/game/activity_mgr.go index 1b00de48..593f5f88 100644 --- a/src/server/game/activity_mgr.go +++ b/src/server/game/activity_mgr.go @@ -23,7 +23,7 @@ type ActivityData struct { type ActivityCfg struct { Id int Type int - Strartime int64 + Startime int64 Endtime int64 Level int Title string @@ -35,7 +35,7 @@ type ActivityCfg struct { func (ac *ActivityCfg) String() string { return fmt.Sprintf("Id: %d, Type: %d, StartTime: %d, EndTime: %d, Level: %d, Title: %s, MailTitle: %s, MailContent: %s, cfg: %v, Extra: %v", - ac.Id, ac.Type, ac.Strartime, ac.Endtime, ac.Level, ac.Title, ac.MailTitle, ac.MailContent, ac.cfg, ac.Extra) + ac.Id, ac.Type, ac.Startime, ac.Endtime, ac.Level, ac.Title, ac.MailTitle, ac.MailContent, ac.cfg, ac.Extra) } const () @@ -103,7 +103,7 @@ func (r *ActivityMgr) Reload() error { cfg := &ActivityCfg{ Id: v.Id, Type: v.Type, - Strartime: v.Start_time, + Startime: v.Start_time, Endtime: v.End_time, Level: v.Level, Title: v.Title, @@ -118,6 +118,9 @@ func (r *ActivityMgr) Reload() error { } func unmarshalActivityCfg(atype int, buf []byte) (interface{}, error) { + if len(buf) == 0 { + return nil, nil + } switch atype { case 1: cfg := &protoMsg.MiningCfg{} @@ -128,5 +131,4 @@ func unmarshalActivityCfg(atype int, buf []byte) (interface{}, error) { return cfg, nil } return nil, fmt.Errorf("unknown activity type: %d", atype) - } diff --git a/src/server/game/player_data.go b/src/server/game/player_data.go index 7629f8bd..029360c9 100644 --- a/src/server/game/player_data.go +++ b/src/server/game/player_data.go @@ -1202,7 +1202,7 @@ func (p *Player) InitActivity() { continue } Status := 1 - startduration = v.Strartime - now + startduration = v.Startime - now endduration = v.Endtime - now + 1 if startduration > 0 && (minduration == 0 || minduration > startduration) { minduration = startduration @@ -1210,11 +1210,11 @@ func (p *Player) InitActivity() { if endduration > 0 && (minduration == 0 || minduration > endduration) { minduration = endduration } - if v.Strartime > now || v.Endtime < now { + if v.Startime > now || v.Endtime < now { continue } p.activity[v.Id] = &ActivityInfo{ - StartT: v.Strartime, + StartT: v.Startime, EndT: v.Endtime, Id: v.Id, Type: v.Type, From 92417342bf5d345b323a72775b53d20843f78811 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Mon, 23 Mar 2026 14:52:31 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/backend/server.go | 13 +++ src/server/backend/sever_handler.go | 135 ---------------------------- src/server/conf/server.json | 2 +- src/server/game/activity_mgr.go | 2 +- src/server/game/admin.go | 26 ++++++ src/server/test/conf/server.json | 1 + 6 files changed, 42 insertions(+), 137 deletions(-) delete mode 100644 src/server/backend/sever_handler.go diff --git a/src/server/backend/server.go b/src/server/backend/server.go index b86db4b8..6026db25 100644 --- a/src/server/backend/server.go +++ b/src/server/backend/server.go @@ -4,6 +4,7 @@ import ( "context" "net" "server/conf" + "server/game" "server/msg" "server/pkg/github.com/name5566/leaf/log" @@ -15,9 +16,21 @@ type backendServer struct { } func (s *backendServer) ReloadActivity(ctx context.Context, req *msg.ReqActivityCfgReload) (*msg.ResActivityCfgReload, error) { + log.Debug("Received ReloadActivity request: %v", req) + game.AcitivityCfgReload() return nil, nil } +func (s *backendServer) OrderShipping(ctx context.Context, req *msg.ReqOrderShipping) (*msg.ResOrderShipping, error) { + log.Debug("Received OrderShipping request: %v", req) + res, err := game.AdminShipping(req) + if err != nil { + log.Error("OrderShipping error: %v", err) + return nil, err + } + return res, nil +} + func Start() { if conf.Server.RPCAddr == "" { log.Debug("RPC server address not configured, skipping gRPC server startup") diff --git a/src/server/backend/sever_handler.go b/src/server/backend/sever_handler.go deleted file mode 100644 index e6006f27..00000000 --- a/src/server/backend/sever_handler.go +++ /dev/null @@ -1,135 +0,0 @@ -package backend - -// type GameServiceHandler struct{} - -// func NewGameServiceHandler() *GameServiceHandler { -// return &GameServiceHandler{} -// } - -// func (h *GameServiceHandler) ReqPlayerInfo(ctx context.Context, id int64) (*backend.ResAdminInfo, error) { -// player := game.G_GameLogicPtr.GetPlayer(int64(id)) -// online := true -// if player == nil { -// player = new(game.Player) -// player.M_DwUin = int64(id) -// player.InitPlayerOnly() -// player.ZeroUpdate(nil) -// online = false -// } -// res := &backend.ResAdminInfo{} -// res.Name = player.GetBaseMod().NickName -// res.UID = player.M_DwUin -// res.AreaId = int32(player.GetDecorateMod().GetAreaId()) -// res.Face = int32(player.GetFaceMod().SetId) -// res.Charge = player.GetChargeMod().Charge -// res.MaxCharge = player.GetChargeMod().MaxCharge -// res.Level = int32(player.GetPlayerBaseMod().GetLevel()) -// res.Diamond = int32(player.GetPlayerBaseMod().GetDiamond()) -// res.Star = int32(player.GetPlayerBaseMod().GetStar()) -// res.Energy = int32(player.GetPlayerBaseMod().GetEnergy()) -// res.UserName = player.GetPlayerBaseMod().GetName() -// res.LoginTime = player.GetBaseMod().LoginTime -// res.Cumulative = int32(player.GetBaseMod().Cumulative) -// res.RegisterTime = int32(player.GetPlayerBaseMod().GetRegisterTime()) -// res.TodayCumulative = int32(player.GetBaseMod().TodayCumulative) -// res.Ban = int8(db.GetPlayerBan(player.GetBaseMod().Account)) -// if online { -// res.Cumulative = int32(int64(player.GetBaseMod().Cumulative) + GoUtil.Now() - int64(player.GetBaseMod().LoginTime)) -// res.TodayCumulative = int32(int64(player.GetBaseMod().TodayCumulative) + GoUtil.Now() - int64(player.GetBaseMod().LoginTime)) -// } -// res.Code = player.GetBaseMod().AddCode -// res.ChessMap = player.GetChessMod().ChessMap -// resActLog := make([]*backend.Actlog, 0, len(player.GetFriendMod().ActivityLog)) -// for _, log := range player.GetFriendMod().ActivityLog { -// resActLog = append(resActLog, &backend.Actlog{ -// Type: int8(log.Type), -// Time: log.Time, -// Param: log.Param, -// }) -// } -// res.ActLog = resActLog -// friendList := player.GetFriendMod().NewFriendList -// type friendInfo struct { -// Uid int64 -// NickName string -// Avatar int -// Level int -// LogoutTime int64 -// LoginTime int64 -// } -// resFriendList := make([]*backend.FriendInfo, 0, len(friendList)) -// for v := range friendList { -// ps := game.G_GameLogicPtr.GetSimplePlayerByUid(v) -// if ps == nil { -// continue -// } -// resFriendList = append(resFriendList, &backend.FriendInfo{ -// UID: int64(v), -// NickName: ps.Name, -// Face: int32(ps.Face), -// Level: int32(ps.Level), -// LogoutTime: ps.Loginout, -// LoginTime: ps.Login, -// }) -// } -// res.FriendList = resFriendList -// OrderMap := make(map[int32]*backend.OrderInfo) -// Index := 0 -// for k, v := range player.GetOrderMod().OrderList { -// OrderMap[int32(Index)] = &backend.OrderInfo{ -// ID: int32(k), -// Type: int32(v.Type), -// Time: v.Timestamp, -// ChessId: GoUtil.IntSliceToString(v.MergeId), -// Diff: int8(v.Diff), -// } -// Index++ -// } -// res.OrderList = OrderMap -// return res, nil -// } - -// func (h *GameServiceHandler) ReqReloadServerMail(ctx context.Context) (*backend.ResMessage, error) { -// game.G_GameLogicPtr.MailMgrCall(&msg.Msg{Type: msg.HANDLE_TYPE_MAIL_RELOAD}) -// game.G_GameLogicPtr.NotifyAll(&msg.Msg{Type: msg.HANDLE_TYPE_MAIL}) -// log.Debug("ReqReloadServerMail success") -// return &backend.ResMessage{ -// Code: 0, -// }, nil -// } - -// func (h *GameServiceHandler) ReqConfigReload(ctx context.Context) (*backend.ResMessage, error) { -// gamedata.Reload() -// return &backend.ResMessage{ -// Code: 0, -// }, nil -// } - -// func (h *GameServiceHandler) ReqAdminGm(ctx context.Context, uid int64, command string) (*backend.ResMessage, error) { -// player := game.G_GameLogicPtr.GetPlayer(uid) -// if player == nil { -// return &backend.ResMessage{ -// Code: 1, -// Msg: "player not online", -// }, nil -// } -// player.Lock() -// defer player.UnLock() -// err := game.ReqGmCommand_(player, command) -// if err != nil { -// return &backend.ResMessage{ -// Code: 1, -// Msg: err.Error(), -// }, nil -// } -// return &backend.ResMessage{ -// Code: 0, -// }, nil -// } - -// func (h *GameServiceHandler) ReqAdminBan(ctx context.Context, uid int64, banTime int64) (*backend.ResMessage, error) { -// db.UpdatePlayerBan(uid, banTime) -// return &backend.ResMessage{ -// Code: 0, -// }, nil -// } diff --git a/src/server/conf/server.json b/src/server/conf/server.json index 3b390e3c..9fca6f51 100644 --- a/src/server/conf/server.json +++ b/src/server/conf/server.json @@ -4,7 +4,7 @@ "LogPath": "./log", "TCPAddr": ":3602", "WSAddr": ":3567", - "RPCAddr": ":9003", + "RPCAddr": ":50051", "MySqlAddr": "127.0.0.1", "MySqlPort": "3306", "MySqlUsr": "root", diff --git a/src/server/game/activity_mgr.go b/src/server/game/activity_mgr.go index 593f5f88..54d937a0 100644 --- a/src/server/game/activity_mgr.go +++ b/src/server/game/activity_mgr.go @@ -130,5 +130,5 @@ func unmarshalActivityCfg(atype int, buf []byte) (interface{}, error) { } return cfg, nil } - return nil, fmt.Errorf("unknown activity type: %d", atype) + return nil, nil } diff --git a/src/server/game/admin.go b/src/server/game/admin.go index 87589fe7..aac65f31 100644 --- a/src/server/game/admin.go +++ b/src/server/game/admin.go @@ -322,3 +322,29 @@ func ReqAdminBan(args []interface{}) error { AdminPlayerBack(a, res) return nil } + +func AcitivityCfgReload() { + G_GameLogicPtr.ActivityMgr.Reload() +} + +func AdminShipping(req *msg.ReqOrderShipping) (*msg.ResOrderShipping, error) { + res := &msg.ResOrderShipping{} + res.Code = 0 + OrderInfo, err := db.GetPlayerChargeData(req.OrderSn) + if err != nil { + res.Code = 1 + res.Msg = "order not found" + } + if OrderInfo.PayStatus == MergeConst.ORDER_STATUS_SHIP { + res.Msg = "order already shipped" + } + // 玩家在线,通知发货 + Player := G_GameLogicPtr.GetPlayer(int64(OrderInfo.Uid)) + if Player != nil { + go Player.TriggerShippingOrderOrigin(&msg.ReqShippingOrder{ + OrderSn: req.OrderSn, + }) + res.Msg = "player online,triggered sync" + } + return res, nil +} diff --git a/src/server/test/conf/server.json b/src/server/test/conf/server.json index b1a8388a..1ed6d3c3 100644 --- a/src/server/test/conf/server.json +++ b/src/server/test/conf/server.json @@ -3,6 +3,7 @@ "LogLevel": "debug", "LogPath": "./log", "TCPAddr": ":3601", + "RPCAddr": ":50051", "WSAddr": ":3566", "MySqlAddr": "127.0.0.1", "MySqlPort": "3306",