| | |
| | | import NPCCommon
|
| | | import PlayerControl
|
| | | import ChConfig
|
| | | import FBCommon
|
| | |
|
| | | FBDict_SyncFBNPC = 'SyncFBNPC' #是否需要同步副本NPC
|
| | |
|
| | | def DoResetCrossGrassland(curPlayer, eventType, fdeventID):
|
| | | ## 草园重置
|
| | |
| | | if eventType == PlayerFairyDomain.FDEventType_GrasslandXian:
|
| | | npcID = IpyGameDataPY.GetFuncCfg("CrossGrasslandCfg", 1)
|
| | | if npcID:
|
| | | NPCCommon.UpdateNPCAttackCount(curPlayer, [npcID], 0)
|
| | | |
| | | NPCCommon.UpdateNPCAttackCount(curPlayer, npcID, 0)
|
| | | |
| | | ResetGrasslandAwardRecord(curPlayer) |
| | | return
|
| | | |
| | | def __SetGrasslandVisitState(curPlayer, mapID, lineID, state):
|
| | | ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID})
|
| | | if not ipyData:
|
| | | return False
|
| | | eventID = ipyData.GetID()
|
| | | if not PlayerFairyDomain.SetFairyDomainEventState(curPlayer, eventID, state):
|
| | | return False
|
| | | return True
|
| | |
|
| | | ## 是否需要做进入副本通用检查条件逻辑,默认需要检查
|
| | | def OnNeedCheckCanEnterFBComm(curPlayer, mapID, lineID):
|
| | | curState = PlayerFairyDomain.GetFairyDomainFBEventState(curPlayer, mapID, lineID)
|
| | | return curState != PlayerFairyDomain.FDEventState_Visiting
|
| | |
|
| | | def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
|
| | | if not __SetGrasslandVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting):
|
| | | return False
|
| | | return True
|
| | | curState = PlayerFairyDomain.GetFairyDomainFBEventState(curPlayer, mapID, lineID)
|
| | | return curState in [PlayerFairyDomain.FDEventState_CanVisit, PlayerFairyDomain.FDEventState_Visiting]
|
| | |
|
| | | ## 进入跨服副本注册数据前逻辑
|
| | | ## @return: 是否可以注册前往跨服副本,次函数中可以写一些扣除消耗逻辑等
|
| | | def OnRegEnterCrossFB(curPlayer, mapID, lineID):
|
| | | curState = PlayerFairyDomain.GetFairyDomainFBEventState(curPlayer, mapID, lineID)
|
| | | if curState == PlayerFairyDomain.FDEventState_CanVisit:
|
| | | delResult = FBCommon.DelFBEnterTicket(curPlayer, mapID, lineID)
|
| | | isOK = delResult[0]
|
| | | if not isOK:
|
| | | return False
|
| | | return PlayerFairyDomain.SetFairyDomainFBEventState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting)
|
| | | |
| | | if curState == PlayerFairyDomain.FDEventState_Visiting:
|
| | | return True
|
| | | |
| | | return False
|
| | |
|
| | | ## 跨服功能线路数据缓存,下次开启同样功能线路时会用该数据进行还原之前的副本状态
|
| | | def OnGetCrossFuncLineDataCache():
|
| | | refreshNPCInfo = NPCCustomRefresh.GetCopyMapRandomRefreshNPCInfo()
|
| | | return refreshNPCInfo
|
| | |
|
| | | ## 开启副本
|
| | | def OnOpenFB(tick):
|
| | |
| | | realMapID, copyMapID = gameWorld.GetRealMapID(), gameWorld.GetCopyMapID()
|
| | | key = (realMapID, copyMapID)
|
| | | if key in PyGameData.g_crossFuncLineDataCache:
|
| | | refreshNPCInfo = PyGameData.g_crossFuncLineDataCache[key]
|
| | | refreshNPCInfo = PyGameData.g_crossFuncLineDataCache.pop(key)
|
| | | GameWorld.DebugLog("副本开启根据保存的虚拟线路标试点刷怪信息刷怪: realMapID=%s,copyMapID=%s,refreshNPCInfo=%s" % (realMapID, copyMapID, refreshNPCInfo))
|
| | | NPCCustomRefresh.OnFBOpenSetRandomRefreshNPCInfo(refreshNPCInfo, tick)
|
| | |
|
| | | return
|
| | |
|
| | | def GetCurFBFuncLineID():
|
| | | ## 获取本线路功能线路ID
|
| | | return GameWorld.GetGameWorld().GetPropertyID() % 10000 / 10
|
| | |
|
| | | def GetCurFBLineZoneID():
|
| | | ## 获取本线路所属跨服分区
|
| | | return GameWorld.GetGameWorld().GetPropertyID() / 10000
|
| | |
|
| | | ## 进副本
|
| | | def DoEnterFB(curPlayer, tick):
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | zoneID = GetCurFBLineZoneID()
|
| | | funcLineID = GetCurFBFuncLineID()
|
| | | GameWorld.Log("DoEnterFB zoneID=%s,funcLineID=%s" % (zoneID, funcLineID), playerID)
|
| | | zoneID = FBCommon.GetCrossDynamicLineMapZoneID()
|
| | | funcLineID = FBCommon.GetCrossDynamicLineMapFuncLineID()
|
| | | 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
|
| | |
|
| | | ## 副本总逻辑计时器
|
| | | def OnProcess(tick):
|
| | | return
|
| | |
|
| | | ## 关闭副本
|
| | | def OnCloseFB(tick):
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | refreshNPCInfo = NPCCustomRefresh.GetCopyMapRandomRefreshNPCInfo()
|
| | | if refreshNPCInfo:
|
| | | realMapID, copyMapID = gameWorld.GetRealMapID(), gameWorld.GetCopyMapID()
|
| | | key = (realMapID, copyMapID)
|
| | | PyGameData.g_crossFuncLineDataCache[key] = refreshNPCInfo
|
| | | GameWorld.DebugLog("缓存虚拟线路标试点刷怪信息: realMapID=%s,copyMapID=%s,refreshNPCInfo=%s" % (realMapID, copyMapID, refreshNPCInfo))
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | if gameFB.GetGameFBDictByKey(FBDict_SyncFBNPC):
|
| | | gameFB.SetGameFBDict(FBDict_SyncFBNPC, 0)
|
| | | FBCommon.Sync_FBNPC()
|
| | |
|
| | | GameWorld.GetGameWorld().SetPropertyID(0)
|
| | | return
|
| | |
|
| | | ## 玩家退出副本
|
| | | def DoExitFB(curPlayer, tick):
|
| | | return
|
| | | #
|
| | | ### 关闭副本
|
| | | #def OnCloseFB(tick):
|
| | | # return
|
| | | #
|
| | | ### 玩家退出副本
|
| | | #def DoExitFB(curPlayer, tick):
|
| | | # return
|
| | |
|
| | | ##玩家主动离开副本.
|
| | | def DoPlayerLeaveFB(curPlayer, tick):
|
| | |
| | |
|
| | | ## 客户端进入自定义场景
|
| | | def OnEnterCustomScene(curPlayer, mapID, lineID):
|
| | | __SetGrasslandVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting)
|
| | | 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
|
| | |
| | | GameWorld.DebugLog("草园宝箱怪攻击次数未用完! boxNPCID=%s,attackCount=%s < maxAttackCount=%s" % (boxNPCID, attackCount, maxAttackCount))
|
| | | return
|
| | |
|
| | | __SetGrasslandVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visited)
|
| | | 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])
|
| | | overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList)}
|
| | | FBCommon.NotifyFBOver(curPlayer, mapID, lineID, 1, overDict)
|
| | | ResetGrasslandAwardRecord(curPlayer)
|
| | | return
|
| | |
|
| | | def DoFB_NPCDead(curNPC):
|
| | | #GameWorld.DebugLog("DoFB_NPCDead 设置需要同步副本NPC!")
|
| | | GameWorld.GetGameFB().SetGameFBDict(FBDict_SyncFBNPC, 1)
|
| | | return
|
| | |
|
| | | def OnNPCRebornInFB(curNPC):
|
| | | #GameWorld.DebugLog("OnNPCRebornInFB 设置需要同步副本NPC!")
|
| | | GameWorld.GetGameFB().SetGameFBDict(FBDict_SyncFBNPC, 1)
|
| | | return
|
| | |
|
| | |
|
| | |
|
| | |
|