ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
@@ -37,7 +37,6 @@
import QuestCommon
import SkillShell
import GameLogInfo
import PlayerReincarnation
import PlayerMissionCollect
import PlayerFamily
import ShareDefine
@@ -49,22 +48,20 @@
import ChEquip
import PlayerActivity
import PlayerSuccess
import EventReport
#import PlayerCostVIP
import GameFuncComm
import IpyGameDataPY
import ShopItemManage
import PlayerPet
import PlayerArrestTask
import PlayerMagicWeapon
import PlayerBossReborn
import PlayerFairyCeremony
import PlayerNewFairyCeremony
import Operate_EquipStone
import PlayerWeekParty
import PlayerFairyDomain
import PlayerActLogin
import PlayerHorse
import FBCommon
import PyGameData
import NPCCommon
import math
import time
@@ -1419,15 +1416,17 @@
def DoType_Add_Player_Xp(curPlayer, curMission, curActionNode):
    #增加玩家相关值<Add_Player_XP value="玩家xp值"/>
    
    xpValue = curActionNode.GetAttribute("value")
    if xpValue != "":
        #设置玩家xp值
        openLV, addXPValue, maxXPValue = ReadChConfig.GetEvalChConfig('PlayerXP')
        curXp = min(int(xpValue), maxXPValue)
        curPlayer.SetDict(ChConfig.Def_PlayerKey_RecordXPValue, curXp)
        curPlayer.SetXP(curXp)
    #===========================================================================
    # xpValue = curActionNode.GetAttribute("value")
    #
    # if xpValue != "":
    #    #设置玩家xp值
    #    openLV, addXPValue, maxXPValue = ReadChConfig.GetEvalChConfig('PlayerXP')
    #    curXp = min(int(xpValue), maxXPValue)
    #    curPlayer.SetDict(ChConfig.Def_PlayerKey_RecordXPValue, curXp)
    #    curPlayer.SetXP(curXp)
    #
    #===========================================================================
    return
#---------------------------------------------------------------------
@@ -2573,6 +2572,18 @@
    maxPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV) # 历史最大过关数
    return QuestRunnerValue.GetEval(conditionType, maxPassLV, conditionValue)
##通关诛仙塔第X层
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curConditionNode 节点信息
# @return 返回值, 是否判断成功
# @remarks <Check_Zhuxiantower type="类型" value="值"/>
def ConditionType_Check_Zhuxiantower(curPlayer, curMission, curConditionNode):
    conditionValue = GameWorld.ToIntDef(curConditionNode.GetAttribute("value"), 0)
    conditionType = curConditionNode.GetAttribute("type")
    maxPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerPassLV) # 历史最大过关数
    return QuestRunnerValue.GetEval(conditionType, maxPassLV, conditionValue)
def ConditionType_Get_Player_Coin(curPlayer, curMission, curConditionNode):
    # 判断玩家已充值点券数
    # <Get_Player_Coin type="great" value="0"/> 充值点券大于0代表已经首充过
@@ -2592,42 +2603,6 @@
            return False
        return petPack.GetCount() > 0
    return PlayerPet.GetPetDataItemByNPCID(curPlayer, checkPetID) != None
def ConditionType_Is_Buy_Tehuiitem(curPlayer, curMission, curConditionNode):
    # 判断是否购买过特惠商店物品
    # <Is_Buy_Tehuiitem shopID="1007" itemShopIndex="0,1,2"/> shopID暂定需指定商店ID, itemShopIndex可指定多个索引, 中间英文逗号隔开
    shopID = GameWorld.ToIntDef(curConditionNode.GetAttribute("shopID"), 0)
    if not shopID:
        return False
    indexList = []
    indexInfo = curConditionNode.GetAttribute("itemShopIndex")
    if indexInfo != '':
        indexList = eval('[' + indexInfo + ']')
    if not indexList:
        shopItemList = ShopItemManage.GetShopItemList(shopID)
        indexList = range(len(shopItemList))
    if not indexList:
        GameWorld.DebugLog("需指定判断的特惠商店物品索引编号!indexInfo=%s" % indexInfo)
        return False
    for i in indexList:
        buyCnt = ShopItemManage.__GetPlayerShopItemBuyCnt(curPlayer, shopID, i)
        if buyCnt > 0:
            return True
    return False
