From 29e50e39941eb7574580400c5bca21caa7ac80d4 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 12 八月 2025 18:34:23 +0800
Subject: [PATCH] 16 卡牌服务端(删除镜像战斗)

---
 /dev/null                                                                                              |   96 -------------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                             |   16 ---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                     |  112 ----------------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py            |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py |   12 --
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py              |   18 ---
 6 files changed, 0 insertions(+), 257 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 2b52d46..97bd84e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1795,22 +1795,6 @@
 PacketSubCMD_3=0x14
 PacketCallFunc_3=OnTurnFightReportView
 
-;镜像战斗
-[MirrorAttack]
-ScriptName = Attack\MirrorAttack.py
-Writer = hxp
-Releaser = hxp
-RegType = 0
-RegisterPackCount = 2
-
-PacketCMD_1=0xA1
-PacketSubCMD_1=0x09
-PacketCallFunc_1=OnSycnPlayerPackData
-
-PacketCMD_2=0xB4
-PacketSubCMD_2=0x11
-PacketCallFunc_2=OnMirrorFight
-
 ;仙树
 [PlayerTree]
 ScriptName = Player\PlayerTree.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index c1f70d4..0774adf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -45,7 +45,6 @@
 import GameObj
 import BuffSkill
 import PlayerState
-import MirrorAttack
 import ChPyNetSendPack
 import NPCHurtManager
 import NetPackCommon
