game_sync/worldsrv/action_bag.go

271 lines
8.5 KiB
Go

package main
import (
"fmt"
"math/rand"
"time"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/goserver/core/task"
"mongo.games.com/game/common"
"mongo.games.com/game/model"
"mongo.games.com/game/protocol/bag"
"mongo.games.com/game/srvdata"
)
// 查看背包
type CSBagInfoPacketFactory struct {
}
type CSBagInfoHandler struct {
}
func (this *CSBagInfoPacketFactory) CreatePacket() interface{} {
pack := &bag.CSBagInfo{}
return pack
}
func (this *CSBagInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSBagInfoHandler Process recv ", data)
if _, ok := data.(*bag.CSBagInfo); ok {
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSBagInfoHandler p == nil")
return nil
}
platform := p.GetPlatform()
if platform == nil {
return nil
}
//nowLocation := int(msg.NowLocation - 1)
playbag := BagMgrSingleton.GetBagInfo(p.SnId)
pack := &bag.SCBagInfo{RetCode: bag.OpResultCode_OPRC_Sucess, BagNumMax: BagItemMax}
if playbag != nil {
for _, v := range playbag.BagItem {
item := srvdata.PBDB_GameItemMgr.GetData(v.ItemId)
if item != nil && v.ItemNum > 0 /*&& (nowLocation == -1 || (nowLocation < len(item.ShowLocation) && item.ShowLocation[nowLocation] == 1))*/ {
pack.Infos = append(pack.Infos, &bag.ItemInfo{
ItemId: v.ItemId,
ItemNum: v.ItemNum,
//Name: item.Name,
//ShowLocation: item.ShowLocation,
//Classify: item.Classify,
//Type: item.Type,
//Effect0: item.Effect0,
//Effect: item.Effect,
//SaleType: item.SaleType,
//SaleGold: item.SaleGold,
//Composition: item.Composition,
//CompositionMax: item.CompositionMax,
//Time: item.Time,
//Location: item.Location,
//Describe: item.Describe,
ObtainTime: v.ObtainTime,
})
}
}
}
logger.Logger.Trace("SCBagInfo:", pack)
p.SendToClient(int(bag.SPacketID_PACKET_ALL_BAG_INFO), pack)
}
return nil
}
// 使用/获取道具 PS严格来说客户端只存在消耗道具 服务器增加 上线要禁止该接口增加道具
type CSUpBagInfoPacketFactory struct {
}
type CSUpBagInfoHandler struct {
}
func (this *CSUpBagInfoPacketFactory) CreatePacket() interface{} {
pack := &bag.CSUpBagInfo{}
return pack
}
func (this *CSUpBagInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Trace("CSUpBagInfoHandler Process recv ", data)
msg, ok := data.(*bag.CSUpBagInfo)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
logger.Logger.Warn("CSUpBagInfoHandler p == nil")
return nil
}
platform := p.GetPlatform()
if platform == nil {
return nil
}
pack := &bag.SCUpBagInfo{RetCode: bag.OpResultCode_OPRC_Error}
send := func() {
p.SendToClient(int(bag.SPacketID_PACKET_ALL_BAG_USE), pack)
logger.Logger.Tracef("SCUpBagInfo: %v", pack)
}
item := BagMgrSingleton.GetItem(p.SnId, msg.ItemId)
if item == nil || msg.ItemNum <= 0 || item.ItemNum < int64(msg.ItemNum) || len(item.Effect) != ItemMax || p.SnId == msg.AcceptSnId {
send()
return nil
}
var isCanOp int32
if msg.NowEffect == 0 { //竖版
isCanOp = item.Effect0[msg.Opt]
} else if msg.NowEffect == 1 { //横版
isCanOp = item.Effect[msg.Opt]
}
if isCanOp == 0 {
logger.Logger.Trace("道具没有操作权限", msg.ItemId)
send()
return nil
}
ts := time.Now().Unix()
switch msg.Opt {
case ItemCanUse:
logger.Logger.Trace("道具使用", msg.ItemId)
f := func() {
// 使用道具,减少道具
BagMgrSingleton.SalePlayerItem(p, item, int64(msg.ItemNum))
BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemConsume, item.ItemId, item.Name, int64(msg.ItemNum), "道具使用")
pack.RetCode = bag.OpResultCode_OPRC_Sucess
pack.NowItemId = item.ItemId
pack.NowItemNum = item.ItemNum
}
switch item.ItemId {
case common.ItemIDGiftBox:
f()
useFunc := func() {
sum := 0
for _, v := range srvdata.PBDB_GiftBoxMgr.Datas.GetArr() {
sum += int(v.GetRate())
}
if sum > 0 {
n := 0
i := rand.Intn(sum)
for _, v := range srvdata.PBDB_GiftBoxMgr.Datas.GetArr() {
n += int(v.GetRate())
if i < n {
var items []*Item
for k, vv := range v.ItemID {
if vv > 0 {
items = append(items, &Item{
ItemId: int32(k),
ItemNum: vv,
ObtainTime: ts,
})
}
}
if len(items) > 0 {
BagMgrSingleton.AddJybBagInfo(p, items, 0, common.GainWay_ItemUse, "player", "道具使用")
for _, v := range items {
data := srvdata.PBDB_GameItemMgr.GetData(v.ItemId)
if data != nil {
// 背包变更记录
BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemObtain, v.ItemId, data.Name, v.ItemNum, "碎片礼盒获得")
}
pack.Infos = append(pack.Infos, &bag.ItemInfo{
ItemId: v.ItemId,
ItemNum: v.ItemNum,
ObtainTime: v.ObtainTime,
})
}
}
break
}
}
}
}
for i := 0; i < int(msg.ItemNum); i++ {
useFunc()
}
default:
logger.Logger.Warnf("道具使用未定义", msg.ItemId)
}
case ItemCanGive:
logger.Logger.Trace("道具赠送", msg.ItemId)
acceptPlayer := PlayerMgrSington.GetPlatformPlayerBySnId(p.Platform, msg.AcceptSnId)
if acceptPlayer != nil {
BagMgrSingleton.AddMailByItem(p.Platform, p.SnId, p.Name, msg.AcceptSnId, msg.ShowId, []int32{msg.ItemId, msg.ItemNum})
BagMgrSingleton.SalePlayerItem(p, item, int64(msg.ItemNum))
remark := fmt.Sprintf("赠送给玩家(%v)", msg.AcceptSnId)
BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemConsume, item.ItemId, item.Name, int64(msg.ItemNum), remark)
logger.Logger.Trace("道具赠送成功", msg.ItemId)
pack.RetCode = bag.OpResultCode_OPRC_Sucess
pack.NowItemId = msg.ItemId
pack.NowItemNum = item.ItemNum
} else {
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
return model.GetPlayerBaseInfo(p.Platform, msg.AcceptSnId)
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
aPlayer := data.(*model.PlayerBaseInfo)
if data != nil && aPlayer != nil {
BagMgrSingleton.AddMailByItem(p.Platform, p.SnId, p.Name, msg.AcceptSnId, msg.ShowId, []int32{msg.ItemId, msg.ItemNum})
BagMgrSingleton.SalePlayerItem(p, item, int64(msg.ItemNum))
remark := fmt.Sprintf("赠送给玩家(%v)", msg.AcceptSnId)
BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemConsume, item.ItemId, item.Name, int64(msg.ItemNum), remark)
logger.Logger.Trace("道具赠送成功", msg.ItemId)
pack.RetCode = bag.OpResultCode_OPRC_Sucess
pack.NowItemId = msg.ItemId
pack.NowItemNum = item.ItemNum
} else {
pack.RetCode = bag.OpResultCode_OPRC_NotPlayer
}
send()
}), "GetPlayerBaseInfo").Start()
return nil
}
case ItemCanSell:
logger.Logger.Trace("道具出售", msg.ItemId)
if msg.ItemNum > 0 {
isF := BagMgrSingleton.SaleItem(p, msg.ItemId, int64(msg.ItemNum))
if isF {
pack.RetCode = bag.OpResultCode_OPRC_Sucess
if item.SaleGold > 0 {
if item.SaleType == 1 {
remark := "道具出售" + fmt.Sprintf("%v-%v", msg.ItemId, msg.ItemNum)
p.AddCoin(int64(item.SaleGold*msg.ItemNum), 0, common.GainWay_Item_Sale, "sys", remark)
pack.Coin = int64(item.SaleGold * msg.ItemNum)
BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemConsume, item.ItemId, item.Name, int64(msg.ItemNum), "道具出售")
} else if item.SaleType == 2 {
remark := "道具出售" + fmt.Sprintf("%v-%v", msg.ItemId, msg.ItemNum)
p.AddDiamond(int64(item.SaleGold*msg.ItemNum), 0, common.GainWay_Item_Sale, "sys", remark)
pack.Diamond = int64(item.SaleGold * msg.ItemNum)
BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemConsume, item.ItemId, item.Name, int64(msg.ItemNum), "道具出售")
}
}
pack.NowItemId = item.ItemId
pack.NowItemNum = item.ItemNum
}
}
}
send()
return nil
}
func init() {
// 查看背包
common.RegisterHandler(int(bag.SPacketID_PACKET_ALL_BAG_INFO), &CSBagInfoHandler{})
netlib.RegisterFactory(int(bag.SPacketID_PACKET_ALL_BAG_INFO), &CSBagInfoPacketFactory{})
// 道具操作(赠送,出售...)
common.RegisterHandler(int(bag.SPacketID_PACKET_ALL_BAG_USE), &CSUpBagInfoHandler{})
netlib.RegisterFactory(int(bag.SPacketID_PACKET_ALL_BAG_USE), &CSUpBagInfoPacketFactory{})
}