From 4f48659ed51c0e087e55da91ec76cbcdd7a87486 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 15 十一月 2018 17:40:58 +0800
Subject: [PATCH] 4788 【后端】【1.3】洗炼必增由消耗仙玉改为消耗道具

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py |   76 ++++++++++++++++++++++++-------------
 1 files changed, 49 insertions(+), 27 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 6b35dda..d38537a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -301,11 +301,14 @@
     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]
@@ -316,7 +319,15 @@
                 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" 
@@ -1216,17 +1227,17 @@
         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:
@@ -1236,12 +1247,12 @@
                         # 非本职业可用,不掉落
                         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
@@ -1250,12 +1261,12 @@
                             # 非本职业可用,不掉落
                             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
 
@@ -3908,7 +3919,7 @@
                 return moneyID
         return moneyItemList[-1][1]
     
-    def __NPCSpecialDropItem(self, ownerPlayerList, ipyDrop):
+    def __NPCSpecialDropItem(self, dropPlayer, ownerPlayerList, ipyDrop):
         '''特殊掉落 (私有特殊掉落 + 击杀次数特殊掉落), 支持摸怪
         @return: None
         @return: [[ownerPlayer, itemID, isBind, isDropInItemPack], ...]
@@ -3916,6 +3927,12 @@
         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)
@@ -4016,7 +4033,7 @@
         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)
@@ -4040,13 +4057,17 @@
             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为中心点开始掉落
@@ -4276,7 +4297,7 @@
         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()
@@ -4652,7 +4673,7 @@
                                        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)
@@ -4801,7 +4822,7 @@
         npcID = curNPC.GetNPCID()
         defObjType = curNPC.GetGameObjType() 
         mapFBType = GameWorld.GetMap().GetMapFBType()
-        mapID = GameWorld.GetMap().GetMapID()
+        mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
         playerID = curPlayer.GetPlayerID()
         
         # 如果是NPC
@@ -4833,13 +4854,14 @@
                     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

--
Gitblit v1.8.0