From a200c70ea4244a6924ed735096f027f408c02a46 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 13 十一月 2023 13:31:53 +0800
Subject: [PATCH] 9912 [BT0.1]BOSS凭证(天玄丹buff掉落支持) master

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py |   85 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 83 insertions(+), 2 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 d63086c..80bac64 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -79,6 +79,7 @@
 import random
 import math
 import time
+import copy
 #---------------------------------------------------------------------
 
 OnNPCDie = None
@@ -988,6 +989,8 @@
         GameWorld.ErrLog("获取NPC掉落配置错误!表不存在该NPCID=%s" % npcID, playerID)
         return
     
+    tianxuanState = False # 是否有天玄额外掉落状态
+    tianxuanBuff = SkillCommon.FindBuffByID(dropPlayer, ChConfig.Def_SkillID_TianxuanBuff)[0]
     curGrade = curGrade if curGrade else GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.Def_FB_Grade)
     
     dropIDList = [] # 掉落的ID列表
@@ -1047,6 +1050,14 @@
         dropEquipInfoList += __GetNPCIndepRateEquipDrop(mapID, ipyDrop, indepRateDoCnt, equipDropRatePlus, curGrade)    
     #GameWorld.DebugLog("阶,颜色 key,dropEquipInfoList=%s" % (dropEquipInfoList))
     
+    # 天玄丹 
+    tianxuanEquipRateList = ipyDrop.GetTianxuanEquipRateList()
+    if tianxuanBuff and tianxuanEquipRateList:
+        tianxuanState = True
+        dropInfo = GameWorld.GetResultByRandomList(tianxuanEquipRateList)
+        if dropInfo:
+            dropEquipInfoList.append(dropInfo)
+            
     # 3. 第x次击杀, 归属者公共附加掉落,所有归属者都增加击杀次数; 
     tagClassLV, tagColor, tagIsSuit, tagPlaceKey = 0, 0, 0, 0
     killCountDropEquipPub = ipyDrop.GetKillCountDropEquipPub() # 第x次击杀附加必掉装备 {次数:[阶,颜色,是否套装,部位集合key], ...}
@@ -1098,6 +1109,7 @@
     if npcID in fbGradeColorSuitRateDict:
         gradeColorSuitRateDict = fbGradeColorSuitRateDict[npcID]
         
+    equipColorDropLimitDay = IpyGameDataPY.GetFuncEvalCfg("ItemDropCountLimit", 1, {}) # 每日个人掉落装备个数限制 {品质:每日掉落个数, ...}
     colorDropCntDict = {} # 装备颜色已经掉落数 {颜色:数量, ...}
     colorMaxDropCntDict = ipyDrop.GetEquipColorMaxDropCount() # {颜色:上限数量,...}
     colorSuitRateDict = ipyDrop.GetEquipColorSuitInfo() # 装备颜色对应套装概率 {颜色:套装概率, ...}
@@ -1111,6 +1123,14 @@
         if realmNPCIpyData:
             classLV = realmNPCIpyData.GetEquipClassLV()
             GameWorld.DebugLog("掉落对应难度境界装备: classLV=%s" % classLV, playerID)
+            
+        colorCountToday = 0
+        if color in equipColorDropLimitDay:
+            colorCountMax = equipColorDropLimitDay[color]
+            colorCountToday = dropPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DropColorToday % color)
+            if colorCountToday >= colorCountMax:
+                GameWorld.DebugLog("已超过该颜色装备今日最大掉落数,不掉!color=%s,colorCountMax=%s" % (color, colorCountMax), playerID)
+                continue
             
         if color in colorMaxDropCntDict:
             maxCount = colorMaxDropCntDict[color]
@@ -1157,6 +1177,9 @@
         randEquipIDList = __GetEquipIDList(npcID, classLV, color, isSuit, placeList, jobList)
         if not randEquipIDList:
             continue
+        if color in equipColorDropLimitDay:
+            colorCountToday += 1
+            PlayerControl.NomalDictSetProperty(dropPlayer, ChConfig.Def_PDict_DropColorToday % color, colorCountToday)
         if color in colorMaxDropCntDict:
             colorDropCntDict[color] = dropCount + 1
         if isSuit and len(jobList) > 1:
