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) +}