From a7d7e5fc4c17ab455ce3a5118fb0c529241454f1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 20 一月 2021 11:07:34 +0800
Subject: [PATCH] 8701 【主干】【后端】活动相关的充值界面显示优化(跨服充值排行活动支持分);

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossGrassland.py |  197 ++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 168 insertions(+), 29 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossGrassland.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossGrassland.py
index 30b9f00..fe910da 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossGrassland.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossGrassland.py
@@ -25,6 +25,7 @@
 import PlayerControl
 import ChConfig
 import FBCommon
+import ItemControler
 
 FBDict_SyncFBNPC = 'SyncFBNPC' #是否需要同步副本NPC
 
@@ -39,7 +40,8 @@
         npcID = IpyGameDataPY.GetFuncCfg("CrossGrasslandCfg", 1)
         if npcID:
             NPCCommon.UpdateNPCAttackCount(curPlayer, npcID, 0)
-            
+          
+    ResetGrasslandAwardRecord(curPlayer)  
     return
 
 ## 是否需要做进入副本通用检查条件逻辑,默认需要检查
@@ -89,8 +91,13 @@
     playerID = curPlayer.GetPlayerID()
     zoneID = FBCommon.GetCrossDynamicLineMapZoneID()
     funcLineID = FBCommon.GetCrossDynamicLineMapFuncLineID()
-    GameWorld.Log("DoEnterFB zoneID=%s,funcLineID=%s" % (zoneID, funcLineID), playerID)
+    crossMapID = PlayerControl.GetCrossMapID(curPlayer)
+    GameWorld.Log("DoEnterFB zoneID=%s,funcLineID=%s,crossMapID=%s" % (zoneID, funcLineID, crossMapID), playerID)
     FBCommon.Sync_FBNPC(curPlayer=curPlayer)
+    if crossMapID == ChConfig.Def_FBMapID_CrossGrasslandXian:
+        boxNPCID = IpyGameDataPY.GetFuncCfg("CrossGrasslandCfg", 1)
+        if boxNPCID:
+            NPCCommon.SyncNPCAttackCount(curPlayer, [boxNPCID])
     return
 
 ## 副本总逻辑计时器
@@ -122,44 +129,149 @@
 
 ## 客户端进入自定义场景
 def OnEnterCustomScene(curPlayer, mapID, lineID):
+    curState = PlayerFairyDomain.GetFairyDomainFBEventState(curPlayer, mapID, lineID)
     PlayerFairyDomain.SetFairyDomainFBEventState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting)
+    
+    if curState == PlayerFairyDomain.FDEventState_CanVisit:
+        refreshMapNPCDict = IpyGameDataPY.GetFuncEvalCfg("CrossGrasslandCfg", 2)
+        npcCountDict = refreshMapNPCDict.get((mapID, lineID), {})
+        for npcID, npcCount in npcCountDict.items():
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GrasslandNPCCount % npcID, npcCount)
+            
+        if mapID == ChConfig.Def_FBMapID_CrossGrasslandXian:
+            FBCommon.DelFBEnterTicket(curPlayer, mapID, lineID)
+    else:
+        DoCheckUpdateGrasslandEnd(curPlayer)
+        
+    SyncCustomSceneNPCCount(curPlayer, mapID, lineID)
+    if mapID == ChConfig.Def_FBMapID_CrossGrasslandXian:
+        boxNPCID = IpyGameDataPY.GetFuncCfg("CrossGrasslandCfg", 1)
+        if boxNPCID:
+            NPCCommon.SyncNPCAttackCount(curPlayer, [boxNPCID])
+            
     return
