Files
bl/logic/main.go
2025-06-23 13:39:19 +08:00

155 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"blazing/common/core/info"
"blazing/common/data/entity"
"blazing/common/socket"
"blazing/common/socket/cmd"
"blazing/common/socket/handler"
"blazing/cool"
"blazing/logic/controller"
"fmt"
"reflect"
"strconv"
"sync"
"github.com/gogf/gf/v2/os/gctx"
)
var (
maininfocodec = info.NewInfoCodec() //创建一个InfoCodec实例
maincontroller = controller.NewController() //注入service
mainplayer sync.Map //玩家数据
)
func main() {
if cool.IsRedisMode {
go cool.ListenFunc(gctx.New())
}
Start(cool.Config.PortBL) //注入service
}
func Start(port string) {
head := handler.NewTomeeHandler()
head.Callback = recv
socket.NewServer(socket.WithPort(port), socket.WithSocketHandler(head)).Start()
}
func recv(data handler.TomeeHeader) {
// 处理接收到的TomeeHeader数据
// fmt.Println("收到数据:", data)
processWithReflection(data)
}
// 遍历结构体方法并执行RECV_cmd
func processWithReflection(pp handler.TomeeHeader) {
// 获取对象的反射值和类型
value := reflect.ValueOf(maincontroller)
// 如果传入的是指针,获取其指向的值
if value.Kind() == reflect.Ptr {
if value.IsNil() {
fmt.Println("错误: 传入的是nil指针")
return
}
value = value.Elem()
}
// 获取类型
typ := value.Type()
// 遍历所有方法
fmt.Printf("检查结构体 %s 的方法...\n", typ.Name(), typ.NumMethod())
for i := 0; i < typ.NumMethod(); i++ {
method := typ.Method(i)
if method.Type.NumIn() == 3 { //&& // TODO 接收者 + 2个参数 一个是类型,一个是player
//method.Type.In(1) == reflect.TypeOf([]byte{}
// 获取方法值
methodValue := value.MethodByName(method.Name)
// 准备参数
cmd1 := method.Name[len("Recv_"):len(method.Name)]
cmdint, _ := strconv.Atoi(cmd1)
if cmdint == int(pp.CMDID) {
if !cmd.Isexist(cmd.CommandID, cmd.EnumCommandID(pp.CMDID)) {
fmt.Println("ID方法存在cmd未注册", pp.CMDID, cmd.CommandID)
}
// fmt.Println(" 找到匹配的RECV_cmd方法准备调用...", pp.Cmdid, Command.ID)
data := pp.Data
// trmp := getincodec(cmd.EnumCommandID(pp.CMDID), data)
//fmt.Println(trmp)
// serializer := serialize.NewFixedVarDeserializer(nil)
// tt1 := serializer.Deserialize(data, trmp)
// g.Dump(trmp)
// g.Dump(tt1)
// 调用方法
methodValue.Call([]reflect.Value{
// reflect.ValueOf(cmdint),
reflect.ValueOf(data),
reflect.ValueOf(entity.Player{}),
})
}
//return
}
//}
}
}
func getincodec(cmdid cmd.EnumCommandID, data []byte) reflect.Value {
// 获取对象的反射值和类型
value := reflect.ValueOf(maininfocodec)
// 如果传入的是指针,获取其指向的值
if value.Kind() == reflect.Ptr {
if value.IsNil() {
fmt.Println("错误: 传入的是nil指针")
return reflect.ValueOf(nil)
}
value = value.Elem()
}
// 获取类型
typ := value.Type()
// 遍历所有方法
fmt.Printf("检查结构体 %s 的方法...\n", typ.Name(), typ.NumMethod())
for i := 0; i < typ.NumMethod(); i++ {
method := typ.Method(i)
if method.Type.NumIn() == 2 && // 接收者 + 2个参数
method.Type.In(1) == reflect.TypeOf([]byte{}) {
// 获取方法值
methodValue := value.MethodByName(method.Name)
// 准备参数
cmd1 := method.Name[len("In_"):len(method.Name)]
cmdint, _ := strconv.Atoi(cmd1)
if cmdint == int(cmdid) {
if !cmd.Isexist(cmd.CommandID, cmd.EnumCommandID(cmdid)) {
fmt.Println("ID方法存在cmd未注册", cmdid, cmd.CommandID)
}
//data := pp.Data
// 调用方法
tt := methodValue.Call([]reflect.Value{
// reflect.ValueOf(cmdint),
reflect.ValueOf(data),
})
return tt[0]
}
//return
}
//}
}
return reflect.ValueOf(nil)
}