##竞技场是否达到多少名
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curConditionNode 节点信息
# @return 返回值, 是否判断成功
# @remarks <Check_Jjcorder type="类型" value="值"/>
def ConditionType_Check_Jjcorder(curPlayer, curMission, curConditionNode):
    conditionValue = GameWorld.ToIntDef(curConditionNode.GetAttribute("value"), 0)
    conditionType = curConditionNode.GetAttribute("type")
    maxOrder = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HighLadder_HistoryMaxOrder, 0,
                    ChConfig.Def_PDictType_Default)
    return QuestRunnerValue.GetEval(conditionType, maxOrder, conditionValue)
#---------------------------------------------------------------------
##执行 扣除玩家镖车押金
@@ -3826,7 +3801,7 @@
# @param curActionNode节点信息
# @return 返回值无意义
# @remarks  <Drop_Item id="物品ID" count="物品数量" starLV="星级" bind="是否绑定" isAuctionItem="是否拍品"
#         suite="是否套装化" addAttrLV="追加等级",isLucky="是否有幸运"
#         suite="是否套装化" addAttrLV="追加等级",isLucky="是否有幸运" isFakeDrop="是否假掉落"
#        skillBoostEff="[技能效果增强索引, 值]", holeCount="孔数", isGreat="1", effIndex="1" , dropDist="掉落范围默认3"
#        aroundPlayer="1" baseAttrRate="可强化的装备基础属性随机加强比例默认10000" greatAttr="[卓越属性列表]" />  
def DoType_Drop_Item(curPlayer, curMission, curActionNode):
@@ -3878,7 +3853,14 @@
    if not curItem:
        GameWorld.Log('###创建地上物品异常,无此ID物品 = %s' % (curItemID))
        return
    isFakeDrop = GameWorld.ToIntDef(curActionNode.GetAttribute("isFakeDrop"), 0)
    if isFakeDrop:#假掉落表现
        dropItemDataStr = ChItem.GetMapDropItemDataStr(curItem)
        #通知客户端
        NPCCommon.SendVirtualItemDrop(curPlayer, curItemID, 0, 0, dropItemDataStr)
        ItemControler.GivePlayerItemOrMail(curPlayer, [[curItemID, count, isAuctionItem]])
        curItem.Clear()
        return
    if curActionNode.GetAttribute("aroundPlayer") == "1" or not curNPC:
        posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY()
    else:
@@ -4368,61 +4350,8 @@
    curPlayer.SetFreePoint(curPlayerFreePoint + value)
    
    DataRecordPack.DR_Freepoint(curPlayer, "Event", value, {"MissionID":curMission.GetMissionID()})
    return
