feat(cache): 添加复合键缓存操作支持

添加了基于 uint32+string 组合键的缓存操作方法,包括
GetByCompoundKey、SetByCompoundKey、DelByCompoundKey 和
ContainsByCompoundKey 方法,用于处理用户ID和会话ID的组合缓存场景

fix(vscode): 添加 cSpell 配置支持 struc 词汇

refactor(session): 移除过时的会话管理方法

移除了基于单一字符串键的会话管理方法,因为已迁移到使用
复合键的缓存操作方式
```
This commit is contained in:
昔念
2026-01-19 18:51:56 +08:00
parent 08ebf849eb
commit 026689f3ed
120 changed files with 1428 additions and 629 deletions

View File

@@ -5,8 +5,8 @@ import (
"blazing/common/socket/errorcode"
"blazing/logic/service/egg"
"blazing/logic/service/player"
"blazing/modules/blazing/model"
"blazing/modules/config/service"
"blazing/modules/player/model"
"github.com/gogf/gf/v2/util/grand"
)

View File

@@ -10,8 +10,8 @@ import (
"blazing/logic/service/fight/info"
"blazing/logic/service/player"
"blazing/modules/blazing/model"
"blazing/modules/config/service"
"blazing/modules/player/model"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/grand"
@@ -137,12 +137,12 @@ func (h Controller) PlayerFightBoss(data *fight.ChallengeBossInboundInfo, p *pla
fight.NewFight(p, ai, func(foi info.FightOverInfo) {
if taskID != 0 {
if foi.Reason == 0 && foi.WinnerId == p.Info.UserID {
p.CompletedTask(taskID, 100)
p.BossCompletedTask(taskID, 100)
}
}
p.Done.Exec(model.MilestoneMode.BOSS, []uint32{p.Info.MapID, data.BossId, uint32(foi.Reason)}, nil)
//p.Done.Exec(model.MilestoneMode.BOSS, []uint32{p.Info.MapID, data.BossId, uint32(foi.Reason)}, nil)
})
@@ -189,7 +189,7 @@ func (h Controller) OnPlayerFightNpcMonster(data1 *fight.FightNpcMonsterInboundI
p.Fightinfo.Mode = info.BattleMode.MULTI_MODE //多人模式
fight.NewFight(p, ai, func(foi info.FightOverInfo) {
p.Done.Exec(model.MilestoneMode.Moster, []uint32{p.Info.MapID, monsterInfo.PetList[0].ID, uint32(foi.Reason)}, nil)
//p.Done.Exec(model.MilestoneMode.Moster, []uint32{p.Info.MapID, monsterInfo.PetList[0].ID, uint32(foi.Reason)}, nil)
if foi.Reason == 0 && foi.WinnerId == p.Info.UserID {
if !p.CanGetExp() {
@@ -217,6 +217,7 @@ func (h Controller) OnPlayerFightNpcMonster(data1 *fight.FightNpcMonsterInboundI
p.Info.ExpPool += exp * 4
p.AddPetExp(foi.Winpet, uint32(exp)*2)
p.SendPackCmd(8004, items)
}
})

View File

@@ -7,9 +7,9 @@ import (
fightinfo "blazing/logic/service/fight/info"
"blazing/logic/service/player"
"blazing/logic/service/space/info"
"blazing/modules/blazing/model"
configmodel "blazing/modules/config/model"
"blazing/modules/config/service"
"blazing/modules/player/model"
"sync/atomic"
@@ -188,26 +188,20 @@ func (h Controller) PetTawor(data *fight.StartTwarInboundInfo, c *player.Player)
if foi.Reason == 0 && foi.WinnerId == c.Info.UserID { //我放获胜
switch data.Head.CMD {
case 2429: //试炼之塔
for _, v := range boss.TaskIds {
c.CompletedTask(int(v), 600)
}
c.BossCompletedTask(600, int(c.Info.CurrentStage))
c.Info.CurrentFreshStage++
if c.Info.CurrentFreshStage >= c.Info.MaxFreshStage {
c.Info.MaxFreshStage = c.Info.CurrentFreshStage
}
case 2415: //勇者之塔
for _, v := range boss.TaskIds {
c.CompletedTask(int(v), 500)
}
c.BossCompletedTask(500, int(c.Info.CurrentStage))
c.Info.CurrentStage++
if c.Info.CurrentStage >= c.Info.MaxStage {
c.Info.MaxStage = c.Info.CurrentStage
}
case 2425:
for _, v := range boss.TaskIds {
c.CompletedTask(int(v), 110)
}
c.BossCompletedTask(110, int(c.Info.CurrentStage))
}
}

View File

@@ -5,7 +5,7 @@ import (
"blazing/logic/service/fight"
"blazing/logic/service/item"
"blazing/logic/service/player"
"blazing/modules/blazing/model"
"blazing/modules/player/model"
"github.com/jinzhu/copier"
)

View File

@@ -3,8 +3,13 @@ package controller
import (
"blazing/common/rpc"
"blazing/common/socket/errorcode"
"blazing/cool"
"blazing/logic/service/user"
"blazing/modules/base/service"
playerservice "blazing/modules/player/service"
"context"
"encoding/hex"
"fmt"
"github.com/panjf2000/gnet/v2"
)
@@ -21,12 +26,37 @@ import (
// GetServerOnline 处理命令: 105
func (h Controller) GetServerOnline(data *user.SidInfo, c gnet.Conn) (result *rpc.CommendSvrInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
result = rpc.NewInInfo()
// tt, _ := cool.CacheManager.Keys(context.Background())
//g.Dump(tt)
t1 := hex.EncodeToString(data.Sid)
userid, ok := playerservice.User.Load(t1)
if !ok || userid != data.Head.UserID {
defer c.Close()
return
}
// if service.NewBaseSysUserService().GetPerson(data.Head.UserID).Debug == 1 {
// result.IsVip = 1
// }
result.IsVip = 1
result.ServerList = rpc.GetServerInfoList(service.NewBaseSysUserService().GetPerson(data.Head.UserID).Debug)
defer func() {
// share.ShareManager.DeleteSession(t1)
ser := playerservice.NewUserService(data.Head.UserID)
kickErr := ser.Info.Kick(data.Head.UserID)
if kickErr != nil {
fmt.Println("踢人失败", kickErr)
}
logininfo := ser.Info.SetLogin()
if logininfo != nil {
cool.CacheManager.Set(context.TODO(), fmt.Sprintf("player: %d", data.Head.UserID), logininfo, 0)
cool.CacheManager.Set(context.Background(), fmt.Sprintf("session: %d", data.Head.UserID), t1, 0)
}
}()
return
//return //TODO 这里待实现改成接口调用Ret方法

View File

@@ -3,7 +3,6 @@ package controller
import (
"blazing/common/data/share"
"blazing/cool"
"fmt"
"blazing/common/socket/errorcode"
@@ -11,7 +10,7 @@ import (
"blazing/logic/service/player"
"blazing/logic/service/space"
blservice "blazing/modules/blazing/service"
"blazing/modules/player/service"
"context"
"time"
@@ -27,13 +26,6 @@ func (h Controller) Login(data *user.MAIN_LOGIN_IN, c gnet.Conn) (result *user.L
return
}
kickErr := h.RPCClient.Kick(data.Head.UserID) //先踢人
if kickErr != nil {
fmt.Println("踢人失败", err)
}
cool.Logger.Info(context.TODO(), "踢人请求完成,继续登录流程")
share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器
currentPlayer := player.GetPlayer(c, data.Head.UserID)
if currentPlayer == nil {
@@ -42,9 +34,9 @@ func (h Controller) Login(data *user.MAIN_LOGIN_IN, c gnet.Conn) (result *user.L
defer c.Close()
return
}
currentPlayer.Service = blservice.NewUserService(data.Head.UserID)
currentPlayer.Service = service.NewUserService(data.Head.UserID)
currentPlayer.Info = currentPlayer.Service.Info.Personself()
currentPlayer.Info = currentPlayer.Service.Info.GetCache()
if currentPlayer.Info == nil {
defer c.Close()

View File

@@ -0,0 +1,95 @@
package controller
import (
"blazing/common/socket/errorcode"
"blazing/logic/service/fight"
"blazing/logic/service/pet"
"blazing/logic/service/player"
)
// GetBreedInfo 获取繁殖信息协议
// 前端到后端无数据 请求协议
func (ctl Controller) GetBreedInfo(
data *pet.C2S_GET_BREED_INFO, playerObj *player.Player) (result *pet.S2C_GET_BREED_INFO, err errorcode.ErrorCode) { //这个时候player应该是空的
result = &pet.S2C_GET_BREED_INFO{}
// TODO: 实现获取繁殖信息的具体逻辑
return result, 0
}
// GetBreedPet 获取繁殖精灵
// 前端到后端
func (ctl Controller) GetBreedPet(
data *pet.C2S_GET_BREED_PET, playerObj *player.Player) (result *pet.S2C_GET_BREED_PET, err errorcode.ErrorCode) { //这个时候player应该是空的
result = &pet.S2C_GET_BREED_PET{}
// TODO: 实现获取可繁殖雌性精灵列表的逻辑
// 这里只是示例实际应该根据雄性精灵的catchTime查找可繁殖的雌性精灵
for _, v := range playerObj.Info.PetList {
// 如果是雌性精灵,且可以繁殖,则添加到列表
result.FemaleList = append(result.FemaleList, v.CatchTime)
}
return result, 0
}
// StartBreed 开始繁殖协议
// 前端到后端
func (ctl Controller) StartBreed(
data *pet.C2S_START_BREED, playerObj *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
// TODO: 实现开始繁殖的具体逻辑
result = &fight.NullOutboundInfo{}
return result, 0
}
// GetEggList 获取精灵蛋数组
// 前端到后端无数据 请求协议
func (ctl Controller) GetEggList(
data *pet.C2S_GET_EGG_LIST, playerObj *player.Player) (result *pet.S2C_GET_EGG_LIST, err errorcode.ErrorCode) { //这个时候player应该是空的
result = &pet.S2C_GET_EGG_LIST{}
// TODO: 实现获取精灵蛋列表的逻辑
// 示例数据,实际应从玩家数据中获取
result.EggList = append(result.EggList, pet.EggInfo{EggID: 1, OwnerID: 10001, EggCatchTime: 122123})
return result, 0
}
// EffectHatch 精灵蛋互动协议
// 前端到后端
func (ctl Controller) EffectHatch(
data *pet.C2S_EFFECT_HATCH, playerObj *player.Player) (result *pet.S2C_EFFECT_HATCH, err errorcode.ErrorCode) {
result = &pet.S2C_EFFECT_HATCH{}
// TODO: 实现精灵蛋互动逻辑根据互动ID更新亲密度
result.Intimacy = 1 // 悲伤
return result, 0
}
// StartHatch 开始孵化精灵蛋
// 前端到后端
func (ctl Controller) StartHatch(
data *pet.C2S_START_HATCH, playerObj *player.Player) (result *pet.S2C_START_HATCH, err errorcode.ErrorCode) {
// TODO: 实现开始孵化精灵蛋的具体逻辑
result = &pet.S2C_START_HATCH{}
return result, 0
}
// GetHatchPet 获得孵化精灵协议
// 前端到后端无数据内容 请求协议
func (ctl Controller) GetHatchPet(
data *pet.C2S_GET_HATCH_PET, playerObj *player.Player) (result *pet.S2C_GET_HATCH_PET, err errorcode.ErrorCode) {
result = &pet.S2C_GET_HATCH_PET{}
// TODO: 实现获得孵化精灵的具体逻辑,这里暂时返回默认值
result.PetID = 0
result.CatchTime = 0
return result, 0
}

View File

@@ -4,7 +4,7 @@ import (
"blazing/common/socket/errorcode"
"blazing/logic/service/pet"
"blazing/logic/service/player"
"blazing/modules/blazing/model"
"blazing/modules/player/model"
"github.com/samber/lo"
)

View File

@@ -5,8 +5,8 @@ import (
"blazing/common/socket/errorcode"
"blazing/logic/service/pet"
"blazing/logic/service/player"
"blazing/modules/blazing/model"
"blazing/modules/config/service"
"blazing/modules/player/model"
"github.com/alpacahq/alpacadecimal"
"github.com/gogf/gf/v2/util/grand"

View File

@@ -7,7 +7,7 @@ import (
"blazing/logic/service/fight"
"blazing/logic/service/pet"
"blazing/logic/service/player"
"blazing/modules/blazing/model"
"blazing/modules/player/model"
"github.com/samber/lo"
)

View File

@@ -20,7 +20,7 @@ func (h Controller) BuyFitment(data *room.C2S_BUY_FITMENT, c *player.Player) (re
if !c.GetCoins(uint32(totalCost)) {
return nil, errorcode.ErrorCodes.ErrSunDouInsufficient10016
}
c.Service.Room.Add(data.ID, data.Count)
c.Service.Item.UPDATE(data.ID, int(data.Count))
c.Info.Coins -= uint32(totalCost)
result.ID = data.ID
result.Coins = c.Info.Coins

View File

@@ -2,7 +2,7 @@ package controller
import (
"blazing/common/socket/errorcode"
"blazing/modules/blazing/model"
"blazing/modules/player/model"
"blazing/logic/service/pet"
"blazing/logic/service/player"
@@ -55,10 +55,19 @@ func (h Controller) GetAllFurniture(data *room.FitmentAllInboundEmpty, c *player
result = &room.FitmentAllOutboundInfo{}
result.Fitments = make([]room.FitmentItemInfo, 0)
items := c.Service.Item.Get(500000, 600000)
roomData := c.Service.Room.Get(c.Info.UserID)
for itemID, count := range roomData.OwnedItems {
result.Fitments = append(result.Fitments, room.FitmentItemInfo{Id: itemID, AllCount: count, UsedCount: roomData.UserItems[itemID]})
for _, item := range items {
var itemInfo room.FitmentItemInfo
itemInfo.Id = item.ItemId
itemInfo.AllCount = item.ItemCnt
i, ok := roomData.UsedItems[item.ItemId]
if ok {
itemInfo.UsedCount = i
}
result.Fitments = append(result.Fitments, itemInfo)
}
return
}

View File

@@ -14,6 +14,7 @@ import (
// c: 当前玩家对象
// 返回: 空结果和错误码
func (h Controller) SetFitment(data *room.SET_FITMENT, c *player.Player) (result *room.NullInfo, err errorcode.ErrorCode) {
c.Service.Room.Set(data.Fitments)
return
}

View File

@@ -7,7 +7,8 @@ import (
"blazing/logic/service/item"
"blazing/logic/service/player"
"blazing/logic/service/user"
"blazing/modules/blazing/model"
"blazing/modules/player/model"
"strings"
)
// PlayerAim 玩家射击操作
@@ -160,3 +161,34 @@ func (h Controller) ChangePlayerCloth(data *item.ChangePlayerClothInboundInfo, p
return
}
func (h Controller) ChangePlayerName(data *user.ChangePlayerNameInboundInfo, c *player.Player) (result *user.ChangePlayerNameOutboundInfo, err errorcode.ErrorCode) {
newNickname := cool.Filter.Replace(strings.Trim(data.Nickname, "\x00"), '*')
c.Info.Nick = newNickname
result = &user.ChangePlayerNameOutboundInfo{
Nickname: newNickname,
UserID: c.Info.UserID,
}
c.GetSpace().Broadcast(c, data.Head.CMD, result)
return result, 0
}
func (h Controller) ChangeTile(data *user.ChangeTitleInboundInfo, c *player.Player) (result *user.ChangeTitleOutboundInfo, err errorcode.ErrorCode) {
result = &user.ChangeTitleOutboundInfo{
UserID: c.Info.UserID,
}
if data.TileID == 0 {
return result, 0
}
if !c.Service.Title.Can(data.TileID) {
return nil, errorcode.ErrorCodes.ErrSystemError
}
c.Info.Title = data.TileID
result.TileID = data.TileID
c.GetSpace().Broadcast(c, data.Head.CMD, result)
return result, 0
}

View File

@@ -0,0 +1,56 @@
package controller
import (
"blazing/common/socket/errorcode"
"blazing/logic/service/player"
"blazing/logic/service/user"
"blazing/modules/config/service"
"blazing/modules/player/model"
"time"
)
func (h Controller) CDK(data *user.C2S_GET_GIFT_COMPLETE, player *player.Player) (result *user.S2C_GET_GIFT_COMPLETE, err errorcode.ErrorCode) {
result = &user.S2C_GET_GIFT_COMPLETE{}
r := service.NewCdkService().Get(data.PassText)
if r == nil {
return nil, errorcode.ErrorCodes.ErrMolecularCodeNotExists
}
if r.ValidEndTime.Compare(time.Now()) == -1 {
return nil, errorcode.ErrorCodes.ErrMolecularCodeExpired
}
if !player.Service.Cdk.CanGet(uint32(r.ID)) {
return
}
if !service.NewCdkService().Set(data.PassText) {
return nil, errorcode.ErrorCodes.ErrMolecularCodeGiftsGone
}
result.Flag = 1
for _, v := range r.ElfRewardIds {
pet := service.NewPetRewardService().Get(v)
if pet != nil {
peti := model.GenPetInfo(int(pet.MonID), int(pet.DV), int(pet.Nature), int(pet.Effect), int(pet.Lv), nil)
player.Service.Pet.PetAdd(peti)
result.PetGift = append(result.PetGift, user.PetGiftInfo{PetID: peti.ID, CacthTime: peti.CatchTime})
}
}
for _, itemID := range r.ItemRewardIds {
iteminfo := service.NewItemService().GetItemCount(itemID)
player.ItemAdd(iteminfo.ItemId, iteminfo.ItemCnt)
result.GiftList = append(result.GiftList, user.GiftInfo{GiftID: iteminfo.ItemId, Count: iteminfo.ItemCnt})
}
if r.TitleRewardIds != 0 {
player.Service.Title.Give(r.TitleRewardIds)
result.Tile = r.TitleRewardIds
}
player.Service.Cdk.Log(uint32(r.ID))
return
}

View File

@@ -3,10 +3,9 @@ package controller
import (
"blazing/common/socket/errorcode"
"blazing/cool"
"blazing/modules/player/service"
"blazing/logic/service/player"
"blazing/logic/service/user"
blservice "blazing/modules/blazing/service"
"strings"
"github.com/panjf2000/gnet/v2"
@@ -15,19 +14,7 @@ import (
// CreatePlayer 处理命令: 1001
func (h Controller) CreatePlayer(data *user.CreatePlayerInboundInfo, c gnet.Conn) (result *user.CreatePlayerOutInfo, err errorcode.ErrorCode) {
data.Nickname = strings.Trim(data.Nickname, "\x00")
blservice.NewUserService(data.Head.UserID).Info.Reg(cool.Filter.Replace(data.Nickname, '*'), data.Color)
return result, 0
}
func (h Controller) ChangePlayerName(data *user.ChangePlayerNameInboundInfo, c *player.Player) (result *user.ChangePlayerNameOutboundInfo, err errorcode.ErrorCode) {
newNickname := cool.Filter.Replace(strings.Trim(data.Nickname, "\x00"), '*')
c.Info.Nick = newNickname
result = &user.ChangePlayerNameOutboundInfo{
Nickname: newNickname,
UserID: c.Info.UserID,
}
c.GetSpace().Broadcast(c, data.Head.CMD, result)
service.NewUserService(data.Head.UserID).Info.Reg(cool.Filter.Replace(data.Nickname, '*'), data.Color)
return result, 0
}

View File

@@ -3,11 +3,11 @@ package controller
import (
"blazing/common/data"
"blazing/common/socket/errorcode"
"fmt"
"blazing/logic/service/player"
"blazing/logic/service/task"
"blazing/modules/blazing/model"
"blazing/modules/config/service"
"blazing/modules/player/model"
)
// AcceptTask 接受任务
@@ -16,13 +16,14 @@ func (h Controller) AcceptTask(data *task.AcceptTaskInboundInfo, c *player.Playe
// if data.Head.CMD != 2201 { //判断是每日任务
// //isdaliy = true
// }
if c.Info.GetTask(int(data.TaskId)) == model.Completed {
return result, 0
if c.Info.GetTask(int(data.TaskId)) != model.Unaccepted {
return nil, errorcode.ErrorCodes.ErrSystemError
}
if !service.NewTaskService().IsAcceptable(data.TaskId) {
return nil, errorcode.ErrorCodes.ErrSystemError
}
if c.Info.GetTask(int(data.TaskId)) == model.Unaccepted {
c.Info.SetTask(int(data.TaskId), model.Accepted)
}
c.Info.SetTask(int(data.TaskId), model.Accepted)
c.Service.Task.Exec(uint32(data.TaskId), func(t *model.TaskEX) bool {
t.Data = []uint32{}
@@ -39,6 +40,10 @@ func (h Controller) AcceptTask(data *task.AcceptTaskInboundInfo, c *player.Playe
// c: 当前玩家对象
// 返回: 空输出结果和错误码
func (h Controller) AddTaskBuf(data *task.AddTaskBufInboundInfo, c *player.Player) (result *task.AddTaskBufOutboundInfo, err errorcode.ErrorCode) {
if !service.NewTaskService().IsAcceptable(data.TaskId) {
return nil, errorcode.ErrorCodes.ErrSystemError
}
c.Service.Task.Exec(data.TaskId, func(taskEx *model.TaskEX) bool {
taskEx.Data = data.TaskList
return true
@@ -54,9 +59,12 @@ func (h Controller) CompleteTask(data1 *task.CompleteTaskInboundInfo, c *player.
if c.Info.GetTask(int(data1.TaskId)) != model.Accepted {
return result, errorcode.ErrorCodes.ErrAwardAlreadyClaimed
}
if data1.OutState > 10 {
fmt.Println("error", data1.OutState, c.Info.UserID, "分支溢出")
return result, 0
// if data1.OutState > 10 {
// fmt.Println("error", data1.OutState, c.Info.UserID, "分支溢出")
// return result, 0
// }
if !service.NewTaskService().IsAcceptable(data1.TaskId) {
return nil, errorcode.ErrorCodes.ErrSystemError
}
c.Info.SetTask(int(data1.TaskId), model.Completed)
@@ -65,7 +73,7 @@ func (h Controller) CompleteTask(data1 *task.CompleteTaskInboundInfo, c *player.
ItemList: make([]data.ItemInfo, 0),
}
taskInfo := task.GetTaskInfo(data1.TaskId, data1.OutState)
taskInfo := task.GetTaskInfo(int(data1.TaskId), int(data1.OutState))
if taskInfo == nil {
return result, 0
}
@@ -104,7 +112,9 @@ func (h Controller) GetTaskBuf(data *task.GetTaskBufInboundInfo, c *player.Playe
// DeleteTask 删除任务
func (h Controller) DeleteTask(data *task.DeleteTaskInboundInfo, c *player.Player) (result *task.DeleteTaskOutboundInfo, err errorcode.ErrorCode) {
if !service.NewTaskService().IsAcceptable(data.TaskId) {
return nil, errorcode.ErrorCodes.ErrSystemError
}
if c.Info.GetTask(int(data.TaskId)) == model.Accepted {
c.Info.SetTask(int(data.TaskId), model.Unaccepted)
return &task.DeleteTaskOutboundInfo{TaskId: data.TaskId}, 0