feat(fight): 重构PVP邀请系统,使用PVPinfo结构体替代原有map存储方式

This commit is contained in:
1
2025-09-21 07:22:42 +00:00
parent f19c901f42
commit 30453045c7
4 changed files with 60 additions and 54 deletions

View File

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

View File

@@ -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邀请消息

View File

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

View File

@@ -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
} //如果对方掉线