From 06b77d598e054245606d3efa4a148c50cd0365bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <12574910+72wo@users.noreply.github.com> Date: Sat, 14 Feb 2026 03:05:51 +0800 Subject: [PATCH] 1 --- common/cool/global.go | 6 +-- common/socket/ServerEvent.go | 6 +-- common/socket/ServerOption.go | 6 +-- logic/controller/fight_boss野怪和地图怪.go | 7 ++- logic/controller/fight_擂台.go | 16 +++++- logic/controller/pet_ev.go | 2 +- logic/controller/pet_收集计划.go | 60 +++++++++++++++++----- logic/controller/user_task.go | 6 +-- logic/service/pet/BargeList.go | 2 +- logic/service/player/boss.go | 6 +-- modules/config/service/item.go | 1 + modules/config/service/pet.go | 5 ++ modules/player/controller/admin/title.go | 9 ++-- modules/player/model/task.go | 21 ++------ modules/player/service/task.go | 8 ++- 15 files changed, 102 insertions(+), 59 deletions(-) diff --git a/common/cool/global.go b/common/cool/global.go index 7c386a131..1fc6682f0 100644 --- a/common/cool/global.go +++ b/common/cool/global.go @@ -29,9 +29,9 @@ type Cmd struct { var CmdCache = make(map[uint32]Cmd, 0) var ( - Logger = glog.New() - Cron = cronex.New() //时间轮 - + Logger = glog.New() + Cron = cronex.New() //时间轮 + Connected int64 ) var Filter *sensitive.Manager var DefaultGenerator = utils.NewGen(time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), uint8(Config.GameOnlineID)) diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index a55a85736..80d8dd7f0 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -81,7 +81,7 @@ func (s *Server) OnClose(c gnet.Conn, err error) (action gnet.Action) { // // go s.tempBlockIP(remoteIP, 5*time.Minute) // } //fmt.Println(err, c.RemoteAddr().String(), "断开连接") - atomic.AddInt64(&s.connected, -1) + atomic.AddInt64(&cool.Connected, -1) //logging.Infof("conn[%v] disconnected", c.RemoteAddr().String()) v, _ := c.Context().(*player.ClientData) @@ -97,7 +97,7 @@ func (s *Server) OnClose(c gnet.Conn, err error) (action gnet.Action) { return } func (s *Server) OnTick() (delay time.Duration, action gnet.Action) { - g.Log().Async().Info(context.Background(), gtime.Now().ISO8601(), "服务器ID", cool.Config.ServerInfo.OnlineID, "链接数", atomic.LoadInt64(&s.connected)) + g.Log().Async().Info(context.Background(), gtime.Now().ISO8601(), "服务器ID", cool.Config.ServerInfo.OnlineID, "链接数", atomic.LoadInt64(&cool.Connected)) // if s.quit && atomic.LoadInt64(&s.connected) == 0 { // //执行正常退出逻辑 // os.Exit(0) @@ -120,7 +120,7 @@ func (s *Server) OnOpen(conn gnet.Conn) (out []byte, action gnet.Action) { conn.SetContext(player.NewClientData(conn)) //注入data } - atomic.AddInt64(&s.connected, 1) + atomic.AddInt64(&cool.Connected, 1) return nil, gnet.None } diff --git a/common/socket/ServerOption.go b/common/socket/ServerOption.go index b036005d5..134cfff6d 100644 --- a/common/socket/ServerOption.go +++ b/common/socket/ServerOption.go @@ -13,9 +13,9 @@ type Handler interface { } type Server struct { gnet.BuiltinEventEngine - eng gnet.Engine - addr string - connected int64 + eng gnet.Engine + addr string + network string multicore bool bufferSize int diff --git a/logic/controller/fight_boss野怪和地图怪.go b/logic/controller/fight_boss野怪和地图怪.go index 2686e6265..00a45af0a 100644 --- a/logic/controller/fight_boss野怪和地图怪.go +++ b/logic/controller/fight_boss野怪和地图怪.go @@ -81,8 +81,13 @@ func (Controller) PlayerFightBoss(data *fight.ChallengeBossInboundInfo, p *playe for i, bm := range bc.BossMon { + dv := 24 + if bc.BossCatchable == 1 { + dv = -1 + } + monster = model.GenPetInfo( - gconv.Int(processMonID(bm.MonID)), 24, //24个体 + gconv.Int(processMonID(bm.MonID)), dv, //24个体 -1, 0, //野怪没特性 diff --git a/logic/controller/fight_擂台.go b/logic/controller/fight_擂台.go index 2c0ae9064..bc691c0ed 100644 --- a/logic/controller/fight_擂台.go +++ b/logic/controller/fight_擂台.go @@ -2,10 +2,12 @@ package controller import ( "blazing/common/socket/errorcode" + "blazing/cool" "sync/atomic" "blazing/logic/service/fight" "blazing/logic/service/fight/info" + "blazing/logic/service/pet" "blazing/logic/service/player" "blazing/logic/service/space" ) @@ -76,12 +78,22 @@ func (h Controller) ArenaFightOwner(data *fight.ARENA_FIGHT_OWENR, c *player.Pla } if foi.Reason == 0 { //正常获胜 - + addev := int64(int(1) * int(cool.Connected) * int(c.GetSpace().Owner.HostWins)) if foi.WinnerId == c.GetInfo().UserID { c.Info.MaxArenaWins += 1 + c.Info.EVPool += addev + + c.SendPackCmd(50001, &pet.S2C_50001{ + UseEV: int32(addev), + }) } else { c.GetSpace().Owner.ARENA_Player.GetInfo().MaxArenaWins += 1 - //这里给经验 + + c.GetSpace().Owner.ARENA_Player.GetInfo().EVPool += addev + + c.GetSpace().Owner.ARENA_Player.SendPackCmd(50001, &pet.S2C_50001{ + UseEV: int32(addev), + }) } } diff --git a/logic/controller/pet_ev.go b/logic/controller/pet_ev.go index 15a6ad355..2d8c91576 100644 --- a/logic/controller/pet_ev.go +++ b/logic/controller/pet_ev.go @@ -46,6 +46,6 @@ func (h Controller) PetEVDiy(data *pet.PetEV, c *player.Player) (result *pet.S2C c.Info.EVPool -= int64(usedEV) result = &pet.S2C_50001{} - result.UseEV = usedEV + result.UseEV = -int32(usedEV) return result, 0 } diff --git a/logic/controller/pet_收集计划.go b/logic/controller/pet_收集计划.go index 340689dd0..a81850262 100644 --- a/logic/controller/pet_收集计划.go +++ b/logic/controller/pet_收集计划.go @@ -6,6 +6,7 @@ import ( "blazing/logic/service/player" "blazing/modules/player/model" + "github.com/pointernil/bitset32" "github.com/samber/lo" ) @@ -15,10 +16,15 @@ func (h Controller) IsCollect( ID: data.Type, } - res := c.Info.GetTask(1335 + int(data.Type)) //第一期 - if res == model.Completed { - result.IsCom = 1 - } + c.Service.Task.Exec(uint32(1335), func(te *model.Task) bool { + + r := bitset32.From(te.Data) + // 分支未完成时,标记完成并发放奖励 + if r.Test(uint(data.Type)) { + result.IsCom = 1 + } + return false + }) return result, 0 @@ -26,18 +32,30 @@ func (h Controller) IsCollect( // 定义 Type 与合法 ID 集合的映射表,集中管理所有规则 var validTypeIDMap = map[int][]uint32{ - 1: {1, 4, 7}, // Type1:合法ID为1、4、7 - 2: {71}, // Type2:合法ID为71 - 3: {275}, // Type3:合法ID为275 - 4: {669}, // Type4:合法ID为669(注:你之前提到的是670,确认是否笔误) - 301: {1, 4, 7}, //精灵王计划 + 1: {1, 4, 7}, // Type1:合法ID为1、4、7 + 2: {71}, // Type2:合法ID为71 + 3: {275}, // Type3:合法ID为275 + 4: {669}, // Type4:合法ID为669(注:你之前提到的是670,确认是否笔误) + 301: {1, 4, 7}, //精灵王计划 + 100: {856, 857, 858}, //测试 } func (h Controller) Collect( data *pet.C2S_PET_COLLECT, c *player.Player) (result *pet.S2C_PET_COLLECT, err errorcode.ErrorCode) { //这个时候player应该是空的 result = &pet.S2C_PET_COLLECT{ID: data.ID} res := c.Info.GetTask(1335 + int(data.Type)) //第一期 - if res != model.Unaccepted { + _, ok := lo.Find([]uint32{1, 2, 3, 4, 301}, func(item uint32) bool { + return data.Type == item + }) + if res == model.Completed && ok { //这块是为了兼容旧版本 + c.Service.Task.Exec(uint32(1335), func(te *model.Task) bool { + + r := bitset32.From(te.Data) + + r.Set(uint(data.Type)) + te.Data = r.Bytes() + return true + }) return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError) } @@ -51,11 +69,25 @@ func (h Controller) Collect( if !lo.Contains(validIDs, data.ID) { return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError) } + c.Service.Task.Exec(uint32(1335), func(te *model.Task) bool { - c.Info.SetTask(1335+int(data.Type), model.Completed) - r := model.GenPetInfo(int(data.ID), -1, -1, 0, 1, nil, 0) - c.Service.Pet.PetAdd(r) - result.CatchTime = r.CatchTime + r := bitset32.From(te.Data) + // 分支未完成时,标记完成并发放奖励 + if !r.Test(uint(data.Type)) { + r.Set(uint(data.Type)) + te.Data = r.Bytes() + r := model.GenPetInfo(int(data.ID), -1, -1, 0, 1, nil, 0) + c.Service.Pet.PetAdd(r) + result.CatchTime = r.CatchTime + + return true + } + return false + }) + + if result.CatchTime == 0 { + return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrAwardAlreadyClaimed) + } return result, 0 diff --git a/logic/controller/user_task.go b/logic/controller/user_task.go index c20bf352e..941e81728 100644 --- a/logic/controller/user_task.go +++ b/logic/controller/user_task.go @@ -28,7 +28,7 @@ func (h Controller) AcceptTask(data *task.AcceptTaskInboundInfo, c *player.Playe } c.Info.SetTask(int(data.TaskId), model.Accepted) - c.Service.Task.Exec(uint32(data.TaskId), func(t *model.TaskEX) bool { + c.Service.Task.Exec(uint32(data.TaskId), func(t *model.Task) bool { t.Data = []uint32{} return true @@ -48,7 +48,7 @@ func (h Controller) AddTaskBuf(data *task.AddTaskBufInboundInfo, c *player.Playe if c.Info.GetTask(int(data.TaskId)) != model.Accepted { return result, errorcode.ErrorCodes.ErrAwardAlreadyClaimed } - c.Service.Task.Exec(data.TaskId, func(taskEx *model.TaskEX) bool { + c.Service.Task.Exec(data.TaskId, func(taskEx *model.Task) bool { taskEx.Data = data.TaskList return true }) @@ -105,7 +105,7 @@ func (h Controller) GetTaskBuf(data *task.GetTaskBufInboundInfo, c *player.Playe result = &task.GetTaskBufOutboundInfo{ TaskId: data.TaskId, } - c.Service.Task.Exec(data.TaskId, func(te *model.TaskEX) bool { + c.Service.Task.Exec(data.TaskId, func(te *model.Task) bool { result.TaskList = te.Data return false diff --git a/logic/service/pet/BargeList.go b/logic/service/pet/BargeList.go index fbd1c52ee..6d1449e8e 100644 --- a/logic/service/pet/BargeList.go +++ b/logic/service/pet/BargeList.go @@ -30,7 +30,7 @@ type PetEV struct { EVs [6]uint32 `description:"属性" codec:"evs"` } type S2C_50001 struct { - UseEV uint32 //用掉的学习力 + UseEV int32 //用掉的学习力 } type S2C_9756 struct { UseEV uint32 //用掉的学习力 diff --git a/logic/service/player/boss.go b/logic/service/player/boss.go index c121a3dc6..58f90a6bb 100644 --- a/logic/service/player/boss.go +++ b/logic/service/player/boss.go @@ -56,11 +56,7 @@ func (p *Player) TawerCompletedTask(taskID int, ot int) { } // 处理指定分支(ot):仅奖励存在时才标记分支完成并发奖 - p.Service.Task.Exec(uint32(taskID), func(te *model.TaskEX) bool { - // 防御性检查:避免空指针 - if te == nil { - return false - } + p.Service.Task.Exec(uint32(taskID), func(te *model.Task) bool { // 核心检查:指定分支的奖励是否存在 branchGift := p.getTaskGift(taskID, ot) diff --git a/modules/config/service/item.go b/modules/config/service/item.go index b0056d5aa..31e994ac4 100644 --- a/modules/config/service/item.go +++ b/modules/config/service/item.go @@ -58,6 +58,7 @@ func NewItemService() *ItemService { Model: model.NewItemGift(), PageQueryOp: &cool.QueryOp{ KeyWordField: []string{"remark"}, + FieldEQ: []string{"is_egg"}, }, }, } diff --git a/modules/config/service/pet.go b/modules/config/service/pet.go index 4e9c5c05a..92f0e7022 100644 --- a/modules/config/service/pet.go +++ b/modules/config/service/pet.go @@ -13,6 +13,11 @@ func NewPetRewardService() *PetRewardService { return &PetRewardService{ &cool.Service{ Model: model.NewPetReward(), + + PageQueryOp: &cool.QueryOp{ + + FieldEQ: []string{"is_egg", "is_light"}, + }, }, } } diff --git a/modules/player/controller/admin/title.go b/modules/player/controller/admin/title.go index 493864b2c..f7da2093e 100644 --- a/modules/player/controller/admin/title.go +++ b/modules/player/controller/admin/title.go @@ -40,12 +40,15 @@ func (c *TitleController) Get(ctx context.Context, req *GetReq) (res *cool.BaseR alltitile := service.NewUserService(uint32(admin.UserId)).Title.Get() titles := dict.NewDictInfoService().GetData("achieve") for _, v := range alltitile { - ret = append(ret, TitleRes{ + tt := TitleRes{ ID: v, Name: titles[v].Name, - Desc: *titles[v].Remark, - }) + } + if titles[v].Remark != nil { + tt.Desc = *titles[v].Remark + } + ret = append(ret, tt) } res.Data = ret diff --git a/modules/player/model/task.go b/modules/player/model/task.go index b1988c30a..76ea83b9c 100644 --- a/modules/player/model/task.go +++ b/modules/player/model/task.go @@ -10,20 +10,12 @@ const TableNameTask = "player_task" // Task mapped from table type Task struct { Base - PlayerID uint64 `gorm:"not null;index:idx_task_by_player_id;comment:'所属玩家ID'" json:"player_id"` - TaskID uint32 `gorm:"not null;comment:'任务ID'" json:"task_id"` - Data string `gorm:"type:jsonb;not null;comment:'全部数据'" json:"data"` + PlayerID uint64 `gorm:"not null;index:idx_task_by_player_id;comment:'所属玩家ID'" json:"player_id"` + TaskID uint32 `gorm:"not null;comment:'任务ID'" json:"task_id"` + Data []uint32 `struc:"[20]byte" gorm:"type:jsonb;not null;default:'[]';comment:'全部数据'" json:"data"` } // TaskEX 单个任务的详细信息,包含任务步骤状态和整体状态 -type TaskEX struct { - Task - Data []uint32 `struc:"[20]byte" orm:"data" json:"data"` - //LastResetTime time.Time `gorm:"not null;comment:'上次重置时间(UTC)'" json:"last_reset_time"` //这里是每天重置 - // Status 任务整体状态:0-未接受,1-已接受,2-已完成未领取,3-已完成已领取 - // json标签指定JSON字段名,与业务状态说明保持一致 - //Status byte `json:"status"` -} // TableName PlayerInfo's table name func (*Task) TableName() string { @@ -35,13 +27,6 @@ func (*Task) GroupName() string { return "default" } -func (t *Task) GetData() string { - return t.Data -} -func (t *Task) SetData(t1 string) { - t.Data = t1 -} - // NewPlayerInfo create a new PlayerInfo func NewTask() *Task { return &Task{ diff --git a/modules/player/service/task.go b/modules/player/service/task.go index 0046074d9..d609f4d17 100644 --- a/modules/player/service/task.go +++ b/modules/player/service/task.go @@ -9,11 +9,15 @@ import ( ) // 获取任务信息 -func (s *TaskService) Exec(id uint32, t func(*model.TaskEX) bool) { - var gg model.TaskEX +func (s *TaskService) Exec(id uint32, t func(*model.Task) bool) { + var gg model.Task m1 := s.dbm(s.Model).Where("task_id", id) + m1.Scan(&gg) + if gg.Data == nil { + gg.Data = make([]uint32, 0) + } tre := t(&gg) if !tre { //不需要更新