From da600c48b92c65ec78edea08544c6ca9a50b1143 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期一, 29 四月 2019 16:20:58 +0800
Subject: [PATCH] 3450 【BUG】【2.0】莲台升星错误

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py |  165 +++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 131 insertions(+), 34 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
index dcfd19e..40c6617 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py
@@ -21,10 +21,12 @@
 import NetPackCommon
 import ShareDefine
 import GameWorld
+import GameLogic_CrossGrassland
 import PlayerControl
 import IpyGameDataPY
 import PlayerActivity
 import ItemControler
+import PyGameData
 import EventShell
 
 import copy
@@ -35,9 +37,9 @@
 (
 FDEventType0,
 FDEventType1,
-FDEventType2,
+FDEventType_GrasslandXian,
 FDEventType3,
-FDEventType4,
+FDEventType_GrasslandLing,
 ) = range(5)
 
 (
@@ -47,10 +49,48 @@
 FDEventState_Visited,  #已拜访3
 ) = range(4)
 
+#1-等级奇遇 2-境界奇遇 3-战力奇遇 4-气运奇遇
+AdventuresTypeList = (
+AdventuresType1,
+AdventuresType2,
+AdventuresType3,
+AdventuresType4,
+) = range(1, 5)
+
 
 def OnLogin(curPlayer):
     NotifyVisitFairyDomainInfo(curPlayer)
     NotifyFairyAdventuresInfo(curPlayer)
+    return
+
+
+def OnHour(curPlayer):
+    __ResetFairyDomainCntLimit(curPlayer, 1)
+    return
+
+
+def OnDay(curPlayer):
+    __ResetFairyDomainCntLimit(curPlayer, 2)
+    return
+
+
+def __ResetFairyDomainCntLimit(curPlayer, resetType):
+    ## 重置个人缥缈事件出现次数记录
+    ipyMgr = IpyGameDataPY.IPY_Data()
+    for i in xrange(ipyMgr.GetFairyDomainCount()):
+        ipyData = ipyMgr.GetFairyDomainByIndex(i)
+        eventID = ipyData.GetID()
+        appearCntInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventAppearCnt % eventID)
+        if not appearCntInfo:
+            continue
+        hourAppearCntPri, dayAppearCntPri = appearCntInfo % 1000, appearCntInfo / 1000
+        if resetType == 1:
+            updAppearCntInfo = dayAppearCntPri * 1000
+        elif resetType == 2:
+            updAppearCntInfo = hourAppearCntPri
+        else:
+            return
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventAppearCnt % eventID, updAppearCntInfo)
     return
 
 
@@ -66,20 +106,13 @@
     
     otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2)
     maxEventCnt = max([info[1] for info in otherCntRateList]) + 1  #最大可出现事件个数
-    fairyDomainState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState) #是否寻访中  0未寻访 1寻访中 2任务标记可寻访
+    fairyDomainState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState)  #是否寻访中  0未寻访 1寻访中 2任务标记可寻访
     if clientData.Type == 1:  #结束寻访
         if fairyDomainState != 1:
             GameWorld.DebugLog("    未开始寻访仙域, 无法结束")
             return
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 0)
-        
-        for i in xrange(maxEventCnt):
-            fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i)
-            if fdEventID:
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventID % i, 0)
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdEventID, 0)
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyAdventuresData % fdEventID, 0)
-                
+        EndFairyDomain(curPlayer)
+                        
         NotifyVisitFairyDomainInfo(curPlayer)
         return
     
@@ -100,7 +133,7 @@
     
     #随机事件 重置事件状态
     visitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)
-    appointIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog('FairyDomainAppoint', visitCnt+1)
+    appointIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog('FairyDomainAppoint', visitCnt + 1)
     if appointIpyDataList:
         fdEventIDList = []
         for appointIpyData in appointIpyDataList:
@@ -133,10 +166,20 @@
             if not randomList:
                 continue                
             fdEventIDList += randomList
-    
+        #更新个人出现次数
+        for fdEventID in fdEventIDList:
+            appearCntInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventAppearCnt % fdEventID)
+            hourAppearCntPri, dayAppearCntPri = appearCntInfo % 1000, appearCntInfo / 1000
+            updAppearCntInfo = (dayAppearCntPri + 1) * 1000 + (hourAppearCntPri + 1)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventAppearCnt % fdEventID, updAppearCntInfo)
+        #更新全服出现次数
+        msgStr = str(fdEventIDList)
+        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'AddFairyDomainEvent', msgStr, len(msgStr))
     #奇遇事件 随机档位数据
     openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
     for fdEventID in fdEventIDList:
+        if fdEventID not in AdventuresTypeList:
+            continue
         ipyData = IpyGameDataPY.InterpolationSearch('FairyAdventures', 'OpenServerDay', openServerDay, {'EventID':fdEventID})
         if not ipyData:
             #GameWorld.ErrLog('寻访仙域, 奇遇事件没有随机出对应档位 randomList=%s,openServerDay=%s' % (randomList, openServerDay))
@@ -148,7 +191,6 @@
         condition = random.choice(conditionList)
         index = conditionList.index(condition)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyAdventuresData % fdEventID, ipyData.GetID() * 100 + index)
-
     
     if not fdEventIDList:
         GameWorld.Log('寻访仙域, 没有随机出事件!!')
@@ -159,7 +201,8 @@
     for i in xrange(maxEventCnt):
         fdEventID = fdEventIDList[i] if i < len(fdEventIDList) else 0
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventID % i, fdEventID)
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdEventID, FDEventState_CanVisit)
+        if fdEventID:
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdEventID, FDEventState_CanVisit)
     #设置寻访中
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 1)
     #设置初始体力
@@ -169,6 +212,20 @@
     #通知
     NotifyVisitFairyDomainInfo(curPlayer, fdEventIDList)
     NotifyFairyAdventuresInfo(curPlayer)
+    return
+
+
+def EndFairyDomain(curPlayer):
+    ##结束寻访
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 0)
+    otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2)
+    maxEventCnt = max([info[1] for info in otherCntRateList]) + 1  #最大可出现事件个数
+    for i in xrange(maxEventCnt):
+        fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i)
+        if fdEventID:
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventID % i, 0)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdEventID, 0)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyAdventuresData % fdEventID, 0)
     return
 
 
@@ -187,18 +244,50 @@
             #丹炉等级不足
             continue
         lvLimit = ipyData.GetNeedLV()
-        if lvLimit and not (lvLimit[0]<=curLV<=lvLimit[1]):
+        if lvLimit and not (lvLimit[0] <= curLV <= lvLimit[1]):
             #等级范围不满足
             continue
-        
+        eventID = ipyData.GetID()
+        appearCntInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventAppearCnt % eventID)
+        hourAppearCntPri, dayAppearCntPri = appearCntInfo % 1000, appearCntInfo / 1000
+        hourCntPriLimit, dayCntPriLimit = ipyData.GetHourCntPriLimit(), ipyData.GetDayCntPriLimit()
+        if hourCntPriLimit and hourAppearCntPri >= hourCntPriLimit:
+            #超过本小时个人可出现次数上限
+            continue
+        if dayCntPriLimit and dayAppearCntPri >= dayCntPriLimit:
+            #超过今日个人可出现次数上限
+            continue
+        if eventID in PyGameData.g_fairyDomainLimit:
+            #超过全服可出现次数
+            continue
         rate += ipyData.GetWeight()
         randomRateList.append([rate, ipyData.GetID()])
     if not randomRateList:
-        GameWorld.DebugLog('    缥缈仙域刷新池 随机库获取错误 !eventType=%s' % eventType, curPlayer.GetID())
+        GameWorld.DebugLog('    缥缈仙域刷新池 该类型没有符合条件的事件!eventType=%s' % eventType, curPlayer.GetID())
         return []
-    randomResultList = GameWorld.GetResultByRandomListEx(randomRateList, cnt, [])
-        
+    realCnt = min(len(randomRateList), cnt)
+    randomResultList = GameWorld.GetResultByRandomListEx(randomRateList, realCnt, [])
+    GameWorld.DebugLog('eventType=%s, cnt=%s,randomRateList=%s,randomResultList=%s' % (eventType, cnt, randomRateList, randomResultList))
     return randomResultList
+
+
+def GetFairyDomainFBEventState(curPlayer, mapID, lineID):
+    ## 获取缥缈相关副本寻访状态
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID})
+    if not ipyData:
+        return FDEventState_No
+    fdeventID = ipyData.GetID()
+    curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventState % fdeventID)
+    return curState
+
+
+def SetFairyDomainFBEventState(curPlayer, mapID, lineID, state):
+    ## 设置缥缈相关副本寻访状态
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID})
+    if not ipyData:
+        return False
+    fdeventID = ipyData.GetID()
+    return SetFairyDomainEventState(curPlayer, fdeventID, state)
 
 
 def SetFairyDomainEventState(curPlayer, fdeventID, state):