#---------------------------------------------------------------------
#===============================================================================
# PlayerJob_Warrior,  #  剑士,
# PlayerJob_Wizard,   #  魔法师,
# PlayerJob_Assassin, #  弓箭手,
# PlayerJob_Chaplain, #  魔剑士,
# PlayerJob_Knight,   # 骑士
# PlayerJob_ForceUser,# 魔导师
# PlayerJob_BowMaster,# 圣射手
#===============================================================================
##玩家转职业
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curActionNode节点信息
# @return 返回值无意义 <Change_Job checkLV="150" changeJob="4">
def DoType_Change_Job(curPlayer, curMission, curActionNode):
    playerID = curPlayer.GetID()
    checkLV = GameWorld.ToIntDef(curActionNode.GetAttribute("checkLV"), 0)
    if not checkLV:
        GameWorld.Log("change job error! checkLV=%s" % checkLV, playerID)
        return
    curLV = curPlayer.GetLV()
    if curLV < checkLV:
        GameWorld.Log("change job error! checkLV=%s curlv=%s" % (checkLV, curLV), playerID)
        return
    changeJob = GameWorld.ToIntDef(curActionNode.GetAttribute("changeJob"), 0)
    #验证职业
    if not changeJob:
        GameWorld.Log("change job error! changeJob=%s" % changeJob, playerID)
        return
    #curJob = curPlayer.GetJob()
    #计算点数, 恢复等级差的点数
    #addPointDict = ReadChConfig.GetEvalChConfig('lvUp_Point')
    #addPoint = (curLV - checkLV)*(addPointDict.get(changeJob) - addPointDict.get(curJob))
    #设置玩家可加属性点
    #curPlayer.SetFreePoint(curPlayer.GetFreePoint() + addPoint)
    #DataRecordPack.DR_Freepoint(curPlayer, "ChangeJob", addPoint, {"job":changeJob})
    #设置职业
    curPlayer.SetJob(changeJob)
    playerControl = PlayerControl.PlayerControl(curPlayer)
    playerControl.RefreshAllState()
    PlayerReincarnation.DoPlayerReincarnation(curPlayer)
    return True
#---------------------------------------------------------------------
##删除物品
@@ -5254,6 +5183,8 @@
        PlayerFamily.AddFamilyActivity(curPlayer, ShareDefine.FamilyActive_Task, addCnt)
    else:
        GameWorld.Log('    跑环完成触发活跃度异常 missionType=%s'%missionType, curPlayer.GetPlayerID())
        return
    EventShell.EventRespons_AroundMission(curPlayer, missionType)
    return
@@ -5296,66 +5227,6 @@
    for lvInfo in runAroundReward.Rewards:
        if curRewardLV >= lvInfo[0] and curRewardLV <= lvInfo[1]:
            return runAroundReward.Rewards[lvInfo]
    return
##转生后跑环奖励处理
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @return 返回值无意义
# @remarks 转生后跑环奖励处理
def __ReinAddRunAroundReward(curPlayer, curMission):
    runAroundReward = FindQuestFunc(curMission.GetMissionID()).RunAroundReward
    lvReward = GetRunAroundReward(curPlayer, runAroundReward, rewardLV=0, isMaxLV=True)
    if not lvReward:
        GameWorld.Log("转生跑环奖励错误 id = %d" % curMission.GetMissionID() , curPlayer.GetPlayerID())
        return
    #金钱奖励最大等级
    if lvReward.Money != 0:
        curMission.SetProperty(Def_Run_Around_Reward_Money, lvReward.Money)
#---------------------------------------------------------------------
##转生后每日任务新增奖励
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curActionNode节点信息
# @return 返回值无意义
# @remarks <Reincarnation_Add_Reward />
def DoType_Reincarnation_Add_Reward(curPlayer, curMission, curActionNode):
    #没转生不处理
    curReinLV = curPlayer.GetReincarnationLv()
    if curReinLV < 1:
        return
    dayEventReward = FindQuestFunc(curMission.GetMissionID()).DayEventReward
    if dayEventReward == None:
        GameWorld.Log("转生奖励错误 id = %d" % curMission.GetMissionID() , curPlayer.GetPlayerID())
        return
    curRewardLV = dayEventReward.MaxLV
    familyLV = curPlayer.GetFamilyLV()
    #当前等级任务奖励结构体
    curLVDayEventReward = dayEventReward.Rewards[curRewardLV]
    #金钱奖励最大等级
    if curLVDayEventReward.Money != 0:
        curMission.SetProperty(Def_Day_Event_Reward_Money, curLVDayEventReward.Money)
    #家族活跃最大等级
    if curLVDayEventReward.PlayerFamilyActiveValue != 0:
        curMission.SetProperty(Def_Day_Event_Reward_Player_Family_ActiveValue, (curLVDayEventReward.PlayerFamilyActiveValue) * familyLV)
    #镖车压金最大等级
    if curLVDayEventReward.TruckMoney != 0:
        curMission.SetProperty(Def_Day_Event_Reward_Truck_Money, curLVDayEventReward.TruckMoney)
    #转生后跑环奖励处理
    __ReinAddRunAroundReward(curPlayer, curMission)
    
    return
