diff --git a/logic/controller/map.go b/logic/controller/map.go index 92814a3f5..a8afdba94 100644 --- a/logic/controller/map.go +++ b/logic/controller/map.go @@ -15,7 +15,7 @@ import ( "github.com/jinzhu/copier" ) -func (h Controller) EnterMap(data *space.InInfo, c *player.Player) (result *info.OutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 +func (h Controller) EnterMap(data *space.InInfo, c *player.Player) (result *info.SimpleInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 c.Info.MapID = data.MapId //登录地图 c.GetSpace().User.Store(c.Info.UserID, c) //添加玩家 diff --git a/logic/controller/pet_barge.go b/logic/controller/pet_barge.go new file mode 100644 index 000000000..1fef79878 --- /dev/null +++ b/logic/controller/pet_barge.go @@ -0,0 +1,27 @@ +package controller + +import ( + "blazing/common/socket/errorcode" + "blazing/logic/service/pet" + "blazing/logic/service/player" +) + +// GetPetBargeList 精灵图鉴 +func (h Controller) GetPetBargeList(data *pet.PetBargeListInboundInfo, player *player.Player) (result *pet.PetBargeListOutboundInfo, err errorcode.ErrorCode) { + + ret := &pet.PetBargeListOutboundInfo{ + PetBargeList: make([]pet.PetBargeListInfo, 0), + } + r := player.Service.Barge.Get(data.StartPetId, data.EndPetId) + for _, v := range r { + + ret.PetBargeList = append(ret.PetBargeList, pet.PetBargeListInfo{ + PetId: v.PetId, + EnCntCnt: 1, + IsCatched: v.CatchedCount, + IsKilled: v.KilledCount, + }) + } + + return ret, 0 +} diff --git a/logic/controller/pet_collect.go b/logic/controller/pet_collect.go index 5d650bb5a..274248b86 100644 --- a/logic/controller/pet_collect.go +++ b/logic/controller/pet_collect.go @@ -4,19 +4,58 @@ import ( "blazing/common/socket/errorcode" "blazing/logic/service/pet" "blazing/logic/service/player" + "blazing/modules/blazing/model" + + "github.com/samber/lo" ) func (h Controller) IsCollect( data *pet.C2S_IS_COLLECT, c *player.Player) (result *pet.S2C_IS_COLLECT, err errorcode.ErrorCode) { //这个时候player应该是空的 result = &pet.S2C_IS_COLLECT{ - ID: data.Type, - IsCom: 0, + ID: data.Type, } - // r := c.Service.Barge.Get() - // for _, v := range r { - - // } + res := c.Info.GetTask(1335 + int(data.Type)) //第一期 + if res == model.Completed { + result.IsCom = 1 + } + + return result, 0 + +} + +// 定义 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}, //精灵王计划 +} + +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 { + return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError) + } + + validIDs, ok := validTypeIDMap[int(data.Type)] + if !ok { + // Type不在映射表中,返回系统错误 + return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError) + } + + // 2. 判断ID是否在合法集合中 + if !lo.Contains(validIDs, data.ID) { + return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError) + } + + c.Info.SetTask(1335+int(data.Type), model.Completed) + r := model.GenPetInfo(int(data.ID), -1, -1, 0, 1, nil) + c.Service.Pet.PetAdd(r) + result.CatchTime = r.CatchTime return result, 0 diff --git a/logic/controller/pet_ext.go b/logic/controller/pet_ext.go new file mode 100644 index 000000000..f832ab05a --- /dev/null +++ b/logic/controller/pet_ext.go @@ -0,0 +1,17 @@ +package controller + +import ( + "blazing/common/socket/errorcode" + "blazing/logic/service/pet" + "blazing/logic/service/player" +) + +// Exelist 对应C#的List,Go中用切片([])替代列表 + ExelistLen uint32 `json:"exelistLen" struc:"sizeof=Exelist"` + Exelist []ExeingPetInfo `json:"exelist"` // 若需JSON序列化,保留原字段名 +} + +// ExeingPetInfo 对应C#的同名结构体,存储精灵训练相关信息 +type ExeingPetInfo struct { + Flag uint32 `json:"_flag"` // 应该是精灵是否在训练?(对应原_flag) + CapTm uint32 `json:"_capTm"` // 精灵的捕捉时间(对应原_capTm) + PetId uint32 `json:"_petId"` // 训练精灵的id(对应原_petId) + RemainDay uint32 `json:"_remainDay"` // 停留天数?前端用这个值除以3600,疑似时间戳(对应原_remainDay) + Course uint32 `json:"_course"` // 课程(对应原_course) } diff --git a/logic/service/space/in_out.go b/logic/service/space/in_out.go index 51acfa56e..a89f8d9e7 100644 --- a/logic/service/space/in_out.go +++ b/logic/service/space/in_out.go @@ -69,7 +69,7 @@ func (s *Space) EnterMap(c common.PlayerI) { } } -func (s *Space) GetInfo(c common.PlayerI) []info.OutInfo { +func (s *Space) GetInfo(c common.PlayerI) []info.SimpleInfo { if atomic.LoadUint32(&s.TimeBoss.Flag) == 1 { defer c.SendPackCmd(2022, &s.TimeBoss) @@ -81,8 +81,8 @@ func (s *Space) GetInfo(c common.PlayerI) []info.OutInfo { } defer c.SendPackCmd(50004, &info.S2C_50004{Id: uint32(s.Weather)}) //获取天气 - ret := make([]info.OutInfo, 0) - s.UserInfo.Range(func(k uint32, v info.OutInfo) (stop bool) { + ret := make([]info.SimpleInfo, 0) + s.UserInfo.Range(func(k uint32, v info.SimpleInfo) (stop bool) { ret = append(ret, v) return len(ret) > 30 }) diff --git a/logic/service/space/info/info.go b/logic/service/space/info/info.go index 09410ac17..673bc981e 100644 --- a/logic/service/space/info/info.go +++ b/logic/service/space/info/info.go @@ -11,7 +11,7 @@ type ListMapPlayerOutboundInfo struct { PlayersLen uint32 `struc:"sizeof=Player" json:"player_len"` // 穿戴装备的信息 - Player []OutInfo ` json:"player"` + Player []SimpleInfo ` json:"player"` } // PeopleWalkOutboundInfo PeopleWalkOutboundInfo类,实现OutboundMessage接口 @@ -45,11 +45,12 @@ type MapBossInfo struct { //var planetmap utils.SyncMap[] //= space.NewSyncMap() // PeopleInfo PeopleInfo类,实现OutboundMessage接口 -type OutInfo struct { +type SimpleInfo struct { UserID uint32 `struc:"uint32" fieldDesc:"米米号" json:"user_id"` // 16字节昵称 - Nick string `struc:"[16]byte" fieldDesc:"16字节昵称" json:"nick"` + Nick string `struc:"[16]byte" fieldDesc:"16字节昵称" json:"nick"` + Title uint32 `struc:"uint32" json:"title"` // 称号 // 机器人人物颜色 00 rgb Color uint32 `struc:"uint32" fieldDesc:"机器人人物颜色 00 rgb" json:"color"` @@ -150,8 +151,8 @@ type OutInfo struct { Clothes []model.PeopleItemInfo `fieldDesc:"穿戴装备的信息" json:"clothes"` } -func NewOutInfo() *OutInfo { - l := &OutInfo{} +func NewOutInfo() *SimpleInfo { + l := &SimpleInfo{} // 自动填充 struct tag 里的 default 值 if err := defaults.Set(l); err != nil { diff --git a/logic/service/space/space.go b/logic/service/space/space.go index 155e1855a..13d6141c1 100644 --- a/logic/service/space/space.go +++ b/logic/service/space/space.go @@ -27,7 +27,7 @@ var wermap = []uint32{32} // Space 针对Player的并发安全map,键为uint32类型 type Space struct { User *csmap.CsMap[uint32, common.PlayerI] // 存储玩家数据的map,键为玩家ID - UserInfo *csmap.CsMap[uint32, info.OutInfo] + UserInfo *csmap.CsMap[uint32, info.SimpleInfo] CanRefresh bool //是否能够刷怪 Super uint32 //SuperValue *int32 @@ -57,10 +57,10 @@ func NewSpace() *Space { // set the total capacity, every shard map has total capacity/shard count capacity. the default value is 0. // csmap.WithSize[string, int](1000), ), - UserInfo: csmap.New[uint32, info.OutInfo]( + UserInfo: csmap.New[uint32, info.SimpleInfo]( // set the number of map shards. the default value is 32. - csmap.WithShardCount[uint32, info.OutInfo](32), - csmap.WithCustomHasher[uint32, info.OutInfo](func(key uint32) uint64 { + csmap.WithShardCount[uint32, info.SimpleInfo](32), + csmap.WithCustomHasher[uint32, info.SimpleInfo](func(key uint32) uint64 { return uint64(key) }), diff --git a/logic/service/user/GET_SIM_USERINFO.go b/logic/service/user/GET_SIM_USERINFO.go index a0c27e19b..ebf9954d6 100644 --- a/logic/service/user/GET_SIM_USERINFO.go +++ b/logic/service/user/GET_SIM_USERINFO.go @@ -13,7 +13,8 @@ type SimUserInfoOutboundInfo struct { // UserID 米米号 UserID uint32 `codec:"true"` - Nick string `struc:"[16]byte" default:"seer" json:"nick"` // 16字节昵称 + Nick string `struc:"[16]byte" default:"seer" json:"nick"` // 16字节昵称 + Title uint32 `struc:"uint32" json:"title"` // 称号 // Color rgb颜色 Color uint32 `codec:"true"` @@ -80,6 +81,7 @@ type MoreUserInfoOutboundInfo struct { UserID uint32 `codec:"true"` Nick string `struc:"[16]byte" default:"seer" json:"nick"` // 16字节昵称 + Title uint32 `struc:"uint32" json:"title"` // 称号 RegisterTime uint32 `struc:"uint32" json:"register_time"` // 注册时间(秒时间戳) // PetAllNum 所有精灵数量 @@ -113,10 +115,6 @@ type MoreUserInfoOutboundInfo struct { // MaxArenaWins 星际擂台胜场 // 对应 Java 注解: @FieldDescription("星际擂台胜场") @UInt MaxArenaWins uint32 `codec:"true"` - - // CurrentTitleID 当前称号ID - // 对应 Java 注解: @FieldDescription("当前称号ID") @UInt - CurrentTitleID uint32 `codec:"true"` } // AimatInboundInfo 对应Java的AimatInboundInfo类 diff --git a/modules/base/service/base_sys_login.go b/modules/base/service/base_sys_login.go index 6691870b9..df2aeedfd 100644 --- a/modules/base/service/base_sys_login.go +++ b/modules/base/service/base_sys_login.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "log" + "strings" "time" "github.com/golang-jwt/jwt/v4" @@ -43,7 +44,7 @@ func (s *BaseSysLoginService) Login(ctx context.Context, req *v1.BaseOpenLoginRe username = req.Username baseSysUser = model.NewBaseSysUser() ) - + username = strings.ToLower(username) vcode, _ := cool.CacheManager.Get(ctx, "login:"+captchaId) if vcode.String() != verifyCode { err = gerror.New("验证码错误") @@ -66,7 +67,7 @@ func (s *BaseSysLoginService) Login(ctx context.Context, req *v1.BaseOpenLoginRe md5password, _ := gmd5.Encrypt(password) var user *model.BaseSysUser - if userInfo.Data.Attributes.Username != username { //说明没查找到用户 + if !strings.EqualFold(userInfo.Data.Attributes.Username, username) { //说明没查找到用户 //后端添加的账户 cool.DBM(baseSysUser).Where("username=?", username).Where("password=?", md5password).Where("status=?", 1).Scan(&user) if user == nil { diff --git a/modules/base/service/base_sys_user.go b/modules/base/service/base_sys_user.go index 4723715d5..75bd25c04 100644 --- a/modules/base/service/base_sys_user.go +++ b/modules/base/service/base_sys_user.go @@ -3,6 +3,7 @@ package service import ( "context" "fmt" + "strings" "blazing/cool" @@ -118,7 +119,7 @@ func (s *BaseSysUserService) Gen(user UserAttributes) (data interface{}, err err lastInsertId, err := m.Data(user).Data( g.Map{ - "username": user.Username, + "username": strings.ToLower(user.Username), "headImg": user.AvatarUrl, "departmentId": 1, }, @@ -150,6 +151,9 @@ func (s *BaseSysUserService) ServiceAdd(ctx context.Context, req *cool.AddReq) ( if !r.Get("password").IsNil() { reqmap["password"] = gmd5.MustEncryptString(r.Get("password").String()) } + if !r.Get("username").IsNil() { + reqmap["username"] = strings.ToLower(r.Get("username").String()) + } if s.UniqueKey != nil { for k, v := range s.UniqueKey { if reqmap[k] != nil { @@ -225,7 +229,9 @@ func (s *BaseSysUserService) ServiceUpdate(ctx context.Context, req *cool.Update r := g.RequestFromCtx(ctx) rMap := r.GetMap() - + if !r.Get("username").IsNil() { + rMap["username"] = strings.ToLower(r.Get("username").String()) + } // 如果不传入ID代表更新当前用户 userId := r.Get("id", admin.UserId).Uint() userInfo, err := m.Where("id", userId).One() diff --git a/modules/blazing/model/player.go b/modules/blazing/model/player.go index 4204962fb..a5851e936 100644 --- a/modules/blazing/model/player.go +++ b/modules/blazing/model/player.go @@ -118,6 +118,7 @@ type PlayerInfo struct { UserID uint32 `struc:"uint32" json:"user_id"` // 米米号 通过sid拿到 RegisterTime uint32 `struc:"uint32" json:"register_time"` // 注册时间(秒时间戳) Nick string `struc:"[16]byte" default:"seer" json:"nick"` // 16字节昵称 + Title uint32 `struc:"uint32" json:"title"` // 称号 Vip uint16 `struc:"uint16" json:"vip"` // 固定0 Viped uint16 `struc:"uint16" default:"15" json:"viped"` // 固定15 DSFlag uint32 `struc:"uint32" json:"ds_flag"` // 固定0 diff --git a/modules/config/model/task.go b/modules/config/model/task.go index 5232a6ef8..e790629d1 100644 --- a/modules/config/model/task.go +++ b/modules/config/model/task.go @@ -25,6 +25,8 @@ type TaskConfig struct { ItemRewardIds []uint32 `gorm:"not null;type:json;default:'[]';comment:'绑定奖励物品ID数组,关联item_gift表主键'" json:"item_reward_ids" description:"奖励物品数组"` ElfRewardIds uint32 `gorm:"not null;default:0;comment:'绑定奖励精灵ID,关联elf_gift表主键'" json:"elf_reward_ids" description:"绑定奖励精灵ID"` + //绑定奖励 + TitleRewardIds uint32 `gorm:"not null;default:0;comment:'绑定奖励称号'" json:"title_reward_ids" description:"绑定奖励称号"` // 任务状态和周期 IsEnabled uint32 `gorm:"not null;default:1;comment:'是否启用该任务(0-禁用 1-启用)'" json:"is_enabled" description:"是否启用"` diff --git a/public/config/30001.xml b/public/config/30001.xml deleted file mode 120000 index 378fc1710..000000000 --- a/public/config/30001.xml +++ /dev/null @@ -1 +0,0 @@ -E:/newcode/flash/out/dll/30001.xml \ No newline at end of file diff --git a/public/login-login-linux-amd64 b/public/login-login-linux-amd64 index 2dbedee43..343111251 100644 Binary files a/public/login-login-linux-amd64 and b/public/login-login-linux-amd64 differ