173 lines
4.7 KiB
Go
173 lines
4.7 KiB
Go
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"
|
|
)
|
|
|
|
const (
|
|
masterCupTaskID uint32 = 111
|
|
masterCupRewardItemMin uint32 = 80000000
|
|
masterCupRewardItemMax uint32 = 80000015
|
|
)
|
|
|
|
var masterCupRewardElementOrder = [...]uint32{1, 2, 3, 5, 11, 4, 6, 7, 9}
|
|
|
|
var masterCupRequiredItems = map[uint32][]ItemS{
|
|
8: {
|
|
{ItemId: 80000001, ItemCnt: 100},
|
|
{ItemId: 80000002, ItemCnt: 20},
|
|
{ItemId: 80000003, ItemCnt: 20},
|
|
{ItemId: 80000005, ItemCnt: 20},
|
|
{ItemId: 80000011, ItemCnt: 20},
|
|
},
|
|
7: {
|
|
{ItemId: 80000001, ItemCnt: 20},
|
|
{ItemId: 80000002, ItemCnt: 20},
|
|
{ItemId: 80000003, ItemCnt: 100},
|
|
{ItemId: 80000005, ItemCnt: 20},
|
|
{ItemId: 80000011, ItemCnt: 20},
|
|
},
|
|
1: {
|
|
{ItemId: 80000001, ItemCnt: 20},
|
|
{ItemId: 80000002, ItemCnt: 100},
|
|
{ItemId: 80000003, ItemCnt: 20},
|
|
{ItemId: 80000005, ItemCnt: 20},
|
|
{ItemId: 80000011, ItemCnt: 20},
|
|
},
|
|
}
|
|
|
|
// DASHIbei 处理控制器请求。
|
|
func (h Controller) DASHIbei(req *C2s_MASTER_REWARDS, c *player.Player) (result *S2C_MASTER_REWARDS, err errorcode.ErrorCode) {
|
|
_ = req
|
|
result = &S2C_MASTER_REWARDS{}
|
|
items := c.Service.Item.Get(masterCupRewardItemMin, masterCupRewardItemMax)
|
|
result.Reward = buildMasterCupRewards(items)
|
|
|
|
return
|
|
}
|
|
|
|
// DASHIbeiR 处理控制器请求。
|
|
func (h Controller) DASHIbeiR(req *C2s_MASTER_REWARDSR, c *player.Player) (result *S2C_MASTER_REWARDSR, err errorcode.ErrorCode) {
|
|
result = &S2C_MASTER_REWARDSR{}
|
|
|
|
requiredItems, ok := masterCupRequiredItems[req.ElementType]
|
|
if !ok {
|
|
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError)
|
|
}
|
|
|
|
taskInfo := task.GetTaskInfo(int(masterCupTaskID), int(req.ElementType))
|
|
if taskInfo == nil {
|
|
return nil, errorcode.ErrorCodes.ErrNeedCompleteTaskForPrize
|
|
}
|
|
|
|
if !hasEnoughMasterCupItems(c, requiredItems) {
|
|
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrInsufficientItems)
|
|
}
|
|
|
|
result.ItemList = make([]data.ItemInfo, 0, len(taskInfo.ItemList))
|
|
taskData, taskErr := c.Service.Task.GetTask(masterCupTaskID)
|
|
if taskErr != nil {
|
|
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError)
|
|
}
|
|
|
|
progress := bitset32.From(taskData.Data)
|
|
if progress.Test(uint(req.ElementType)) {
|
|
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrAwardAlreadyClaimed)
|
|
}
|
|
|
|
consumeMasterCupItems(c, requiredItems)
|
|
progress.Set(uint(req.ElementType))
|
|
taskData.Data = progress.Bytes()
|
|
if taskErr = c.Service.Task.SetTask(taskData); taskErr != nil {
|
|
return nil, errorcode.ErrorCode(errorcode.ErrorCodes.ErrSystemError)
|
|
}
|
|
|
|
if taskInfo.Pet != nil {
|
|
c.Service.Pet.PetAdd(taskInfo.Pet, 0)
|
|
result.CaptureTime = taskInfo.Pet.CatchTime
|
|
result.PetTypeId = taskInfo.Pet.ID
|
|
}
|
|
|
|
appendMasterCupRewardItems(c, result, taskInfo.ItemList)
|
|
|
|
return
|
|
}
|
|
|
|
// ItemS 定义请求或响应数据结构。
|
|
type ItemS struct {
|
|
ItemId uint32
|
|
ItemCnt uint32
|
|
}
|
|
|
|
func buildMasterCupRewards(items []model.Item) []uint32 {
|
|
itemCounts := make(map[uint32]uint32, len(items))
|
|
for _, item := range items {
|
|
itemCounts[item.ItemId] = uint32(item.ItemCnt)
|
|
}
|
|
|
|
rewards := make([]uint32, len(masterCupRewardElementOrder))
|
|
for i, elementType := range masterCupRewardElementOrder {
|
|
rewards[i] = itemCounts[masterCupRewardItemMin+elementType]
|
|
}
|
|
|
|
return rewards
|
|
}
|
|
|
|
func hasEnoughMasterCupItems(c *player.Player, requiredItems []ItemS) bool {
|
|
for _, item := range requiredItems {
|
|
if c.Service.Item.CheakItem(item.ItemId) < int64(item.ItemCnt) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func consumeMasterCupItems(c *player.Player, requiredItems []ItemS) {
|
|
for _, item := range requiredItems {
|
|
c.Service.Item.UPDATE(item.ItemId, -int(item.ItemCnt))
|
|
}
|
|
}
|
|
|
|
func appendMasterCupRewardItems(c *player.Player, result *S2C_MASTER_REWARDSR, itemList []data.ItemInfo) {
|
|
for _, item := range itemList {
|
|
if c.ItemAdd(item.ItemId, item.ItemCnt) {
|
|
result.ItemList = append(result.ItemList, item)
|
|
}
|
|
}
|
|
}
|
|
|
|
// C2s_MASTER_REWARDS 定义请求或响应数据结构。
|
|
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"`
|
|
}
|
|
|
|
// C2s_MASTER_REWARDSR 定义请求或响应数据结构。
|
|
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"`
|
|
}
|