@@ -2545,17 +2544,6 @@
         恶意攻击自己的玩家无论什么情况下都可反击,不用切换模式
     '''
     #关系有3层,无-友好-敌人
-    
-    #镜像PK下,无视PK区域、PK模式等,仅验证双方是否同一阵营
-    curBattleID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleID)
-    tagBattleID = tagPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleID)
-    if curBattleID and curBattleID == tagBattleID:
-        battle = MirrorAttack.GetMirrorBattleByID(curBattleID)
-        if battle.batState != ChConfig.Def_MirrorBatState_Fight:
-            return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_None
-        if curPlayer.GetFaction() != tagPlayer.GetFaction():
-            return ChConfig.Type_Relation_Enemy , ChConfig.Def_PASysMessage_None
-        return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_None
     
     #判断是否可释放(增/减)技能或普攻
     if CheckPlayersRelationInFB_IsNone(curPlayer, tagPlayer):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/MirrorAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/MirrorAttack.py
deleted file mode 100644
index deef9bb..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/MirrorAttack.py
+++ /dev/null
@@ -1,1104 +0,0 @@
-#!/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 PassiveBuffEffMng
-import GameWorldProcess
-import ChNetSendPack
-import IpyGameDataPY
-import AttackCommon
-import SkillCommon
-import PlayerState
-import SkillShell
-import CommFunc
-import FBCommon
-import GameMap
-import FBLogic
-import GameObj
-
-import time
-import math
-
-Def_StateTimeList = [3, 60, 10] # 默认阶段时长,秒
-Mirror_StartMoveTick = "Mirror_StartMoveTick"
-
-class MirrorBattle():
-    ## 某场战斗
-    
-    def __init__(self):
-        self.Clear()
-        return
-    
-    def Clear(self):
-        self.isChangeMap = 0 # 是否切图战斗的
-        self.isSysbg = False # 是否系统后台进行战斗的,玩家无感知,仅知道结果
-        self.requestID = 0 # 请求ID,一般是玩家ID或者系统自定的ID,如某一场PK的标识信息
-        self.playerID = 0 # 所属玩家ID,可能为0
-        self.battleID = 0 # 该场战斗的ID,一般玩家发起的为playerID,系统发起的为大于十亿的值,即 1000000000 + 该系统场次对应功能值
-        self.mapID = 0 # 功能mapID,代表某一个功能
-        self.funcLineID = 0
-        self.batState = 0 # 状态:0-无;1-准备中;2-战斗中;3-快速结束中,4-结束
-        self.stateTick = 0 # 阶段状态变更时tick
-        self.stateTickRemain = 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 # 获胜阵营
-        # 结算时血量明细
-        self.curHP = 0
-        self.curHPMax = 0
-        self.tagHP = 0
-        self.tagHPMax = 0
-        return
-    
-    def GetTagPlayerID(self): return self.tagPlayerIDList[0] if self.tagPlayerIDList else 0
-    
-    def SyncFBStepTime(self, tick):
-        #curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)
-        if self.isSysbg:
-            return
-        self.CaclStateTick(tick)
-        state = self.batState
-        if state == ChConfig.Def_MirrorBatState_Prepare:
-            self.__SyncRealPlayerTick(ChConfig.tttWaitStart, self.stateTickRemain)
-        elif state == ChConfig.Def_MirrorBatState_Fight:
-            self.__SyncRealPlayerTick(ChConfig.tttTowerTake, self.stateTickRemain)
-        elif state == ChConfig.Def_MirrorBatState_Over:
-            self.__SyncRealPlayerTick(ChConfig.tttLeaveMap, self.stateTickRemain)
-        return
-    
-    def __SyncRealPlayerTick(self, msgType, msgTick):
-        playerMgr = GameWorld.GetMapCopyPlayerManager()
-        for playerID in self.realIDDict.keys():
-            curPlayer = playerMgr.FindPlayerByID(playerID)
-            if not curPlayer:
-                continue
-            curPlayer.Sync_TimeTick(msgType, 0, msgTick, True)
-        return
-    
-    def ChangeBattleState(self, state, tick):
-        GameWorld.DebugLog("镜像战斗阶段变更: mapID=%s,state=%s" % (self.mapID, state), self.battleID)
-        self.batState = state
-        self.stateTick = tick        
-        self.stateTickRemain = self.GetStateTickMax()
-        self.SyncFBStepTime(tick)
-        FBCommon.SetFBStep(state, tick)
-        return
-        
-    def CaclStateTick(self, tick):
-        ## 计算状态时长,返回剩余时长tick
-        stateTickMax = self.GetStateTickMax()
-        passTick = tick - self.stateTick # 已过时长
-        self.stateTickRemain = max(0, stateTickMax - passTick) # 剩余时长
-        return self.stateTickRemain
-    
-    def GetStateTickRemain(self): return self.stateTickRemain
-    def GetStateTickMax(self):
-        fightTimeLimitDict = IpyGameDataPY.GetFuncEvalCfg("MirrorAttack", 1, {})
-        stateTimeList = fightTimeLimitDict.get(self.mapID, []) # 阶段时长列表
-        if not stateTimeList or len(stateTimeList) != 3:
-            stateTimeList = Def_StateTimeList
-            
-        state = self.batState
-        stateTime = 0
-        if state == ChConfig.Def_MirrorBatState_Prepare:
-            stateTime = stateTimeList[0]
-        elif state == ChConfig.Def_MirrorBatState_Fight:
-            stateTime = stateTimeList[1]
-        elif state == ChConfig.Def_MirrorBatState_Over:
-            stateTime = stateTimeList[2]
-        return stateTime * 1000
-    
-    def CalcHPPer(self):
-        ## 结算当前阶段双方阵营剩余血量占比,一般用于结算计算
-        curHPPer = round(self.curHP / float(self.curHPMax) * 100, 2)
-        tagHPPer = round(self.tagHP / float(self.tagHPMax) * 100, 2)
-        return curHPPer, tagHPPer
-    def CalcRemainTimePer(self):
-        ## 结算当前阶段剩余时间占比,一般用于结算计算
-        remainTimePer = round(self.stateTickRemain / float(self.GetStateTickMax()) * 100)
-        return remainTimePer
-    
-    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()}
-        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,每场战斗的玩家独立视野
-        PlayerControl.SetSight(curPlayer, ChConfig.Def_PlayerSight_Default * 3)
-        GameObj.SetHPFull(curPlayer) # 回满血
-        PlayerControl.SetProDef(curPlayer, PlayerControl.GetMaxProDef(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):
-    ## 获取玩家实例所属的战场
-    if curPlayer.GetRealPlayerID():
-        return GetMirrorBattleByID(curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleID))
-    return GetMirrorBattleByID(curPlayer.GetPlayerID())
-
-def GetMirrorBattleByID(battleID):
-    battle = None
-    if battleID in PyGameData.g_mirrorBattleDict:
-        battle = PyGameData.g_mirrorBattleDict[battleID]
-    # 不会执行,仅为了代码编辑.时出提示
-    if False:
-        battle = MirrorBattle()
-    return battle
-
-def ClearMirrorBattleByID(battleID):
-    ## 清除镜像战斗
-    battle = PyGameData.g_mirrorBattleDict.pop(battleID, None)
-    if not battle:
-        return
-    ownerPlayerID = battle.playerID
-    isSysbg = battle.isSysbg
-    isQuick = battle.isQuick
-    GameWorld.DebugLog("清除镜像战斗: battleID=%s,ownerPlayerID=%s,isSysbg=%s,isQuick=%s" % (isSysbg, ownerPlayerID, isSysbg, isQuick), battleID)
-    playerMgr = GameWorld.GetPlayerManager()
-    tick = GameWorld.GetGameWorld().GetTick()
-    
-    # 回收镜像玩家
-    for mirrorID in battle.mirrorIDDict.keys():
-        mirrorPlayer = playerMgr.FindPlayerByID(mirrorID)
-        if mirrorPlayer:
-            PlayerControl.DeleteMirror(mirrorPlayer, isSysbg) # 系统场延迟回收
-            
-    # 重置真实玩家
-    for realPlayerID, info in battle.realIDDict.items():
-        curPlayer = playerMgr.FindPlayerByID(realPlayerID)
-        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)
-        curPlayer.SetFaction(info.get("Faction", 0))
-        PlayerControl.SetPlayerSightLevel(curPlayer, info.get("SightLevel", 0))
-        PlayerControl.SetSight(curPlayer, ChConfig.Def_PlayerSight_Default)
-        
-        if not isQuick:
-            continue
-        
-        GameObj.SetHPFull(curPlayer) # 回满血
-        PlayerControl.SetProDef(curPlayer, PlayerControl.GetMaxProDef(curPlayer))
-        SkillCommon.ResetAllSkillCD(curPlayer) # 重置技能CD
-        curPlayer.SetAttackTick(tick)
-        ChPlayer.__Sync_ClientBuff(curPlayer)
-        
-    # 所属玩家
-    curPlayer = playerMgr.FindPlayerByID(ownerPlayerID)
-    if curPlayer:
-        curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleID, 0)
-        curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleTime, 0)
-        
-    # 如果是真实地图战斗的,关闭副本
-    if battle.isChangeMap:
-        GameWorldProcess.CloseFB(GameWorld.GetGameWorld().GetTick())
-    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
-    if not battle.isChangeMap:
-        PlayerControl.SetCustomMap(mirrorPlayer, mapID, funcLineID)
-    else:
-        PlayerControl.SetCustomMap(mirrorPlayer, 0, 0)        
-    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)
-    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()
-    faction = curPlayer.GetFaction()
-    sightLevel = curPlayer.GetSightLevel()
-    sight = curPlayer.GetSight()
-    GameWorld.DebugLog("realPlayerID=%s,posX=%s,posY=%s,faction=%s,sightLevel=%s,sight=%s" 
-                       % (realPlayerID, posX, posY, faction, sightLevel, sight), 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:
-        OnRequestCreateMirrorBattle(mapID, funcLineID, playerID, [[playerID], [tagPlayeID]], False, curPlayer, True)
-        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:
-        OnRequestCreateMirrorBattle(mapID, funcLineID, playerID, [[playerID], [tagPlayeID]], True, curPlayer)
-        return
-    
-    # 可不做验证,PK结束后由各个功能自行做结算验证
-    return
-
-def OnRequestCreateMirrorBattle(mapID, funcLineID, requestID, factionPlayerList, isSysbg=False, curPlayer=None, isChangeMap=False):
-    ''' 请求创建镜像战斗,支持多对多,支持跨服,本服跨服地图中均可直接请求
-    @param mapID: 功能地图ID
-    @param funcLineID: 功能地图线路ID
-    @param requestID: 请求ID,如果是玩家发起的,一般传入玩家ID;如果是系统发起的,由系统自行决定,比如roomID之类
-    @param factionPlayerList: 战斗的阵营玩家列表 [[阵营1玩家ID, ...], [阵营2玩家ID, ...]]
-    @param isSysbg: 是否后台战斗,默认否,但是系统发起的默认是
-    @param curPlayer: 发起的玩家,为空时代表系统发起创建的
-    @param isChangeMap: 是否切战斗场景地图
-    '''
-    
-    playerID = 0
-    curTime = int(time.time())
-    if curPlayer:
-        if GameWorld.IsCrossServer():
-            GameWorld.DebugLog("跨服服务器中不允许玩家镜像战斗请求!", playerID)
-            return
-        if not FBLogic.OnMirrorBattleRequest(curPlayer, mapID, funcLineID, factionPlayerList):
-            GameWorld.DebugLog("当前不允许该镜像战斗请求! mapID=%s,funcLineID=%s" % (mapID, funcLineID), playerID)
-            return
-        playerID = curPlayer.GetPlayerID()
-        if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleID):
-            GameWorld.DebugLog("镜像战斗场景中,无法请求!", playerID)
-            return
-        # 请求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 = [] # 需要使用镜像的玩家ID列表
-    for faction, batPlayerIDList in enumerate(factionPlayerList, 1):
-        for batPlayerID in batPlayerIDList:
-            if batPlayerID == playerID and faction == 1 and not isSysbg:
-                # 自己不用,使用自身进行战斗即可
-                continue
-            if batPlayerID not in mirrorIDList:
-                mirrorIDList.append(batPlayerID)
-                
-    # 战斗相关的数据
-    msgData = {"mapID":mapID, "funcLineID":funcLineID, "factionPlayerList":factionPlayerList, "isSysbg":isSysbg}
-    
-    # 发送GameServer请求玩家打包数据
-    requestTime = curTime # 请求的时间戳,每个玩家最多允许同时存在一场战斗,每次重新请求后覆盖数据
-    sceneMapID = GameWorld.GetGameWorld().GetRealMapID()
-    sendMsg = {"msgType":"MirrorBattle", "msgData":msgData, "mirrorIDList":mirrorIDList, 
-               "requestTime":requestTime, "requestID":requestID, "sceneMapID":sceneMapID, "playerID":playerID}
-    
-    if isChangeMap:
-        # 默认切到PK地图
-        sendMsg["isChangeMap"] = 1
-        PlayerControl.PlayerEnterFB(curPlayer, mapID, funcLineID, reqInfoEx=sendMsg)
-        return True
-    
-    # 玩家自身需要用镜像的情况
-    #if isSysbg and playerID and playerID in mirrorIDList:
-    #    PlayerViewCacheTube.NormalSyncPackData(curPlayer)
-        
-    sendMsg = str(sendMsg)
-    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "ReuestPlayerPackData", sendMsg, len(sendMsg))
-    GameWorld.DebugLog("请求创建镜像战斗: %s" % sendMsg, playerID)
-    return True
-
-def OnMirrorBattleEnterMapInit(curPlayer, tick):
-    ''' 镜像战斗初始化  - 需要切图的,玩家切图成功或地图收到打包数据同步时会触发,即这两个条件都准备好后才开始初始化
-    '''
-    if not curPlayer or curPlayer.IsEmpty() or not curPlayer.GetMapLoadOK():
-        return
-    
-    fbStep = GameWorld.GetGameFB().GetFBStep()
-    if fbStep != ChConfig.Def_MirrorBatState_Init:
-        GameWorld.ErrLog("镜像战斗该阶段已经不能初始化了! fbStep=%s" % fbStep, curPlayer.GetPlayerID())
-        return
-    
-    battle = GetMirrorBattle(curPlayer)
-    if battle:
-        GameWorld.DebugLog("镜像战斗玩家断线重连成功!", curPlayer.GetPlayerID())
-        curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleID, battle.battleID)
-        curPlayer.SetFaction(1)
-        PlayerControl.SetPlayerSightLevel(curPlayer, battle.battleID)
-        PlayerControl.SetSight(curPlayer, ChConfig.Def_PlayerSight_Default * 3)
-        battle.SyncFBStepTime(tick)
-        return
-    
-    playerID = curPlayer.GetPlayerID()
-    if playerID not in PyGameData.g_playerReqEnterFBEx:
-        return
-    reqInfo = PyGameData.g_playerReqEnterFBEx[playerID]
-    if not reqInfo or len(reqInfo) != 2:
-        return
-    msgInfo, packDataDict = reqInfo
-    OnMirrorBattleInit(msgInfo, packDataDict, curPlayer)
-    return
-
-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)
-    factionPlayerList = msgData.get("factionPlayerList", [])
-    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
-    battle.isChangeMap = msgInfo.get("isChangeMap", 0)
-    GameWorld.DebugLog("镜像战斗初始化: msgData=%s,packIDList=%s" % (msgData, packDataDict.keys()), battleID)
-    
-    factionPosList = OnGetMirrorBattlePos(mapID, funcLineID, isSysbg, curPlayer)
-    if not factionPosList:
-        return
-    for faction, batPlayerIDList in enumerate(factionPlayerList, 1):
-        posInfo = factionPosList[faction - 1]
-        factionPosX, factionPosY = posInfo
-        for index, batPlayerID in enumerate(batPlayerIDList):
-            posX, posY = factionPosX, factionPosY + index * 5
-            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)
-            
-    tick = GameWorld.GetGameWorld().GetTick()
-    battle.ChangeBattleState(ChConfig.Def_MirrorBatState_Prepare, tick)
-    
-    if not isSysbg:
-        return
-    
-    # 系统场默认直接开始、快速战斗结束
-    OnMirrorBattleStart(battleID)
-    DoMirrorBattleQuick(battleID)
-    ClearMirrorBattleByID(battleID)
-    return
-
-def OnGetMirrorBattlePos(mapID, lineID, isSysbg=False, curPlayer=None):
-    if isSysbg:
-        if curPlayer:
-            posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY()
-        else:
-            gameMap = GameWorld.GetMap()
-            posX, posY = gameMap.GetRebornMapX(), gameMap.GetRebornMapY() # 系统战斗默认取当前地图的复活点,需要优化
-        if not GameWorld.GetMap().CanMove(posX, posY):
-            GameWorld.ErrLog("镜像战斗创建坐标异常! posX=%s, posY=%s" % (posX, posY))
-            return
-        factionPosList = [[posX, posY], [posX, posY]]
-    else:
-        factionPosDict = IpyGameDataPY.GetFuncEvalCfg("MirrorAttack", 4, {})
-        factionPosList = factionPosDict.get(mapID, [[10, 7], [40,37]])
-    return factionPosList
-
-def OnMirrorBattleStart(battleID):
-    ## 镜像战斗开始
-    battle = GetMirrorBattleByID(battleID)
-    if not battle:
-        return
-    if battle.batState >= ChConfig.Def_MirrorBatState_Fight:
-        return
-    tick = GameWorld.GetGameWorld().GetTick()
-    battle.ChangeBattleState(ChConfig.Def_MirrorBatState_Fight, tick)
-    return
-
-def ProcessPlayerMirrorAI(curPlayer, tick):
-    ## 镜像战斗AI
-    battle = GetMirrorBattle(curPlayer)
-    if not battle:
-        return
-    
-    playerID = curPlayer.GetPlayerID()
-    realPlayerID = curPlayer.GetRealPlayerID()
-    if realPlayerID:
-        # 用第一个对手镜像玩家来定时判断战斗阶段,因为玩家自身可能会掉线,所以不用自己,而用镜像玩家
-        if realPlayerID == battle.GetTagPlayerID():
-            if battle.stateTick and battle.CaclStateTick(tick) <= 0:
-                if battle.batState == ChConfig.Def_MirrorBatState_Prepare:
-                    OnMirrorBattleStart(battle.battleID)
-                elif battle.batState == ChConfig.Def_MirrorBatState_Fight:
-                    OnMirrorAttackOver(battle.battleID)
-                elif battle.batState == ChConfig.Def_MirrorBatState_Over:
-                    ClearMirrorBattleByID(battle.battleID)
-    else:
-        # 常规战斗下,真实玩家不处理,由玩家自行控制
-        if not battle.isQuick:
-            return
-        
-    if battle.batState != ChConfig.Def_MirrorBatState_Fight:
-        #GameWorld.DebugLog("镜像玩家仅自由战斗状态下需要处理! battleID=%s,batState=%s" % (battle.battleID, battle.batState), playerID)
-        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
-    
-    PyGameData.g_singleAtkRecordList = []
-    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, battle.isQuick)
-        
-    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, battle.isQuick)
-            if isOK:
-                break
-            
-    PyGameData.g_singleAtkRecordList = None
-    if isOK:
-        # 每次处理仅执行一次成功行为
-        return
-    
-    return
-
-def PlayerAttack(curPlayer, tagObj, tick, autoUseSkillList, isQuick=False):
-    ## 玩家攻击, 参考技能使用 #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, True):
-            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, isQuick)
-            return
-        
-    curPlayer.SetDict(Mirror_StartMoveTick, 0)
-    return useSkillResult
-
-def MoveToObj(curPlayer, tagObj, tick, isQuick=False):
-    #不可移动行为状态, 服务端限制
-    if not OperControlManager.IsObjCanDoAction(curPlayer,
-                                               ChConfig.Def_Obj_ActState_ServerAct,
-                                               IPY_GameWorld.oalMove):
-        return
-    
-    curPosX, curPosY = curPlayer.GetPosX(), curPlayer.GetPosY()
-    destX = tagObj.GetPosX()
-    destY = tagObj.GetPosY()
-    # 缩小两格子用于前方一小片区域
-    resultPos = GameMap.GetEmptyPlaceInArea(destX, destY, 1)
-    moveDestX = resultPos.GetPosX()
-    moveDestY = resultPos.GetPosY()
-    
-    if isQuick:
-        curPlayer.ChangePos(moveDestX, moveDestY)
-        #GameWorld.DebugLog("---直接设置坐标: %s,%s to %s,%s, %s,%s" % (curPosX, curPosY, moveDestX, moveDestY, curPlayer.GetPosX(), curPlayer.GetPosY()), curPlayer.GetID())
-        return
-    
-    startMoveTick = curPlayer.GetDictByKey(Mirror_StartMoveTick)
-    if not startMoveTick:
-        curPlayer.SetDict(Mirror_StartMoveTick, tick)
-        #GameWorld.DebugLog("---设置开始移动: %s,%s to %s,%s, tick=%s" % (curPosX, curPosY, moveDestX, moveDestY, tick), curPlayer.GetID())
-        return
-    
-    speed = curPlayer.GetSpeed()
-    if not speed:
-        return
-    
-    interval = tick - startMoveTick
-    moveDist = interval / float(speed)
-    #GameWorld.DebugLog("---计算位移: moveDist=%s,speed=%s,interval=%s(%s-%s)" % (moveDist, speed, interval, tick, startMoveTick), curPlayer.GetID())
-    if moveDist <= 0:
-        return
-    
-    m_DestPosX, m_DestPosY = moveDestX, moveDestY
-    m_StartPosX, m_StartPosY = curPosX, curPosY
-    m_DestDist = GameWorld.GetDistEx(m_StartPosX, m_StartPosY, m_DestPosX, m_DestPosY, False)
-    updPosX = int(math.ceil(moveDist * (m_DestPosX - m_StartPosX) / m_DestDist + m_StartPosX))
-    updPosY = int(math.ceil(moveDist * (m_DestPosY - m_StartPosY) / m_DestDist + m_StartPosY))
-    
-    cDist = GameWorld.GetDistEx(curPosX, curPosY, updPosX, updPosY, False)
-    if cDist <= 1:
-        #GameWorld.DebugLog("--------------------暂不移动: cDist=%s,updPos(%s,%s),curPos(%s,%s),m_DestPos(%s,%s),m_DestDist=%s" 
-        #                   % (cDist, updPosX, updPosY, curPosX, curPosY, moveDestX, moveDestY, m_DestDist), curPlayer.GetID())
-        return
-    #GameWorld.DebugLog("--------------------更新坐标: cDist=%s,updPos(%s,%s),curPos(%s,%s),m_DestPos(%s,%s),m_DestDist=%s" 
-    #                   % (cDist, updPosX, updPosY, curPosX, curPosY, moveDestX, moveDestY, m_DestDist), curPlayer.GetID())
-    curPlayer.ChangePos(updPosX, updPosY)
-    curPlayer.SetDict(Mirror_StartMoveTick, tick)
-    
-    sendPack = ChNetSendPack.tagObjMove()
-    sendPack.Clear()
-    sendPack.ObjID = curPlayer.GetID()
-    sendPack.ObjType = curPlayer.GetGameObjType()
-    sendPack.MoveType = IPY_GameWorld.mtNormal
-    sendPack.DestPosX = updPosX
-    sendPack.DestPosY = updPosY
-    sendPack.Speed = speed
-    sendPack.StartPosX = curPosX
-    sendPack.StartPosY = curPosY
-    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
-    tick = GameWorld.GetGameWorld().GetTick()
-    battle.isQuick = True
-    battle.isLogout = isLogout
-    battle.CaclStateTick(tick)
-    
-    playerMgr = GameWorld.GetMapCopyPlayerManager()
-    perLoopTick = 100 # 每次循环视为已过毫秒
-    maxLoopCount = battle.stateTickRemain / perLoopTick # 循环次数上限
-    GameWorld.DebugLog("------------------------ 镜像PK快速结算 ------------------------", battleID)
-    GameWorld.DebugLog("镜像PK快速结算: isLogout=%s,maxLoopCount=%s,tick=%s,stateTickRemain=%s" 
-                       % (isLogout, maxLoopCount, tick, battle.stateTickRemain), 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
-        #GameWorld.DebugLog("    loopCount=%s,tick=%s,stateTickRemain=%s" % (loopCount, tick, battle.stateTickRemain), 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("某一阵营已被击败! 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
-    tick = GameWorld.GetGameWorld().GetTick()
-    if not battle.stateTickRemain:
-        battle.CaclStateTick(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))
-                
-    #统计明细
-    for playerID, faction in battle.playerFactionDict.items():
-        player = playerMgr.FindPlayerByID(playerID)
-        if not player:
-            continue
-        player.StopMove()
-        realPlayerID = player.GetRealPlayerID()
-        hp = GameObj.GetHP(player)
-        hpMax = GameObj.GetMaxHP(player)
-        fightPower = PlayerControl.GetFightPower(player)
-        
-        GameWorld.DebugLog("剩余血量: %s/%s, 护盾:%s/%s,playerID=%s,realPlayerID=%s,faction=%s,fightPower=%s" 
-                           % (hp, hpMax, PlayerControl.GetProDef(player), PlayerControl.GetMaxProDef(player), playerID, realPlayerID, faction, fightPower), battleID)
-        if faction == 1:
-            battle.curHP += hp
-            battle.curHPMax += hpMax
-        else:
-            battle.tagHP += hp
-            battle.tagHPMax += hpMax
-            
-    FBLogic.OnMirrorBattleOver(battleID, mapID)
-    
-    # 改变状态需放在最后
-    battle.ChangeBattleState(ChConfig.Def_MirrorBatState_Over, tick)
-    return
-
-def DoPlayerLeaveFB(curPlayer, tick):
-    ##玩家主动离开副本
-    if curPlayer.GetRealPlayerID():
-        return
-    battle = GetMirrorBattle(curPlayer)
-    if not battle:
-        return
-    GameWorld.DebugLog("玩家主动退出镜像战斗强制快速结算战斗!", curPlayer.GetPlayerID())
-    DoQuickOverByExit(curPlayer)
-    return
-
-def DoExitFB(curPlayer, tick):
-    ##玩家退出副本
-    if curPlayer.GetRealPlayerID():
-        return
-    battle = GetMirrorBattle(curPlayer)
-    if not battle:
-        return
-    # 退出时还有战场数据一般是掉线的,因为主动退出默认强制结算
-    mapID = battle.mapID
-    logoutQuickLimitMapIDList = IpyGameDataPY.GetFuncEvalCfg("MirrorAttack", 3)
-    if mapID in logoutQuickLimitMapIDList:
-        GameWorld.DebugLog("掉线不允许快速战斗! mapID=%s" % mapID, battle.playerID)
-        return
-    GameWorld.DebugLog("玩家掉线退出镜像战斗快速结算战斗!", curPlayer.GetPlayerID())
-    DoQuickOverByExit(curPlayer)
-    return
-
-def DoQuickOverByExit(curPlayer):
-    ## 执行退出快速结算
-    
-    battle = GetMirrorBattle(curPlayer)
-    if not battle:
-        return
-    
-    battleID = battle.battleID
-    if battle.batState < ChConfig.Def_MirrorBatState_Fight:
-        OnMirrorBattleStart(battleID) # 还未开始则强制开始
-        
-    # 如果还在战斗中,直接快速执行战斗结果
-    if battle.batState == ChConfig.Def_MirrorBatState_Fight:
-        DoMirrorBattleQuick(battle.battleID, isLogout=True)
-        
-    ClearMirrorBattleByID(battleID)        
-    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 59ee95e..f4abfca 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -673,54 +673,6 @@
 
 
 #------------------------------------------------------
-# A1 09 同步打包玩家数据 #tagCMSycnPlayerPackData
-
-class  tagCMSycnPlayerPackData(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xA1
-        self.SubCmd = 0x09
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xA1
-        self.SubCmd = 0x09
-        return
-
-    def GetLength(self):
-        return sizeof(tagCMSycnPlayerPackData)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// A1 09 同步打包玩家数据 //tagCMSycnPlayerPackData:
-                                Cmd:%s,
-                                SubCmd:%s
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd
-                                )
-        return DumpString
-
-
-m_NAtagCMSycnPlayerPackData=tagCMSycnPlayerPackData()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMSycnPlayerPackData.Cmd,m_NAtagCMSycnPlayerPackData.SubCmd))] = m_NAtagCMSycnPlayerPackData
-
-
-#------------------------------------------------------
 #A1 03 设置是否成年 #tagCMAdult
 
 class  tagCMAdult(Structure):
@@ -18976,70 +18928,6 @@
 
 m_NAtagCSMainFightReq=tagCSMainFightReq()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCSMainFightReq.Cmd,m_NAtagCSMainFightReq.SubCmd))] = m_NAtagCSMainFightReq
-
-
-#------------------------------------------------------
-# B4 11 镜像战斗 #tagCMMirrorFight
-
-class  tagCMMirrorFight(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("MapID", c_int),    # 自定义地图ID,如竞技场等
-                  ("FuncLineID", c_ushort),    
-                  ("TagPlayeID", c_int),    # 目标玩家ID,支持跨服玩家ID
-                  ("CmdType", c_ubyte),    # 命令类型: 0-创建战斗;1-开始战斗;2-战斗中跳过;3-不创建战斗直接得结果
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xB4
-        self.SubCmd = 0x11
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xB4
-        self.SubCmd = 0x11
-        self.MapID = 0
-        self.FuncLineID = 0
-        self.TagPlayeID = 0
-        self.CmdType = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagCMMirrorFight)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// B4 11 镜像战斗 //tagCMMirrorFight:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                MapID:%d,
-                                FuncLineID:%d,
-                                TagPlayeID:%d,
-                                CmdType:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.MapID,
-                                self.FuncLineID,
-                                self.TagPlayeID,
-                                self.CmdType
-                                )
-        return DumpString
-
-
-m_NAtagCMMirrorFight=tagCMMirrorFight()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMMirrorFight.Cmd,m_NAtagCMMirrorFight.SubCmd))] = m_NAtagCMMirrorFight
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PlayerMirror.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PlayerMirror.py
deleted file mode 100644
index 5b06d28..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PlayerMirror.py
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package GM.Commands.PlayerMirror
-#
-# @todo:创建玩家镜像进行战斗
-# @author hxp
-# @date 2024-10-17
-# @version 1.0
-#
-# 详细描述: 创建玩家镜像, 考虑地图人满问题,py可以做个预判,可调整地图配置的人数上限
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2024-10-17 15:00"""
-#-------------------------------------------------------------------------------
-
-import GameWorld
-import MirrorAttack
-import ChConfig
-
-## GM命令执行入口
-#  @param curPlayer 当前玩家
-#  @param paramList 参数列表 [玩家ID]
-#  @return None
-#  @remarks 函数详细说明.
-def OnExec(curPlayer, paramList):
-    if not paramList:
-        GameWorld.DebugAnswer(curPlayer, "-------------------%s" % GameWorld.GetCurrentDataTimeStr())
-        GameWorld.DebugAnswer(curPlayer, "后台战斗: PlayerMirror s [玩家ID1 ID2 ...]")
-        GameWorld.DebugAnswer(curPlayer, "切图战斗: PlayerMirror m [功能地图ID 线路 目标ID]")
-        GameWorld.DebugAnswer(curPlayer, "跳过战斗: PlayerMirror q")
-        GameWorld.DebugAnswer(curPlayer, "更新镜像: PlayerMirror 5")
-        GameWorld.DebugAnswer(curPlayer, "加假数据: PlayerMirror a 个数 [起始ID 战力 区服ID 模版key]")
-        GameWorld.DebugAnswer(curPlayer, "删假数据: PlayerMirror d")
-        #GameWorld.DebugAnswer(curPlayer, "导入数据: PlayerMirror i 模版key账号")
-        #GameWorld.DebugAnswer(curPlayer, "输出数据: PlayerMirror p [起始索引 个数 ]")
-        GameWorld.DebugAnswer(curPlayer, "多对多阵营分配ID为前后前后即AABB")
-        GameWorld.DebugAnswer(curPlayer, "后台战斗时ID阵营分配为[AABB]")
-        GameWorld.DebugAnswer(curPlayer, "切图战斗时ID阵营分配为[自己ABB]")
-        GameWorld.DebugAnswer(curPlayer, "玩家ID不填时默认自己跟自己打")
-        GameWorld.DebugAnswer(curPlayer, "模版key:在db/TestPackData文件夹下")
-        
-        return
-    
-    tick = GameWorld.GetGameWorld().GetTick()
-    playerID = curPlayer.GetPlayerID()
-    value1 = paramList[0]
-    if value1 == "s":
-        mapID = ChConfig.Def_FBMapID_MirrorBattle
-        lineID = 0
-        mirrorIDList = paramList[1:]
-        if not mirrorIDList:
-            mirrorIDList = [playerID, playerID]
-        elif len(mirrorIDList) == 1:
-            mirrorIDList = [playerID] + mirrorIDList
-            
-        reqPlayer = curPlayer if mirrorIDList[0] == playerID else None # 第一个ID是玩家ID时代表属于玩家发起的后台战斗
-        requestID = playerID if curPlayer else GameWorld.GetGameWorld().GetTick()
-        
-        factionIDListA, factionIDListB = [], []
-        while mirrorIDList:
-            factionIDListA.append(mirrorIDList.pop(0))
-            if mirrorIDList:
-                factionIDListB.append(mirrorIDList.pop(-1))
-        factionPlayerList = [factionIDListA, factionIDListB]
-        
-        if MirrorAttack.OnRequestCreateMirrorBattle(mapID, lineID, requestID, factionPlayerList, True, reqPlayer):
-            GameWorld.DebugAnswer(curPlayer, "后台战斗: %s VS %s" % (factionIDListA, factionIDListB))
-        else:
-            GameWorld.DebugAnswer(curPlayer, "后台战斗失败: %s VS %s" % (factionIDListA, factionIDListB))
-            
-    elif value1 == "m":
-        mapID = paramList[1] if len(paramList) > 1 else ChConfig.Def_FBMapID_MirrorBattle
-        lineID = paramList[2] if len(paramList) > 2 else 0
-        mirrorIDList = [playerID] + paramList[3:]
-        if len(mirrorIDList) < 2:
-            mirrorIDList.append(playerID) # 默认和自己打
-            
-        requestID = playerID
-        factionIDListA, factionIDListB = [], []
-        while mirrorIDList:
-            factionIDListA.append(mirrorIDList.pop(0))
-            if mirrorIDList:
-                factionIDListB.append(mirrorIDList.pop(-1))
-        factionPlayerList = [factionIDListA, factionIDListB]
-                
-        reqOK = MirrorAttack.OnRequestCreateMirrorBattle(mapID, lineID, requestID, factionPlayerList, False, curPlayer, True)
-        GameWorld.DebugAnswer(curPlayer, "切图战斗: %s VS %s, %s" % (factionIDListA, factionIDListB, reqOK))
-        
-    elif value1 == "q":
-        battle = MirrorAttack.GetMirrorBattle(curPlayer)
-        if battle:
-            if not MirrorAttack.DoMirrorBattleQuick(battle.battleID, isClick=True):
-                GameWorld.DebugAnswer(curPlayer, "无法执行快速战斗,详见地图日志!")
-                return
-            
-    elif value1 == 5:
-        #tick = GameWorld.GetGameWorld().GetTick()
-        #PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, forcePackData=True)
-        GameWorld.DebugAnswer(curPlayer, "已更新最新镜像缓存!")
-    elif value1 in ["a", "d", "p"]:
-        return True
-    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MirrorBattle.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MirrorBattle.py
deleted file mode 100644
index 14f30c4..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MirrorBattle.py
+++ /dev/null
@@ -1,210 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package GameWorldLogic.FBProcess.GameLogic_MirrorBattle
-#
-# @todo:镜像PK切磋
-# @author hxp
-# @date 2024-10-17
-# @version 1.0
-#
-# 详细描述: 镜像PK切磋
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2024-10-17 15:00"""
-#-------------------------------------------------------------------------------
-
-import ChConfig
-import ShareDefine
-import MirrorAttack
-import PlayerControl
-import IpyGameDataPY
-import PlayerCrossRealmPK
-import GameWorldProcess
-import CrossRealmPlayer
-import PlayerArena
-import GameWorld
-import FBCommon
-
-def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
-    return MirrorAttack.OnGetMirrorBattlePos(mapID, lineId)[0]
-
-def DoEnterFB(curPlayer, tick):
-    playerID = curPlayer.GetPlayerID()
-    GameWorld.Log("---------------- 镜像战斗DoEnterFB ----------------", playerID)
-    MirrorAttack.OnMirrorBattleEnterMapInit(curPlayer, tick)
-    return
-
-def DoExitFB(curPlayer, tick):
-    ##玩家退出副本
-    MirrorAttack.DoExitFB(curPlayer, tick)
-    return
-
-def DoPlayerLeaveFB(curPlayer, tick):
-    ##玩家主动离开副本
-    MirrorAttack.DoPlayerLeaveFB(curPlayer, tick)
-    return
-
-## 副本定时器
-def OnProcess(tick):
-    fbStep = GameWorld.GetGameFB().GetFBStep()
-
-    # 等待镜像初始化阶段
-    if fbStep == ChConfig.Def_MirrorBatState_Init:
-        if tick - GameWorld.GetGameFB().GetFBStepTick() < 20 * 1000:
-            return
-        FBCommon.SetFBStep(ChConfig.Def_MirrorBatState_Over, tick)
-        GameWorld.ErrLog("没有等到镜像创建,直接关闭副本!")
-        GameWorldProcess.CloseFB(tick)
-        
-    return
-
-def CheckPlayersRelation_IsFriend(curPlayer, curTagPlayer):
-    return not CanAttackPlayer(curPlayer, curTagPlayer)
-
-def CanAttackPlayer(curPlayer, curTagPlayer):
-    battle = MirrorAttack.GetMirrorBattle(curPlayer)
-    if not battle:
-        return
-        
-    if battle.batState != ChConfig.Def_MirrorBatState_Fight:
-        return
-    
-    if curTagPlayer:
-        if curPlayer.GetFaction() == curTagPlayer.GetFaction():
-            return
-            
-    return True
-
-##处理副本中杀死玩家逻辑
-def DoFBOnKill_Player(atkobj, defender, tick):
-    GameWorld.DebugLog("镜像切磋击杀玩家: defID=%s" % (defender.GetID()), atkobj.GetID())
-    return True
-
-def OnMirrorBattleRequest(curPlayer, mapID, funcLineID, factionPlayerList):
-    ## 镜像战斗请求
-    
-    if mapID == ChConfig.Def_FBMapID_CrossRealmPK:
-        return __CheckRequest_CrossRealmPK(curPlayer, mapID, funcLineID)
-    
-    if mapID == ChConfig.Def_FBMapID_CrossChampionship:
-        return __CheckRequest_CrossChampionship(curPlayer, mapID, funcLineID)
-    
-    return True
-
-def __CheckRequest_CrossRealmPK(curPlayer, mapID, funcLineID):
-    if not CrossRealmPlayer.IsCrossServerOpen():
-        PlayerControl.NotifyCode(curPlayer, "CrossMatching18")
-        return
-    if not PlayerCrossRealmPK.CheckCanMatch(curPlayer):
-        return
-    if not PlayerCrossRealmPK.CheckHavePKCount(curPlayer):
-        return
-    return True
-
-def __CheckRequest_CrossChampionship(curPlayer, mapID, funcLineID):
-    
-    playerID = curPlayer.GetPlayerID()
-    if not CrossRealmPlayer.IsCrossServerOpen():
-        PlayerControl.NotifyCode(curPlayer, "CrossMatching18")
-        return
-    
-    stateError = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossChampionshipStateError)
-    if stateError:
-        GameWorld.ErrLog("跨服排位状态已经异常无法进入! stateError=%s" % stateError, playerID)
-        return
-    
-    state = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossChampionshipState)
-    if state not in ShareDefine.CrossChampionshipEnterStateInfo:
-        GameWorld.ErrLog("当前状态非跨服排位战斗状态无法进入: state=%s" % state, playerID)
-        return
-    groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state]
-    reqGroupMark = funcLineID % 100
-    if reqGroupMark != groupMark:
-        GameWorld.ErrLog("当前状态与跨服排位战斗分组不一致无法进入: funcLineID=%s,reqGroupMark=%s != %s" % (funcLineID, reqGroupMark, groupMark), playerID)
-        return
-    
-    return True
-
-def OnMirrorBattleOver(battleID):
-    ## 镜像战斗结束
-    
-    battle = MirrorAttack.GetMirrorBattleByID(battleID)
-    if not battle:
-        GameWorld.DebugLog("镜像战斗结算时战场数据不存在!", battleID)
-        return
-    mapID = battle.mapID
-    funcLineID = battle.funcLineID
-    isWin = battle.isWin
-    curPlayerID = battle.playerID # 副本所属玩家ID,该玩家不一定参与实际战斗
-    tagPlayerID = battle.GetTagPlayerID()
-    curPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(curPlayerID)
-    if not curPlayer: # 防范GetMapCopyPlayerManager找不到的情况,不在1线,系统后台战斗默认在1线,非1线玩家请求的情况
-        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPlayerID)
-        
-    if not curPlayer:
-        GameWorld.DebugLog("镜像战斗结算时所属玩家不在线! curPlayerID=%s" % curPlayerID, battleID)
-        return
-    
-    if mapID == ChConfig.Def_FBMapID_ArenaBattle:
-        arenaPlayerID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleTagID)
-        if tagPlayerID == arenaPlayerID:
-            PlayerArena.SendGameServer_ArenaBattleOver(curPlayer, isWin)
-        else:
-            GameWorld.DebugLog("非竞技场对手不结算! tagPlayerID=%s,arenaPlayerID=%s" % (tagPlayerID, arenaPlayerID), curPlayerID)
-        return
-    
-    if mapID == ChConfig.Def_FBMapID_CrossRealmPK:
-        PlayerCrossRealmPK.SendPKOver(curPlayer, tagPlayerID, isWin)
-        return
-    
-    if mapID == ChConfig.Def_FBMapID_CrossChampionship:
-        __MirrorBattleOver_CrossChampionship(curPlayer, battle)
-        return
-    
-    giveItemList = []
-    overDict = {"isWin":isWin, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}
-    FBCommon.NotifyFBOver(curPlayer, mapID, funcLineID, isWin, overDict) 
-    return
-
-def __MirrorBattleOver_CrossChampionship(curPlayer, battle):
-    playerID = curPlayer.GetPlayerID()
-    mapID = battle.mapID
-    funcLineID = battle.funcLineID
-    isWin = battle.isWin
-    tagPlayerID = battle.GetTagPlayerID()
-    curHPPer, tagHPPer = battle.CalcHPPer()
-    remainTimePer = battle.CalcRemainTimePer()
-    
-    baseScoreList = IpyGameDataPY.GetFuncEvalCfg("CrossChamMirrorPK", 2)
-    baseScore = 0
-    if baseScoreList and len(baseScoreList) == 2:
-        baseScore = baseScoreList[0] if isWin else baseScoreList[1]
-    hpScore = int(eval(IpyGameDataPY.GetFuncCompileCfg("CrossChamMirrorPK", 3)))
-    GameWorld.DebugLog("    hpScore=%s,curHPPer=%s,tagHPPer=%s" % (hpScore, curHPPer, tagHPPer), playerID)
-    
-    timeScore = int(eval(IpyGameDataPY.GetFuncCompileCfg("CrossChamMirrorPK", 4)))
-    GameWorld.DebugLog("    timeScore=%s,remainTimePer=%s%%" % (timeScore, remainTimePer), playerID)
-    
-    addScore = baseScore + hpScore + timeScore
-    GameWorld.DebugLog("    addScore=%s,baseScore=%s" % (addScore, baseScore), playerID)
-    
-    pkCountMax = IpyGameDataPY.GetFuncCfg("CrossChamMirrorPK", 1)
-    playerID = curPlayer.GetPlayerID()
-    dataMsg = {
-               "playerID":playerID,
-               "tagPlayerID":tagPlayerID,
-               "funcLineID":funcLineID,
-               "isWin":isWin,
-               "addScore":addScore,
-               "baseScore":baseScore,
-               "hpScore":hpScore,
-               "timeScore":timeScore,
-               "pkCountMax":pkCountMax,
-               }
-    GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipPKOver, dataMsg)
-    overDict = {"isWin":isWin, "tagPlayerID":tagPlayerID, "addScore":addScore, "baseScore":baseScore, "hpScore":hpScore, "timeScore":timeScore}
-    FBCommon.NotifyFBOver(curPlayer, mapID, funcLineID, isWin, overDict)
-    return
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 3ee73aa..f25fa11 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -19,7 +19,6 @@
 import PlayerHorse
 import PlayerTeam
 import SkillCommon
-import MirrorAttack
 import GameMap
 import FBLogic
 import GameWorldProcess
@@ -3860,8 +3859,6 @@
         DoPlayerDead(curPlayer)
         
         GameObj.ClearPyPlayerState(curPlayer)
-        
-        MirrorAttack.OnPlayerDead(curPlayer)
         return
     
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
index 5cc7d0c..e05fd06 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -18,45 +18,30 @@
 import SkillShell
 import BuffSkill
 import PlayerControl
-import ChEquip
 import SkillCommon
 import FBLogic
-import AttackCommon
 import ChItem
 import PlayerGMOper
-import ItemCommon
 import OperControlManager
 import ShareDefine
-import PlayerAutoCheckOnline
 import PlayerGameWallow
 import ReadChConfig
 import PlayerDienstgrad
-import PlayerVip
 import IpyGameDataPY
-import PlayerFB
 import GameObj
 import GameMap
 import math
 import time
 import PetControl
-import ItemControler
-import PlayerGuaji
 import AICommon
 import PlayerSuccess
-import CrossPlayerData
 import PassiveBuffEffMng
 import FunctionNPCCommon
 import FormulaControl
-import PlayerGoldGift
-import PlayerActLianqi
-import PlayerActFamilyGCZ
 import PlayerFlashSale
 import PlayerChatBox
 import PlayerFace
-import PlayerYinji
-import PlayerActivity
 import PlayerBackup
-import MirrorAttack
 import PlayerOnline
 
 #---------------------------------------------------------------------
@@ -1008,9 +993,6 @@
     
     #定时备档
     PlayerBackup.CheckPlayerBackup(curPlayer)
-    
-    #玩家镜像战斗AI
-    #MirrorAttack.ProcessPlayerMirrorAI(curPlayer, tick)
     
     #被GM封状态响应
     ProcessGMOperLogic(curPlayer, tick)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerMirror.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerMirror.py
deleted file mode 100644
index 000d610..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerMirror.py
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package Player.RemoteQuery.GY_Query_PlayerMirror
-#
-# @todo:玩家镜像打包数据
-# @author hxp
-# @date 2024-10-17
-# @version 1.0
-#
-# 详细描述: 玩家镜像打包数据
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2024-10-17 15:00"""
-#-------------------------------------------------------------------------------
-
-import GameWorld
-import MirrorAttack
-import PyGameData
-#---------------------------------------------------------------------
-
-#  @param query_Type 请求类型
-#  @param query_ID 请求的玩家ID
-#  @param packCMDList 发包命令
-#  @param tick 当前时间
-#  @return "True" or "False" or ""
-def DoLogic(query_Type, query_ID, packCMDList, tick):
-    GameWorld.DebugLog("GY_Query_PlayerMirror DoLogic", query_ID)
-    msgInfo, packDataDict = packCMDList
-    msgType = msgInfo["msgType"]
-    # 镜像战斗
-    if msgType == "MirrorBattle":
-        curPlayer = None
-        playerID = msgInfo.get("playerID", 0)
-        isChangeMap = msgInfo.get("isChangeMap", 0)
-        # 是切图的战斗
-        if isChangeMap and playerID:
-            PyGameData.g_playerReqEnterFBEx[playerID] = [msgInfo, packDataDict]
-            curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
-            MirrorAttack.OnMirrorBattleEnterMapInit(curPlayer, tick)
-            return
-        
-        if playerID:
-            curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
-            if not curPlayer or curPlayer.IsEmpty():
-                return ''
-        MirrorAttack.OnMirrorBattleInit(msgInfo, packDataDict, curPlayer)
-        
-    # 其他功能
-    elif msgType == "":
-        pass
-    
-    return ''
-
-
-def DoResult(curPlayer , callFunName , funResult , tick):
-    GameWorld.DebugLog("GY_Query_PlayerMirror DoResult %s" % str(funResult), curPlayer.GetPlayerID())
-    funResult = eval(funResult)
-    if not funResult:
-        return
-    msgType = funResult[0]
-    msgData = funResult[1]
-#    
-#    if msgType == "PackDataSyncState":
-#        PlayerViewCacheTube.UpdPackDataSyncState(curPlayer, msgData)
-#        if msgData.get("PackDataCross"): # 如果跨服需要的,立即同步一次
-#            PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick)
-#    elif msgType == "PullPlayerPackData":
-#        msgInfo = msgData
-#        __DoPullPlayerPackData(curPlayer, msgInfo, tick)
-#        
-#    elif msgType == "PullPlayerViewCache":
-#        msgInfo = msgData
-#        __DoPullPlayerViewCache(curPlayer, msgInfo, tick)
-#        
-    return
-
-def __DoPullPlayerPackData(curPlayer, msgInfo, tick):
-    pullFrom = msgInfo.get("pullFrom")
-    # 0 或 非本服代表跨服需要
-#    if pullFrom == 0 or (pullFrom > 0 and pullFrom != GameWorld.GetServerGroupID()):
-#        PlayerViewCacheTube.SetPackDataCrossSyncState(curPlayer)
-#    else:
-#        PlayerViewCacheTube.SetPackDataSyncState(curPlayer)
-#    PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, forcePackData=True, packMsg=msgInfo)
-    return
-
-def __DoPullPlayerViewCache(curPlayer, msgInfo, tick):
-    viewFrom = msgInfo.get("viewFrom")
-    # 0 或 非本服代表跨服需要
-#    if viewFrom == 0 or (viewFrom > 0 and viewFrom != GameWorld.GetServerGroupID()):
-#        PlayerViewCacheTube.SetViewCacheCrossSyncState(curPlayer)
-#    PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, packMsg=msgInfo, isOnlyViewCache=True)
-    return
-

--
Gitblit v1.8.0