| | |
| | | import NPCCommon
|
| | | import BattleObj
|
| | | import ChEquip
|
| | | import ObjPool
|
| | |
|
| | | import random
|
| | |
|
| | |
| | | break
|
| | | if baseUpper <= 0:
|
| | | continue
|
| | | dropUpper = baseUpper
|
| | | addPer = 0
|
| | | addPer += PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_BootyPer)[0] # 战利品上限提高百分比
|
| | | if addPer:
|
| | | dropUpper = int(baseUpper * (100 + addPer) / 100.0)
|
| | | GameWorld.DebugLog("红颜提高战利品掉落上限: itemID=%s,baseUpper=%s,addPer=%s,dropUpper=%s" % (itemID, baseUpper, addPer, dropUpper))
|
| | | dropUpper = PlayerControl.GetBootyUpper(curPlayer, itemID, baseUpper)
|
| | | todyDropCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BootyDropToday % itemID)
|
| | | if todyDropCnt >= dropUpper:
|
| | | GameWorld.DebugLog("战利品已达今日掉落上限! itemID=%s,todyDropCnt=%s >= %s" % (itemID, todyDropCnt, dropUpper), playerID)
|
| | |
| | | bossType = npcData.GetBossType()
|
| | | bossTypeList.append(bossType)
|
| | |
|
| | | # 支持未击杀结算掉落,防止一次性掉太多导致玩家一直堆积未结算的掉落,前端在掉落背包满处理完后会补发一次请求处理未结算掉落
|
| | | if not bossTypeList:
|
| | | bossType = 0 # 默认小怪
|
| | | bossTypeList = [bossType]
|
| | | GameWorld.DebugLogEx("未击杀结算掉落默认按小怪掉落! bossTypeList=%s" % bossTypeList)
|
| | | |
| | | for bossType in bossTypeList:
|
| | | if bossType in bossTypeDropRateDict:
|
| | | continue
|
| | |
|
| | |
| | | # tagHead Head;
|
| | | # BYTE Count;
|
| | | # WORD IndexList[Count]; // 掉落背包中的物品格子索引列表
|
| | | # BYTE OPType; // 0 - 拾取非装备物品;1 - 分解;2 - 穿戴/替换;
|
| | | # BYTE OPType; // 0 - 拾取非装备物品;1 - 分解;2 - 穿戴/替换;3-结算未掉落物品;
|
| | | # BYTE OPValue; // 操作额外指令值,由操作类型决定,如穿戴时可发送穿戴后是否自动分解
|
| | | #};
|
| | | def OnMainDropItemOP(index, clientData, tick):
|
| | |
| | | __doEquipMainEquip(curPlayer, itemIndexList, opValue)
|
| | | elif opType == 1:
|
| | | __doDecomposeMainEquip(curPlayer, itemIndexList)
|
| | | elif opType == 3: # 结算未掉落物品
|
| | | __doMainDrop(curPlayer, [])
|
| | | else:
|
| | | __doPickupMainItem(curPlayer, itemIndexList)
|
| | |
|
| | |
| | | if not moneyType or not moneyBase:
|
| | | return
|
| | |
|
| | | # 砍树类主线装备独立流向规则:暂时只记录分解,按祝福树对应品质列表记录
|
| | | treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("TreeLV", treeLV)
|
| | | needRecordColorMin = 0
|
| | | if ipyData:
|
| | | lastColorCnt = IpyGameDataPY.GetFuncCfg("ItemRecordEquip", 1) # 有产出的最后几个品质需要记录
|
| | | equipColorRateList = ipyData.GetEquipColorRateList()
|
| | | lastColor = len(equipColorRateList)
|
| | | for colorRate in equipColorRateList[::-1]:
|
| | | if colorRate:
|
| | | break
|
| | | lastColor -= 1
|
| | | needRecordColorMin = lastColor - lastColorCnt + 1
|
| | | #GameWorld.DebugLogEx("treeLV=%s,rateLen=%s,lastColor=%s,needRecordColorMin=%s", treeLV, len(equipColorRateList), lastColor, needRecordColorMin, playerID)
|
| | | |
| | | decomposeMoney = moneyBase
|
| | | mjExPer, exRemain = PlayerLLMJ.GetAddDecomposePer(curPlayer)
|
| | | mjEx = int(decomposeMoney * mjExPer / 100.0)
|
| | |
| | | GameWorld.DebugLog(" itemIndex=%s,decomposeMoney=%s,mjEx=%s,exRemain=%s,总:%s"
|
| | | % (itemIndex, decomposeMoney, mjEx, exRemain, moneyTotal), playerID)
|
| | |
|
| | | ItemCommon.DelItem(curPlayer, curEquip, curEquip.GetCount(), True, ChConfig.ItemDel_EquipDecompose)
|
| | | isForceDR = curEquip.GetItemColor() >= needRecordColorMin # 记录分解流向
|
| | | ItemCommon.DelItem(curPlayer, curEquip, curEquip.GetCount(), True, ChConfig.ItemDel_EquipDecompose, isForceDR=isForceDR)
|
| | | decomposeCnt += 1
|
| | |
|
| | | if not moneyTotal:
|
| | |
| | | moneyTotal = int(round(moneyTotal)) # 四舍五入取整
|
| | | GameWorld.DebugLog("moneyTotal=%s,mjExTotal=%s" % (moneyTotal, mjExTotal), playerID)
|
| | |
|
| | | PlayerControl.GiveMoney(curPlayer, moneyType, moneyTotal, "DecomposeMainEquip", isSysHint=False)
|
| | | PlayerControl.GiveMoney(curPlayer, moneyType, moneyTotal, isSysHint=False)
|
| | | PlayerLLMJ.AddExpDecompose(curPlayer, mjExTotal)
|
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_EquipDecompose, decomposeCnt)
|
| | | PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_EquipDecompose, decomposeCnt)
|
| | |
| | | syncItemIDList = GetBootyItemIDList()
|
| | | else:
|
| | | syncItemIDList = [itemID]
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCDropBootyInfo)
|
| | | clientPack = ChPyNetSendPack.tagSCDropBootyInfo()
|
| | | clientPack.DropBootyList = []
|
| | | for itemID in syncItemIDList:
|
| | | dropBooty = poolMgr.acquire(ChPyNetSendPack.tagSCDropBooty)
|
| | | dropBooty = ChPyNetSendPack.tagSCDropBooty()
|
| | | dropBooty.ItemID = itemID
|
| | | dropBooty.TodayDropCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BootyDropToday % itemID)
|
| | | clientPack.DropBootyList.append(dropBooty)
|