From 3facc622190958f02399ea1647159997179d3bf0 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 09 十二月 2020 11:10:15 +0800
Subject: [PATCH] 8605 【港台】【BT】【长尾】【后端】新增限时集字活动(支持脱机掉落)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActCollectWords.py |  115 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 77 insertions(+), 38 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActCollectWords.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActCollectWords.py
index 7f0cbfa..6e59afb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActCollectWords.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActCollectWords.py
@@ -104,48 +104,13 @@
         return
     
     for actNum, actName in ActCollectWordsNameDict.items():
-        
-        actInfo = PyGameData.g_operationActionDict.get(actName, {})
-        if not actInfo:
+        randList = __GetDropWordsItemRateList(curPlayer, actName, curNPC)
+        if not randList:
             continue
-        
-        if not actInfo.get(ShareDefine.ActKey_State):
-            continue
-        
-        cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
-        ipyData = IpyGameDataPY.GetIpyGameData(actName, cfgID)
-        if not ipyData:
-            continue
-        
-        isBoss = ChConfig.IsGameBoss(curNPC)
-        playerLV = curPlayer.GetLV()
-        npcLV = curNPC.GetLV()
-        limitLV = ipyData.GetLVLimit()
-        if not isBoss and limitLV and limitLV > playerLV:
-            #GameWorld.DebugLog("集字活动玩家等级不足,无法掉落! actNum=%s,cfgID=%s,limitLV=%s" % (actNum, cfgID, limitLV))
-            continue
-        
-        dropDiffLVLimit = ipyData.GetDropDiffLVLimit()
-        if not isBoss and dropDiffLVLimit and (playerLV - npcLV) > dropDiffLVLimit:
-            #GameWorld.DebugLog("集字活动玩家等级与NPC等级差值过大,无法掉落! actNum=%s,cfgID=%s,playerLV(%s) - npcLV(%s) > %s" 
-            #                   % (actNum, cfgID, playerLV, npcLV, dropDiffLVLimit))
-            continue
-        
-        lastDayOnlyExchange = ipyData.GetLastDayOnlyExchange()
-        if lastDayOnlyExchange:
-            openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
-            endDateStr = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
-            curDate = GameWorld.GetCurrentTime()
-            curDateStr = "%d-%s-%s" % (curDate.year, curDate.month, curDate.day)
-            if curDateStr == endDateStr:
-                #GameWorld.DebugLog("集字活动最后一天不掉落! %s" % curDateStr)
-                continue
-            
-        randList = ipyData.GetDropItemRateListBoss() if isBoss else ipyData.GetDropItemRateList()
         dropItemID = GameWorld.GetResultByRandomList(randList)
         if not dropItemID:
             continue
-        GameWorld.DebugLog("集字活动掉落物品! actNum=%,npcID=%s,dropItemID=%s" % (actNum, curNPC.GetNPCID(), dropItemID))
+        GameWorld.DebugLog("    集字活动掉落物品! actNum=%s,actName=%s,npcID=%s,dropItemID=%s" % (actNum, actName, curNPC.GetNPCID(), dropItemID))
         
         itemCount = 1 # 默认1个
         isAuctionItem = 0 # 非拍品
@@ -153,6 +118,80 @@
         
     return
 
+def __GetDropWordsItemRateList(curPlayer, actName, npcData):
+    ## 获取掉字饼图列表
+    
+    actInfo = PyGameData.g_operationActionDict.get(actName, {})
+    if not actInfo:
+        return
+    
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+    ipyData = IpyGameDataPY.GetIpyGameData(actName, cfgID)
+    if not ipyData:
+        return
+    
+    isBoss = ChConfig.IsGameBoss(npcData)
+    playerLV = curPlayer.GetLV()
+    npcLV = npcData.GetLV()
+    limitLV = ipyData.GetLVLimit()
+    if not isBoss and limitLV and limitLV > playerLV:
+        #GameWorld.DebugLog("    集字活动玩家等级不足,无法掉落! actName=%s,cfgID=%s,limitLV=%s" % (actName, cfgID, limitLV))
+        return
+    
+    dropDiffLVLimit = ipyData.GetDropDiffLVLimit()
+    if not isBoss and dropDiffLVLimit and (playerLV - npcLV) > dropDiffLVLimit:
+        #GameWorld.DebugLog("    集字活动玩家等级与NPC等级差值过大,无法掉落! actName=%s,cfgID=%s,playerLV(%s) - npcLV(%s) > %s" 
+        #                   % (actName, cfgID, playerLV, npcLV, dropDiffLVLimit))
+        return
+    
+    lastDayOnlyExchange = ipyData.GetLastDayOnlyExchange()
+    if lastDayOnlyExchange:
+        openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
+        endDateStr = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
+        curDate = GameWorld.GetCurrentTime()
+        curDateStr = "%d-%s-%s" % (curDate.year, curDate.month, curDate.day)
+        if curDateStr == endDateStr:
+            #GameWorld.DebugLog("    集字活动最后一天不掉落! actName=%s,cfgID=%s, %s" % (actName, cfgID, curDateStr))
+            return
+        
+    return ipyData.GetDropItemRateListBoss() if isBoss else ipyData.GetDropItemRateList()
+
+def OnGetDropWordsItemDict(curPlayer, npcData, killCount):
+    ## 获取脱机掉落物品
+    
+    dropItemCountDict = {}
+    for actNum, actName in ActCollectWordsNameDict.items():
+        
+        dropRateList = __GetDropWordsItemRateList(curPlayer, actName, npcData)
+        if not dropRateList:
+            continue
+        
+        preRate = 0
+        maxRate = dropRateList[-1][0]
+        for rateInfo in dropRateList:
+            rate, dropItemID = rateInfo
+            curRate = rate - preRate
+            if not curRate:
+                break
+            preRate = rate
+            if not dropItemID:
+                continue
+            totalRate = curRate * killCount # 总概率
+            dropCount = totalRate / maxRate # 可掉落数
+            rateEx = totalRate % maxRate # 剩余概率
+            if GameWorld.CanHappen(rateEx, maxRate):
+                dropCount += 1
+            if not dropCount:
+                continue
+            
+            dropItemCountDict[dropItemID] = dropItemCountDict.get(dropItemID, 0) + dropCount
+            GameWorld.DebugLog("    脱机集字活动掉字: actNum=%s,actName=%s,dropItemID=%s,dropCount=%s" % (actNum, actName, dropItemID, dropCount))
+            
+    return dropItemCountDict
+
 #// AA 09 集字活动兑换 #tagCMActCollectWordsExchange
 #
 #struct    tagCMActCollectWordsExchange

--
Gitblit v1.8.0