#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package MirrorAttack
|
#
|
# @todo:¾µÏñÕ½¶·
|
# @author hxp
|
# @date 2024-10-17
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¾µÏñÕ½¶·£¬Ö§³ÖÓëÍæ¼Ò¾µÏñÊý¾ÝÕ½¶·£¬ÒÔNPCΪս¶·ÊµÀý£¬Ö§³Ö¿ìËÙÕ½¶·
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2024-10-17 15:00"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import ChPlayer
|
import ChConfig
|
import EffGetSet
|
import PlayerPet
|
import PetControl
|
import PyGameData
|
import ShareDefine
|
import PlayerHorse
|
import IPY_GameWorld
|
import PlayerControl
|
import OperControlManager
|
import PlayerViewCacheTube
|
import PassiveBuffEffMng
|
import GameWorldProcess
|
import ChNetSendPack
|
import IpyGameDataPY
|
import AttackCommon
|
import SkillCommon
|
import PlayerState
|
import SkillShell
|
import CommFunc
|
import PlayerFB
|
import GameMap
|
import FBLogic
|
import GameObj
|
|
import time
|
import math
|
|
Def_StateTimeList = [3, 60, 10] # ĬÈϽ׶Îʱ³¤£¬Ãë
|
Mirror_StartMoveTick = "Mirror_StartMoveTick"
|
|
class MirrorBattle():
|
## ij³¡Õ½¶·
|
|
def __init__(self):
|
self.Clear()
|
return
|
|
def Clear(self):
|
self.isChangeMap = 0 # ÊÇ·ñÇÐͼս¶·µÄ
|
self.isSysbg = False # ÊÇ·ñϵͳºǫ́½øÐÐÕ½¶·µÄ£¬Íæ¼ÒÎÞ¸ÐÖª£¬½öÖªµÀ½á¹û
|
self.requestID = 0 # ÇëÇóID£¬Ò»°ãÊÇÍæ¼ÒID»òÕßϵͳ×Ô¶¨µÄID£¬Èçijһ³¡PKµÄ±êʶÐÅÏ¢
|
self.playerID = 0 # ËùÊôÍæ¼ÒID£¬¿ÉÄÜΪ0
|
self.battleID = 0 # ¸Ã³¡Õ½¶·µÄID£¬Ò»°ãÍæ¼Ò·¢ÆðµÄΪplayerID£¬ÏµÍ³·¢ÆðµÄΪ´óÓÚÊ®ÒÚµÄÖµ£¬¼´ 1000000000 + ¸Ãϵͳ³¡´Î¶ÔÓ¦¹¦ÄÜÖµ
|
self.mapID = 0 # ¹¦ÄÜmapID£¬´ú±íijһ¸ö¹¦ÄÜ
|
self.funcLineID = 0
|
self.batState = 0 # ״̬£º0-ÎÞ£»1-×¼±¸ÖУ»2-Õ½¶·ÖУ»3-¿ìËÙ½áÊøÖУ¬4-½áÊø
|
self.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)
|
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):
|
## ½áË㵱ǰ½×¶ÎË«·½ÕóӪʣÓàѪÁ¿Õ¼±È£¬Ò»°ãÓÃÓÚ½áËã¼ÆËã
|
if not self.curHPMax or not self.tagHPMax:
|
return 0, 0
|
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)
|
#GameServerRefresh.GameSever_PlayerInitOK(index, tick)
|
mirrorPlayer.SendToBServerServerInitOK()
|
mirrorPlayer.SetMapLoadOK(True)
|
#½«Íæ¼Ò·ÅÖÃÔÚÕâ¸öµØÍ¼ÉÏ
|
mirrorPlayer.InitPos(mirrorPlayer.GetPosX(), mirrorPlayer.GetPosY())
|
#°ÑÍæ¼ÒÉèÖÃΪ³õʼ»¯³É¹¦×´Ì¬
|
mirrorPlayer.SetCanAttack(True)
|
mirrorPlayer.SetCanMove(True)
|
mirrorPlayer.SetIsNeedProcess(True)
|
mirrorPlayer.SetInitOK(True)
|
mirrorPlayer.EndLoadMap()
|
mirrorPlayer.SetGameServerInitOK(True)
|
|
#Ë¢±»¶¯¡¢ÊôÐÔ
|
PassiveBuffEffMng.OnLoadMapGFPassive(mirrorPlayer)
|
mirrorControl = PlayerControl.PlayerControl(mirrorPlayer)
|
mirrorControl.ReCalcAllState()
|
refreshFightPower = PlayerControl.GetFightPower(mirrorPlayer)
|
if refreshFightPower != dataFightPower:
|
GameWorld.ErrLog("CreateMirrorPlayer mirrorID=%s,realPlayerID=%s,dataFightPower=%s != refreshFightPower=%s"
|
% (mirrorID, realPlayerID, dataFightPower, refreshFightPower), playerID)
|
|
battle.AddBattlePlayer(mirrorPlayer, faction, posX, posY)
|
|
#×îºóÉèÖÿɼû£¬Ë¢ÐÂÊÓÒ°
|
mirrorPlayer.SetVisible(True)
|
mirrorPlayer.RefreshView()
|
|
#Áé³èÓÐЩÊôÐÔÈ¡Ö÷ÈËÍæ¼Ò£¬ËùÒÔÔÚÍæ¼ÒË¢ÍêÊôÐÔºó´¦Àí£¬Ò²±ØÐëÔÚÖ÷ÈËË¢ÐÂÊÓÒ°ºó´¦Àí£¬²»È»³öÏÖ·â°ü˳Ðò¿ÉÄܲ»¶Ô£¬µ¼ÖÂǰ¶ËÎÞ·¨ÏÔʾÁé³è
|
PetControl.DoLogic_PetLoadMapOK(mirrorPlayer)
|
|
if GameWorld.GetGameWorld().GetDebugLevel():
|
DebugLogPlayerInfo(mirrorPlayer)
|
if playerID == realPlayerID:
|
DebugLogPlayerInfo(curPlayer)
|
return mirrorPlayer
|
|
def DebugLogPlayerInfo(curPlayer):
|
playerID = curPlayer.GetPlayerID()
|
GameWorld.DebugLog("-------------- DebugLogPlayerInfoÍæ¼ÒÐÅÏ¢ --------------", playerID)
|
realPlayerID = curPlayer.GetRealPlayerID()
|
posX = curPlayer.GetPosX()
|
posY = curPlayer.GetPosY()
|
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
|
|
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("ijһÕóÓªÒѱ»»÷°Ü! winFaction=%s" % winFaction, battleID)
|
OnMirrorAttackOver(battleID)
|
return
|
|
def OnMirrorAttackOver(battleID):
|
battle = GetMirrorBattleByID(battleID)
|
if not battle:
|
return
|
if battle.batState >= ChConfig.Def_MirrorBatState_Over:
|
# ÒѾ½áËã¹ý
|
return
|
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
|