From a2fe2515d22af09470ffd375ef8079cc2615b1a4 Mon Sep 17 00:00:00 2001 From: 1 <1@72wo.cn> Date: Wed, 27 Aug 2025 05:10:10 +0000 Subject: [PATCH] =?UTF-8?q?feat(fight):=20=E5=AE=9E=E7=8E=B0=E7=8E=A9?= =?UTF-8?q?=E5=AE=B6=E5=AF=B9=E6=88=98=E9=82=80=E8=AF=B7=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=8F=8APVP=E6=A8=A1=E5=BC=8F=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/data/entity/player.go | 39 ++++++++++++++++++++++++++++++ logic/controller/fight.go | 8 ++++++ logic/service/fight/info/invite.go | 4 ++- logic/service/fight/pvp.go | 19 +++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 logic/service/fight/pvp.go diff --git a/common/data/entity/player.go b/common/data/entity/player.go index fc87c4ac2..79801aae2 100644 --- a/common/data/entity/player.go +++ b/common/data/entity/player.go @@ -7,6 +7,7 @@ import ( "time" "github.com/gogf/gf/v2/frame/g" + "github.com/tnnmigga/enum" ) type Player struct { @@ -21,6 +22,7 @@ type Player struct { StopChan chan struct{} //停止刷怪协程 IsFighting bool context.Context + Playerinvite uint32 //当前邀请的玩家ID } // PlayerOption 定义配置 Player 的函数类型 @@ -129,3 +131,40 @@ func (lw *Player) CompleteLogin() { close(lw.loginChan) // 关闭通道以通知所有等待者 } } + +// 战斗模式 +type EnumBattleMode int + +var BattleMode_PVP = enum.New[struct { + PVP_1V1 EnumBattleMode `enum:"1"` + PVP_6V6 EnumBattleMode `enum:"2"` +}]() +var Playerinvitemap map[uint32][]Playerinvite = make(map[uint32][]Playerinvite) //玩家邀请信息 ,比如一个玩家被多人邀请对战 + +type Playerinvite struct { //挂载到[]Playerinvite上? 被邀请者->邀请者 + InviteID uint32 // 邀请者 + InviteTime EnumBattleMode //游戏模式 +} + +// 邀请玩家加入战斗 邀请者,被邀请者,邀请模式 +func (lw *Player) InvitePlayerToBattle(target int64, mode EnumBattleMode) { + t, ok := Playerinvitemap[uint32(target)] //被邀请者是否被邀请过 + if ok { //说明存在被邀请 + t = append(t, Playerinvite{uint32(lw.UserID), mode}) + Playerinvitemap[uint32(target)] = t + } else { + Playerinvitemap[uint32(target)] = []Playerinvite{{uint32(lw.UserID), mode}} + } + + lw.Playerinvite = uint32(target) +} + +// 取消对战邀请 +func (lw *Player) CancelBattle() { + + if lw.Playerinvite == 0 { + return + } + delete(Playerinvitemap, uint32(lw.Playerinvite)) //删除玩家邀请信息 + lw.Playerinvite = 0 +} diff --git a/logic/controller/fight.go b/logic/controller/fight.go index 370b641d9..f32bd7646 100644 --- a/logic/controller/fight.go +++ b/logic/controller/fight.go @@ -68,3 +68,11 @@ func (h Controller) OnReadyToFight(data *fight.ReadyToFightInboundInfo, c *entit c.SendPack(t1.Pack(&rett)) return nil, -1 } + +/** + * 接收战斗或者取消战斗的包 + */ +func (h Controller) OnPlayerHandleFightInvite(data *fight.HandleFightInviteInboundInfo, c *entity.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { + + return nil, -1 +} diff --git a/logic/service/fight/info/invite.go b/logic/service/fight/info/invite.go index 1fa1deb61..58e6eac3f 100644 --- a/logic/service/fight/info/invite.go +++ b/logic/service/fight/info/invite.go @@ -8,9 +8,11 @@ var BattleMode_PVP = enum.New[struct { PVP_1V1 EnumBattleMode `enum:"1"` PVP_6V6 EnumBattleMode `enum:"2"` }]() -var Playerinvitemap map[uint32][]Playerinvite //玩家邀请信息 ,比如一个玩家被多人邀请对战 +var Playerinvitemap map[uint32][]Playerinvite = make(map[uint32][]Playerinvite) //玩家邀请信息 ,比如一个玩家被多人邀请对战 type Playerinvite struct { //挂载到[]Playerinvite上? 被邀请者->邀请者 InviteID uint32 // 邀请者 InviteTime EnumBattleMode //游戏模式 } + + diff --git a/logic/service/fight/pvp.go b/logic/service/fight/pvp.go new file mode 100644 index 000000000..bc0a4b004 --- /dev/null +++ b/logic/service/fight/pvp.go @@ -0,0 +1,19 @@ +package fight + +import "blazing/common/socket/handler" + +// HandleFightInviteInboundInfo 处理战斗邀请的入站消息 +// 回空包就行 +type HandleFightInviteInboundInfo struct { + Head handler.TomeeHeader `cmd:"2403" struc:"[0]pad"` + UserID uint32 `json:"userId" codec:"userId,uint"` // 邀请我对战人的userid + Flag uint32 `json:"flag" codec:"flag,uint"` // 1为同意对战 0为取消对战 + Mode uint32 `json:"mode" codec:"mode,uint"` // 战斗类型 1 = 1v1 2 = 6v6 +} + +// 2502的回复包 PVP邀请消息 +type NoteHandleFightInviteOutboundInfo struct { + UserID uint32 + Nickname string `struc:"[16]byte"` // 固定长度16字节 + Result uint32 // 0=拒绝 1=同意 2=在线超6小时 3=无出战精灵 4=不在线 +}