fix: 修复空提交问题
This commit is contained in:
@@ -492,8 +492,8 @@ var ErrorCodes = enum.New[struct {
|
||||
// 你的电池能量已经无法支持保卫战所需的模拟呈现功能,请明天蓄满电池后再来参加保卫战!
|
||||
ErrBatteryLowForDefense ErrorCode `enum:"18030"`
|
||||
// 正在精灵对战中
|
||||
ErrInBattle ErrorCode `enum:"11024"`
|
||||
// 你们战队还没有报名参加对抗赛
|
||||
ErrInBattle ErrorCode `enum:"11024"`
|
||||
ErrTeamNotRegistered ErrorCode `enum:"18221"`
|
||||
// 你的战队的其他成员已经报名参加保卫战,请耐心等待比赛集合令提示。
|
||||
ErrTeammateRegistered ErrorCode `enum:"18222"`
|
||||
|
||||
@@ -30,9 +30,9 @@ func (h Controller) Escape(data *fight.EscapeFightInboundInfo, c *player.Player)
|
||||
|
||||
return nil, 0
|
||||
}
|
||||
if !c.FightC.CanEscape() {
|
||||
if !c.FightC.CanEscape() { //用户对战不能逃跑
|
||||
|
||||
return nil, 0
|
||||
return nil, errorcode.ErrorCodes.ErrCannotFleePlayerBattle
|
||||
}
|
||||
c.FightC.Over(c, info.BattleOverReason.PlayerEscape)
|
||||
return nil, 0
|
||||
|
||||
@@ -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 *info.S2C_ARENA_GET_INFO, err errorcode.ErrorCode) {
|
||||
func (h Controller) ARENA_GET_INFO(data *fight.ARENA_GET_INFO, c *player.Player) (result *space.S2C_ARENA_GET_INFO, err errorcode.ErrorCode) {
|
||||
|
||||
result = &space.GetSpace(c.Info.MapID).ARENA
|
||||
return
|
||||
|
||||
@@ -3,7 +3,6 @@ package controller
|
||||
import (
|
||||
"blazing/common/socket/errorcode"
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
|
||||
"blazing/logic/service/fight"
|
||||
"blazing/logic/service/fight/info"
|
||||
@@ -13,8 +12,12 @@ 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 !c.CanFight() {
|
||||
// return nil, errorcode.ErrorCodes.ErrPokemonNotEligible
|
||||
// }
|
||||
if !atomic.CompareAndSwapUint32(&c.Fightinfo.Status, 0, 1) { //邀请前提是自己没在战斗
|
||||
return nil, errorcode.ErrorCodes.ErrInBattle
|
||||
|
||||
}
|
||||
if ok, p1 := c.AgreeBattle(data.UserID, data.Flag, data.Mode); ok {
|
||||
|
||||
@@ -27,24 +30,27 @@ func (h Controller) OnPlayerHandleFightInvite(data *fight.HandleFightInviteInbou
|
||||
|
||||
// 邀请其他人进行战斗
|
||||
func (h Controller) OnPlayerInviteOtherFight(data *fight.InviteToFightInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
|
||||
if !c.CanFight() {
|
||||
return nil, errorcode.ErrorCodes.ErrPokemonNotEligible
|
||||
}
|
||||
|
||||
//进入邀请,以及确认对战模式
|
||||
|
||||
c.Fightinfo = &info.Fightinfo{PlayerID: data.UserID,
|
||||
Mode: data.Mode,
|
||||
Status: info.BattleStatus.FIGHT_WITH_PLAYER}
|
||||
if !atomic.CompareAndSwapUint32(&c.Fightinfo.PlayerID, 0, data.UserID) { //邀请前提是自己没邀请别人
|
||||
return nil, errorcode.ErrorCodes.ErrCannotPerformAction
|
||||
|
||||
}
|
||||
c.Fightinfo.Mode = data.Mode
|
||||
|
||||
c.InvitePlayerToBattle()
|
||||
|
||||
return nil, 0
|
||||
}
|
||||
|
||||
// 取消和他人战斗
|
||||
// 取消队列
|
||||
func (h Controller) OnPlayerCanceledOtherInviteFight(data *fight.InviteFightCancelInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
|
||||
|
||||
atomic.StorePointer(unsafe.Pointer(c.Fightinfo), nil)
|
||||
return nil, 0
|
||||
if atomic.LoadUint32(&c.Fightinfo.Status) != 0 { //如果没有战斗状态,则不做任何处理
|
||||
atomic.StoreUint32(&c.Fightinfo.Status, 0) //设置状态为0
|
||||
|
||||
}
|
||||
//否则报错
|
||||
return nil, errorcode.ErrorCodes.ErrCannotCancelBattle
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ type PlayerI interface {
|
||||
Getfightinfo() info.Fightinfo
|
||||
|
||||
GetInfo() *model.PlayerInfo
|
||||
|
||||
InvitePlayer(PlayerI)
|
||||
SetFightC(FightI)
|
||||
QuitFight()
|
||||
SendPackCmd(cmd uint32, b any)
|
||||
|
||||
@@ -73,10 +73,10 @@ type HandleFightInviteInboundInfo struct {
|
||||
type InviteToFightInboundInfo struct {
|
||||
Head player.TomeeHeader `cmd:"2401" struc:"[0]pad"`
|
||||
|
||||
UserID uint32 `codec:"true"`
|
||||
UserID uint32
|
||||
|
||||
// Mode 战斗类型 1 = 1v1 2 = 6v6
|
||||
Mode info.EnumBattleMode `codec:"true"`
|
||||
Mode info.EnumBattleMode
|
||||
}
|
||||
type InviteFightCancelInboundInfo struct {
|
||||
Head player.TomeeHeader `cmd:"2402" struc:"[0]pad"`
|
||||
|
||||
@@ -30,14 +30,7 @@ var BattleMode = enum.New[struct {
|
||||
SINGLE_MODE EnumBattleMode `enum:"1"` // 单人模式
|
||||
MULTI_MODE EnumBattleMode `enum:"2"` // 多人模式
|
||||
}]()
|
||||
var BattleStatus = enum.New[struct {
|
||||
// 原ActionScript中的常量映射
|
||||
|
||||
FIGHT_WITH_NPC EnumBattleMode `enum:"3"` // 与NPC战斗
|
||||
FIGHT_WITH_BOSS EnumBattleMode `enum:"2"` // 与BOSS战斗
|
||||
FIGHT_WITH_PLAYER EnumBattleMode `enum:"1"` // 与玩家战斗(PVP)
|
||||
|
||||
}]()
|
||||
|
||||
// 玩家离线数据
|
||||
type PlayerOfflineData struct {
|
||||
|
||||
@@ -46,7 +46,13 @@ type S2C_NOTE_HANDLE_FIGHT_INVITE struct {
|
||||
type Fightinfo struct {
|
||||
PlayerID uint32
|
||||
Mode EnumBattleMode
|
||||
Status 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)
|
||||
|
||||
//0无战斗,1PVP,2,BOOS,3PVE
|
||||
Status uint32
|
||||
}
|
||||
|
||||
// FightPetInfo 战斗精灵信息结构体,FightPetInfo类
|
||||
@@ -177,13 +183,7 @@ type NoteUseSkillOutboundInfo struct {
|
||||
FirstAttackInfo AttackValue // 本轮先手的精灵在释放技能结束后的状态
|
||||
SecondAttackInfo AttackValue // 本轮后手的精灵在释放技能结束后的状态
|
||||
}
|
||||
type S2C_ARENA_GET_INFO struct {
|
||||
Flag uint32 // 0=清除ArenaInfo(flag为0时其他字段全为空) 1=站上擂台的信息 2=挑战中的信息
|
||||
Id uint32
|
||||
Nick string `struc:"[16]byte"`
|
||||
HostWins uint32 // 应该是擂台人的连胜数
|
||||
ChallengerID uint32 // 挑战者的userid
|
||||
}
|
||||
|
||||
type FightStartOutboundInfo struct {
|
||||
// @UInt long类型
|
||||
IsCanAuto uint32 `fieldDesc:"是否自动 默认给0 怀疑是自动战斗器使用的" `
|
||||
|
||||
@@ -37,6 +37,8 @@ func (f *baseplayer) SetFightC(ff common.FightI) {
|
||||
|
||||
f.FightC = ff
|
||||
}
|
||||
|
||||
|
||||
func (f *baseplayer) QuitFight() {
|
||||
//将战斗标记设置为0 这里的标记是
|
||||
atomic.StoreUint32(&f.canFight, 0)
|
||||
|
||||
@@ -3,27 +3,26 @@ package player
|
||||
import (
|
||||
"blazing/logic/service/common"
|
||||
"blazing/logic/service/fight/info"
|
||||
"sync/atomic"
|
||||
|
||||
"blazing/logic/service/space"
|
||||
)
|
||||
|
||||
// 邀请玩家加入战斗 邀请者,被邀请者,邀请模式
|
||||
func (lw *Player) InvitePlayerToBattle() {
|
||||
func (p *Player) InvitePlayerToBattle() {
|
||||
|
||||
pinfo := lw.Fightinfo
|
||||
space.GetSpace(lw.Info.MapID).User.Range(func(key uint32, v common.PlayerI) bool {
|
||||
p.GetSpace().User.Range(func(key uint32, v common.PlayerI) bool {
|
||||
|
||||
value := v.(*Player)
|
||||
if key == uint32(pinfo.PlayerID) { //说明这里是针对玩家邀请的
|
||||
if key == atomic.LoadUint32(&p.Fightinfo.PlayerID) { //说明这里是针对玩家邀请的
|
||||
|
||||
v.InvitePlayer(p)
|
||||
|
||||
v.SendPackCmd(2501, info.NoteInviteToFightOutboundInfo{
|
||||
UserID: p.Info.UserID,
|
||||
Nick: p.Info.Nick,
|
||||
Mode: p.Fightinfo.Mode,
|
||||
})
|
||||
|
||||
value.HavePVPinfo = append([]*Player{lw}, value.HavePVPinfo...)
|
||||
t1 := NewTomeeHeader(2501, value.Info.UserID)
|
||||
t := info.NoteInviteToFightOutboundInfo{
|
||||
UserID: lw.Info.UserID,
|
||||
Nick: lw.Info.Nick,
|
||||
Mode: pinfo.Mode,
|
||||
}
|
||||
value.SendPack(t1.Pack(&t))
|
||||
return true
|
||||
}
|
||||
return false
|
||||
@@ -74,13 +73,13 @@ func (p *Player) SendLoadPercent(b info.LoadPercentOutboundInfo) {
|
||||
func (lw *Player) AgreeBattle(userid, flag uint32, mode info.EnumBattleMode) (bool, common.PlayerI) {
|
||||
// 处理完毕后清空收到的邀请列表(原defer逻辑保留)
|
||||
defer func() {
|
||||
lw.HavePVPinfo = make([]*Player, 0)
|
||||
lw.HavePVPinfo = make([]common.PlayerI, 0)
|
||||
}()
|
||||
|
||||
// 遍历收到的邀请,寻找目标邀请者
|
||||
var inviter *Player
|
||||
for _, p := range lw.HavePVPinfo {
|
||||
if p == nil || p.Info.UserID != userid {
|
||||
if p == nil || p.Getfightinfo().PlayerID != userid {
|
||||
continue // 跳过空指针或非目标邀请者
|
||||
}
|
||||
inviter = p
|
||||
|
||||
@@ -2,6 +2,7 @@ package player
|
||||
|
||||
import (
|
||||
"blazing/cool"
|
||||
"blazing/logic/service/common"
|
||||
"blazing/modules/blazing/model"
|
||||
"time"
|
||||
)
|
||||
@@ -10,7 +11,7 @@ import (
|
||||
func NewPlayer(opts ...PlayerOption) *Player {
|
||||
p := &Player{
|
||||
|
||||
HavePVPinfo: make([]*Player, 0),
|
||||
HavePVPinfo: make([]common.PlayerI, 0),
|
||||
baseplayer: newbaseplayer(),
|
||||
}
|
||||
p.monsters = generateThreeUniqueNumbers()
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"blazing/common/socket/errorcode"
|
||||
"blazing/common/utils"
|
||||
"blazing/cool"
|
||||
"blazing/logic/service/common"
|
||||
"blazing/logic/service/fight/info"
|
||||
"blazing/logic/service/space"
|
||||
"math/rand"
|
||||
@@ -53,14 +54,14 @@ type Player struct {
|
||||
StopChan timer.TimeNoder
|
||||
|
||||
context.Context
|
||||
Fightinfo *info.Fightinfo //当前邀请的玩家ID
|
||||
Fightinfo info.Fightinfo //当前邀请的玩家ID
|
||||
|
||||
Logintime uint32 //当前登录时间
|
||||
OgreInfo OgreInfo
|
||||
|
||||
Service *blservice.UserService
|
||||
// PVP被邀请信息
|
||||
HavePVPinfo []*Player
|
||||
HavePVPinfo []common.PlayerI
|
||||
monsters [3]int
|
||||
Canmon bool //可以刷怪
|
||||
Changemap bool //是否切换过地图
|
||||
@@ -85,9 +86,14 @@ func (p *Player) UseCoins(t uint32) bool {
|
||||
}
|
||||
func (p *Player) GetAction() {
|
||||
|
||||
}
|
||||
|
||||
func (f *Player) InvitePlayer(ff common.PlayerI) {
|
||||
f.HavePVPinfo = append(f.HavePVPinfo, ff)
|
||||
|
||||
}
|
||||
func (p *Player) Getfightinfo() info.Fightinfo {
|
||||
return *p.Fightinfo
|
||||
return p.Fightinfo
|
||||
}
|
||||
|
||||
func (p *Player) GetSpace() *space.Space {
|
||||
|
||||
9
logic/service/space/arena.go
Normal file
9
logic/service/space/arena.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package space
|
||||
|
||||
type S2C_ARENA_GET_INFO struct {
|
||||
Flag uint32 // 0=清除ArenaInfo(flag为0时其他字段全为空) 1=站上擂台的信息 2=挑战中的信息
|
||||
Id uint32
|
||||
Nick string `struc:"[16]byte"`
|
||||
HostWins uint32 // 应该是擂台人的连胜数
|
||||
ChallengerID uint32 // 挑战者的userid
|
||||
}
|
||||
@@ -21,7 +21,7 @@ type Space struct {
|
||||
SuperValue *int32
|
||||
//ID uint32 // 地图ID
|
||||
Name string //地图名称
|
||||
ARENA info.S2C_ARENA_GET_INFO
|
||||
ARENA S2C_ARENA_GET_INFO
|
||||
ARENA_Player common.PlayerI
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user