fix: 修复空提交问题
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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{}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) { //先判断是否竞态条件被挑战
|
||||
|
||||
//成功,继续判断
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user