| | |
| | | if strengthenPlayerCnt:
|
| | | mapID = GameWorld.GetMap().GetMapID()
|
| | | dataMapID = FBCommon.GetRecordMapID(mapID)
|
| | | formulaKey = "MapCoefficient_%s" % mapID
|
| | | playerCntAttrCoefficient = playerCntCoefficient.get(mapID, {})
|
| | | if not playerCntAttrCoefficient and dataMapID in playerCntCoefficient:
|
| | | playerCntAttrCoefficient = playerCntCoefficient[dataMapID]
|
| | | formulaKey = "MapCoefficient_%s" % dataMapID
|
| | | if npcID in npcIDPlayerCntCoefficient:
|
| | | playerCntAttrCoefficient = npcIDPlayerCntCoefficient[npcID]
|
| | | formulaKey = "NPCCoefficient_%s" % npcID
|
| | | for attrKey, coefficientDict in playerCntAttrCoefficient.items():
|
| | | if attrKey in attrDict:
|
| | | attrValue = attrDict[attrKey]
|
| | |
| | | if not hasattr(npcData, attrFuncName):
|
| | | continue
|
| | | attrValue = getattr(npcData, attrFuncName)()
|
| | | coefficient = GameWorld.GetDictValueByRangeKey(coefficientDict, strengthenPlayerCnt, 1)
|
| | | # 按字典配置
|
| | | if isinstance(coefficientDict, dict):
|
| | | coefficient = GameWorld.GetDictValueByRangeKey(coefficientDict, strengthenPlayerCnt, 1)
|
| | | # 按公式配置
|
| | | elif isinstance(coefficientDict, str):
|
| | | formulaKey = "%s_%s" % (formulaKey, attrKey)
|
| | | coefficient = eval(FormulaControl.GetCompileFormula(formulaKey, coefficientDict))
|
| | | else:
|
| | | coefficient = 1
|
| | | attrDict[attrKey] = int(attrValue * coefficient)
|
| | |
|
| | | #GameWorld.DebugLog("计算NPC属性成长: npcID=%s,strengthenLV=%s,strengthenPlayerCnt=%s,baseMaxHP=%s,attrDict=%s"
|
| | |
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "GlobalDropRate", msgInfo, len(msgInfo))
|
| | |
|
| | | # 4. 指定全服击杀次数必掉,算额外掉落
|
| | | globalKillDropDict = IpyGameDataPY.GetFuncEvalCfg("GlobalDropCD", 2) # {NPCID:{击杀次数:[是否本职业, [物品ID, ...], [随机物品ID, ...]]}, ...}
|
| | | globalKillDropDict = IpyGameDataPY.GetFuncEvalCfg("GlobalDropCD", 2) # {NPCID:{击杀次数:[是否本职业, {物品ID:个数, ...}, [[随机物品ID,个数], ...]]}, ...}
|
| | | if npcID in globalKillDropDict:
|
| | | killCountDropDict = globalKillDropDict[npcID]
|
| | | updNPCKilledCount = min(gw.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_NPCKilledCount % npcID) + 1, ShareDefine.Def_UpperLimit_DWord)
|
| | | GameWorld.DebugLog("更新全服击杀次数: %s" % updNPCKilledCount)
|
| | | GameWorld.Log("更新全服击杀次数:npcID=%s, %s" % (npcID, updNPCKilledCount))
|
| | | # 通知GameServer记录
|
| | | msgInfo = str([npcID, updNPCKilledCount])
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "GlobalKillCount", msgInfo, len(msgInfo))
|
| | | if updNPCKilledCount in killCountDropDict:
|
| | | isJobLimit, itemIDList, randItemIDList = killCountDropDict[updNPCKilledCount]
|
| | | for itemID in itemIDList:
|
| | | isJobLimit, itemIDCountDict, randItemIDCountList = killCountDropDict[updNPCKilledCount]
|
| | | for itemID, itemCount in itemIDCountDict.items():
|
| | | if isJobLimit:
|
| | | itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
|
| | | if not itemData:
|
| | |
| | | # 非本职业可用,不掉落
|
| | | GameWorld.DebugLog("全服击杀次数必掉,非本职业可用,不掉落! itemID=%s" % itemID)
|
| | | continue
|
| | | dropItemIDList.append(itemID)
|
| | | GameWorld.DebugLog("全服击杀次数必掉物品: itemID=%s" % itemID)
|
| | | if randItemIDList:
|
| | | dropItemIDList += [itemID] * itemCount
|
| | | GameWorld.Log("全服击杀次数必掉物品: itemID=%s,itemCount=%s" % (itemID, itemCount))
|
| | | if randItemIDCountList:
|
| | | if isJobLimit:
|
| | | randJobItemList = []
|
| | | for rItemID in randItemIDList:
|
| | | for rItemID, rItemCount in randItemIDCountList:
|
| | | itemData = GameWorld.GetGameData().GetItemByTypeID(rItemID)
|
| | | if not itemData:
|
| | | continue
|
| | |
| | | # 非本职业可用,不掉落
|
| | | GameWorld.DebugLog("全服击杀次数必掉随机,非本职业可用,不掉落! rItemID=%s" % rItemID)
|
| | | continue
|
| | | randJobItemList.append(rItemID)
|
| | | randItemID = random.choice(randJobItemList)
|
| | | randJobItemList.append([rItemID, rItemCount])
|
| | | randItemID, randItemCount = random.choice(randJobItemList)
|
| | | else:
|
| | | randItemID = random.choice(randItemIDList)
|
| | | dropItemIDList.append(randItemID)
|
| | | GameWorld.DebugLog("全服击杀次数必掉随机物品: randItemID=%s" % randItemID)
|
| | | randItemID, randItemCount = random.choice(randItemIDCountList)
|
| | | dropItemIDList += [randItemID] * randItemCount
|
| | | GameWorld.Log("全服击杀次数必掉随机物品: randItemID=%s,randItemCount=%s" % (randItemID, randItemCount))
|
| | |
|
| | | return dropItemIDList
|
| | |
|
| | |
| | | return moneyID
|
| | | return moneyItemList[-1][1]
|
| | |
|
| | | def __NPCSpecialDropItem(self, ownerPlayerList, ipyDrop):
|
| | | def __NPCSpecialDropItem(self, dropPlayer, ownerPlayerList, ipyDrop):
|
| | | '''特殊掉落 (私有特殊掉落 + 击杀次数特殊掉落), 支持摸怪
|
| | | @return: None
|
| | | @return: [[ownerPlayer, itemID, isBind, isDropInItemPack], ...]
|
| | |
| | | curNPC = self.__Instance
|
| | | npcID = curNPC.GetNPCID()
|
| | | specDropItemList = []
|
| | | |
| | | playerLV = dropPlayer.GetLV()
|
| | | maxDropLV = ipyDrop.GetMaxDropLV()
|
| | | if maxDropLV and playerLV > maxDropLV:
|
| | | GameWorld.DebugLog("超过最大可掉落等级,不掉落物品,特殊掉落!npcID=%s,playerLV(%s) > maxDropLV(%s)" % (npcID, playerLV, maxDropLV))
|
| | | return specDropItemList
|
| | |
|
| | | # 私有掉落
|
| | | fbGradePriItemIDDropDict = IpyGameDataPY.GetFuncEvalCfg("FBGradeEquipDropRate", 3)
|
| | |
| | | mapID = FBCommon.GetRecordMapID(mapID)
|
| | | isGameBoss = ChConfig.IsGameBoss(curNPC)
|
| | | if isGameBoss:
|
| | | GameWorld.Log("NPC开始掉落: npcID=%s,dropPlayerID=%s" % (npcID, dropPlayer.GetPlayerID()))
|
| | | GameWorld.Log("NPC开始掉落: npcID=%s,dropPlayerID=%s" % (npcID, dropPlayer.GetPlayerID()), dropPlayer.GetPlayerID())
|
| | | if mapID == ChConfig.Def_FBMapID_MunekadoTrial:
|
| | | return
|
| | | ipyDrop = GetNPCDropIpyData(npcID)
|
| | |
| | | dropIDList += [moneyID] * dropMoneyCnt
|
| | |
|
| | | specItemSign = "SpecItem"
|
| | | playerSpecDropList = self.__NPCSpecialDropItem(ownerPlayerList, ipyDrop) # 特殊掉落 [[ownerPlayer, itemID, isBind, isDropInItemPack], ...] 私有特殊掉落 + 击杀次数特殊掉落
|
| | | playerSpecDropList = self.__NPCSpecialDropItem(dropPlayer, ownerPlayerList, ipyDrop) # 特殊掉落 [[ownerPlayer, itemID, isBind, isDropInItemPack], ...] 私有特殊掉落 + 击杀次数特殊掉落
|
| | | dropIDList += [specItemSign] * len(playerSpecDropList)
|
| | |
|
| | | if len(dropIDList) > 5:
|
| | | #打乱物品顺序
|
| | | random.shuffle(playerSpecDropList)
|
| | | random.shuffle(dropIDList)
|
| | | |
| | | if not dropIDList and isGameBoss:
|
| | | GameWorld.ErrLog("Boss没有掉落: dropPlayerLV=%s,ipyWorldLV=%s,maxDropLV=%s" |
| | | % (dropPlayer.GetLV(), ipyDrop.GetMaxWorldLV(), ipyDrop.GetMaxDropLV()), dropPlayer.GetPlayerID())
|
| | |
|
| | | gameMap = GameWorld.GetMap()
|
| | | dropPosX, dropPosY = curNPC.GetPosX(), curNPC.GetPosY() # 以NPC为中心点开始掉落
|
| | |
| | | self.__AllKillerDict, curTeam, hurtType, hurtID = self.__FindNPCKillerInfo(isGameBoss)
|
| | | self.__OwnerHurtType, self.__OwnerHurtID = hurtType, hurtID
|
| | | if isGameBoss:
|
| | | GameWorld.Log("npcID=%s,hurtType=%s,hurtID=%s" % (npcID, hurtType, hurtID))
|
| | | GameWorld.Log("__GiveObjPrize npcID=%s,hurtType=%s,hurtID=%s" % (npcID, hurtType, hurtID))
|
| | |
|
| | | #最后一击处理
|
| | | self.__DoLastTimeHurtLogic()
|
| | |
| | | curTeamPlayer.GetPosY()) > ChConfig.Def_Team_GetExpScreenDist:
|
| | | if isLog:
|
| | | GameWorld.Log(" i=%s, 队员超出指定距离!memPlayerID=%s,npcPos(%s,%s),playerPos(%s,%s)"
|
| | | % (i, curTeamPlayer.GetPlayerID(), curNPC.GetPosX(), curNPC.GetPosY(), curPlayer.GetPosX(), curPlayer.GetPosY()))
|
| | | % (i, curTeamPlayer.GetPlayerID(), curNPC.GetPosX(), curNPC.GetPosY(), curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY()))
|
| | | continue
|
| | |
|
| | | hurtObjTuple = (None, curTeam)
|
| | |
| | | npcID = curNPC.GetNPCID()
|
| | | defObjType = curNPC.GetGameObjType()
|
| | | mapFBType = GameWorld.GetMap().GetMapFBType()
|
| | | mapID = GameWorld.GetMap().GetMapID()
|
| | | mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
|
| | | playerID = curPlayer.GetPlayerID()
|
| | |
|
| | | # 如果是NPC
|
| | |
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_WorldBOSS)
|
| | | PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_WorldBOSS, 1)
|
| | | PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_WorldBoss, 1)
|
| | | elif limitIndex == 1: #BOSS之家
|
| | | # BOSS之家BOSS击杀成就
|
| | | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillBossHomeBoss, 1)
|
| | | # 每日活动
|
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_BOSSHome)
|
| | | PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_BOSSHome, 1)
|
| | | PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1)
|
| | | if ChConfig.IsGameBoss(curNPC) and mapID == ChConfig.Def_FBMapID_BossHome:
|
| | | #BOSS之家
|
| | | # BOSS之家BOSS击杀成就
|
| | | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_KillBossHomeBoss, 1)
|
| | | # 每日活动
|
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_BOSSHome)
|
| | | PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_BOSSHome, 1)
|
| | | PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1)
|
| | |
|
| | |
|
| | | return
|