#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_MergePK # # @todo:¿ç·þÆ¥ÅäPK # @author hxp # @date 2015-10-22 # @version 1.4 # # @change: "2015-11-04 12:00" hxp ÐÞ¸ÄÕóÓªµ¼ÖÂÎÞ·¨PKÎÊÌâ(ÅäÖÃÖÐתµØÍ¼²»ÖØÖÃÕóÓª) # @change: "2015-12-28 17:00" hxp Õ½¶·½á¹û¸ÄΪGameServer֪ͨ¿Í»§¶Ë # @change: "2016-02-26 17:00" hxp PK³¬Ê±Ê¤¸º¹æÔòÅжÏÐÞ¸Ä # @change: "2016-12-20 17:30" hxp ÓÀºã°æÐ޸ģ»Ö§³ÖÅäÖÃʤÀû³¡´ÎÖÆ£»»ý·Ö¼ÆËã¸ÄΪÓÉGameServerË㣬µØÍ¼Ö»Ëãʤ¸º # ÏêϸÃèÊö: ¿ç·þÆ¥ÅäPK # #--------------------------------------------------------------------- #"""Version = 2016-12-20 17:30""" #--------------------------------------------------------------------- import GameWorld import ShareDefine import ReadChConfig import IPY_GameWorld import GameWorldProcess import PlayerControl import ChPlayer import FBCommon import ChConfig import ChEquip #---¸±±¾ÅäÖöÔÓ¦keyÖµ--- ( Def_Time_MaxWait, # 0×µÈ´ýʱ¼ä, ºÁÃë Def_Time_MapPrepare, # 1·ÇÌØÐ§×¼±¸Ê±¼ä, ºÁÃë Def_Time_MapPrepareEff, # 2ÌØÐ§µ¹¼ÆÊ±×¼±¸Ê±¼ä, ºÁÃë Def_Time_Fight, # 3Õ½¶·Ê±¼ä, ºÁÃë Def_Time_Leave, # 4½áÊøÍ˳öʱ¼ä, ºÁÃë Def_Pos_Enter, # 5½ø³¡×ø±ê[(A·½×ø±êx,y), (B·½×ø±êx,y)], Def_Pos_Start, # 6¿ªÊ¼PK³õÊ¼×ø±ê[(A·½×ø±êx,y), (B·½×ø±êx,y)], Def_MaxWinCnt, # 7×î´óʤ³¡£¬Èç2´ú±íÈý¾ÖÁ½Ê¤ÖÆ£¬3´ú±íÎå¾ÖÈýÊ¤ÖÆ Def_AutoRebornTime, # 8ËÀÍö×Ô¶¯¸´»îʱ¼ä Def_GateIDList, # 9¹âǽNPCIDÁбí Def_GatePos, # 10¹âǽÏÔʾʱ¿ÉÒÆ¶¯×ø±êµã[(A·½×ø±êx,y), (B·½×ø±êx,y)] Def_IsFullHP, # 11ÿ¾ÖÖØÐ¿ªÊ¼Ê±ÊÇ·ñÂúѪ ) = range(12) # µ±Ç°¸±±¾µØÍ¼µÄ״̬ ( FB_State_Open, # µØÍ¼¿ªÆô FB_State_Waiting, # µÈ´ý¶ÔÊÖ½×¶Î FB_State_MapPrepare, # µØÍ¼×¼±¸ FB_State_MapPrepareEff, # µØÍ¼×¼±¸µ¹¼ÆÊ±ÌØÐ§ FB_State_Fight, # Õ½¶· FB_State_Reborn, # ¸´»îµÈ´ýʱ¼ä FB_State_FreeTime, # ×ÔÓÉʱ¼ä FB_State_Over, # ¸±±¾½áÊø ) = range(8) # ¶ÔÕ½½áÊøÀàÐͶ¨Òå ( Def_OverType_LackPlayer, # ȱÉÙ¶ÔÊÖ Def_OverType_PlayerExit, # ¶ÔÊÖÍ˳ö(ÊÓΪÈÏÊä) Def_OverType_Kill, # »÷ɱ¶ÔÊÖ Def_OverType_TimeOut, # PKʱ¼ä³¬Ê± ) = range(4) # ¸±±¾Ïà¹Ø×Öµäkey GameFBDict_FirstEnterID = "FBD_FirstEnterID" # µÚÒ»¸ö½øÈëµÄÍæ¼ÒID GameFBDict_PlayerWinCnt = "FBD_PlayerWinCnt_%s" # Íæ¼ÒÒÑ»ñʤ´ÎÊý, ²ÎÊý[playerID] FBPDict_PVPDamage = "FBPD_PVPDamage" # Íæ¼ÒÉ˺¦Êä³ö FBPDict_PVPDamUpdTick = "FBPD_PVPDamUpdTick" # ¸üÐÂÉ˺¦tick ## »ñµÃ¸±±¾ÅäÖà # @param None # @return ÅäÖÃÐÅÏ¢ def GetMergePKCfg(): return ReadChConfig.GetEvalChConfig("MergePK_Cfg") ##¿ªÆô¸±±¾ # @param tick:ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå def OnOpenFB(tick): FBCommon.SetFBStep(FB_State_Open, tick) FBCommon.OpenOrCloseDoorEx(GetMergePKCfg()[Def_GateIDList], 1) return True ##ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë # @param curPlayer Íæ¼ÒʵÀý # @param mapID µØÍ¼ID # @param tick ʱ¼ä´Á # @return ²¼¶ûÖµ # @remarks ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë def OnEnterFBEvent(curPlayer, mapID, lineID, tick): return True ##Íæ¼Ò½øÈ븱±¾ # @param curPlayer:Íæ¼ÒʵÀý # @param tick:ʱ¼ä´Á # @return ÎÞÒâÒå def DoEnterFB(curPlayer, tick): playerID = curPlayer.GetPlayerID() playerVSRoomID = curPlayer.GetVsRoomId() factionID = curPlayer.GetFaction() roomID = GameWorld.GetGameWorld().GetPropertyID() GameWorld.Log("DoEnterFB roomID=%s,playerVSRoomID=%s,factionID=%s" % (roomID, playerVSRoomID, factionID), playerID) mergePkCfg = GetMergePKCfg() gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() if fbStep == FB_State_Open: gameFB.SetGameFBDict(GameFBDict_FirstEnterID, playerID) FBCommon.SetFBStep(FB_State_Waiting, tick) GameWorld.Log(" µÚÒ»¸ö½øÈ룬ÉèÖø±±¾½øÈëµÈ´ý¶ÔÊֽ׶Σ¡roomID=%s" % (roomID), playerID) curPlayer.Sync_TimeTick(IPY_GameWorld.tttFBAddTime, 0, mergePkCfg[Def_Time_MaxWait], True) elif fbStep == FB_State_Waiting: FBCommon.SetFBStep(FB_State_MapPrepare, tick) GameWorld.Log(" µÚ¶þ¸ö½øÈ룬ÉèÖø±±¾½øÈë×¼±¸½×¶Î£¡roomID=%s" % (roomID), playerID) totalPrepareTime = mergePkCfg[Def_Time_MapPrepare] + mergePkCfg[Def_Time_MapPrepareEff] FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, totalPrepareTime, 0, True) else: PlayerControl.PlayerLeaveFB(curPlayer) return startPosX, startPosY = mergePkCfg[Def_Pos_Start][0 if factionID == ShareDefine.CampType_Justice else 1] curPlayer.ResetPos(startPosX, startPosY) return ##¸±±¾Íæ¼Ò½øÈëµã # @param curPlayer Íæ¼ÒʵÀý # @param mapID µØÍ¼ID # @param lineId ·ÖÏßID # @param tick ʱ¼ä´Á # @return ×ø±êÁбí(X,Y) def OnGetFBEnterPos(curPlayer, mapID, lineId, tick): factionID = curPlayer.GetFaction() posIndex = 0 if factionID == ShareDefine.CampType_Justice else 1 GameWorld.DebugLog("OnGetFBEnterPos factionID=%s,posIndex=%s" % (factionID, posIndex), curPlayer.GetPlayerID()) return GetMergePKCfg()[Def_Pos_Enter][posIndex] ##Íæ¼ÒÍ˳ö¸±±¾ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ÎÞÒâÒå def DoExitFB(curPlayer, tick): # ½áËãʱ¼ä gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() if fbStep == FB_State_FreeTime: # ÓÉÓÚ½áÊøºóÍæ¼ÒÊÇ·¢ËÍ·µ»ØÔ­·þÎñÆ÷µÄ£¬¹ÊÔÚ¿ç·þÖÐÈÏΪÊǵôÏߣ¬¶ø²»ÊÇÖ÷¶¯Í˳ö¸±±¾£¬ËùÒÔ²»»á´¥·¢¼ì²é¹Ø±Õ¸±±¾Âß¼­ # ÕâÀï½øÐÐÊÖ¶¯¼ì²éÒ»´Î£¬·ÀÖ¹Íæ¼Ò¿ìËÙ½áÊøÕ½ºóºó¸±±¾²»»á¹Ø±Õ£¬µ¼ÖÂÒ»¶¨Ê±¼äÄÚ»áÕ¼Óøø±±¾·ÖÏß×ÊÔ´ GameWorldProcess.OnPlayerLeaveMapCloseFB() return # ×¼±¸¼°Õ½¶·½×¶Î£¬Íæ¼ÒÏÂÏߣ¬Ö±½ÓËãʧ°Ü£¬¶ÔÊÖ»ñʤ if fbStep not in [FB_State_MapPrepare, FB_State_MapPrepareEff, FB_State_Fight]: return winner = None winnerID = 0 loser = curPlayer exitPlayerID = curPlayer.GetPlayerID() playerManager = GameWorld.GetMapCopyPlayerManager() for i in range(0, playerManager.GetPlayerCount()): player = playerManager.GetPlayerByIndex(i) if player.GetID() == 0: continue playerID = player.GetPlayerID() if playerID != loser.GetPlayerID(): winner = player winnerID = playerID break GameWorld.Log("Íæ¼ÒÔÚ×¼±¸orÕ½¶·½×¶ÎÏÂÏߣ¬Ö±½Óʧ°Ü£¬¶ÔÊÖ»ñʤ!exitPlayerID=%s,winnerID=%s" % (exitPlayerID, winnerID)) __DoMergePKOver(winner, loser, Def_OverType_PlayerExit, tick) return ##Íæ¼ÒÖ÷¶¯À뿪¸±±¾. # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå def DoPlayerLeaveFB(curPlayer, tick): roomID = GameWorld.GetGameWorld().GetPropertyID() GameWorld.Log("Íæ¼ÒÖ÷¶¯À뿪¸±±¾: roomID=%s" % roomID, curPlayer.GetPlayerID()) return ## »ñµÃ¸±±¾°ïÖúÐÅÏ¢ # @param curPlayer µ±Ç°Íæ¼Ò£¨±»Í¨Öª¶ÔÏó£© # @param tick µ±Ç°Ê±¼ä # @return None def DoFBHelp(curPlayer, tick): return ##---¸±±¾×ÜÂß¼­¼ÆÊ±Æ÷--- # @param tick:ʱ¼ä´Á # @return ÎÞÒâÒå # @remarks ¸±±¾×ÜÂß¼­¼ÆÊ±Æ÷ def OnProcess(tick): gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() if fbStep == FB_State_Waiting: __DoLogic_Waiting(tick) elif fbStep == FB_State_MapPrepare: __DoLogic_MapPrepare(tick) elif fbStep == FB_State_MapPrepareEff: __DoLogic_MapPrepareEff(tick) elif fbStep == FB_State_Fight: __DoLogic_MapFight(tick) elif fbStep == FB_State_Reborn: __DoLogic_Reborn(tick) elif fbStep == FB_State_FreeTime: __DoLogic_FreeTime(tick) else: pass return ##µÈ´ýÍæ¼Ò½øÈë½×¶Î´¦Àí def __DoLogic_Waiting(tick): __BackToMergePKPrepareArea(tick) maxWaitTime = GetMergePKCfg()[Def_Time_MaxWait] if tick - GameWorld.GetGameFB().GetFBStepTick() < maxWaitTime: return # ¶ÔÊÖûÀ´£¬Ö±½Ó»ñʤ roomID = GameWorld.GetGameWorld().GetPropertyID() gameFB = GameWorld.GetGameFB() winnerID = gameFB.GetGameFBDictByKey(GameFBDict_FirstEnterID) winner = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(winnerID) GameWorld.Log("¶ÔÊÖûÀ´£¬Ö±½Ó»ñʤ£¡roomID=%s,winnerID=%s" % (roomID, winnerID)) __DoMergePKOver(winner, None, Def_OverType_LackPlayer, tick) return ##¸±±¾×¼±¸Ê±¼ä # @param tick ʱÖÓ # @return ÎÞÒâÒå # @remarks ¸±±¾×¼±¸Ê±¼ä def __DoLogic_MapPrepare(tick): __BackToMergePKPrepareArea(tick) mergePKCfg = GetMergePKCfg() mapPrepare = mergePKCfg[Def_Time_MapPrepare] if tick - GameWorld.GetGameFB().GetFBStepTick() < mapPrepare: return __SetFBStepToPrepareEff(tick) return def __SetFBStepToPrepareEff(tick): #Í¨ÖªÌØÐ§ mergePKCfg = GetMergePKCfg() mapPrepareEff = mergePKCfg[Def_Time_MapPrepareEff] FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttAddUpTime, mapPrepareEff) FBCommon.SetFBStep(FB_State_MapPrepareEff, tick) FBCommon.OpenOrCloseDoorEx(mergePKCfg[Def_GateIDList], 1) return ##¸±±¾×¼±¸Ê±¼ä£¬Í¨Öª¿Í»§¶Ëµ¹¼ÆÊ± # @param tick ʱÖÓ # @return ÎÞÒâÒå # @remarks ¸±±¾×¼±¸Ê±¼ä def __DoLogic_MapPrepareEff(tick): __BackToMergePKPrepareArea(tick) mergePKCfg = GetMergePKCfg() prepareEffTime = mergePKCfg[Def_Time_MapPrepareEff] if tick - GameWorld.GetGameFB().GetFBStepTick() < prepareEffTime: return fightTime = mergePKCfg[Def_Time_Fight] copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for i in range(copyMapPlayerManager.GetPlayerCount()): curPlayer = copyMapPlayerManager.GetPlayerByIndex(i) if curPlayer == None or curPlayer.IsEmpty(): continue curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, fightTime, True) FBCommon.SetFBStep(FB_State_Fight, tick) FBCommon.OpenOrCloseDoorEx(mergePKCfg[Def_GateIDList], 0) return def __BackToMergePKPrepareArea(tick): ##¼ì²éÊÇ·ñÔÚ×¼±¸Çø gatePosList = GetMergePKCfg()[Def_GatePos] playManager = GameWorld.GetMapCopyPlayerManager() #²»×¼Íæ¼Ò³¬¹ýÖ¸¶¨ÇøÓò for i in range(playManager.GetPlayerCount()): curPlayer = playManager.GetPlayerByIndex(i) # ûÓÐÕâ¸öÍæ¼Ò if not curPlayer: continue factionID = curPlayer.GetFaction() posIndex = 0 if factionID == ShareDefine.CampType_Justice else 1 checkPosX, resetPos = gatePosList[posIndex] # ¼ì²éÍæ¼ÒµÄ×ø±ê curPosX = curPlayer.GetPosX() if posIndex == 0 and curPosX > checkPosX: GameWorld.ResetPlayerPos(curPlayer, resetPos[0], resetPos[1]) if posIndex == 1 and curPosX < checkPosX: GameWorld.ResetPlayerPos(curPlayer, resetPos[0], resetPos[1]) return ##Õ½¶·½×¶Î # @param tick ʱÖÓ # @return ÎÞÒâÒå # @remarks ¸±±¾×¼±¸Ê±¼ä def __DoLogic_MapFight(tick): mergePKCfg = GetMergePKCfg() fightTime = mergePKCfg[Def_Time_Fight] if tick - GameWorld.GetGameFB().GetFBStepTick() < fightTime: return # ʱ¼äµ½»¹Ã»·Ö³öʤ¸º, ¸ù¾ÝÒÔϹæÔò¾ö¶¨Ê¤¸º # É˺¦Êä³ö > ÓÅÏȵ½´ïʱ¼ä > Ê£ÓàHP > playerID playerInfoList = [] gameFB = GameWorld.GetGameFB() #µØÍ¼Íæ¼Ò»î¶¯¿ªÊ¼Ê±µÄËæ»ú×ø±êµã copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for i in range(copyMapPlayerManager.GetPlayerCount()): player = copyMapPlayerManager.GetPlayerByIndex(i) if player == None or player.IsEmpty(): continue playerID = player.GetPlayerID() pvpDamage = gameFB.GetPlayerGameFBDictByKey(playerID, FBPDict_PVPDamage) pvpDamTick = gameFB.GetPlayerGameFBDictByKey(playerID, FBPDict_PVPDamUpdTick) sortTick = tick - pvpDamTick playerInfoList.append([pvpDamage, sortTick, player.GetHP(), playerID, player]) GameWorld.DebugLog("PK³¬Ê±: playerID=%s,pvpDamge=%s,pvpDamTick=%s,tick=%s,sortTick=%s" % (playerID, pvpDamage, pvpDamTick, tick, sortTick)) playerInfoList.sort(reverse=True) winner = playerInfoList[0][-1] if len(playerInfoList) > 0 else None loser = playerInfoList[1][-1] if len(playerInfoList) > 1 else None GameWorld.Log("PK³¬Ê±, ½øÈë½áËã!playerInfoList=%s" % str(playerInfoList)) __DoLogicAddPlayerWinCnt(winner, loser, Def_OverType_TimeOut, tick) return ##±ÈÈü¸´»î # @param tick ʱÖÓ # @return ÎÞÒâÒå # @remarks ±ÈÈü½áÊøµÄ¿ÕÏÐʱ¼ä def __DoLogic_Reborn(tick): if tick - GameWorld.GetGameFB().GetFBStepTick() < GetMergePKCfg()[Def_AutoRebornTime]: return startPosList = GetMergePKCfg()[Def_Pos_Start] isFullHP = GetMergePKCfg()[Def_IsFullHP] copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for i in range(copyMapPlayerManager.GetPlayerCount()): player = copyMapPlayerManager.GetPlayerByIndex(i) if player == None or player.IsEmpty(): continue if player.GetPlayerAction() == IPY_GameWorld.paDie: GameWorld.DebugLog("¸´»îÍæ¼Ò...", player.GetPlayerID()) ChPlayer.PlayerRebornByType(player, ChConfig.rebornType_FBUseItem, tick) factionID = player.GetFaction() posIndex = 0 if factionID == ShareDefine.CampType_Justice else 1 posX, posY = startPosList[posIndex] player.ResetPos(posX, posY) # ÉèÖÃÂúѪ if isFullHP and player.GetHP() != player.GetMaxHP(): player.SetHP(player.GetMaxHP()) # ½øÈëÌØÐ§×¼±¸µ¹¼ÆÊ±£¬¿ªÊ¼ÏÂÒ»¾Ö×¼±¸ __SetFBStepToPrepareEff(tick) return def DecFreeRebornCount(curPlayer): # Ö±½Ó·µ»ØÃâ·Ñ¸´»î return True ##±ÈÈü½áÊøµÄ¿ÕÏÐʱ¼ä # @param tick ʱÖÓ # @return ÎÞÒâÒå # @remarks ±ÈÈü½áÊøµÄ¿ÕÏÐʱ¼ä def __DoLogic_FreeTime(tick): if tick - GameWorld.GetGameFB().GetFBStepTick() < GetMergePKCfg()[Def_Time_Leave]: return #FBCommon.DoLogic_FBKickAllPlayer() return ## PVPÉ˺¦Ïà¹Ø def OnPVPDamage(curPlayer, damageValue, tagPlayer, tick): playerID = curPlayer.GetPlayerID() tagPlayerID = tagPlayer.GetPlayerID() gameFB = GameWorld.GetGameFB() curPlayerDamage = gameFB.GetPlayerGameFBDictByKey(playerID, FBPDict_PVPDamage) updDamage = min(ChConfig.Def_UpperLimit_DWord, curPlayerDamage + damageValue) gameFB.SetPlayerGameFBDict(playerID, FBPDict_PVPDamage, updDamage) gameFB.SetPlayerGameFBDict(playerID, FBPDict_PVPDamUpdTick, tick) GameWorld.DebugLog("OnPVPDamage playerID=%s,tagPlayerID=%s,damageValue=%s,updDamage=%s,tick=%s" % (playerID, tagPlayerID, damageValue, updDamage, tick)) helpDict = {"PVPDamage":[playerID, updDamage, tick]} FBCommon.Notify_FBHelp(curPlayer, helpDict) FBCommon.Notify_FBHelp(tagPlayer, helpDict) return ##´¦Àí¸±±¾ÖÐɱËÀÍæ¼ÒÂß¼­ # @param curPlayer Íæ¼ÒʵÀý # @param defender ·ÀÊØÕß # @param tick ʱ¼ä´Á # @return ²¼¶ûÖµ # @remarks ´¦Àí¸±±¾ÖÐɱËÀÍæ¼ÒÂß¼­ def DoFBOnKill_Player(curPlayer, defender, tick): winnerID = curPlayer.GetPlayerID() loserID = defender.GetPlayerID() roomID = GameWorld.GetGameWorld().GetPropertyID() GameWorld.Log("DoFBOnKill_Player roomID=%s,winnerID=%s,loserID=%s" % (roomID, winnerID, loserID), winnerID) if GameWorld.GetGameFB().GetFBStep() != FB_State_Fight: return __DoLogicAddPlayerWinCnt(curPlayer, defender, Def_OverType_Kill, tick) return True def __DoLogicAddPlayerWinCnt(winner, loser, overType, tick): gameFB = GameWorld.GetGameFB() winnerID = 0 if not winner else winner.GetPlayerID() loserID = 0 if not loser else loser.GetPlayerID() winnerWinCnt = gameFB.GetGameFBDictByKey(GameFBDict_PlayerWinCnt % winnerID) updWinCnt = winnerWinCnt + 1 gameFB.SetGameFBDict(GameFBDict_PlayerWinCnt % winnerID, updWinCnt) isOver = (updWinCnt >= GetMergePKCfg()[Def_MaxWinCnt]) if not isOver and loser: __NotifyFBOver(gameFB, winner, loser, isOver) # ÖØÖÃÉ˺¦Êä³ö gameFB.SetPlayerGameFBDict(winnerID, FBPDict_PVPDamage, 0) gameFB.SetPlayerGameFBDict(winnerID, FBPDict_PVPDamUpdTick, tick) gameFB.SetPlayerGameFBDict(loserID, FBPDict_PVPDamage, 0) gameFB.SetPlayerGameFBDict(loserID, FBPDict_PVPDamUpdTick, tick) GameWorld.DebugLog(" δ´ïµ½×î´óʤ³¡£¬ÓжÔÊÖ£¬½øÈ븴»îµÈ´ý½×¶Î£¡", winnerID) FBCommon.SetFBStep(FB_State_Reborn, tick) return # ÎÞ¶ÔÊÖ»òÒÑ´ïµ½×î´óʤ³¡Êý GameWorld.DebugLog(" ÒÑ´ïµ½×î´óʤ³¡£¬»ñµÃ×îÖÕʤÀû£¡", winnerID) __DoMergePKOver(winner, loser, overType, tick) return def __NotifyFBOver(gameFB, winner, loser, isOver): winnerID = 0 if not winner else winner.GetPlayerID() winnerAccID = "" if not winner else winner.GetAccID() loserID = 0 if not loser else loser.GetPlayerID() loserAccID = "" if not loser else loser.GetAccID() winnerWinCnt = gameFB.GetGameFBDictByKey(GameFBDict_PlayerWinCnt % winnerID) winnerDamage = gameFB.GetPlayerGameFBDictByKey(winnerID, FBPDict_PVPDamage) loserWinCnt = gameFB.GetGameFBDictByKey(GameFBDict_PlayerWinCnt % loserID) loserDamage = gameFB.GetPlayerGameFBDictByKey(loserID, FBPDict_PVPDamage) roomID = GameWorld.GetGameWorld().GetPropertyID() overDict = {"roomID":roomID, "winnerAccID":winnerAccID, "loserAccID":loserAccID, "winnerWinCnt":winnerWinCnt, "loserWinCnt":loserWinCnt, "isOver":isOver, "winnerDamage":winnerDamage, "loserDamage":loserDamage, "winnerID":winnerID, "loserID":loserID} GameWorld.Log("µ¥¾Ö½áËã %s" % str(overDict), roomID) #֪ͨ¿Í»§¶ËÐÅÏ¢, ¿Í»§¶Ë¸ù¾ÝroomID×ÔÐнâÎöµ±Ç°µÄgroupType¼°battleIndex #µ¥¾Ö½áËãÓÉMapServerͬ²½£¬×îºóÒ»¾ä½áËãÓÉGameServerͬ²½ if winner: FBCommon.Notify_FB_Over(winner, overDict) if loser: FBCommon.Notify_FB_Over(loser, overDict) return ## ¿ç·þPK½áÊø´¦Àí def __DoMergePKOver(winner, loser, overType, tick): gameFB = GameWorld.GetGameFB() mergePKCfg = GetMergePKCfg() winnerID = 0 if not winner else winner.GetPlayerID() loserID = 0 if not loser else loser.GetPlayerID() winnerWinCnt = gameFB.GetGameFBDictByKey(GameFBDict_PlayerWinCnt % winnerID) loserWinCnt = gameFB.GetGameFBDictByKey(GameFBDict_PlayerWinCnt % loserID) #¸±±¾×´Ì¬½øÈë¹Ø±Õµ¹¼ÆÊ± FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, mergePKCfg[Def_Time_Leave]) FBCommon.SetFBStep(FB_State_FreeTime, tick) #__NotifyFBOver(gameFB, winner, loser, 1) #·¢ËÍÒ»ÌõÏûÏ¢µ½GameServer֪ͨPK¶ÔÕ½½áÊø roomID = GameWorld.GetGameWorld().GetPropertyID() sendMsg = str([roomID, winnerID, loserID, winnerWinCnt, loserWinCnt, ChEquip.GetPlayerEquipView(winner), ChEquip.GetPlayerEquipView(loser), overType]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'MergePKOver', sendMsg, len(sendMsg)) GameWorld.Log("PK½áËãSendToGameServer: %s" % sendMsg) return #¹ØÏµÓÐ3²ã£¬ÎÞ-ÓѺÃ-µÐÈË ##ÅжÏÊÇ·ñÓѺùØÏµ£¬¸Ã²ãÅж¨ÎªÓѺÃÂß¼­ÖеÄ×îºóÅÐ¶Ï # @param curPlayer Íæ¼ÒʵÀý # @param curTagPlayer Ä¿±êÍæ¼ÒʵÀý # @return ²¼¶ûÖµ def CheckPlayersRelation_IsFriend(curPlayer, curTagPlayer): return not CanAttackPlayer(curPlayer, curTagPlayer) ##¸±±¾ÖÐ,¹¥»÷¶ÓÓÑÂß¼­ # @param curPlayer Íæ¼ÒʵÀý # @param curTagPlayer Ä¿±êÍæ¼ÒʵÀý # @return ²¼¶ûÖµ # @remarks def DoCanAttackTeamer(curPlayer, curTagPlayer): return CanAttackPlayer(curPlayer, curTagPlayer) ##¸±±¾ÖÐ,ÊÇ·ñ¿É¹¥»÷ # @param curPlayer Íæ¼ÒʵÀý # @param curTagPlayer Ä¿±êÍæ¼ÒʵÀý # @return ²¼¶ûÖµ # @remarks ¸±±¾ÖÐ,ÊÇ·ñ¿É¹¥»÷ def CanAttackPlayer(curPlayer, curTagPlayer): fbStep = GameWorld.GetGameFB().GetFBStep() if fbStep != FB_State_Fight: GameWorld.DebugLog("·ÇÕ½¶·½×¶Î£¬²»¿É¹¥»÷£¡") return False return curPlayer.GetFaction() != curTagPlayer.GetFaction()