@@ -5413,7 +5284,6 @@
        randStarList = eval(ReadChConfig.GetChConfig('RunAround_Star'))
        aroundStar = GameWorld.GetResultByRandomList(randStarList, 1)
        
        #vipStar = PlayerCostVIP.GetRoundStar(curPlayer)
        vipStar = 0
        if vipStar > 0:
            aroundStar = vipStar
@@ -6097,6 +5967,34 @@
    curMission.SetProperty(key, PlayerHorse.GetHorseSumLV(curPlayer))
    return
##设置某阶达到强化等级的件数
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curActionNode节点信息
# @return 返回值无意义
# @remarks <Set_Pluslvpartcnt key="" id="" classLV="" plusLV=""/>
def DoType_Set_Pluslvpartcnt(curPlayer, curMission, curActionNode):
    key = curActionNode.GetAttribute("key")
    questID = GameWorld.ToIntDef(curActionNode.GetAttribute("id"), 0)
    if questID != 0:
        curMission = curPlayer.FindMission(questID)
    classLV = GameWorld.ToIntDef(curActionNode.GetAttribute("classLV"), 0)
    if not classLV:
        return
    needPlusLV = GameWorld.ToIntDef(curActionNode.GetAttribute("plusLV"), 0)
    totalCnt = 0
    equipPlaceList = ChConfig.Pack_EquipPart_CanPlusStar[IPY_GameWorld.rptEquip]
    for equipPlace in equipPlaceList:
        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
        if not ipyData:
            continue
        partStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, IPY_GameWorld.rptEquip, ipyData.GetGridIndex())
        if partStarLV >= needPlusLV:
            totalCnt += 1
    curMission.SetProperty(key, totalCnt)
    return
##设置强化总等级
# @param curPlayer 玩家实例
# @param curMission 任务实例
@@ -6497,6 +6395,18 @@
    conditionValue = GameWorld.ToIntDef(curConditionNode.GetAttribute("value"), 0)
    return PlayerMagicWeapon.GetIsActiveMagicWeapon(curPlayer, mwid, conditionValue)
##判断魔族法宝通关关卡
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curConditionNode节点信息
# @return 返回值, 是否通过检查
# @remarks  <Check_Magicweapon_Passfblv" mwid="法宝ID" value="期望值" />
def ConditionType_Check_Magicweapon_Passfblv(curPlayer, curMission, curConditionNode):
    mwid = GameWorld.ToIntDef(curConditionNode.GetAttribute("mwid"), 0)
    conditionValue = GameWorld.ToIntDef(curConditionNode.GetAttribute("value"), 0)
    fbpasslv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWFBPassLevel % mwid)
    return fbpasslv >= conditionValue
#---------------------------------------------------------------------
##是否拥有足够的竞技点
# @param curPlayer 玩家实例
@@ -6629,52 +6539,6 @@
    __NPCAllowResetWorldPos(curPlayer, mapID, bornX, bornY, False)
    
    return
#---------------------------------------------------------------------
##执行玩家转生
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curActionNode节点信息
# @return 返回值无意义
# @remarks  <Player_Reincarnation />
def DoType_Player_Reincarnation(curPlayer, curMission, curActionNode):
    PlayerReincarnation.DoPlayerReincarnation(curPlayer)
    return
