From e580baeb46b8e443a903fa68160740e4c27ba095 Mon Sep 17 00:00:00 2001 From: flswld Date: Sat, 18 Feb 2023 22:09:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/gs/application.toml | 1 + common/config/config.go | 7 ++++- common/mq/nats.go | 4 +-- common/rpc/client.go | 2 +- common/utils/utils.go | 2 +- dispatch/app/app.go | 6 ++-- dispatch/controller/controller.go | 4 +-- dispatch/dao/dao.go | 6 ++-- docker-compose.yaml | 11 +++++++ fight/app/app.go | 4 ++- fight/engine/fight_engine.go | 4 +-- gate/app/app.go | 14 +++++---- gate/net/kcp_connect_manager.go | 4 +-- gate/net/proto_endecode.go | 6 ++-- gate/net/session.go | 10 +++--- gdconf/game_data_config.go | 30 +++++++++--------- gdconf/game_data_config_test.go | 9 ++++++ gm/app/app.go | 5 +-- gm/controller/controller.go | 4 +-- gm/controller/gm_controller.go | 1 + gs/app/app.go | 6 ++-- gs/dao/dao.go | 6 ++-- gs/game/command_controller.go | 3 +- gs/game/command_manager.go | 8 +++++ gs/game/game_manager.go | 3 +- gs/game/player_fight_sync.go | 10 +++--- gs/game/player_gacha.go | 2 +- gs/game/player_stamina.go | 2 +- gs/service/gm.go | 10 +++--- node/app/app.go | 7 +++-- node/service/discovery.go | 52 ++++++++++++++++++++----------- pathfinding/app/app.go | 4 ++- pkg/alg/aoi_test.go | 3 ++ pkg/httpclient/http_client.go | 30 +++++++++++------- pkg/logger/logger.go | 18 ++++++++--- robot/cmd/main.go | 10 +++--- robot/login/http_login.go | 8 ++--- 37 files changed, 198 insertions(+), 118 deletions(-) diff --git a/cmd/gs/application.toml b/cmd/gs/application.toml index f4989a88..18c01615 100644 --- a/cmd/gs/application.toml +++ b/cmd/gs/application.toml @@ -2,6 +2,7 @@ client_proto_proxy_enable = false game_data_config_path = "./game_data_config" gacha_history_server = "https://hk4e.flswld.com/api/v1" +load_scene_lua_config = true # 是否加载场景详情LUA配置数据 [logger] level = "DEBUG" diff --git a/common/config/config.go b/common/config/config.go index f8e919ad..7e783bf6 100644 --- a/common/config/config.go +++ b/common/config/config.go @@ -46,7 +46,8 @@ type Hk4e struct { Version string `toml:"version"` // 支持的客户端协议版本号 三位数字 多个以逗号分隔 如300,310,320 GateTcpMqAddr string `toml:"gate_tcp_mq_addr"` // 访问网关tcp直连消息队列的地址 填网关的内网地址 GateTcpMqPort int32 `toml:"gate_tcp_mq_port"` - LoginSdkUrl string `toml:"login_sdk_url"` // 网关登录验证token的sdk服务器地址 目前填dispatch的内网地址 + LoginSdkUrl string `toml:"login_sdk_url"` // 网关登录验证token的sdk服务器地址 目前填dispatch的内网地址 + LoadSceneLuaConfig bool `toml:"load_scene_lua_config"` // 是否加载场景详情LUA配置数据 } // MQ 消息队列 @@ -59,6 +60,10 @@ func InitConfig(filePath string) { CONF.loadConfigFile(filePath) } +func GetConfig() *Config { + return CONF +} + // 加载配置文件 func (c *Config) loadConfigFile(filePath string) { _, err := toml.DecodeFile(filePath, &c) diff --git a/common/mq/nats.go b/common/mq/nats.go index b443c05a..78cb104d 100644 --- a/common/mq/nats.go +++ b/common/mq/nats.go @@ -41,7 +41,7 @@ type MessageQueue struct { func NewMessageQueue(serverType string, appId string, rpcClient *rpc.Client) (r *MessageQueue) { r = new(MessageQueue) - conn, err := nats.Connect(config.CONF.MQ.NatsUrl) + conn, err := nats.Connect(config.GetConfig().MQ.NatsUrl) if err != nil { logger.Error("connect nats error: %v", err) return nil @@ -247,7 +247,7 @@ type GateTcpMqEvent struct { } func (m *MessageQueue) runGateTcpMqServer() { - addr, err := net.ResolveTCPAddr("tcp4", "0.0.0.0:"+strconv.Itoa(int(config.CONF.Hk4e.GateTcpMqPort))) + addr, err := net.ResolveTCPAddr("tcp4", "0.0.0.0:"+strconv.Itoa(int(config.GetConfig().Hk4e.GateTcpMqPort))) if err != nil { logger.Error("gate tcp mq parse port error: %v", err) return diff --git a/common/rpc/client.go b/common/rpc/client.go index 15a996e5..06f32536 100644 --- a/common/rpc/client.go +++ b/common/rpc/client.go @@ -19,7 +19,7 @@ type Client struct { // NewClient 构造 func NewClient() (*Client, error) { r := new(Client) - conn, err := nats.Connect(config.CONF.MQ.NatsUrl) + conn, err := nats.Connect(config.GetConfig().MQ.NatsUrl) if err != nil { return nil, err } diff --git a/common/utils/utils.go b/common/utils/utils.go index 77ad0923..8303df46 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -9,7 +9,7 @@ import ( ) func UnmarshalProtoObj(serverProtoObj pb.Message, clientProtoObj pb.Message, data []byte) bool { - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { err := pb.Unmarshal(data, clientProtoObj) if err != nil { logger.Error("parse client proto obj error: %v", err) diff --git a/dispatch/app/app.go b/dispatch/app/app.go index 215bb592..da1a5b9b 100644 --- a/dispatch/app/app.go +++ b/dispatch/app/app.go @@ -6,7 +6,6 @@ import ( "os" "os/signal" "syscall" - "time" "hk4e/common/config" "hk4e/common/rpc" @@ -20,6 +19,9 @@ func Run(ctx context.Context, configFile string) error { logger.InitLogger("dispatch") logger.Warn("dispatch start") + defer func() { + logger.CloseLogger() + }() db := dao.NewDao() defer db.CloseDao() @@ -43,8 +45,6 @@ func Run(ctx context.Context, configFile string) error { switch s { case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: logger.Warn("dispatch exit") - - time.Sleep(time.Second) return nil case syscall.SIGHUP: default: diff --git a/dispatch/controller/controller.go b/dispatch/controller/controller.go index 19f1ae23..22808ef9 100644 --- a/dispatch/controller/controller.go +++ b/dispatch/controller/controller.go @@ -60,7 +60,7 @@ func (c *Controller) authorize() gin.HandlerFunc { } func (c *Controller) registerRouter() { - if config.CONF.Logger.Level == "DEBUG" { + if config.GetConfig().Logger.Level == "DEBUG" { gin.SetMode(gin.DebugMode) } else { gin.SetMode(gin.ReleaseMode) @@ -138,7 +138,7 @@ func (c *Controller) registerRouter() { engine.Use(c.authorize()) engine.POST("/gate/token/verify", c.gateTokenVerify) engine.POST("/gate/token/reset", c.gateTokenReset) - port := config.CONF.HttpPort + port := config.GetConfig().HttpPort addr := ":" + strconv.Itoa(int(port)) err := engine.Run(addr) if err != nil { diff --git a/dispatch/dao/dao.go b/dispatch/dao/dao.go index 6e326256..14237dc8 100644 --- a/dispatch/dao/dao.go +++ b/dispatch/dao/dao.go @@ -20,7 +20,7 @@ type Dao struct { func NewDao() (r *Dao) { r = new(Dao) - clientOptions := options.Client().ApplyURI(config.CONF.Database.Url).SetMinPoolSize(10).SetMaxPoolSize(100) + clientOptions := options.Client().ApplyURI(config.GetConfig().Database.Url).SetMinPoolSize(10).SetMaxPoolSize(100) client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { logger.Error("mongo connect error: %v", err) @@ -34,8 +34,8 @@ func NewDao() (r *Dao) { r.mongo = client r.db = client.Database("dispatch_hk4e") r.redis = redis.NewClient(&redis.Options{ - Addr: config.CONF.Redis.Addr, - Password: config.CONF.Redis.Password, + Addr: config.GetConfig().Redis.Addr, + Password: config.GetConfig().Redis.Password, DB: 0, PoolSize: 10, MinIdleConns: 1, diff --git a/docker-compose.yaml b/docker-compose.yaml index b01ce59d..0edcbd69 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -4,6 +4,8 @@ services: restart: always image: flswld/node:1.0.0 container_name: node + ports: + - "1234:1234/tcp" environment: TZ: Asia/Shanghai GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore @@ -23,6 +25,7 @@ services: container_name: dispatch ports: - "8080:8080/tcp" + - "2345:2345/tcp" environment: TZ: Asia/Shanghai GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore @@ -47,6 +50,7 @@ services: ports: - "22222:22222/udp" - "33333:33333/tcp" + - "3456:3456/tcp" environment: TZ: Asia/Shanghai GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore @@ -67,6 +71,8 @@ services: restart: always image: flswld/fight:1.0.0 container_name: fight + ports: + - "5678:5678/tcp" environment: TZ: Asia/Shanghai GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore @@ -86,6 +92,8 @@ services: restart: always image: flswld/pathfinding:1.0.0 container_name: pathfinding + ports: + - "6789:6789/tcp" environment: TZ: Asia/Shanghai GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore @@ -105,6 +113,8 @@ services: restart: always image: flswld/gs:1.0.0 container_name: gs + ports: + - "4567:4567/tcp" environment: TZ: Asia/Shanghai GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore @@ -127,6 +137,7 @@ services: container_name: gm ports: - "9001:9001/tcp" + - "7890:7890/tcp" environment: TZ: Asia/Shanghai GOLANG_PROTOBUF_REGISTRATION_CONFLICT: ignore diff --git a/fight/app/app.go b/fight/app/app.go index d5d4f2ae..58581432 100644 --- a/fight/app/app.go +++ b/fight/app/app.go @@ -57,6 +57,9 @@ func Run(ctx context.Context, configFile string) error { logger.InitLogger("fight_" + APPID) logger.Warn("fight start, appid: %v", APPID) + defer func() { + logger.CloseLogger() + }() messageQueue := mq.NewMessageQueue(api.FIGHT, APPID, client) defer messageQueue.Close() @@ -74,7 +77,6 @@ func Run(ctx context.Context, configFile string) error { switch s { case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: logger.Warn("fight exit, appid: %v", APPID) - time.Sleep(time.Second) return nil case syscall.SIGHUP: default: diff --git a/fight/engine/fight_engine.go b/fight/engine/fight_engine.go index 0d32d610..2f40c78b 100644 --- a/fight/engine/fight_engine.go +++ b/fight/engine/fight_engine.go @@ -228,7 +228,7 @@ func (f *FightRoutine) attackHandle(gameMsg *mq.GameMsg) { continue } hitInfo := new(proto.EvtBeingHitInfo) - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { clientProtoObj := GetClientProtoObjByName("EvtBeingHitInfo") if clientProtoObj == nil { logger.Error("get client proto obj is nil") @@ -303,7 +303,7 @@ func (f *FightRoutine) getAllPlayer(entityMap map[uint32]*Entity) []uint32 { var ClientCmdProtoMap *client_proto.ClientCmdProtoMap func initClientCmdProtoMap() { - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { ClientCmdProtoMap = client_proto.NewClientCmdProtoMap() } } diff --git a/gate/app/app.go b/gate/app/app.go index 9b2e54fd..86b6cb85 100644 --- a/gate/app/app.go +++ b/gate/app/app.go @@ -33,12 +33,12 @@ func Run(ctx context.Context, configFile string) error { rsp, err := client.Discovery.RegisterServer(context.TODO(), &api.RegisterServerReq{ ServerType: api.GATE, GateServerAddr: &api.GateServerAddr{ - KcpAddr: config.CONF.Hk4e.KcpAddr, - KcpPort: uint32(config.CONF.Hk4e.KcpPort), - MqAddr: config.CONF.Hk4e.GateTcpMqAddr, - MqPort: uint32(config.CONF.Hk4e.GateTcpMqPort), + KcpAddr: config.GetConfig().Hk4e.KcpAddr, + KcpPort: uint32(config.GetConfig().Hk4e.KcpPort), + MqAddr: config.GetConfig().Hk4e.GateTcpMqAddr, + MqPort: uint32(config.GetConfig().Hk4e.GateTcpMqPort), }, - Version: strings.Split(config.CONF.Hk4e.Version, ","), + Version: strings.Split(config.GetConfig().Hk4e.Version, ","), }) if err != nil { return err @@ -67,6 +67,9 @@ func Run(ctx context.Context, configFile string) error { logger.InitLogger("gate_" + APPID) logger.Warn("gate start, appid: %v", APPID) + defer func() { + logger.CloseLogger() + }() messageQueue := mq.NewMessageQueue(api.GATE, APPID, client) defer messageQueue.Close() @@ -93,7 +96,6 @@ func Run(ctx context.Context, configFile string) error { switch s { case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: logger.Warn("gate exit, appid: %v", APPID) - time.Sleep(time.Second) return nil case syscall.SIGHUP: default: diff --git a/gate/net/kcp_connect_manager.go b/gate/net/kcp_connect_manager.go index 594c5f6d..96e02c3f 100644 --- a/gate/net/kcp_connect_manager.go +++ b/gate/net/kcp_connect_manager.go @@ -73,7 +73,7 @@ func NewKcpConnectManager(messageQueue *mq.MessageQueue, discovery *rpc.Discover r.kcpEventOutput = make(chan *KcpEvent, 1000) r.reLoginRemoteKickRegChan = make(chan *RemoteKick, 1000) r.serverCmdProtoMap = cmd.NewCmdProtoMap() - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { r.clientCmdProtoMap = client_proto.NewClientCmdProtoMap() } r.messageQueue = messageQueue @@ -100,7 +100,7 @@ func (k *KcpConnectManager) run() { regionEc2b.SetSeed(ec2b.Seed()) k.dispatchKey = regionEc2b.XorKey() // kcp - port := strconv.Itoa(int(config.CONF.Hk4e.KcpPort)) + port := strconv.Itoa(int(config.GetConfig().Hk4e.KcpPort)) listener, err := kcp.ListenWithOptions("0.0.0.0:" + port) if err != nil { logger.Error("listen kcp err: %v", err) diff --git a/gate/net/proto_endecode.go b/gate/net/proto_endecode.go index 7808a70c..e39e355e 100644 --- a/gate/net/proto_endecode.go +++ b/gate/net/proto_endecode.go @@ -28,7 +28,7 @@ type ProtoMessage struct { func ProtoDecode(kcpMsg *KcpMsg, serverCmdProtoMap *cmd.CmdProtoMap, clientCmdProtoMap *client_proto.ClientCmdProtoMap) (protoMsgList []*ProtoMsg) { protoMsgList = make([]*ProtoMsg, 0) - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { clientCmdId := kcpMsg.CmdId clientProtoData := kcpMsg.ProtoData cmdName := clientCmdProtoMap.GetClientCmdNameByCmdId(clientCmdId) @@ -139,7 +139,7 @@ func ProtoDecodePayloadLoop(cmdId uint16, protoData []byte, protoMessageList *[] return } for _, unionCmd := range unionCmdNotify.GetCmdList() { - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { clientCmdId := uint16(unionCmd.MessageId) clientProtoData := unionCmd.Body cmdName := clientCmdProtoMap.GetClientCmdNameByCmdId(clientCmdId) @@ -231,7 +231,7 @@ func ProtoEncode(protoMsg *ProtoMsg, } else { kcpMsg.ProtoData = nil } - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { serverCmdId := kcpMsg.CmdId serverProtoData := kcpMsg.ProtoData serverProtoObj := serverCmdProtoMap.GetProtoObjByCmdId(serverCmdId) diff --git a/gate/net/session.go b/gate/net/session.go index 35d445c8..deb698b9 100644 --- a/gate/net/session.go +++ b/gate/net/session.go @@ -191,11 +191,10 @@ func (k *KcpConnectManager) sendMsgHandle() { }) } else if protoMsg.CmdId == cmd.ClientReconnectNotify { tokenResetRsp, err := httpclient.PostJson[controller.TokenResetRsp]( - config.CONF.Hk4e.LoginSdkUrl+"/gate/token/reset?key=flswld", + config.GetConfig().Hk4e.LoginSdkUrl+"/gate/token/reset?key=flswld", &controller.TokenResetReq{ PlayerId: session.userId, - }, - "") + }) if err != nil { logger.Error("reset token error: %v", err) k.kcpEventInput <- &KcpEvent{ @@ -343,12 +342,11 @@ func (k *KcpConnectManager) getPlayerToken(req *proto.GetPlayerTokenReq, session } } tokenVerifyRsp, err := httpclient.PostJson[controller.TokenVerifyRsp]( - config.CONF.Hk4e.LoginSdkUrl+"/gate/token/verify?key=flswld", + config.GetConfig().Hk4e.LoginSdkUrl+"/gate/token/verify?key=flswld", &controller.TokenVerifyReq{ AccountId: req.AccountUid, AccountToken: req.AccountToken, - }, - "") + }) if err != nil { logger.Error("verify token error: %v, account uid: %v", err, req.AccountUid) loginFailClose() diff --git a/gdconf/game_data_config.go b/gdconf/game_data_config.go index a49e2d1b..f3a85eff 100644 --- a/gdconf/game_data_config.go +++ b/gdconf/game_data_config.go @@ -71,7 +71,7 @@ func ReplaceGameDataConfig() { } func (g *GameDataConfig) loadAll() { - pathPrefix := config.CONF.Hk4e.GameDataConfigPath + pathPrefix := config.GetConfig().Hk4e.GameDataConfigPath dirInfo, err := os.Stat(pathPrefix) if err != nil || !dirInfo.IsDir() { @@ -116,19 +116,21 @@ func (g *GameDataConfig) load() { g.loadSceneData() // 场景 g.loadScenePoint() // 场景传送点 g.loadSceneTagData() // 场景地图图标 - g.loadSceneDetail() // 场景详情LUA配置数据 - g.loadWorldAreaData() // 世界区域 - g.loadGatherData() // 采集物 - g.loadFetterData() // 角色资料解锁 - g.loadItemData() // 统一道具 - g.loadAvatarLevelData() // 角色等级 - g.loadAvatarPromoteData() // 角色突破 - g.loadPlayerLevelData() // 玩家等级 - g.loadWeaponLevelData() // 武器等级 - g.loadWeaponPromoteData() // 武器突破 - g.loadRewardData() // 奖励 - g.loadAvatarCostumeData() // 角色时装 - g.loadAvatarFlycloakData() // 角色风之翼 + if config.GetConfig().Hk4e.LoadSceneLuaConfig { + g.loadSceneDetail() // 场景详情LUA配置数据 + } + g.loadWorldAreaData() // 世界区域 + g.loadGatherData() // 采集物 + g.loadFetterData() // 角色资料解锁 + g.loadItemData() // 统一道具 + g.loadAvatarLevelData() // 角色等级 + g.loadAvatarPromoteData() // 角色突破 + g.loadPlayerLevelData() // 玩家等级 + g.loadWeaponLevelData() // 武器等级 + g.loadWeaponPromoteData() // 武器突破 + g.loadRewardData() // 奖励 + g.loadAvatarCostumeData() // 角色时装 + g.loadAvatarFlycloakData() // 角色风之翼 } func (g *GameDataConfig) readCsvFileData(fileName string) []byte { diff --git a/gdconf/game_data_config_test.go b/gdconf/game_data_config_test.go index 29373508..2cb6966a 100644 --- a/gdconf/game_data_config_test.go +++ b/gdconf/game_data_config_test.go @@ -94,6 +94,9 @@ func TestGenGdCsv(t *testing.T) { func TestInitGameDataConfig(t *testing.T) { config.InitConfig("./bin/application.toml") logger.InitLogger("InitGameDataConfig") + defer func() { + logger.CloseLogger() + }() logger.Info("start load conf") InitGameDataConfig() logger.Info("load conf finish, conf: %v", CONF) @@ -132,6 +135,9 @@ func CheckJsonLoop(path string, errorJsonFileList *[]string, totalJsonFileCount func TestCheckJsonValid(t *testing.T) { config.InitConfig("./bin/application.toml") logger.InitLogger("CheckJsonValid") + defer func() { + logger.CloseLogger() + }() errorJsonFileList := make([]string, 0) totalJsonFileCount := 0 CheckJsonLoop("./game_data_config/json", &errorJsonFileList, &totalJsonFileCount) @@ -146,6 +152,9 @@ func TestCheckJsonValid(t *testing.T) { func TestSceneBlock(t *testing.T) { config.InitConfig("./bin/application.toml") logger.InitLogger("SceneBlock") + defer func() { + logger.CloseLogger() + }() InitGameDataConfig() scene, exist := CONF.SceneDetailMap[3] if !exist { diff --git a/gm/app/app.go b/gm/app/app.go index 3286bcf1..3e23507b 100644 --- a/gm/app/app.go +++ b/gm/app/app.go @@ -5,7 +5,6 @@ import ( "os" "os/signal" "syscall" - "time" "hk4e/common/config" "hk4e/common/rpc" @@ -18,6 +17,9 @@ func Run(ctx context.Context, configFile string) error { logger.InitLogger("gm") logger.Warn("gm start") + defer func() { + logger.CloseLogger() + }() // natsrpc client client, err := rpc.NewClient() @@ -38,7 +40,6 @@ func Run(ctx context.Context, configFile string) error { switch s { case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: logger.Warn("gm exit") - time.Sleep(time.Second) return nil case syscall.SIGHUP: default: diff --git a/gm/controller/controller.go b/gm/controller/controller.go index 146998e6..f63b057e 100644 --- a/gm/controller/controller.go +++ b/gm/controller/controller.go @@ -39,7 +39,7 @@ func (c *Controller) authorize() gin.HandlerFunc { } func (c *Controller) registerRouter() { - if config.CONF.Logger.Level == "DEBUG" { + if config.GetConfig().Logger.Level == "DEBUG" { gin.SetMode(gin.DebugMode) } else { gin.SetMode(gin.ReleaseMode) @@ -47,7 +47,7 @@ func (c *Controller) registerRouter() { engine := gin.Default() engine.Use(c.authorize()) engine.POST("/gm/cmd", c.gmCmd) - port := config.CONF.HttpPort + port := config.GetConfig().HttpPort addr := ":" + strconv.Itoa(int(port)) err := engine.Run(addr) if err != nil { diff --git a/gm/controller/gm_controller.go b/gm/controller/gm_controller.go index be72e811..bd138205 100644 --- a/gm/controller/gm_controller.go +++ b/gm/controller/gm_controller.go @@ -18,6 +18,7 @@ func (c *Controller) gmCmd(context *gin.Context) { gmCmdReq := new(GmCmdReq) err := context.ShouldBindJSON(gmCmdReq) if err != nil { + logger.Error("parse json error: %v", err) return } rep, err := c.gm.Cmd(context.Request.Context(), &api.CmdRequest{ diff --git a/gs/app/app.go b/gs/app/app.go index d343c7ad..a08d7af3 100644 --- a/gs/app/app.go +++ b/gs/app/app.go @@ -70,6 +70,9 @@ func Run(ctx context.Context, configFile string) error { logger.InitLogger("gs_" + APPID) logger.Warn("gs start, appid: %v, gsid: %v", APPID, GSID) + defer func() { + logger.CloseLogger() + }() gdconf.InitGameDataConfig() @@ -86,7 +89,7 @@ func Run(ctx context.Context, configFile string) error { defer gameManager.Close() // natsrpc server - conn, err := nats.Connect(config.CONF.MQ.NatsUrl) + conn, err := nats.Connect(config.GetConfig().MQ.NatsUrl) if err != nil { logger.Error("connect nats error: %v", err) return err @@ -109,7 +112,6 @@ func Run(ctx context.Context, configFile string) error { switch s { case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: logger.Warn("gs exit, appid: %v", APPID) - time.Sleep(time.Second) return nil case syscall.SIGHUP: default: diff --git a/gs/dao/dao.go b/gs/dao/dao.go index 48e962fe..7dbf4861 100644 --- a/gs/dao/dao.go +++ b/gs/dao/dao.go @@ -20,7 +20,7 @@ type Dao struct { func NewDao() (r *Dao, err error) { r = new(Dao) - clientOptions := options.Client().ApplyURI(config.CONF.Database.Url).SetMinPoolSize(1).SetMaxPoolSize(10) + clientOptions := options.Client().ApplyURI(config.GetConfig().Database.Url).SetMinPoolSize(1).SetMaxPoolSize(10) client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { logger.Error("mongo connect error: %v", err) @@ -34,8 +34,8 @@ func NewDao() (r *Dao, err error) { r.mongo = client r.db = client.Database("gs_hk4e") r.redis = redis.NewClient(&redis.Options{ - Addr: config.CONF.Redis.Addr, - Password: config.CONF.Redis.Password, + Addr: config.GetConfig().Redis.Addr, + Password: config.GetConfig().Redis.Password, DB: 0, PoolSize: 10, MinIdleConns: 1, diff --git a/gs/game/command_controller.go b/gs/game/command_controller.go index ab6fbb95..b7e0b3d5 100644 --- a/gs/game/command_controller.go +++ b/gs/game/command_controller.go @@ -1,10 +1,11 @@ package game import ( - "hk4e/gdconf" "strconv" "strings" + "hk4e/gdconf" + "hk4e/gs/model" ) diff --git a/gs/game/command_manager.go b/gs/game/command_manager.go index c45cb6a8..844c6464 100644 --- a/gs/game/command_manager.go +++ b/gs/game/command_manager.go @@ -31,6 +31,8 @@ type CommandMessage struct { Text string // 命令原始文本 Name string // 命令前缀 Args map[string]string // 命令参数 + FuncName string // 函数名 + Param []string // 函数参数列表 } // CommandManager 命令管理器 @@ -129,6 +131,12 @@ func (c *CommandManager) InputCommand(executor any, text string) { // HandleCommand 处理命令 // 主协程接收到命令消息后执行 func (c *CommandManager) HandleCommand(cmd *CommandMessage) { + if cmd.FuncName != "" { + logger.Info("run gm cmd, FuncName: %v, Param: %v", cmd.FuncName, cmd.Param) + // TODO 反射调用command_gm.go中的函数并反射解析传入参数类型 + return + } + executor := cmd.Executor // 分割出命令的每个参数 diff --git a/gs/game/game_manager.go b/gs/game/game_manager.go index 3c763b42..40f57b78 100644 --- a/gs/game/game_manager.go +++ b/gs/game/game_manager.go @@ -63,7 +63,7 @@ func NewGameManager(dao *dao.Dao, messageQueue *mq.MessageQueue, gsId uint32, gs r.dao = dao MESSAGE_QUEUE = messageQueue r.snowflake = alg.NewSnowflakeWorker(int64(gsId)) - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { r.clientCmdProtoMap = client_proto.NewClientCmdProtoMap() // 反射调用的方法在启动时测试是否正常防止中途panic r.GetClientProtoObjByName("PingReq") @@ -276,7 +276,6 @@ func (g *GameManager) Close() { }, }) } - time.Sleep(time.Second) } // SendMsgToGate 发送消息给客户端 指定网关 diff --git a/gs/game/player_fight_sync.go b/gs/game/player_fight_sync.go index 97bd3c94..ed907abb 100644 --- a/gs/game/player_fight_sync.go +++ b/gs/game/player_fight_sync.go @@ -112,7 +112,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p switch entry.ArgumentType { case proto.CombatTypeArgument_COMBAT_EVT_BEING_HIT: hitInfo := new(proto.EvtBeingHitInfo) - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { clientProtoObj := g.GetClientProtoObjByName("EvtBeingHitInfo") if clientProtoObj == nil { logger.Error("get client proto obj is nil") @@ -170,7 +170,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry) case proto.CombatTypeArgument_ENTITY_MOVE: entityMoveInfo := new(proto.EntityMoveInfo) - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { clientProtoObj := g.GetClientProtoObjByName("EntityMoveInfo") if clientProtoObj == nil { logger.Error("get client proto obj is nil") @@ -239,7 +239,7 @@ func (g *GameManager) CombatInvocationsNotify(player *model.Player, payloadMsg p player.CombatInvokeHandler.AddEntry(entry.ForwardType, entry) case proto.CombatTypeArgument_COMBAT_ANIMATOR_STATE_CHANGED: evtAnimatorStateChangedInfo := new(proto.EvtAnimatorStateChangedInfo) - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { clientProtoObj := g.GetClientProtoObjByName("EvtAnimatorStateChangedInfo") if clientProtoObj == nil { logger.Error("get client proto obj is nil") @@ -403,7 +403,7 @@ func (g *GameManager) ClientAbilityChangeNotify(player *model.Player, payloadMsg switch abilityInvokeEntry.ArgumentType { case proto.AbilityInvokeArgument_ABILITY_META_ADD_NEW_ABILITY: abilityMetaAddAbility := new(proto.AbilityMetaAddAbility) - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { clientProtoObj := g.GetClientProtoObjByName("AbilityMetaAddAbility") if clientProtoObj == nil { logger.Error("get client proto obj is nil") @@ -433,7 +433,7 @@ func (g *GameManager) ClientAbilityChangeNotify(player *model.Player, payloadMsg worldAvatar.SetAbilityList(abilityList) case proto.AbilityInvokeArgument_ABILITY_META_MODIFIER_CHANGE: abilityMetaModifierChange := new(proto.AbilityMetaModifierChange) - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { clientProtoObj := g.GetClientProtoObjByName("AbilityMetaModifierChange") if clientProtoObj == nil { logger.Error("get client proto obj is nil") diff --git a/gs/game/player_gacha.go b/gs/game/player_gacha.go index bdf9cf8c..3e303df6 100644 --- a/gs/game/player_gacha.go +++ b/gs/game/player_gacha.go @@ -23,7 +23,7 @@ type UserInfo struct { // 获取卡池信息 func (g *GameManager) GetGachaInfoReq(player *model.Player, payloadMsg pb.Message) { logger.Debug("user get gacha info, uid: %v", player.PlayerID) - serverAddr := config.CONF.Hk4e.GachaHistoryServer + serverAddr := config.GetConfig().Hk4e.GachaHistoryServer userInfo := &UserInfo{ UserId: player.PlayerID, RegisteredClaims: jwt.RegisteredClaims{ diff --git a/gs/game/player_stamina.go b/gs/game/player_stamina.go index a2799b21..4c93a4d7 100644 --- a/gs/game/player_stamina.go +++ b/gs/game/player_stamina.go @@ -23,7 +23,7 @@ func (g *GameManager) HandleAbilityStamina(player *model.Player, entry *proto.Ab case proto.AbilityInvokeArgument_ABILITY_MIXIN_COST_STAMINA: // 大剑重击 或 持续技能 耐力消耗 costStamina := new(proto.AbilityMixinCostStamina) - if config.CONF.Hk4e.ClientProtoProxyEnable { + if config.GetConfig().Hk4e.ClientProtoProxyEnable { clientProtoObj := g.GetClientProtoObjByName("AbilityMixinCostStamina") if clientProtoObj == nil { logger.Error("get client proto obj is nil") diff --git a/gs/service/gm.go b/gs/service/gm.go index 1d590f74..44beb69b 100644 --- a/gs/service/gm.go +++ b/gs/service/gm.go @@ -2,7 +2,6 @@ package service import ( "context" - "fmt" "hk4e/gs/api" "hk4e/gs/game" @@ -15,9 +14,12 @@ type GMService struct { } func (s *GMService) Cmd(ctx context.Context, req *api.CmdRequest) (*api.CmdReply, error) { - // TODO implement me - fmt.Println("Cmd", req.FuncName, req.Param) + commandTextInput := game.COMMAND_MANAGER.GetCommandTextInput() + commandTextInput <- &game.CommandMessage{ + FuncName: req.FuncName, + Param: req.Param, + } return &api.CmdReply{ - Message: "TODO", + Message: "OK", }, nil } diff --git a/node/app/app.go b/node/app/app.go index 3f7fc8c0..5324dc76 100644 --- a/node/app/app.go +++ b/node/app/app.go @@ -6,7 +6,6 @@ import ( "os" "os/signal" "syscall" - "time" "hk4e/common/config" "hk4e/node/service" @@ -20,9 +19,12 @@ func Run(ctx context.Context, configFile string) error { logger.InitLogger("node") logger.Warn("node start") + defer func() { + logger.CloseLogger() + }() // natsrpc server - conn, err := nats.Connect(config.CONF.MQ.NatsUrl) + conn, err := nats.Connect(config.GetConfig().MQ.NatsUrl) if err != nil { logger.Error("connect nats error: %v", err) return err @@ -45,7 +47,6 @@ func Run(ctx context.Context, configFile string) error { switch s { case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: logger.Warn("node exit") - time.Sleep(time.Second) return nil case syscall.SIGHUP: default: diff --git a/node/service/discovery.go b/node/service/discovery.go index 5f8ec0b0..d6451f15 100644 --- a/node/service/discovery.go +++ b/node/service/discovery.go @@ -6,7 +6,6 @@ import ( "sort" "strings" "sync" - "sync/atomic" "time" "hk4e/common/region" @@ -53,8 +52,7 @@ type ServerInstance struct { type DiscoveryService struct { regionEc2b *random.Ec2b // 全局区服密钥信息 serverInstanceMap map[string]*sync.Map // 全部服务器实例集合 key:服务器类型 value:服务器实例集合 -> key:appid value:服务器实例 - serverAppIdMap map[string]bool // 服务器appid集合 key:appid value:是否存在 - gsIdCounter uint32 // GSID计数器 + serverAppIdMap *sync.Map // 服务器appid集合 key:appid value:是否存在 } func NewDiscoveryService() *DiscoveryService { @@ -62,12 +60,11 @@ func NewDiscoveryService() *DiscoveryService { r.regionEc2b = region.NewRegionEc2b() logger.Info("region ec2b create ok, seed: %v", r.regionEc2b.Seed()) r.serverInstanceMap = make(map[string]*sync.Map) - r.serverInstanceMap[api.GATE] = &sync.Map{} - r.serverInstanceMap[api.GS] = &sync.Map{} - r.serverInstanceMap[api.FIGHT] = &sync.Map{} - r.serverInstanceMap[api.PATHFINDING] = &sync.Map{} - r.serverAppIdMap = make(map[string]bool) - r.gsIdCounter = 0 + r.serverInstanceMap[api.GATE] = new(sync.Map) + r.serverInstanceMap[api.GS] = new(sync.Map) + r.serverInstanceMap[api.FIGHT] = new(sync.Map) + r.serverInstanceMap[api.PATHFINDING] = new(sync.Map) + r.serverAppIdMap = new(sync.Map) go r.removeDeadServer() return r } @@ -82,9 +79,9 @@ func (s *DiscoveryService) RegisterServer(ctx context.Context, req *api.Register var appId string for { appId = strings.ToLower(random.GetRandomStr(8)) - _, exist := s.serverAppIdMap[appId] + _, exist := s.serverAppIdMap.Load(appId) if !exist { - s.serverAppIdMap[appId] = true + s.serverAppIdMap.Store(appId, true) break } } @@ -108,12 +105,29 @@ func (s *DiscoveryService) RegisterServer(ctx context.Context, req *api.Register AppId: appId, } if req.ServerType == api.GS { - gsId := atomic.AddUint32(&s.gsIdCounter, 1) - if gsId > MaxGsId { - return nil, errors.New("above max gs count") + gsIdUseList := make([]bool, MaxGsId+1) + gsIdUseList[0] = true + instMap.Range(func(key, value any) bool { + serverInstance := value.(*ServerInstance) + if serverInstance.gsId > MaxGsId { + logger.Error("invalid gs id inst: %v", serverInstance) + return true + } + gsIdUseList[serverInstance.gsId] = true + return true + }) + newGsId := uint32(0) + for gsId, use := range gsIdUseList { + if !use { + newGsId = uint32(gsId) + break + } } - inst.gsId = gsId - rsp.GsId = gsId + if newGsId == 0 { + return nil, errors.New("no gs id can use") + } + inst.gsId = newGsId + rsp.GsId = newGsId } return rsp, nil } @@ -250,12 +264,12 @@ func (s *DiscoveryService) GetMainGameServerAppId(ctx context.Context, req *api. return nil, errors.New("no game server found") } appid := "" - minGsId := uint32(MaxGsId) + mainGsId := uint32(1) instMap.Range(func(key, value any) bool { serverInstance := value.(*ServerInstance) - if serverInstance.gsId < minGsId { - minGsId = serverInstance.gsId + if serverInstance.gsId == mainGsId { appid = serverInstance.appId + return false } return true }) diff --git a/pathfinding/app/app.go b/pathfinding/app/app.go index a462c629..7088e054 100644 --- a/pathfinding/app/app.go +++ b/pathfinding/app/app.go @@ -57,6 +57,9 @@ func Run(ctx context.Context, configFile string) error { logger.InitLogger("pathfinding_" + APPID) logger.Warn("pathfinding start, appid: %v", APPID) + defer func() { + logger.CloseLogger() + }() messageQueue := mq.NewMessageQueue(api.PATHFINDING, APPID, client) defer messageQueue.Close() @@ -74,7 +77,6 @@ func Run(ctx context.Context, configFile string) error { switch s { case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: logger.Warn("pathfinding exit, appid: %v", APPID) - time.Sleep(time.Second) return nil case syscall.SIGHUP: default: diff --git a/pkg/alg/aoi_test.go b/pkg/alg/aoi_test.go index bc8dbf69..f7d18851 100644 --- a/pkg/alg/aoi_test.go +++ b/pkg/alg/aoi_test.go @@ -11,6 +11,9 @@ func TestAoiManagerGetSurrGridListByGid(t *testing.T) { filePath := "./application.toml" config.InitConfig(filePath) logger.InitLogger("") + defer func() { + logger.CloseLogger() + }() aoiManager := NewAoiManager() aoiManager.SetAoiRange( -150, 150, diff --git a/pkg/httpclient/http_client.go b/pkg/httpclient/http_client.go index 16f6f6a8..aee6cde7 100644 --- a/pkg/httpclient/http_client.go +++ b/pkg/httpclient/http_client.go @@ -26,13 +26,14 @@ func init() { } } -func GetJson[T any](url string, authToken string) (*T, error) { +func GetJson[T any](url string, authToken ...string) (*T, error) { + logger.Debug("http get req url: %v", url) req, err := http.NewRequest("GET", url, nil) if err != nil { return nil, err } - if authToken != "" { - req.Header.Set("Authorization", "Bearer"+" "+authToken) + if len(authToken) != 0 { + req.Header.Set("Authorization", "Bearer"+" "+authToken[0]) } rsp, err := httpClient.Do(req) if err != nil { @@ -52,13 +53,14 @@ func GetJson[T any](url string, authToken string) (*T, error) { return responseData, nil } -func GetRaw(url string, authToken string) (string, error) { +func GetRaw(url string, authToken ...string) (string, error) { + logger.Debug("http get req url: %v", url) req, err := http.NewRequest("GET", url, nil) if err != nil { return "", err } - if authToken != "" { - req.Header.Set("Authorization", "Bearer"+" "+authToken) + if len(authToken) != 0 { + req.Header.Set("Authorization", "Bearer"+" "+authToken[0]) } rsp, err := httpClient.Do(req) if err != nil { @@ -69,21 +71,23 @@ func GetRaw(url string, authToken string) (string, error) { if err != nil { return "", err } + logger.Debug("http get rsp data: %v", string(data)) return string(data), nil } -func PostJson[T any](url string, body any, authToken string) (*T, error) { +func PostJson[T any](url string, body any, authToken ...string) (*T, error) { reqData, err := json.Marshal(body) if err != nil { return nil, err } + logger.Debug("http post req url: %v", url) req, err := http.NewRequest("POST", url, bytes.NewBuffer(reqData)) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/json") - if authToken != "" { - req.Header.Set("Authorization", "Bearer"+" "+authToken) + if len(authToken) != 0 { + req.Header.Set("Authorization", "Bearer"+" "+authToken[0]) } rsp, err := httpClient.Do(req) if err != nil { @@ -103,14 +107,15 @@ func PostJson[T any](url string, body any, authToken string) (*T, error) { return responseData, nil } -func PostRaw(url string, body string, authToken string) (string, error) { +func PostRaw(url string, body string, authToken ...string) (string, error) { + logger.Debug("http post req url: %v", url) req, err := http.NewRequest("POST", url, strings.NewReader(body)) if err != nil { return "", err } req.Header.Set("Content-Type", "application/json") - if authToken != "" { - req.Header.Set("Authorization", "Bearer"+" "+authToken) + if len(authToken) != 0 { + req.Header.Set("Authorization", "Bearer"+" "+authToken[0]) } rsp, err := httpClient.Do(req) if err != nil { @@ -121,5 +126,6 @@ func PostRaw(url string, body string, authToken string) (string, error) { if err != nil { return "", err } + logger.Debug("http post rsp data: %v", string(rspData)) return string(rspData), nil } diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index 6d045602..20f3938b 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -66,15 +66,25 @@ func InitLogger(appName string) { log.SetFlags(0) LOG = new(Logger) LOG.AppName = appName - LOG.Level = LOG.getLevelInt(config.CONF.Logger.Level) - LOG.Mode = LOG.getModeInt(config.CONF.Logger.Mode) - LOG.Track = config.CONF.Logger.Track - LOG.MaxSize = config.CONF.Logger.MaxSize + LOG.Level = LOG.getLevelInt(config.GetConfig().Logger.Level) + LOG.Mode = LOG.getModeInt(config.GetConfig().Logger.Mode) + LOG.Track = config.GetConfig().Logger.Track + LOG.MaxSize = config.GetConfig().Logger.MaxSize LOG.LogInfoChan = make(chan *LogInfo, 1000) LOG.File = nil go LOG.doLog() } +func CloseLogger() { + // 等待所有日志打印完毕 + for { + if len(LOG.LogInfoChan) == 0 { + break + } + time.Sleep(time.Millisecond * 100) + } +} + func (l *Logger) doLog() { for { logInfo := <-l.LogInfoChan diff --git a/robot/cmd/main.go b/robot/cmd/main.go index 767fcf64..8a9a68e9 100644 --- a/robot/cmd/main.go +++ b/robot/cmd/main.go @@ -18,8 +18,11 @@ import ( func main() { config.InitConfig("application.toml") logger.InitLogger("robot") + defer func() { + logger.CloseLogger() + }() - config.CONF.Hk4e.ClientProtoProxyEnable = false + config.GetConfig().Hk4e.ClientProtoProxyEnable = false // // DPDK模式需开启 // err := engine.InitEngine("00:0C:29:3E:3E:DF", "192.168.199.199", "255.255.255.0", "192.168.199.1") @@ -39,11 +42,8 @@ func main() { s := <-c switch s { case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: - // // DPDK模式需开启 // engine.StopEngine() - - time.Sleep(time.Second) return case syscall.SIGHUP: default: @@ -85,7 +85,7 @@ func runRobot(name string) { pingSeq++ // 通过这个接口发消息给服务器 session.SendMsg(cmd.PingReq, &proto.PingReq{ - ClientTime: uint32(time.Now().UnixMilli()), + ClientTime: uint32(time.Now().Unix()), Seq: pingSeq, }) case protoMsg := <-session.RecvChan: diff --git a/robot/login/http_login.go b/robot/login/http_login.go index f58c9205..abf1a85d 100644 --- a/robot/login/http_login.go +++ b/robot/login/http_login.go @@ -26,7 +26,7 @@ type DispatchInfo struct { func GetDispatchInfo(regionListUrl string, curRegionUrl string, regionListParam string, curRegionParam string, keyId string) (*DispatchInfo, error) { logger.Info("http get url: %v", regionListUrl+"/query_region_list"+regionListParam) - regionListBase64, err := httpclient.GetRaw(regionListUrl+"/query_region_list"+regionListParam, "") + regionListBase64, err := httpclient.GetRaw(regionListUrl + "/query_region_list" + regionListParam) if err != nil { return nil, err } @@ -49,7 +49,7 @@ func GetDispatchInfo(regionListUrl string, curRegionUrl string, regionListParam curRegionUrl = selectRegion.DispatchUrl } logger.Info("http get url: %v", curRegionUrl+curRegionParam) - regionCurrJson, err := httpclient.GetRaw(curRegionUrl+curRegionParam, "") + regionCurrJson, err := httpclient.GetRaw(curRegionUrl + curRegionParam) if err != nil { return nil, err } @@ -122,7 +122,7 @@ func AccountLogin(url string, account string, password string) (*AccountInfo, er IsCrypto: true, } logger.Info("http post url: %v", url+"/hk4e_global/mdk/shield/api/login") - loginResult, err := httpclient.PostJson[api.LoginResult](url+"/hk4e_global/mdk/shield/api/login", loginAccountRequestJson, "") + loginResult, err := httpclient.PostJson[api.LoginResult](url+"/hk4e_global/mdk/shield/api/login", loginAccountRequestJson) if err != nil { return nil, err } @@ -148,7 +148,7 @@ func AccountLogin(url string, account string, password string) (*AccountInfo, er Data: string(loginTokenDataJson), } logger.Info("http post url: %v", url+"/hk4e_global/combo/granter/login/v2/login") - comboTokenRsp, err := httpclient.PostJson[api.ComboTokenRsp](url+"/hk4e_global/combo/granter/login/v2/login", comboTokenReq, "") + comboTokenRsp, err := httpclient.PostJson[api.ComboTokenRsp](url+"/hk4e_global/combo/granter/login/v2/login", comboTokenReq) if err != nil { return nil, err }