Merge branch 'main' of github.com:72wo/blazing

This commit is contained in:
2025-08-31 21:53:50 +08:00
16 changed files with 210 additions and 86 deletions

View File

@@ -12,5 +12,5 @@ func GDBM(m IModel) *gdb.Model {
// DBM 根据model获取 *gdb.Model
func DBM(m IModel) *gdb.Model {
return g.DB(m.GroupName()).Model(m.TableName())
return g.DB(m.GroupName()).Model(m.TableName()).FieldsEx("id")
}

View File

@@ -4,6 +4,7 @@ import (
"blazing/common/utils"
"blazing/modules/blazing/model"
"blazing/modules/blazing/service"
"context"
"fmt"
"sync"

View File

@@ -16,6 +16,16 @@ import (
"github.com/gogf/gf/v2/os/glog"
)
func IsToday(t time.Time) bool {
// 获取当前时间
now := time.Now()
// 比较年、月、日是否相同
return t.Year() == now.Year() &&
t.Month() == now.Month() &&
t.Day() == now.Day()
}
// 处理命令: 1001
func (h *Controller) Login(data *login.InInfo, c *socket.Conn) (result *login.OutInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
@@ -27,7 +37,17 @@ func (h *Controller) Login(data *login.InInfo, c *socket.Conn) (result *login.Ou
t.Info.UserID = data.Head.UserID
t.Onlinetime = uint32(time.Now().Unix()) //保存时间戳
share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器
t.CompleteLogin() //通知客户端登录成功
if !IsToday(t.Info.LastResetTime) { //判断是否是今天
t.Info.LastResetTime = time.Now()
//每天login时候检查重置时间然后把电池任务挖矿重置
t.Info.TimeToday = 0 //重置电池
for i := 400; i < 500; i++ {//每日任务区段
t.Info.TaskList[i] = 0 //重置每日任务
}
}
t.CompleteLogin() //通知客户端登录成功
glog.Debug(context.Background(), "登录成功,初始地图 人数:", space.GetSpace(t.Info.MapID).Len())

View File

@@ -4,6 +4,7 @@ import (
"blazing/common/data/socket"
"blazing/common/socket/errorcode"
"blazing/logic/service/pet"
"blazing/modules/blazing/model"
"blazing/modules/blazing/service"
)
@@ -25,6 +26,33 @@ func (h *Controller) PetRelease(
c *socket.Player) (
result *pet.PetReleaseOutboundInfo,
err errorcode.ErrorCode) { //这个时候player应该是空的
//放入背包=数据库置1+添加到背包+pet release发包 仓库=数据库置0+移除背包 设置首发等于取到首发精灵后重新排序
//这里只修改,因为添加和移除背包在宠物获取时已经做了
result = &pet.PetReleaseOutboundInfo{}
result.PetInfo = make([]model.PetInfo, 0)
t := service.NewUserService(c.Info.UserID).PetM(int(data.CatchTime), int(data.Flag))
switch data.Flag {
case 0:
//todo 仓库
removeIndex := -1
for i, v := range c.Info.PetList {
if v.CatchTime == uint32(data.CatchTime) {
removeIndex = i
break // 只移除第一个匹配值,若需移除所有,可省略 break 继续循环
}
return nil, 0
}
if removeIndex != -1 {
c.Info.PetList = append(c.Info.PetList[:removeIndex], c.Info.PetList[removeIndex+1:]...)
}
result.FirstPetTime = c.Info.PetList[0].CatchTime //设置首发
case 1:
//todo 背包
PetAdd(c, t)
result.PetInfo = append(result.PetInfo, t)
}
//service.NewUserService(c.Info.UserID).PetAdd( *r)
return result, 0
}

View File

@@ -3,6 +3,8 @@ package controller
import (
"blazing/common/data/socket"
"blazing/common/socket/errorcode"
"blazing/common/socket/handler"
"blazing/logic/service/pet"
"blazing/logic/service/task"
"blazing/modules/blazing/model"
"blazing/modules/blazing/service"
@@ -15,9 +17,9 @@ import (
*/
func (h Controller) AcceptTask(data *task.AcceptTaskInboundInfo, c *socket.Player) (result *task.AcceptTaskOutboundInfo, err errorcode.ErrorCode) {
//isdaliy := false
if data.Head.CMD != 2201 { //判断是每日任务
//isdaliy = true
}
// if data.Head.CMD != 2201 { //判断是每日任务
// //isdaliy = true
// }
if c.Info.TaskList[data.TaskId] == 0 {
c.Info.TaskList[data.TaskId] = 1
@@ -32,22 +34,23 @@ func (h Controller) AcceptTask(data *task.AcceptTaskInboundInfo, c *socket.Playe
* 更新任务步骤
*/
func (h Controller) AddTaskBuf(data *task.AddTaskBufInboundInfo, c *socket.Player) (result *task.AddTaskBufOutboundInfo, err errorcode.ErrorCode) {
isdaliy := false
if data.Head.CMD != 2204 { //判断是每日任务
isdaliy = true
// isdaliy := false
// if data.Head.CMD != 2204 { //判断是每日任务
// isdaliy = true
// }
result = &task.AddTaskBufOutboundInfo{}
_, ok := service.NewUserService(c.Info.UserID).TaskInfo(data.TaskId)
if ok {
service.NewUserService(c.Info.UserID).TaskSet(data.TaskId, model.TaskInfo{
Info: data.TaskList,
})
} else {
service.NewUserService(c.Info.UserID).TaskADD(data.TaskId, model.TaskInfo{
Info: data.TaskList,
})
}
service.NewUserService(c.Info.UserID).TaskExec(func(ttt []model.TaskInfo) []model.TaskInfo {
var ttt2 []model.TaskInfo
for _, v := range ttt {
v.TaskInfo = data.TaskList
ttt2 = append(ttt2, v)
}
return ttt2
}, isdaliy)
return &task.AddTaskBufOutboundInfo{}, 0
}
@@ -93,7 +96,7 @@ func (h Controller) Complete_Task(data *task.CompleteTaskInboundInfo, c *socket.
r := model.GenPetInfo(1, 1, 1, 1, 1, 5)
result.CaptureTime = r.CatchTime
result.PetTypeId = r.ID
service.NewUserService(c.Info.UserID).PetAdd(r.CatchTime, 1, *r)
PetAdd(c, *r)
}
if data.TaskId == 87 { //新手注册任务
@@ -113,24 +116,10 @@ func (h Controller) Complete_Task(data *task.CompleteTaskInboundInfo, c *socket.
* 获取任务状态
*/
func (h Controller) Get_Task_Buf(data *task.GetTaskBufInboundInfo, c *socket.Player) (result *task.GetTaskBufOutboundInfo, err errorcode.ErrorCode) {
isdaliy := false
if data.Head.CMD == 2203 { //判断不是每日任务
isdaliy = true
}
service.NewUserService(c.Info.UserID).TaskExec(func(ttt []model.TaskInfo) []model.TaskInfo {
var ttt2 = make([]model.TaskInfo, 500)
for _, v := range ttt {
if data.TaskId == v.TaskID {
result = &task.GetTaskBufOutboundInfo{TaskId: data.TaskId, TaskList: v.TaskInfo}
}
return ttt2
}
return ttt2
}, isdaliy)
info, _ := service.NewUserService(c.Info.UserID).TaskInfo(data.TaskId)
result = &task.GetTaskBufOutboundInfo{}
result.TaskId = data.TaskId
result.TaskList = info.Info
return result, 0
}
@@ -140,11 +129,22 @@ func (h Controller) Get_Task_Buf(data *task.GetTaskBufInboundInfo, c *socket.Pla
*/
func (h Controller) Delete_Task(data *task.DeleteTaskInboundInfo, c *socket.Player) (result *task.DeleteTaskOutboundInfo, err errorcode.ErrorCode) {
if data.Head.CMD == 2205 { //判断不是每日任务
// if data.Head.CMD == 2205 { //判断不是每日任务
} else {
// } else {
}
// }
return &task.DeleteTaskOutboundInfo{}, 0
}
// 添加精灵
func PetAdd(c *socket.Player, y model.PetInfo) {
c.Info.PetList = append(c.Info.PetList, y)
service.NewUserService(c.Info.UserID).PetAdd(y)
t := handler.NewTomeeHeader(2304, c.Info.UserID)
c.SendPack(t.Pack(&pet.PetReleaseOutboundInfo{PetInfo: []model.PetInfo{y}}))
//return lw.IsLogin
}

View File

@@ -1,9 +1,11 @@
package node
func (this *EffectNode) UseSkill() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) OnSkillPP() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) SkillUseEnd() bool {
panic("not implemented") // TODO: Implement
}

View File

@@ -2,6 +2,7 @@ package fight
import (
"blazing/common/socket/handler"
"blazing/modules/blazing/model"
)
// 野怪对战包
@@ -62,3 +63,21 @@ type FightPetInfo struct {
// byte[]固定长度6存储buff等级、攻击、速度等属性
BattleLV [6]byte `fieldDesc:"这里实际上应该是6个单字节byte, 内容为buff等级 攻击 速度 特攻 防御 特防 命中等.但具体顺序未知可能需要测试. 具体数值为1-6等级" serialize:"fixedLength=6,type=byteArray"`
}
// AttackValue 战斗中的攻击数值信息
type AttackValue struct {
UserID uint64 `json:"userId" fieldDescription:"玩家的米米号 与野怪对战userid = 0"`
SkillID uint64 `json:"skillId" fieldDescription:"使用技能的id"`
AttackTime uint64 `json:"attackTime" fieldDescription:"是否击中 如果为0 则miss 如果为1 则击中"`
LostHp uint64 `json:"lostHp" fieldDescription:"我方造成的伤害"`
GainHp uint64 `json:"gainHp" fieldDescription:"我方获得血量"`
RemainHp uint64 `json:"remainHp" fieldDescription:"我方剩余血量"`
MaxHp uint64 `json:"maxHp" fieldDescription:"我方最大血量"`
State uint64 `json:"state" fieldDescription:"固定值0 需要后续测试"`
SkillList []model.SkillInfo `json:"skillList" fieldDescription:"根据精灵的数据插入技能 最多4条 不定长"`
IsCritical uint64 `json:"isCritical" fieldDescription:"是否暴击"`
Status [20]byte `json:"status" fieldDescription:"20个字节 各种状态: 0:\"麻痹\",1:\"中毒\",2:\"烧伤\",4:\"寄生\",5:\"冻伤\",6:\"害怕\",7:\"疲惫\",8:\"睡眠\",9:\"石化\",10:\"混乱\",15:\"冰封\",16:\"流血\""`
BattleLv [6]byte `json:"battleLv" fieldDescription:"6个单字节byte, 内容为buff等级 攻击 速度 特攻 防御 特防命中等. 但具体顺序未知可能需要测试. 具体数值为1-6等级"`
// OwnerMaxShield uint64 `json:"ownerMaxShield" fieldDescription:"我方最大护盾"`
// OwnerCurrentShield uint64 `json:"ownerCurrentShield" fieldDescription:"我方当前护盾"`
}

View File

@@ -17,14 +17,14 @@ type OutInfo struct {
// PetReleaseOutboundInfo 宠物释放出站消息
type PetReleaseOutboundInfo struct {
HomeEnergy uint64 `json:"home_energy" fieldDescription:"暂定0" autoCodec:"true" uint:"true"`
FirstPetTime uint64 `json:"first_pet_time" fieldDescription:"精灵生成时间" autoCodec:"true" uint:"true"`
HomeEnergy uint32 `json:"home_energy" fieldDescription:"暂定0" autoCodec:"true" uint:"true"`
FirstPetTime uint32 `json:"first_pet_time" fieldDescription:"精灵生成时间" autoCodec:"true" uint:"true"`
PetInfo []model.PetInfo `json:"pet_info" fieldDescription:"精灵信息" autoCodec:"true"`
}
// 放入背包或者加入仓库
type PetReleaseInboundInfo struct {
Head handler.TomeeHeader `cmd:"2304" struc:"[0]pad"`
CatchTime uint64 `json:"catch_time" fieldDescription:"精灵生成时间" autoCodec:"true" uint:"true"`
Flag uint64 `json:"flag" fieldDescription:"0为放入仓库1为放入背包" autoCodec:"true" uint:"true"`
CatchTime uint32 `json:"catch_time" fieldDescription:"精灵生成时间" autoCodec:"true" uint:"true"`
Flag uint32 `json:"flag" fieldDescription:"0为放入仓库1为放入背包" autoCodec:"true" uint:"true"`
}

View File

@@ -26,6 +26,8 @@ var (
}
s := g.Server()
s.EnableAdmin()
s.SetServerAgent(cool.Config.Name)
s.BindHookHandler("/*", ghttp.HookBeforeServe, beforeServeHook)
runtime.SetMutexProfileFraction(1) // (非必需)开启对锁调用的跟踪

View File

@@ -5,7 +5,10 @@ server:
openapiPath: "/api.json"
swaggerPath: "/swagger"
clientMaxBodySize: 104857600 # 100MB in bytes 100*1024*1024
# 平滑重启特性
graceful: true # 是否开启平滑重启特性开启时将会在本地增加10000的本地TCP端口用于进程间通信默认false
gracefulTimeout: 2 # 父进程在平滑重启后多少秒退出默认2秒若请求耗时大于该值可能会导致请求中断
gracefulShutdownTimeout: 5 # 关闭Server时如果存在正在执行的HTTP请求Server等待多少秒才执行强行关闭
logger:
level: "all"
stdout: true

View File

@@ -7,11 +7,11 @@ const TableNameBaseSysUser = "base_sys_user"
// BaseSysUser mapped from table <base_sys_user>
type BaseSysUser struct {
*cool.Model
DepartmentID uint `gorm:"column:departmentId;type:bigint;index" json:"departmentId"` // 部门ID
Name *string `gorm:"column:name;type:varchar(255)" json:"name"` // 姓名
Username string `gorm:"column:username;type:varchar(100);not null;Index" json:"username"` // 用户名
Password string `gorm:"column:password;type:varchar(255);not null" json:"password"` // 密码
PasswordV *int32 `gorm:"column:passwordV;type:int;not null;default:1" json:"passwordV"` // 密码版本, 作用是改完密码让原来的token失效
DepartmentID uint `gorm:"column:departmentId;type:bigint;index" json:"departmentId"` // 部门ID
//Name *string `gorm:"column:name;type:varchar(255)" json:"name"` // 姓名
Username string `gorm:"column:username;type:varchar(100);not null;Index" json:"username"` // 用户名
Password string `gorm:"column:password;type:varchar(255);not null" json:"password"` // 密码
PasswordV *int32 `gorm:"column:passwordV;type:int;not null;default:1" json:"passwordV"` // 密码版本, 作用是改完密码让原来的token失效
HeadImg *string `gorm:"column:headImg;type:varchar(255)" json:"headImg"` // 头像
//Phone *string `gorm:"column:phone;type:varchar(20);index" json:"phone"` // 手机

View File

@@ -15,7 +15,11 @@ type Pet struct {
PlayerID uint32 `gorm:"not null;index:idx_pet_by_player_id;comment:'所属玩家ID'" json:"player_id"`
InBag int `gorm:"not null;comment:'是否在背包中'" json:"in_bag"` //"0为放入仓库1为放入背包
CatchTime uint32 `gorm:"not null;comment:'捕捉时间'" json:"catch_time"`
Data string `gorm:"type:text;not null;comment:'精灵全部数据'" json:"data"`
// Owner uint32 `struc:"skip"` //仅作为存储
// FreedTime uint32 `struc:"skip"` //放生时间
//是否可交易这里应该定义在精灵ID里
//是否上架
Data string `gorm:"type:text;not null;comment:'精灵全部数据'" json:"data"`
}
// * @param petTypeId 精灵类型ID
@@ -111,22 +115,23 @@ func GenPetInfo(id, individual, natureId, abilityTypeEnum, shinyid, level uint32
}
// 计算HP面板值无性格修正
func (c *PetInfo) CalculatePetHPPanelSize(base, iv, level, ev uint32) uint32 {
func (c *PetInfo) CalculatePetHPPanelSize(base, dv, level, ev uint32) uint32 {
// 实现具体计算逻辑,示例公式:(基础值 + 个体值) * 等级 / 100 + 等级 + 10 + 努力值/4
return (base+iv)*level/100 + level + 10 + ev/4
baseValue := (base*2 + ev/4 + 100 + dv) * (level/100 + 10)
return uint32(baseValue)
}
// 计算其他属性面板值(带性格修正)
func (c *PetInfo) CalculatePetPanelSize(base, iv, level, ev uint32, natureCorrect float64) uint32 {
func (c *PetInfo) CalculatePetPanelSize(base, dv, level, ev uint32, natureCorrect float64) uint32 {
// 实现具体计算逻辑,示例公式:((基础值 + 个体值) * 等级 / 100 + 5 + 努力值/4) * 性格修正
baseValue := (base+iv)*level/100 + 5 + ev/4
baseValue := (base*2 + ev/4 + dv) * (level/100 + 5)
return uint32(float64(baseValue) * natureCorrect)
}
// PetInfo 精灵信息结构(合并后的优化版本)
type PetInfo struct {
Owner uint32 `struc:"skip"` //仅作为存储
freedTime uint32 `struc:"skip"` //放生时间
// 精灵编号(@UInt long → uint32
ID uint32 `fieldDesc:"精灵编号" `

View File

@@ -11,6 +11,7 @@ const TableNameTask = "task"
type Task struct {
*cool.Model
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:text;not null;comment:'全部数据'" json:"data"`
}
@@ -18,8 +19,8 @@ type Task struct {
type TaskInfo struct {
// TaskInfo 任务步骤信息对应Java的@ArraySerialize(FIXED_LENGTH=20)注解
// struc:"[20]byte" 确保二进制序列化时固定20字节长度json标签指定JSON字段名
TaskID uint32 `json:"task_id"` //区分是每日任务还是常规任务,常规为0,每日为1
TaskInfo []uint32 `struc:"[20]byte" json:"task_info"`
//TaskID uint32 `json:"task_id"` //区分是每日任务还是常规任务,常规为0,每日为1
Info []uint32 `struc:"[20]byte" json:"task_info"`
//LastResetTime time.Time `gorm:"not null;comment:'上次重置时间UTC'" json:"last_reset_time"` //这里是每天重置
// Status 任务整体状态0-未接受1-已接受2-已完成未领取3-已完成已领取
// json标签指定JSON字段名与业务状态说明保持一致

View File

@@ -47,15 +47,26 @@ func (s *UserService) PetExec(ctime uint32, t func(uint32, model.PetInfo) model.
m1.Save(player)
}
func (s *UserService) PetAdd(ctime uint32, inbag int, y model.PetInfo) {
func (s *UserService) PetAdd(y model.PetInfo) {
m1 := cool.DBM(s.pet.Model).Where("player_id", s.userid)
var player model.Pet
player.PlayerID = s.userid
player.CatchTime = ctime
player.InBag = inbag
player.CatchTime = y.CatchTime
player.InBag = 1
tmp, _ := json.Marshal(y)
player.Data = string(tmp)
m1.Insert(player)
}
func (s *UserService) PetM(ctime, type1 int) model.PetInfo {
m1 := cool.DBM(s.pet.Model).Where("player_id", s.userid).Where("catch_time", ctime)
var player model.Pet
player.InBag = type1
m1.Update(player)
var tt model.PetInfo
json.Unmarshal([]byte(player.Data), &tt)
return tt
}

View File

@@ -45,12 +45,12 @@ func (s *UserService) Reg(nick string, color uint32) {
}
t.Data = string(t22)
_, err = cool.DBM(s.reg.Model).Data(t).FieldsEx("id").Insert()
_, err = cool.DBM(s.reg.Model).Data(t).Insert()
if err != nil {
glog.Error(context.Background(), err)
return
}
go s.InitTask()
//go s.InitTask()
}
func (s *UserService) Person() (ret *model.PlayerInfo) {

View File

@@ -35,30 +35,62 @@ func Exec[T cool.UserModel, F any](userid uint32, s *cool.Service, processFunc f
return false
}
func (s *UserService) InitTask() {
// func (s *UserService) InitTask() {
tt := model.NewTask()
tt.PlayerID = uint64(s.userid)
// tt := model.NewTask()
// tt.PlayerID = uint64(s.userid)
var ggg []model.TaskInfo
// var ggg []model.TaskInfo
for i := 0; i < 500; i++ {
ggg = append(ggg, model.TaskInfo{
TaskID: (uint32(i)),
TaskInfo: make([]uint32, 0),
})
// for i := 0; i < 500; i++ {
// ggg = append(ggg, model.TaskInfo{
// //TaskID: (uint32(i)),
// TaskIinnfo: make([]uint32, 0),
// })
// }
// ffgg, _ := json.Marshal(ggg)
// tt.Data = string(ffgg)
// _, err := cool.DBM(s.task.Model).Data(tt).FieldsEx("id").Insert()
// if err != nil {
// panic(err)
// }
// //panic(err)
// }
// 获取任务信息
func (s *UserService) TaskInfo(id uint32) (ret model.TaskInfo, ok bool) {
var gg model.Task
m1 := cool.DBM(s.task.Model).Where("player_id", s.userid)
m1.Scan(&gg)
if gg.TaskID == 0 {
return ret, false
}
ffgg, _ := json.Marshal(ggg)
tt.Data = string(ffgg)
_, err := cool.DBM(s.task.Model).Data(tt).FieldsEx("id").Insert()
if err != nil {
panic(err)
}
//panic(err)
json.Unmarshal([]byte(gg.Data), &ret)
return ret, true
}
func (s *UserService) TaskSet(id uint32, ret model.TaskInfo) {
var gg model.Task
tt, _ := json.Marshal(&ret)
gg.Data = string(tt)
//gg.TaskID = id
cool.DBM(s.task.Model).Where("player_id", s.userid).Where("task_id", id).Update(gg)
}
func (s *UserService) TaskExec(t func([]model.TaskInfo) []model.TaskInfo, isdaliy bool) (ret bool) {
func (s *UserService) TaskADD(id uint32, ret model.TaskInfo) {
var gg model.Task
tt, _ := json.Marshal(&ret)
gg.Data = string(tt)
gg.TaskID = id
cool.DBM(s.task.Model).Where("player_id", s.userid).Insert()
}
func (s *UserService) TaskExec(t func([]model.TaskInfo) []model.TaskInfo) (ret bool) {
//待实现检测是否为每日任务
// if isdaliy {