diff --git a/logic/controller/login.go b/logic/controller/login.go index d1f8338c7..c40cd5035 100644 --- a/logic/controller/login.go +++ b/logic/controller/login.go @@ -9,7 +9,7 @@ import ( ) // 处理命令: 1001 -func (h *Controller) Login(data *login.InInfo, c *entity.Conn) (result *login.OutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 +func (h *Controller) Login(data *login.InInfo, c *entity.Conn) (result *login.PlayerLoginInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 if tt := data.CheakSession(); tt { //说明sid正确 h.RPCClient.Kick(data.Head.UserID) //先踢人 diff --git a/logic/go.mod b/logic/go.mod index f23bb5a1f..4e0b01b00 100644 --- a/logic/go.mod +++ b/logic/go.mod @@ -9,6 +9,7 @@ require ( github.com/butoften/array v1.0.9 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/clbanning/mxj/v2 v2.7.0 // indirect + github.com/creasty/defaults v1.8.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/fatih/color v1.18.0 // indirect @@ -17,6 +18,7 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mcuadros/go-defaults v1.2.0 // indirect github.com/panjf2000/ants/v2 v2.11.3 // indirect github.com/samber/lo v1.51.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect diff --git a/logic/go.sum b/logic/go.sum index 9ce13647c..6302d3d6d 100644 --- a/logic/go.sum +++ b/logic/go.sum @@ -6,6 +6,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYKk= +github.com/creasty/defaults v1.8.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= @@ -21,6 +23,8 @@ github.com/gogf/gf/v2 v2.9.0 h1:semN5Q5qGjDQEv4620VzxcJzJlSD07gmyJ9Sy9zfbHk= github.com/gogf/gf/v2 v2.9.0/go.mod h1:sWGQw+pLILtuHmbOxoe0D+0DdaXxbleT57axOLH2vKI= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lunixbochs/struc v0.0.0-20241101090106-8d528fa2c543 h1:GxMuVb9tJajC1QpbQwYNY1ZAo1EIE8I+UclBjOfjz/M= github.com/lunixbochs/struc v0.0.0-20241101090106-8d528fa2c543/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -28,6 +32,9 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mcuadros/go-defaults v1.2.0 h1:FODb8WSf0uGaY8elWJAkoLL0Ri6AlZ1bFlenk56oZtc= +github.com/mcuadros/go-defaults v1.2.0/go.mod h1:WEZtHEVIGYVDqkKSWBdWKUVdRyKlMfulPaGDWIVeCWY= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg= github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= github.com/panjf2000/gnet/v2 v2.9.1 h1:bKewICy/0xnQ9PMzNaswpe/Ah14w1TrRk91LHTcbIlA= @@ -49,6 +56,7 @@ golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/logic/service/login/LoginSidInfo.go b/logic/service/login/LoginSidInfo.go index f6bc11182..7383b53de 100644 --- a/logic/service/login/LoginSidInfo.go +++ b/logic/service/login/LoginSidInfo.go @@ -16,17 +16,18 @@ type InInfo struct { //这里直接使用组合来实现将传入的原始头部 } func (s *InInfo) Def() []byte { //默认返回方法 - t1, _ := hex.DecodeString("0000045D37000003E9000186A600000000000186A6683F89CF6E69656F0000000000000000000000000008000F00000000000000000000000000000000000000000000000000000001000001DB0000018B000000000000A8C000000000000000000000000000000000000000080001388000000001000000017FFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000000000000000000000064000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001FFFFFFFF000000004E4F4E4F0000000000000000000000000000000000000001000000010000000100000001000000010000000100000001000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000100000064000000000000000000000000000000000000001F000000000000006400000000000093F4000093F4000000D5000000F7000000AD00000088000000920000008C0000009C00000000000000000000000000000000000000000000000000000004000027900000001B00004E6200000014000028380000002800004E3E0000002368493DC60000000000000000000000000000000000000000000100000000000000A937000007D1000186A600000000000186A66E69656F00000000000000000000000000000000000000000000000F0000000000000000000001DB0000018B0000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000") - //t1 = t1[17:] - fmt.Println(t1[:40]) - s.Head.Version = "7" + t := NewPlayerLoginInfo() + // g.Dump(t) + s.Head.UserID = 99942 s.Head.Result = 0 + //s //return data.Head.Pack(t1[17:])[:40] - return s.Head.Pack(t1[17:]) //返回传参 + return s.Head.Pack(t) //返回传参 //return t1[:40] } + func (l *InInfo) CheakSession() bool { // tt, _ := cool.CacheManager.Keys(context.Background()) //g.Dump(tt) diff --git a/logic/service/login/LoginUserInfo.go b/logic/service/login/LoginUserInfo.go index f5e7fd2a7..3c2e2a20a 100644 --- a/logic/service/login/LoginUserInfo.go +++ b/logic/service/login/LoginUserInfo.go @@ -1,108 +1,128 @@ package login import ( - "blazing/common/socket/handler" "blazing/modules/blazing/model" + + "github.com/creasty/defaults" ) -// LoginUserInfo 对应Java版本的登录用户信息结构 -type OutInfo struct { - Head handler.TomeeHeader `cmd:"1001" struc:"[0]pad"` // 玩家登录 +type PlayerLoginInfo struct { + NieoGoldBean int32 `struc:"skip" json:"nieo_gold_bean"` // 尼尔金豆(特殊货币) + EquipmentHead int32 `struc:"skip" json:"equipment_head"` // 头部穿戴装备ID(0=未穿戴) + EquipmentFace int32 `struc:"skip" json:"equipment_face"` // 脸部穿戴装备ID + EquipmentHand int32 `struc:"skip" json:"equipment_hand"` // 手部穿戴装备ID + EquipmentWaist int32 `struc:"skip" json:"equipment_waist"` // 腰部穿戴装备ID + EquipmentLeg int32 `struc:"skip" json:"equipment_leg"` // 腿部穿戴装备ID + EquipmentBackground int32 `struc:"skip" json:"equipment_background"` // 背景穿戴装备ID + RobotColor int64 `struc:"skip" json:"robot_color"` // RGB颜色值(uint32,实际为3个uint8) - UserID uint32 `struc:"uint32"` // 米米号 通过sid拿到 - RegisterTime uint32 `struc:"uint32"` // 注册时间(按秒的时间戳) - Nick [16]byte `struc:"[16]byte"` // 16字节昵称 - Vip uint16 `struc:"uint16"` // 暂时不明建议先给固定值0 - Viped uint16 `struc:"uint16" default:"15"` // 暂时不明建议先给固定值15 - DSFlag uint32 `struc:"uint32"` // 暂时不明建议先给固定值0 - Color uint32 `struc:"uint32"` // 机器人人物颜色 00 rgb - Texture uint32 `struc:"uint32"` // 暂时不明建议先给固定值0 - Energy uint32 `struc:"uint32" default:"3000"` // 暂时不明建议先给固定值3000 - Coins uint32 `struc:"uint32"` // 赛尔豆 - FightBadge uint32 `struc:"uint32"` // 暂时不明建议先给固定值0 - MapID uint32 `struc:"uint32"` // 上线的地图id - Pos Pos - TimeToday uint32 `struc:"uint32"` // 已经消耗掉的时间(秒为单位) - TimeLimit uint32 `struc:"uint32"` // 总电池限制(秒为单位) - IsClothHalfDay byte `struc:"byte"` // 暂时不明感觉是某种活动建议先给固定值0(只能0或1) - IsRoomHalfDay byte `struc:"byte"` // 暂时不明感觉是某种活动建议先给固定值0(只能0或1) - IFortressHalfDay byte `struc:"byte"` // 暂时不明感觉是某种活动建议先给固定值0(只能0或1) - IsHQHalfDay byte `struc:"byte"` // 暂时不明感觉是某种活动建议先给固定值0(只能0或1) - LoginCount uint32 `struc:"uint32"` // 暂时不明建议先给固定值0 - Inviter uint32 `struc:"uint32"` // 邀请活动建议先给固定值0 - NewInviteeCount uint32 `struc:"uint32"` // 邀请活动建议先给固定值0 - VipLevel uint32 `struc:"uint32" default:"8"` // 超no等级建议固定8 - VipValue uint32 `struc:"uint32" default:"80000"` // 超no的vip值建议固定80000 - VipStage uint32 `struc:"uint32" default:"1"` // 超no的外形等级建议固定1(暂定) - AutoCharge uint32 `struc:"uint32" default:"1"` // nono是否自动充电 建议固定1 - VipEndTime uint32 `struc:"uint32" default:"4294967295"` // 超no的结束时间建议尽可能大 - FreshManBonus uint32 `struc:"uint32"` // 邀请活动建议先给固定值0 - NonoChipList [80]byte `struc:"[80]byte"` // 超no芯片列表*(80字节) - DailyResArr [50]byte `struc:"[50]byte" default:"3"` // 50字节,默认值为3 - TeacherID uint32 `struc:"uint32"` // 教官id - StudentID uint32 `struc:"uint32"` // 学员id - GraduationCount uint32 `struc:"uint32"` // 毕业人数 - MaxPuniLv uint32 `struc:"uint32" default:"0"` // 默认值为0 - PetMaxLevel uint32 `struc:"uint32"` // 精灵的最高等级 - AllPetNumber uint32 `struc:"uint32"` // 所有的精灵的数量 - MonKingWin uint32 `struc:"uint32"` // 精灵王之战胜场 - CurrentStage uint32 `struc:"uint32"` // 勇者之塔当前到达的层数 - MaxStage uint32 `struc:"uint32"` // 试炼之塔最大胜利的层数 - CurrentFreshStage uint32 `struc:"uint32"` // 试炼之塔当前到达的层数 - MaxFreshStage uint32 `struc:"uint32"` // 试炼之塔最大胜利的层数 - MaxArenaWins uint32 `struc:"uint32"` // 星际擂台连胜 - TwoTimes uint32 `struc:"uint32" default:"0"` // 未知默认0 - ThreeTimes uint32 `struc:"uint32" default:"0"` // 未知默认0 - AutoFight uint32 `struc:"uint32" default:"0"` // 是否自动战斗(未知默认值0) - AutoFightTime uint32 `struc:"uint32" default:"0"` // 自动战斗剩余的场次(未知默认值0) - EnergyTime uint32 `struc:"uint32" default:"0"` // 能量吸收仪剩余次数(未知待定默认值0) - LearnTimes uint32 `struc:"uint32" default:"0"` // 学习力吸收仪剩余次数(未知待定默认值0) - MonBattleMedal uint32 `struc:"uint32" default:"0"` // 未知默认0 - RecordCount uint32 `struc:"uint32" default:"0"` // 未知默认0 - ObtainTm uint32 `struc:"uint32" default:"0"` // 未知默认0 - SoulBeadItemID uint32 `struc:"uint32"` // 当前在孵化的元神珠id - ExpireTm uint32 `struc:"uint32" default:"0"` // 未知默认0 - FuseTimes uint32 `struc:"uint32" default:"0"` // 未知默认0 - HasNono uint32 `struc:"uint32" default:"1"` // 玩家有没有nono - SuperNono uint32 `struc:"uint32" default:"1"` // 玩家有没有超能nono - NonoState uint32 `struc:"uint32" default:"4294967295"` // 默认值-1 - NonoColor uint32 `struc:"uint32"` // nono的颜色 - NonoNick [16]byte `struc:"[16]byte" default:"nono"` // nono的名字 必须要补齐到16位 - TeamInfo model.TeamInfo `struc:"struct"` // 猜测为战队信息24字节 - TeamPkInfo model.TeamPKInfo `struc:"struct"` // 8字节 - Reserved byte `struc:"byte"` // 1字节 无内容 - Badge uint32 `struc:"uint32" default:"0"` // 默认值为0 - Reserved1 [27]byte `struc:"[27]byte" default:"3"` // 未知(27字节,默认值为3) - TaskList [500]byte `struc:"[500]byte" default:"3"` // 任务状态数组(500字节,3为已经完成,建议默认值为3) - PetListCount uint16 `struc:"sizeof=PetList"` // 精灵列表长度 - PetList model.PetInfo `struc:"-"` // 精灵背包内的信息 - ClothesCount uint8 `struc:"sizeof=Clothes"` // 穿戴装备数量 - Clothes []model.PeopleItemInfo `struc:"-"` // 穿戴装备 + ExpPool int64 `struc:"skip" json:"exp_pool"` // 累计经验池 + + // OutInfo 字段 + 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字节昵称 + Vip uint16 `struc:"uint16" json:"vip"` // 固定0 + Viped uint16 `struc:"uint16" default:"15" json:"viped"` // 固定15 + DSFlag uint32 `struc:"uint32" json:"ds_flag"` // 固定0 + Color uint32 `struc:"uint32" json:"color"` // 机器人颜色,0x00 rgb + Texture uint32 `struc:"uint32" json:"texture"` // 固定0 + Energy uint32 `struc:"uint32" default:"3000" json:"energy"` // 固定3000 + Coins uint32 `struc:"uint32" json:"coins"` // 赛尔豆 + FightBadge uint32 `struc:"uint32" json:"fight_badge"` // 固定0 + MapID uint32 `struc:"uint32" default:"1" json:"map_id"` // 上线地图ID + Pos Pos `json:"pos"` // 坐标 + TimeToday uint32 `struc:"uint32" json:"time_today"` // 已消耗时间(秒) + TimeLimit uint32 `struc:"uint32" json:"time_limit"` // 总电池限制(秒) + IsClothHalfDay byte `struc:"byte" json:"is_cloth_half_day"` // 活动标志0/1 + IsRoomHalfDay byte `struc:"byte" json:"is_room_half_day"` // 活动标志0/1 + IFortressHalfDay byte `struc:"byte" json:"i_fortress_half_day"` // 活动标志0/1 + IsHQHalfDay byte `struc:"byte" json:"is_hq_half_day"` // 活动标志0/1 + LoginCount uint32 `struc:"uint32" json:"login_count"` // 固定0 + Inviter uint32 `struc:"uint32" json:"inviter"` // 固定0 + NewInviteeCount uint32 `struc:"uint32" json:"new_invitee_count"` // 固定0 + VipLevel uint32 `struc:"uint32" default:"8" json:"vip_level"` // 固定8 + VipValue uint32 `struc:"uint32" default:"80000" json:"vip_value"` // 固定80000 + VipStage uint32 `struc:"uint32" default:"1" json:"vip_stage"` // 固定1 + AutoCharge uint32 `struc:"uint32" default:"1" json:"auto_charge"` // 固定1 + VipEndTime uint32 `struc:"uint32" default:"4294967295" json:"vip_end_time"` // 尽可能大值 + FreshManBonus uint32 `struc:"uint32" json:"fresh_man_bonus"` // 固定0 + NonoChipList [80]byte `struc:"[80]byte" json:"nono_chip_list"` // 超no芯片列表 + DailyResArr [50]byte `struc:"[50]byte" default:"3" json:"daily_res_arr"` // 任务状态数组默认3 + TeacherID uint32 `struc:"uint32" json:"teacher_id"` // 教官id + StudentID uint32 `struc:"uint32" json:"student_id"` // 学员id + GraduationCount uint32 `struc:"uint32" default:"0" json:"graduation_count"` // 毕业人数 + MaxPuniLv uint32 `struc:"uint32" default:"0" json:"max_puni_lv"` // 默认0 + PetMaxLevel uint32 `struc:"uint32" json:"pet_max_level"` // 精灵最高等级 + AllPetNumber uint32 `struc:"uint32" json:"all_pet_number"` // 精灵数量 + MonKingWin uint32 `struc:"uint32" json:"mon_king_win"` // 精灵王胜场 + CurrentStage uint32 `struc:"uint32" json:"current_stage"` // 勇者之塔层数 + MaxStage uint32 `struc:"uint32" json:"max_stage"` // 试炼之塔最高层 + CurrentFreshStage uint32 `struc:"uint32" json:"current_fresh_stage"` // 当前试炼层数 + MaxFreshStage uint32 `struc:"uint32" json:"max_fresh_stage"` // 最高试炼层 + MaxArenaWins uint32 `struc:"uint32" json:"max_arena_wins"` // 星际擂台连胜 + TwoTimes uint32 `struc:"uint32" default:"0" json:"two_times"` // 默认0 + ThreeTimes uint32 `struc:"uint32" default:"0" json:"three_times"` // 默认0 + AutoFight uint32 `struc:"uint32" default:"0" json:"auto_fight"` // 默认0 + AutoFightTime uint32 `struc:"uint32" default:"0" json:"auto_fight_time"` // 默认0 + EnergyTime uint32 `struc:"uint32" default:"0" json:"energy_time"` // 默认0 + LearnTimes uint32 `struc:"uint32" default:"0" json:"learn_times"` // 默认0 + MonBattleMedal uint32 `struc:"uint32" default:"0" json:"mon_battle_medal"` // 默认0 + RecordCount uint32 `struc:"uint32" default:"0" json:"record_count"` // 默认0 + ObtainTm uint32 `struc:"uint32" default:"0" json:"obtain_tm"` // 默认0 + SoulBeadItemID uint32 `struc:"uint32" json:"soul_bead_item_id"` // 当前元神珠id + ExpireTm uint32 `struc:"uint32" default:"0" json:"expire_tm"` // 默认0 + FuseTimes uint32 `struc:"uint32" default:"0" json:"fuse_times"` // 默认0 + HasNono uint32 `struc:"uint32" default:"1" json:"has_nono"` // 玩家是否有nono + SuperNono uint32 `struc:"uint32" default:"1" json:"super_nono"` // 玩家是否有超能nono + NonoState uint32 `struc:"uint32" default:"4294967295" json:"nono_state"` // 默认-1 + NonoColor uint32 `struc:"uint32" json:"nono_color"` // nono颜色 + NonoNick string `struc:"[16]byte" default:"nono" json:"nono_nick"` // nono名字(16字节) + TeamInfo model.TeamInfo `struc:"struct" json:"team_info"` // 战队信息24字节 + TeamPkInfo model.TeamPKInfo `struc:"struct" json:"team_pk_info"` // 8字节 + Reserved byte `struc:"byte" json:"reserved"` // 1字节无内容 + Badge uint32 `struc:"uint32" default:"0" json:"badge"` // 默认0 + Reserved1 [27]byte `struc:"[27]byte" default:"3" json:"reserved1"` // 27字节默认3 + TaskList [500]byte `struc:"[500]byte" default:"3" json:"task_list"` // 任务状态数组500字节,默认3 + PetListCount uint32 `struc:"sizeof=PetList" json:"pet_list_count"` // 精灵列表长度 + PetList []model.PetInfo ` json:"pet_list"` // 精灵背包内信息 + ClothesCount uint32 `struc:"sizeof=Clothes" json:"clothes_count"` // 穿戴装备数量 + Clothes []model.PeopleItemInfo ` json:"clothes"` // 穿戴装备 } -// 初始化默认值 -func (l *OutInfo) InitDefaults() { - - // 初始化数组默认值 - for i := range l.DailyResArr { - l.DailyResArr[i] = 3 - } - for i := range l.Reserved1 { - l.Reserved1[i] = 3 - } - for i := range l.TaskList { - l.TaskList[i] = 3 +func NewPlayerLoginInfo() *PlayerLoginInfo { + l := &PlayerLoginInfo{ + Clothes: make([]model.PeopleItemInfo, 0), + PetList: make([]model.PetInfo, 0), } - // 设置结构体字段的默认值 - l.Viped = 15 - l.Energy = 3000 - l.VipLevel = 8 - l.VipValue = 80000 - l.VipStage = 1 - l.AutoCharge = 1 - l.VipEndTime = 0xFFFFFFFF - l.HasNono = 1 - l.SuperNono = 1 - l.NonoState = 0xFFFFFFFF + // 自动填充 struct tag 里的 default 值 + if err := defaults.Set(l); err != nil { + panic(err) // 方便发现 default 设置错误 + } + + // 填充需要重复值的数组 + fillBytes(&l.DailyResArr, 3) + fillBytes(&l.Reserved1, 3) + fillBytes(&l.TaskList, 3) + + return l +} + +// 工具函数:给数组/切片批量赋同一个 byte 值 +func fillBytes(arr any, val byte) { + switch a := arr.(type) { + case *[50]byte: + for i := range a { + a[i] = val + } + case *[27]byte: + for i := range a { + a[i] = val + } + case *[500]byte: + for i := range a { + a[i] = val + } + } } diff --git a/logic/service/login/Point.go b/logic/service/login/Point.go index 31f443873..03167f6c7 100644 --- a/logic/service/login/Point.go +++ b/logic/service/login/Point.go @@ -1,6 +1,6 @@ package login type Pos struct { - X uint32 `struc:"uint32"` - Y uint32 `struc:"uint32"` + X uint32 `struc:"uint32" default:"0"` + Y uint32 `struc:"uint32" default:"0"` } diff --git a/modules/blazing/model/PetInfo.go b/modules/blazing/model/PetInfo.go index c40571462..cad84c2db 100644 --- a/modules/blazing/model/PetInfo.go +++ b/modules/blazing/model/PetInfo.go @@ -13,86 +13,84 @@ type Pet struct { Data string `gorm:"type:text;not null;comment:'精灵全部数据'" json:"data"` } -// PetInfo 精灵信息结构,合并了两个版本的字段 +// PetInfo 精灵信息结构(合并后的优化版本) type PetInfo struct { - // 第一个版本中的字段 - CapturePlayerID uint64 `gorm:"not null;comment:'捕获者ID'" json:"capture_player_id"` - CaptureTime int64 `gorm:"not null;comment:'捕获时间(时间戳)'" json:"capture_time"` - CaptureMap int32 `gorm:"not null;comment:'捕获地图ID'" json:"capture_map"` - CaptureRect int16 `gorm:"not null;default:0;comment:'捕获区域(未知用途,默认为0)'" json:"capture_rect"` - CaptureLevel int16 `gorm:"not null;default:0;comment:'捕获时的等级'" json:"capture_level"` - PetTypeID int32 `gorm:"not null;comment:'精灵类型ID/精灵图鉴ID'" json:"pet_type_id"` - IndividualValue int16 `gorm:"not null;comment:'个体值(DV)'" json:"individual_value"` - Nature int16 `gorm:"not null;comment:'性格类型'" json:"nature"` - AbilityTypeEnum int16 `gorm:"comment:'特性枚举'" json:"ability_type_enum"` - Shiny int32 `gorm:"not null;default:0;comment:'闪光ID(异色!=0,非异色=0)'" json:"shiny"` - Level int16 `gorm:"not null;default:1;comment:'当前等级'" json:"level"` - CurrentExp int32 `gorm:"not null;default:0;comment:'当前等级已获得经验值'" json:"current_exp"` - CurrentHP int32 `gorm:"not null;comment:'当前生命值'" json:"current_hp"` - MaxHP int32 `gorm:"not null;comment:'实际最大生命值'" json:"max_hp"` - Attack int32 `gorm:"not null;comment:'实际攻击力'" json:"attack"` - Defense int32 `gorm:"not null;comment:'实际防御力'" json:"defense"` - SpecialAttack int32 `gorm:"not null;comment:'实际特殊攻击力'" json:"special_attack"` - SpecialDefense int32 `gorm:"not null;comment:'实际特殊防御力'" json:"special_defense"` - Speed int32 `gorm:"not null;comment:'实际速度'" json:"speed"` - EvHP int16 `gorm:"not null;default:0;comment:'生命值学习力'" json:"ev_hp"` - EvAttack int16 `gorm:"not null;default:0;comment:'攻击学习力'" json:"ev_attack"` - EvDefense int16 `gorm:"not null;default:0;comment:'防御学习力'" json:"ev_defense"` - EvSpecialAttack int16 `gorm:"not null;default:0;comment:'特殊攻击学习力'" json:"ev_special_attack"` - EvSpecialDefense int16 `gorm:"not null;default:0;comment:'特殊防御学习力'" json:"ev_special_defense"` - EvSpeed int16 `gorm:"not null;default:0;comment:'速度学习力'" json:"ev_speed"` - PetSkill []PetSkillInfo // 技能组 - ElementalOrbID int32 `gorm:"not null;default:0;comment:'属性能量珠ID'" json:"elemental_orb_id"` - SpecialOrbID int32 `gorm:"not null;default:0;comment:'平衡/暴击能量珠ID'" json:"special_orb_id"` - ElementalOrbCount int16 `gorm:"not null;default:0;comment:'属性能量珠剩余使用次数'" json:"elemental_orb_count"` - SpecialOrbCount int16 `gorm:"not null;default:0;comment:'平衡/暴击能量珠剩余使用次数'" json:"special_orb_count"` - IndividualGuarantee int64 `gorm:"not null;default:0;comment:'个体值保底(0=无保底)'" json:"individual_guarantee"` - NatureGuarantee int64 `gorm:"not null;default:0;comment:'性格保底(0=无保底)'" json:"nature_guarantee"` - Freed bool `gorm:"default:false;not null;comment:'是否已放生(0=未放生,1=已放生)'" json:"freed"` - FreedTime string `gorm:"comment:'放生时间'" json:"freed_time"` - - // 第二个版本中的字段 - ID uint32 `struc:"uint32" gorm:"not null;comment:'精灵编号'" json:"id"` - Name [16]byte `struc:"[16]byte" gorm:"type:char(16);comment:'名字'" json:"name"` - DV uint32 `struc:"uint32" gorm:"not null;comment:'个体值'" json:"dv"` - LvExp uint32 `struc:"uint32" gorm:"not null;comment:'当前等级所需的经验'" json:"lv_exp"` - NextLvExp uint32 `struc:"uint32" gorm:"not null;comment:'升到下一级的经验'" json:"next_lv_exp"` - Defence uint32 `struc:"uint32" gorm:"not null;comment:'防御'" json:"defence"` - //EvSpecialDefense uint32 `struc:"uint32" gorm:"not null;comment:'特防学习力'" json:"ev_special_defense"` - SkillSize uint32 `struc:"uint32" gorm:"not null;comment:'技能个数'" json:"skill_size"` - SkillList [4]SkillInfo `gorm:"embedded;embeddedPrefix:skill_list_" json:"skill_list"` - CatchTime uint32 `struc:"uint32" gorm:"not null;comment:'捕捉时间'" json:"catch_time"` - CatchRect uint32 `struc:"uint32" default:"0" gorm:"default:0;comment:'未知(默认0)'" json:"catch_rect"` - CatchLevel uint32 `struc:"uint32" default:"0" gorm:"default:0;comment:'捕获等级(默认0)'" json:"catch_level"` - SkinID uint32 `struc:"uint32" default:"0" gorm:"default:0;comment:'皮肤id(默认0)'" json:"skin_id"` - EffectInfoLen uint16 `struc:"sizeof=EffectInfo" gorm:"comment:'特性列表长度'" json:"effect_info_len"` - EffectInfo []PetEffectInfo `gorm:"embedded;embeddedPrefix:effect_info_" json:"effect_info"` + // 第一个版本字段 + CapturePlayerID uint64 `json:"capture_player_id"` + CaptureTime int64 `json:"capture_time"` + CaptureMap int32 `json:"capture_map"` + CaptureRect int16 `json:"capture_rect"` + CaptureLevel int16 `json:"capture_level"` + PetTypeID int32 `json:"pet_type_id"` + IndividualValue int16 `json:"individual_value"` + Nature int16 `json:"nature"` + AbilityTypeEnum int16 `json:"ability_type_enum"` + Shiny int32 `json:"shiny"` + Level int16 `json:"level"` + CurrentExp int32 `json:"current_exp"` + CurrentHP int32 `json:"current_hp"` + MaxHP int32 `json:"max_hp"` + Attack int32 `json:"attack"` + Defense int32 `json:"defense"` + SpecialAttack int32 `json:"special_attack"` + SpecialDefense int32 `json:"special_defense"` + Speed int32 `json:"speed"` + EvHP int16 `json:"ev_hp"` + EvAttack int16 `json:"ev_attack"` + EvDefense int16 `json:"ev_defense"` + EvSpecialAttack int16 `json:"ev_special_attack"` + EvSpecialDefense int16 `json:"ev_special_defense"` + EvSpeed int16 `json:"ev_speed"` + PetSkillLen int16 `struc:"sizeof=PetSkill" json:"pet_skill_len"` + PetSkill []PetSkillInfo `json:"pet_skill"` + ElementalOrbID int32 `json:"elemental_orb_id"` + SpecialOrbID int32 `json:"special_orb_id"` + ElementalOrbCount int16 `json:"elemental_orb_count"` + SpecialOrbCount int16 `json:"special_orb_count"` + IndividualGuarantee int64 `json:"individual_guarantee"` + NatureGuarantee int64 `json:"nature_guarantee"` + Freed bool `json:"freed"` + FreedTime string `json:"freed_time"` + + // 第二个版本字段 + ID uint32 `struc:"uint32" json:"id"` + Name [16]byte `struc:"[16]byte" json:"name"` + DV uint32 `struc:"uint32" json:"dv"` + LvExp uint32 `struc:"uint32" json:"lv_exp"` + NextLvExp uint32 `struc:"uint32" json:"next_lv_exp"` + Defence uint32 `struc:"uint32" json:"defence"` + SkillSize uint32 `struc:"uint32" json:"skill_size"` + SkillList [4]SkillInfo `json:"skill_list"` + CatchTime uint32 `struc:"uint32" json:"catch_time"` + CatchRect uint32 `struc:"uint32" json:"catch_rect"` + CatchLevel uint32 `struc:"uint32" json:"catch_level"` + SkinID uint32 `struc:"uint32" json:"skin_id"` + EffectInfoLen uint16 `struc:"sizeof=EffectInfo" json:"effect_info_len"` + EffectInfo []PetEffectInfo `json:"effect_info"` } -// PetSkillInfo 精灵技能信息结构,合并了两个版本 +// PetSkillInfo 精灵技能信息结构 type PetSkillInfo struct { - SkillID1 int32 `gorm:"not null;default:0;comment:'技能1ID'" json:"skill_1_id"` - PP1 int16 `gorm:"not null;default:0;comment:'技能1PP'" json:"skill_1_pp"` - SkillID2 int32 `gorm:"default:0;comment:'技能2ID'" json:"skill_2_id"` - PP2 int16 `gorm:"default:0;comment:'技能2PP'" json:"skill_2_pp"` - SkillID3 int32 `gorm:"default:0;comment:'技能3ID'" json:"skill_3_id"` - PP3 int16 `gorm:"default:0;comment:'技能3PP'" json:"skill_3_pp"` - SkillID4 int32 `gorm:"default:0;comment:'技能4ID'" json:"skill_4_id"` - PP4 int16 `gorm:"default:0;comment:'技能4PP'" json:"skill_4_pp"` + SkillID1 int32 `json:"skill_1_id"` + PP1 int16 `json:"skill_1_pp"` + SkillID2 int32 `json:"skill_2_id"` + PP2 int16 `json:"skill_2_pp"` + SkillID3 int32 `json:"skill_3_id"` + PP3 int16 `json:"skill_3_pp"` + SkillID4 int32 `json:"skill_4_id"` + PP4 int16 `json:"skill_4_pp"` } - - -// PetEffectInfo 精灵特性信息结构(第二个版本中的定义) +// PetEffectInfo 精灵特性信息结构 type PetEffectInfo struct { - ItemID uint32 `struc:"uint32" gorm:"not null;comment:'特性晶片对应的物品id'" json:"item_id"` - Status byte `struc:"byte" default:"1" gorm:"default:1;comment:'状态'" json:"status"` - LeftCount byte `struc:"byte" gorm:"comment:'未知'" json:"left_count"` - EffectID uint16 `struc:"uint16" gorm:"not null;comment:'特性id'" json:"effect_id"` - Reserve1 byte `struc:"byte" gorm:"comment:'保留字段1'" json:"reserve1"` - Reserve2 byte `struc:"byte" gorm:"comment:'保留字段2'" json:"reserve2"` - Reserve3 byte `struc:"byte" gorm:"comment:'保留字段3'" json:"reserve3"` - Reserve4 [13]byte `struc:"[13]byte" gorm:"type:char(13);comment:'保留字段4'" json:"reserve4"` + ItemID uint32 `struc:"uint32" json:"item_id"` + Status byte `struc:"byte" json:"status"` + LeftCount byte `struc:"byte" json:"left_count"` + EffectID uint16 `struc:"uint16" json:"effect_id"` + Reserve1 byte `struc:"byte" json:"reserve1"` + Reserve2 byte `struc:"byte" json:"reserve2"` + Reserve3 byte `struc:"byte" json:"reserve3"` + Reserve4 [13]byte `struc:"[13]byte" json:"reserve4"` } // TableName Pet's table name diff --git a/modules/blazing/model/TeamInfo.go b/modules/blazing/model/TeamInfo.go index b2d6d926e..ea65ddb01 100644 --- a/modules/blazing/model/TeamInfo.go +++ b/modules/blazing/model/TeamInfo.go @@ -1,16 +1,14 @@ package model -import "blazing/common/socket/handler" - // TeamInfo 战队信息结构 type TeamInfo struct { - Head handler.TomeeHeader `cmd:"1001" struc:"[0]pad"` // 命令头 - ID uint32 `struc:"uint32" default:"0"` // 默认值0 - Priv uint32 `struc:"uint32" default:"1"` // 默认值1 - SuperCore uint32 `struc:"uint32" default:"1"` // 默认值1 - IsShow uint32 `struc:"uint32" default:"1"` // 默认值1 - AllContribution uint32 `struc:"uint32" default:"1"` // 默认值1 - CanExContribution uint32 `struc:"uint32" default:"1"` // 默认值1 + //Head handler.TomeeHeader `cmd:"1001" struc:"[0]pad"` // 命令头 + ID uint32 `struc:"uint32" default:"0"` // 默认值0 + Priv uint32 `struc:"uint32" default:"1"` // 默认值1 + SuperCore uint32 `struc:"uint32" default:"1"` // 默认值1 + IsShow uint32 `struc:"uint32" default:"1"` // 默认值1 + AllContribution uint32 `struc:"uint32" default:"1"` // 默认值1 + CanExContribution uint32 `struc:"uint32" default:"1"` // 默认值1 } // InitDefaults 初始化默认值 diff --git a/modules/blazing/model/player_info.go b/modules/blazing/model/player_info.go index c26deda6c..f160ee4b4 100644 --- a/modules/blazing/model/player_info.go +++ b/modules/blazing/model/player_info.go @@ -6,31 +6,10 @@ import ( const TableNamePlayerInfo = "player_info" -// PlayerInfo mapped from table type PlayerInfo struct { *cool.Model - AccountID uint64 `gorm:"not null;uniqueIndex:idx_player_info_unique_by_account_id;comment:'所属账户ID'" json:"account_id"` - Nickname string `gorm:"type:varchar(16);not null;default:'nieo';comment:'昵称'" json:"nickname"` - NieoBean int64 `gorm:"not null;default:0;comment:'尼尔豆(基础货币,uint32)'" json:"nieo_bean"` - NieoGoldBean string `gorm:"type:decimal(12,2);not null;default:0;comment:'尼尔金豆(特殊货币,uint32)'" json:"nieo_gold_bean"` - EquipmentHead int32 `gorm:"not null;default:0;comment:'头部穿戴装备ID(0=未穿戴)'" json:"equipment_head"` - EquipmentFace int32 `gorm:"not null;default:0;comment:'脸部穿戴装备ID'" json:"equipment_face"` - EquipmentHand int32 `gorm:"not null;default:0;comment:'手部穿戴装备ID'" json:"equipment_hand"` - EquipmentWaist int32 `gorm:"not null;default:0;comment:'腰部穿戴装备ID'" json:"equipment_waist"` - EquipmentLeg int32 `gorm:"not null;default:0;comment:'腿部穿戴装备ID'" json:"equipment_leg"` - EquipmentBackground int32 `gorm:"not null;default:0;comment:'背景穿戴装备ID'" json:"equipment_background"` - RobotColor int64 `gorm:"not null;default:0;comment:'RGB颜色值(uint32,实际为3个uint8)'" json:"robot_color"` - HasNono bool `gorm:"default:false;not null;comment:'是否拥普通NONO(布尔转TINYINT)'" json:"has_nono"` - HasSuperNono bool `gorm:"default:false;not null;comment:'是否拥超能NONO'" json:"has_super_nono"` - NonoNickname string `gorm:"type:varchar(16);not null;default:'NONO';comment:'NONO昵称(byte[16])'" json:"nono_nickname"` - NonoColor int64 `gorm:"not null;default:0;comment:'NONO颜色值'" json:"nono_color"` - ExpPool int64 `gorm:"not null;default:0;comment:'累计经验池'" json:"exp_pool"` - Pet1 int64 `gorm:"not null;default:0;comment:'背包精灵1(首发精灵),捕获时间戳'" json:"pet1"` - Pet2 int64 `gorm:"not null;default:0;comment:'背包精灵2'" json:"pet2"` - Pet3 int64 `gorm:"not null;default:0;comment:'背包精灵3'" json:"pet3"` - Pet4 int64 `gorm:"not null;default:0;comment:'背包精灵4'" json:"pet4"` - Pet5 int64 `gorm:"not null;default:0;comment:'背包精灵5'" json:"pet5"` - Pet6 int64 `gorm:"not null;default:0;comment:'背包精灵6'" json:"pet6"` + PlayerID uint64 `gorm:"not null;index:idx_pet_by_player_id;comment:'所属玩家ID'" json:"player_id"` + Data string `gorm:"type:text;not null;comment:'精灵全部数据'" json:"data"` } // TableName PlayerInfo's table name @@ -44,7 +23,7 @@ func (*PlayerInfo) GroupName() string { } // NewPlayerInfo create a new PlayerInfo -func NewPlayerInfo() *PlayerInfo { +func NewPlayer() *PlayerInfo { return &PlayerInfo{ Model: cool.NewModel(), }