feat(fight): 重构PVP邀请系统,使用PVPinfo结构体替代原有map存储方式
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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邀请消息
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
} //如果对方掉线
|
||||
|
||||
Reference in New Issue
Block a user