@@ -1166,9 +1189,13 @@
         dropIDList.append(randItemID)
         GameWorld.DebugLog("掉落装备: npcID=%s,itemID=%s,classLV=%s,color=%s,isSuit=%s,placeKey=%s,jobList=%s,randEquipIDList=%s" 
                            % (npcID, randItemID, classLV, color, isSuit, placeKey, jobList, randEquipIDList), playerID)
+        if colorCountToday:
+            GameWorld.DebugLog("    更新掉落特殊品质装备今日次数: color=%s,colorCountToday=%s" % (color, colorCountToday), playerID)
         
     # 4. 指定物品ID库
     dropIDList += __GetAppointDropItemIDList(dropPlayer, npcID, ipyDrop, doCountRate, doCountAdd)
+    if tianxuanBuff and (ipyDrop.GetTianxuanItemKeyRate() or ipyDrop.GetTianxuanItemIDRate()):
+        tianxuanState = True
     
     # 5. 私有掉落
     if isSingle:
@@ -1247,6 +1274,12 @@
         GameWorld.DebugLog("    auctionIDList=%s" % (auctionIDList), playerID)
     elif ChConfig.IsGameBoss(npcData):
         GameWorld.ErrLog("Boss没有掉落物品,NPCID=%s" % (npcID), dropPlayer.GetPlayerID())
+        
+    if tianxuanState:
+        GameWorld.DebugLog("    去除天玄丹buff", playerID)
+        tick = GameWorld.GetGameWorld().GetTick()
+        BuffSkill.DelBuffBySkillID(dropPlayer, ChConfig.Def_SkillID_TianxuanBuff, tick)
+        
     return dropIDList, auctionIDList, dropMoneyCnt, moneyValue
 
 def __GetRandDropSuitEquipID(curPlayer, randEquipIDList):
@@ -1356,11 +1389,12 @@
                 
     return dropIDList
 
-def __GetAppointDropItemIDList(curPlayer, npcID, ipyDrop, doCountRate, doCountAdd):
+def __GetAppointDropItemIDList(curPlayer, npcID, ipyDrop, doCountRate, doCountAdd, tianxuanBuff):
     ## 指定物品ID掉落
     
     dropItemIDList = []
     
+    itemDropLimitDayInfo = IpyGameDataPY.GetFuncEvalCfg("ItemDropCountLimit", 2, {}) # 每日个人掉落物品个数限制 {物品ID:每日掉落上限, ...}
     # 1. 职业物品ID集合
     job = curPlayer.GetJob()
     JobItemDropSets = IpyGameDataPY.GetFuncCfg("JobItemDropSets", 1) # {物品ID集合key:[职业顺序物品ID列表], ...}
@@ -1395,7 +1429,13 @@
                 
     #     1.2 随机掉落一个
     ItemKeyDropRateDict = ipyDrop.GetItemKeyDropRate() # {物品ID集合key:概率, ...}, 随机掉一个,优先级低
+    tianxuanItemKeyRateDict = ipyDrop.GetTianxuanItemKeyRate() # 天玄丹指定ID集合Key概率{物品ID集合key:概率, ...}
+    if tianxuanBuff and tianxuanItemKeyRateDict:
+        ItemKeyDropRateDict = copy.deepcopy(ItemKeyDropRateDict)
+        ItemKeyDropRateDict.update(tianxuanItemKeyRateDict)
+        
     if ItemKeyDropRateDict:
+        GameWorld.DebugLog("ItemKeyDropRateDict:%s" % ItemKeyDropRateDict)
         for itemKey, dropRate in ItemKeyDropRateDict.items():
             # 在只掉本职业里的不处理
             if itemKey in ItemKeyDropRateJobDict:
@@ -1423,18 +1463,27 @@
                     continue
                 if not randItemID:
                     continue
