```
feat(fight): 添加 BOSS 战斗逻辑与地图交互功能 - 在 fight_boss.go 中增加对 BOSS 血量是否为 0 的判断,避免无效赋值 - 在 map.go 中移除旧的测试代码,并将 Canmon 状态设置移至 MapList 方法中 - 新增 Attack_Boss 接口方法用于处理玩家攻击 BOSS 请求 - 修改 MapBossInfo 结构体字段类型
This commit is contained in:
@@ -1,11 +1,14 @@
|
||||
package space
|
||||
|
||||
import (
|
||||
"blazing/cool"
|
||||
"blazing/logic/service/common"
|
||||
"blazing/logic/service/maps/info"
|
||||
maps "blazing/logic/service/maps/info"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/util/grand"
|
||||
"github.com/jinzhu/copier"
|
||||
"github.com/panjf2000/ants/v2"
|
||||
"golang.org/x/time/rate"
|
||||
@@ -24,6 +27,8 @@ func (s *Space) Broadcast(c common.PlayerI, cmd uint32, data any) {
|
||||
v.SendPackCmd(cmd, data)
|
||||
|
||||
}
|
||||
} else {
|
||||
v.SendPackCmd(cmd, data)
|
||||
}
|
||||
|
||||
return false
|
||||
@@ -89,3 +94,82 @@ func (s *Space) Walk(c common.PlayerI, info *info.WalkOutInfo) {
|
||||
s.Broadcast(c, 2101, info)
|
||||
|
||||
}
|
||||
func (s *Space) gettimeboss(mapid uint32) {
|
||||
var t info.MapBossSInfo
|
||||
t.INFO = append(t.INFO, s.MapBossInfo)
|
||||
switch mapid {
|
||||
case 12:
|
||||
|
||||
s.MapBossInfo = info.MapBossInfo{
|
||||
Id: 47,
|
||||
|
||||
Hp: 10,
|
||||
}
|
||||
|
||||
cool.Cron.ScheduleFunc(10*time.Second, func() {
|
||||
s.MapBossInfo.Pos = (grand.Intn(4) + 1 + s.MapBossInfo.Pos) % 5
|
||||
println("pos", s.MapBossInfo.Pos, "hp", s.MapBossInfo.Hp)
|
||||
|
||||
t.INFO[0] = s.MapBossInfo
|
||||
s.Broadcast(nil, 2021, &t)
|
||||
|
||||
})
|
||||
cool.Cron.ScheduleFunc(300*time.Second, func() {
|
||||
|
||||
atomic.StoreInt32(&s.MapBossInfo.Hp, 10)
|
||||
|
||||
})
|
||||
|
||||
case 32:
|
||||
|
||||
s.MapBossInfo = info.MapBossInfo{
|
||||
Id: 70,
|
||||
}
|
||||
|
||||
cool.Cron.CustomFunc(s, func() {
|
||||
|
||||
r := grand.Intn(3)
|
||||
s.Broadcast(nil, 50004, &info.S2C_50004{Id: uint32(r)})
|
||||
if r == 1 {
|
||||
s.MapBossInfo.Id = 70
|
||||
t.INFO[0] = s.MapBossInfo
|
||||
|
||||
s.Broadcast(nil, 2021, &t)
|
||||
} else {
|
||||
s.MapBossInfo.Id = 0
|
||||
t.INFO[0] = s.MapBossInfo
|
||||
s.Broadcast(nil, 2021, &t)
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
case 108:
|
||||
s.MapBossInfo = info.MapBossInfo{
|
||||
Id: 219,
|
||||
}
|
||||
|
||||
cool.Cron.ScheduleFunc(10*time.Second, func() {
|
||||
s.MapBossInfo.Pos = (grand.Intn(6) + 1 + s.MapBossInfo.Pos) % 6
|
||||
t.INFO[0] = s.MapBossInfo
|
||||
|
||||
s.Broadcast(nil, 2021, &t)
|
||||
})
|
||||
default:
|
||||
cool.Cron.ScheduleFunc(10*time.Second, func() {
|
||||
|
||||
s.Broadcast(nil, 50004, &info.S2C_50004{Id: uint32(0)})
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
type leiyi struct {
|
||||
}
|
||||
|
||||
func (t *Space) Next(time.Time) time.Time {
|
||||
|
||||
return time.Now().Add(time.Duration(grand.N(6, 30)) * time.Second)
|
||||
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"blazing/common/utils"
|
||||
|
||||
"blazing/logic/service/common"
|
||||
"blazing/logic/service/maps/info"
|
||||
maps "blazing/logic/service/maps/info"
|
||||
|
||||
csmap "github.com/mhmtszr/concurrent-swiss-map"
|
||||
@@ -20,12 +21,13 @@ type Space struct {
|
||||
//ID uint32 // 地图ID
|
||||
Name string //地图名称
|
||||
Owner ARENA
|
||||
info.MapBossInfo
|
||||
}
|
||||
|
||||
// NewSyncMap 创建一个新的玩家同步map
|
||||
func NewSpace() *Space {
|
||||
|
||||
return &Space{
|
||||
ret := &Space{
|
||||
User: csmap.New[uint32, common.PlayerI](
|
||||
// set the number of map shards. the default value is 32.
|
||||
csmap.WithShardCount[uint32, common.PlayerI](32),
|
||||
@@ -57,6 +59,8 @@ func NewSpace() *Space {
|
||||
// csmap.WithSize[string, int](1000),
|
||||
),
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
// 获取星球
|
||||
@@ -77,7 +81,7 @@ func GetSpace(id uint32) *Space {
|
||||
if t.Super == 0 {
|
||||
t.Super = uint32(v.ID)
|
||||
}
|
||||
|
||||
t.gettimeboss(uint32(v.ID))
|
||||
_, ok := maphot[t.Super]
|
||||
if !ok {
|
||||
var t1 int32
|
||||
|
||||
Reference in New Issue
Block a user