diff --git a/logic/controller/fight.go b/logic/controller/fight.go index ab2f8397..5e9bba42 100644 --- a/logic/controller/fight.go +++ b/logic/controller/fight.go @@ -84,7 +84,7 @@ func (h Controller) OnPlayerHandleFightInvite(data *fight.HandleFightInviteInbou // 邀请其他人进行战斗 func (h Controller) OnPlayerInviteOtherFight(data *fight.InviteToFightInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { - c.InvitePlayerToBattle(data.UserID, info.EnumBattleMode(data.Mode)) + c.InvitePlayerToBattle(&info.PVPinfo{data.UserID, data.Mode}) return nil, 0 } diff --git a/logic/service/fight/cmd.go b/logic/service/fight/cmd.go index 73e42cc5..d7aa4cfd 100644 --- a/logic/service/fight/cmd.go +++ b/logic/service/fight/cmd.go @@ -2,6 +2,7 @@ package fight import ( _ "blazing/logic/service/fight/effect" + "blazing/logic/service/fight/info" "blazing/logic/service/player" ) @@ -48,7 +49,7 @@ type InviteToFightInboundInfo struct { // Mode 战斗类型 1 = 1v1 2 = 6v6 // 对应 Java 注解: @FieldDescription("战斗类型 1 = 1v1 2 = 6v6") @UInt - Mode uint32 `codec:"true"` + Mode info.EnumBattleMode `codec:"true"` } // 2502的回复包 PVP邀请消息 diff --git a/logic/service/fight/info/info.go b/logic/service/fight/info/info.go index 9b1e321b..01512ba1 100644 --- a/logic/service/fight/info/info.go +++ b/logic/service/fight/info/info.go @@ -21,22 +21,17 @@ type ChangePetInfo struct { CatchTime uint32 `fieldDesc:"捕捉时间" ` } type NoteInviteToFightOutboundInfo struct { - // UserID 邀请我对战人的userid - // 对应 Java 注解: @FieldDescription("邀请我对战人的userid") @UInt UserID uint32 `codec:"true"` - - // Nickname 邀请我对战人的玩家名称 - // 对应 Java 注解: @FieldDescription("邀请我对战人的玩家名称") @ArraySerialize(value = ArraySerializeType.FIXED_LENGTH, fixedLength = 16) - Nick string `struc:"[16]byte" default:"seer" json:"nick"` // 16字节昵称 - + Nick string `struc:"[16]byte" default:"seer" json:"nick"` // 16字节昵称 // Mode 战斗模式 1 = 1v1 2 = 6v6 - // 对应 Java 注解: @FieldDescription("战斗模式 1 = 1v1 2 = 6v6") @UInt + Mode EnumBattleMode `codec:"true"` } + type S2C_NOTE_HANDLE_FIGHT_INVITE struct { // UserID 对方的userid UserID uint32 - // 对应 Java 注解: @FieldDescription("邀请我对战人的玩家名称") @ArraySerialize(value = ArraySerializeType.FIXED_LENGTH, fixedLength = 16) + Nick string `struc:"[16]byte" default:"seer" json:"nick"` // 16字节昵称 // Result 处理结果 // 0=对方拒绝了对战 @@ -46,6 +41,10 @@ type S2C_NOTE_HANDLE_FIGHT_INVITE struct { // 4=对方不在线 Result uint32 } +type PVPinfo struct { + PlayerID uint32 + Mode EnumBattleMode +} // FightPetInfo 战斗精灵信息结构体,FightPetInfo类 type FightPetInfo struct { diff --git a/logic/service/player/player.go b/logic/service/player/player.go index f19566ef..283e9acb 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -97,12 +97,12 @@ type Player struct { StopChan chan struct{} //停止刷怪协程 context.Context - Playerinvite uint32 //当前邀请的玩家ID - Onlinetime uint32 //当前登录时间 - OgreInfo *OgreInfo - FightC common.FightI //绑定战斗标识 替代本身的是否战斗标记 //IsFighting bool - Service *blservice.UserService - PVPinfo map[uint32]info.EnumBattleMode + PVPinfo *info.PVPinfo //当前邀请的玩家ID + Onlinetime uint32 //当前登录时间 + OgreInfo *OgreInfo + FightC common.FightI //绑定战斗标识 替代本身的是否战斗标记 //IsFighting bool + Service *blservice.UserService + HavePVPinfo []*Player //FightInfo info.NoteReadyToFightInfo } @@ -118,8 +118,8 @@ func WithConn(c *Conn) PlayerOption { // NewPlayer 使用 Options 模式创建 Player 实例 func NewPlayer(opts ...PlayerOption) *Player { p := &Player{ - loginChan: make(chan struct{}), - PVPinfo: make(map[uint32]info.EnumBattleMode), + loginChan: make(chan struct{}), + HavePVPinfo: make([]*Player, 0), } for _, opt := range opts { opt(p) @@ -332,24 +332,21 @@ func (lw *Player) IsNewPlayer() bool { return false // 全部等于3则返回false } -// type Playerinvite struct { //挂载到[]Playerinvite上? 被邀请者->邀请者 -// InviteID uint32 // 邀请者 -// InviteTime EnumBattleMode //游戏模式 -// } - // 邀请玩家加入战斗 邀请者,被邀请者,邀请模式 -func (lw *Player) InvitePlayerToBattle(target uint32, mode info.EnumBattleMode) { - lw.Playerinvite = uint32(target) +func (lw *Player) InvitePlayerToBattle(pinfo *info.PVPinfo) { + lw.PVPinfo = pinfo Mainplayer.Range(func(key uint32, value *Player) bool { - if key == uint32(target) { - value.PVPinfo[uint32(lw.Info.UserID)] = mode + if key == uint32(lw.PVPinfo.PlayerID) { + + value.HavePVPinfo = append([]*Player{value}, value.HavePVPinfo...) t1 := NewTomeeHeader(2501, value.Info.UserID) - value.SendPack(t1.Pack(&info.NoteInviteToFightOutboundInfo{ + t := info.NoteInviteToFightOutboundInfo{ UserID: lw.ID(), Nick: lw.Info.Nick, - Mode: mode, - })) + Mode: pinfo.Mode, + } + value.SendPack(t1.Pack(&t)) return false } @@ -361,20 +358,25 @@ func (lw *Player) InvitePlayerToBattle(target uint32, mode info.EnumBattleMode) // 取消对战邀请 func (lw *Player) CancelBattle() { - if lw.Playerinvite == 0 { + if lw.PVPinfo == nil { return } Mainplayer.Range(func(key uint32, value *Player) bool { - if key == uint32(lw.Playerinvite) { - delete(value.PVPinfo, uint32(lw.Playerinvite)) //删除玩家邀请信息 + if key == uint32(lw.PVPinfo.PlayerID) { + for idx, v := range value.HavePVPinfo { + if v != nil && v.ID() == lw.PVPinfo.PlayerID { + value.HavePVPinfo = append(value.HavePVPinfo[:idx], value.HavePVPinfo[idx+1:]...) + } + } + return false } return true }) - lw.Playerinvite = 0 + lw.PVPinfo = nil } func (lw *Player) CanBattle() bool { @@ -391,10 +393,17 @@ func (lw *Player) CanBattle() bool { // 同意对战 func (lw *Player) AgreeBattle(userid, flag, mode uint32) (bool, common.PlayerI) { - otherpp, ok := Mainplayer.Load(userid) - defer delete(lw.PVPinfo, userid) //删除对方的邀请信息 - if ok { //获取到对方 - t1 := NewTomeeHeader(2502, otherpp.Info.UserID) + defer func(p *Player) { + p.HavePVPinfo = make([]*Player, 0) + + }(lw) //删除对方的邀请信息 + + for _, v := range lw.HavePVPinfo { + if v == nil || v.ID() != userid || v.PVPinfo == nil { + continue + + } + t1 := NewTomeeHeader(2502, v.Info.UserID) ret := &info.S2C_NOTE_HANDLE_FIGHT_INVITE{ UserID: lw.ID(), Nick: lw.Info.Nick, @@ -402,32 +411,29 @@ func (lw *Player) AgreeBattle(userid, flag, mode uint32) (bool, common.PlayerI) if flag == 0 { //拒绝对战 - otherpp.SendPack(t1.Pack(ret)) + v.SendPack(t1.Pack(ret)) return false, nil } if !lw.IsLogin { //玩家未登录 ret.Result = 4 - otherpp.SendPack(t1.Pack(ret)) + v.SendPack(t1.Pack(ret)) return false, nil } - for t, v := range lw.PVPinfo { - if t == userid && uint32(v) == mode { //成功找到,同意对战 - if lw.CanBattle() { - ret.Result = 1 - //todo 待发送2503开始对战 - otherpp.SendPack(t1.Pack(ret)) - return true, otherpp + if v.PVPinfo.PlayerID == userid && uint32(v.PVPinfo.Mode) == mode { //成功找到,同意对战 + if lw.CanBattle() { + ret.Result = 1 - } else { - ret.Result = 3 - otherpp.SendPack(t1.Pack(ret)) - return false, nil - } + v.SendPack(t1.Pack(ret)) + return true, v + } else { + ret.Result = 3 + v.SendPack(t1.Pack(ret)) + return false, nil } - return false, nil } + return false, nil } //如果对方掉线