- 移除了资产同步到私有 B 仓库的工作流 - 在玩家结构中添加了 IsFighting 字段 - 新增了宠物信息相关功能和数据结构 - 优化了地图进入和怪物刷新逻辑 - 调整了玩家登录和地图数据发送流程 - 重构了部分代码以提高可维护性和性能
167 lines
9.8 KiB
Go
167 lines
9.8 KiB
Go
package model
|
||
|
||
import (
|
||
"blazing/cool"
|
||
|
||
"github.com/creasty/defaults"
|
||
)
|
||
|
||
const TableNamePlayerInfo = "player_info"
|
||
|
||
type Player struct {
|
||
*cool.Model
|
||
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"`
|
||
}
|
||
type Pos struct {
|
||
X uint32 `struc:"uint32" default:"0"`
|
||
Y uint32 `struc:"uint32" default:"0"`
|
||
}
|
||
|
||
// PeopleItemInfo 穿戴装备信息结构(对应Java的PeopleItemInfo)
|
||
type PeopleItemInfo struct {
|
||
ID uint32 `struc:"uint32"` // 装备id
|
||
Level uint32 `struc:"uint32" default:"1"` // 未知字段(默认值1,对应Java的@Builder.Default)
|
||
}
|
||
|
||
// InitDefaults 初始化默认值(确保默认值正确赋值)
|
||
func (p *PeopleItemInfo) InitDefaults() {
|
||
p.Level = 1 // 未知字段默认值1,与Java的@Builder.Default保持一致
|
||
}
|
||
func NewPlayerInfo() *PlayerInfo {
|
||
l := &PlayerInfo{
|
||
|
||
Clothes: make([]PeopleItemInfo, 0),
|
||
PetList: make([]PetInfo, 0),
|
||
}
|
||
|
||
// 自动填充 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
|
||
}
|
||
}
|
||
}
|
||
|
||
type PlayerInfo struct {
|
||
GoldBean int32 `struc:"skip" json:"nieo_gold_bean"` // 金豆(特殊货币)
|
||
|
||
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"` // 机器人颜色RGB颜色值(uint32,实际为3个uint8)
|
||
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" default:"0" json:"time_today"` // 已消耗时间(秒)
|
||
TimeLimit uint32 `struc:"uint32" default:"43200" 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 TeamInfo `struc:"struct" json:"team_info"` // 战队信息24字节
|
||
TeamPkInfo 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 []PetInfo ` json:"pet_list"` // 精灵背包内信息
|
||
ClothesCount uint32 `struc:"sizeof=Clothes" json:"clothes_count"` // 穿戴装备数量
|
||
Clothes []PeopleItemInfo ` json:"clothes"` // 穿戴装备
|
||
}
|
||
|
||
// TableName PlayerInfo's table name
|
||
func (*Player) TableName() string {
|
||
return TableNamePlayerInfo
|
||
}
|
||
|
||
// GroupName PlayerInfo's table group
|
||
func (*Player) GroupName() string {
|
||
return "default"
|
||
}
|
||
|
||
// NewPlayerInfo create a new PlayerInfo
|
||
func NewPlayer() *Player {
|
||
return &Player{
|
||
Model: cool.NewModel(),
|
||
}
|
||
}
|
||
|
||
// init 创建表
|
||
func init() {
|
||
cool.CreateTable(&Player{})
|
||
}
|