#!/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
|