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" ) func CSBagInfo(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.GameItemMgr.Get(p.Platform, 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 } func CSUpBagInfo(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.AddItems(p, items, 0, common.GainWay_ItemUse, "system", "测试", 0, 0, false) 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) items := map[int32]*Item{} var useFunc func() saleFunc := func(gainWay int32, oper, remark string) { if gainWay == 0 { gainWay = common.GainWay_ItemUse } if oper == "" { oper = "player" } if remark == "" { remark = "道具使用" } // 使用道具,减少道具 BagMgrSingleton.AddItem(p, int64(item.ItemId), int64(-msg.ItemNum), 0, gainWay, oper, remark, 0, 0, false) pack.RetCode = bag.OpResultCode_OPRC_Sucess pack.NowItemId = item.ItemId pack.NowItemNum = item.ItemNum } gainFunc := func(gainWay int32, oper, remark string) { for i := 0; i < int(msg.ItemNum); i++ { useFunc() } if gainWay == 0 { gainWay = common.GainWay_ItemUse } if oper == "" { oper = "player" } if remark == "" { remark = "道具使用" } if len(items) > 0 { var itemArr []*Item for _, v := range items { itemArr = append(itemArr, v) } BagMgrSingleton.AddItems(p, itemArr, 0, gainWay, oper, remark, 0, 0, false) for _, v := range itemArr { pack.Infos = append(pack.Infos, &bag.ItemInfo{ ItemId: v.ItemId, ItemNum: v.ItemNum, ObtainTime: v.ObtainTime, }) } if gainWay == common.GainWay_Collect { for _, v := range items { tp1 := int32(-1) if v.ItemId == common.ItemIDCoin { tp1 = model.SystemFreeGive_CoinType_Coin } else if v.ItemId == common.ItemIDDiamond { tp1 = model.SystemFreeGive_CoinType_Diamond } if !p.IsRob && tp1 >= 0 { LogChannelSingleton.WriteMQData( model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, p.Channel, model.SystemFreeGive_CollectBox, tp1, v.ItemNum)) } } } } } switch item.ItemId { case common.ItemIDGiftBox: saleFunc(0, "", "") 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 { for k, vv := range v.ItemID { if vv > 0 { item, ok := items[int32(k)] if !ok { items[int32(k)] = &Item{ ItemId: int32(k), ItemNum: vv, ObtainTime: ts, } } else { item.ItemNum += vv } } } break } } } } gainFunc(0, "", "") case common.ItemIDCollectBox: saleFunc(0, "", "") 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 { for k, vv := range v.ItemID { if vv > 0 { item, ok := items[int32(k)] if !ok { items[int32(k)] = &Item{ ItemId: int32(k), ItemNum: vv, ObtainTime: ts, } } else { item.ItemNum += vv } } } break } } } } gainFunc(common.GainWay_Collect, "player", "集卡活动") default: logger.Logger.Warnf("道具使用未定义", msg.ItemId) } case ItemCanGive: logger.Logger.Trace("道具赠送", msg.ItemId) acceptPlayer := PlayerMgrSington.GetPlatformPlayerBySnId(p.Platform, msg.AcceptSnId) if acceptPlayer != nil { logger.Logger.Trace("道具赠送成功", msg.ItemId) remark := fmt.Sprintf("赠送给玩家(%v)", msg.AcceptSnId) BagMgrSingleton.AddMailByItem(p.Platform, p.SnId, p.Name, msg.AcceptSnId, msg.ShowId, []int32{msg.ItemId, msg.ItemNum}) BagMgrSingleton.AddItem(p, int64(item.ItemId), int64(-msg.ItemNum), 0, common.GainWay_ItemMove, "player", remark, 0, 0, false) 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 { logger.Logger.Trace("道具赠送成功", msg.ItemId) remark := fmt.Sprintf("赠送给玩家(%v)", msg.AcceptSnId) BagMgrSingleton.AddMailByItem(p.Platform, p.SnId, p.Name, msg.AcceptSnId, msg.ShowId, []int32{msg.ItemId, msg.ItemNum}) BagMgrSingleton.AddItem(p, int64(item.ItemId), int64(-msg.ItemNum), 0, common.GainWay_ItemMove, "player", remark, 0, 0, false) 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 { remark := "道具出售" + fmt.Sprintf("%v-%v", msg.ItemId, msg.ItemNum) _, _, isF := BagMgrSingleton.AddItem(p, int64(msg.ItemId), int64(-msg.ItemNum), 0, common.GainWay_Item_Sale, "sys", remark, 0, 0, false) if isF { pack.RetCode = bag.OpResultCode_OPRC_Sucess if item.SaleGold > 0 { if item.SaleType == 1 { p.AddCoin(int64(item.SaleGold*msg.ItemNum), 0, common.GainWay_Item_Sale, "sys", remark) pack.Coin = int64(item.SaleGold * msg.ItemNum) } else if item.SaleType == 2 { p.AddDiamond(int64(item.SaleGold*msg.ItemNum), 0, common.GainWay_Item_Sale, "sys", remark) pack.Diamond = int64(item.SaleGold * msg.ItemNum) } } pack.NowItemId = item.ItemId pack.NowItemNum = item.ItemNum } } case ItemCanExchange: logger.Logger.Trace("道具兑换", msg.ItemId) itemInfo := srvdata.GameItemMgr.Get(p.Platform, msg.ItemId) if itemInfo == nil || itemInfo.Type != common.ItemTypeChange { pack.RetCode = bag.OpResultCode_OPRC_NotChange send() return nil } _, _, isF := BagMgrSingleton.AddItem(p, int64(msg.ItemId), int64(-1), 0, common.GainWayItemChange, "sys", "背包内使用兑换", 0, 0, false) if isF { pack.RetCode = bag.OpResultCode_OPRC_Sucess pack.NowItemId = item.ItemId pack.NowItemNum = item.ItemNum //获取兑换码 BagMgrSingleton.ItemExchangeCard(p, msg.ItemId, int32(itemInfo.Num), msg.CardType) } } 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.GameItemMgr.Get(p.Platform, 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.GameItemMgr.Get(p.Platform, int32(k)) if info != nil { items = append(items, &Item{ ItemId: int32(k), ItemNum: v, Name: info.Name, }) } } // 扣除背包物品 for _, item := range costItems { BagMgrSingleton.AddItem(p, int64(item.ItemId), -item.ItemNum, 0, common.GainWayItemCollectExchange, "system", "集卡活动兑换", 0, 0, false) } // 增加背包物品 BagMgrSingleton.AddItems(p, items, 0, common.GainWayItemCollectExchange, "system", "集卡活动兑换", 0, 0, false) for _, v := range items { pack.Items = append(pack.Items, &bag.PropInfo{ ItemId: v.ItemId, ItemNum: v.ItemNum, }) tp1 := int32(-1) if v.ItemId == common.ItemIDCoin { tp1 = model.SystemFreeGive_CoinType_Coin } else if v.ItemId == common.ItemIDDiamond { tp1 = model.SystemFreeGive_CoinType_Diamond } if !p.IsRob && tp1 >= 0 { LogChannelSingleton.WriteMQData( model.GenerateSystemFreeGive(p.SnId, p.Name, p.Platform, p.Channel, model.SystemFreeGive_CollectBoxSwap, tp1, v.ItemNum)) } } send(bag.OpResultCode_OPRC_Sucess) return nil } func init() { // 查看背包 common.Register(int(bag.SPacketID_PACKET_ALL_BAG_INFO), &bag.CSBagInfo{}, CSBagInfo) // 道具操作 common.Register(int(bag.SPacketID_PACKET_ALL_BAG_USE), &bag.CSUpBagInfo{}, CSUpBagInfo) // 兑换列表 common.Register(int(bag.SPacketID_PACKET_ExchangeList), &bag.CSExchangeList{}, CSExchangeList) // 道具兑换 common.Register(int(bag.SPacketID_PACKET_PropExchange), &bag.CSPropExchange{}, CSPropExchange) }