80 【常规】背包-服务端(优化背包格子初始化,屏蔽无用背包;支持绑定货币数量展示的背包物品;背包物品优化叠加上限20亿支持;)
| | |
| | |
|
| | | //任务表
|
| | |
|
| | | struct tagTask
|
| | | struct Task
|
| | | {
|
| | | WORD _TaskID; //任务ID
|
| | | BYTE TaskGroup; //任务组别 0-主线
|
| | |
| | | char Numerical5; //数据5
|
| | | };
|
| | |
|
| | | //等级开启功能 #tagFuncOpenLV
|
| | | //等级开启功能
|
| | |
|
| | | struct tagFuncOpenLV
|
| | | struct FuncOpenLV
|
| | | {
|
| | | DWORD _FuncId; //功能标识
|
| | | DWORD LimitLV; //开启等级
|
| | |
| | |
|
| | | //玩家等级表
|
| | |
|
| | | struct tagPlayerLV
|
| | | struct PlayerLV
|
| | | {
|
| | | WORD _LV; //玩家等级
|
| | | DWORD Exp; //升级所需经验
|
| | |
| | | ;物品rptItem
|
| | | PackCnt02=100
|
| | | ;垃圾桶(回收站)rptRecycle
|
| | | PackCnt03=6
|
| | | PackCnt03=0
|
| | | ;拆解物品栏rptBreakItem
|
| | | PackCnt04=0
|
| | | ;仓库rptWarehouse
|
| | | PackCnt05=100
|
| | | PackCnt05=0
|
| | | ;称号背包rptTitle
|
| | | PackCnt06=0
|
| | | ;合成背包rptCompose
|
| | |
| | | ;坐骑背包rptHorse
|
| | | PackCnt12=0
|
| | | ;万能背包rptAnyWhere
|
| | | PackCnt13=8
|
| | | PackCnt13=0
|
| | | ;法宝背包rptFabao
|
| | | PackCnt14=0
|
| | | ;坐骑装备背包rptHorseEquip
|
| | |
| | | ;寻宝背包
|
| | | PackCnt30=100
|
| | | ;宠物背包
|
| | | PackCnt31=50
|
| | | PackCnt31=0
|
| | | ;神兽物品背包
|
| | | PackCnt32=100
|
| | | PackCnt32=0
|
| | | ;神兽装备背包
|
| | | PackCnt33=150
|
| | | PackCnt33=0
|
| | | ;垃圾分类背包
|
| | | PackCnt34=30
|
| | | PackCnt34=0
|
| | | ;武将英雄背包
|
| | | PackCnt35=500 |
| | |
| | | Def_PetBaseEffectList = range(5000, 5007 + 1)
|
| | |
|
| | | #---------------------------------------------------------------------------
|
| | | Def_ItemCount_Max = 2000000000 # 物品最大叠加上限
|
| | | #写死的物品ID都放这边
|
| | | Def_ItemID_PetSoul = -1 #宠物满魂
|
| | | Def_ItemID_PetDoubleExp = -1 #宠物双倍
|
| | |
| | |
|
| | | #虚拟背包最大格子数 功能配置表对应的key
|
| | | Def_VPackCnt_Dict = {
|
| | | ShareDefine.rptRune:'RunePackageNum',
|
| | | ShareDefine.rptGatherSoul:'GatherSoulPackCount',
|
| | | #ShareDefine.rptRune:'RunePackageNum',
|
| | | #ShareDefine.rptGatherSoul:'GatherSoulPackCount',
|
| | | }
|
| | |
|
| | | def GetItemPackType(itemData, defaultPack=IPY_GameWorld.rptItem):
|
| | |
| | | Def_PackCnt_Fashion = 1
|
| | | #登陆初始武器时装格子数
|
| | | Def_PackCnt_WeaponCoat = 8
|
| | | #初始化回收站
|
| | | Def_PackCnt_Recycle = 6
|
| | | #初始化临时交换背包格子数
|
| | | Def_PackCnt_TempSwap = 1
|
| | | #初始化临时存放背包格子数
|
| | | Def_PackCnt_TempItem = 10
|
| | | #玩家脱离战斗状态时间(6秒)
|
| | | Def_PlayerLeaveBattleTick = 3000
|
| | | #玩家PK多杀间隔
|
| | |
| | |
|
| | | #玩家登陆需要初始化的背包索引
|
| | | Def_PlayerLoginInitPackIndexList = [#主角背包
|
| | | IPY_GameWorld.rptRecycle, |
| | | #IPY_GameWorld.rptRecycle, |
| | | IPY_GameWorld.rptEquip,
|
| | | IPY_GameWorld.rptItem,
|
| | | #IPY_GameWorld.rptFineSoulSlot,
|
| | | IPY_GameWorld.rptAnyWhere, |
| | | #IPY_GameWorld.rptAnyWhere, |
| | | IPY_GameWorld.rptIdentify,
|
| | | #时装背包
|
| | | #IPY_GameWorld.rptCabinetWeaponCoat,
|
| | |
| | | #IPY_GameWorld.rptHorseEquip,
|
| | | ShareDefine.rptTempItem,
|
| | | ShareDefine.rptTreasure,
|
| | | ShareDefine.rptPet,
|
| | | ShareDefine.rptDogzItem,
|
| | | ShareDefine.rptDogzEquip,
|
| | | ShareDefine.rptGarbage,
|
| | | #ShareDefine.rptPet,
|
| | | #ShareDefine.rptDogzItem,
|
| | | #ShareDefine.rptDogzEquip,
|
| | | #ShareDefine.rptGarbage,
|
| | | ShareDefine.rptHero,
|
| | | ]
|
| | |
|
| | |
| | | def DoTransformItem(self, curPlayer, tagItem, event=["", False, {}]):
|
| | | ## 将特殊物品转化为对应数值
|
| | | itemID = tagItem.GetItemTypeID()
|
| | | itemCount = max(tagItem.GetUserAttr(ShareDefine.Def_IudetItemCount), tagItem.GetCount())
|
| | | itemCount = tagItem.GetCount()
|
| | | eventName, isForceEvent, addDict = event
|
| | | if isForceEvent:
|
| | | pass
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def CheckGiveBindMoneyTypeItem(curPlayer, checkMoneyType=None):
|
| | | ## 检查给绑定货币的展示物品
|
| | | bindMoneyItemInfo = IpyGameDataPY.GetFuncEvalCfg("PutInItemPack", 2, {})
|
| | | |
| | | needMoneyItemDict = {}
|
| | | for itemIDStr, moneyType in bindMoneyItemInfo.items():
|
| | | if checkMoneyType != None and moneyType != checkMoneyType:
|
| | | continue
|
| | | if PlayerControl.GetMoney(curPlayer, moneyType): # 有货币时才需要
|
| | | needMoneyItemDict[int(itemIDStr)] = moneyType
|
| | | |
| | | if not needMoneyItemDict:
|
| | | #GameWorld.DebugLog("绑定货币显示物品已经都有了")
|
| | | return
|
| | | |
| | | curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
| | | for i in xrange(curPack.GetCount()):
|
| | | curItem = curPack.GetAt(i)
|
| | | if not curItem or curItem.IsEmpty():
|
| | | continue
|
| | | itemID = curItem.GetItemTypeID()
|
| | | if itemID in needMoneyItemDict:
|
| | | needMoneyItemDict.pop(itemID)
|
| | | if not needMoneyItemDict:
|
| | | break
|
| | | |
| | | # 还有没给的物品补给,后端只负责给物品,不处理个数,前端对该类物品默认绑定货币对应的值来显示个数
|
| | | for itemID, moneyType in needMoneyItemDict.items():
|
| | | if not GivePlayerItem(curPlayer, itemID, 1, False, [IPY_GameWorld.rptItem]):
|
| | | break
|
| | | GameWorld.DebugLog("给绑定货币显示物品: moneyType=%s,itemID=%s" % (moneyType, itemID))
|
| | | |
| | | return
|
| | |
|
| | | def GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, packIndexList=None, event=["", False, {}], setAttrDict=None):
|
| | | '''给玩家物品
|
| | | @param isAuctionItem: 是否拍品
|
| | |
| | |
|
| | | #常规物品
|
| | | isOK = False
|
| | | for _ in range(itemCount/65535 + 1):
|
| | | for _ in range(itemCount/ChConfig.Def_ItemCount_Max + 1):
|
| | | if itemCount <= 0:
|
| | | break
|
| | | giveItem = GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer, setAttrDict=setAttrDict)
|
| | |
| | | # @return: 给成功总数,0代表给失败了
|
| | |
|
| | | giveOKCount = 0
|
| | | for _ in range(itemCount/65535 + 1):
|
| | | for _ in range(itemCount/ChConfig.Def_ItemCount_Max + 1):
|
| | | if giveOKCount >= itemCount:
|
| | | break
|
| | | giveItem = GetOutPutItemObj(itemID, itemCount - giveOKCount, isAuctionItem, curPlayer=curPlayer)
|
| | |
| | | # @return None
|
| | | def SetItemCount(item, cnt, playerID=0, accID=0, playerName=""):
|
| | | if not item.IsEmpty():
|
| | | if cnt > 0 and IsPutinAutoTransformItem(item):
|
| | | item.SetUserAttr(ShareDefine.Def_IudetItemCount, min(cnt, ChConfig.Def_UpperLimit_DWord))
|
| | | else:
|
| | | item.SetCount(min(cnt, 65535))
|
| | | item.SetCount(min(cnt, ChConfig.Def_ItemCount_Max))
|
| | | else:
|
| | | try:
|
| | | 1 / 0
|
| | |
| | | GameWorld.ErrLog(errorInfo + str(traceback.extract_stack()) + "\n" + traceback.format_exc())
|
| | | raise
|
| | |
|
| | | def GetItemCount(item):
|
| | | if IsPutinAutoTransformItem(item):
|
| | | return item.GetUserAttr(ShareDefine.Def_IudetItemCount)
|
| | | return item.GetCount()
|
| | | def GetItemCount(item): return item.GetCount()
|
| | |
|
| | | def GetItemNeedPackCount(packType, itemData, itemCount, isAuctionItem=0):
|
| | | # 20201223 主干取消拍品有效时长设定
|
| | |
| | |
|
| | | def GetPackInitCount(packType):
|
| | | ## 获取背包类型对应初始格子数
|
| | | initCount = 0
|
| | | if packType == IPY_GameWorld.rptItem:
|
| | | initCount = IpyGameDataPY.GetFuncCfg("InitBagCellCount", 1)
|
| | | elif packType == IPY_GameWorld.rptWarehouse:
|
| | |
| | | initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 1)
|
| | | elif packType == ShareDefine.rptDogzEquip:
|
| | | initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 2)
|
| | | else:
|
| | | |
| | | if not initCount:
|
| | | bagInitCntDict = IpyGameDataPY.GetFuncEvalCfg("InitBagCellCount", 2, {})
|
| | | initCount = bagInitCntDict.get(str(packType), 0)
|
| | | GameWorld.DebugLog("背包类型初始格子数: packType=%s,initCount=%s" % (packType, initCount))
|
| | |
| | | curPlayer.SetLoginTime(GameWorld.GetCurrentDataTimeStr())
|
| | | #初始化玩家背包
|
| | | InitPlayerPack(curPlayer)
|
| | | #通知玩家物品信息
|
| | | __Sync_PackDetel(curPlayer)
|
| | |
|
| | | if GameWorld.IsCrossServer():
|
| | | SkillCommon.PlayerLoginMergeServerSkillLogic(curPlayer, tick)
|
| | |
| | | def InitPlayerPack(curPlayer) :
|
| | | itemManager = curPlayer.GetItemManager()
|
| | |
|
| | | #设置装备实际个数,默认最大个数
|
| | | curPack = itemManager.GetPack(IPY_GameWorld.rptEquip)
|
| | | curPack.SetCount(curPack.GetMaxCount())
|
| | | |
| | | #初始化玩家背包
|
| | | PlayerControl.Init_ItemPack(curPlayer)
|
| | |
|
| | | #初始化玩家仓库
|
| | | PlayerControl.Init_Warehouse(curPlayer)
|
| | | #PlayerControl.Init_Warehouse(curPlayer)
|
| | |
|
| | | #初始化寻宝背包
|
| | | PlayerControl.Init_TreasurePack(curPlayer)
|
| | | |
| | | #初始化鉴定背包
|
| | | #初始化鉴定背包,默认最大个数用于存放主线掉落
|
| | | curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify)
|
| | | curPack.SetCount(ItemCommon.GetPackInitCount(IPY_GameWorld.rptIdentify))
|
| | | curPack.SetCount(curPack.GetMaxCount())
|
| | | curPack.Sync_PackCanUseCount()
|
| | |
|
| | | #初始化英雄背包
|
| | | PlayerControl.Init_HeroPack(curPlayer)
|
| | |
|
| | | #初始化神兽物品背包
|
| | | curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
|
| | | curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzItem))
|
| | | curPack.Sync_PackCanUseCount()
|
| | | #初始化神兽装备背包
|
| | | curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
|
| | | curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzEquip))
|
| | | curPack.Sync_PackCanUseCount()
|
| | | #初始化垃圾分类背包
|
| | | curPack = itemManager.GetPack(ShareDefine.rptGarbage)
|
| | | curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptGarbage))
|
| | | curPack.Sync_PackCanUseCount()
|
| | | |
| | | #初始化临时交换背包
|
| | | #初始化临时交换背包,默认最大个数
|
| | | curPack = itemManager.GetPack(ShareDefine.rptTempSwap)
|
| | | curPack.SetCount(ChConfig.Def_PackCnt_TempSwap)
|
| | | curPack.SetCount(curPack.GetMaxCount())
|
| | |
|
| | | #初始化临时存放背包
|
| | | #初始化临时存放背包,默认最大个数
|
| | | curPack = itemManager.GetPack(ShareDefine.rptTempItem)
|
| | | curPack.SetCount(ChConfig.Def_PackCnt_TempItem)
|
| | | curPack.SetCount(curPack.GetMaxCount())
|
| | |
|
| | | #设置装备实际个数
|
| | | curPack = itemManager.GetPack(IPY_GameWorld.rptEquip)
|
| | | curPack.SetCount(ItemCommon.GetPackInitCount(IPY_GameWorld.rptEquip))
|
| | | #初始化寻宝背包
|
| | | PlayerControl.Init_TreasurePack(curPlayer)
|
| | | |
| | | #初始化神兽物品背包
|
| | | #curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzItem)
|
| | | #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzItem))
|
| | | #curPack.Sync_PackCanUseCount()
|
| | | #初始化神兽装备背包
|
| | | #curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
|
| | | #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptDogzEquip))
|
| | | #curPack.Sync_PackCanUseCount()
|
| | | #初始化垃圾分类背包
|
| | | #curPack = itemManager.GetPack(ShareDefine.rptGarbage)
|
| | | #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptGarbage))
|
| | | #curPack.Sync_PackCanUseCount()
|
| | |
|
| | | #初始化垃圾桶
|
| | | #curPack = itemManager.GetPack(IPY_GameWorld.rptRecycle)
|
| | | #curPack.SetCount(ChConfig.Def_PackCnt_Recycle)
|
| | |
|
| | | #初始化万能背包
|
| | | curPack = itemManager.GetPack(IPY_GameWorld.rptAnyWhere)
|
| | | curPack.SetCount(IPY_GameWorld.Def_AnyWherePackCount)
|
| | | #curPack = itemManager.GetPack(IPY_GameWorld.rptAnyWhere)
|
| | | #curPack.SetCount(IPY_GameWorld.Def_AnyWherePackCount)
|
| | |
|
| | | #初始化宠物背包
|
| | | curPack = itemManager.GetPack(ShareDefine.rptPet)
|
| | | curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptPet))
|
| | | #curPack = itemManager.GetPack(ShareDefine.rptPet)
|
| | | #curPack.SetCount(ItemCommon.GetPackInitCount(ShareDefine.rptPet))
|
| | | #curPack.Sync_PackCanUseCount()
|
| | | |
| | | #通知玩家物品信息
|
| | | __Sync_PackDetel(curPlayer)
|
| | | |
| | | ItemControler.CheckGiveBindMoneyTypeItem(curPlayer)
|
| | | return
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_GiveMoney, msgInfo, [serverGroupID])
|
| | | return True
|
| | |
|
| | | befMoney = GetMoney(curPlayer, priceType)
|
| | | if priceType == IPY_GameWorld.TYPE_Price_Gold_Money:
|
| | | updPlayerGold = GetMoneyReal(curPlayer, priceType) + value
|
| | | if updPlayerGold > ChConfig.Def_PlayerTotalMoney_Gold:
|
| | |
| | | NotifyCode(curPlayer, "GetMoney", [priceType, value])
|
| | | __GiveMoneyAfter(curPlayer, priceType, value, giveType, addDataDict)
|
| | |
|
| | | if befMoney == 0:
|
| | | aftMoney = GetMoney(curPlayer, priceType)
|
| | | if aftMoney > 0:
|
| | | ItemControler.CheckGiveBindMoneyTypeItem(curPlayer, priceType)
|
| | | |
| | | return True
|
| | |
|
| | | def __GiveMoneyAfter(curPlayer, priceType, value, giveType, addDataDict):
|
| | |
| | | Def_IudetHeroLineup = 81 # 所在阵容信息列表 [阵容类型*10000+阵型类型*100+位置编号, ...]
|
| | |
|
| | | Def_IudetItemColor = 16 # 物品颜色,如果该值没有就取物品
|
| | | Def_IudetItemCount = 18 # 物品个数,支持20亿,目前仅特殊转化物品会用到
|
| | | #Def_IudetItemCount = 18 # 物品个数,支持20亿,目前仅特殊转化物品会用到
|
| | | Def_IudetCancelUseLimit = 20 # 物品取消使用限制
|
| | | Def_IudetItemLV = 22 # 物品等级,适用于动态物品等级(非物品表配置的固定等级)
|
| | | Def_IudetSource = 24 # 物品来源
|