diff --git a/logic/controller/fight_base.go b/logic/controller/fight_base.go index 419804d59..44a1e4633 100644 --- a/logic/controller/fight_base.go +++ b/logic/controller/fight_base.go @@ -2,6 +2,7 @@ package controller import ( "blazing/common/socket/errorcode" + "sync/atomic" "blazing/logic/service/fight" "blazing/logic/service/fight/info" @@ -26,11 +27,11 @@ func (h Controller) UseSkill(data *fight.UseSkillInInfo, c *player.Player) (resu // 战斗逃跑 func (h Controller) Escape(data *fight.EscapeFightInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { - if c.FightC == nil { + if atomic.LoadUint32(&c.Fightinfo.Status) == 0 { - return nil, 0 + return nil, errorcode.ErrorCodes.ErrBattleNotStarted //,没开始对战 } - if !c.FightC.CanEscape() { //用户对战不能逃跑 + if atomic.LoadUint32(&c.Fightinfo.Status) == 1 { //用户对战不能逃跑 return nil, errorcode.ErrorCodes.ErrCannotFleePlayerBattle } diff --git a/logic/controller/fight_leitai.go b/logic/controller/fight_leitai.go index 710a6daa1..1f78bf6ef 100644 --- a/logic/controller/fight_leitai.go +++ b/logic/controller/fight_leitai.go @@ -34,7 +34,7 @@ func (h Controller) ARENA_FIGHT_OWENR(data *fight.ARENA_FIGHT_OWENR, c *player.P return nil, errorcode.ErrorCodes.ErrPokemonNotEligible } - space.GetSpace(c.Info.MapID).Can_ARENA(func(ownerID common.PlayerI) common.PlayerI { + space.GetSpace(c.Info.MapID).ARENA_join(func(ownerID common.PlayerI) common.PlayerI { c.Fightinfo = &info.Fightinfo{ Mode: info.BattleMode.SINGLE_MODE, Status: info.BattleStatus.FIGHT_WITH_PLAYER, @@ -55,7 +55,7 @@ func (h Controller) ARENA_FIGHT_OWENR(data *fight.ARENA_FIGHT_OWENR, c *player.P // 获取星际擂台信息的包 进入空间站地图前端会发送请求包 或者 有人站到星际擂台上后 广播回包 // 前端到后端无数据内容 // 后端到前端 -func (h Controller) ARENA_GET_INFO(data *fight.ARENA_GET_INFO, c *player.Player) (result *space.S2C_ARENA_GET_INFO, err errorcode.ErrorCode) { +func (h Controller) ARENA_GET_INFO(data *fight.ARENA_GET_INFO, c *player.Player) (result *space.ARENA, err errorcode.ErrorCode) { result = &space.GetSpace(c.Info.MapID).ARENA return diff --git a/logic/controller/fight_pvp_king.go b/logic/controller/fight_pvp_king.go index 7ed71d8b0..49db0629b 100644 --- a/logic/controller/fight_pvp_king.go +++ b/logic/controller/fight_pvp_king.go @@ -11,13 +11,12 @@ import ( //大乱斗 func (h Controller) PET_MELEE(data *fight.StartPetWarInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { - if !c.CanFight() { + if !c.CanFight(1) { return nil, errorcode.ErrorCodes.ErrPokemonNotEligible } - c.Fightinfo = &info.Fightinfo{ - Mode: info.BattleMode.PET_MELEE, - Status: info.BattleStatus.FIGHT_WITH_PLAYER} + c.Fightinfo.Mode = info.BattleMode.PET_MELEE + c.Fightinfo.PlayerID = 0 g := c.Pet_joinFight() if g != nil { fight.NewFight(g, c, func(foi *info.FightOverInfo) { diff --git a/logic/controller/fight_pvp_withplayer.go b/logic/controller/fight_pvp_withplayer.go index 659112d29..5d50c66c9 100644 --- a/logic/controller/fight_pvp_withplayer.go +++ b/logic/controller/fight_pvp_withplayer.go @@ -12,9 +12,7 @@ import ( // 接收战斗或者取消战斗的包 func (h Controller) OnPlayerHandleFightInvite(data *fight.HandleFightInviteInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { - // if !c.CanFight() { - // return nil, errorcode.ErrorCodes.ErrPokemonNotEligible - // } + if !atomic.CompareAndSwapUint32(&c.Fightinfo.Status, 0, 1) { //邀请前提是自己没在战斗 return nil, errorcode.ErrorCodes.ErrInBattle diff --git a/logic/service/common/fight.go b/logic/service/common/fight.go index 2d9fdedab..99e56f2e7 100644 --- a/logic/service/common/fight.go +++ b/logic/service/common/fight.go @@ -17,7 +17,7 @@ type FightI interface { GetRand() *rand.Rand LoadPercent(c PlayerI, percent int32) UseItem(c PlayerI, cacthid, itemid uint32) - CanEscape() bool + IsFirst(c PlayerI) bool GetOverChan() chan struct{} } diff --git a/logic/service/fight/info/info.go b/logic/service/fight/info/info.go index a85fa4be9..ee0deccce 100644 --- a/logic/service/fight/info/info.go +++ b/logic/service/fight/info/info.go @@ -46,10 +46,7 @@ type S2C_NOTE_HANDLE_FIGHT_INVITE struct { type Fightinfo struct { PlayerID uint32 Mode EnumBattleMode - // // FIGHT_WITH_NPC EnumBattleMode `enum:"3"` // 与NPC战斗 - // FIGHT_WITH_BOSS EnumBattleMode `enum:"2"` // 与BOSS战斗 - // FIGHT_WITH_PLAYER EnumBattleMode `enum:"1"` // 与玩家战斗(PVP) - // NULL EnumBattleMode `enum:"0"` // 与玩家战斗(PVP) + Type EnumBattleMode //战斗类型 //0无战斗,1PVP,2,BOOS,3PVE Status uint32 diff --git a/logic/service/fight/input.go b/logic/service/fight/input.go index c78c720fc..ffbc61dc3 100644 --- a/logic/service/fight/input.go +++ b/logic/service/fight/input.go @@ -7,7 +7,6 @@ import ( "blazing/logic/service/fight/action" "blazing/logic/service/fight/info" "blazing/logic/service/fight/input" - "blazing/logic/service/player" "blazing/modules/blazing/model" "math/rand" "sync" @@ -41,10 +40,6 @@ type FightC struct { callback func(*info.FightOverInfo) } -func (f *FightC) CanEscape() bool { - - return f.Info.Status != info.BattleStatus.FIGHT_WITH_PLAYER -} func (f *FightC) Ownerid() uint32 { return f.ownerID @@ -195,7 +190,6 @@ func NewFight(p1, p2 common.PlayerI, fn func(*info.FightOverInfo)) (*FightC, err f.Info = p1.Getfightinfo() //这里应该挪到玩家初始化执行 - p1.(*player.Player).Fightinfo = nil //清空战斗消息 f.ReadyInfo.Mode = f.Info.Mode diff --git a/logic/service/player/base.go b/logic/service/player/base.go index 742330b27..fd07069b4 100644 --- a/logic/service/player/base.go +++ b/logic/service/player/base.go @@ -10,9 +10,9 @@ import ( ) type baseplayer struct { - Info *model.PlayerInfo - canFight uint32 - FightC common.FightI //绑定战斗标识 替代本身的是否战斗标记 //IsFighting bool + Info *model.PlayerInfo + //canFight uint32 + FightC common.FightI //绑定战斗标识 替代本身的是否战斗标记 //IsFighting bool *info.PlayerCaptureContext } @@ -39,10 +39,6 @@ func (f *baseplayer) SetFightC(ff common.FightI) { } -func (f *baseplayer) QuitFight() { - //将战斗标记设置为0 这里的标记是 - atomic.StoreUint32(&f.canFight, 0) -} func (f *baseplayer) GetPlayerCaptureContext() *info.PlayerCaptureContext { return f.PlayerCaptureContext } diff --git a/logic/service/player/fight.go b/logic/service/player/fight.go index 054afce69..7e4a9fbc8 100644 --- a/logic/service/player/fight.go +++ b/logic/service/player/fight.go @@ -4,8 +4,6 @@ import ( "blazing/logic/service/common" "blazing/logic/service/fight/info" "sync/atomic" - - "blazing/logic/service/space" ) // 邀请玩家加入战斗 邀请者,被邀请者,邀请模式 @@ -29,17 +27,14 @@ func (p *Player) InvitePlayerToBattle() { }) } -func (p *Player) Pet_joinFight() *Player { - var lw *Player - //pinfo := lw.PVPinfo - space.GetSpace(p.Info.MapID).User.Range(func(key uint32, v common.PlayerI) bool { +func (p *Player) Pet_joinFight(fn func(p common.PlayerI)) { - value := v.(*Player) + p.GetSpace().User.Range(func(key uint32, v common.PlayerI) bool { - if value.Fightinfo != nil && value != p { + if v != p { //确认是乱斗模式 - if *value.Fightinfo == *p.Fightinfo { + if v.GetInfo() == p.GetInfo() { p.Fightinfo = nil //先将自身的准备信息置空 //value.PVPinfo = nil lw = value diff --git a/logic/service/player/player.go b/logic/service/player/player.go index e6fbbd98f..4d3159203 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -95,13 +95,19 @@ func (f *Player) InvitePlayer(ff common.PlayerI) { func (p *Player) Getfightinfo() info.Fightinfo { return p.Fightinfo } +func (p *Player) QuitFight() { + //将战斗标记设置为0 这里的标记是 + atomic.StoreUint32(&p.Fightinfo.Status, 0) +} func (p *Player) GetSpace() *space.Space { return space.GetSpace(p.Info.MapID) } -func (p *Player) CanFight() bool { - if atomic.CompareAndSwapUint32(&p.canFight, 0, 1) { //先判断是否竞态条件被挑战 +// 0无战斗,1PVP,2,BOOS,3PVE +func (p *Player) CanFight(staus uint32) bool { + + if atomic.CompareAndSwapUint32(&p.Fightinfo.Status, 0, staus) { //先判断是否竞态条件被挑战 //成功,继续判断 diff --git a/logic/service/space/arena.go b/logic/service/space/arena.go index 884ada686..20ccd3378 100644 --- a/logic/service/space/arena.go +++ b/logic/service/space/arena.go @@ -1,9 +1,68 @@ package space -type S2C_ARENA_GET_INFO struct { +import ( + "blazing/common/socket/errorcode" + "blazing/logic/service/common" + "sync/atomic" +) + +type ARENA struct { Flag uint32 // 0=清除ArenaInfo(flag为0时其他字段全为空) 1=站上擂台的信息 2=挑战中的信息 Id uint32 Nick string `struc:"[16]byte"` HostWins uint32 // 应该是擂台人的连胜数 ChallengerID uint32 // 挑战者的userid } + +func (s *Space) ARENA_join(tt func(c common.PlayerI) common.PlayerI) errorcode.ErrorCode { + + //原子操作,修改擂台状态 + if atomic.CompareAndSwapUint32(&s.ARENA.Flag, 1, 2) { + r := tt(s.ARENA_Player) + if r != nil { + atomic.SwapUint32(&s.ARENA.ChallengerID, r.GetInfo().UserID) //传回的指针赋值给ID + } + return 0 + } + return errorcode.ErrorCodes.ErrChampionExists +} + +// flag 0 取消 1为加入 2为替换挑战方 +func (s *Space) UP_ARENA(c common.PlayerI, FLAG uint32) { + + switch FLAG { + case 0: + if s.ARENA.Id != c.GetInfo().UserID { //说明不是自己退出 + return + } + s.ARENA = info.S2C_ARENA_GET_INFO{} + s.ARENA_Player = nil + + case 1: + if s.ARENA.Id != 0 { //说明已经有人了 + return + } + s.ARENA.Flag = 1 + s.ARENA.Id = c.GetInfo().UserID //添加用户ID + s.ARENA.Nick = c.GetInfo().Nick + s.ARENA_Player = c //添加用户 + case 2: //胜利替换 + if s.ARENA.Flag != 2 { //说明没进入挑战 + return + } + if s.ARENA.Id != c.GetInfo().UserID && c.GetInfo().UserID != s.ARENA.ChallengerID { //说明已经有人了 + return + } + if c.GetInfo().UserID == s.ARENA.Id { + s.ARENA.HostWins += 1 //连胜+1 + + } + s.ARENA.Flag = 1 + s.ARENA.Id = c.GetInfo().UserID //添加用户ID + s.ARENA.Nick = c.GetInfo().Nick + s.ARENA_Player = c //添加用户 + + } + s.Broadcast(c, 2419, s.ARENA) + +} diff --git a/logic/service/space/space.go b/logic/service/space/space.go index a5eaee9c0..282f0e540 100644 --- a/logic/service/space/space.go +++ b/logic/service/space/space.go @@ -3,10 +3,8 @@ package space import ( "blazing/common/data/xmlres" "blazing/common/utils" - "sync/atomic" "blazing/logic/service/common" - "blazing/logic/service/fight/info" maps "blazing/logic/service/maps/info" csmap "github.com/mhmtszr/concurrent-swiss-map" @@ -21,63 +19,10 @@ type Space struct { SuperValue *int32 //ID uint32 // 地图ID Name string //地图名称 - ARENA S2C_ARENA_GET_INFO + ARENA ARENA ARENA_Player common.PlayerI } -func (s *Space) Can_ARENA(tt func(c common.PlayerI) common.PlayerI) { - - //原子操作,修改擂台状态 - if atomic.CompareAndSwapUint32(&s.ARENA.Flag, 1, 2) { - r := tt(s.ARENA_Player) - if r != nil { - atomic.SwapUint32(&s.ARENA.ChallengerID, r.GetInfo().UserID) //传回的指针赋值给ID - } - - } - -} - -// flag 0 取消 1为加入 2为替换挑战方 -func (s *Space) UP_ARENA(c common.PlayerI, FLAG uint32) { - - switch FLAG { - case 0: - if s.ARENA.Id != c.GetInfo().UserID { //说明不是自己退出 - return - } - s.ARENA = info.S2C_ARENA_GET_INFO{} - s.ARENA_Player = nil - - case 1: - if s.ARENA.Id != 0 { //说明已经有人了 - return - } - s.ARENA.Flag = 1 - s.ARENA.Id = c.GetInfo().UserID //添加用户ID - s.ARENA.Nick = c.GetInfo().Nick - s.ARENA_Player = c //添加用户 - case 2: //胜利替换 - if s.ARENA.Flag != 2 { //说明没进入挑战 - return - } - if s.ARENA.Id != c.GetInfo().UserID && c.GetInfo().UserID != s.ARENA.ChallengerID { //说明已经有人了 - return - } - if c.GetInfo().UserID == s.ARENA.Id { - s.ARENA.HostWins += 1 //连胜+1 - - } - s.ARENA.Flag = 1 - s.ARENA.Id = c.GetInfo().UserID //添加用户ID - s.ARENA.Nick = c.GetInfo().Nick - s.ARENA_Player = c //添加用户 - - } - s.Broadcast(c, 2419, s.ARENA) - -} - // NewSyncMap 创建一个新的玩家同步map func NewSpace() *Space {