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 msg, 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) tp := msg.GetTp() // 道具类型 bagInfo := BagMgrSingleton.GetBagInfo(p.SnId) pack := &bag.SCBagInfo{RetCode: bag.OpResultCode_OPRC_Sucess, BagNumMax: BagItemMax} if bagInfo != nil { for _, v := range bagInfo.BagItem { item := srvdata.PBDB_GameItemMgr.GetData(v.ItemId) if item != nil && v.ItemNum > 0 && (tp <= 0 || item.GetType() == tp) /*&& (nowLocation == -1 || (nowLocation < len(item.ShowLocation) && item.ShowLocation[nowLocation] == 1))*/ { pack.Infos = append(pack.Infos, &bag.ItemInfo{ ItemId: v.ItemId, ItemNum: v.ItemNum, 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 } if common.Config.IsDevMode { if msg.GetOpt() == -1 { items := []*Item{{ ItemId: msg.ItemId, ItemNum: int64(msg.ItemNum), }} BagMgrSingleton.AddJybBagInfo(p, items, 0, common.GainWay_AddBag, "system", "测试") for _, v := range items { BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemObtain, v.ItemId, v.Name, v.ItemNum, "测试") } 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() } case common.ItemIDCollectBox: f() useFunc := func() { sum := 0 for _, v := range srvdata.PBDB_CollectBoxMgr.Datas.GetArr() { sum += int(v.GetRate()) } if sum > 0 { n := 0 i := rand.Intn(sum) for _, v := range srvdata.PBDB_CollectBoxMgr.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 CSExchangeList(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSExchangeList", data) msg, ok := data.(*bag.CSExchangeList) if !ok { return nil } p := PlayerMgrSington.GetPlayer(sid) if p == nil { return nil } pack := &bag.SCExchangeList{ Tp: msg.Tp, } for _, v := range srvdata.PBDB_PropExchangeMgr.Datas.GetArr() { if v.GetGroup() != msg.Tp { continue } var costItems, gainItems []*bag.PropInfo for k, v := range v.GetCost() { costItems = append(costItems, &bag.PropInfo{ ItemId: int32(k), ItemNum: v, }) } for k, v := range v.GetGain() { gainItems = append(gainItems, &bag.PropInfo{ ItemId: int32(k), ItemNum: v, }) } pack.Infos = append(pack.Infos, &bag.ExchangeInfo{ Id: v.Id, CostItems: costItems, GainItems: gainItems, }) } p.SendToClient(packetid, pack) logger.Logger.Tracef("SCExchangeList:%v", pack) return nil } func CSPropExchange(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPropExchange", data) msg, ok := data.(*bag.CSPropExchange) if !ok { return nil } p := PlayerMgrSington.GetPlayer(sid) if p == nil { return nil } pack := &bag.SCPropExchange{ RetCode: bag.OpResultCode_OPRC_Error, } send := func(code bag.OpResultCode) { pack.RetCode = code p.SendToClient(packetid, pack) logger.Logger.Tracef("SCPropExchange:%v", pack) } info := srvdata.PBDB_PropExchangeMgr.GetData(msg.Id) if info == nil { send(bag.OpResultCode_OPRC_IdErr) return nil } // 检查背包是否足够 var items []*Item var costItems []*Item for k, v := range info.GetCost() { item := BagMgrSingleton.GetItem(p.SnId, int32(k)) if item == nil || item.ItemNum < v { send(bag.OpResultCode_OPRC_UseUp) return nil } info := srvdata.PBDB_GameItemMgr.GetData(int32(k)) if info != nil { costItems = append(costItems, &Item{ ItemId: int32(k), ItemNum: v, Name: info.Name, }) } } for k, v := range info.GetGain() { info := srvdata.PBDB_GameItemMgr.GetData(int32(k)) if info != nil { items = append(items, &Item{ ItemId: int32(k), ItemNum: v, Name: info.Name, }) } } // 扣除背包物品 for _, item := range costItems { BagMgrSingleton.SaleItemV2(p, item.ItemId, item.ItemNum, common.GainWay_Collect, "system", "集卡活动兑换") BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemConsume, item.ItemId, item.Name, item.ItemNum, "集卡活动兑换使用") } // 增加背包物品 BagMgrSingleton.AddJybBagInfo(p, items, 0, common.GainWay_Collect, "system", "集卡活动兑换") for _, v := range items { BagMgrSingleton.RecordItemLog(p.Platform, p.SnId, ItemObtain, v.ItemId, v.Name, v.ItemNum, "集卡活动兑换获得") pack.Items = append(pack.Items, &bag.PropInfo{ ItemId: v.ItemId, ItemNum: v.ItemNum, }) } send(bag.OpResultCode_OPRC_Sucess) 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{}) // 兑换列表 common.Register(int(bag.SPacketID_PACKET_ExchangeList), &bag.CSExchangeList{}, CSExchangeList) // 道具兑换 common.Register(int(bag.SPacketID_PACKET_PropExchange), &bag.CSPropExchange{}, CSPropExchange) }