diff --git a/logic/controller/map.go b/logic/controller/map.go index e1b81344..97233a87 100644 --- a/logic/controller/map.go +++ b/logic/controller/map.go @@ -52,11 +52,9 @@ func (h *Controller) MapLeave(data *maps.LeaveMapInboundInfo, c *player.Player) func (h *Controller) MapList(data *maps.ListMapPlayerInboundInfo, c *player.Player) (result *info.ListMapPlayerOutboundInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 atomic.StoreUint32(&c.Canmon, 2) - if atomic.LoadUint32(&c.GetSpace().TimeBoss.Flag) == 1 { - defer c.SendPackCmd(2022, &c.GetSpace().TimeBoss) - } + result = &info.ListMapPlayerOutboundInfo{ - Player: c.GetSpace().GetInfo(), + Player: c.GetSpace().GetInfo(c), } return diff --git a/logic/service/space/fixboos.go b/logic/service/space/fixboos.go new file mode 100644 index 00000000..dc55e171 --- /dev/null +++ b/logic/service/space/fixboos.go @@ -0,0 +1,83 @@ +package space + +import ( + "blazing/cool" + "blazing/logic/service/maps/info" + "sync/atomic" + "time" + + "github.com/gogf/gf/v2/util/grand" +) + +func (s *Space) getfixboss(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: + + atomic.StoreUint32(&s.CanWeather, 1) + + s.MapBossInfo = info.MapBossInfo{ + Id: 70, + } + + cool.Cron.ScheduleFunc(10*time.Second, 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)}) + + // }) + + } + +} diff --git a/logic/service/space/in_out.go b/logic/service/space/in_out.go index 144a813b..803c1e60 100644 --- a/logic/service/space/in_out.go +++ b/logic/service/space/in_out.go @@ -1,7 +1,6 @@ package space import ( - "blazing/cool" "blazing/logic/service/common" "blazing/logic/service/maps/info" maps "blazing/logic/service/maps/info" @@ -71,7 +70,18 @@ func (s *Space) EnterMap(c common.PlayerI) { } } -func (s *Space) GetInfo() []maps.OutInfo { +func (s *Space) GetInfo(c common.PlayerI) []maps.OutInfo { + + if atomic.LoadUint32(&s.TimeBoss.Flag) == 1 { + defer c.SendPackCmd(2022, &s.TimeBoss) + } + if s.MapBossInfo.Id != 0 { + var t info.MapBossSInfo + t.INFO = append(t.INFO, s.MapBossInfo) + s.Broadcast(nil, 2021, &t) + + } + defer c.SendPackCmd(50004, &info.S2C_50004{Id: uint32(s.Weather)}) //获取天气 ret := make([]maps.OutInfo, 0) s.UserInfo.Range(func(k uint32, v maps.OutInfo) (stop bool) { ret = append(ret, v) @@ -94,82 +104,9 @@ func (s *Space) Walk(c common.PlayerI, info *info.WalkOutInfo) { s.Broadcast(c, 2101, info) } -func (s *Space) getfixboss(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) + return time.Now().Add(time.Duration(grand.N(6, 30)) * time.Minute) } diff --git a/logic/service/space/space.go b/logic/service/space/space.go index 3fcea5a4..8c7b700b 100644 --- a/logic/service/space/space.go +++ b/logic/service/space/space.go @@ -3,14 +3,25 @@ package space import ( "blazing/common/data/xmlres" "blazing/common/utils" + "blazing/cool" + "sync/atomic" "blazing/logic/service/common" "blazing/logic/service/maps/info" maps "blazing/logic/service/maps/info" + "github.com/gogf/gf/v2/util/grand" csmap "github.com/mhmtszr/concurrent-swiss-map" + "github.com/tnnmigga/enum" ) +// 定义天气状态枚举实例 +var WeatherStatus = enum.New[struct { + Normal uint32 `enum:"0"` // 正常 + Rain uint32 `enum:"1"` // 下雨 + Snow uint32 `enum:"2"` // 下雪 +}]() + // Space 针对Player的并发安全map,键为uint32类型 type Space struct { User *csmap.CsMap[uint32, common.PlayerI] // 存储玩家数据的map,键为玩家ID @@ -22,7 +33,9 @@ type Space struct { Name string //地图名称 Owner ARENA info.MapBossInfo - TimeBoss info.S2C_2022 + TimeBoss info.S2C_2022 + Weather uint32 + CanWeather uint32 } // NewSyncMap 创建一个新的玩家同步map @@ -97,6 +110,15 @@ func GetSpace(id uint32) *Space { } } + cool.Cron.CustomFunc(t, func() { + + if atomic.LoadUint32(&t.CanWeather) == 1 { + atomic.StoreUint32(&t.Weather, (uint32(grand.Intn(3))+1+atomic.LoadUint32(&t.Weather))%3) + t.Broadcast(nil, 50004, &info.S2C_50004{Id: uint32(t.Weather)}) + } + + }) + planetmap.Store(id, t) return t }