#---------------------------------------------------------------------
##判断玩家是否转生
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curConditionNode节点信息
# @return 返回值, 是否通过检查
# @remarks  <Player_Is_Reincarnation result="期望的结果" />
def ConditionType_Player_Is_Reincarnation(curPlayer, curMission, curConditionNode):
    #<Player_Is_Reincarnation result="">  0:没转,1:有转
    result = GameWorld.ToIntDef(curConditionNode.GetAttribute("result"), 0)
    #转生等级
    curReinLV = curPlayer.GetReincarnationLv()
    if curReinLV > 0:
        return True == result
    else:
        return False == result
    return
##判断玩家转生数
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curConditionNode节点信息
# @return 返回值, 是否通过检查
# @remarks  <Player_Reincarnation result="期望的结果" />
def ConditionType_Player_Reincarnation(curPlayer, curMission, curConditionNode):
    #<Player_Reincarnation result="1"> # 玩家是否1转
    result = GameWorld.ToIntDef(curConditionNode.GetAttribute("result"), 0)
    #转生等级
    curReinLV = curPlayer.GetReincarnationLv()
    return curReinLV == result
#---------------------------------------------------------------------
##给予玩家技能
@@ -7211,12 +7075,6 @@
    realmlv = GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
    return curPlayer.GetOfficialRank() >= realmlv
##法宝之魂是否激活
# @param None
# @return None <Mwsoul value="id"/>
def ConditionType_Mwsoul(curPlayer, curMission, curActionNode):
    soulID = GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
    return bool(PlayerMagicWeapon.GetIsActiveMWSoul(curPlayer, soulID))
##X级通关X层娲皇遗迹
# @param None
@@ -7234,7 +7092,76 @@
    totallv = GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
    return PlayerHorse.GetHorseSumLV(curPlayer) >= totallv
##已选择的专精技能数量是否达到
# @param None
# @return None <Elementskillcnt value="cnt"/>
def ConditionType_Elementskillcnt(curPlayer, curMission, curActionNode):
    cnt = GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
    return SkillShell.GetElementSkillCnt(curPlayer) >= cnt
##设置已选择的专精技能数量
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curActionNode节点信息
# @return 返回值无意义
# @remarks <Set_Elementskillcnt key="" />
def DoType_Set_Elementskillcnt(curPlayer, curMission, curActionNode):
    key = curActionNode.GetAttribute("key")
    questID = GameWorld.ToIntDef(curActionNode.GetAttribute("id"), 0)
    if questID != 0:
        curMission = curPlayer.FindMission(questID)
    curMission.SetProperty(key, SkillShell.GetElementSkillCnt(curPlayer))
    return
##设置符合条件的已穿基础装备数量
# @param curPlayer 玩家实例
# @param curMission 任务实例
# @param curActionNode节点信息
# @return 返回值无意义
# @remarks <Set_Baseequipcnt key="" classlv="" color="" suite="[suiteID,..]"/>
def DoType_Set_Baseequipcnt(curPlayer, curMission, curActionNode):
    classLV = GameWorld.ToIntDef(curActionNode.GetAttribute("classlv"), 0)
    color = GameWorld.ToIntDef(curActionNode.GetAttribute("color"), 0)
    suite = curActionNode.GetAttribute("suite")
    suiteIDList = eval(suite) if suite else []
    haveCnt = __GetBaseequipcnt(curPlayer, classLV, color, suiteIDList)
    key = curActionNode.GetAttribute("key")
    questID = GameWorld.ToIntDef(curActionNode.GetAttribute("id"), 0)
    if questID != 0:
        curMission = curPlayer.FindMission(questID)
    curMission.SetProperty(key, haveCnt)
    return
def __GetBaseequipcnt(curPlayer, classLV, color, suiteIDList):
    haveCnt = 0
    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    for place in ChConfig.EquipPlace_Base:
        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, place)
        if not ipyData:
            break
        gridIndex = ipyData.GetGridIndex()
        curEquip = equipPack.GetAt(gridIndex)
        if not ItemCommon.CheckItemCanUse(curEquip):
            continue
        if curEquip.GetItemColor() < color:
            continue
        if suiteIDList and curEquip.GetSuiteID() not in suiteIDList:
            continue
        haveCnt += 1
    return haveCnt
