| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerFairyDomain  | 
| #  | 
| # @todo:çÎç¿ÏÉÓò  | 
| # @author xdh  | 
| # @date 2019-04-04  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: çÎç¿ÏÉÓò  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2019-04-04"""  | 
| #---------------------------------------------------------------------  | 
|   | 
| import ChConfig  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import PlayerBossReborn  | 
| import ShareDefine  | 
| import GameWorld  | 
| import GameLogic_CrossGrassland  | 
| import PlayerControl  | 
| import IpyGameDataPY  | 
| import PlayerActivity  | 
| import PlayerWeekParty  | 
| import PlayerFeastTravel  | 
| import PlayerFairyCeremony  | 
| import PlayerNewFairyCeremony  | 
| import ItemControler  | 
| import ItemCommon  | 
| import PlayerTask  | 
| import PyGameData  | 
| import EventShell  | 
| import FBCommon  | 
| import NPCCommon  | 
|   | 
| import copy  | 
| import random  | 
|   | 
| #0-ÆæÓö 1-±¦²Ø 2-Ïɲݠ3-ÑýÍõ 4-Áé²Ý  | 
| (  | 
| FDEventType0,  | 
| FDEventType1,  | 
| FDEventType_GrasslandXian,  | 
| FDEventType3,  | 
| FDEventType_GrasslandLing,  | 
| ) = range(5)  | 
|   | 
| (  | 
| FDEventState_No,  #²»¿É°Ý·Ã0  | 
| FDEventState_CanVisit,  #¿É°Ý·Ã1  | 
| FDEventState_Visiting,  #°Ý·ÃÖÐ2  | 
| FDEventState_Visited,  #ÒѰݷÃ3  | 
| ) = range(4)  | 
|   | 
| #1-µÈ¼¶ÆæÓö 2-¾³½çÆæÓö 3-Õ½Á¦ÆæÓö 4-ÆøÔËÆæÓö  | 
| AdventuresTypeList = (  | 
| AdventuresType1,  | 
| AdventuresType2,  | 
| AdventuresType3,  | 
| AdventuresType4,  | 
| ) = range(1, 5)  | 
|   | 
| #ʼþ¸±±¾ÀàÐÍ  | 
| (  | 
| FDEventFBType_Client, #ǰ¶Ë±¾0  | 
| FDEventFBType_Server, #±¾·þ±¾1  | 
| FDEventFBType_CrossServer, #¿ç·þ±¾2  | 
| ) = range(3)  | 
|   | 
| 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  | 
|   | 
|   | 
| #// A5 26 Ñ°·ÃÏÉÓò #tagCMVisitFairyDomain  | 
| #  | 
| #struct    tagCMVisitFairyDomain  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        Type;    //0-¿ªÊ¼Ñ°·Ã 1-½áÊøÑ°·Ã  | 
| #};  | 
| def OnVisitFairyDomain(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2)  | 
|     maxEventCnt = GetMaxEventCnt()  #×î´ó¿É³öÏÖʼþ¸öÊý  | 
|     fairyDomainState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState)  #ÊÇ·ñѰ·ÃÖР 0δѰ·Ã 1Ѱ·ÃÖР2ÈÎÎñ±ê¼Ç¿ÉѰ·Ã  | 
|     if clientData.Type == 1:  #½áÊøÑ°·Ã  | 
|         if fairyDomainState != 1:  | 
|             GameWorld.DebugLog("    Î´¿ªÊ¼Ñ°·ÃÏÉÓò£¬ ÎÞ·¨½áÊø")  | 
|             return  | 
|         EndFairyDomain(curPlayer)  | 
|                           | 
|         NotifyVisitFairyDomainInfo(curPlayer)  | 
|         return  | 
|       | 
|     dailyID = ShareDefine.DailyActionID_FairyDomain  | 
|     hasOpen = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % dailyID)  | 
|     if fairyDomainState != 2 and not hasOpen:  | 
|         GameWorld.DebugLog("    Ñ°·ÃÏÉÓò»î¶¯Î´¿ªÆô£¡")  | 
|         return  | 
|       | 
|     #ÊÇ·ñѰ·ÃÖÐ  | 
|     if fairyDomainState == 1:  | 
|         GameWorld.DebugLog("    ÕýÔÚѰ·ÃÏÉÓòÖУ¡ÇëÏÈÍ˳öѰ·Ã")  | 
|         return  | 
|     remainCnt = PlayerActivity.GetDailyActionrRemainCnt(curPlayer, dailyID)  | 
|     if not remainCnt:  | 
|         GameWorld.DebugLog("    Ã»ÓÐѰ·Ã´ÎÊýÁË£¡")  | 
|         return  | 
|       | 
|     #Ëæ»úʼþ ÖØÖÃʼþ״̬  | 
|     visitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)  | 
|     appointIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog('FairyDomainAppoint', visitCnt + 1)  | 
|     if appointIpyDataList:  | 
|         fdEventIDList = []  | 
|         for appointIpyData in appointIpyDataList:  | 
|             fdEventIDList.append(appointIpyData.GetEventID())   | 
|     else:  | 
|         fdEventTypeDict = {}  | 
|         #ÏÈËæ»ú¶ÀÁ¢Ê¼þ  | 
|         singleEventRateDict = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 1, {})  | 
|         for eventType, rate in singleEventRateDict.items():  | 
|             if GameWorld.CanHappen(rate):  | 
|                 fdEventTypeDict[eventType] = 1  | 
|   | 
|         otherCnt = GameWorld.GetResultByRandomList(otherCntRateList, 0)  | 
|         if otherCnt:  | 
|             otherEventRateList = copy.deepcopy(IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 3))  | 
|             unRepeatTypeList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 4)  | 
|             for _ in xrange(otherCnt):  | 
|                 otherEventType = GameWorld.GetResultByRandomList(otherEventRateList)  | 
|                 if otherEventType is None:  | 
|                     continue  | 
|                 if otherEventType in unRepeatTypeList:  | 
|                     for index, info in enumerate(otherEventRateList):  | 
|                         if otherEventType == info[1]:  | 
|                             otherEventRateList = GameWorld.ResetRiseList(otherEventRateList, index)  | 
|                             break  | 
|                 fdEventTypeDict[otherEventType] = fdEventTypeDict.get(otherEventType, 0) + 1  | 
|                       | 
|         fdEventIDList = []  | 
|         for eventType, cnt in fdEventTypeDict.items():  | 
|             randomList = __RandomFDEventByType(curPlayer, eventType, cnt)  | 
|             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))  | 
|     if not fdEventIDList:  | 
|         fdEventIDList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 5)  | 
|         GameWorld.Log('Ѱ·ÃÏÉÓò, Ã»ÓÐËæ»ú³öʼþ,ʹÓÃĬÈÏʼþ£¡£¡ playerLV=%s,visitCnt=%s,ĬÈÏfdEventIDList=%s'%(curPlayer.GetLV(), visitCnt, fdEventIDList), curPlayer.GetID())  | 
|         if not fdEventIDList:  | 
|             return  | 
|           | 
|     for fdEventID in fdEventIDList:  | 
|         domainIpyData = IpyGameDataPY.GetIpyGameData('FairyDomain', fdEventID)  | 
|         if not domainIpyData:  | 
|             continue  | 
|           | 
|         # ²ÝÔ°ÖØÖà  | 
|         if domainIpyData.GetEventType() in [FDEventType_GrasslandXian, FDEventType_GrasslandLing]:  | 
|             GameLogic_CrossGrassland.DoResetCrossGrassland(curPlayer, domainIpyData.GetEventType(), fdEventID)  | 
|               | 
|     if not PlayerActivity.AddDailyActionFinishCnt(curPlayer, dailyID):  | 
|         return  | 
|       | 
|     #ÆæÓöʼþ Ëæ»úµµÎ»Êý¾Ý  | 
|     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))  | 
|             continue  | 
|         conditionList = ipyData.GetCondition()  | 
|         if not conditionList:  | 
|             index = 0  | 
|         else:  | 
|             condition = random.choice(conditionList)  | 
|             index = conditionList.index(condition)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyAdventuresData % fdEventID, ipyData.GetID() * 100 + index)  | 
|   | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainVisitCnt, min(visitCnt + 1, ChConfig.Def_UpperLimit_DWord))  | 
|     #ÉèÖÃʼþ  | 
|     for i in xrange(maxEventCnt):  | 
|         fdEventID = fdEventIDList[i] if i < len(fdEventIDList) else 0  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventID % i, fdEventID)  | 
|         if fdEventID:  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdEventID, FDEventState_CanVisit)  | 
|     #ÉèÖÃѰ·ÃÖÐ  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 1)  | 
|     #ÉèÖóõʼÌåÁ¦  | 
|     initEnergy = IpyGameDataPY.GetFuncCfg('ImmortalDomainStrength')  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEnergy, initEnergy)  | 
|     GameWorld.DebugLog('Ѱ·ÃÏÉÓò  Ëæ»ú½á¹û fdEventIDList=%s, visitCnt=%s' % (fdEventIDList, visitCnt))  | 
|     #֪ͨ  | 
|     NotifyVisitFairyDomainInfo(curPlayer, fdEventIDList)  | 
|     NotifyFairyAdventuresInfo(curPlayer)  | 
|   | 
|     PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_FairyDomain, 1)  | 
|     PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FairyDomain, 1)  | 
|     PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_FairyDomain, 1)  | 
|     PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FairyDomain, 1)  | 
|     PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FairyDomain, 1)  | 
|     return  | 
|   | 
|   | 
| def EndFairyDomain(curPlayer):  | 
|     GameWorld.DebugLog("EndFairyDomain", curPlayer.GetID())  | 
|     ##½áÊøÑ°·Ã  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 0)  | 
|     maxEventCnt = GetMaxEventCnt()  #×î´ó¿É³öÏÖʼþ¸öÊý  | 
|     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  | 
|   | 
|   | 
| def __RandomFDEventByType(curPlayer, eventType, cnt):  | 
|     ##¸ù¾ÝʼþÀàÐÍËæ»úʼþ  | 
|     ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomain', {'EventType':eventType}, True)  | 
|     if not ipyDataList:  | 
|         return []  | 
|     randomRateList = []  | 
|     rate = 0  | 
|     curAlchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)  | 
|     curLV = curPlayer.GetLV()  | 
|     for ipyData in ipyDataList:  | 
|         needAlchemyLV = ipyData.GetNeedAlchemyLV()  | 
|         if curAlchemyLV < needAlchemyLV - 1:  | 
|             #µ¤Â¯µÈ¼¶²»×ã  | 
|             continue  | 
|         lvLimit = ipyData.GetNeedLV()  | 
|         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())  | 
|         return []  | 
|     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):  | 
|     ## ÉèÖÃçÎç¿Ê¼þ״̬£¬ return ÊÇ·ñ³É¹¦  | 
|     if state not in [FDEventState_Visiting, FDEventState_Visited]:  # 1-δ°Ý·Ã  2-°Ý·ÃÖР3-ÒѰݷà  | 
|         GameWorld.Log('çÎç¿ÏÉÓòʼþ״̬ÉèÖôíÎó£¬state=%s' % state)  | 
|         return  | 
|     curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventState % fdeventID)  | 
|     if not curState:  | 
|         #ûÓиÃʼþ  | 
|         return  | 
|     if curState == state:  | 
|         return True  | 
|     ipyData = IpyGameDataPY.GetIpyGameData('FairyDomain', fdeventID)  | 
|     if not ipyData:  | 
|         return  | 
|     if state == FDEventState_Visiting:  | 
|         if curState != FDEventState_CanVisit:  | 
|             GameWorld.DebugLog('çÎç¿ÏÉÓòʼþ״̬ÉèÖôíÎó£¬fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState))  | 
|             return  | 
|           | 
|         costEnergy = ipyData.GetCostEnergy()  | 
|         curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEnergy)  | 
|         if curEnergy < costEnergy:  | 
|             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, ipyData.GetEventType())  | 
|         PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FairyDomain, 1)  | 
|           | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdeventID, state)  | 
|     NotifyVisitFairyDomainInfo(curPlayer, [fdeventID], 0)  | 
|     return True  | 
|   | 
|   | 
| def NotifyVisitFairyDomainInfo(curPlayer, fdEventList=None, isAll=1):  | 
|     if not fdEventList:  | 
|         syncFDEventList = []  | 
|         maxEventCnt = GetMaxEventCnt()  #×î´ó¿É³öÏÖʼþ¸öÊý  | 
|         for i in xrange(maxEventCnt):  | 
|             fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i)  | 
|             if 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 syncFDEventList:  | 
|         fdeventData = ChPyNetSendPack.tagMCFairyDomainEvent()  | 
|         fdeventData.EventID = fdeventID  | 
|         fdeventData.EventState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventState % fdeventID)  | 
|         packData.InfoList.append(fdeventData)  | 
|     packData.Count = len(packData.InfoList)  | 
|     NetPackCommon.SendFakePack(curPlayer, packData)  | 
|     return  | 
|   | 
| def GetMaxEventCnt():  | 
|     # ×î´ó¿É³öÏÖʼþ¸öÊý  | 
|     otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2)  | 
|     maxEventCnt = max([info[1] for info in otherCntRateList]) + len(IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 1, {}))  | 
|     return maxEventCnt  | 
|   | 
| ###=========================ÆæÓö===============================  | 
| def NotifyFairyAdventuresInfo(curPlayer):  | 
|     ##Í¨ÖªÆæÓöÐÅÏ¢  | 
|     visitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)  | 
|   | 
|     packData = ChPyNetSendPack.tagMCFairyAdventuresInfo()  | 
|     packData.InfoList = []  | 
|     maxEventCnt = GetMaxEventCnt()  #×î´ó¿É³öÏÖʼþ¸öÊý  | 
|     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  | 
|         ipyData = IpyGameDataPY.GetIpyGameDataNotLog('FairyAdventures', adventuresdata / 100)  | 
|         if not ipyData:  | 
|             continue  | 
|         conditionList = ipyData.GetCondition()  | 
|         index = adventuresdata % 100  | 
|         if IpyGameDataPY.GetIpyGameDataByCondition('FairyDomainAppoint', {'Cnt':visitCnt, 'EventID':fdEventID}, False, False):  | 
|             condition = 0  #¶¨ÖƵÄÌõ¼þΪ0  | 
|         else:  | 
|             condition = conditionList[index] if index < len(conditionList) else 0  | 
|         adventuresdata = ChPyNetSendPack.tagMCFairyAdventuresData()  | 
|         adventuresdata.Gear = index + 1  | 
|         adventuresdata.Condition = condition  | 
|         adventuresdata.EventID = fdEventID  | 
|         packData.InfoList.append(adventuresdata)  | 
|     if not packData.InfoList:  | 
|         return  | 
|     packData.Cnt = len(packData.InfoList)  | 
|     NetPackCommon.SendFakePack(curPlayer, packData)  | 
|     return  | 
|   | 
|   | 
| def GetFairyAdventuresAward(curPlayer, fdeventID, state):  | 
|     ##ÆæÓöÁìÈ¡½±Àø  | 
|     state = GameWorld.ToIntDef(state, 0)  | 
|     isSweep, state = state / 10, state % 10  | 
|     if state == FDEventState_Visiting:  | 
|         SetFairyDomainEventState(curPlayer, fdeventID, state)  | 
|     elif state == FDEventState_Visited:  | 
|         SetFairyDomainEventState(curPlayer, fdeventID, state)  | 
|         #¸ø½±Àø  | 
|         adventuresdata = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyAdventuresData % fdeventID)  | 
|         ipyData = IpyGameDataPY.GetIpyGameDataNotLog('FairyAdventures', adventuresdata / 100)  | 
|         if not ipyData:  | 
|             return  | 
|         conditionList = ipyData.GetCondition()  | 
|         index = adventuresdata % 100  | 
|         condition = conditionList[index] if index < len(conditionList) else 0  | 
|         if fdeventID != ipyData.GetEventID():  | 
|             GameWorld.Log('ÆæÓöÁìÈ¡½±Àø Ê¼þID´íÎó£¡')  | 
|             return  | 
|         giveItemList = GetFairyAppointAward(curPlayer, fdeventID)  | 
|         if not giveItemList:  | 
|             #1-µÈ¼¶ÆæÓö 2-¾³½çÆæÓö 3-Õ½Á¦ÆæÓö 4-ÆøÔËÆæÓö  | 
|             if fdeventID == AdventuresType1:  | 
|                 curData = curPlayer.GetLV()  | 
|             elif fdeventID == AdventuresType2:  | 
|                 curData = curPlayer.GetOfficialRank()  | 
|             elif fdeventID == AdventuresType3:  | 
|                 curData = PlayerControl.GetFightPower(curPlayer)  | 
|             elif fdeventID == AdventuresType4:  | 
|                 curData = curPlayer.GetLuckValue()  | 
|             else:  | 
|                 return  | 
|             if curData >= condition:  | 
|                 gearAwardList = ipyData.GetGearAward()  | 
|                 if not gearAwardList:  | 
|                     return  | 
|                 giveItemList = []  | 
|                 itemRandomList = gearAwardList[index] if index < len(gearAwardList) else gearAwardList[-1]  | 
|                 for itemRateList in itemRandomList:  | 
|                     itemRateList = ItemCommon.GetWeightItemListByAlchemyDiffLV(curPlayer, itemRateList, 0)  | 
|                     giveItemList.append(GameWorld.GetResultByWeightList(itemRateList))  | 
|             else:  | 
|                 giveItemList = [ipyData.GetBasicAward()]  | 
|         msgDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}  | 
|         if isSweep:  | 
|             ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList)  | 
|             msgDict.update({FBCommon.Over_dataMapID:ChConfig.Def_FBMapID_FairyTreasure,   | 
|                             FBCommon.Over_isPass:1, FBCommon.Over_isSweep:1})  | 
|         else:  | 
|             NPCCommon.DoGiveItemByVirtualDrop(curPlayer, giveItemList, 0)  | 
|         FBCommon.Notify_FB_Over(curPlayer, msgDict)  | 
|         GameWorld.DebugLog('çÎç¿ÆæÓöÁì½± msgDict=%s, fdeventID=%s, isSweep=%s' % (msgDict, fdeventID, isSweep))  | 
|     return  | 
|   | 
|   | 
| def GetFairyAppointAward(curPlayer, fdEventID):  | 
|     ##»ñȡʼþ¶¨Öƽ±Àø, Ã»ÓеĸøÕý³£½±Àø  | 
|     visitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)  | 
|     ipyData = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomainAppoint', {'Cnt':visitCnt, 'EventID':fdEventID}, False, False)  | 
|     if not ipyData:  | 
|         return  | 
|     job = curPlayer.GetJob()  | 
|     itemList = []  | 
|     for itemInfo in ipyData.GetAward():  | 
|         if type(itemInfo[0]) == dict:  | 
|             if job not in itemInfo[0]:  | 
|                 continue  | 
|             itemList.append([itemInfo[0][job], itemInfo[1], itemInfo[2]])  | 
|         else:  | 
|             itemList.append(itemInfo)  | 
|       | 
|     for itemRateList in ipyData.GetRandomAward():  | 
|         itemRateList = ItemCommon.GetWeightItemListByAlchemyDiffLV(curPlayer, itemRateList, 1)  | 
|         giveItem = GameWorld.GetResultByWeightList(itemRateList)  | 
|         if not giveItem:  | 
|             continue  | 
|         itemList.append(giveItem)  | 
|     return itemList  |