#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package MirrorAttack # # @todo:¾µÏñÕ½¶· # @author hxp # @date 2024-10-17 # @version 1.0 # # ÏêϸÃèÊö: ¾µÏñÕ½¶·£¬Ö§³ÖÓëÍæ¼Ò¾µÏñÊý¾ÝÕ½¶·£¬ÒÔNPCΪս¶·ÊµÀý£¬Ö§³Ö¿ìËÙÕ½¶· # #------------------------------------------------------------------------------- #"""Version = 2024-10-17 15:00""" #------------------------------------------------------------------------------- import GameWorld import ChPlayer import ChConfig import EffGetSet import PlayerPet import PetControl import PyGameData import ShareDefine import PlayerHorse import IPY_GameWorld import PlayerControl import OperControlManager import PlayerViewCacheTube import PassiveBuffEffMng import ChNetSendPack import IpyGameDataPY import AttackCommon import SkillCommon import PlayerState import SkillShell import CommFunc import PlayerFB import GameMap import FBLogic import GameObj import time class MirrorBattle(): ## ij³¡Õ½¶· def __init__(self): self.Clear() return def Clear(self): self.isSysbg = False # ÊÇ·ñϵͳºǫ́½øÐÐÕ½¶·µÄ£¬Íæ¼ÒÎÞ¸ÐÖª£¬½öÖªµÀ½á¹û self.requestID = 0 # ÇëÇóID£¬Ò»°ãÊÇÍæ¼ÒID»òÕßϵͳ×Ô¶¨µÄID£¬Èçijһ³¡PKµÄ±êʶÐÅÏ¢ self.playerID = 0 # ËùÊôÍæ¼ÒID£¬¿ÉÄÜΪ0 self.battleID = 0 # ¸Ã³¡Õ½¶·µÄID£¬Ò»°ãÍæ¼Ò·¢ÆðµÄΪplayerID£¬ÏµÍ³·¢ÆðµÄΪ´óÓÚÊ®ÒÚµÄÖµ£¬¼´ 1000000000 + ¸Ãϵͳ³¡´Î¶ÔÓ¦¹¦ÄÜÖµ self.mapID = 0 # ¹¦ÄÜmapID£¬´ú±íijһ¸ö¹¦ÄÜ self.funcLineID = 0 self.batState = 0 # ״̬£º0-ÎÞ£»1-×¼±¸ÖУ»2-Õ½¶·ÖУ»3-¿ìËÙ½áÊøÖУ¬4-½áÊø self.startTick = 0 # ¿ªÊ¼Õ½¶·tick self.fightTickMax = 0 # Õ½¶·×î´óʱ³¤£¬tick self.fightTickRemain = 0 # Ê£ÓàÕ½¶·Ê±³¤£¬tick self.mirrorIDDict = {} # ¸Ã³¡ËùÓÐÍæ¼Ò¾µÏñʵÀýID¶ÔÓ¦ÕæÊµID {playerID:realPlayerID, ...} self.realIDDict = {} # ¸Ã³¡ËùÓÐÕæÊµÍæ¼Ò¶ÔÓ¦³õʼÐÅÏ¢ {playerID:{k:v, ...}, ...} self.playerFactionDict = {} # ¸Ã³¡ËùÓÐÍæ¼ÒÕóÓªÐÅÏ¢£¬ÕæÊµÍæ¼Ò+¾µÏñÍæ¼Ò {playerID:faction, ...} self.playerAutoSkillInfo = {} # Íæ¼Ò×Ô¶¯Êͷż¼ÄÜÁбí {playerID:[skillTypeID, ...], ...} self.deadPlayerIDList = [] # Òѱ»»÷ɱµÄÍæ¼ÒIDÁбí self.tagPlayerIDList = [] # ¶ÔÊÖÕæÊµÍæ¼ÒIDÁбí self.isLogout = False # ÊÇ·ñÏÂÏßµÄ self.isQuick = False # ÊÇ·ñ¿ìËÙÕ½¶·½áÊøµÄ self.isWin = False # ÊÇ·ñ»ñʤ self.winFaction = 0 # »ñʤÕóÓª return def GetTagPlayerID(self): return self.tagPlayerIDList[0] if self.tagPlayerIDList else 0 def CaclFightTick(self, tick): ## ¼ÆËãÕ½¶·Ê±³¤£¬·µ»ØÊ£Óàʱ³¤tick fightTickCost = tick - self.startTick # ÒѹýÕ½¶·Ê±³¤ self.fightTickRemain = max(0, self.fightTickMax - fightTickCost) # Ê£ÓàÕ½¶·Ê±³¤ return self.fightTickRemain def AddBattlePlayer(self, curPlayer, faction, posX=0, posY=0): playerID = curPlayer.GetPlayerID() realPlayerID = curPlayer.GetRealPlayerID() if realPlayerID: self.mirrorIDDict[playerID] = realPlayerID else: self.realIDDict[playerID] = {"SightLevel":curPlayer.GetSightLevel(), "Faction":curPlayer.GetFaction(), "PosX":curPlayer.GetPosX(), "PosY":curPlayer.GetPosY()} self.playerFactionDict[playerID] = faction curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleID, self.battleID) if posX and posY: curPlayer.ResetPos(posX, posY) curPlayer.SetCanAttack(True) curPlayer.SetFaction(faction) PlayerControl.SetPlayerSightLevel(curPlayer, self.battleID) # ÊÓÒ°²ã¼¶Ä¬ÈÏΪս³¡ID£¬Ã¿³¡Õ½¶·µÄÍæ¼Ò¶ÀÁ¢ÊÓÒ° GameObj.SetHPFull(curPlayer) # »ØÂúѪ SkillCommon.ResetAllSkillCD(curPlayer) # ÖØÖü¼ÄÜCD return def GetPlayerAutoUseSkillList(self, curPlayer): playerID = curPlayer.GetPlayerID() if playerID in self.playerAutoSkillInfo: return self.playerAutoSkillInfo[playerID] # J.¼¼ÄÜ´îÅä±í.xlsx ÅäÖõļ¼ÄÜ job = curPlayer.GetJob() defaultSkillList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetSkillMatchCount()): ipyData = ipyDataMgr.GetSkillMatchByIndex(index) skills = ipyData.GetSkills() if job > len(skills): continue defaultSkillList.append(skills[job - 1]) playerSetting = curPlayer.GetSetting() autoUseSkillList = CommFunc.ParseSetting_AutoSkillList(playerSetting, defaultSkillList) curJobCommAtkSkillIDList = IpyGameDataPY.GetFuncEvalCfg("JobFitterSkill", job) # ÆÕ¹¥·Å×îºó for commSkillID in curJobCommAtkSkillIDList: autoUseSkillList.append(commSkillID) GameWorld.DebugLog("¼ÓÔØÍæ¼ÒÉèÖõÄ×Ô¶¯¼¼ÄÜ: %s" % autoUseSkillList, playerID) self.playerAutoSkillInfo[playerID] = autoUseSkillList return autoUseSkillList def AddMirrorBattle(battleID, mapID=0, funcLineID=0, requestID=0, isSysbg=False, playerID=0): ## Ôö¼Ó¾µÏñÕ½¶·¹ÜÀí # @param battleID: Õ½¶·ID battle = None if battleID and battleID not in PyGameData.g_mirrorBattleDict: battle = MirrorBattle() battle.battleID = battleID battle.mapID = mapID battle.funcLineID = funcLineID battle.requestID = requestID battle.isSysbg = isSysbg battle.playerID = playerID PyGameData.g_mirrorBattleDict[battleID] = battle return battle def GetMirrorBattle(curPlayer): ## »ñÈ¡Íæ¼ÒʵÀýËùÊôµÄÕ½³¡ return GetMirrorBattleByID(curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleID)) def GetMirrorBattleByID(battleID): battle = None if battleID in PyGameData.g_mirrorBattleDict: battle = PyGameData.g_mirrorBattleDict[battleID] # ²»»áÖ´ÐУ¬½öΪÁË´úÂë±à¼­.ʱ³öÌáʾ if False: battle = MirrorBattle() return battle def ClearMirrorBattleByPlayer(curPlayer): ## Çå³ýÍæ¼Ò´´½¨µÄ¾µÏñÕ½¶· ClearMirrorBattleByID(curPlayer.GetPlayerID()) return def ClearMirrorBattleByID(battleID): ## Çå³ý¾µÏñÕ½¶· battle = PyGameData.g_mirrorBattleDict.pop(battleID, None) if not battle: return isSysbg = battle.isSysbg playerMgr = GameWorld.GetPlayerManager() tick = GameWorld.GetGameWorld().GetTick() # »ØÊÕ¾µÏñÍæ¼Ò for mirrorID in battle.mirrorIDDict.keys(): mirrorPlayer = playerMgr.FindPlayerByID(mirrorID) if mirrorPlayer: PlayerControl.DeleteMirror(mirrorPlayer, isSysbg) # ϵͳ³¡ÑÓ³Ù»ØÊÕ # ÖØÖÃÕæÊµÍæ¼Ò for playerID, info in battle.realIDDict.items(): curPlayer = playerMgr.FindPlayerByID(playerID) if not curPlayer: continue curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleID, 0) curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleTime, 0) if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie or GameObj.GetHP(curPlayer) <= 0: ChPlayer.PlayerRebornByType(curPlayer, ChConfig.rebornType_System, tick, isAddSuperBuff=False) if "PosX" in info: curPlayer.ResetPos(info["PosX"], info["PosY"]) # »Øµ½½øÈ¥Ç°µÄ×ø±ê curPlayer.SetFaction(0) PlayerControl.SetPlayerSightLevel(curPlayer, 0) GameObj.SetHPFull(curPlayer) # »ØÂúѪ SkillCommon.ResetAllSkillCD(curPlayer) # ÖØÖü¼ÄÜCD curPlayer.SetAttackTick(tick) ChPlayer.__Sync_ClientBuff(curPlayer) # ËùÊôÍæ¼Ò playerID = battle.playerID curPlayer = playerMgr.FindPlayerByID(playerID) if curPlayer: curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleID, 0) curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleTime, 0) return def CreateMirrorPlayer(battleID, mirrorPlayerID, mirrorPlayerData, posX=0, posY=0, faction=0, curPlayer=None): ''' ´´½¨¾µÏñÍæ¼Ò @param battleID: ËùÊôµÄÕ½¶·ID @param mirrorPlayerID: Ä¿±ê¾µÏñÍæ¼ÒID @param mirrorPlayerData: Ä¿±ê¾µÏñÍæ¼ÒÊý¾Ý @param curPlayer: Ö´Ðд´½¨µÄÍæ¼Ò ''' battle = GetMirrorBattleByID(battleID) if not battle: GameWorld.ErrLog("ûÓиþµÏñÕ½¶·ID£¬ÎÞ·¨´´½¨Íæ¼Ò¾µÏñ! battleID=%s" % battleID) return mapID = battle.mapID funcLineID = battle.funcLineID playerID = 0 if curPlayer: playerID = curPlayer.GetPlayerID() # playerDataΪbase64ºóµÄÊý¾Ý mirrorPlayer = GameWorld.GetGameWorld().CreateMirrorPlayer(mirrorPlayerData, posX, posY) if not mirrorPlayer: GameWorld.ErrLog("CreateMirrorPlayer mirrorPlayerID=%s,posX=%s,posY=%s,faction=%s" % (mirrorPlayerID, posX, posY, faction), playerID) return PlayerControl.SetCustomMap(mirrorPlayer, mapID, funcLineID) mirrorID = mirrorPlayer.GetID() realPlayerID = mirrorPlayer.GetRealPlayerID() dataFightPower = PlayerControl.GetFightPower(mirrorPlayer) GameWorld.DebugLog("CreateMirrorPlayer mirrorID=%s,realPlayerID=%s,mapID=%s,funcLineID=%s,posX=%s,posY=%s,faction=%s,dataFightPower=%s,,accID=%s" % (mirrorID, realPlayerID, mapID, funcLineID, posX, posY, faction, dataFightPower, mirrorPlayer.GetAccID()), playerID) if faction != 1: battle.tagPlayerIDList.append(realPlayerID) ChPlayer.InitPlayerPack(mirrorPlayer) PlayerHorse.PlayerRideHorseUp(mirrorPlayer, False, False) #ÊÇ·ñ¾µÏñÍæ¼Ò ÅÐ¶Ï mirrorPlayer.GetRealPlayerID()ÊÇ·ñΪ0 #python×Ô¼º´¦Àí£¬ÒÔÏÂÂß¼­£¬¿ÉÒÔÔÚDoPlayerLoginº¯Êý×îºó ÅжÏÊǾµÏñÍæ¼Òºóͳһ´¦Àí #index = mirrorPlayer.GetIndex() #tick = GameWorld.GetGameWorld().GetTick() #ChPlayer.PlayerLogin #PlayerEventCounter.GameServer_InitOK(index, tick) #ChPlayer.LoadMapOK(index, tick) #GameServerRefresh.GameSever_PlayerInitOK(index, tick) mirrorPlayer.SendToBServerServerInitOK() mirrorPlayer.SetMapLoadOK(True) #½«Íæ¼Ò·ÅÖÃÔÚÕâ¸öµØÍ¼ÉÏ mirrorPlayer.InitPos(mirrorPlayer.GetPosX(), mirrorPlayer.GetPosY()) #°ÑÍæ¼ÒÉèÖÃΪ³õʼ»¯³É¹¦×´Ì¬ mirrorPlayer.SetCanAttack(True) mirrorPlayer.SetCanMove(True) mirrorPlayer.SetIsNeedProcess(True) mirrorPlayer.SetInitOK(True) mirrorPlayer.EndLoadMap() mirrorPlayer.SetGameServerInitOK(True) #Ë¢±»¶¯¡¢ÊôÐÔ PassiveBuffEffMng.OnLoadMapGFPassive(mirrorPlayer) mirrorControl = PlayerControl.PlayerControl(mirrorPlayer) mirrorControl.ReCalcAllState() refreshFightPower = PlayerControl.GetFightPower(mirrorPlayer) if refreshFightPower != dataFightPower: GameWorld.ErrLog("CreateMirrorPlayer mirrorID=%s,realPlayerID=%s,dataFightPower=%s != refreshFightPower=%s" % (mirrorID, realPlayerID, dataFightPower, refreshFightPower), playerID) battle.AddBattlePlayer(mirrorPlayer, faction, posX, posY) #×îºóÉèÖÿɼû£¬Ë¢ÐÂÊÓÒ° mirrorPlayer.SetVisible(True) mirrorPlayer.RefreshView() #Áé³èÓÐЩÊôÐÔÈ¡Ö÷ÈËÍæ¼Ò£¬ËùÒÔÔÚÍæ¼ÒË¢ÍêÊôÐÔºó´¦Àí£¬Ò²±ØÐëÔÚÖ÷ÈËË¢ÐÂÊÓÒ°ºó´¦Àí£¬²»È»³öÏÖ·â°ü˳Ðò¿ÉÄܲ»¶Ô£¬µ¼ÖÂǰ¶ËÎÞ·¨ÏÔʾÁé³è PetControl.DoLogic_PetLoadMapOK(mirrorPlayer) if GameWorld.GetGameWorld().GetDebugLevel(): DebugLogPlayerInfo(mirrorPlayer) if playerID == realPlayerID: DebugLogPlayerInfo(curPlayer) return mirrorPlayer def DebugLogPlayerInfo(curPlayer): playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("-------------- DebugLogPlayerInfoÍæ¼ÒÐÅÏ¢ --------------", playerID) realPlayerID = curPlayer.GetRealPlayerID() posX = curPlayer.GetPosX() posY = curPlayer.GetPosY() sightLevel = curPlayer.GetSightLevel() GameWorld.DebugLog("realPlayerID=%s,posX=%s,posY=%s,sightLevel=%s" % (realPlayerID, posX, posY, sightLevel), playerID) GameWorld.DebugLog("ÉúÃü=%s/%s, »¤¶Ü=%s/%s" % (GameObj.GetHP(curPlayer), GameObj.GetMaxHP(curPlayer), PlayerControl.GetProDef(curPlayer), PlayerControl.GetMaxProDef(curPlayer)), playerID) # ÊôÐÔ attrInfo = "" for index in xrange(1, ChConfig.Def_Calc_AllAttrType_MAX): value = EffGetSet.GetValueByEffIndex(curPlayer, index) if value: attrInfo = "%s,%s=%s" % (attrInfo, index, value) GameWorld.DebugLog("AttrInfo=%s" % attrInfo, playerID) GameWorld.DebugLog("FightPower=%s" % (PlayerControl.GetFightPower(curPlayer)), playerID) # ¼¼ÄÜ skillDict = {} skillManager = curPlayer.GetSkillManager() for i in range(0 , skillManager.GetSkillCount()): curSkill = skillManager.GetSkillByIndex(i) if not curSkill: continue funcType = curSkill.GetFuncType() if funcType not in skillDict: skillDict[funcType] = {} skillInfo = skillDict[funcType] skillInfo[curSkill.GetSkillID()] = curSkill.GetSkillName() for funcType, skillInfo in skillDict.items(): skillIDList = skillInfo.keys() skillIDList.sort() GameWorld.DebugLog("Skill FuncType=%s,count=%s,%s" % (funcType, len(skillIDList), skillIDList), playerID) # ±»¶¯ passiveEff = PassiveBuffEffMng.GetPassiveEffManager().GetPassiveEff(curPlayer) if passiveEff: GameWorld.DebugLog("±»¶¯Ð§¹û £º%s" % passiveEff.AffectSkillDict, playerID) GameWorld.DebugLog("Ñ¡Öеı»¶¯¼¼ÄÜЧ¹û £º%s" % passiveEff.AffectPassiveSkillSetDict, playerID) GameWorld.DebugLog("±»¶¯BUFFЧ¹û £º%s" % passiveEff.AffectBuffDict, playerID) GameWorld.DebugLog("ÉñÊÞ±»¶¯Ð§¹û £º%s" % passiveEff.AffectDogzSkillDict, playerID) else: GameWorld.DebugLog("ÎÞ¼¼Äܱ»¶¯Ð§¹û!", playerID) fightPet = curPlayer.GetPetMgr().GetFightPet() if fightPet: GameWorld.DebugLog("³öÕ½³èÎï¼¼ÄÜ%s-%s" % PlayerPet.GetPetLearnSkill(curPlayer), playerID) passiveEff = PassiveBuffEffMng.GetPassiveEffManager().GetPassiveEff(fightPet) if passiveEff: GameWorld.DebugLog("³èÎï±»¶¯Ð§¹û £º%s" % passiveEff.AffectSkillDict, playerID) GameWorld.DebugLog("³èÎï±»¶¯BUFFЧ¹û £º%s" % passiveEff.AffectBuffDict, playerID) else: GameWorld.DebugLog("ÎÞ¼¼Äܱ»¶¯Ð§¹û!", playerID) # ÎïÆ· for packType in [IPY_GameWorld.rptEquip, ShareDefine.rptPet, ShareDefine.rptDogzEquip]: curPack = curPlayer.GetItemManager().GetPack(packType) itemCount = 0 for i in range(0, curPack.GetCount()): item = curPack.GetAt(i) if not item.GetItemTypeID(): continue itemCount += 1 #GameWorld.DebugLog("packType=%s,i=%s,itemID=%s,userData=%s" % (packType, i, item.GetItemTypeID(), item.GetUserData())) GameWorld.DebugLog("packType:%s,count=%s/%s" % (packType, itemCount, curPack.GetCount()), playerID) GameWorld.DebugLog("-------------------------------------------------------", playerID) return #// A1 09 ͬ²½´ò°üÍæ¼ÒÊý¾Ý #tagCMSycnPlayerPackData # #struct tagCMSycnPlayerPackData #{ # tagHead Head; #}; def OnSycnPlayerPackData(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, forcePackData=True) return #// B4 11 ¾µÏñÕ½¶· #tagCMMirrorFight # #struct tagCMMirrorFight #{ # tagHead Head; # DWORD MapID; // ×Ô¶¨ÒåµØÍ¼ID£¬È羺¼¼³¡µÈ # WORD FuncLineID; # DWORD TagPlayeID; // Ä¿±êÍæ¼ÒID£¬Ö§³Ö¿ç·þÍæ¼ÒID # BYTE CmdType; // ÃüÁîÀàÐÍ: 0-´´½¨Õ½¶·£»1-¿ªÊ¼Õ½¶·£»2-Õ½¶·ÖÐÌø¹ý£»3-²»´´½¨Õ½¶·Ö±½ÓµÃ½á¹û #}; def OnMirrorFight(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) mapID = clientData.MapID funcLineID = clientData.FuncLineID tagPlayeID = clientData.TagPlayeID cmdType = clientData.CmdType if not tagPlayeID: return playerID = curPlayer.GetPlayerID() #if tagPlayeID == playerID: # GameWorld.DebugLog("²»ÄÜ´ò×Ô¼º!", playerID) # return # ´´½¨Õ½¶·£¬Íæ¼Ò×ÔÉí²ÎÓë if cmdType == 0: isSysbg = False requestID = playerID posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY() battlePlayerList = [] battlePlayerList.append({"playerID":playerID, "faction":1, "posX":posX, "posY":posY}) battlePlayerList.append({"playerID":tagPlayeID, "faction":2, "posX":posX + 5, "posY":posY}) OnRequestCreateMirrorBattle(mapID, funcLineID, requestID, battlePlayerList, isSysbg, curPlayer) return # ¿ªÊ¼Õ½¶· if cmdType == 1: battle = GetMirrorBattle(curPlayer) if battle: OnMirrorBattleStart(battle.battleID) return # Õ½¶·ÖÐÌø¹ý if cmdType == 2: battle = GetMirrorBattle(curPlayer) if battle: DoMirrorBattleQuick(battle.battleID, isClick=True) return # ²»Õ½¶·Ö±½ÓÌø¹ý£¬¼´Íæ¼ÒûÓвÎÓ룬´´½¨ÏµÍ³Õ½¶·³¡£¬Ö®ºóÀ©Õ¹ if cmdType == 3: isSysbg = True requestID = playerID posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY() battlePlayerList = [] battlePlayerList.append({"playerID":playerID, "faction":1, "posX":posX, "posY":posY}) battlePlayerList.append({"playerID":tagPlayeID, "faction":2, "posX":posX + 5, "posY":posY}) OnRequestCreateMirrorBattle(mapID, funcLineID, requestID, battlePlayerList, isSysbg, curPlayer) return # ¿É²»×öÑéÖ¤£¬PK½áÊøºóÓɸ÷¸ö¹¦ÄÜ×ÔÐÐ×ö½áËãÑéÖ¤ return def OnPlayerLeaveMap(curPlayer): ## Íæ¼ÒÀ뿪µØÍ¼ if curPlayer.GetRealPlayerID(): return battle = GetMirrorBattle(curPlayer) if not battle: return # Èç¹û»¹ÔÚÕ½¶·ÖУ¬Ö±½Ó¿ìËÙÖ´ÐÐÕ½¶·½á¹û if battle.batState == ChConfig.Def_MirrorBatState_Fight: DoMirrorBattleQuick(battle.battleID, isLogout=True) # ͳһÍ˳ö if PlayerControl.GetCustomMapID(curPlayer): PlayerFB.DoExitCustomScene(curPlayer) return def OnRequestCreateMirrorBattle(mapID, funcLineID, requestID, battlePlayerList, isSysbg=False, curPlayer=None): ''' ÇëÇó´´½¨¾µÏñÕ½¶·£¬Ö§³Ö¶à¶Ô¶à£¬Ö§³Ö¿ç·þ£¬±¾·þ¿ç·þµØÍ¼Öоù¿ÉÖ±½ÓÇëÇó @param mapID: ¹¦ÄܵØÍ¼ID @param funcLineID: ¹¦ÄܵØÍ¼Ïß·ID @param requestID: ÇëÇóID£¬Èç¹ûÊÇÍæ¼Ò·¢ÆðµÄ£¬Ò»°ã´«ÈëÍæ¼ÒID£»Èç¹ûÊÇϵͳ·¢ÆðµÄ£¬ÓÉϵͳ×ÔÐоö¶¨£¬±ÈÈçroomIDÖ®Àà @param battlePlayerList: Õ½¶·µÄÍæ¼ÒÐÅÏ¢Áбí [{"playerID":Íæ¼ÒID, "posX":×ø±êx, "posY":×ø±êy, "faction":ÕóÓª}, ...] @param isSysbg: ÊÇ·ñºǫ́ս¶·£¬Ä¬ÈÏ·ñ£¬µ«ÊÇϵͳ·¢ÆðµÄĬÈÏÊÇ @param curPlayer: ·¢ÆðµÄÍæ¼Ò£¬Îª¿Õʱ´ú±íϵͳ·¢Æð´´½¨µÄ ''' playerID = 0 if curPlayer: if not FBLogic.OnMirrorBattleRequest(curPlayer, mapID, funcLineID): GameWorld.DebugLog("µ±Ç°²»ÔÊÐí¸Ã¾µÏñÕ½¶·ÇëÇó! mapID=%s,funcLineID=%s" % (mapID, funcLineID), playerID) return playerID = curPlayer.GetPlayerID() if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleID): GameWorld.DebugLog("¾µÏñÕ½¶·³¡¾°ÖУ¬ÎÞ·¨ÇëÇó!", playerID) return curTime = int(time.time()) # ÇëÇócdÑéÖ¤ requestTime = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleTime) if requestTime and (curTime - requestTime) <= 20: # 20ÃëÄÚ²»Öظ´ÇëÇó PlayerControl.NotifyCode(curPlayer, "RequestLater") return curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleTime, curTime) else: isSysbg = True # ϵͳ·¢ÆðµÄĬÈϺǫ́ս¶· mirrorIDList = [] for battleInfo in battlePlayerList: batPlayerID = battleInfo["playerID"] faction = battleInfo["faction"] if batPlayerID == playerID and faction == 1 and not isSysbg: # ×Ô¼º²»Óã¬Ê¹ÓÃ×ÔÉí½øÐÐÕ½¶·¼´¿É continue if batPlayerID not in mirrorIDList: mirrorIDList.append(batPlayerID) # Õ½¶·Ïà¹ØµÄÊý¾Ý msgData = {"mapID":mapID, "funcLineID":funcLineID, "battlePlayerList":battlePlayerList, "isSysbg":isSysbg} # ·¢ËÍGameServerÇëÇóÍæ¼Ò´ò°üÊý¾Ý requestTime = curTime # ÇëÇóµÄʱ¼ä´Á£¬Ã¿¸öÍæ¼Ò×î¶àÔÊÐíͬʱ´æÔÚÒ»³¡Õ½¶·£¬Ã¿´ÎÖØÐÂÇëÇóºó¸²¸ÇÊý¾Ý requestMapID = GameWorld.GetGameWorld().GetRealMapID() sendMsg = str({"msgType":"MirrorBattle", "msgData":msgData, "mirrorIDList":mirrorIDList, "requestTime":requestTime, "requestID":requestID, "requestMapID":requestMapID, "playerID":playerID}) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "ReuestPlayerPackData", sendMsg, len(sendMsg)) GameWorld.DebugLog("ÇëÇó´´½¨¾µÏñÕ½¶·: %s" % sendMsg, playerID) return True def OnMirrorBattleInit(msgInfo, packDataDict, curPlayer=None): ''' ¾µÏñÕ½¶·³õʼ»¯ @param msgInfo: OnRequestCreateMirrorBattle ·¢ËÍGameServerµÄÐÅÏ¢ @param packDataDict: ·µ»ØÐèÒªµÄÍæ¼Ò´ò°üÊý¾Ý {playerID:packData, ...} @param curPlayer: Èç¹ûÊÇÍæ¼Ò·¢ÆðµÄÔò²»Îª¿Õ ''' requestID = msgInfo["requestID"] playerID = msgInfo.get("playerID", 0) msgData = msgInfo["msgData"] mapID = msgData.get("mapID", 0) funcLineID = msgData.get("funcLineID", 0) battlePlayerList = msgData.get("battlePlayerList", []) isSysbg = msgData.get("isSysbg", 0) # ϵͳºǫ́ս¶· battleID = 0 if isSysbg: sysBattleIDStart = 1000000000 # ϵͳ³¡´ÓÊ®ÒÚ¿ªÊ¼ for num in range(sysBattleIDStart, sysBattleIDStart + 1000): if num not in PyGameData.g_mirrorBattleDict: battleID = num break elif playerID: battleID = playerID battle = AddMirrorBattle(battleID, mapID, funcLineID, requestID, isSysbg, playerID) if not battle: GameWorld.ErrLog("¾µÏñÕ½³¡IDÒÑ´æÔÚ! battleID=%s,msgInfo=%s" % (battleID, msgInfo), requestID) return GameWorld.DebugLog("¾µÏñÕ½¶·³õʼ»¯: msgData=%s,packIDList=%s" % (msgData, packDataDict.keys()), battleID) for battleInfo in battlePlayerList: batPlayerID = battleInfo["playerID"] posX = battleInfo.get("posX", 0) posY = battleInfo.get("posY", 0) faction = battleInfo.get("faction", 0) if curPlayer and batPlayerID == playerID and faction == 1 and not isSysbg: battle.AddBattlePlayer(curPlayer, faction, posX, posY) continue packData = packDataDict.get(batPlayerID) if not packData: GameWorld.ErrLog("³õʼ»¯¾µÏñÕ½¶·Ê±Ã»ÓÐÍæ¼Ò¾µÏñÊý¾Ý! batPlayerID=%s" % batPlayerID, playerID) continue CreateMirrorPlayer(battleID, batPlayerID, packData, posX, posY, faction, curPlayer) battle.batState = ChConfig.Def_MirrorBatState_Prepare fightTimeLimitDict = IpyGameDataPY.GetFuncEvalCfg("MirrorAttack", 1, {}) battle.fightTickMax = fightTimeLimitDict.get(str(mapID), 60) * 1000 # ×î´óÕ½¶·Ê±³¤£¬Ä¬ÈÏ60Ãë if not isSysbg: return # ϵͳ³¡Ä¬ÈÏÖ±½Ó¿ªÊ¼¡¢¿ìËÙÕ½¶·½áÊø OnMirrorBattleStart(battleID) DoMirrorBattleQuick(battleID) return def OnMirrorBattleStart(battleID): ## ¾µÏñÕ½¶·¿ªÊ¼ battle = GetMirrorBattleByID(battleID) if not battle: return if battle.batState >= ChConfig.Def_MirrorBatState_Fight: return battle.batState = ChConfig.Def_MirrorBatState_Fight battle.startTick = GameWorld.GetGameWorld().GetTick() return def ProcessPlayerMirrorAI(curPlayer, tick): ## ¾µÏñÕ½¶·AI battle = GetMirrorBattle(curPlayer) if not battle: return playerID = curPlayer.GetPlayerID() if battle.batState != ChConfig.Def_MirrorBatState_Fight: #GameWorld.DebugLog("¾µÏñÍæ¼Ò½ö×ÔÓÉÕ½¶·×´Ì¬ÏÂÐèÒª´¦Àí! battleID=%s,batState=%s" % (battle.battleID, battle.batState), playerID) return if not battle.isQuick: realPlayerID = curPlayer.GetRealPlayerID() if not realPlayerID: # ³£¹æÕ½¶·Ï£¬ÕæÊµÍæ¼Ò²»´¦Àí£¬ÓÉÍæ¼Ò×ÔÐпØÖÆ # ÕæÊµÍæ¼Ò¸½¼ÓÅжÏÊÇ·ñPK³¬Ê± if battle.startTick and battle.CaclFightTick(tick) <= 0: OnMirrorAttackOver(battle.battleID) return if GameObj.GetHP(curPlayer) <= 0: #GameWorld.DebugLog("¾µÏñÍæ¼ÒÒѱ»»÷ɱ", playerID) return # ¹¥»÷¼ä¸ô if tick - curPlayer.GetPlayerAttackTick() < curPlayer.GetAtkInterval(): GameWorld.DebugLog("¹¥»÷¼ä¸ô: %s < %s" % (tick - curPlayer.GetPlayerAttackTick(), curPlayer.GetAtkInterval()), playerID) return autoUseSkillList = battle.GetPlayerAutoUseSkillList(curPlayer) GameWorld.DebugLog("¾µÏñAI¹¥»÷: autoUseSkillList=%s" % (autoUseSkillList), playerID) if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvHorse: PlayerHorse.PlayerRideHorseDown(curPlayer) isOK = False actionObj = PlayerState.__GetCanAttack_ObjDetel(curPlayer, tick) if actionObj: isOK = PlayerAttack(curPlayer, actionObj, tick, autoUseSkillList) if not isOK: curFaction = curPlayer.GetFaction() playerMgr = GameWorld.GetMapCopyPlayerManager() for batPlayerID, faction in battle.playerFactionDict.items(): if faction == curFaction: continue if actionObj and actionObj.GetID() == batPlayerID: continue tagObj = playerMgr.FindPlayerByID(batPlayerID) isOK = PlayerAttack(curPlayer, tagObj, tick, autoUseSkillList) if isOK: break if isOK: # ÿ´Î´¦Àí½öÖ´ÐÐÒ»´Î³É¹¦ÐÐΪ return return def PlayerAttack(curPlayer, tagObj, tick, autoUseSkillList): ## Íæ¼Ò¹¥»÷£¬ ²Î¿¼¼¼ÄÜʹÓà #def UseSkillEx(index, clientData, tick): if not tagObj or GameObj.GetHP(tagObj) <= 0: return playerID = curPlayer.GetPlayerID() posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY() tagObjType, tagObjID = tagObj.GetGameObjType(), tagObj.GetID() tagPosX, tagPosY = tagObj.GetPosX(), tagObj.GetPosY() curPlayer.SetActionObj(tagObj) curPlayer.ClearUseSkillRec() curPlayer.SetAttackTargetPos(posX, posY) curPlayer.SetUseSkillPosX(tagPosX) curPlayer.SetUseSkillPosY(tagPosY) curPlayer.SetUseSkillTagType(tagObjType) curPlayer.SetUseSkillTagID(tagObjID) needMoveto = False # ÓпÉÊͷŵļ¼ÄÜÓÅÏÈÊͷż¼ÄÜ£¬Ã»ÓеϰÔÙÒÆ¶¯ useSkillResult = False skillMgr = curPlayer.GetSkillManager() for skillTypeID in autoUseSkillList: curSkill = skillMgr.FindSkillBySkillTypeID(skillTypeID) if not curSkill: continue skillID = curSkill.GetSkillID() #CheckSkillCondition #±»¶¯¼¼ÄÜÎÞ·¨Ê¹Óà if SkillCommon.isPassiveSkill(curSkill): continue #»¹ÔÚÀäȴʱ¼äÄÚÎÞ·¨ÊÍ·Å if SkillCommon.RefreshSkillRemainTime(curSkill, tick) != 0: continue if not AttackCommon.CheckPlayerAttackDist(curPlayer, tagObj, curSkill): needMoveto = True continue curPlayer.SetUseSkill(curSkill.GetSkillData()) useSkillData = curPlayer.GetUseSkill() if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick): GameWorld.DebugLog(" ¼¼Äܹ¥»÷ʧ°Ü: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) continue useSkillResult = True GameWorld.DebugLog(" ¼¼Äܹ¥»÷³É¹¦: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) if useSkillData and useSkillData.GetSkillID() != ChConfig.Def_SkillID_Somersault: # ¸úËæÍæ¼ÒͬƵÂʹ¥»÷ PetControl.PetFight(curPlayer, tick) PlayerState.SummonFollowAtk(curPlayer, tick) break curPlayer.ClearUseSkillRec() if useSkillResult: curPlayer.SetAttackTick(tick) else: if needMoveto: MoveToObj(curPlayer, tagObj, tick) return return useSkillResult def MoveToObj(curPlayer, tagObj, tick): #²»¿ÉÒÆ¶¯ÐÐΪ״̬, ·þÎñ¶ËÏÞÖÆ if not OperControlManager.IsObjCanDoAction(curPlayer, ChConfig.Def_Obj_ActState_ServerAct, IPY_GameWorld.oalMove): return destX = tagObj.GetPosX() destY = tagObj.GetPosY() # ËõСÁ½¸ñ×ÓÓÃÓÚǰ·½Ò»Ð¡Æ¬ÇøÓò resultPos = GameMap.GetEmptyPlaceInArea(destX, destY, 1) moveDestX = resultPos.GetPosX() moveDestY = resultPos.GetPosY() if (tick - curPlayer.GetDictByKey("MoveTick")) < 1000: # .Move( ½Ó¿Úµ÷ÓÃÌ«¿ì»áµ¼ÖÂÒÆ¶¯Ê±¼ä²»¹»³¤(²»×ãÒ»¸ñ)µ¼ÖÂÎÞ·¨Òƶ¯ »òÕßÒÆ¶¯¹ýÂýÎÊÌâ # SetDestPos µ÷ÓûᵼÖ·´ÏòÒÆ¶¯Æ«¿ì #curPlayer.SetDestPos(moveDestX, moveDestY) return curPlayer.SetDict("MoveTick", tick) #return curPlayer.Move(moveDestX, moveDestY) # Ö´ÐÐÒ»´ÎÖØÖÃλÖ㬱ÜÃâ¿ìËÙ·¢°üµ¼ÖÂÎÞ·¨Òƶ¯ curPlayer.ChangePos(moveDestX, moveDestY) sendPack = ChNetSendPack.tagObjMove() sendPack.Clear() sendPack.ObjID = curPlayer.GetID() sendPack.ObjType = IPY_GameWorld.gotNPC sendPack.MoveType = IPY_GameWorld.gotPlayer sendPack.DestPosX = moveDestX sendPack.DestPosY = moveDestY sendPack.Speed = curPlayer.GetSpeed() sendPack.StartPosX = curPlayer.GetPosX() sendPack.StartPosY = curPlayer.GetPosY() curPlayer.NotifyAll(sendPack.GetBuffer(), sendPack.GetLength()) return def DoMirrorBattleQuick(battleID, isLogout=False, isClick=False): ## Ö´ÐпìËÙÕ½¶· battle = GetMirrorBattleByID(battleID) if not battle: return if battle.batState > ChConfig.Def_MirrorBatState_Fight: return if battle.isQuick: #²»Öظ´´¥·¢´¦Àí return mapID = battle.mapID if not battle.isSysbg: if isClick: quickLimitMapIDList = IpyGameDataPY.GetFuncEvalCfg("MirrorAttack", 2) if mapID in quickLimitMapIDList: GameWorld.DebugLog("Õ½¶·Öв»ÔÊÐíµã»÷¿ìËÙÕ½¶·! mapID=%s" % mapID, battle.playerID) return if isLogout: logoutQuickLimitMapIDList = IpyGameDataPY.GetFuncEvalCfg("MirrorAttack", 3) if mapID in logoutQuickLimitMapIDList: GameWorld.DebugLog("µôÏß²»ÔÊÐí¿ìËÙÕ½¶·! mapID=%s" % mapID, battle.playerID) return tick = GameWorld.GetGameWorld().GetTick() battle.batState = ChConfig.Def_MirrorBatState_Fight battle.isQuick = True battle.isLogout = isLogout battle.CaclFightTick(tick) playerMgr = GameWorld.GetMapCopyPlayerManager() perLoopTick = 100 # ÿ´ÎÑ­»·ÊÓΪÒѹýºÁÃë maxLoopCount = battle.fightTickRemain / perLoopTick # Ñ­»·´ÎÊýÉÏÏÞ GameWorld.DebugLog("DoMirrorBattleQuick isLogout=%s,maxLoopCount=%s,tick=%s,fightTickRemain=%s" % (isLogout, maxLoopCount, tick, battle.fightTickRemain), battleID) # ÆÁ±Î·¢°ü for batPlayerID in battle.realIDDict.keys(): curPlayer = playerMgr.FindPlayerByID(batPlayerID) if not curPlayer: continue curPlayer.SetForbiddenSyncClientState(True) for loopCount in range(maxLoopCount): if battle.batState != ChConfig.Def_MirrorBatState_Fight: # ¿ÉÄÜ»¹Ã»Ñ­»·Íê±Ï¾Í½áÊøÁË break tick += perLoopTick # ÐÞ¸Äÿ´ÎÑ­»·µÄtick battle.CaclFightTick(tick) GameWorld.DebugLog(" loopCount=%s,tick=%s,fightTickRemain=%s" % (loopCount, tick, battle.fightTickRemain), battleID) for batPlayerID in battle.playerFactionDict.keys(): if batPlayerID in battle.deadPlayerIDList: continue curPlayer = playerMgr.FindPlayerByID(batPlayerID) if not curPlayer or GameObj.GetHP(curPlayer) <= 0: continue # ˢж¨Ê±´¦ÀíµÄbuffЧ¹û SkillShell.ProcessPersistBuff(curPlayer, tick) #Ë¢ÐÂÍæ¼ÒBuffʱ³¤ reFlashBuff = PlayerState.ProcessRefreshBuffState(curPlayer, tick) attrBuffResult, actBuffResult = PlayerState.ProcessRefreshActionBuffState(curPlayer, tick) playerControl = PlayerControl.PlayerControl(curPlayer) if actBuffResult: playerControl.RefreshPlayerActionState() #´Ë´¦²ÅÊÇÕæÕýµÄË¢ÐÂÈËÎïÊôÐÔÖµ£¬ÐèË¢ÊôÐÔÂß¼­Ó¦ÔÚ´ËÐÐǰµ÷Óà if not playerControl.RefreshPlayerAttrStateEx(): if reFlashBuff or attrBuffResult: playerControl.RefreshPlayerAttrByBuff() # ֻˢBUFFÇé¿ö playerControl.RefreshPlayerAttrByBuffEx() ProcessPlayerMirrorAI(curPlayer, tick) # ûÓлñʤ·½ if not battle.winFaction: GameWorld.DebugLog("ûÓл÷°Ü¶Ô·½ÕóÓª!", battleID) OnMirrorAttackOver(battleID) return True def OnPlayerDead(curPlayer): battleID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleID) if not battleID: return battle = GetMirrorBattleByID(battleID) if not battle: return playerID = curPlayer.GetPlayerID() curFaction = curPlayer.GetFaction() if playerID not in battle.deadPlayerIDList: battle.deadPlayerIDList.append(playerID) GameWorld.DebugLog("¾µÏñÕ½¶·Õ½³¡Íæ¼Ò±»»÷ɱ! playerID=%s,curFaction=%s,deadPlayerIDList=%s" % (playerID, curFaction, battle.deadPlayerIDList), battleID) winFaction = 0 for batPlayerID, faction in battle.playerFactionDict.items(): if faction != curFaction: winFaction = faction continue if batPlayerID not in battle.deadPlayerIDList: #GameWorld.DebugLog("ÏàͬÕóÓª»¹ÓÐδ±»»÷ɱµÄÍæ¼Ò£¡") return # ͬÕóÓª¶¼±»»÷ɱÁË£¬½áËãʤ¸º battle.winFaction = winFaction GameWorld.DebugLog("ijһÕóÓªÒѱ»»÷°Ü! winFaction=%s" % winFaction, battleID) OnMirrorAttackOver(battleID) return def OnMirrorAttackOver(battleID): battle = GetMirrorBattleByID(battleID) if not battle: return if battle.batState >= ChConfig.Def_MirrorBatState_Over: # ÒѾ­½áËã¹ý return battle.batState = ChConfig.Def_MirrorBatState_Over tick = GameWorld.GetGameWorld().GetTick() if not battle.fightTickRemain: battle.CaclFightTick(tick) # Ôݶ¨Ã»»÷ɱËãÊ䣬·¢Æð·½Îª1 if not battle.winFaction: battle.winFaction = 2 battle.isWin = 1 if battle.winFaction == 1 else 0 mapID = battle.mapID funcLineID = battle.funcLineID winFaction = battle.winFaction isQuick = battle.isQuick isLogout = battle.isLogout GameWorld.DebugLog("¾µÏñÕ½¶·½áÊø: mapID=%s,funcLineID=%s,winFaction=%s,isWin=%s,isQuick=%s,isLogout=%s" % (mapID, funcLineID, winFaction, battle.isWin, isQuick, isLogout), battleID) playerMgr = GameWorld.GetMapCopyPlayerManager() #¿ìËÙÕ½¶·½áÊøµÄ¶îÍâ´¦Àí if isQuick: for playerID in battle.realIDDict.keys(): curPlayer = playerMgr.FindPlayerByID(playerID) if not curPlayer: continue curPlayer.SetForbiddenSyncClientState(False) for playerID in battle.playerFactionDict.keys(): curPlayer = playerMgr.FindPlayerByID(playerID) if not curPlayer: continue # ÖØÐÂ֪ͨ×îÖÕѪÁ¿¼°×´Ì¬ GameObj.SetHP(curPlayer, GameObj.GetHP(curPlayer)) if playerID in battle.deadPlayerIDList: curPlayer.SetDead(curPlayer.GetDictByKey(ChConfig.Def_NPCDead_KillerID), curPlayer.GetDictByKey(ChConfig.Def_NPCDead_KillerType)) FBLogic.OnMirrorBattleOver(battleID, mapID) if battle.isSysbg: ClearMirrorBattleByID(battleID) return