优化代码

This commit is contained in:
flswld
2023-02-18 22:09:59 +08:00
parent 21fb9d400f
commit e580baeb46
37 changed files with 198 additions and 118 deletions

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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:

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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

View File

@@ -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:

View File

@@ -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()
}
}

View File

@@ -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:

View File

@@ -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)

View File

@@ -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)

View File

@@ -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()

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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:

View File

@@ -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 {

View File

@@ -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{

View File

@@ -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:

View File

@@ -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,

View File

@@ -1,10 +1,11 @@
package game
import (
"hk4e/gdconf"
"strconv"
"strings"
"hk4e/gdconf"
"hk4e/gs/model"
)

View File

@@ -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
// 分割出命令的每个参数

View File

@@ -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 发送消息给客户端 指定网关

View File

@@ -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")

View File

@@ -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{

View File

@@ -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")

View File

@@ -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
}

View File

@@ -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:

View File

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

View File

@@ -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:

View File

@@ -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,

View File

@@ -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
}

View File

@@ -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

View File

@@ -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:

View File

@@ -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
}