feat(fight_pvp_king): 新增宠物王者对战模式支持 - 添加战斗类型11的处理逻辑,支持单人模式 - 验证宠物类型与对战类型的匹配性 - 根据战斗结果发放相应奖励物品 - 增加ItemAdd接口用于物品添加功能 - 扩展PetInfo结构体增加战斗类型字段 ```
This commit is contained in:
147
logic/controller/action_大师杯.go
Normal file
147
logic/controller/action_大师杯.go
Normal file
@@ -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"`
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -49,7 +49,8 @@ type Fightinfo struct {
|
||||
Mode uint32
|
||||
//Type uint32 //战斗类型
|
||||
|
||||
Status uint32
|
||||
Status uint32
|
||||
FightType uint32
|
||||
}
|
||||
|
||||
// FightPetInfo 战斗精灵信息结构体,FightPetInfo类
|
||||
|
||||
@@ -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) {
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user