2025-06-23 10:15:22 +08:00
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"blazing/common/core/info"
|
|
|
|
|
|
"blazing/common/data/entity"
|
|
|
|
|
|
"blazing/common/socket"
|
|
|
|
|
|
"blazing/common/socket/cmd"
|
|
|
|
|
|
"blazing/common/socket/handler"
|
2025-06-23 12:24:23 +08:00
|
|
|
|
"blazing/cool"
|
2025-06-23 10:15:22 +08:00
|
|
|
|
"blazing/logic/controller"
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"reflect"
|
|
|
|
|
|
"strconv"
|
|
|
|
|
|
"sync"
|
2025-06-23 12:24:23 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/gogf/gf/v2/os/gctx"
|
2025-06-23 10:15:22 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
|
maininfocodec = info.NewInfoCodec() //创建一个InfoCodec实例
|
|
|
|
|
|
maincontroller = controller.NewController() //注入service
|
|
|
|
|
|
mainplayer sync.Map //玩家数据
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func main() {
|
2025-06-23 12:24:23 +08:00
|
|
|
|
if cool.IsRedisMode {
|
|
|
|
|
|
go cool.ListenFunc(gctx.New())
|
|
|
|
|
|
}
|
2025-06-23 13:39:19 +08:00
|
|
|
|
Start(cool.Config.PortBL) //注入service
|
2025-06-23 10:15:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
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)
|
|
|
|
|
|
}
|