121 lines
4.3 KiB
Go
121 lines
4.3 KiB
Go
package controller
|
|
|
|
import (
|
|
"blazing/common/socket/errorcode"
|
|
"sync/atomic"
|
|
|
|
"blazing/logic/service/fight"
|
|
"blazing/logic/service/fight/info"
|
|
"blazing/logic/service/player"
|
|
"blazing/logic/service/space"
|
|
)
|
|
|
|
// public static const ARENA_SET_OWENR:uint = 2417;
|
|
// 如果星际擂台上无人,站到星际擂台的包
|
|
// 前端到后端无数据内容 空包
|
|
// 后端到前端无数据内容 空包
|
|
// 都需要通过2419包广播更新擂台状态
|
|
func (h Controller) ARENA_SET_OWENR(data *fight.ARENA_SET_OWENR, c *player.Player) (result *space.ARENA, err errorcode.ErrorCode) {
|
|
|
|
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().Broadcast(c, 2419, &c.GetSpace().Owner)
|
|
return &c.GetSpace().Owner, 0
|
|
}
|
|
|
|
return nil, errorcode.ErrorCodes.ErrChampionExists
|
|
}
|
|
|
|
// public static const ARENA_FIGHT_OWENR:uint = 2418;
|
|
// 挑战擂台的包
|
|
// 前端到后端无数据内容 空包
|
|
// 后端到前端无数据内容 空包
|
|
// 还是后端主动发送2503的包给双方前端后 等待前端加载完毕 主动发送2404包通知后端开始战斗
|
|
// 并不会通知对方是否接受挑战。只要有人挑战就直接进入对战
|
|
func (h Controller) ARENA_FIGHT_OWENR(data *fight.ARENA_FIGHT_OWENR, c *player.Player) (result *space.ARENA, err errorcode.ErrorCode) {
|
|
s := c.GetSpace()
|
|
|
|
//原子操作,修改擂台状态
|
|
if atomic.CompareAndSwapUint32(&s.Owner.Flag, 1, 2) {
|
|
//成功发起擂台挑战后才修改我放状态
|
|
c.Fightinfo.Mode = info.BattleMode.SINGLE_MODE
|
|
c.Fightinfo.Status = info.BattleStatus.FIGHT_WITH_PLAYER
|
|
|
|
_, err = fight.NewFight(c, s.ARENA_Player, func(foi *info.FightOverInfo) { //我方邀请擂主挑战,我方先手
|
|
|
|
}) ///开始对战,房主方以及被邀请方
|
|
|
|
if err <= 0 { //发起战斗成功
|
|
atomic.StoreUint32(&s.Owner.ChallengerID, c.GetInfo().UserID) //传回的指针赋值给ID
|
|
|
|
} else {
|
|
//发起失败,改回1
|
|
atomic.StoreUint32(&s.Owner.Flag, 1)
|
|
}
|
|
|
|
s.Broadcast(c, 2419, &s.Owner)
|
|
return &s.Owner, 0
|
|
}
|
|
return nil, errorcode.ErrorCodes.ErrChampionExists
|
|
|
|
}
|
|
|
|
// 获取星际擂台信息的包 进入空间站地图前端会发送请求包 或者 有人站到星际擂台上后 广播回包
|
|
// 前端到后端无数据内容
|
|
// 后端到前端
|
|
func (h Controller) ARENA_GET_INFO(data *fight.ARENA_GET_INFO, c *player.Player) (result *space.ARENA, err errorcode.ErrorCode) {
|
|
|
|
return &space.GetSpace(c.Info.MapID).Owner, 0
|
|
}
|
|
|
|
// public static const ARENA_UPFIGHT:uint = 2420;
|
|
// 放弃擂台挑战的包
|
|
// 前端到后端无数据内容
|
|
// 后端到前端无数据内容
|
|
// 都需要通过2419包广播更新擂台状态
|
|
func (h Controller) ARENA_UPFIGHT(data *fight.ARENA_UPFIGHT, c *player.Player) (result *space.ARENA, err errorcode.ErrorCode) {
|
|
//原子操作,修改擂台状态
|
|
s := c.GetSpace()
|
|
if atomic.CompareAndSwapUint32(&s.Owner.UserID, c.GetInfo().UserID, 0) {
|
|
s.ARENA_Player = nil
|
|
|
|
s.Broadcast(c, 2419, &s.Owner)
|
|
return &s.Owner, 0
|
|
}
|
|
return nil, errorcode.ErrorCodes.ErrChampionCannotCancel
|
|
|
|
}
|
|
|
|
// public static const ARENA_OWENR_ACCE:uint = 2422;
|
|
// 此包为擂台战对战结束后 胜方前端会发送给后端 具体作用为通知后端发送2419包更新擂台信息。
|
|
// 前端到后端无数据内容
|
|
// 后端到前端无数据内容
|
|
// public static const ARENA_OWENR_OUT:uint = 2423;
|
|
// 此包不清楚具体怎么触发 但已知此包为后端主动发送。不清楚什么情况下回用到
|
|
func (h Controller) ARENA_OWENR_ACCE(data *fight.ARENA_OWENR_ACCE, c *player.Player) (result *space.ARENA, 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, errorcode.ErrorCodes.Err24hBanCheatTool
|
|
}
|
|
if c.GetInfo().UserID == atomic.LoadUint32(&s.Owner.UserID) {
|
|
|
|
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 //添加用户
|
|
}
|
|
|
|
atomic.StoreUint32(&s.Owner.Flag, 1)
|
|
|
|
s.Broadcast(c, 2419, &s.Owner)
|
|
return &s.Owner, 0
|
|
}
|