feat(fight): 优化擂台战斗逻辑与状态管理

- 修改了擂台主人设置逻辑,引入 `Set` 方法统一处理玩家信息更新
- 增加对擂主是否可战斗的判断,防止无效挑战
- 调整连胜计算和广播机制,确保数据一致性
- 修复擂台挑战失败时的状态回滚问题
- 引入错误码替代硬编码返回值,提高代码可读性与维护性
- 统一访问擂台玩家的方式,移除冗余字段
This commit is contained in:
2025-11-28 00:16:51 +08:00
parent 0ab1a85d17
commit f90581e0f6
13 changed files with 90 additions and 54 deletions

View File

@@ -68,7 +68,7 @@ func (h Controller) Capture(data *fight.CatchMonsterInboundInfo, c *player.Playe
// 加载进度
func (h Controller) LoadPercent(data *fight.LoadPercentInboundInfo, c *player.Player) (result *info.LoadPercentOutboundInfo, err errorcode.ErrorCode) {
if c.FightC == nil {
return nil, errorcode.ErrorCodes.ErrBattleEnded
return nil, -1
}
c.FightC.LoadPercent(c, int32(data.Percent))

View File

@@ -23,10 +23,7 @@ func (h Controller) ARENA_SET_OWENR(data *fight.ARENA_SET_OWENR, c *player.Playe
c.Fightinfo.Mode = 0 //取消队列匹配
if atomic.CompareAndSwapUint32(&c.GetSpace().Owner.Flag, 0, 1) {
c.GetSpace().Owner.UserID = c.GetInfo().UserID //添加用户ID
c.GetSpace().Owner.Nick = c.GetInfo().Nick
c.GetSpace().ARENA_Player = c //添加用户
c.GetSpace().Owner.Set(c)
c.GetSpace().Broadcast(c, 2419, c.GetSpace().Owner)
c.SendPackCmd(2419, c.GetSpace().Owner)
return
@@ -50,21 +47,42 @@ func (h Controller) ARENA_FIGHT_OWENR(data *fight.ARENA_FIGHT_OWENR, c *player.P
if c.Info.UserID == c.GetSpace().Owner.UserID {
return nil, errorcode.ErrorCodes.ErrNoEligiblePokemon
}
if c.GetSpace().Owner.ARENA_Player == nil {
return nil, errorcode.ErrorCodes.ErrSystemError200007
}
if !c.GetSpace().Owner.ARENA_Player.CanFight() {
c.GetSpace().Owner.Set(c)
c.GetSpace().Broadcast(c, 2419, &c.GetSpace().Owner)
c.SendPackCmd(2419, &c.GetSpace().Owner)
return
}
//原子操作,修改擂台状态
if atomic.CompareAndSwapUint32(&c.GetSpace().Owner.Flag, 1, 2) {
//成功发起擂台挑战后才修改我放状态
c.Fightinfo.Mode = info.BattleMode.SINGLE_MODE
c.Fightinfo.Status = info.BattleMode.FIGHT_ARENA
_, err = fight.NewFight(c, c.GetSpace().ARENA_Player, func(foi *info.FightOverInfo) { //我方邀请擂主挑战,我方先手
_, err = fight.NewFight(c, c.GetSpace().Owner.ARENA_Player, func(foi *info.FightOverInfo) { //我方邀请擂主挑战,我方先手
if foi.Reason != 0 && foi.WinnerId == c.GetInfo().UserID { //异常退出
c.GetSpace().ARENA_Player = nil
c.GetSpace().Owner.Reset()
c.GetSpace().Broadcast(c, 2419, &c.GetSpace().Owner)
c.SendPackCmd(2419, &c.GetSpace().Owner)
}
if foi.Reason == 0 { //异常退出
if foi.WinnerId == c.GetInfo().UserID {
c.Info.MaxArenaWins += 1
} else {
c.GetSpace().Owner.ARENA_Player.GetInfo().MaxArenaWins += 1
}
}
//todo 擂主输了,那就直接让他放弃擂台
@@ -75,11 +93,7 @@ func (h Controller) ARENA_FIGHT_OWENR(data *fight.ARENA_FIGHT_OWENR, c *player.P
//c.GetSpace().Broadcast(c, 2419, &c.GetSpace().Owner)
//c.SendPackCmd(2419, &c.GetSpace().Owner)
} else {
//发起失败,改回1
// c.GetSpace().Owner.HostWins = 0 //连胜重置
// c.GetSpace().Owner.UserID = c.GetInfo().UserID //添加用户ID
// c.GetSpace().Owner.Nick = c.GetInfo().Nick
// c.GetSpace().ARENA_Player = c //添加用户
atomic.StoreUint32(&c.GetSpace().Owner.Flag, 1)
}
@@ -107,9 +121,11 @@ func (h Controller) ARENA_GET_INFO(data *fight.ARENA_GET_INFO, c *player.Player)
// 都需要通过2419包广播更新擂台状态
func (h Controller) ARENA_UPFIGHT(data *fight.ARENA_UPFIGHT, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
//原子操作,修改擂台状态
if atomic.LoadUint32(&c.GetSpace().Owner.UserID) != c.GetInfo().UserID { //说明已经有人了
return nil, errorcode.ErrorCodes.ErrChampionCannotCancel
}
if atomic.CompareAndSwapUint32(&c.GetSpace().Owner.UserID, c.GetInfo().UserID, 0) {
c.GetSpace().ARENA_Player = nil
c.GetSpace().Owner.Reset()
c.GetSpace().Broadcast(c, 2419, &c.GetSpace().Owner)
@@ -129,19 +145,11 @@ func (h Controller) ARENA_UPFIGHT(data *fight.ARENA_UPFIGHT, c *player.Player) (
func (h Controller) ARENA_OWENR_ACCE(data *fight.ARENA_OWENR_ACCE, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
s := c.GetSpace()
if atomic.LoadUint32(&s.Owner.UserID) != c.GetInfo().UserID && c.GetInfo().UserID != atomic.LoadUint32(&s.Owner.ChallengerID) { //说明已经有人了
return nil, -1
}
if c.GetInfo().UserID == atomic.LoadUint32(&s.Owner.UserID) {
c.Info.MaxArenaWins += 1
s.Owner.HostWins += 1 //连胜+1
} else {
s.Owner.HostWins = 0 //连胜重置
s.Owner.UserID = c.GetInfo().UserID //添加用户ID
s.Owner.Nick = c.GetInfo().Nick
s.ARENA_Player = c //添加用户
if atomic.LoadUint32(&c.GetSpace().Owner.UserID) != c.GetInfo().UserID && c.GetInfo().UserID != atomic.LoadUint32(&c.GetSpace().Owner.ChallengerID) { //说明已经有人了
return nil, errorcode.ErrorCodes.ErrChampionCannotCancel
}
s.Owner.Set(c)
atomic.StoreUint32(&s.Owner.Flag, 1)

View File

@@ -50,7 +50,7 @@ func (h Controller) PET_King(data *fight.PetKingJoinInboundInfo, c *player.Playe
c.Fightinfo.Mode = info.BattleMode.MULTI_MODE
}
err = c.JoinFight(func(p common.PlayerI) bool {
fight.NewFight(p, c, func(foi *info.FightOverInfo) {
_, err = fight.NewFight(p, c, func(foi *info.FightOverInfo) {
if foi.Reason == 0 { //我放获胜
if foi.WinnerId == c.GetInfo().UserID {
c.Info.MonKingWin += 1
@@ -60,7 +60,10 @@ func (h Controller) PET_King(data *fight.PetKingJoinInboundInfo, c *player.Playe
}
}) ///开始对战,房主方以及被邀请方
if err > 0 { //说明有报错
return false
}
return true
})

View File

@@ -36,6 +36,7 @@ func (h Controller) UserMoreInfo(data *user.MoreUserInfoInboundInfo, c *player.P
return ret, 0
}
// 射击
func (h Controller) Aimat(data *user.AimatInboundInfo, c *player.Player) (result *user.AimatOutboundInfo, err errorcode.ErrorCode) {
result = &user.AimatOutboundInfo{