From 55a5534777a5ad26400cd2544a11310542e3ecba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <12574910+72wo@users.noreply.github.com> Date: Wed, 4 Mar 2026 20:21:02 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(fight=5Fpvp=5Fking):=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=AE=A0=E7=89=A9=E7=8E=8B=E8=80=85=E5=AF=B9=E6=88=98?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加战斗类型11的处理逻辑,支持单人模式 - 验证宠物类型与对战类型的匹配性 - 根据战斗结果发放相应奖励物品 - 增加ItemAdd接口用于物品添加功能 - 扩展PetInfo结构体增加战斗类型字段 ``` --- logic/controller/action_大师杯.go | 147 +++++++++++++++++++++++++++++ logic/controller/fight_pvp_king.go | 23 ++++- logic/service/common/playeri.go | 2 +- logic/service/fight/info/info.go | 3 +- logic/service/player/base.go | 3 + logic/service/player/player.go | 2 +- modules/player/model/pet.go | 4 + 7 files changed, 177 insertions(+), 7 deletions(-) create mode 100644 logic/controller/action_大师杯.go diff --git a/logic/controller/action_大师杯.go b/logic/controller/action_大师杯.go new file mode 100644 index 000000000..20856264a --- /dev/null +++ b/logic/controller/action_大师杯.go @@ -0,0 +1,147 @@ +package controller + +import ( + "blazing/common/data" + "blazing/common/socket/errorcode" + "blazing/logic/service/common" + "blazing/logic/service/player" + "blazing/logic/service/task" + "blazing/modules/player/model" + + "github.com/pointernil/bitset32" +) + +func (h Controller) DASHIbei(data *C2s_MASTER_REWARDS, c *player.Player) (result *S2C_MASTER_REWARDS, err errorcode.ErrorCode) { + result = &S2C_MASTER_REWARDS{} + //草","水","火","电","战斗","飞行","机械","地面","冰" + // 按顺序:草、水、火、电、战斗、飞行、机械、地面、冰 + var ElementTypeNumbers = []int{1, 2, 3, 5, 11, 4, 6, 7, 9} + items := c.Service.Item.Get(80000000, 80000000+15) + result.Reward = make([]uint32, 9) + for i := 0; i < 9; i++ { + + for _, v1 := range items { + if ElementTypeNumbers[i]+80000000 == int(v1.ItemId) { + result.Reward[i] = uint32(v1.ItemCnt) + } + + } + } + + return +} +func (h Controller) DASHIbeiR(data *C2s_MASTER_REWARDSR, c *player.Player) (result *S2C_MASTER_REWARDSR, err errorcode.ErrorCode) { + result = &S2C_MASTER_REWARDSR{} + + //ids := []uint32{8, 7, 1, 9, 14, 15, 16, 17, 18, 2, 3, 4, 5, 6, 10, 11, 12, 13} + + tt, ok := nedds[data.ElementType] + if !ok { + return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError) + } + + taskInfo := task.GetTaskInfo(int(111), int(data.ElementType)) + if taskInfo == nil { + return nil, errorcode.ErrorCodes.ErrNeedCompleteTaskForPrize + } + + for _, v := range tt { + + if c.Service.Item.CheakItem(v.ItemId) < int64(v.ItemCnt) { + return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrInsufficientItems) + + } + + } + c.Service.Task.Exec(uint32(111), func(te *model.Task) bool { + + r := bitset32.From(te.Data) + // 分支未完成时,标记完成并发放奖励 + if !r.Test(uint(data.ElementType)) { + for _, v := range tt { + + c.Service.Item.UPDATE(v.ItemId, -int(v.ItemCnt)) + + } + r.Set(uint(data.ElementType)) + te.Data = r.Bytes() + + if taskInfo.Pet != nil { + + c.Service.Pet.PetAdd(taskInfo.Pet) + result.CaptureTime = taskInfo.Pet.CatchTime + result.PetTypeId = taskInfo.Pet.ID + } + + for _, item := range taskInfo.ItemList { + success := c.ItemAdd(item.ItemId, item.ItemCnt) + if success { + result.ItemList = append(result.ItemList, item) + } + + } + + return true + } else { + err = errorcode.ErrorCode(errorcode.ErrorCodes.ErrAwardAlreadyClaimed) + } + return false + }) + + return +} + +var nedds = map[uint32][]ItemS{ + 8: []ItemS{ + {ItemId: 80000001, ItemCnt: 100}, + {ItemId: 80000002, ItemCnt: 20}, + {ItemId: 80000003, ItemCnt: 20}, + {ItemId: 80000005, ItemCnt: 20}, + {ItemId: 80000011, ItemCnt: 20}}, + 7: []ItemS{ + {ItemId: 80000001, ItemCnt: 20}, + {ItemId: 80000002, ItemCnt: 20}, + {ItemId: 80000003, ItemCnt: 100}, + {ItemId: 80000005, ItemCnt: 20}, + {ItemId: 80000011, ItemCnt: 20}}, + 1: []ItemS{ + {ItemId: 80000001, ItemCnt: 20}, + {ItemId: 80000002, ItemCnt: 100}, + {ItemId: 80000003, ItemCnt: 20}, + {ItemId: 80000005, ItemCnt: 20}, + {ItemId: 80000011, ItemCnt: 20}}, +} + +type NeddItemS struct { + index uint32 + needitem []ItemS +} +type ItemS struct { + ItemId uint32 + ItemCnt uint32 +} + +type C2s_MASTER_REWARDS struct { + Head common.TomeeHeader `cmd:"2611" struc:"skip"` //玩家登录 + +} + +// OutInfo 表示地图热度的出站消息 +type S2C_MASTER_REWARDS struct { + ReLen uint32 `struc:"sizeof=Reward"` + Reward []uint32 `json:"Reward"` +} +type C2s_MASTER_REWARDSR struct { + Head common.TomeeHeader `cmd:"2612" struc:"skip"` //玩家登录 + ElementType uint32 +} + +// OutInfo 表示地图热度的出站消息 +type S2C_MASTER_REWARDSR struct { + BounsID uint32 + PetTypeId uint32 + CaptureTime uint32 + + ItemListLen uint32 `struc:"sizeof=ItemList"` + ItemList []data.ItemInfo `json:"Reward"` +} diff --git a/logic/controller/fight_pvp_king.go b/logic/controller/fight_pvp_king.go index 8b3c2fd87..c1941df4e 100644 --- a/logic/controller/fight_pvp_king.go +++ b/logic/controller/fight_pvp_king.go @@ -58,14 +58,29 @@ func (h Controller) PetKing(data *fight.PetKingJoinInboundInfo, c *player.Player c.Fightinfo.Mode = info.BattleMode.SINGLE_MODE case 6: c.Fightinfo.Mode = info.BattleMode.MULTI_MODE + case 11: + c.Fightinfo.Mode = info.BattleMode.SINGLE_MODE + if c.GetPetInfo()[0].Type() != int(data.FightType) { + return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrVictoryConditionNotMet) + } + c.Fightinfo.FightType = data.FightType } err = c.JoinFight(func(p common.PlayerI) bool { _, err = fight.NewFight(p, c, func(foi info.FightOverInfo) { if foi.Reason == 0 { //我放获胜 - if foi.WinnerId == c.GetInfo().UserID { - c.Info.MonKingWin += 1 - } else { - p.GetInfo().MonKingWin += 1 + switch data.Type { + case 11: + if foi.WinnerId == c.GetInfo().UserID { + c.ItemAdd(80000000+int64(data.FightType), 1) + } else { + p.ItemAdd(80000000+int64(data.FightType), 1) + } + default: + if foi.WinnerId == c.GetInfo().UserID { + c.Info.MonKingWin += 1 + } else { + p.GetInfo().MonKingWin += 1 + } } } diff --git a/logic/service/common/playeri.go b/logic/service/common/playeri.go index b5746ac8b..3971b36a1 100644 --- a/logic/service/common/playeri.go +++ b/logic/service/common/playeri.go @@ -11,7 +11,7 @@ type PlayerI interface { Roll(int, int) (bool, float64, float64) //SendPack(b []byte) error Getfightinfo() info.Fightinfo - + ItemAdd(ItemId, ItemCnt int64) (result bool) GetInfo() *model.PlayerInfo InvitePlayer(PlayerI) SetFightC(FightI) diff --git a/logic/service/fight/info/info.go b/logic/service/fight/info/info.go index ddaf9639b..4e9c0b521 100644 --- a/logic/service/fight/info/info.go +++ b/logic/service/fight/info/info.go @@ -49,7 +49,8 @@ type Fightinfo struct { Mode uint32 //Type uint32 //战斗类型 - Status uint32 + Status uint32 + FightType uint32 } // FightPetInfo 战斗精灵信息结构体,FightPetInfo类 diff --git a/logic/service/player/base.go b/logic/service/player/base.go index fdd187ff7..2bf2d70de 100644 --- a/logic/service/player/base.go +++ b/logic/service/player/base.go @@ -86,6 +86,9 @@ func (p *baseplayer) GetPetInfo() []model.PetInfo { return p.Info.PetList } +func (p *baseplayer) ItemAdd(ItemId, ItemCnt int64) (result bool) { + return true +} func (lw *baseplayer) SendLoadPercent(info.LoadPercentOutboundInfo) { diff --git a/logic/service/player/player.go b/logic/service/player/player.go index 82aaf2a20..3e3b8cb3b 100644 --- a/logic/service/player/player.go +++ b/logic/service/player/player.go @@ -57,7 +57,7 @@ func (o *OgrePetInfo) GetLevel() int { // handleNPCFightSpecial 处理NPC战斗特殊情况 func (o *OgrePetInfo) HandleNPCFightSpecial(can int) { - if can == 0 && o.Ext == 0 {//不能抓并且不是尼尔 + if can == 0 && o.Ext == 0 { //不能抓并且不是尼尔 o.IsCapture = 0 return } diff --git a/modules/player/model/pet.go b/modules/player/model/pet.go index c58f93139..b876d917c 100644 --- a/modules/player/model/pet.go +++ b/modules/player/model/pet.go @@ -118,6 +118,10 @@ type PetInfo struct { ExtSkin []uint32 `struc:"skip"` //可用皮肤 } +func (pet *PetInfo) Type() int { + return xmlres.PetMAP[int(pet.ID)].Type + +} func (pet *PetInfo) ModelHP(tt int64) { if pet.Hp <= 0 { if tt > int64(pet.Hp) {