This commit is contained in:
@@ -29,9 +29,9 @@ type Cmd struct {
|
|||||||
|
|
||||||
var CmdCache = make(map[uint32]Cmd, 0)
|
var CmdCache = make(map[uint32]Cmd, 0)
|
||||||
var (
|
var (
|
||||||
Logger = glog.New()
|
Logger = glog.New()
|
||||||
Cron = cronex.New() //时间轮
|
Cron = cronex.New() //时间轮
|
||||||
|
Connected int64
|
||||||
)
|
)
|
||||||
var Filter *sensitive.Manager
|
var Filter *sensitive.Manager
|
||||||
var DefaultGenerator = utils.NewGen(time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), uint8(Config.GameOnlineID))
|
var DefaultGenerator = utils.NewGen(time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), uint8(Config.GameOnlineID))
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ func (s *Server) OnClose(c gnet.Conn, err error) (action gnet.Action) {
|
|||||||
// // go s.tempBlockIP(remoteIP, 5*time.Minute)
|
// // go s.tempBlockIP(remoteIP, 5*time.Minute)
|
||||||
// }
|
// }
|
||||||
//fmt.Println(err, c.RemoteAddr().String(), "断开连接")
|
//fmt.Println(err, c.RemoteAddr().String(), "断开连接")
|
||||||
atomic.AddInt64(&s.connected, -1)
|
atomic.AddInt64(&cool.Connected, -1)
|
||||||
|
|
||||||
//logging.Infof("conn[%v] disconnected", c.RemoteAddr().String())
|
//logging.Infof("conn[%v] disconnected", c.RemoteAddr().String())
|
||||||
v, _ := c.Context().(*player.ClientData)
|
v, _ := c.Context().(*player.ClientData)
|
||||||
@@ -97,7 +97,7 @@ func (s *Server) OnClose(c gnet.Conn, err error) (action gnet.Action) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
func (s *Server) OnTick() (delay time.Duration, action gnet.Action) {
|
func (s *Server) OnTick() (delay time.Duration, action gnet.Action) {
|
||||||
g.Log().Async().Info(context.Background(), gtime.Now().ISO8601(), "服务器ID", cool.Config.ServerInfo.OnlineID, "链接数", atomic.LoadInt64(&s.connected))
|
g.Log().Async().Info(context.Background(), gtime.Now().ISO8601(), "服务器ID", cool.Config.ServerInfo.OnlineID, "链接数", atomic.LoadInt64(&cool.Connected))
|
||||||
// if s.quit && atomic.LoadInt64(&s.connected) == 0 {
|
// if s.quit && atomic.LoadInt64(&s.connected) == 0 {
|
||||||
// //执行正常退出逻辑
|
// //执行正常退出逻辑
|
||||||
// os.Exit(0)
|
// os.Exit(0)
|
||||||
@@ -120,7 +120,7 @@ func (s *Server) OnOpen(conn gnet.Conn) (out []byte, action gnet.Action) {
|
|||||||
conn.SetContext(player.NewClientData(conn)) //注入data
|
conn.SetContext(player.NewClientData(conn)) //注入data
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic.AddInt64(&s.connected, 1)
|
atomic.AddInt64(&cool.Connected, 1)
|
||||||
|
|
||||||
return nil, gnet.None
|
return nil, gnet.None
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ type Handler interface {
|
|||||||
}
|
}
|
||||||
type Server struct {
|
type Server struct {
|
||||||
gnet.BuiltinEventEngine
|
gnet.BuiltinEventEngine
|
||||||
eng gnet.Engine
|
eng gnet.Engine
|
||||||
addr string
|
addr string
|
||||||
connected int64
|
|
||||||
network string
|
network string
|
||||||
multicore bool
|
multicore bool
|
||||||
bufferSize int
|
bufferSize int
|
||||||
|
|||||||
@@ -81,8 +81,13 @@ func (Controller) PlayerFightBoss(data *fight.ChallengeBossInboundInfo, p *playe
|
|||||||
|
|
||||||
for i, bm := range bc.BossMon {
|
for i, bm := range bc.BossMon {
|
||||||
|
|
||||||
|
dv := 24
|
||||||
|
if bc.BossCatchable == 1 {
|
||||||
|
dv = -1
|
||||||
|
}
|
||||||
|
|
||||||
monster = model.GenPetInfo(
|
monster = model.GenPetInfo(
|
||||||
gconv.Int(processMonID(bm.MonID)), 24, //24个体
|
gconv.Int(processMonID(bm.MonID)), dv, //24个体
|
||||||
-1,
|
-1,
|
||||||
0, //野怪没特性
|
0, //野怪没特性
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ package controller
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"blazing/common/socket/errorcode"
|
"blazing/common/socket/errorcode"
|
||||||
|
"blazing/cool"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
"blazing/logic/service/fight"
|
"blazing/logic/service/fight"
|
||||||
"blazing/logic/service/fight/info"
|
"blazing/logic/service/fight/info"
|
||||||
|
"blazing/logic/service/pet"
|
||||||
"blazing/logic/service/player"
|
"blazing/logic/service/player"
|
||||||
"blazing/logic/service/space"
|
"blazing/logic/service/space"
|
||||||
)
|
)
|
||||||
@@ -76,12 +78,22 @@ func (h Controller) ArenaFightOwner(data *fight.ARENA_FIGHT_OWENR, c *player.Pla
|
|||||||
}
|
}
|
||||||
|
|
||||||
if foi.Reason == 0 { //正常获胜
|
if foi.Reason == 0 { //正常获胜
|
||||||
|
addev := int64(int(1) * int(cool.Connected) * int(c.GetSpace().Owner.HostWins))
|
||||||
if foi.WinnerId == c.GetInfo().UserID {
|
if foi.WinnerId == c.GetInfo().UserID {
|
||||||
c.Info.MaxArenaWins += 1
|
c.Info.MaxArenaWins += 1
|
||||||
|
c.Info.EVPool += addev
|
||||||
|
|
||||||
|
c.SendPackCmd(50001, &pet.S2C_50001{
|
||||||
|
UseEV: int32(addev),
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
c.GetSpace().Owner.ARENA_Player.GetInfo().MaxArenaWins += 1
|
c.GetSpace().Owner.ARENA_Player.GetInfo().MaxArenaWins += 1
|
||||||
//这里给经验
|
|
||||||
|
c.GetSpace().Owner.ARENA_Player.GetInfo().EVPool += addev
|
||||||
|
|
||||||
|
c.GetSpace().Owner.ARENA_Player.SendPackCmd(50001, &pet.S2C_50001{
|
||||||
|
UseEV: int32(addev),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,6 @@ func (h Controller) PetEVDiy(data *pet.PetEV, c *player.Player) (result *pet.S2C
|
|||||||
c.Info.EVPool -= int64(usedEV)
|
c.Info.EVPool -= int64(usedEV)
|
||||||
|
|
||||||
result = &pet.S2C_50001{}
|
result = &pet.S2C_50001{}
|
||||||
result.UseEV = usedEV
|
result.UseEV = -int32(usedEV)
|
||||||
return result, 0
|
return result, 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"blazing/logic/service/player"
|
"blazing/logic/service/player"
|
||||||
"blazing/modules/player/model"
|
"blazing/modules/player/model"
|
||||||
|
|
||||||
|
"github.com/pointernil/bitset32"
|
||||||
"github.com/samber/lo"
|
"github.com/samber/lo"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,10 +16,15 @@ func (h Controller) IsCollect(
|
|||||||
ID: data.Type,
|
ID: data.Type,
|
||||||
}
|
}
|
||||||
|
|
||||||
res := c.Info.GetTask(1335 + int(data.Type)) //第一期
|
c.Service.Task.Exec(uint32(1335), func(te *model.Task) bool {
|
||||||
if res == model.Completed {
|
|
||||||
result.IsCom = 1
|
r := bitset32.From(te.Data)
|
||||||
}
|
// 分支未完成时,标记完成并发放奖励
|
||||||
|
if r.Test(uint(data.Type)) {
|
||||||
|
result.IsCom = 1
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
return result, 0
|
return result, 0
|
||||||
|
|
||||||
@@ -26,18 +32,30 @@ func (h Controller) IsCollect(
|
|||||||
|
|
||||||
// 定义 Type 与合法 ID 集合的映射表,集中管理所有规则
|
// 定义 Type 与合法 ID 集合的映射表,集中管理所有规则
|
||||||
var validTypeIDMap = map[int][]uint32{
|
var validTypeIDMap = map[int][]uint32{
|
||||||
1: {1, 4, 7}, // Type1:合法ID为1、4、7
|
1: {1, 4, 7}, // Type1:合法ID为1、4、7
|
||||||
2: {71}, // Type2:合法ID为71
|
2: {71}, // Type2:合法ID为71
|
||||||
3: {275}, // Type3:合法ID为275
|
3: {275}, // Type3:合法ID为275
|
||||||
4: {669}, // Type4:合法ID为669(注:你之前提到的是670,确认是否笔误)
|
4: {669}, // Type4:合法ID为669(注:你之前提到的是670,确认是否笔误)
|
||||||
301: {1, 4, 7}, //精灵王计划
|
301: {1, 4, 7}, //精灵王计划
|
||||||
|
100: {856, 857, 858}, //测试
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h Controller) Collect(
|
func (h Controller) Collect(
|
||||||
data *pet.C2S_PET_COLLECT, c *player.Player) (result *pet.S2C_PET_COLLECT, err errorcode.ErrorCode) { //这个时候player应该是空的
|
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}
|
result = &pet.S2C_PET_COLLECT{ID: data.ID}
|
||||||
res := c.Info.GetTask(1335 + int(data.Type)) //第一期
|
res := c.Info.GetTask(1335 + int(data.Type)) //第一期
|
||||||
if res != model.Unaccepted {
|
_, ok := lo.Find([]uint32{1, 2, 3, 4, 301}, func(item uint32) bool {
|
||||||
|
return data.Type == item
|
||||||
|
})
|
||||||
|
if res == model.Completed && ok { //这块是为了兼容旧版本
|
||||||
|
c.Service.Task.Exec(uint32(1335), func(te *model.Task) bool {
|
||||||
|
|
||||||
|
r := bitset32.From(te.Data)
|
||||||
|
|
||||||
|
r.Set(uint(data.Type))
|
||||||
|
te.Data = r.Bytes()
|
||||||
|
return true
|
||||||
|
})
|
||||||
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError)
|
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,11 +69,25 @@ func (h Controller) Collect(
|
|||||||
if !lo.Contains(validIDs, data.ID) {
|
if !lo.Contains(validIDs, data.ID) {
|
||||||
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError)
|
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError)
|
||||||
}
|
}
|
||||||
|
c.Service.Task.Exec(uint32(1335), func(te *model.Task) bool {
|
||||||
|
|
||||||
c.Info.SetTask(1335+int(data.Type), model.Completed)
|
r := bitset32.From(te.Data)
|
||||||
r := model.GenPetInfo(int(data.ID), -1, -1, 0, 1, nil, 0)
|
// 分支未完成时,标记完成并发放奖励
|
||||||
c.Service.Pet.PetAdd(r)
|
if !r.Test(uint(data.Type)) {
|
||||||
result.CatchTime = r.CatchTime
|
r.Set(uint(data.Type))
|
||||||
|
te.Data = r.Bytes()
|
||||||
|
r := model.GenPetInfo(int(data.ID), -1, -1, 0, 1, nil, 0)
|
||||||
|
c.Service.Pet.PetAdd(r)
|
||||||
|
result.CatchTime = r.CatchTime
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
if result.CatchTime == 0 {
|
||||||
|
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrAwardAlreadyClaimed)
|
||||||
|
}
|
||||||
|
|
||||||
return result, 0
|
return result, 0
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ func (h Controller) AcceptTask(data *task.AcceptTaskInboundInfo, c *player.Playe
|
|||||||
}
|
}
|
||||||
|
|
||||||
c.Info.SetTask(int(data.TaskId), model.Accepted)
|
c.Info.SetTask(int(data.TaskId), model.Accepted)
|
||||||
c.Service.Task.Exec(uint32(data.TaskId), func(t *model.TaskEX) bool {
|
c.Service.Task.Exec(uint32(data.TaskId), func(t *model.Task) bool {
|
||||||
t.Data = []uint32{}
|
t.Data = []uint32{}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@@ -48,7 +48,7 @@ func (h Controller) AddTaskBuf(data *task.AddTaskBufInboundInfo, c *player.Playe
|
|||||||
if c.Info.GetTask(int(data.TaskId)) != model.Accepted {
|
if c.Info.GetTask(int(data.TaskId)) != model.Accepted {
|
||||||
return result, errorcode.ErrorCodes.ErrAwardAlreadyClaimed
|
return result, errorcode.ErrorCodes.ErrAwardAlreadyClaimed
|
||||||
}
|
}
|
||||||
c.Service.Task.Exec(data.TaskId, func(taskEx *model.TaskEX) bool {
|
c.Service.Task.Exec(data.TaskId, func(taskEx *model.Task) bool {
|
||||||
taskEx.Data = data.TaskList
|
taskEx.Data = data.TaskList
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
@@ -105,7 +105,7 @@ func (h Controller) GetTaskBuf(data *task.GetTaskBufInboundInfo, c *player.Playe
|
|||||||
result = &task.GetTaskBufOutboundInfo{
|
result = &task.GetTaskBufOutboundInfo{
|
||||||
TaskId: data.TaskId,
|
TaskId: data.TaskId,
|
||||||
}
|
}
|
||||||
c.Service.Task.Exec(data.TaskId, func(te *model.TaskEX) bool {
|
c.Service.Task.Exec(data.TaskId, func(te *model.Task) bool {
|
||||||
|
|
||||||
result.TaskList = te.Data
|
result.TaskList = te.Data
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ type PetEV struct {
|
|||||||
EVs [6]uint32 `description:"属性" codec:"evs"`
|
EVs [6]uint32 `description:"属性" codec:"evs"`
|
||||||
}
|
}
|
||||||
type S2C_50001 struct {
|
type S2C_50001 struct {
|
||||||
UseEV uint32 //用掉的学习力
|
UseEV int32 //用掉的学习力
|
||||||
}
|
}
|
||||||
type S2C_9756 struct {
|
type S2C_9756 struct {
|
||||||
UseEV uint32 //用掉的学习力
|
UseEV uint32 //用掉的学习力
|
||||||
|
|||||||
@@ -56,11 +56,7 @@ func (p *Player) TawerCompletedTask(taskID int, ot int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 处理指定分支(ot):仅奖励存在时才标记分支完成并发奖
|
// 处理指定分支(ot):仅奖励存在时才标记分支完成并发奖
|
||||||
p.Service.Task.Exec(uint32(taskID), func(te *model.TaskEX) bool {
|
p.Service.Task.Exec(uint32(taskID), func(te *model.Task) bool {
|
||||||
// 防御性检查:避免空指针
|
|
||||||
if te == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// 核心检查:指定分支的奖励是否存在
|
// 核心检查:指定分支的奖励是否存在
|
||||||
branchGift := p.getTaskGift(taskID, ot)
|
branchGift := p.getTaskGift(taskID, ot)
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ func NewItemService() *ItemService {
|
|||||||
Model: model.NewItemGift(),
|
Model: model.NewItemGift(),
|
||||||
PageQueryOp: &cool.QueryOp{
|
PageQueryOp: &cool.QueryOp{
|
||||||
KeyWordField: []string{"remark"},
|
KeyWordField: []string{"remark"},
|
||||||
|
FieldEQ: []string{"is_egg"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ func NewPetRewardService() *PetRewardService {
|
|||||||
return &PetRewardService{
|
return &PetRewardService{
|
||||||
&cool.Service{
|
&cool.Service{
|
||||||
Model: model.NewPetReward(),
|
Model: model.NewPetReward(),
|
||||||
|
|
||||||
|
PageQueryOp: &cool.QueryOp{
|
||||||
|
|
||||||
|
FieldEQ: []string{"is_egg", "is_light"},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,12 +40,15 @@ func (c *TitleController) Get(ctx context.Context, req *GetReq) (res *cool.BaseR
|
|||||||
alltitile := service.NewUserService(uint32(admin.UserId)).Title.Get()
|
alltitile := service.NewUserService(uint32(admin.UserId)).Title.Get()
|
||||||
titles := dict.NewDictInfoService().GetData("achieve")
|
titles := dict.NewDictInfoService().GetData("achieve")
|
||||||
for _, v := range alltitile {
|
for _, v := range alltitile {
|
||||||
ret = append(ret, TitleRes{
|
tt := TitleRes{
|
||||||
|
|
||||||
ID: v,
|
ID: v,
|
||||||
Name: titles[v].Name,
|
Name: titles[v].Name,
|
||||||
Desc: *titles[v].Remark,
|
}
|
||||||
})
|
if titles[v].Remark != nil {
|
||||||
|
tt.Desc = *titles[v].Remark
|
||||||
|
}
|
||||||
|
ret = append(ret, tt)
|
||||||
}
|
}
|
||||||
|
|
||||||
res.Data = ret
|
res.Data = ret
|
||||||
|
|||||||
@@ -10,20 +10,12 @@ const TableNameTask = "player_task"
|
|||||||
// Task mapped from table <task>
|
// Task mapped from table <task>
|
||||||
type Task struct {
|
type Task struct {
|
||||||
Base
|
Base
|
||||||
PlayerID uint64 `gorm:"not null;index:idx_task_by_player_id;comment:'所属玩家ID'" json:"player_id"`
|
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"`
|
TaskID uint32 `gorm:"not null;comment:'任务ID'" json:"task_id"`
|
||||||
Data string `gorm:"type:jsonb;not null;comment:'全部数据'" json:"data"`
|
Data []uint32 `struc:"[20]byte" gorm:"type:jsonb;not null;default:'[]';comment:'全部数据'" json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// TaskEX 单个任务的详细信息,包含任务步骤状态和整体状态
|
// TaskEX 单个任务的详细信息,包含任务步骤状态和整体状态
|
||||||
type TaskEX struct {
|
|
||||||
Task
|
|
||||||
Data []uint32 `struc:"[20]byte" orm:"data" json:"data"`
|
|
||||||
//LastResetTime time.Time `gorm:"not null;comment:'上次重置时间(UTC)'" json:"last_reset_time"` //这里是每天重置
|
|
||||||
// Status 任务整体状态:0-未接受,1-已接受,2-已完成未领取,3-已完成已领取
|
|
||||||
// json标签指定JSON字段名,与业务状态说明保持一致
|
|
||||||
//Status byte `json:"status"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TableName PlayerInfo's table name
|
// TableName PlayerInfo's table name
|
||||||
func (*Task) TableName() string {
|
func (*Task) TableName() string {
|
||||||
@@ -35,13 +27,6 @@ func (*Task) GroupName() string {
|
|||||||
return "default"
|
return "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Task) GetData() string {
|
|
||||||
return t.Data
|
|
||||||
}
|
|
||||||
func (t *Task) SetData(t1 string) {
|
|
||||||
t.Data = t1
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewPlayerInfo create a new PlayerInfo
|
// NewPlayerInfo create a new PlayerInfo
|
||||||
func NewTask() *Task {
|
func NewTask() *Task {
|
||||||
return &Task{
|
return &Task{
|
||||||
|
|||||||
@@ -9,11 +9,15 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// 获取任务信息
|
// 获取任务信息
|
||||||
func (s *TaskService) Exec(id uint32, t func(*model.TaskEX) bool) {
|
func (s *TaskService) Exec(id uint32, t func(*model.Task) bool) {
|
||||||
var gg model.TaskEX
|
var gg model.Task
|
||||||
|
|
||||||
m1 := s.dbm(s.Model).Where("task_id", id)
|
m1 := s.dbm(s.Model).Where("task_id", id)
|
||||||
|
|
||||||
m1.Scan(&gg)
|
m1.Scan(&gg)
|
||||||
|
if gg.Data == nil {
|
||||||
|
gg.Data = make([]uint32, 0)
|
||||||
|
}
|
||||||
tre := t(&gg)
|
tre := t(&gg)
|
||||||
|
|
||||||
if !tre { //不需要更新
|
if !tre { //不需要更新
|
||||||
|
|||||||
Reference in New Issue
Block a user