| | |
| | | import ChConfig
|
| | | import FBCommon
|
| | |
|
| | | FBDict_SyncFBNPC = 'SyncFBNPC' #是否需要同步副本NPC
|
| | |
|
| | | def DoResetCrossGrassland(curPlayer, eventType, fdeventID):
|
| | | ## 草园重置
|
| | |
|
| | |
| | | npcID = IpyGameDataPY.GetFuncCfg("CrossGrasslandCfg", 1)
|
| | | if npcID:
|
| | | NPCCommon.UpdateNPCAttackCount(curPlayer, npcID, 0)
|
| | | |
| | | |
| | | ResetGrasslandAwardRecord(curPlayer) |
| | | return
|
| | |
|
| | | ## 是否需要做进入副本通用检查条件逻辑,默认需要检查
|
| | |
| | |
|
| | | 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 OnProcess(tick):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | if gameFB.GetGameFBDictByKey(FBDict_SyncFBNPC):
|
| | | gameFB.SetGameFBDict(FBDict_SyncFBNPC, 0)
|
| | | FBCommon.Sync_FBNPC()
|
| | | |
| | | return
|
| | | #
|
| | | ### 关闭副本
|
| | | #def OnCloseFB(tick):
|
| | |
| | |
|
| | | ## 客户端进入自定义场景
|
| | | 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
|
| | |
| | | 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])
|
| | | 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
|
| | |
|
| | |
|
| | |
|
| | |
|