#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_Guard # # @todo:ÊØ»¤¸±±¾ # @author xdh # @date 2017-12-22 # @version 1.0 # # ÏêϸÃèÊö: ÊØ»¤¸±±¾ # #------------------------------------------------------------------------------- #"""Version = 2017-12-22 14:00""" #------------------------------------------------------------------------------- import FBCommon import GameWorld import IpyGameDataPY import IPY_GameWorld import GameWorldProcess import NPCCustomRefresh import ChConfig import ShareDefine import ItemControler import PlayerControl import EventShell import EventReport #---¸±±¾ÅäÖöÔÓ¦keyÖµ--- ( Def_PrepareTime, # ¸±±¾×¼±¸Ê±¼ä(Ãë) Def_FightTime, # ½øÐÐʱ¼ä(Ãë) Def_LeaveTime, # Í˳öʱ¼ä(Ãë) ) = range(3) ( DL_RefreshMark, # Ë¢¹Ö±êʶµã DL_NPCID, # NPCID DL_SingleNPCCnt, # µ¥´ÎË¢NPC¸öÊý DL_maxCnt, #µ±Ç°µã×î´ó¹ÖÎïÊý DL_TotalNPCCnt, # ÀÛ¼ÆË¢NPC×ܸöÊý DL_NeedKillCnt, # ÐèÒª»÷ɱÊýÁ¿ DL_RefreshCD, # ˢмä¸ô ) = range(7) #µ±Ç°¸±±¾µØÍ¼µÄ״̬ ( FB_Step_Open, # ¸±±¾¿ªÆô FB_Step_Prepare, # ¸±±¾µÈ´ý FB_Step_Fighting, # ¸±±¾½øÐÐÖÐ FB_Step_Over, # ¸±±¾½áÊø FB_Step_Close, # ¸±±¾¹Ø±Õ ) = range(5) #¸±±¾½øÐеĹؿ¨ ( Def_Prepare, # ×¼±¸ Def_KillBandit, # »÷ɱǿµÁ Def_BreakCage, # ÆÆ»µÁý×Ó Def_Dialog, # ÓëÓ×Áú¶Ô»° Def_EndGuard, # ½áÊø ) = range(5) FBPlayerDict_GameStep = 'FBPlayerDict_GameStep' #¹Ø¿¨ FBPlayerDict_NPCKillCnt = 'FBPlayerDict_NPCKillCnt' # NPCÒÑ»÷ɱÊýÁ¿ FBPlayerDict_NPCNeedKillCnt = 'FBPlayerDict_NPCNeedKillCnt' # NPCÐèÒª»÷ɱÊýÁ¿ FBPlayerDict_TotalExp = 'FBPlayerDict_TotalExp' # »ñµÃµÄ×ܾ­Ñé FBPlayerDict_TotalExpPoint = 'FBPlayerDict_TotalExpPoint' # »ñµÃµÄ×ܾ­Ñéµã ##---»ñµÃ¸±±¾ÅäÖÃ--- # @param None # @return ÅäÖÃÐÅÏ¢ def GetGuardTimeCfg(): return FBCommon.GetFBLineStepTime(GameWorld.GetMap().GetMapID(), 0) ##¿ªÆô¸±±¾ # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks ¿ªÆô¸±±¾ def OnOpenFB(tick): FBCommon.OpenOrCloseDoorEx([IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID', 2)], 0) return ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë # @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 ask:ÇëÇó½á¹¹Ìå(IPY_BMChangeMapAsk) # @param tick:ʱ¼ä´Á # @return IPY_GameWorld.cme ö¾Ù def OnChangeMapAsk(ask, tick): return IPY_GameWorld.cmeAccept def SetMap_Guard_GameStep(gameStep): ## ÉèÖø±±¾²½Öè GameWorld.GetGameFB().SetGameFBDict(FBPlayerDict_GameStep, gameStep) return ## ½ø¸±±¾ # @param curPlayer # @param tick # @return None def DoEnterFB(curPlayer, tick): playerID = curPlayer.GetPlayerID() playerLV = curPlayer.GetLV() mapID = GameWorld.GetMap().GetMapID() mapID = FBCommon.GetRecordMapID(mapID) gameFB = GameWorld.GetGameFB() GameWorld.DebugLog("DoEnterFB...,playerLV=%s" % (playerLV), playerID) hadDelTicket = FBCommon.GetHadDelTicket(curPlayer) if not hadDelTicket: FBCommon.SetHadDelTicket(curPlayer) # ÐÂÊÖ¾çÇ鸱±¾ÖØÖÃËùÓм¼ÄÜCD skillManager = curPlayer.GetSkillManager() for i in range(0, skillManager.GetSkillCount()): curSkill = skillManager.GetSkillByIndex(i) if curSkill.GetRemainTime() != 0: curSkill.SetRemainTime(0) curSkill.Sync_Skill() EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_Guard, 0, ChConfig.CME_Log_Start) GameWorld.DebugLog("´Ë¸±±¾¸Õ½øÈëʱ²»Ö±½Ó¿ªÊ¼£¬ÐèµÈǰ¶Ë֪ͨ¿ªÊ¼²Å¿ªÊ¼!", playerID) # µôÏßÖØÉÏÇ¿ÖÆ¿ªÊ¼ return fbStep = gameFB.GetFBStep() if fbStep < FB_Step_Prepare: FBCommon.SetFBStep(FB_Step_Prepare, tick) if fbStep <= FB_Step_Prepare: notify_tick = GetGuardTimeCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True) elif fbStep == FB_Step_Fighting: notify_tick = GetGuardTimeCfg()[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True) DoFBHelp(curPlayer, tick) return ## ¿Í»§¶Ë·¢ËÍ¿ªÊ¼¸±±¾ def OnClientStartFB(curPlayer, tick): gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() if fbStep >= FB_Step_Prepare: GameWorld.ErrLog("ǰ¶ËÇëÇóÕýʽ¿ªÊ¼¸±±¾, µ«¸±±¾ÒѾ­¿ªÊ¼ÁË£¬²»¿ÉÖØ¸´¿ªÊ¼!", curPlayer.GetPlayerID()) return GameWorld.DebugLog("ǰ¶Ë³¡¾°ÐãÒѲ¥·ÅÍê±Ï£¬ÇëÇóÕýʽ¿ªÊ¼¸±±¾!", curPlayer.GetPlayerID()) FBCommon.SetFBStep(FB_Step_Prepare, tick) notify_tick = GetGuardTimeCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True) DoFBHelp(curPlayer, tick) return ##Íæ¼ÒÍ˳ö¸±±¾ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ÎÞÒâÒå def DoExitFB(curPlayer, tick): step = GameWorld.GetGameFB().GetGameFBDictByKey(FBPlayerDict_GameStep) if step == Def_EndGuard: itemID, giveExp = FBCommon.GetFBLineReward(GameWorld.GetMap().GetMapID(), 0) if itemID: ItemControler.GivePlayerItem(curPlayer, itemID, 1, 1, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere], True, showSysInfo=True) # ÐÂÊÖ±¾Íæ¼ÒÍ˳öĬÈϹرո±±¾ GameWorldProcess.CloseFB(tick) return ##Íæ¼ÒÖ÷¶¯À뿪¸±±¾. # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå def DoPlayerLeaveFB(curPlayer, tick): return ## »ñµÃ¸±±¾°ïÖúÐÅÏ¢ # @param curPlayer µ±Ç°Íæ¼Ò£¨±»Í¨Öª¶ÔÏó£© # @param tick µ±Ç°Ê±¼ä # @return None def DoFBHelp(curPlayer, tick): gameFB = GameWorld.GetGameFB() step = gameFB.GetGameFBDictByKey(FBPlayerDict_GameStep) helpDict = {FBCommon.Help_step:step, FBCommon.Help_npcTotal:gameFB.GetGameFBDictByKey(FBPlayerDict_NPCKillCnt)} cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID') helpDict[FBCommon.Help_npc] = FBCommon.GetJsonNPCKillList({cageNPCID:int(step>Def_BreakCage)}) helpDict["talkOver"] = int(step>Def_Dialog) #¸±±¾°ïÖú GameWorld.DebugLog("DoFBHelp %s" % str(helpDict)) FBCommon.Notify_FBHelp(curPlayer, helpDict) return ##---¸±±¾×ÜÂß¼­¼ÆÊ±Æ÷--- # @param tick:ʱ¼ä´Á # @return ÎÞÒâÒå # @remarks ¸±±¾×ÜÂß¼­¼ÆÊ±Æ÷ def OnProcess(tick): fbStep = GameWorld.GetGameFB().GetFBStep() # ¸±±¾×¼±¸ if fbStep == FB_Step_Prepare: __DoLogic_FB_Prepare(tick) # ¸±±¾½øÐÐÖÐ elif fbStep == FB_Step_Fighting: __DoLogic_FB_Fighting(tick) # ¸±±¾½áÊø elif fbStep == FB_Step_Over: __DoLogic_FB_Over(tick) return ## ¸±±¾×¼±¸Âß¼­ # @param tick:ʱ¼ä´Á # @return ÎÞÒâÒå def __DoLogic_FB_Prepare(tick): #gameFB = GameWorld.GetGameFB() fbCfg = GetGuardTimeCfg() # ¼ä¸ôδµ½ if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_PrepareTime] * 1000: return FBCommon.OpenOrCloseDoorEx([IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID', 2)], 1) # ÉèÖÿªÊ¼Ë¢¹Ö mapID = GameWorld.GetMap().GetMapID() gameFB = GameWorld.GetGameFB() cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID') refreshIDList = FBCommon.GetFBLineRefreshNPC(mapID) needKillCnt = 0 for refreshID in refreshIDList: npcCountList = NPCCustomRefresh.GetNPCRefreshCountList(refreshID) if not npcCountList: continue for npcID, count in npcCountList: if npcID == cageNPCID: continue needKillCnt += count gameFB.SetGameFBDict(FBPlayerDict_NPCNeedKillCnt, needKillCnt) for refreshID in refreshIDList: NPCCustomRefresh.SetNPCRefreshByID(refreshID) SetMap_Guard_GameStep(Def_KillBandit) playerManager = GameWorld.GetMapCopyPlayerManager() if playerManager.GetPlayerCount() > 0: curPlayer = playerManager.GetPlayerByIndex(0) DoFBHelp(curPlayer, tick) FBCommon.SetFBStep(FB_Step_Fighting, tick) FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, fbCfg[Def_FightTime] * 1000) return ## ¸±±¾½øÐÐÖÐ # @param tick:ʱ¼ä´Á # @return ÎÞÒâÒå def __DoLogic_FB_Fighting(tick): fbCfg = GetGuardTimeCfg() # ¼ä¸ôδµ½ if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_FightTime] * 1000: return __DoGuardOver(False) return ##¸±±¾¹Ø±ÕÖÐ # @param tick:ʱ¼ä´Á # @return ÎÞÒâÒå # @remarks ¸±±¾¹Ø±ÕÖÐ def __DoLogic_FB_Over(tick): #gameFB = GameWorld.GetGameFB() fbCfg = GetGuardTimeCfg() # ¼ä¸ôδµ½ if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_LeaveTime] * 1000: return #¸±±¾¹Ø±Õ GameWorldProcess.CloseFB(tick) FBCommon.SetFBStep(FB_Step_Close, tick) return ## »ñµÃ¾­Ñé # @param curPlayer µ±Ç°Íæ¼Ò # @param addExp »ñµÃµÄ¾­Ñé # @param expViewType ¾­ÑéÀàÐÍ # @return True or False def OnGetExp(curPlayer, addExp, expViewType): if expViewType != ShareDefine.Def_ViewExpType_KillNPC: return playerID = curPlayer.GetID() gameFB = GameWorld.GetGameFB() exp = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExp) expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExpPoint) totalExp = expPoint * ChConfig.Def_PerPointValue + exp updTotalExp = totalExp + addExp updExp = updTotalExp % ChConfig.Def_PerPointValue updExpPoint = updTotalExp / ChConfig.Def_PerPointValue gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_TotalExp, updExp) gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_TotalExpPoint, updExpPoint) GameWorld.DebugLog("OnGetExp() totalExp=%s,addExp=%s,updTotalExp=%s" % (totalExp, addExp, updTotalExp), playerID) return ## Ö´Ðи±±¾É±¹ÖÂß¼­ # @param curPlayer ɱ¹ÖµÄÈË # @param curNPC ±»É±µÄ¹Ö # @param tick µ±Ç°Ê±¼ä # @return None def DoFB_Player_KillNPC(curPlayer, curNPC, tick): gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() if fbStep != FB_Step_Fighting: return cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID') npcid = curNPC.GetNPCID() if not npcid: return if npcid == cageNPCID: #Áý×Ó´òµôÁË´¥·¢ÈÎÎñ¿É¶Ô»° EventShell.EventRespons_FBEvent(curPlayer, "guardfbtalk") SetMap_Guard_GameStep(Def_Dialog) else: killCnt = gameFB.GetGameFBDictByKey(FBPlayerDict_NPCKillCnt) gameFB.SetGameFBDict(FBPlayerDict_NPCKillCnt, killCnt+1) if killCnt+1 >= gameFB.GetGameFBDictByKey(FBPlayerDict_NPCNeedKillCnt): SetMap_Guard_GameStep(Def_BreakCage) DoFBHelp(curPlayer, tick) return ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼­ÓÉÍâ²ã¾ö¶¨ # @param attacker ¹¥»÷·½ # @param defender ·ÀÊØ·½ # @return bool def CheckCanAttackTagObjInFB(attacker, defender): gameFB = GameWorld.GetGameFB() if gameFB.GetFBStep() != FB_Step_Fighting: return False gameFB = GameWorld.GetGameFB() cageNPCID = IpyGameDataPY.GetFuncCfg('GuardFBCageNPCID') step = gameFB.GetGameFBDictByKey(FBPlayerDict_GameStep) if step != Def_BreakCage: defenderObjType = defender.GetGameObjType() # ¹¥»÷Áý×Ó if defenderObjType == IPY_GameWorld.gotNPC and defender.GetNPCID() == cageNPCID: return False return True ## ÈÎÎñרÓÃ,´¥·¢Ê¼þ£¨¸±±¾ÄÚÍê³ÉijÈÎÎñ£© # @param curPlayer:Íæ¼ÒʵÀý # @param isAchieve:ÊÇ·ñÍê³ÉÈÎÎñ # @return None def DoFB_OnAchieveTask(curPlayer, isAchieve): if GameWorld.GetGameFB().GetGameFBDictByKey(FBPlayerDict_GameStep) != Def_Dialog: return SetMap_Guard_GameStep(Def_EndGuard) DoFBHelp(curPlayer, 0) __DoGuardOver(True) return ## ÊÇ·ñ¸±±¾¸´»î # @param None # @return ÊÇ·ñ¸±±¾¸´»î def OnPlayerReborn(): return True ##Íæ¼ÒËÀÍö. # @param curPlayer:ËÀÍöµÄÍæ¼Ò # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾. def DoPlayerDead(curPlayer): __DoGuardOver(False) return ## ¸±±¾½áÊø´¦Àí def __DoGuardOver(isPass): gameFB = GameWorld.GetGameFB() if gameFB.GetFBStep() == FB_Step_Over: return tick = GameWorld.GetGameWorld().GetTick() curPlayer = None playerManager = GameWorld.GetMapCopyPlayerManager() if playerManager.GetPlayerCount() > 0: curPlayer = playerManager.GetPlayerByIndex(0) if not curPlayer: GameWorldProcess.CloseFB(tick) return fbCfg = GetGuardTimeCfg() gameFB = GameWorld.GetGameFB() playerID = curPlayer.GetPlayerID() # exp = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExp) # expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExpPoint) # totalExp = expPoint * ChConfig.Def_PerPointValue + exp costTime = tick - GameWorld.GetGameFB().GetFBStepTick() giveExp = 0 overDict = {FBCommon.Over_isPass:int(isPass), FBCommon.Over_costTime:costTime} if isPass: itemID, giveExp = FBCommon.GetFBLineReward(GameWorld.GetMap().GetMapID(), 0) #ÎïÆ·¸ÄÔÚÍ˳ö¸±±¾Ê±¸ø #ItemControler.GivePlayerItem(curPlayer, itemID, 1, 1, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere], True, showSysInfo=True) if giveExp: PlayerControl.PlayerControl(curPlayer).AddExp(giveExp) overDict[FBCommon.Over_exp] = giveExp if itemID: overDict[FBCommon.Over_itemInfo] = FBCommon.GetJsonItemList([itemID]) # ֪ͨ½á¹û __SendOverInfo(curPlayer, overDict) # ½øÈëÀ뿪½×¶Î FBCommon.SetFBStep(FB_Step_Over, tick) FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, fbCfg[Def_LeaveTime] * 1000) return ## ·¢ËÍÌôÕ½½á¹ûÐÅÏ¢ def __SendOverInfo(curPlayer, overDict): overDict[FBCommon.Over_dataMapID] = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID()) overDict[FBCommon.Over_lineID] = FBCommon.GetFBPropertyMark() GameWorld.DebugLog("__SendOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID()) FBCommon.Notify_FB_Over(curPlayer, overDict) return