fix: 修复空提交问题

This commit is contained in:
1
2025-11-19 00:09:12 +00:00
parent 24f2a6d7c8
commit 31439b707c
12 changed files with 88 additions and 98 deletions

View File

@@ -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
}

View File

@@ -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

View File

@@ -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) {

View File

@@ -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

View File

@@ -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{}
}

View File

@@ -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无战斗1PVP2,BOOS,3PVE
Status uint32

View File

@@ -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

View File

@@ -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
}

View File

@@ -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

View File

@@ -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无战斗1PVP2,BOOS,3PVE
func (p *Player) CanFight(staus uint32) bool {
if atomic.CompareAndSwapUint32(&p.Fightinfo.Status, 0, staus) { //先判断是否竞态条件被挑战
//成功,继续判断

View File

@@ -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=清除ArenaInfoflag为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)
}

View File

@@ -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 {