##判断符合条件的已穿基础装备数量
# @param None
# @return None <Baseequipcnt cnt="cnt" classlv="" color="" suite="[suiteID,..]"/>
def ConditionType_Baseequipcnt(curPlayer, curMission, curActionNode):
    totalcnt = GameWorld.ToIntDef(curActionNode.GetAttribute("cnt"), 0)
    classLV = GameWorld.ToIntDef(curActionNode.GetAttribute("classlv"), 0)
    color = GameWorld.ToIntDef(curActionNode.GetAttribute("color"), 0)
    suite = curActionNode.GetAttribute("suite")
    suiteIDList = eval(suite) if suite else []
    haveCnt = __GetBaseequipcnt(curPlayer, classLV, color, suiteIDList)
    return haveCnt >= totalcnt
##法宝激活个数
# @param None
@@ -7250,12 +7177,46 @@
    totalcnt = GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
    return ChEquip.GetTotalPlusLV(curPlayer, False) >= totalcnt
##判断某阶强化等级达到X的件数是否达到
# @param None
# @return None <Classlvpluslv classLV="" plusLV="" value="cnt"/>
def ConditionType_Classlvpluslv(curPlayer, curMission, curActionNode):
    classLV = GameWorld.ToIntDef(curActionNode.GetAttribute("classLV"), 0)
    if not classLV:
        return
    needPlusLV = GameWorld.ToIntDef(curActionNode.GetAttribute("plusLV"), 0)
    totalCnt = 0
    equipPlaceList = ChConfig.Pack_EquipPart_CanPlusStar[IPY_GameWorld.rptEquip]
    for equipPlace in equipPlaceList:
        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
        if not ipyData:
            continue
        partStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, IPY_GameWorld.rptEquip, ipyData.GetGridIndex())
        if partStarLV >= needPlusLV:
            totalCnt += 1
    return totalCnt >= GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
##装备总星级
# @param None
# @return None <Equiptotalstar value="cnt"/>
def ConditionType_Equiptotalstar(curPlayer, curMission, curActionNode):
    totalcnt = GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
    return #ChEquip.GetTotalEquipStars(curPlayer) >= totalcnt
    return ChEquip.GetTotalEquipStars(curPlayer) >= totalcnt
##装备宝石总等级
# @param None
# @return None <Equiptotalstone value="cnt"/>
def ConditionType_Equiptotalstone(curPlayer, curMission, curActionNode):
    totalcnt = GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
    return Operate_EquipStone.GetTotalStoneLV(curPlayer) >= totalcnt
##技能总等级
# @param None
# @return None <Totalskilllv value="" funcType=""/>
def ConditionType_Totalskilllv(curPlayer, curMission, curActionNode):
    totalcnt = GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
    funcType = GameWorld.ToIntDef(curActionNode.GetAttribute("funcType"), 0)
    return SkillShell.GetAllSkillLV(curPlayer, funcType) >= totalcnt
##激活法宝,确认与成就逻辑后使用
# @param None
@@ -7263,8 +7224,6 @@
def DoType_Active_Magicweapon(curPlayer, curMission, curActionNode):
    mwID = GameWorld.ToIntDef(curActionNode.GetAttribute("id"), 0)
    PlayerMagicWeapon.DoActiveMW(curPlayer, mwID)
    PlayerMagicWeapon.NotifyMagicWeapon(curPlayer)
    return
## 人物隐身 <Visible id="0隐身1现身"/>
@@ -7292,3 +7251,12 @@
    return
def DoType_Setfairydomain(curPlayer, curMission, curActionNode):
    ## 任务开启缥缈仙域 (做标记可寻访) <Setfairydomain/>
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState):
        #若已在寻访中则先结束寻访
        PlayerFairyDomain.EndFairyDomain(curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 2)
    PlayerFairyDomain.NotifyVisitFairyDomainInfo(curPlayer)
    return