+                if __dropIDCountLimitToday(curPlayer, randItemID, itemDropLimitDayInfo):
+                    continue
                 dropItemIDList.append(randItemID)
                 #GameWorld.DebugLog("掉落随机指定物品ID: itemKey=%s,randItemID=%s" % (itemKey, randItemID))
                 
     # 2. 指定掉落ID处理, 受全局设定影响
     itemIDDropRateDict = ipyDrop.GetItemIDDropRate() # {物品ID:概率, ...}
     itemIDDropMaxCntDict = ipyDrop.GetItemIDMaxDropCount() # {物品ID:最大掉落个数,...}
-    
+    tianxuanItemIDRate = ipyDrop.GetTianxuanItemIDRate() # 天玄丹指定ID概率 {物品ID:概率, ...}
+    if tianxuanBuff and tianxuanItemIDRate:
+        itemIDDropRateDict = copy.deepcopy(itemIDDropRateDict)
+        itemIDDropRateDict.update(tianxuanItemIDRate)
+        
     # 全局材料掉落控制
     globalDropCDDict = IpyGameDataPY.GetFuncCfg("GlobalDropCD", 1) # {物品ID:分钟, ...}
     globalDropRateDict = IpyGameDataPY.GetFuncCfg("NPCGlobalDropRate", 1) # {物品ID:[[npcID列表], "概率公式"], ...}
     gw = GameWorld.GetGameWorld()
     
+    if itemIDDropRateDict:
+        GameWorld.DebugLog("itemIDDropRateDict=%s" % itemIDDropRateDict)
+        
     for itemID, dropRate in itemIDDropRateDict.items():
         
         if not dropRate:
@@ -1462,6 +1511,9 @@
         #GameWorld.DebugLog("    指定判断: itemID=%s, dropRate=%s, doCnt=%s" % (itemID, dropRate, doCnt))
         for _ in xrange(doCnt):
             if not GameWorld.CanHappen(dropRate, maxRate=Def_NPCMaxDropRate):
+                continue
+            
+            if __dropIDCountLimitToday(curPlayer, itemID, itemDropLimitDayInfo):
                 continue
             
             dropItemIDList.append(itemID)
@@ -1533,6 +1585,23 @@
                 GameWorld.Log("全服击杀次数必掉随机物品: randItemID=%s,randItemCount=%s" % (randItemID, randItemCount))
                 
     return dropItemIDList
+
+def __dropIDCountLimitToday(curPlayer, itemID, itemDropLimitDayInfo):
+    ## 处理今日掉落物品ID个数限制
+    # @return: 是否限制
+    if itemID not in itemDropLimitDayInfo:
+        return False
+    dropCountTodayMax = itemDropLimitDayInfo[itemID]
+    if not dropCountTodayMax:
+        return False
+    dropCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DropCountToday % itemID)
+    if dropCountToday >= dropCountTodayMax:
+        GameWorld.DebugLog("    物品ID今日掉落次数已达上限: itemID=%s,dropCountToday=%s" % (itemID, dropCountToday), curPlayer.GetPlayerID())
+        return True
+    dropCountToday += 1
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DropCountToday % itemID, dropCountToday)
+    GameWorld.DebugLog("    更新物品ID今日掉落次数: itemID=%s,dropCountToday=%s" % (itemID, dropCountToday), curPlayer.GetPlayerID())
+    return False
 
 def __GetEquipIDList(findID, classLV, color, isSuit, placeList, itemJobList, findType="NPC"):
     #存一个满足要求的所有的物品的列表 然后从当中随机选一个
@@ -6031,6 +6100,18 @@
     NetPackCommon.SendFakePack(curPlayer, npcIDCollInfo)
     return
 
+def PlayerOnDay(curPlayer):
+    #采集次数重置
+    CollNPCTimeOnDay(curPlayer)
+    itemDropLimitDayInfo = IpyGameDataPY.GetFuncEvalCfg("ItemDropCountLimit", 2, {})
+    for itemID in itemDropLimitDayInfo.keys():
+        if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DropCountToday % itemID):
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DropCountToday % itemID, 0)
+    for color in range(20):
+        if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DropColorToday % color):
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DropColorToday % color, 0)
+    return
+
 def CollNPCTimeOnDay(curPlayer):
     ## 采集NPCOnDay处理
     DoResetCollectNPCTimeByType(curPlayer, [1])

--
Gitblit v1.8.0