@@ -226,34 +315,40 @@
             GameWorld.Log('缥缈仙域事件状态设置,体力不足!,fdeventID=%s, costEnergy=%s, curEnergy=%s' % (fdeventID, costEnergy, curEnergy))
             return
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEnergy, curEnergy - costEnergy)
+        
+        # 草园重置
+        if ipyData.GetEventType() in [FDEventType_GrasslandXian, FDEventType_GrasslandLing]:
+            GameLogic_CrossGrassland.DoResetCrossGrassland(curPlayer, ipyData.GetEventType(), fdeventID)
+            
     elif state == FDEventState_Visited:
         if curState != FDEventState_Visiting:
             GameWorld.Log('缥缈仙域事件状态设置错误,fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState))
             return
         EventShell.EventRespons_FairyDomain(curPlayer)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdeventID, state)
-    NotifyVisitFairyDomainInfo(curPlayer, [fdeventID])
+    NotifyVisitFairyDomainInfo(curPlayer, [fdeventID], 0)
     return True
 
 
-def NotifyVisitFairyDomainInfo(curPlayer, fdEventList=[]):
-    isAll = 0
+def NotifyVisitFairyDomainInfo(curPlayer, fdEventList=[], isAll=1):
     if not fdEventList:
-        isAll = 1
+        syncFDEventList = []
         otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2)
         maxEventCnt = max([info[1] for info in otherCntRateList]) + 1  #最大可出现事件个数
         for i in xrange(maxEventCnt):
             fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i)
             if fdEventID:
-                fdEventList.append(fdEventID)
-            
+                syncFDEventList.append(fdEventID)
+    else:
+        syncFDEventList = fdEventList
+
     packData = ChPyNetSendPack.tagMCFairyDomainInfo()
     packData.IsAll = isAll
     packData.State = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState)
     packData.Energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEnergy)
     packData.VisitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)
     packData.InfoList = []
-    for fdeventID in fdEventList:
+    for fdeventID in syncFDEventList:
         fdeventData = ChPyNetSendPack.tagMCFairyDomainEvent()
         fdeventData.EventID = fdeventID
         fdeventData.EventState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventState % fdeventID)
@@ -274,6 +369,8 @@
     maxEventCnt = max([info[1] for info in otherCntRateList]) + 1  #最大可出现事件个数
     for i in xrange(maxEventCnt):
         fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i)
+        if fdEventID not in AdventuresTypeList:
+            continue
         adventuresdata = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyAdventuresData % fdEventID)
         if not adventuresdata:
             continue
@@ -283,7 +380,7 @@
         conditionList = ipyData.GetCondition()
         index = adventuresdata % 100
         if IpyGameDataPY.GetIpyGameDataByCondition('FairyDomainAppoint', {'Cnt':visitCnt, 'EventID':fdEventID}, False, False):
-            condition = 0 #定制的条件为0
+            condition = 0  #定制的条件为0
         else:
             condition = conditionList[index] if index < len(conditionList) else 0
         adventuresdata = ChPyNetSendPack.tagMCFairyAdventuresData()
@@ -319,13 +416,13 @@
         giveItemList = GetFairyAppointAward(curPlayer, fdeventID)
         if not giveItemList:
             #1-等级奇遇 2-境界奇遇 3-战力奇遇 4-气运奇遇
-            if fdeventID == 1:
+            if fdeventID == AdventuresType1:
                 curData = curPlayer.GetLV()
-            elif fdeventID == 2:
+            elif fdeventID == AdventuresType2:
                 curData = curPlayer.GetOfficialRank()
-            elif fdeventID == 3:
+            elif fdeventID == AdventuresType3:
                 curData = curPlayer.GetFightPower()
-            elif fdeventID == 4:
+            elif fdeventID == AdventuresType4:
                 curData = curPlayer.GetLuckValue()
             else:
                 return
@@ -351,4 +448,4 @@
     ipyData = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomainAppoint', {'Cnt':visitCnt, 'EventID':fdEventID}, False, False)
     if not ipyData:
         return
-    return ipyData.GetAward()
\ No newline at end of file
+    return ipyData.GetAward()

--
Gitblit v1.8.0