| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldLogic.FBProcess.GameLogic_GodArea  | 
| #  | 
| # @todo:¹ÅÉñ½ûµØ  | 
| # @author xdh  | 
| # @date 2017-11-09  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¹ÅÉñ½ûµØ  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2017-11-09 14:30"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import FBCommon  | 
| import GameWorld  | 
| import IpyGameDataPY  | 
| import IPY_GameWorld  | 
| import ChConfig  | 
| import PlayerControl  | 
| import PlayerBossReborn  | 
| import PlayerFairyCeremony  | 
| import PlayerNewFairyCeremony  | 
| import PlayerWeekParty  | 
| import PlayerActLogin  | 
| import EventReport  | 
| import time  | 
|   | 
| Map_FBDict_LastGodAreaCheckTick = 'LastGodAreaCheckTick'  | 
| FBPlayerDict_LeaveTick = 'FBPlayerDict_LeaveTick'  | 
| FBPlayerDict_FullTick = 'FBPlayerDict_FullTick'  | 
| def __AddGodAreaAnger(curPlayer, addCnt):  | 
|     ## Ôö¼ÓÅÆøÖµ  | 
|     anger = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_GodArea_Anger)  | 
|     maxAnger = IpyGameDataPY.GetFuncCfg('AngryAdd', 4)  | 
|     if anger >= maxAnger:  | 
|         return True  | 
|     updAnger = min(maxAnger, addCnt + anger)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GodArea_Anger, updAnger)  | 
|     DoFBHelp(curPlayer, 0)  | 
|     if updAnger >= maxAnger:  | 
|         deadTime = FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_GodArea)[0]  | 
|         curPlayer.Sync_TimeTick(ChConfig.tttDeadTime , 0, deadTime * 1000, True)  | 
|         tick = GameWorld.GetGameWorld().GetTick()  | 
|         GameWorld.GetGameFB().SetPlayerGameFBDict(curPlayer.GetID(), FBPlayerDict_FullTick, tick)  | 
|   | 
|         #FBCommon.SetHadDelTicket(curPlayer, 0)  | 
|     return updAnger >= maxAnger  | 
|   | 
|   | 
|   | 
| def GodAreaOnLogin(curPlayer):  | 
|     ## Íæ¼ÒÔÚ¸±±¾µÇ¼Ðè¼ÆËãÀëÏßʱ¼äÔö¼ÓµÄÅÆøÖµ  | 
|     mapID = GameWorld.GetGameWorld().GetMapID()  | 
|     if mapID != ChConfig.Def_FBMapID_GodArea:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GodArea_Anger, 0)  | 
|         return  | 
|     leaveServerSecond = PlayerControl.GetPlayerLeaveServerSecond(curPlayer) #ÀëÏßʱ¼äÃë  | 
|     addPoint = TimeAddGodAreaAnger(curPlayer, leaveServerSecond)[0]  | 
|     GameWorld.DebugLog("    ¸±±¾ÀïOnLogin, leaveServerSecond=%s, addPoint=%s"%(leaveServerSecond, addPoint))  | 
|     return  | 
|   | 
| def TimeAddGodAreaAnger(curPlayer, second):  | 
|     ## Ê±¼äÔö¼ÓÅÆøÖµ  | 
|       | 
|     perAngerNeedSecond = IpyGameDataPY.GetFuncCfg('AngryAdd')  | 
|     addPoint = second / perAngerNeedSecond  | 
|     isFull = False  | 
|     if addPoint:  | 
|         isFull = __AddGodAreaAnger(curPlayer, addPoint)  | 
|     return addPoint, isFull  | 
|   | 
| def __IsAngerFull(curPlayer):  | 
|     # ÅÆøÖµÊÇ·ñÒÑÂú  | 
|     anger = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_GodArea_Anger)  | 
|     maxAnger = IpyGameDataPY.GetFuncCfg('AngryAdd', 4)  | 
|     return anger >= maxAnger  | 
|   | 
| ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param mapID µØÍ¼ID  | 
| #  @param lineID Ïß·id  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return ²¼¶ûÖµ  | 
| def OnEnterFBEvent(curPlayer, mapID, lineID, tick):  | 
|     return True  | 
|   | 
|   | 
| ##¸±±¾Íæ¼Ò½øÈëµã  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param mapID µØÍ¼ID  | 
| # @param lineId ·ÖÏßID  | 
| # @param ipyEnterPosInfo ¹¦ÄÜÏß·IPYÅäÖÃ×ø±êÐÅÏ¢  | 
| # @param tick Ê±¼ä´Á  | 
| # @return posX, posY, Ëæ»ú°ë¾¶(¿ÉÑ¡)  | 
| def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):  | 
|     return ipyEnterPosInfo  | 
|   | 
| ## ÖØÖø±±¾¸´»îÍæ¼Ò×ø±êµã  | 
| # @param None  | 
| # @return ÎÞÒâÒå  | 
| def OnResetFBRebornPlacePos(curPlayer, rebornPlace, tick):  | 
|     ipyEnterPosInfo = FBCommon.GetFBLineEnterPosInfo(ChConfig.Def_FBMapID_GodArea, 0)  | 
|     posX, posY = ipyEnterPosInfo[:2]  | 
|     curPlayer.ResetPos(posX, posY)  | 
|     return  | 
|   | 
| ## ²éѯµØÍ¼ÊÇ·ñ¿ªÆô  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return ²¼¶ûÖµ  | 
| def OnCanOpen(tick):  | 
|     return True  | 
|   | 
| ##²éѯÊÇ·ñ¿ÉÒÔ½øÈëµØÍ¼  | 
| # @param ask:ÇëÇó½á¹¹Ìå(IPY_BMChangeMapAsk)  | 
| # @param tick:ʱ¼ä´Á  | 
| # @return IPY_GameWorld.cme Ã¶¾Ù  | 
| def OnChangeMapAsk(ask, tick):  | 
|     return IPY_GameWorld.cmeAccept  | 
|   | 
|   | 
| ## ½ø¸±±¾  | 
| #  @param curPlayer  | 
| #  @param tick  | 
| #  @return None  | 
| def DoEnterFB(curPlayer, tick):  | 
|     hadDelTicket = FBCommon.GetHadDelTicket(curPlayer)  | 
|     GameWorld.DebugLog("    ½ø¸±±¾DoEnterFB hadDelTicket=%s"%hadDelTicket)  | 
|     if not hadDelTicket:  | 
|         mapID = GameWorld.GetGameWorld().GetMapID()  | 
|         delResult = FBCommon.DelFBEnterTicket(curPlayer, mapID)  | 
|         isOK = delResult[0]  | 
|         #hasBind = delResult[1]  | 
|         if not isOK:  | 
|             PlayerControl.PlayerLeaveFB(curPlayer)  | 
|             return  | 
|         FBCommon.ClearAreaRewardRecord(curPlayer.GetID())  | 
|         FBCommon.SetHadDelTicket(curPlayer)  | 
|         FBCommon.AddEnterFBCount(curPlayer, mapID)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GodArea_Anger, 0)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GodArea_LastAddAngerTime, 0)  | 
|         PlayerControl.FBNotify('ElderGod_SomeIn', [curPlayer.GetName()])  | 
|         EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_GodArea, 0, ChConfig.CME_Log_Start)  | 
|         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_GodArea, 1)  | 
|         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_GodArea, 1)  | 
|         PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_GodArea, 1)  | 
|         PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_GodArea, 1)  | 
|         PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_GodArea, 1)  | 
|     elif __IsAngerFull(curPlayer):  | 
|         #ÅÆøÒÑÂú£¬Í˳ö¸±±¾  | 
|         GameWorld.DebugLog("    ¸±±¾ÀïµôÏßÖØÉÏ ÅÆøÒÑÂú£¬Í˳ö¸±±¾")  | 
|         PlayerControl.PlayerLeaveFB(curPlayer)  | 
|     DoFBHelp(curPlayer, tick)  | 
|     return  | 
|   | 
| ##Íæ¼ÒÍ˳ö¸±±¾  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| def DoExitFB(curPlayer, tick):  | 
|       | 
|     return  | 
|   | 
| ##Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def DoPlayerLeaveFB(curPlayer, tick):  | 
|     return  | 
|   | 
| ##Íæ¼ÒÇл»µØÍ¼  | 
| def DoPlayerChangeMapLogic(curPlayer):  | 
|     FBCommon.SetHadDelTicket(curPlayer, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GodArea_Anger, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GodArea_LastAddAngerTime, 0)  | 
|     GameWorld.GetGameFB().SetPlayerGameFBDict(curPlayer.GetID(), FBPlayerDict_LeaveTick, 0)  | 
|     GameWorld.GetGameFB().SetPlayerGameFBDict(curPlayer.GetID(), FBPlayerDict_FullTick, 0)  | 
|       | 
|     return  | 
|   | 
| ## ÊÇ·ñ¸±±¾¸´»î  | 
| #  @param None  | 
| #  @return ÊÇ·ñ¸±±¾¸´»î  | 
| def OnPlayerReborn():  | 
|     return True  | 
|   | 
| ##Íæ¼ÒËÀÍö.  | 
| # @param curPlayer:ËÀÍöµÄÍæ¼Ò   | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| def DoPlayerDead(curPlayer):  | 
|     if __IsAngerFull(curPlayer):  | 
|         leaveTime = FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_GodArea)[1]  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap , 0, leaveTime * 1000, True)  | 
|     return  | 
|   | 
|   | 
| ## Íæ¼Ò¸´»îºó´¦Àí  | 
| def OnPlayerRebornOver(curPlayer, playerRebornType):  | 
|     #¼ÓÅÆø  | 
|     addPoint = IpyGameDataPY.GetFuncCfg('AngryAdd', 3)  | 
|     __AddGodAreaAnger(curPlayer, addPoint)  | 
|     return  | 
|   | 
| ## »÷ɱnpcµôÂä¹éÊô  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param curNPC ±»É±µÄNPC  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def DoFB_DropOwner(curPlayer , curNPC):  | 
|     npcID = curNPC.GetNPCID()  | 
|     ipyData = IpyGameDataPY.GetIpyGameDataNotLog('ElderGodArea', npcID)  | 
|     if not ipyData:  | 
|         return  | 
|     addPoint = ipyData.GetMonsterAnger()  | 
|     #¼ÓÅÆø  | 
|     __AddGodAreaAnger(curPlayer, addPoint)  | 
|     if ChConfig.IsGameBoss(curNPC):  | 
|         DoFBHelp(curPlayer, 0, {"KillBOSS":npcID})  | 
|     return  | 
|   | 
| ## »ñµÃ¸±±¾°ïÖúÐÅÏ¢  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò£¨±»Í¨Öª¶ÔÏó£©  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def DoFBHelp(curPlayer, tick, helpDict = {}):  | 
|     #¸±±¾°ïÖú  | 
|     helpDict[FBCommon.Help_score] = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_GodArea_Anger)  | 
|     GameWorld.DebugLog("helpDict=%s" % helpDict, curPlayer.GetID())  | 
|     FBCommon.Notify_FBHelp(curPlayer, helpDict)  | 
|     return  | 
|   | 
|   | 
| ##---¸±±¾×ÜÂß¼¼ÆÊ±Æ÷---  | 
| # @param tick:ʱ¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks ¸±±¾×ÜÂß¼¼ÆÊ±Æ÷  | 
| def OnProcess(tick):  | 
|     __DoLogic_CheckAnger(tick)  | 
|       | 
|     FBCommon.DoLogicAreaReward("GodAreaExpAward", tick, True)  | 
|     return  | 
|   | 
| def __DoLogic_CheckAnger(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     lastAwardTick = gameFB.GetGameFBDictByKey(Map_FBDict_LastGodAreaCheckTick)  | 
|     checkInterval = IpyGameDataPY.GetFuncCfg('AngryAdd', 2)  | 
|     if tick - lastAwardTick < checkInterval * 1000:  | 
|         return  | 
|     gameFB.SetGameFBDict(Map_FBDict_LastGodAreaCheckTick, tick)  | 
|       | 
|     stepTimeList = FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_GodArea)  | 
|     deadTime, leaveTime = stepTimeList  | 
|   | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     curTime = int(time.time())  | 
|     for index in range(0, playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         playerID = curPlayer.GetPlayerID()  | 
|         if not playerID:  | 
|             continue  | 
|           | 
|         if __IsAngerFull(curPlayer):  | 
|             fullTick = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_FullTick)  | 
|             if fullTick and tick - fullTick > deadTime*1000:  | 
|                 gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_FullTick, 0)  | 
|                 gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_LeaveTick, tick)  | 
|                 playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|                 playerControl.SetDead()  | 
|                   | 
|                 GameWorld.DebugLog('    Ê±¼äµ½ ÉèÖÃËÀÍö ', playerID)  | 
|                   | 
|             leaveTick = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_LeaveTick)  | 
|             if leaveTick and tick - leaveTick > leaveTime*1000:  | 
|                 PlayerControl.PlayerLeaveFB(curPlayer)  | 
|                 gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_LeaveTick, 0)  | 
|                 GameWorld.DebugLog('    Ê±¼äµ½ TÈË ', playerID)  | 
|             continue  | 
|         isFull = False  | 
|         lastAddAngerTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_GodArea_LastAddAngerTime)  | 
|         if lastAddAngerTime:  | 
|             passSecond = curTime - lastAddAngerTime  | 
|             isOK, isFull = TimeAddGodAreaAnger(curPlayer, passSecond)  | 
|             if isOK:  | 
|                 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GodArea_LastAddAngerTime, curTime)  | 
|         else:  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GodArea_LastAddAngerTime, curTime)  | 
|           | 
|     return  |