From 3c5b9a4ce89bd3175978fa54d5c788bafcd2cfd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Wed, 7 Jan 2026 02:30:21 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(middleware):=20=E6=B7=BB=E5=8A=A0Web?= =?UTF-8?q?Socket=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=A4=84=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加了WebSocket服务端处理器,支持WebSocket连接的升级和处理, 包括授权验证功能的实现 fix(fight): 修复NPC战斗逻辑中的问题 移除了NPC回合结束时的调试输出,优化了NPC技能选择逻辑, 确保只选择可使用的技能,并添加了NPC动作执行 --- logic/service/fight/fightc.go | 2 +- logic/service/fight/input/fight.go | 17 +++-- logic/service/fight/loop.go | 2 +- modules/base/middleware/middleware.go | 39 +++++++++++ modules/base/middleware/server.go | 97 +++++++++++++++++++++++++++ modules/base/middleware/websocket.go | 73 ++++++++++---------- modules/config/model/server_list.go | 2 +- 7 files changed, 183 insertions(+), 49 deletions(-) create mode 100644 modules/base/middleware/server.go diff --git a/logic/service/fight/fightc.go b/logic/service/fight/fightc.go index a9aa6232e..9a61b9a70 100644 --- a/logic/service/fight/fightc.go +++ b/logic/service/fight/fightc.go @@ -377,7 +377,7 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction) //println("回合结束") if f.Info.Status == info.BattleMode.FIGHT_WITH_NPC { if f.Opp.CurrentPet.Info.Hp <= 0 { - //println("回合结束开始执行NPC动作") + f.Opp.GetAction() //panic("AI自动技能") } diff --git a/logic/service/fight/input/fight.go b/logic/service/fight/input/fight.go index 7997367ce..6035a0e69 100644 --- a/logic/service/fight/input/fight.go +++ b/logic/service/fight/input/fight.go @@ -191,7 +191,7 @@ func (our *Input) Damage(in *Input, sub *info.DamageZone) { } func (our *Input) GetAction() { - + println("开始执行NPC动作") next := our.Exec(func(t Effect) bool { return t.HookAction() @@ -259,17 +259,20 @@ func (our *Input) GetAction() { maxDamage := killableSkills[0].damage for _, ks := range killableSkills[1:] { if ks.damage.Cmp(maxDamage) > 0 { // 使用decimal的比较方法比较伤害值 - maxDamage = ks.damage - bestKillSkill = ks.SkillEntity + if ks.CanUse() { + maxDamage = ks.damage + bestKillSkill = ks.SkillEntity + } + } } our.FightC.UseSkill(our.Player, uint32(bestKillSkill.ID)) return } - // if len(allSkills) <= 0 { - // our.FightC.UseSkill(our.Player, 0) - // return - // } + if len(allSkills) <= 0 { + our.FightC.UseSkill(our.Player, 0) + return + } // 优化随机选择技能的逻辑,直接使用随机索引 randomIdx := grand.Intn(len(allSkills)) diff --git a/logic/service/fight/loop.go b/logic/service/fight/loop.go index 57707e739..5ab602cf5 100644 --- a/logic/service/fight/loop.go +++ b/logic/service/fight/loop.go @@ -144,7 +144,7 @@ func (f *FightC) collectPlayerActions(ourID, oppID uint32) map[uint32]action.Bat } if f.Info.Status == info.BattleMode.FIGHT_WITH_NPC && pid != 0 { f.Opp.GetAction() - println("开始执行NPC动作") + } selfinput := f.GetInputByAction(paction, false) if ret, ok := paction.(*action.ActiveSwitchAction); ok { diff --git a/modules/base/middleware/middleware.go b/modules/base/middleware/middleware.go index 414099bdd..8d1c54dad 100644 --- a/modules/base/middleware/middleware.go +++ b/modules/base/middleware/middleware.go @@ -84,4 +84,43 @@ func init() { go socket.ReadLoop() }) + g.Server().BindHandler("/server/*", func(r *ghttp.Request) { + + tt := new(ServerHandler) + + upgrader := gws.NewUpgrader(tt, &gws.ServerOption{ + + Authorize: func(rt *http.Request, session gws.SessionStorage) bool { + //r.s\\\ + // r.Get("t") + // admin := cool.GetAdmin(rt.Context()) + // if admin.UserId != 10001 { + // return false + // } + + // var name = r.URL.Query().Get("name") + // if name == "" { + // return false + // } + // t, _ := service.NewBaseSysUserService().Person(admin.UserID) + + //Loger.Debug(context.TODO(), t.Mimi) + // session.Store("name", t.Mimi) + //session.Store("key", r.Header.Get("Sec-WebSocket-Key")) + return true + }, + }) + + socket, err := upgrader.Upgrade(r.Response.Writer, r.Request) + if err != nil { + fmt.Println(err) + return + } + // ants.Submit(func() { + // socket.ReadLoop() + // }) + // ants.Submit(func() { socket.ReadLoop() }) + go socket.ReadLoop() + + }) } diff --git a/modules/base/middleware/server.go b/modules/base/middleware/server.go new file mode 100644 index 000000000..a678c417c --- /dev/null +++ b/modules/base/middleware/server.go @@ -0,0 +1,97 @@ +package middleware + +import ( + "context" + "encoding/json" + "net" + "time" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/glog" + "github.com/gogf/gf/v2/util/gconv" + "github.com/lxzan/gws" +) + +type ServerHandler struct { + gws.BuiltinEventHandler + port int + target net.Conn +} + +func (c *ServerHandler) OnOpen(socket *gws.Conn) { + // target, err := net.Dial("tcp", "127.0.0.1:"+gconv.String(c.port)) + + // if err != nil { + // glog.Debug(context.Background(), "连接失败") + // } + // c.target = target + // //errChan := make(chan error, 2) + // if c.target == nil { + // return + // } + // go func(conn net.Conn, socket *gws.Conn) { + // reader := bufio.NewReader(conn) + // LOOP: + // for { + + // // select { + // // default: + // packlen, err := reader.Peek(4) + + // if err != nil { + // socket.WriteClose(1000, nil) + // break LOOP + // } + + // length := int32(binary.BigEndian.Uint32(packlen)) + + // data := make([]byte, length) + // io.ReadFull(reader, data) + + // //pack_Ver := data[4] //因为包体已经解析,所以这里直接取0 + // // var pack = make([]byte, length) + + // socket.WriteMessage(gws.OpcodeBinary, data) + // //t.event.RecvServerHandler(pack) + // // client.OnReceiveBase(client, pack, length) + + // } + // }(c.target, socket) + // //err = <-errChan + // if err != io.EOF { + // log.Println("proxy error:", err) + + // } +} + +func (c *ServerHandler) OnPing(socket *gws.Conn, payload []byte) { + _ = socket.SetDeadline(time.Now().Add(2 * PingInterval)) + _ = socket.WritePong(nil) +} + +func (c *ServerHandler) OnPong(socket *gws.Conn, payload []byte) {} + +func (c *ServerHandler) OnMessage(socket *gws.Conn, gwsmessage *gws.Message) { + //socket.WriteMessage(gwsmessage.Opcode, gwsmessage.Bytes()) + + for i := 0; i < 4; i++ { + jsondata := g.Map{"type": 1, "message": "hel " + gconv.String(i)} + json, _ := json.Marshal(jsondata) + socket.WriteMessage(gwsmessage.Opcode, json) + } + jsondata := g.Map{"type": 0, "message": "hel"} + json, _ := json.Marshal(jsondata) + socket.WriteMessage(gwsmessage.Opcode, json) + //fmt.Println(gwsmessage.Bytes()) + +} + +func (c *ServerHandler) OnClose(socket *gws.Conn, err error) { + + glog.Debug(context.Background(), "断开连接") + if c.target != nil { + c.target.Close() + + } + +} diff --git a/modules/base/middleware/websocket.go b/modules/base/middleware/websocket.go index ad18d95e1..2672e6bdb 100644 --- a/modules/base/middleware/websocket.go +++ b/modules/base/middleware/websocket.go @@ -1,16 +1,11 @@ package middleware import ( - "bufio" "context" - "encoding/binary" - "io" - "log" "net" "time" "github.com/gogf/gf/v2/os/glog" - "github.com/gogf/gf/v2/util/gconv" "github.com/lxzan/gws" ) @@ -23,49 +18,49 @@ type Handler struct { } func (c *Handler) OnOpen(socket *gws.Conn) { - target, err := net.Dial("tcp", "127.0.0.1:"+gconv.String(c.port)) + // target, err := net.Dial("tcp", "127.0.0.1:"+gconv.String(c.port)) - if err != nil { - glog.Debug(context.Background(), "连接失败") - } - c.target = target - //errChan := make(chan error, 2) - if c.target == nil { - return - } - go func(conn net.Conn, socket *gws.Conn) { - reader := bufio.NewReader(conn) - LOOP: - for { + // if err != nil { + // glog.Debug(context.Background(), "连接失败") + // } + // c.target = target + // //errChan := make(chan error, 2) + // if c.target == nil { + // return + // } + // go func(conn net.Conn, socket *gws.Conn) { + // reader := bufio.NewReader(conn) + // LOOP: + // for { - // select { - // default: - packlen, err := reader.Peek(4) + // // select { + // // default: + // packlen, err := reader.Peek(4) - if err != nil { - socket.WriteClose(1000, nil) - break LOOP - } + // if err != nil { + // socket.WriteClose(1000, nil) + // break LOOP + // } - length := int32(binary.BigEndian.Uint32(packlen)) + // length := int32(binary.BigEndian.Uint32(packlen)) - data := make([]byte, length) - io.ReadFull(reader, data) + // data := make([]byte, length) + // io.ReadFull(reader, data) - //pack_Ver := data[4] //因为包体已经解析,所以这里直接取0 - // var pack = make([]byte, length) + // //pack_Ver := data[4] //因为包体已经解析,所以这里直接取0 + // // var pack = make([]byte, length) - socket.WriteMessage(gws.OpcodeBinary, data) - //t.event.RecvHandler(pack) - // client.OnReceiveBase(client, pack, length) + // socket.WriteMessage(gws.OpcodeBinary, data) + // //t.event.RecvHandler(pack) + // // client.OnReceiveBase(client, pack, length) - } - }(c.target, socket) - //err = <-errChan - if err != io.EOF { - log.Println("proxy error:", err) + // } + // }(c.target, socket) + // //err = <-errChan + // if err != io.EOF { + // log.Println("proxy error:", err) - } + // } } func (c *Handler) OnPing(socket *gws.Conn, payload []byte) { diff --git a/modules/config/model/server_list.go b/modules/config/model/server_list.go index 9b0b67a41..1763ea5fa 100644 --- a/modules/config/model/server_list.go +++ b/modules/config/model/server_list.go @@ -13,7 +13,7 @@ type ServerList struct { OnlineID uint16 `gorm:"column:online_id;comment:'在线ID';uniqueIndex" json:"online_id"` IP string `gorm:"type:string;comment:'服务器IP'" json:"ip"` Port uint16 `gorm:"comment:'端口号,通常是小整数'" json:"port"` - IsOpen bool `gorm:"default:true;not null;comment:'服务器是否开启,默认为开启状态'" json:"is_open"` + IsOpen uint8 `gorm:"default:0;not null;comment:'是否开启'" json:"is_open"` //登录地址 LoginAddr string `gorm:"type:string;comment:'登录地址'" json:"login_addr"` //账号