#!/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  
 | 
import EventShell  
 | 
  
 | 
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)  
 | 
        EventShell.EventRespons_FBEvent(curPlayer, 'godarea')  
 | 
        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  
 |