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