From c790b68d476a5aa461a393a1dc11c5f82a942a51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <12574910+72wo@users.noreply.github.com> Date: Tue, 10 Feb 2026 10:49:01 +0800 Subject: [PATCH] 1 --- common/socket/ServerEvent.go | 10 +++++++--- logic/controller/action_扭蛋.go | 8 +++++++- logic/service/egg/egg.go | 2 +- logic/service/player/pack.go | 29 ++++++++++++++++++++++++++++- modules/config/service/item.go | 2 +- 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index 843869ea7..45fcbbb29 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -249,9 +249,13 @@ func handle(c gnet.Conn) { func (s *Server) onevent(c gnet.Conn, data []byte) { if t, ok := c.Context().(*player.ClientData); ok { - s.workerPool.Submit(func() { //提交任务 - t.OnEvent(data) - }) + + if t.LF.Running() { + t.LF.Producer().Write(data) + } + // s.workerPool.Submit(func() { //提交任务 + // t.OnEvent(data) + // }) } } diff --git a/logic/controller/action_扭蛋.go b/logic/controller/action_扭蛋.go index 412558e7b..e1bd3716b 100644 --- a/logic/controller/action_扭蛋.go +++ b/logic/controller/action_扭蛋.go @@ -21,7 +21,13 @@ func (h Controller) EggGamePlay(data1 *egg.C2S_EGG_GAME_PLAY, c *player.Player) data1.EggNum = 10 } r := c.Service.Item.CheakItem(400501) - if r < int32(data1.EggNum) { + if data1.EggNum > 10 || data1.EggNum <= 0 { + + } + if r < 0 { + return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrGachaTicketsInsufficient) + } + if data1.EggNum > uint32(r) { return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrGachaTicketsInsufficient) } diff --git a/logic/service/egg/egg.go b/logic/service/egg/egg.go index 0fcf2f632..2e802e64e 100644 --- a/logic/service/egg/egg.go +++ b/logic/service/egg/egg.go @@ -9,7 +9,7 @@ import ( // 对应原 C# 的 C2S_EGG_GAME_PLAY type C2S_EGG_GAME_PLAY struct { Head common.TomeeHeader `cmd:"3201" struc:"skip"` - EggNum int32 `struc:"uint32"` // 抽蛋次数标识:1 = 1次 2 = 5次 3 = 10次 + EggNum uint32 `struc:"uint32"` // 抽蛋次数标识:1 = 1次 2 = 5次 3 = 10次 // 注:Go 中 uint 是平台相关类型(32/64位),游戏开发中推荐用 uint32 明确匹配 C# 的 uint } diff --git a/logic/service/player/pack.go b/logic/service/player/pack.go index 77b32c8b4..645ff167a 100644 --- a/logic/service/player/pack.go +++ b/logic/service/player/pack.go @@ -13,6 +13,7 @@ import ( "fmt" "reflect" + "github.com/bruceshao/lockfree" "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" "github.com/gogf/gf/v2/os/glog" @@ -136,6 +137,7 @@ type ClientData struct { ERROR_CONNUT int Wsmsg *WsCodec Conn gnet.Conn + LF *lockfree.Lockfree[[]byte] //SaveL sync.Once //保存锁 //SaveDone chan struct{} @@ -150,7 +152,15 @@ func NewClientData(c gnet.Conn) *ClientData { Conn: c, Wsmsg: &WsCodec{}, } - + cd.LF = lockfree.NewLockfree[[]byte]( + 8, + cd, + lockfree.NewConditionBlockStrategy(), + ) + // 启动Lockfree + if err := cd.LF.Start(); err != nil { + panic(err) + } return cd } @@ -208,6 +218,23 @@ func XORDecrypt(encryptedData []byte, keyStr string) []byte { return decrypted } func (h *ClientData) OnEvent(v []byte) { + defer func() { + if err := recover(); err != nil { // 恢复 panic,err 为 panic 错误值 + // 1. 打印错误信息 + if h.Player != nil { + if h.Player.Info != nil { + cool.Logger.Error(context.TODO(), "panic 错误:", h.Player.Info.UserID, err) + } else { + cool.Logger.Error(context.TODO(), "panic 错误:", err) + + } + + } else { + cool.Logger.Error(context.TODO(), "panic 错误:", err) + } + + } + }() t, ok := h.Conn.Context().(*ClientData) if !ok { diff --git a/modules/config/service/item.go b/modules/config/service/item.go index 4d4fdfabd..940e53a3f 100644 --- a/modules/config/service/item.go +++ b/modules/config/service/item.go @@ -34,7 +34,7 @@ func (s *ItemService) GetItemCount(id uint32) data.ItemInfo { } return res } -func (s *ItemService) GetEgg(count int32) []data.ItemInfo { +func (s *ItemService) GetEgg(count uint32) []data.ItemInfo { var item []model.ItemGift cool.DBM(s.Model).Where("is_egg", 1).Where("is_enabled", 1).Cache(gdb.CacheOption{ // Duration: time.Hour,