diff --git a/logic/controller/controller.go b/logic/controller/controller.go index 8a40aa256..d49462525 100644 --- a/logic/controller/controller.go +++ b/logic/controller/controller.go @@ -65,7 +65,7 @@ func NewController() *Controller { return &Controller{} } -func parseCmd[T any](a T, data []byte) T { +func ParseCmd[T any](a T, data []byte) T { // := info.NewLoginSidInfo() struc.Unpack(bytes.NewBuffer(data), &a) return a diff --git a/logic/controller/map.go b/logic/controller/map.go index d4866aa8f..b3cf61844 100644 --- a/logic/controller/map.go +++ b/logic/controller/map.go @@ -8,6 +8,7 @@ import ( "blazing/logic/service/maps" "blazing/logic/service/space" mservice "blazing/modules/blazing/service" + "math/rand" "time" ) @@ -31,7 +32,15 @@ func (h *Controller) MapEnter(data *maps.InInfo, c *entity.Player) (result *maps // 启动刷怪协程 go func(stopChan chan struct{}, currentMap int) { - ticker := time.NewTicker(5 * time.Second) + + time.After(5 * time.Second) + // 首次刷新 + if !c.IsFighting && c.MapId != 0 { + spawnMonsters(c) + } + //循环刷新怪物 + + ticker := time.NewTicker(10 * time.Second) defer ticker.Stop() for { @@ -103,29 +112,24 @@ func spawnMonsters(c *entity.Player) { // 创建数据包 tt := handler.NewTomeeHeader(2004, c.UserID) - t1 := genMonster(c.MapId) + t1 := genMonster(c.MapId, generateThreeUniqueNumbers()) c.SendPack(tt.Pack(&t1)) } -func genMonster(id uint32) maps.OgreInfo { +// 应该根据怪物信息决定后端生成 +func genMonster(mapid uint32, wz [3]int) maps.OgreInfo { // 设置怪物信息 t1 := maps.OgreInfo{} - var localMenu = make([]int, 0) - for i := 7; i <= 448; i++ { - if bitsCount(i) == 3 { - localMenu = append(localMenu, i) - } - } for i := 0; i < 3; i++ { ttt := maps.OgrePetInfo{} - ttt.Id = mservice.NewMonsterService().GetId(id) + ttt.Id = mservice.NewMonsterService().GetId(mapid) //待修改成xml获取 - ttt.Shiny = uint32(i + 1) + ttt.Shiny = uint32(i + 1) //异色概率,待实现自定义 //t1.Data[i] = mservice.NewMonsterService().GetId(c.MapId) - t1.Data[i] = ttt + t1.Data[wz[i]] = ttt } return t1 @@ -140,3 +144,50 @@ func bitsCount(n int) int { } return count } + +// 生成0-9之间三个不重复的随机数 进地图5s +func generateThreeUniqueNumbers() [3]int { + rand.Seed(time.Now().UnixNano()) + selected := make(map[int]bool) + var result [3]int + index := 0 + + for index < 3 { + num := rand.Intn(10) + if !selected[num] { + selected[num] = true + result[index] = num + index++ + } + } + return result +} + +// 从三个数字中移除一个,并从剩余6个数字中选一个补充 10s +func replaceOneNumber(original [3]int) ([3]int, int, int) { + // 随机选择要移除的索引(0-2) + removeIndex := rand.Intn(3) + removedNum := original[removeIndex] + + // 找出所有不在原始数组中的数字(候选数字) + candidates := []int{} + originalMap := make(map[int]bool) + for _, num := range original { + originalMap[num] = true + } + + for i := 0; i < 10; i++ { + if !originalMap[i] { + candidates = append(candidates, i) + } + } + + // 从候选数字中随机选择一个 + newNum := candidates[rand.Intn(len(candidates))] + + // 创建新数组并替换数字 + newNumbers := original + newNumbers[removeIndex] = newNum + + return newNumbers, removedNum, newNum +} diff --git a/logic/controller/task.go b/logic/controller/task.go new file mode 100644 index 000000000..4054928d3 --- /dev/null +++ b/logic/controller/task.go @@ -0,0 +1,32 @@ +package controller + +import ( + "blazing/common/data/entity" + "blazing/common/socket/errorcode" + "blazing/logic/service/task" + "blazing/modules/blazing/model" + "blazing/modules/blazing/service" +) + +/** + * 接受任务 + */ +func (h Controller) AcceptTask(data *task.AcceptTaskInboundInfo, c *entity.Player) (result *task.AcceptTaskOutboundInfo, err errorcode.ErrorCode) { + + result = &task.AcceptTaskOutboundInfo{} + result.TaskId = data.TaskId + + service.NewTaskService(c.UserID).AcceptTask(data.TaskId) + + return result, 0 +} + +/** + * 更新任务步骤 + */ +func (h Controller) AddTaskBuf(data *task.AddTaskBufInboundInfo, c *entity.Player) (result *task.AddTaskBufOutboundInfo, err errorcode.ErrorCode) { + + service.NewTaskService(c.UserID).AddTaskBuf(data.TaskId, model.TaskInfo{TaskInfo: data.TaskList, Status: 0}) + + return &task.AddTaskBufOutboundInfo{}, 0 +} diff --git a/logic/service/task/AcceptTask.go b/logic/service/task/AcceptTask.go index 91f68a756..ea6d66f4c 100644 --- a/logic/service/task/AcceptTask.go +++ b/logic/service/task/AcceptTask.go @@ -8,6 +8,7 @@ type AcceptTaskInboundInfo struct { Head handler.TomeeHeader `cmd:"2201" struc:"[0]pad"` TaskId uint32 `json:"taskId" description:"任务ID"` // 任务ID,对应Java的@UInt long } + type AcceptTaskOutboundInfo struct { TaskId uint32 `json:"taskId" description:"任务ID"` // 任务ID,对应Java的@UInt long } diff --git a/logic/service/task/AddTask.go b/logic/service/task/AddTask.go index 7cea155eb..a1d5b254b 100644 --- a/logic/service/task/AddTask.go +++ b/logic/service/task/AddTask.go @@ -6,8 +6,8 @@ import "blazing/common/socket/handler" // 用于接收添加任务缓冲区的入站信息 type AddTaskBufInboundInfo struct { Head handler.TomeeHeader `cmd:"2204" struc:"[0]pad"` - TaskId uint32 `json:"taskId" description:"任务ID"` // 任务ID,对应Java的@UInt long - TaskList []byte `json:"taskList" description:"任务步骤信息" arraySerialize:"fixedLength=20"` // 任务步骤信息,对应Java的@ArraySerialize注解 + TaskId uint32 `json:"taskId" description:"任务ID"` // 任务ID,对应Java的@UInt long + TaskList []uint32 `struc:"[20]byte"` // 任务步骤信息,对应Java的@ArraySerialize注解 } type AddTaskBufOutboundInfo struct { // 该结构体没有字段,对应Java中的空类 diff --git a/login/main.go b/login/main.go index 7996f66a2..15299e686 100644 --- a/login/main.go +++ b/login/main.go @@ -19,11 +19,14 @@ import ( _ "blazing/modules" - "github.com/gogf/gf/v2/os/gctx" - + "blazing/logic/service/task" "blazing/login/internal/cmd" + + "github.com/gogf/gf/v2/os/gctx" ) +var tt task.GetTaskBufOutboundInfo + func main() { cmd.Main.Run(gctx.New()) diff --git a/modules/blazing/model/task.go b/modules/blazing/model/task.go index 0c3b4f2ff..9c4a74193 100644 --- a/modules/blazing/model/task.go +++ b/modules/blazing/model/task.go @@ -1 +1,44 @@ -package model \ No newline at end of file +package model + +import "blazing/cool" + +const TableNameTask = "task" + +// Task mapped from table +type Task struct { + *cool.Model + PlayerID uint64 `gorm:"not null;index:idx_task_by_player_id;comment:'所属玩家ID'" json:"player_id"` + Data string `gorm:"type:text;not null;comment:'全部数据'" json:"data"` +} + +// TaskInfo 单个任务的详细信息,包含任务步骤状态和整体状态 +type TaskInfo struct { + // TaskInfo 任务步骤信息,对应Java的@ArraySerialize(FIXED_LENGTH=20)注解 + // struc:"[20]byte" 确保二进制序列化时固定20字节长度,json标签指定JSON字段名 + TaskInfo []uint32 `struc:"[20]byte" json:"task_info"` + // Status 任务整体状态:0-未接受,1-已接受,2-已完成未领取,3-已完成已领取 + // json标签指定JSON字段名,与业务状态说明保持一致 + Status byte `json:"status"` +} + +// TableName PlayerInfo's table name +func (*Task) TableName() string { + return TableNamePlayerInfo +} + +// GroupName PlayerInfo's table group +func (*Task) GroupName() string { + return "default" +} + +// NewPlayerInfo create a new PlayerInfo +func NewTask() *Task { + return &Task{ + Model: cool.NewModel(), + } +} + +// init 创建表 +func init() { + cool.CreateTable(&Task{}) +} diff --git a/modules/blazing/service/isreg.go b/modules/blazing/service/reg.go similarity index 100% rename from modules/blazing/service/isreg.go rename to modules/blazing/service/reg.go diff --git a/modules/blazing/service/task.go b/modules/blazing/service/task.go new file mode 100644 index 000000000..6dc4e32b2 --- /dev/null +++ b/modules/blazing/service/task.go @@ -0,0 +1,104 @@ +package service + +import ( + "blazing/cool" + "blazing/modules/blazing/model" + "encoding/json" +) + +type TaskService struct { + *UserService +} + +func NewTaskService(id uint32) *TaskService { + return &TaskService{ + &UserService{ + userid: id, + Service: &cool.Service{ + Model: model.NewTask(), + }, + }, + } +} +func (s *TaskService) Exec(t func(map[uint32]model.TaskInfo) bool) (ret bool) { + var tt model.Task + s.GetModel().Scan(&tt) + var ttt map[uint32]model.TaskInfo + json.Unmarshal([]byte(tt.Data), &ttt) + ret = t(ttt) + t1, _ := json.Marshal(&ttt) + tt.Data = string(t1) + s.GetModel().Save(&tt) //退出时保存 + return +} +func (s *TaskService) AcceptTask(task uint32) (ret bool) { + + s.Exec(func(ttt map[uint32]model.TaskInfo) bool { + ft, ok := ttt[task] + if ok { //如果找到任务 + if ft.Status == 0 { //可以接受 + ft.Status = 1 + return true + } else { + return false + } + } else { + ttt[task] = model.TaskInfo{ + Status: 1, + } + + } + + return false + }) + + return ret +} + +/** + * 更新任务步骤 + */ +func (s *TaskService) AddTaskBuf(task uint32, info model.TaskInfo) bool { + + return s.Exec(func(ttt map[uint32]model.TaskInfo) bool { + if conditions, ok := ttt[task]; ok { + conditions.TaskInfo = info.TaskInfo + ttt[task] = conditions + return true + } + + return false + }) + +} + +/** + * 完成任务 + */ +func (s *TaskService) CompleteTask(task uint32) bool { + + return s.Exec(func(ttt map[uint32]model.TaskInfo) bool { + if conditions, ok := ttt[task]; ok { + conditions.Status = 3 + ttt[task] = conditions + + } + + return false + }) +} + +/** + * 校验任务是否已经完成 + */ +func (s *TaskService) CheckTaskCompleted(task uint32) bool { + + return s.Exec(func(ttt map[uint32]model.TaskInfo) bool { + if conditions, ok := ttt[task]; ok { + + return conditions.Status == 3 + } + + return false + }) +} diff --git a/modules/blazing/service/user.go b/modules/blazing/service/user.go new file mode 100644 index 000000000..5a1a6d6c8 --- /dev/null +++ b/modules/blazing/service/user.go @@ -0,0 +1,31 @@ +package service + +import ( + "blazing/cool" + "blazing/modules/blazing/model" + "encoding/json" + + "github.com/gogf/gf/v2/database/gdb" +) + +type UserService struct { + userid uint32 + + *cool.Service +} + +func (s *UserService) GetModel() *gdb.Model { + + return cool.DBM(s.Model).Where("player_id", s.userid) + +} +func (s *UserService) Exec(t func(map[uint32]model.TaskInfo) bool) { + var tt model.Task + s.GetModel().Scan(&tt) + var ttt map[uint32]model.TaskInfo + json.Unmarshal([]byte(tt.Data), &ttt) + t(ttt) + t1, _ := json.Marshal(&ttt) + tt.Data = string(t1) + s.GetModel().Save(&tt) //退出时保存 +}