+
+## 自定义场景采集OK,需自带是否允许采集的判断
+def OnCustomSceneCollectOK(curPlayer, mapID, lineID, npcID):
+    curState = PlayerFairyDomain.GetFairyDomainFBEventState(curPlayer, mapID, lineID)
+    if curState != PlayerFairyDomain.FDEventState_Visiting:
+        return False
+    curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GrasslandNPCCount % npcID)
+    if not curCount:
+        return False
+    return True
+
+def DecCustomSceneNPCCount(curPlayer, npcID):
+    ## 减少草园自定义场景NPC,默认减少一个
+    mapID, lineID = GetGrasslandMapID(curPlayer)
+    if not mapID:
+        return
+    curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GrasslandNPCCount % npcID)
+    updCount = max(0, curCount - 1)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GrasslandNPCCount % npcID, updCount)
+    SyncCustomSceneNPCCount(curPlayer, mapID, lineID)
+    return
+
+def SyncCustomSceneNPCCount(curPlayer, mapID, lineID):
+    ## 通知自定义场景NPC数
+    refreshMapNPCDict = IpyGameDataPY.GetFuncEvalCfg("CrossGrasslandCfg", 2)
+    npcCountDict = refreshMapNPCDict.get((mapID, lineID), {})
+    npcNowCountDict = {}
+    for npcID in npcCountDict.keys():
+        npcNowCountDict[npcID] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GrasslandNPCCount % npcID)
+    if mapID == ChConfig.Def_FBMapID_CrossGrasslandXian:
+        boxNPCID = IpyGameDataPY.GetFuncCfg("CrossGrasslandCfg", 1)
+        if boxNPCID:
+            npcNowCountDict[boxNPCID] = 1
+    NPCCommon.SyncNPCCntInfo(curPlayer, mapID, npcNowCountDict)
+    return
+
+def RecordGrasslandAward(curPlayer, addItemList):
+    ## 记录草园奖励信息
+    mapID = GetGrasslandMapID(curPlayer)[0]
+    if not mapID:
+        return
+    
+    for itemInfo in addItemList:
+        if not isinstance(itemInfo, list):
+            continue
+        itemID, itemCount = itemInfo[:2]
+        
+        newIndex = None
+        for i in xrange(20):
+            itemCountInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GrasslandDropCount % i)
+            if not itemCountInfo:
+                newIndex = i
+                break
+            recItemID = itemCountInfo/100
+            if recItemID == itemID:
+                updRecValue = itemCountInfo + itemCount
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GrasslandDropCount % i, updRecValue)
+                break
+        if newIndex != None:
+            newRecValue = itemID*100 + itemCount
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GrasslandDropCount % newIndex, newRecValue)
+            
+    return
+
+def ResetGrasslandAwardRecord(curPlayer):
+    ## 重置草园奖励信息记录
+    for i in xrange(20):
+        itemCountInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GrasslandDropCount % i)
+        if not itemCountInfo:
+            break
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GrasslandDropCount % i, 0)
+    return
+
+    
+def GetGrasslandMapID(curPlayer):
+    grasslandMapIDList = [ChConfig.Def_FBMapID_CrossGrasslandLing, ChConfig.Def_FBMapID_CrossGrasslandXian]
+    crossMapID = PlayerControl.GetCrossMapID(curPlayer)
+    customMapID = PlayerControl.GetCustomMapID(curPlayer)
+    if crossMapID in grasslandMapIDList:
+        mapID = crossMapID
+        lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqCrossFBFuncLine)
+    elif customMapID in grasslandMapIDList:
+        mapID = customMapID
+        lineID = PlayerControl.GetCustomLineID(curPlayer)
+    else:
+        return 0, 0
+    return mapID, lineID
 
 def DoCheckUpdateGrasslandEnd(curPlayer):
     ## 检查更新草园已拜访完成
     
-    grasslandMapIDList = [ChConfig.Def_FBMapID_CrossGrasslandLing, ChConfig.Def_FBMapID_CrossGrasslandXian]
-    crossMapID = PlayerControl.GetCrossMapID(curPlayer)
-    clientCustomSceneMapID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneMapID)
-    if crossMapID in grasslandMapIDList:
-        mapID = crossMapID
-        lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqCrossFBFuncLine)
-    elif clientCustomSceneMapID in grasslandMapIDList:
-        mapID = clientCustomSceneMapID
-        lineID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneLineID)
-    else:
+    mapID, lineID = GetGrasslandMapID(curPlayer)
+    if not mapID:
         return
     
     # 采集次数是否已用完
-    collNPCIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("MapRefreshNPC", mapID)
-    if not collNPCIpyDataList:
-        return
-    
-    for collIpyData in collNPCIpyDataList:
-        npcIDList = collIpyData.GetNPCIDList()
-        for npcID in npcIDList:
-            collectNPCIpyData = IpyGameDataPY.GetIpyGameData("CollectNPC", npcID)
-            if not collectNPCIpyData:
-                return
-            limitMaxTime = collectNPCIpyData.GetMaxCollectCount()
-            totalCollTime = NPCCommon.GetTodayCollectCount(curPlayer, npcID)
-            if totalCollTime < limitMaxTime:
-                GameWorld.DebugLog("草园NPC采集次数未用完! npcID=%s,totalCollTime=%s < limitMaxTime=%s" % (npcID, totalCollTime, limitMaxTime))
-                return
+    if mapID == PlayerControl.GetCustomMapID(curPlayer):
+        refreshMapNPCDict = IpyGameDataPY.GetFuncEvalCfg("CrossGrasslandCfg", 2)
+        npcCountDict = refreshMapNPCDict.get((mapID, lineID), {})
+        npcIDList = npcCountDict.keys()
+    else:
+        collNPCIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("MapRefreshNPC", mapID)
+        if not collNPCIpyDataList:
+            return
+        
+        npcIDList = []
+        for collIpyData in collNPCIpyDataList:
+            npcIDList += collIpyData.GetNPCIDList()
+            
+    for npcID in npcIDList:
+        collectNPCIpyData = IpyGameDataPY.GetIpyGameData("CollectNPC", npcID)
+        if not collectNPCIpyData:
+            return
+        limitMaxTime = collectNPCIpyData.GetMaxCollectCount()
+        totalCollTime = NPCCommon.GetTodayCollectCount(curPlayer, npcID)
+        if totalCollTime < limitMaxTime:
+            GameWorld.DebugLog("草园NPC采集次数未用完! npcID=%s,totalCollTime=%s < limitMaxTime=%s" % (npcID, totalCollTime, limitMaxTime))
+            return
             
     # 宝箱怪攻击次数是否已用完
-    if mapID == ChConfig.Def_FBMapID_CrossGrasslandXian:
-        boxNPCID = IpyGameDataPY.GetFuncCfg("CrossGrasslandCfg", 1)
+    boxNPCID = IpyGameDataPY.GetFuncCfg("CrossGrasslandCfg", 1)
+    if mapID == ChConfig.Def_FBMapID_CrossGrasslandXian and boxNPCID:
         boxNPCIpyData = IpyGameDataPY.GetIpyGameDataNotLog("TreasureNPC", boxNPCID)
         if not boxNPCIpyData:
             return
@@ -173,7 +285,31 @@
             return
         
     PlayerFairyDomain.SetFairyDomainFBEventState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visited)
+    PlayerControl.SetCustomMap(curPlayer, 0, 0)
     GameWorld.DebugLog("设置草园已完成!mapID=%s, lineID=%s" % (mapID, lineID))
+    
+    # 通知结算
+    awardItemList = []
+    for i in xrange(20):
+        itemCountInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GrasslandDropCount % i)
+        if not itemCountInfo:
+            break
+        isAuctionItem = 0
+        itemID, itemCount = itemCountInfo/100, itemCountInfo%100
+        awardItemList.append([itemID, itemCount, isAuctionItem])
+    extraAward = [] #额外物品奖励
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID})
+    if ipyData:
+        fdEventID = ipyData.GetID()
+        extraAward = PlayerFairyDomain.GetFairyAppointAward(curPlayer, fdEventID)
+    if not extraAward:
+        extraAward = FBCommon.GetFBLineReward(mapID, lineID)
+    if extraAward:
+        ItemControler.GivePlayerItemOrMail(curPlayer, extraAward)
+        awardItemList += extraAward
+    overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList)}
+    FBCommon.NotifyFBOver(curPlayer, mapID, lineID, 1, overDict)
+    ResetGrasslandAwardRecord(curPlayer)
     return
 
 def DoFB_NPCDead(curNPC):
@@ -186,3 +322,6 @@
     GameWorld.GetGameFB().SetGameFBDict(FBDict_SyncFBNPC, 1)
     return
 
+
+
+

--
Gitblit v1.8.0