#!/usr/bin/python
# -*- coding: GBK -*-
#
# @todo: ¼¼Äܹ¥»÷¹ÜÀíÆ÷
#
# @author: Alee
# @date 2017-11-10 ÉÏÎç10:36:33
# @version 1.0
#
# @note: ¼¼ÄÜ¿ò¼Üº¯Êý
#
#---------------------------------------------------------------------
import GameWorld
import IPY_GameWorld
import GameSkills
import GameBuffs
import BuffSkill
import PlayerControl
import ChConfig
import BaseAttack
import CalcLineEffect
import CalcNoLineEffect
import NPCCommon
import SkillCommon
import AttackCommon
import PlayerState
import FBLogic
import ItemCommon
import OperControlManager
import PetControl
import ReadChConfig
import DataRecordPack
#import ChItem
import ShareDefine
import PlayerGreatMaster
import PlayerHorse
import GameObj
import random
import NetPackCommon
import ChPyNetSendPack
import GameMap
import collections
import PassiveBuffEffMng
import ChEquip
import SkillShell
import FBCommon
import IpyGameDataPY
import PyGameData
import EventShell
#---------------------------------------------------------------------
GameWorld.ImportAll("Script\\Skill\\" , "GameSkills")
GameWorld.ImportAll("Script\\Skill\\" , "GameBuffs")
GameWorld.ImportAll("Script\\Skill\\" , "")
# ¼Ç¼¿Í»§¶ËÉ˺¦ {(objID, objType):[HurtHP, AttackType]}
g_ClientHurtDict = collections.OrderedDict()
g_UseSkillPlayerID = 0 # È«·þ¹¥»÷Ϊµ¥Ïß³Ì ¼Ç¼µÄÊǵ±Ç°Ê¹Óü¼ÄܵÄÍæ¼Ò ÓÃÓÚÅжÏg_ClientHurtDictµÄ¹éÊô
#---------------------------------------------------------------------
##C++µ÷Óú¯Êý, ÖØÐ¶ÁÈ¡ËùÓм¼ÄÜ
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks C++µ÷Óú¯Êý, ÖØÐ¶ÁÈ¡ËùÓм¼ÄÜ
def ReloadSkill(tick):
scriptPath = ChConfig.GetAppPath() + "Script\\Skill\\GameSkills"
GameWorld.ReloadScript(scriptPath, "GameSkills")
scriptPath = ChConfig.GetAppPath() + "Script\\Skill"
GameWorld.ReloadScript(scriptPath, "")
return
#---------------------------------------------------------------------
##C++µ÷Óú¯Êý, ÖØÐ¶ÁÈ¡ËùÓÐBuff
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks C++µ÷Óú¯Êý, ÖØÐ¶ÁÈ¡ËùÓÐBuff
def ReloadBuff(tick):
scriptPath = ChConfig.GetAppPath() + "Script\\Skill\\GameBuffs"
GameWorld.ReloadScript(scriptPath, "GameBuffs")
return
#---------------------------------------------------------------------
##»ñµÃ¼¼ÄܵÄÓ°Ïì¶ÔÏó
# @param curSkill Íæ¼ÒʵÀý
# @return ¼¼ÄܵÄÊÜЧ¹û¶ÔÏó
# @remarks »ñµÃ¼¼ÄܵÄÓ°Ïì¶ÔÏó ²Î¿¼ Def_UseSkillTag_Type
def GetSkillAffectTag(curSkill):
return curSkill.GetTag()/10
##»ñµÃ¼¼ÄܵÄÊÍ·ÅÄ¿±ê
# @param curSkill Íæ¼ÒʵÀý
# @return ¼¼ÄܵÄÊÜЧ¹û¶ÔÏó
# @remarks »ñµÃ¼¼ÄܵÄÊÍ·ÅÄ¿±ê £¨ÎÞ¶ÔÏó£¬ ÓжÔÏ󣬵ØÃ棩
def GetSkillFireAim(curSkill):
return curSkill.GetTag()%10
# µ±Ç°ÊÍ·ÅÖ÷¶¯¼¼ÄܵÄÍæ¼Ò
def GetUseSkillPlayerID():
global g_UseSkillPlayerID
return g_UseSkillPlayerID
# ¿Í»§¶ËÉËѪÁÐ±í£¬ÐÞ¸ÄÁ˱éÀú¶ÔÏóºÍ¼ÆËãѪÁ¿
def GetClientHurtDict():
global g_ClientHurtDict
return g_ClientHurtDict
def ClearClientHurtDict(curPlayer):
global g_ClientHurtDict
global g_UseSkillPlayerID
g_ClientHurtDict = collections.OrderedDict()
g_UseSkillPlayerID = 0
def GetClientHurtByObj(objID, objType):
global g_ClientHurtDict
return g_ClientHurtDict.get((objID, objType), [])
# ´æÔÚ¿Í»§¶Ë¼ÆËãÇé¿ö ²»¹ã²¥ ÑéËãÉ˺¦
def isClientHurtValue(objID, objType):
global g_ClientHurtDict
result = g_ClientHurtDict.get((objID, objType), [])
if not result:
return False
if result[1] == 0:
return False
return True
# ¼¼ÄÜ¿ªÊ¼³õʼ»¯¿Í»§¶ËÉËѪÁбí
def InitClientHurtDict(curPlayer, curSkill, hurtList):
global g_ClientHurtDict
global g_UseSkillPlayerID
ClearClientHurtDict(curPlayer)
#¼¼Äܹ¥»÷×î´óÊýÁ¿
hurtCount = SkillCommon.GetSkillArea_Atk_Count(curPlayer, curSkill)
if len(hurtList) > hurtCount:
# ¿Í»§¶ËÄ¿±ê¹ý¶à
return False
# mapType = GameWorld.GetMap().GetMapFBType()
# Ò°ÍâС¹Ö»òÕ߯äËûÖ¸¶¨µÄ¹ÖΪÁ˸ü¼°Ê±µÄ´ò»÷¸Ð£¬Óɿͻ§¶Ë¼ÆËã
for hurobj in hurtList:
hurtHP = hurobj.HurtHP + hurobj.HurtHPEx * ShareDefine.Def_PerPointValue
if hurtHP == 0:
g_ClientHurtDict[(hurobj.ObjID, hurobj.ObjType)] = [hurtHP, hurobj.AttackType]
continue
if hurobj.ObjType != IPY_GameWorld.gotNPC:
# ·ÇNPC
return False
# if mapType != IPY_GameWorld.fbtNull:
# # ·ÇÆÕͨµØÍ¼£¬ºóÐø¿É¼ÓÈëÖ¸¶¨Ìõ¼þ
# return False
curTag = GameWorld.GetObj(hurobj.ObjID, hurobj.ObjType)
if not curTag:
return False
if curTag.GetIsBoss() != 0:
# ·ÇС¹Ö
return False
if (hurobj.ObjID, hurobj.ObjType) in g_ClientHurtDict:
# ÖØ¸´¶ÔÏó
return False
g_ClientHurtDict[(hurobj.ObjID, hurobj.ObjType)] = [hurtHP, hurobj.AttackType]
g_UseSkillPlayerID = curPlayer.GetID()
return True
#---------------------------------------------------------------------
# ·Ç¿Í»§¶ËÍæ¼ÒÊͷŵļ¼ÄÜ
def IsPlayerUseSkill(attacker, curSkill):
if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
return False
if not curSkill:
# Íæ¼ÒÆÕͨҲÊǼ¼ÄÜ£¬Õý³£ÊDz»»á×ßµ½Õâ±ß
return False
if GetUseSkillPlayerID() != attacker.GetID():
# ·ÇÊÍ·ÅÕß
return False
useSkillData = attacker.GetUseSkill()
if useSkillData and curSkill.GetSkillTypeID() != useSkillData.GetSkillTypeID():
# ĬÈÏȺ¹¥¸½¼Ó´¥·¢buffµÄ¶ÔÏóÓë¹¥»÷¶ÔÏóÒ»ÖÂ
if not SkillCommon.IsBuff(curSkill):
return False
if not GetClientHurtDict():
return False
#GameWorld.DebugLog("IsPlayerUseSkill -%s"%curSkill.GetSkillID())
return True
## Êͷż¼ÄÜͨÓüì²é
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý¿ÉÒÔÊÍ·Å
# @remarks Êͷż¼ÄÜͨÓüì²é
def CheckSkillCondition(curPlayer, curSkill, tick):
if curPlayer.GetGMForbidenFight():
#Play_Attack_Null ¶Ô²»Æð£¬ÄúÒѱ»GM½ûÖ¹Õ½¶·£¬¹¥»÷ʧ°Ü
PlayerControl.NotifyCode(curPlayer , "Play_Attack_Null")
return
if GameObj.GetHP(curPlayer) <= 0:
#Íæ¼ÒÒѾËÀÍö
PlayerControl.NotifyCode(curPlayer, "PK_chenxin_612029")
return False
#Íæ¼Òµ±Ç°×´Ì¬
curPlayerAction = curPlayer.GetPlayerAction()
if curPlayerAction not in ChConfig.Def_PlayerCanAttackState:
#״̬ÅжÏ, Ö»ÓÐÔÚ¿ÕÏÐ״̬, ²Å¿ÉÒÔ¹¥»÷
PlayerControl.NotifyCode(curPlayer, "PK_chenxin_612029")
return False
if not curSkill:
#Íæ¼ÒûÓÐÕâ¸ö¼¼ÄÜ
PlayerControl.NotifyCode(curPlayer, "UseMagicLost02")
return False
#±»¶¯¼¼ÄÜÎÞ·¨Ê¹ÓÃ
if SkillCommon.isPassiveSkill(curSkill):
return False
skillTypeID = curSkill.GetSkillTypeID()
#===========================================================================
# if SkillCommon.CheckPlayerAtkInterval(curPlayer, skillTypeID, tick):
# return False
#===========================================================================
#1:¼ì²é,ÊÇ·ñÊǵ±Ç°Ö°Òµ¼¼ÄÜ
if not SkillCommon.CheckSkillJob(curPlayer, curSkill):
PlayerControl.NotifyCode(curPlayer, "UseMagicLost09")
return False
#2:¼ì²é×Ë̬¼¼ÄÜ
# stateSkillReq = curSkill.GetStateSkillReq()
# if stateSkillReq != 0 :
# buffState = curPlayer.GetBuffState()
# if buffState.FindBuff(stateSkillReq) == None:
# PlayerControl.NotifyCode(curPlayer, "GeRen_mx_774664")
# return False
#
#4:¼ì²é¼¼ÄÜרÓÃCDʱ¼ä
playerSkill = curPlayer.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)
if not playerSkill:
PlayerControl.NotifyCode(curPlayer, "UseMagicLost02")
return False
#»¹ÔÚÀäȴʱ¼äÄÚÎÞ·¨ÊÍ·Å
if SkillCommon.RefreshSkillRemainTime(playerSkill, tick) != 0:
#PlayerControl.NotifyCode(curPlayer, "UseSkillCDLimit")
#AttackFailNotify(curPlayer, curSkill, ChConfig.SkillFail_CD)
playerSkill.Sync_Skill()
return False
#5:¼ì²éÍæ¼ÒµÄħ·¨ÖµÊÇ·ñ¹»ÓÃÕâ¸ö¼¼ÄÜ
#===========================================================================
# if curPlayer.GetMP() < curSkill.GetMP():
# curPlayer.Notify_AttackFail(0, 0, 0, 0, IPY_GameWorld.afrMP)
# PlayerControl.NotifyCode(curPlayer, "MagicLack")
# ChItem.UseMagicPotion(curPlayer, tick)
#
# return False
#===========================================================================
# #×Ô¶¯ºÈÀ¶
# if not ChItem.UseMagicPotion(curPlayer, tick):
# curPlayer.Notify_AttackFail(0, 0, 0, 0, IPY_GameWorld.afrMP)
# PlayerControl.NotifyCode(curPlayer, "MagicLack")
# return False
#6:¼ì²éÍæ¼ÒµÄXPµãÊýÊÇ·ñ¹»ÓÃÕâ¸ö¼¼ÄÜ
# curSkillNeedXP = curSkill.GetXP()
#
# if curSkillNeedXP > 0 and curPlayer.GetXP() < curSkillNeedXP:
# curPlayer.Notify_AttackFail(0, 0, 0, 0, IPY_GameWorld.afrXP)
# PlayerControl.NotifyCode(curPlayer, "PK_liubo_917284")
# GameWorld.DebugLog("¼ì²éÍæ¼ÒµÄXPµãÊýÊÇ·ñ¹»ÓÃÕâ¸ö¼¼ÄÜ")
# return False
#
# #7:¼ì²éÍæ¼ÒµÄHPÊÇ·ñ×ã¹»
# curSkillNeedHP = curSkill.GetHP()
#
# if curSkillNeedHP > 0 and GameObj.GetHP(curPlayer) < curSkillNeedHP:
# curPlayer.Notify_AttackFail(0, 0, 0, 0, IPY_GameWorld.afrHP)
# PlayerControl.NotifyCode(curPlayer, "PK_jin_0")
# GameWorld.DebugLog("¼ì²éÍæ¼ÒµÄHPÊÇ·ñ×ã¹»")
# return False
#
# #8:Ê©·¨²ÄÁϼì²é
# if not __CheckSkillUseItem(curPlayer , curSkill):
# #UseMagicLost10 Ê©·¨²ÄÁϲ»×ã
# PlayerControl.NotifyCode(curPlayer, "UseMagicLost10")
# GameWorld.DebugLog("Ê©·¨²ÄÁϲ»×ã")
# return False
#===============================================================================
# #9:ÎäÆ÷ÏûºÄ×Óµ¯¼ì²é
# if not ItemControler.CheckAttackConsumeArrow(curPlayer, True):
# #GameWorld.Log("×Óµ¯¼ì²é²»Âú×ã")
# return False
#===============================================================================
#10:ÌØÊ⸱±¾²»ÄÜʹÓü¼ÄÜ
if FBLogic.OnForbidUseSkill(curPlayer , tick):
#FB_Skill_Lost ¶Ô²»Æð£¬¸Ã³¡¾°ÎÞ·¨Ê¹Óü¼ÄÜ£¬Ê¹Óü¼ÄÜʧ°Ü
PlayerControl.NotifyCode(curPlayer, "FB_Skill_Lost")
return False
return True
#---------------------------------------------------------------------
##¼ì²é¼¼ÄÜÊ©·¨²ÄÁÏ
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @return ·µ»ØÖµÕæ, ÓµÓÐ×ã¹»µÄ²ÄÁÏ
# @remarks ¼ì²é¼¼ÄÜÊ©·¨²ÄÁÏ
def __CheckSkillUseItem(curPlayer , curSkill):
useItemID = curSkill.GetUseItemID()
useItemCount = curSkill.GetUseItemCount()
if not useItemID or not useItemCount:
return True
item = ItemCommon.FindItemInPackByItemID(curPlayer , useItemID , IPY_GameWorld.rptItem)
if not item:
return False
return (item.GetCount() >= useItemCount)
#------------------------NPCʹÓü¼ÄÜ
##NPCʹÓÃÎÞ¶ÔÏó¼¼ÄÜ
# @param curNPC NPCʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ×Ô¶¨Ò庯Êý, NPCʹÓÃÎÞ¶ÔÏó¼¼ÄÜ
def NPCUseSkill(curNPC, curSkill, tick):
if curSkill.GetCastTime():
return NPCUseSkillWarn(curNPC, None, curSkill, tick)
return DoLogic_UseSkill(curNPC, curNPC, curSkill, tick)
#---------------------------------------------------------------------
##NPCʹÓÃÓжÔÏó¼¼ÄÜ
# @param curNPC NPCʵÀý
# @param curTag ¶ÔÏóʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ×Ô¶¨Ò庯Êý, NPCʹÓÃÓжÔÏó¼¼ÄÜ
def NPCUseSkillTag(curNPC, curTag, curSkill, tick):
skillTag = GetSkillAffectTag(curSkill)
if skillTag == ChConfig.Def_UseSkillTag_AppointNPC:
# Ö¸¶¨ÊͷŵÄNPCID ºÍ Def_UseSkillTag_AppointNPC ´îÅäʹÓÃ
curTag = GetAppointNPCBySkillEffect(curSkill)
if not curTag:
return False
if not NPCCanUseSkillTag(curNPC, curTag, curSkill, tick):
return False
NPCAttackMovePos(curNPC, curTag, curSkill)
if curSkill.GetCastTime():
return NPCUseSkillWarn(curNPC, curTag, curSkill, tick)
result = DoLogic_UseSkill(curNPC, curTag, curSkill, tick)
if result and curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX) != 0:
curNPC.ChangePos(curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX),
curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosY))
curNPC.SetDict(ChConfig.Def_NPC_Dict_AtkMovePosX, 0)
curNPC.SetDict(ChConfig.Def_NPC_Dict_AtkMovePosY, 0)
return result
# Ö¸¶¨ÊͷŵÄNPCID ºÍ Def_UseSkillTag_AppointNPC ´îÅäʹÓÃ
def GetAppointNPCBySkillEffect(curSkill):
npcID = 0
effectID = ChConfig.Def_Skill_Effect_AppointNPC
for i in xrange(0, curSkill.GetEffectCount()):
curEffect = curSkill.GetEffect(i)
curEffectID = curEffect.GetEffectID()
if not curEffectID:
#²ß»®ÓпÉÄÜÖÐ;ɾ³ý£¬²»ÓÃreturn
continue
#²»ÊÇÐèÒªµÄЧ¹û
if curEffectID != effectID:
continue
npcID = curEffect.GetEffectValue(0)
break
if not npcID:
return None
return GameWorld.FindNPCByNPCID(npcID)
# ¼ÆËãNPC¼¼ÄÜÎ»ÒÆ×ø±ê£¬Ô¤¾¯ºÍ·ÇÔ¤¾¯¶¼¿ÉÒÔÓÃ
def NPCAttackMovePos(curNPC, curTag, curSkill):
if curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX) != 0:
return
# Õ½¶·Î»ÒƼ¼ÄÜ
skillEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_AttackMove)
if not skillEffect:
return
moveDist = skillEffect.GetEffectValue(0)
if moveDist > 0:
#Ö±Ï߳巿£¬Ô¤¾¯Îª¾ØÐΣ¬È¡ÓëÄ¿±êÖ±½ÓµÄ×îÔ¶¾àÀ룬´Ë´¦Ò»¶¨ÊÇÒªÓй¥»÷Ä¿±ê
tagPosX = curTag.GetPosX()
tagPosY = curTag.GetPosY()
for dist in xrange(moveDist, 1, -1):
posX, posY = GameWorld.PosInLineByDistEx(dist, tagPosX, tagPosY, curNPC.GetPosX(), curNPC.GetPosY())
if not GameWorld.GetMap().CanMove(posX, posY):
continue
break
if not GameWorld.GetMap().CanMove(posX, posY):
posX, posY = tagPosX, tagPosY
else:
# ·ÉÔ¾Ðͼ¼ÄÜ£¬Ô¤¾¯ÎªÄ¿±êµãÔ²ÐÎ
posX = curTag.GetPosX() if curTag else curNPC.GetPosX()
posY = curTag.GetPosY() if curTag else curNPC.GetPosY()
curNPC.SetDict(ChConfig.Def_NPC_Dict_AtkMovePosX, posX)
curNPC.SetDict(ChConfig.Def_NPC_Dict_AtkMovePosY, posY)
return
def NPCUseSkillWarn(curNPC, curTag, curSkill, tick):
## NPCʹÓü¼ÄÜÔ¤¾¯
# ÓÐÊ©·¨Ê±¼äµÄ²Å½øÐÐÔ¤¾¯
warnTime = curSkill.GetCastTime()
if not warnTime:
return False
# ¶àµãÔ¤¾¯ÔÝʱֻ֧³ÖÕÙ»½¼¼ÄÜ
if curSkill.GetSkillType() == ChConfig.Def_SkillType_Summon:
warnPosList = []
curSummonID = curSkill.GetEffect(0).GetEffectValue(0)
curSummonCount = max(curSkill.GetEffect(0).GetEffectValue(1), 1) # µ¥´ÎÕÙ»½ÊýÁ¿
summonCountAll = max(curSkill.GetEffect(0).GetEffectValue(2), 1) # ×ÜÕÙ»½ÊýÁ¿
curSummonNPCCnt = SkillCommon.GetSummonCountByNPCID(curNPC, curSummonID)
if curSummonNPCCnt >= summonCountAll:
return False
canSummonCnt = min(curSummonCount, summonCountAll - curSummonNPCCnt)
if curSkill.GetAtkType() == 16:
# À౩·çÑ©¼¼ÄÜ ¶ÔÄ¿±ê¶¨µãÊÍ·Å£¬Ö»Ö§³Öµ¥µã
warnPosList.append([curTag.GetPosX() , curTag.GetPosY()])
else:
# ÒÔNPC×Ô¼ºÎªÖÐÐĵ㣬·¶Î§ÄÚËæ»úµã
atkDist = ChConfig.Def_DropItemDist if not curSkill.GetAtkDist() else curSkill.GetAtkDist()
#GameWorld.DebugLog("¿ªÊ¼Ëæ»úÕÙ»½Ô¤¾¯×ø±êµã: curNPC.GetPosX()=%s, curNPC.GetPosY()=%s, atkDist=%s" % (curNPC.GetPosX(), curNPC.GetPosY(), atkDist))
for i in xrange(canSummonCnt):
resultPos = GameMap.GetEmptyPlaceInArea(curNPC.GetPosX(), curNPC.GetPosY(), atkDist)
warnPosList.append([resultPos.GetPosX() , resultPos.GetPosY()])
else:
skillEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_RandWarn)
if skillEffect:
# ÒÔNPC×Ô¼ºÎªÖÐÐĵ㣬·¶Î§ÄÚËæ»úµã
atkDist = curSkill.GetAtkDist() - 1
fromX, toX = max(curNPC.GetPosX() - atkDist, 1), curNPC.GetPosX() + atkDist
fromY, toY = max(curNPC.GetPosY() - atkDist, 1), curNPC.GetPosY() + atkDist
warnPoints = []
for x in range(fromX, toX, 3):
for y in range(fromY, toY, 3):
warnPoints.append([x, y])
warnPosList = random.sample(warnPoints, min(skillEffect.GetEffectValue(0)-1, len(warnPoints)))
warnPosList.append([curTag.GetPosX(), curTag.GetPosY()])
#GameWorld.DebugLog("¶àµãÔ¤¾¯×ø±ê %s-%s-%s"%(curNPC.GetPosX(), curNPC.GetPosY(), warnPosList))
else:
# Õ½¶·Î»ÒƼ¼ÄÜ
if curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX) != 0:
warnPosList = [[curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX), curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosY)]]
else:
#·ÇÎ»ÒÆÔ¤¾¯
posX = curTag.GetPosX() if curTag else curNPC.GetPosX()
posY = curTag.GetPosY() if curTag else curNPC.GetPosY()
warnPosList = [[posX, posY]]
if not warnPosList:
GameWorld.ErrLog("ûÓÐÔ¤¾¯×ø±êÐÅÏ¢£¡npcID=%s,skillID=%s" % (curNPC.GetNPCID(), curSkill.GetSkillID()))
return False
skillID = curSkill.GetSkillID()
curNPC.SetDict(ChConfig.Def_NPC_Dict_SkillWarnSkillID, skillID)
curNPC.SetDict(ChConfig.Def_NPC_Dict_SkillWarnTime, warnTime)
curNPC.SetDict(ChConfig.Def_NPC_Dict_SkillWarnPosCnt, len(warnPosList))
for i, posInfo in enumerate(warnPosList):
curNPC.SetDict(ChConfig.Def_NPC_Dict_SkillWarnPosX % i, posInfo[0])
curNPC.SetDict(ChConfig.Def_NPC_Dict_SkillWarnPosY % i, posInfo[1])
curNPC.SetCurAction(IPY_GameWorld.laNPCSkillWarning)
#GameWorld.DebugLog("½øÈë¼¼ÄÜÔ¤¾¯×´Ì¬: npcID=%s,skillID=%s,warnPosList=%s,curTag=%s"
# % (curNPC.GetNPCID(), skillID, warnPosList, 0 if not curTag else curTag.GetID()))
# ¹ã²¥Ô¤¾¯
NotifyNPCSkillWarn(curNPC, tick)
return True
def NotifyNPCSkillWarn(curNPC, tick):
# ¹ã²¥NPCÊͷż¼ÄÜÔ¤¾¯
if curNPC.GetCurAction() != IPY_GameWorld.laNPCSkillWarning:
return
warnSkillID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_SkillWarnSkillID)
warnTime = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_SkillWarnTime)
remainTime = warnTime - (tick - curNPC.GetActionTick())
if remainTime <= 0:
return
sendPack = ChPyNetSendPack.tagMCNPCSkillWarn()
sendPack.Clear()
sendPack.ObjID = curNPC.GetID()
sendPack.NPCID = curNPC.GetNPCID()
sendPack.SkillID = warnSkillID
sendPack.WarnTime = warnTime
sendPack.RemainTime = remainTime
sendPack.WarnPosList = []
posCnt = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_SkillWarnPosCnt)
for i in xrange(posCnt):
pos = ChPyNetSendPack.tagMCNPCSkillWarnPos()
pos.PosX = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_SkillWarnPosX % i)
pos.PosY = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_SkillWarnPosY % i)
sendPack.WarnPosList.append(pos)
sendPack.WarnPosCnt = len(sendPack.WarnPosList)
curNPC.NotifyAll(sendPack.GetBuffer(), sendPack.GetLength())
return
##¼ì²éNPCʹÓÃÓжÔÏó¼¼ÄÜ
# @param curNPC NPCʵÀý
# @param curTag ¶ÔÏóʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
def NPCCanUseSkillTag(curNPC, curTag, curSkill, tick):
skillTag = GetSkillAffectTag(curSkill)
if skillTag == ChConfig.Def_UseSkillTag_AppointNPC:
return True
#---¶ÔÏóÅж¨---
if IsToPetOwnerSkill(curNPC, skillTag):
return True
#---ÕÙ»½ÊÞ¶ÔÖ÷ÈË---
if IsSummomToOwnerSkill(curNPC, skillTag, curTag):
return True
curSkillUseTag = SkillShell.GetSkillAffectTag(curSkill)
if curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttackPlayer:
if curTag.GetGameObjType() != IPY_GameWorld.gotPlayer:
return False
#---¹ØÏµÅж¨---
relation = BaseAttack.GetTagRelation(curNPC, curTag, curSkill, tick)[0]
if skillTag == ChConfig.Def_UseSkillTag_FriendNPC and relation == ChConfig.Type_Relation_Friend:
return True
if relation != ChConfig.Type_Relation_Enemy:
return False
return True
def IsNPCSkillResist(curNPC):
## NPCÊÇ·ñ¼¼Äֿܵ¹£¬¶ÔÓ¦¼¼ÄܱíÖÐÉ˺¦ÀàÐÍHurtTypeΪ3µÄ¼¼ÄÜ£¬¼´¶ÔbossÎÞЧµÄ¼¼ÄÜ
if curNPC.GetCurAction() == IPY_GameWorld.laNPCSkillWarning:
#GameWorld.DebugLog("Ô¤¾¯×´Ì¬ÏÂĬÈϵֿ¹")
return True
bossIpyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSInfo", curNPC.GetNPCID())
if bossIpyData and bossIpyData.GetSkillResist():
return True
return False
##ÊÇ·ñÕÙ»½ÊÞ¶ÔÖ÷ÈËʹÓü¼ÄÜ
# @param curNPC NPCʵÀý
# @param skillTag ¼¼ÄÜЧ¹û¶ÔÏó
# @param curTag ¶ÔÏóʵÀý
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
def IsSummomToOwnerSkill(curNPC, skillTag, curTag):
# ·ÇÓѺÃÄ¿±ê
if skillTag not in [ChConfig.Def_UseSkillTag_Friend, ChConfig.Def_UseSkillTag_SummonMaster]:
return False
# ²»ÊÇÕÙ»½ÊÞ
if curNPC.GetGameNPCObjType() != IPY_GameWorld.gnotSummon:
return False
owner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotNPC, curNPC)
if not owner:
owner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, curNPC)
if not owner:
return False
return GameWorld.IsSameObj(curTag, owner)
##ÊÇ·ñ³èÎï¶ÔÖ÷ÈËʹÓü¼ÄÜ
# @param curNPC NPCʵÀý
# @param skillTag ¼¼ÄÜЧ¹û¶ÔÏó
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
def IsToPetOwnerSkill(curNPC, skillTag):
if skillTag != ChConfig.Def_UseSkillTag_PetMaster:
return False
if not PetControl.IsPet(curNPC):
GameWorld.ErrLog("NPCID %s AI %s ·Ç³èÎÎÞ·¨»ñµÃÖ÷ÈËÊͷż¼ÄÜ"%(curNPC.GetNPCID(), curNPC.GetAIType()))
return False
petOwner = PetControl.GetPetOwner(curNPC)
if petOwner == None:
GameWorld.ErrLog("³èÎ%s£©¶ÔÖ÷ÈËÊͷż¼ÄÜ£¬ÕÒ²»µ½Ö÷ÈË"%curNPC.GetRolePet().PetID)
return False
return True
##¹ºÍåóÆÕ¹¥¼¼ÄÜ
# @param curPlayer Íæ¼ÒʵÀý
# @param skillID ¼¼ÄÜID
# @return ÌØ±ðµÄÆÕ¹¥ID
#===============================================================================
# def GetBowNormalAttackID(curPlayer, skillID):
# #Ë¢ÐÂÈËÎï¹¥»÷¾àÀë
# playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
# #»ñµÃµ±Ç°ÈËÎïʹÓõÄÎäÆ÷
# curUseWeapon = playerEquip.GetAt(ShareDefine.retWeapon)
# curUseWeapon2 = playerEquip.GetAt(ShareDefine.retWeapon2)
# #¿ÕÊÖ
# if curUseWeapon.IsEmpty() and curUseWeapon2.IsEmpty():
# return skillID
#
# if curUseWeapon.GetType() in [ChConfig.Def_ItemType_Crossbow, ChConfig.Def_ItemType_Bow]:
# curEffect = ItemCommon.GetItemEffectByEffectID(curUseWeapon, ChConfig.Def_Effect_WeaponAttack)
# if curEffect == None:
# GameWorld.DebugAnswer(curPlayer, 'ûÓÐÎïÆ·Ð§¹ûID %s'%ChConfig.Def_Effect_WeaponAttack)
# return skillID
#
# return curEffect.GetEffectValue(0)
#
# if curUseWeapon2.GetType() in [ChConfig.Def_ItemType_Crossbow, ChConfig.Def_ItemType_Bow]:
# curEffect = ItemCommon.GetItemEffectByEffectID(curUseWeapon2, ChConfig.Def_Effect_WeaponAttack)
# if curEffect == None:
# GameWorld.DebugAnswer(curPlayer, 'ûÓÐÎïÆ·Ð§¹ûID %s'%ChConfig.Def_Effect_WeaponAttack)
# return skillID
#
# return curEffect.GetEffectValue(0)
#
# return skillID
#===============================================================================
#===============================================================================
# //B4 02 ¶ÔÏó»÷ÍË #tagCMNPCBeatBack
#
# struct tagCMNPCPos
# {
# DWORD ObjID;
# WORD PosX;
# WORD PosY;
# };
#
# struct tagCMNPCBeatBack
# {
# tagHead Head;
# BYTE Count;
# BYTE ObjType;
# tagCMNPCPos NPCPosList[Count];
#
# };
#===============================================================================
def NPCBeatBack(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
mapType = GameWorld.GetMap().GetMapFBType()
# Íæ¼Ò±»NPC»÷ÍË£¬´Ë´¦Ó¦¸Ã¿ØÖÆÏÂCDºÍ¾àÀë
if clientData.ObjType == IPY_GameWorld.gotPlayer and clientData.Count == 1:
pos = clientData.NPCPosList[0]
if pos.ObjID != curPlayer.GetID():
return
if GameObj.GetHP(curPlayer) <= 0:
return
#=======================================================================
# if mapType == IPY_GameWorld.fbtNull:
# return
#=======================================================================
if not GameWorld.GetMap().CanMove(pos.PosX, pos.PosY):
return
curPlayer.StopMove()
curPlayer.ChangePos(pos.PosX, pos.PosY)
#Êä³ö±ãÓÚ²éÎ»ÒÆÍâ¹Ò
GameWorld.Log("---Íæ¼Ò±»»÷ÍË %s"%curPlayer.GetID())
return
'''
NPC»÷ÍËÂß¼£¬ÊÊÓÃÓÚС¹ÖºÍ¹¥»÷ÓиöÊýÏÞÖÆµÄÓÎÏ·Éè¼Æ
'''
count = min(clientData.Count, 10)
for i in range(count):
npcPos = clientData.NPCPosList[i]
npcObj = GameWorld.GetObj(npcPos.ObjID, IPY_GameWorld.gotNPC)
if not npcObj:
continue
if npcObj.GetIsBoss() > ChConfig.Def_NPCType_Ogre_Super and mapType == IPY_GameWorld.fbtNull:
# Ò°ÍâBOSS²»±»ÍÆ
continue
if GameObj.GetHP(npcObj) <= 0:
continue
if not GameWorld.GetMap().CanMove(npcPos.PosX, npcPos.PosY):
continue
if GameWorld.GetDist(npcObj.GetPosX(), npcObj.GetPosY(), npcPos.PosX, npcPos.PosY) > 6:
# µ¥´ÎÎ»ÒÆ²»³¬¹ý3Ã×
continue
if npcObj.GetCurAction() == IPY_GameWorld.laNPCSkillWarning:
#GameWorld.DebugLog("NPCÔ¤¾¯Öв»¿É±»»÷ÍË!")
continue
npcObj.StopMove()
npcObj.ChangePos(npcPos.PosX, npcPos.PosY)
BeatBackMove(curPlayer, npcObj)
return
# Õë¶ÔNPC±»ÍƳöÔ¶¾àÀëÒ»Ö±¿¨Ç½½ÇÎÊÌ⣬·¨±¦ÌôÕ½¸±±¾ÌØÊâ´¦ÀíΪ³¬¹ý4Ã× NPC×Ô¶¯»ØÍËһЩ
def BeatBackMove(curPlayer, npcObj):
if GameWorld.GetMap().GetMapID() != ChConfig.Def_FBMapID_MagicWeapon:
return
if npcObj.GetCurAction() == IPY_GameWorld.laNPCSkillWarning:
return
posMap = npcObj.GetRefreshPosAt(npcObj.GetCurRefreshPointIndex())
if not posMap:
return
#·¶Î§Ð£Ñé
posMapX = posMap.GetPosX()
posMapY = posMap.GetPosY()
if GameWorld.GetDist(npcObj.GetPosX(), npcObj.GetPosY(), posMapX, posMapY) < 8:
# µ¥´ÎÎ»ÒÆ²»³¬¹ý5Ã×
return
npcControl = NPCCommon.NPCControl(npcObj)
moveDestX, moveDestY = npcControl.GetMoveNearPosEx(posMapX, posMapY, 5)
npcObj.Move(moveDestX, moveDestY)
return
#===============================================================================
# //B4 03 ÎüÒýNPC³ðºÞ #tagNPCAttention
#
# struct tagCMNPCInfo
# {
# DWORD ObjID;
# };
#
# struct tagNPCAttention
# {
# tagHead Head;
# BYTE Count;
# tagCMNPCInfo NPCs[Count];
#
# };
#===============================================================================
def NPCAttention(index, clientData, tick):
return
#===========================================================================
# '''
# NPC³ðºÞÎüÒý£¬Óɿͻ§¶Ë¾ö¶¨£¬ÊÊÓÃÓÚС¹Ö
# '''
# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
# if GameObj.GetHP(curPlayer) <= 0:
# return
#
# if not curPlayer.GetVisible():
# return
#
# playerID = curPlayer.GetID()
# count = min(clientData.Count, 8)
# for i in range(count):
# objID = clientData.NPCs[i]
# npcObj = GameWorld.GetObj(objID, IPY_GameWorld.gotNPC)
# if not npcObj:
# continue
# if npcObj.GetIsBoss() > ChConfig.Def_NPCType_Ogre_Super:
# continue
#
# npcAngry = npcObj.GetNPCAngry()
# angryValue = npcAngry.FindNPCAngry(playerID, IPY_GameWorld.gotPlayer)
#
# if angryValue != None and GameObj.GetAngryValue(angryValue) != 0 :
# #¸Ã¶ÔÏóÒѾÔÚ³ðºÞÁбíÖÐ,²»Öظ´Ìí¼Ó
# continue
#
# if not AttackCommon.CheckCanAttackTag(npcObj, curPlayer):
# continue
#
# relation = BaseAttack.GetTagRelation(npcObj, curPlayer, None, tick)[0]
# if relation != ChConfig.Type_Relation_Enemy:
# continue
#
# npcControl = NPCCommon.NPCControl(npcObj)
# npcControl.AddObjToAngryList(curPlayer, ChConfig.Def_NPC_SeePlayerAddAngry)
# npcObj.GetNPCAngry().Resort(tick)
# GameWorld.DebugLog("NPCAttention ³É¹¦À³ðºÞ %s"%objID)
#
# return
#===========================================================================
#===============================================================================
# //B4 01 ´øÓжÔÏó¶ÓÁкÍ×ø±êµÄ¼¼ÄÜ #tagCMUseSkillEx ¸Ä¿Í»§¶Ë¼ÆËãѪÁ¿ºÏ²¢°ü
#
# struct tagCMUseSkillEx
# {
# tagHead Head;
# WORD SkillID;
# WORD PosX; //¹¥»÷Æðµã
# WORD PosY;
# WORD TagPosX; //Ä¿±êµã
# WORD TagPosY;
# BYTE TagType; //OBJÀàÐÍ
# DWORD TagID;
# };
#===============================================================================
# ·ÏÆúʹÓÃB4 05
#===============================================================================
# def UseSkillExEx(index, clientData, tick):
# '''
# Pos ¹¥»÷ÆðµãΪ¿Í»§¶ËµÄ½Çɫ׸±ê£¬ÒÔÐÅÈοͻ§¶ËÅжϹ¥»÷¾àÀ룬¼æÈÝ´¦Àí
# TagPos ΪĿ±êµã£¬ÒԴ˾ö¶¨¼¼Äܹ¥»÷·½Ïò£¬Í¨Öª¹¥»÷³É¹¦
# TagID Ö÷Ä¿±ê£¬Èº¹¥ÉèÖÃÖ÷Ä¿±êΪÓÅÏȹ¥»÷¶ÔÏó£¬ÈÃÄ¿±ê¸üÈÝÒ×±»»÷ÖÐ
# '''
# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
# curPlayerID = curPlayer.GetID()
#
# #-----------»ñÈ¡·â°üÊý¾Ý
# pack_SkillID = clientData.SkillID
# pack_PosX = clientData.PosX
# pack_PosY = clientData.PosY
# tagPosX = clientData.TagPosX
# tagPosY = clientData.TagPosY
# tagType = clientData.TagType
# tagID = clientData.TagID
#
# curSkill = curPlayer.GetSkillManager().FindSkillBySkillID(pack_SkillID)
# if not curSkill:
# #GameWorld.ErrLog('UseSkill findSkillErr = %s'%(pack_SkillID), curPlayerID)
# return
#
# if not __CheckPlayerUseSkill_ClientPack(curPlayer, pack_PosX, pack_PosY, curSkill):
# return
#
# #ʹÓü¼ÄÜÐÐΪ״̬, ¿Í»§¶ËÏÞÖÆ
# if not OperControlManager.IsObjCanDoAction(curPlayer,
# ChConfig.Def_Obj_ActState_ClientSkill,
# curSkill.GetSkillOfSeries()):
# return
#
#
#
# #¼¤»îÍæ¼Ò,½â³ý´ôÖÍ
# PlayerControl.SetIsNeedProcess(curPlayer, True)
#
# #´Ë´¦²»¼ì²éºÏ·¨ÐÔ, ÔÚÕæÕýÒªÓõÄʱºòÔÙ¼ì²é
# curPlayer.ClearUseSkillRec()
# curPlayer.SetUseSkill(curSkill.GetSkillData())
# curPlayer.SetUseSkillPosX(tagPosX)
# curPlayer.SetUseSkillPosY(tagPosY)
# curPlayer.SetUseSkillTagType(tagType)
# curPlayer.SetUseSkillTagID(tagID)
# #ÉèÖù¥»÷ÆðµãÎªÍæ¼Ò×ÔÉí×ø±ê
# curPlayer.SetAttackTargetPos(pack_PosX, pack_PosY)
#
# #ÒѾÔÚ¹¥»÷ÖÐ
# if curPlayer.GetPlayerAction() == IPY_GameWorld.paAttack:
# return
#
# # ÐèҪǰ×àÒ÷³ªÊͷż¼ÄÜÀ½ø¶ÈÌõ
# if curSkill.GetCastTime() > 0:
# GameWorld.DebugLog("----½ø¶ÈÌõ%s"%curSkill.GetCastTime())
# PlayerControl.Sync_PrepareBegin(curPlayer, curSkill.GetCastTime(), IPY_GameWorld.pstSkill, pack_SkillID)
# return
#
# #ÉèÖù¥»÷±ê־λ
# PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paAttack)
# #Ö´ÐÐÕ½¶·Âß¼
# PlayerState.ProcessFight(curPlayer, tick)
# return
#===============================================================================
# ÌØÊâ˵Ã÷ChangePlayerAction -> SetPlayerAction ÖÐ ÔÚÀÌõ״̬»á֪ͨ Sync_PrepareEnd£¬Ä¬ÈϽø¶ÈÌõÀàÐÍ
# Sync_PrepareEnd ֪ͨ0²ÅËã½ø¶ÈÌõ³É¹¦£¬ÆäËûΪʧ°Ü£¬×Ôµ÷ÓÃÂ߼ʱÇë×¢Òâ
def SkillPrepareEnd(curPlayer, tick):
curSkill = curPlayer.GetUseSkill()
hasEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_PowerPart)
if hasEffect:
# ÐîÁ¦¼¼ÄÜÐè¼Ç¼´ÎÊý
if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_PowerPartCount) == 0:
curPlayer.SetDict(ChConfig.Def_PlayerKey_PowerPartCount, hasEffect.GetEffectValue(0))
#Sync_PrepareEnd() °üº¬ÔÚSetPlayerActionÖÐ֪ͨ
curPlayer.SetPrepareState(0)
#ÉèÖù¥»÷±ê־λ
PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paAttack)
#Ö´ÐÐÕ½¶·Âß¼
PlayerState.ProcessFight(curPlayer, tick)
return
def CheckClientAttackTick(curPlayer, clientTick, tick):
Def_Attack_DelayTick = 5000
# tick Îó²î¹ý´óÔò¹ýÂË
if abs(clientTick - tick) > Def_Attack_DelayTick:
curPlayer.Sync_ClientTick()
GameWorld.DebugLog("tick Îó²î¹ý´óÔò¹ýÂË > 5000")
return False
if tick - curPlayer.GetDictByKey("CheckTick") > 60000:
# 1·ÖÖÓ¾ÀÕýÒ»´Îtick,ͬʱÓÃÓÚÕ½¶·ºÍÒÆ¶¯µÄ¼ì²é
curPlayer.SetMoveCount(0)
curPlayer.SetDict("CheckTick", tick)
# GetPlayerAttackTickΪ¼Ç¼µÄ¿Í»§¶Ëtick£¬Ð¡ÓڼǼÔòΪÒì³£
if clientTick < curPlayer.GetPlayerAttackTick():
GameWorld.DebugLog("¿Í»§¶Ëtick£¬Ð¡ÓڼǼÔòΪÒì³£")
errCnt = curPlayer.GetMoveCount()
curPlayer.SetMoveCount(errCnt + 1)
if errCnt > 5:
return False
# ¹¥»÷¼ä¸ô¹ý¿ì
if clientTick - curPlayer.GetPlayerAttackTick() < PlayerControl.GetAtkInterval(curPlayer)*0.7:
GameWorld.DebugLog(" # ¹¥»÷¼ä¸ô¹ý¿ì %s - %s < %s"%(clientTick, curPlayer.GetPlayerAttackTick(), PlayerControl.GetAtkInterval(curPlayer)*0.75))
errCnt = curPlayer.GetMoveCount()
curPlayer.SetMoveCount(errCnt + 1)
if errCnt > 5:
return False
#¼Ç¼¿Í»§¶ËµÄtick
curPlayer.SetAttackTick(clientTick)
return True
#===============================================================================
# //B4 05 ´øÉ˺¦¶ÓÁеĹ¥»÷ #tagCMSuperAtk
#
# struct tagSkillPosHurtObj
# {
# BYTE ObjType;
# DWORD ObjID;
# BYTE AttackType; //±¬»÷, miss
# DWORD HurtHP;
# DWORD HurtHPEx;
# };
#
# struct tagCMSuperAtk
# {
# tagHead Head;
# WORD SkillID;
# WORD PosX; //¹¥»÷Æðµã
# WORD PosY;
# WORD TagPosX; //Ä¿±êµã
# WORD TagPosY;
# DWORD WorldTick;
# WORD HurtCount; //É˺¦ÊýÄ¿
# tagSkillPosHurtObj HurtList[HurtCount]; //size = HurtCount
# };
#===============================================================================
def UseSkillEx(index, clientData, tick):
'''
Óɿͻ§¶ËËÑË÷¶ÔÏó£¬Ð¡¹ÖÓɿͻ§¶Ë¼ÆËãÉ˺¦£¬·þÎñ¶Ë¿ØÖÆÉ˺¦Öµ·¶Î§
ÆäËû¶ÔÏóÂß¼ÓÉ·þÎñ¶Ë´¦Àí
'''
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
curPlayerID = curPlayer.GetID()
#-----------»ñÈ¡·â°üÊý¾Ý
pack_SkillID = clientData.SkillID
pack_PosX = clientData.PosX
pack_PosY = clientData.PosY
tagPosX = clientData.TagPosX
tagPosY = clientData.TagPosY
clientTick = clientData.WorldTick
hurtList = clientData.HurtList
curSkill = curPlayer.GetSkillManager().FindSkillBySkillID(pack_SkillID)
if not curSkill:
#GameWorld.ErrLog('UseSkill findSkillErr = %s'%(pack_SkillID), curPlayerID)
return
if pack_SkillID != ChConfig.Def_SkillID_Somersault:
# ·¹öÌØÊâ´¦Àí£¬ÊµÊ±ÏìÓ¦, ÓÉCD ×Ü¿ØÖÆ
if not CheckClientAttackTick(curPlayer, clientTick, tick):
AttackFailNotify(curPlayer, curSkill, ChConfig.SkillFail_AtkInterval)
curPlayer.Sync_ClientTick()
return
#ÒѾÔÚ¹¥»÷ÖÐ
if curPlayer.GetPlayerAction() == IPY_GameWorld.paAttack:
AttackFailNotify(curPlayer, curSkill)
return
#ʹÓü¼ÄÜÐÐΪ״̬, ¿Í»§¶ËÏÞÖÆ
if not OperControlManager.IsObjCanDoAction(curPlayer,
ChConfig.Def_Obj_ActState_ClientSkill,
curSkill.GetSkillOfSeries(), curSkill):
AttackFailNotify(curPlayer, curSkill)
return
if not InitClientHurtDict(curPlayer, curSkill, hurtList):
#GameWorld.ErrLog("InitClientHurtDict ǰ¶Ë¹¥»÷´íÎó£¡")
AttackFailNotify(curPlayer, curSkill)
return
if not __CheckPlayerUseSkill_ClientPack(curPlayer, pack_PosX, pack_PosY, curSkill):
AttackFailNotify(curPlayer, curSkill)
return
#¼¤»îÍæ¼Ò,½â³ý´ôÖÍ
PlayerControl.SetIsNeedProcess(curPlayer, True)
#´Ë´¦²»¼ì²éºÏ·¨ÐÔ, ÔÚÕæÕýÒªÓõÄʱºòÔÙ¼ì²é
curPlayer.ClearUseSkillRec()
curPlayer.SetUseSkill(curSkill.GetSkillData())
curPlayer.SetUseSkillPosX(tagPosX)
curPlayer.SetUseSkillPosY(tagPosY)
if len(hurtList) != 0:
curPlayer.SetUseSkillTagType(hurtList[0].ObjType)
curPlayer.SetUseSkillTagID(hurtList[0].ObjID)
# ÉèÖÿͻ§¶ËÉËѪ£¬¾ßÌåÅж¨ÔÚÉËѪʱ´¦Àí
#ÉèÖù¥»÷ÆðµãÎªÍæ¼Ò×ÔÉí×ø±ê
curPlayer.SetAttackTargetPos(pack_PosX, pack_PosY)
# ÐèҪǰ×àÒ÷³ªÊͷż¼ÄÜÀ½ø¶ÈÌõ, ÓÉ·þÎñ¶Ë¾ö¶¨É˺¦
# ÐîÁ¦¼¼ÄÜÐè¼Ç¼ÐîÁ¦Öµ
if curSkill.GetCastTime() > 0:
OnPrepareSkill(curPlayer, curSkill, tick)
return
#ÉèÖù¥»÷±ê־λ
PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paAttack)
#Ö´ÐÐÕ½¶·Âß¼
PlayerState.ProcessFight(curPlayer, tick)
return
# ÐîÁ¦»òÕßÒ÷³ªÀ༼ÄÜ
# Ò÷³ªÀ༼ÄÜÔÚ½ø¶ÈÌõ½áÊø²ÅÄÜÊͷż¼ÄÜ
# ÐîÁ¦¼¼Äܰ´½ø¶ÈÌõ½ø¶È³äÄÜÊÍ·Å£¬¿Í»§¶ËÔٴη¢°üÔòÁ¢¼´ÊÍ·Å»ò³äÄÜÂúÔòÊͷż¼ÄÜ£¬Åä±íÊýֵΪcurSkill.GetCastTime()µ¥´Î³äÄÜʱ¼ä
def OnPrepareSkill(curPlayer, curSkill, tick):
#»¹ÔÚÀäȴʱ¼äÄÚÎÞ·¨ÊÍ·Å
if SkillCommon.RefreshSkillRemainTime(curSkill, tick) != 0:
return False
# ÐîÁ¦´ÎÊý£¬Ä¬ÈÏ1ÎÞÐîÁ¦
count = 1
hasEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_PowerPart)
if curPlayer.GetPlayerAction() == IPY_GameWorld.paPreparing and curPlayer.GetPrepareState() == IPY_GameWorld.pstSkill:
if not hasEffect:
# ·ÇÐîÁ¦¼¼ÄÜ
return
if curPlayer.GetPrepareID() != curSkill.GetSkillID():
# ·Çµ±Ç°ÐîÁ¦¼¼ÄÜ
return
## ¶þ´Î·¢°ü¿Í»§¶ËÒªÇóÁ¢¼´ÊÍ·Å
count = hasEffect.GetEffectValue(0)
# ĬÈÏ´¥·¢ËãÒ»´ÎÄÜÁ¿
cnt = min(count, (tick - curPlayer.GetPlayerActionTick()) / curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_PowerPartTime) + 1)
curPlayer.SetDict(ChConfig.Def_PlayerKey_PowerPartCount, cnt)
SkillPrepareEnd(curPlayer, tick)
else:
curPlayer.SetDict(ChConfig.Def_PlayerKey_PowerPartTime, 0)
curPlayer.SetDict(ChConfig.Def_PlayerKey_PowerPartCount, 0)
# ¹¥»÷ËÙ¶È»áÓ°ÏìÀ½ø¶ÈÌõµÄËÙ¶È
castTime = int(curPlayer.GetAtkInterval()/ChConfig.Def_AtkSpeedBase*curSkill.GetCastTime())
if hasEffect:
# ¼Ç¼Òò¹¥ËÙÓ°Ïìÿ´Î½ø¶Èµ÷Öµ
curPlayer.SetDict(ChConfig.Def_PlayerKey_PowerPartTime, castTime)
count = hasEffect.GetEffectValue(0)
PlayerControl.Sync_PrepareBegin(curPlayer, castTime*count, IPY_GameWorld.pstSkill, curSkill.GetSkillID())
return True
#¼¼ÄÜÊÍ·Åʧ°Ü֪ͨ£¬Ä¿Ç°ÓÃÓÚ½ø¶ÈÌõ¼¼ÄÜ»¹Ã»¿ªÊ¼Ç°ÑéÖ¤²»Í¨¹ýÇé¿ö
def AttackFailNotify(curPlayer, curSkill, reason=0):
sendPack = ChPyNetSendPack.tagMCAttackFail()
sendPack.SkillID = curSkill.GetSkillID()
sendPack.Reason = reason
NetPackCommon.SendFakePack(curPlayer, sendPack)
#--------------------------Íæ¼ÒʹÓü¼ÄÜ
#===============================================================================
# //06 02 ÈËÎïʹÓü¼ÄÜ#tagRoleUseSkill
# tagRoleUseSkill * GettagRoleUseSkill();
#
# class IPY_RoleUseSkill
# {
# public:
#
# int GetSkillID();
#
# int GetPosX();
#
# int GetPosY();
# };
#===============================================================================
##¿Í»§¶Ë·â°üÏìÓ¦ //06 02 ÈËÎïʹÓü¼ÄÜ#tagRoleUseSkill
# @param index Íæ¼ÒË÷Òý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //06 02 ÈËÎïʹÓü¼ÄÜ#tagRoleUseSkill
def UseSkill(index, tick):
GameWorld.GetPsycoFunc(__Func_UseSkill)(index, tick)
return
##¿Í»§¶Ë·â°üÏìÓ¦ //06 02 ÈËÎïʹÓü¼ÄÜ#tagRoleUseSkill
# @param index Íæ¼ÒË÷Òý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //06 02 ÈËÎïʹÓü¼ÄÜ#tagRoleUseSkill
def __Func_UseSkill(index, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
curPlayerID = curPlayer.GetID()
#-----------»ñÈ¡·â°üÊý¾Ý
sendPack = IPY_GameWorld.IPY_RoleUseSkill()
pack_SkillID = sendPack.GetSkillID()
pack_PosX = sendPack.GetPosX()
pack_PosY = sendPack.GetPosY()
curSkill = curPlayer.GetSkillManager().FindSkillBySkillID(pack_SkillID)
if not curSkill:
GameWorld.ErrLog('UseSkill findSkillErr = %s'%(pack_SkillID), curPlayerID)
return
if not __CheckPlayerUseSkill_ClientPack(curPlayer, pack_PosX, pack_PosY, curSkill):
return
#ʹÓü¼ÄÜÐÐΪ״̬, ¿Í»§¶ËÏÞÖÆ
if not OperControlManager.IsObjCanDoAction(curPlayer,
ChConfig.Def_Obj_ActState_ClientSkill,
curSkill.GetSkillOfSeries()):
return
#¼¤»îÍæ¼Ò,½â³ý´ôÖÍ
PlayerControl.SetIsNeedProcess(curPlayer, True)
#´Ë´¦²»¼ì²éºÏ·¨ÐÔ, ÔÚÕæÕýÒªÓõÄʱºòÔÙ¼ì²é
curPlayer.ClearUseSkillRec()
curPlayer.SetUseSkill(curSkill.GetSkillData())
#ÉèÖù¥»÷ÆðµãÎªÍæ¼Ò×ÔÉí×ø±ê
curPlayer.SetAttackTargetPos(curPlayer.GetPosX(), curPlayer.GetPosY())
#ÒѾÔÚ¹¥»÷ÖÐ
if curPlayer.GetPlayerAction() == IPY_GameWorld.paAttack:
return
#ÉèÖù¥»÷±ê־λ
PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paAttack)
#Ö´ÐÐÕ½¶·Âß¼
PlayerState.ProcessFight(curPlayer, tick)
#===============================================================================
# if playerLastAction != IPY_GameWorld.paAttack:
# #Íæ¼ÒÓɷǹ¥»÷״̬½øÈë¹¥»÷״̬, ´¥·¢Ò»´ÎÍæ¼Ò״̬ˢÐÂ
# PlayerState.ProcessPlayerState(curPlayer, tick)
# return
#===============================================================================
return
#---------------------------------------------------------------------
#===============================================================================
# //06 03 ÓжÔÏóµÄʹÓü¼ÄÜ#tagCUseSkillTag
# tagCUseSkillTag * GettagCUseSkillTag();
#
# class IPY_CUseSkillTag
# {
# public:
#
# int GetSkillID();
# //OBJÀàÐÍ
# int GetTagType();
#
# int GetTagID();
#
# int GetPosX();
#
# int GetPosY();
# };
#===============================================================================
##¿Í»§¶Ë·â°üÏìÓ¦ //06 03 ÓжÔÏóµÄʹÓü¼ÄÜ#tagCUseSkillTag
# @param index Íæ¼ÒË÷Òý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //06 03 ÓжÔÏóµÄʹÓü¼ÄÜ#tagCUseSkillTag
def UseSkillTag(index, tick):
GameWorld.GetPsycoFunc(__Func_UseSkillTag)(index, tick)
return
##¿Í»§¶Ë·â°üÏìÓ¦ //06 03 ÓжÔÏóµÄʹÓü¼ÄÜ#tagCUseSkillTag
# @param index Íæ¼ÒË÷Òý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //06 03 ÓжÔÏóµÄʹÓü¼ÄÜ#tagCUseSkillTag
def __Func_UseSkillTag(index, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
curPlayerID = curPlayer.GetID()
#----------»ñÈ¡·â°üÊý¾Ý
sendPack = IPY_GameWorld.IPY_CUseSkillTag()
pack_SkillID = sendPack.GetSkillID()
pack_TagType = sendPack.GetTagType()
pack_TagID = sendPack.GetTagID()
pack_PosX = sendPack.GetPosX()
pack_PosY = sendPack.GetPosY()
curSkill = curPlayer.GetSkillManager().FindSkillBySkillID(pack_SkillID)
if not curSkill:
#GameWorld.ErrLog(' UseSkillTag FindSkillerr = %s '%(pack_SkillID), curPlayerID)
return
#ʹÓü¼ÄÜÐÐΪ״̬, ¿Í»§¶ËÏÞÖÆ
if not OperControlManager.IsObjCanDoAction(curPlayer,
ChConfig.Def_Obj_ActState_ClientSkill,
curSkill.GetSkillOfSeries()):
return
if not __CheckPlayerUseSkill_ClientPack(curPlayer, pack_PosX, pack_PosY, curSkill):
return
#¼¤»îÍæ¼Ò,½â³ý´ôÖÍ
PlayerControl.SetIsNeedProcess(curPlayer, True)
#´Ë´¦²»¼ì²éºÏ·¨ÐÔ, ÔÚÕæÕýÒªÓõÄʱºòÔÙ¼ì²é
curPlayer.ClearUseSkillRec()
curPlayer.SetUseSkill(curSkill.GetSkillData())
curPlayer.SetUseSkillTagType(pack_TagType)
curPlayer.SetUseSkillTagID(pack_TagID)
#@warning: ÉèÖù¥»÷ÆðµãΪ¿Í»§¶Ë·¢Ë͵Ä×ø±ê(´Ë´¦½«»á±»Íâ¹ÒÀûÓÃ)
curPlayer.SetAttackTargetPos(pack_PosX, pack_PosY)
#ÒѾÔÚ¹¥»÷ÖÐ
if curPlayer.GetPlayerAction() == IPY_GameWorld.paAttack:
return
#ÉèÖù¥»÷±ê־λ
PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paAttack)
#Ö´ÐÐÕ½¶·Âß¼
PlayerState.ProcessFight(curPlayer, tick)
#===============================================================================
# if playerLastAction != IPY_GameWorld.paAttack:
# #Íæ¼ÒÓɷǹ¥»÷״̬½øÈë¹¥»÷״̬, ´¥·¢Ò»´ÎÍæ¼Ò״̬ˢÐÂ
# PlayerState.ProcessPlayerState(curPlayer, tick)
# return
#===============================================================================
return
#---------------------------------------------------------------------
#===============================================================================
# //06 07 ¶ÔµØÃæÊ¹Óü¼ÄÜ#tagCUseSkillGround
# tagCUseSkillGround * GettagCUseSkillGround();
#
# class IPY_CUseSkillGround
# {
# public:
#
# int GetSkillID();
#
# int GetPosX();
#
# int GetPosY();
#
# int GetTagPosX();
#
# int GetTagPosY();
# };
#===============================================================================
##¿Í»§¶Ë·â°üÏìÓ¦ //06 07 ¶ÔµØÃæÊ¹Óü¼ÄÜ#tagCUseSkillGround
# @param index Íæ¼ÒË÷Òý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //06 07 ¶ÔµØÃæÊ¹Óü¼ÄÜ#tagCUseSkillGround
def UseSkillGround(index, tick):
GameWorld.GetPsycoFunc(__Func_UseSkillGround)(index, tick)
return
##¿Í»§¶Ë·â°üÏìÓ¦ //06 07 ¶ÔµØÃæÊ¹Óü¼ÄÜ#tagCUseSkillGround
# @param index Íæ¼ÒË÷Òý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ //06 07 ¶ÔµØÃæÊ¹Óü¼ÄÜ#tagCUseSkillGround
def __Func_UseSkillGround(index, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
curPlayerID = curPlayer.GetID()
#----------------»ñÈ¡·â°üÊý¾Ý
sendPack = IPY_GameWorld.IPY_CUseSkillGround()
pack_SkillID = sendPack.GetSkillID()
pack_PosX = sendPack.GetPosX()
pack_PosY = sendPack.GetPosY()
pack_TagPosX = sendPack.GetTagPosX()
pack_TagPosY = sendPack.GetTagPosY()
curSkill = curPlayer.GetSkillManager().FindSkillBySkillID(pack_SkillID)
if not curSkill:
GameWorld.ErrLog('UseSkillGround findSkillErr = %s'%(pack_SkillID), curPlayerID)
return
#ʹÓü¼ÄÜÐÐΪ״̬, ¿Í»§¶ËÏÞÖÆ
if not OperControlManager.IsObjCanDoAction(curPlayer,
ChConfig.Def_Obj_ActState_ClientSkill,
curSkill.GetSkillOfSeries()):
return
if not __CheckPlayerUseSkill_ClientPack(curPlayer, pack_PosX, pack_PosY, curSkill):
return
#===============================================================================
# #ÅжÏ2µã¼äÊÇ·ñÓÐÕϰ
# curMap = GameWorld.GetMap()
#
# if ( not curMap.CanLineTo(skillPosX,skillPosY,skillTagPosX, skillTagPosY) and
# not curMap.CanLineTo(skillTagPosX,skillTagPosY,skillPosX,skillPosY) ):
# GameWorld.Log("ÊÍ·¨ÖмäÓÐÕϰ")
# return
#===============================================================================
#¼¤»îÍæ¼Ò,½â³ý´ôÖÍ
PlayerControl.SetIsNeedProcess(curPlayer, True)
#playerLastAction = curPlayer.GetPlayerAction()
#´Ë´¦²»¼ì²éºÏ·¨ÐÔ, ÔÚÕæÕýÒªÓõÄʱºòÔÙ¼ì²é
curPlayer.ClearUseSkillRec()
curPlayer.SetUseSkill(curSkill.GetSkillData())
curPlayer.SetUseSkillPosX(pack_TagPosX)
curPlayer.SetUseSkillPosY(pack_TagPosY)
#@warning: ÉèÖù¥»÷ÆðµãΪ¿Í»§¶Ë·¢Ë͵Ä×ø±ê(´Ë´¦½«»á±»Íâ¹ÒÀûÓÃ)
curPlayer.SetAttackTargetPos(pack_PosX, pack_PosY)
#ÒѾÔÚ¹¥»÷ÖÐ
if curPlayer.GetPlayerAction() == IPY_GameWorld.paAttack:
return
#ÉèÖù¥»÷±ê־λ
PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paAttack)
#Ö´ÐÐÕ½¶·Âß¼
PlayerState.ProcessFight(curPlayer, tick)
#===============================================================================
# if playerLastAction != IPY_GameWorld.paAttack:
# #Íæ¼ÒÓɷǹ¥»÷״̬½øÈë¹¥»÷״̬, ´¥·¢Ò»´ÎÍæ¼Ò״̬ˢÐÂ
# PlayerState.ProcessPlayerState(curPlayer, tick)
# return
#===============================================================================
return
#---------------------------------------------------------------------
##¼ì²é¿Í»§¶Ë·¢Ëͼ¼ÄÜ·â°ü, ÕâÀïÖ»¼òµ¥¼ì²éÒ»ÏÂ
# @param curPlayer Íæ¼ÒʵÀý
# @param posX ·â°üÊ©·¨Õß×ø±êX
# @param posY ·â°üÊ©·¨Õß×ø±êY
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ¼ì²é¿Í»§¶Ë·¢Ëͼ¼ÄÜ·â°ü, ÕâÀïÖ»¼òµ¥¼ì²éÒ»ÏÂ
def __CheckPlayerUseSkill_ClientPack(curPlayer, posX, posY, curSkill):
if GameObj.GetHP(curPlayer) <= 0:
return
if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
#GameWorld.DebugLog("×Ô¶¨Ò峡¾°ÖУ¬²»¼ì²é!")
return True
#===========================================================================
# if curPlayer.IsMoving():
# GameWorld.DebugLog("ÒÆ¶¯Öв»¿ÉʹÓü¼ÄÜ")
# return False
#===========================================================================
if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvHorse:
#GameWorld.DebugLog("ÆïÂíÖв»ÔÊÐíÊͷż¼ÄÜ", curPlayerID)
PlayerHorse.PlayerRideHorseDown(curPlayer)
if not PlayerControl.PlayerCanStateTransfer(curPlayer):
#GameWorld.DebugLog('CheckUseSkill, PlayerStateErr = %s '%( curPlayer.GetPlayerAction() ), curPlayerID )
return False
# ×Ë̬¼¼Äܰ²È«Çø¿ÉʹÓÃ
if GameMap.GetAreaTypeByMapPos(curPlayer.GetPosX(), curPlayer.GetPosY()) == IPY_GameWorld.gatSafe:
if curSkill.GetSkillID() != ChConfig.Def_SkillID_Somersault:
#GameWorld.DebugLog("°²È«Çø")
return False
# ·Å¼¼ÄÜǰÏȸüÐÂÍæ¼ÒµÄ×ø±ê updateposÓÐʱºò»áÂýµ¼ÖÂ×ø±êÎó²î£¬changepos»áÌáǰµ½´ïÉÏÒ»¸öÒÆ¶¯µã
#===========================================================================
# if curPlayer.IsMoving() and GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), curPlayer.GetDestPosX(), curPlayer.GetDestPosY()) <= 3:
# #GameWorld.DebugLog("¹¥»÷Ìáǰµ½´ïÉÏÒ»¸öÒÆ¶¯µã--- -%s %s"%(curPlayer.GetDestPosX(), curPlayer.GetDestPosY()))
# curPlayer.ChangePos(curPlayer.GetDestPosX(), curPlayer.GetDestPosY())
#===========================================================================
if not PlayerControl.PlayerRefreshPos(curPlayer, curPlayer, posX, posY, False):
#Íæ¼Òµ±Ç°Î»ÖÃË¢ÐÂʧ°Ü
#GameWorld.DebugLog(' CheckUseSkill RefreshPosErr packPos = ( %s, %s ), playerPos = ( %s, %s )'%( posX, posY, curPlayer.GetPosX(), curPlayer.GetPosY() ), curPlayerID )
return False
return True
#------------------------------------·â°ü´«µÝÍê±Ï,¿ªÊ¼Âß¼´¦Àí---------------------------------
##Íæ¼ÒÊÍ·ÅÎÞÄ¿±ê¼¼ÄÜ
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, Ê©·¨³É¹¦
# @remarks ×Ô¶¨Ò庯Êý, Íæ¼ÒÊÍ·ÅÎÞÄ¿±ê¼¼ÄÜ
def DoPlayerUseSkill(curPlayer, curSkill, tick):
if not CheckSkillCondition(curPlayer, curSkill, tick):
return
if GetSkillFireAim(curSkill) != ChConfig.Def_UseSkillAim_None:
return
if curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List:
return DoLogic_UseSkill(curPlayer, None, curSkill, tick, curPlayer.GetPosX(), curPlayer.GetPosY())
else:
return DoLogic_UseSkill(curPlayer, curPlayer, curSkill, tick)
#---------------------------------------------------------------------
##Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param curTag Ä¿±êʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, Ê©·¨³É¹¦
# @remarks ×Ô¶¨Ò庯Êý, Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ
def DoPlayerUseSkillTag(curPlayer, curSkill, curTag, tick):
#¹«Óüì²é
if not CheckSkillCondition(curPlayer, curSkill, tick):
GameWorld.DebugLog("DoPlayerUseSkillTag, ²»Âú×ãʹÓÃÌõ¼þ")
return
#¼ì²éÄ¿±ê
if not CheckTag_DoPlayerUseSkillTag(curPlayer, curSkill, curTag, tick):
#GameWorld.Log("DoPlayerUseSkillTag = %s, ¼ì²éÄ¿±êÊÇ·ñ¿ÉÒÔ¹¥»÷ʧ°Ü = %s"%( curSkill.GetTag(), curTag.GetName() ) )
return
#Êͷż¼ÄÜ
return DoLogic_UseSkill(curPlayer, curTag, curSkill, tick)
#---------------------------------------------------------------------
##Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param curTag Ä¿±êʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ×Ô¶¨Ò庯Êý, Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó
def CheckTag_DoPlayerUseSkillTag(curPlayer, curSkill, curTag, tick):
curSkillUseTag = GetSkillAffectTag(curSkill)
#¶ÔÍæ¼ÒʬÌåÊÍ·Å
if curSkillUseTag == ChConfig.Def_UseSkillTag_PlayerAshes:
return __DoPlayerUseSkillTag_PlayerAshes(curPlayer, curTag)
#---ÒÔϼ¼ÄÜ, ²»¿É¶ÔËÀÍöÄ¿±êÊÍ·Å---
if GameObj.GetHP(curTag) <= 0:
return
#×Ô¼º¼°ÓѺÃ
if curSkillUseTag == ChConfig.Def_UseSkillTag_SelfAndFriend:
return __DoPlayerUseSkillTag_SelfAndFriend(curPlayer, curTag, curSkill, tick)
#¶Ô»îµÄÍæ¼ÒÊÍ·Å
if curSkillUseTag == ChConfig.Def_UseSkillTag_PlayerHasHP:
return __DoPlayerUseSkillTag_PlayerHasHP(curPlayer, curTag)
#¶ÓÓÑÊÍ·Å
if curSkillUseTag == ChConfig.Def_UseSkillTag_Team:
return __DoPlayerUseSkillTag_Team(curPlayer, curTag)
#¶Ô×Ô¼º¡¢ÓѺü°¿É¹¥»÷µ¥Î»ÊÍ·Å
if curSkillUseTag == ChConfig.Def_UseSkillTag_SelfFriendAttack:
return __DoPlayerUseSkillTag_SelfFriendAttack(curPlayer, curTag, curSkill, tick)
#---ÒÔϼ¼ÄÜ, ²»¿É¶ÔËÀÍöÄ¿±êÊÍ·Å ¼° ²»¿É¶Ô×Ô¼ºÊÍ·Å---
if GameWorld.IsSameObj(curPlayer, curTag):
return
#ÓѺÃÄ¿±êÊÍ·Å
if curSkillUseTag == ChConfig.Def_UseSkillTag_Friend:
return __DoPlayerUseSkillTag_Friend(curPlayer, curTag, curSkill, tick)
#¿É¹¥»÷Ä¿±êÊÍ·Å
if curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttack:
return __DoPlayerUseSkillTag_CanAttack(curPlayer, curTag, curSkill, tick)
#¿É¹¥»÷¹ÖÎï
if curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttackNPC:
return __DoPlayerUseSkillTag_CanAttackEx(curPlayer, curTag,
curSkill, IPY_GameWorld.gotNPC, tick)
#¿É¹¥»÷Íæ¼Ò
if curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttackPlayer:
return __DoPlayerUseSkillTag_CanAttackEx(curPlayer, curTag,
curSkill, IPY_GameWorld.gotPlayer, tick)
#¿É¹¥»÷µÄÒ°ÍâС¹Ö£¨º¬¾«Ó¢£©¹ÖÎï
if curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttackBaseNPC:
if curTag.GetGameObjType() != IPY_GameWorld.gotNPC:
return False
if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
return False
if curTag.GetIsBoss() > ChConfig.Def_NPCType_Ogre_Super:
return False
return __DoPlayerUseSkillTag_CanAttackEx(curPlayer, curTag,
curSkill, IPY_GameWorld.gotNPC, tick)
GameWorld.ErrLog('curSkillUseTag noFind = %s'%(curSkillUseTag))
return False
#---------------------------------------------------------------------
##Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ×Ô¼º¼°ÓѺÃÄ¿±ê
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param curTag Ä¿±êʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ×Ô¶¨Ò庯Êý, Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ×Ô¼º¼°ÓѺÃÄ¿±ê
def __DoPlayerUseSkillTag_SelfAndFriend(curPlayer, curTag, curSkill, tick):
if GameWorld.IsSameObj(curPlayer, curTag):
return True
return __DoPlayerUseSkillTag_Friend(curPlayer, curTag, curSkill, tick)
#---------------------------------------------------------------------
##Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param curTag Ä¿±êʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ×Ô¼º¡¢ÓѺü°¿É¹¥»÷µ¥Î»
def __DoPlayerUseSkillTag_SelfFriendAttack(curPlayer, curTag, curSkill, tick):
#×Ô¼º£¬·µ»ØÕæ
if GameWorld.IsSameObj(curPlayer, curTag):
return True
#¹ØÏµ
relation = BaseAttack.GetTagRelation(curPlayer, curTag, curSkill, tick)
#ÓѺùØÏµ£¬·µ»ØÕæ
if relation[0] == ChConfig.Type_Relation_Friend :
return True
return __DoPlayerUseSkillTag_CanAttack(curPlayer, curTag, curSkill, tick)
#---------------------------------------------------------------------
##Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ¿É¹¥»÷Ä¿±ê
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param curTag Ä¿±êʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ×Ô¶¨Ò庯Êý, Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ¿É¹¥»÷Ä¿±ê
def __DoPlayerUseSkillTag_CanAttack(curPlayer, curTag, curSkill, tick):
#²»¿É¹¥»÷Ä¿±ê·µ»Ø
if not BaseAttack.GetCanAttack(curPlayer, curTag, curSkill, tick):
return False
#¹ØÏµ·ÇµÐ¶Ô·µ»Ø
relation = BaseAttack.GetTagRelation(curPlayer, curTag, curSkill, tick)
if relation[0] == ChConfig.Type_Relation_Enemy :
return True
if curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_FbSkill:
AttackCommon.PlayerAttackFailSysMessanage(curPlayer, relation[1])
return False
##Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ¿É¹¥»÷¹ÖÎï
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param curTag Ä¿±êʵÀý
# @param objType Íæ¼ÒÀàÐÍ
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ¿É¹¥»÷¹ÖÎï
def __DoPlayerUseSkillTag_CanAttackEx(curPlayer, curTag, curSkill, objType, tick):
#²»ÊÇNPC²»¹¥»÷
if curTag.GetGameObjType() != objType:
return False
return __DoPlayerUseSkillTag_CanAttack(curPlayer, curTag, curSkill, tick)
#---------------------------------------------------------------------
##Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ÓѺÃÄ¿±êÊÍ·Å
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param curTag Ä¿±êʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ×Ô¶¨Ò庯Êý, Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ÓѺÃÄ¿±êÊÍ·Å
def __DoPlayerUseSkillTag_Friend(curPlayer, curTag, curSkill, tick):
#¹ØÏµ
relation = BaseAttack.GetTagRelation(curPlayer, curTag, curSkill, tick)
if relation[0] == ChConfig.Type_Relation_Friend :
return True
if curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_FbSkill:
AttackCommon.PlayerAttackFailSysMessanage(curPlayer, relation[1])
return False
#---------------------------------------------------------------------
##Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ¶ÓÔ±ÊÍ·Å
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param curTag Ä¿±êʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ×Ô¶¨Ò庯Êý, Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¼ì²éÄ¿±ê¶ÔÏóÊÇ·ñ·ûºÏÒªÇó, ¶ÓÔ±ÊÍ·Å
def __DoPlayerUseSkillTag_Team(curPlayer, curTag):
if curTag.GetGameObjType() != IPY_GameWorld.gotPlayer:
return False
#ÎÞ×é¶ÓµÄʱºòÒª¸ø×Ô¼º´¦Àí
if GameWorld.IsSameObj(curPlayer, curTag):
return True
curPlayerTeamID = curPlayer.GetTeamID()
curTagTeamID = curTag.GetTeamID()
if not curPlayerTeamID or not curTagTeamID:
return False
return (curPlayerTeamID == curTagTeamID)
#---------------------------------------------------------------------
##Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¶ÔʬÌåÊÍ·Å
# @param curPlayer Íæ¼ÒʵÀý
# @param curTag Ä¿±êʵÀý
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ×Ô¶¨Ò庯Êý, Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¶ÔʬÌåÊÍ·Å
def __DoPlayerUseSkillTag_PlayerAshes(curPlayer, curTag):
if curTag.GetGameObjType() != IPY_GameWorld.gotPlayer:
return
return (GameObj.GetHP(curTag) <= 0)
#---------------------------------------------------------------------
##Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¶Ô»îµÄÍæ¼ÒÊÍ·Å
# @param curPlayer Íæ¼ÒʵÀý
# @param curTag Ä¿±êʵÀý
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ×Ô¶¨Ò庯Êý, Íæ¼ÒÊÍ·ÅÓÐÄ¿±ê¼¼ÄÜ, ¶Ô»îµÄÍæ¼ÒÊÍ·Å
def __DoPlayerUseSkillTag_PlayerHasHP(curPlayer, curTag):
if curTag.GetGameObjType() != IPY_GameWorld.gotPlayer:
return
return (GameObj.GetHP(curTag) > 0)
#---------------------------------------------------------------------
##Íæ¼ÒÊͷŶԵØÃæ¼¼ÄÜ
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param destX Ä¿±ê×ø±êX
# @param destY Ä¿±ê×ø±êY
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, Êͷųɹ¦
# @remarks ×Ô¶¨Ò庯Êý, Íæ¼ÒÊͷŶԵØÃæ¼¼ÄÜ
def DoPlayerUseSkillGround(curPlayer, curSkill, destX, destY, tick):
#ͨÓÃÌõ¼þ¼ì²é
if not CheckSkillCondition(curPlayer, curSkill, tick):
#GameWorld.Log("DoPlayerUseSkillGround, ²»Âú×ãʹÓÃÌõ¼þ")
return
#רÓм¼ÄÜÀàÐͼì²é
if GetSkillFireAim(curSkill) != ChConfig.Def_UseSkillAim_Ground:
#GameWorld.Log("²»ÊǶԵØÊÍ·ÅÀ༼ÄÜ")
return
#ÐèÒª¼ì²é¿Í»§¶Ë·¢µÄ¾àÀë
# dist = GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), destX, destY)
#
# #ÕâÀïÖ»ÅжÏÓÐÅäÖù¥»÷¾àÀëÏÞÖÆµÄÇé¿ö; ·ÀÖ¹ÒÆ¶¯Ê©·¨Ê±£¬¹¥»÷¾àÀëΪ0µÄÔµØÊͷż¼ÄÜÀàÐÍż·¢ÎÞ·¨ÊͷŵÄÎÊÌâ
# if curSkill.GetAtkDist() > 0 and dist > curSkill.GetAtkDist():
# #GameWorld.Log('###¿Í»§¶Ë·¢°ü, ȺÌå¹¥»÷ = %s , ¾àÀë¹ýÔ¶( %s , %s) , Æðµã(%s , %s), Ä¿±ê(%s, %s)'%(curSkill.GetSkillName() , dist , curSkill.GetAtkDist() , curPlayer.GetPosX(), curPlayer.GetPosY(), destX, destY ))
# return
#ÊÇÕϰµã,²»ÄÜÊÍ·Å£¬Ìø³ö
#if not GameWorld.GetMap().CanMove(destX, destY):
# #GameWorld.Log("Ä¿±êΪÕϰµã %s"%([destX, destY]))
# return
#---Óпͻ§¶ËÄ¿±êÓÅÏÈÒÔµÚһĿ±êΪÖÐÐÄ
defender = None
useSkillTagID = curPlayer.GetUseSkillTagID()
useSkillTagType = curPlayer.GetUseSkillTagType()
if useSkillTagID:
defender = GameWorld.GetObj(useSkillTagID, useSkillTagType)
return DoLogic_UseSkill(curPlayer, defender, curSkill, tick, tagRoundPosX = destX, tagRoundPosY = destY)
#---------------------------------------------------------------------
## ¶ÔÏóʹÓü¼ÄÜͨÓÃ(°üº¬ÓÐÄ¿±êºÍÎÞÄ¿±ê)
# @param attacker ¹¥»÷ÕßʵÀý
# @param defender ·ÀÊØÕßʵÀý
# @param curSkill ¼¼ÄÜʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎªÕæ, Êͷųɹ¦
# @remarks ¡°´ò³ö×ÔÉíÉ˺¦µÄX%¸½¼ÓYÖµ¡±ÕâÒ»ÀàÆÕͨ¹¥»÷¼¼ÄÜÀàÐÍʵÏÖÂß¼
def ObjAutoUseSkill(attacker, defender, curSkill, tick):
curTag = defender
attackerObjType = attacker.GetGameObjType()
skillAffectTag = GetSkillAffectTag(curSkill)
skillAim = GetSkillFireAim(curSkill)
# Íæ¼Ò
if attackerObjType == IPY_GameWorld.gotPlayer:
#ÎÞÄ¿±ê¼¼ÄÜ
if skillAim == ChConfig.Def_UseSkillAim_None:
return DoPlayerUseSkill(attacker, curSkill, tick)
#¶Ô×Ô¼ºÊͷż¼ÄÜ
elif skillAffectTag in ChConfig.Def_ST_CanPlayerUseSkill:
return DoPlayerUseSkillTag(attacker, curSkill, attacker, tick)
#ÆäËü¶ÔÏó¼¼ÄÜ
else:
return DoPlayerUseSkillTag(attacker, curSkill, curTag, tick)
elif attackerObjType == IPY_GameWorld.gotNPC:
# ¶Ô×ÔÉíÊÍ·Å»òÕßÎÞÄ¿±ê¼¼ÄÜ
if skillAffectTag in ChConfig.Def_ST_CanNPCUseSkill or skillAim == ChConfig.Def_UseSkillAim_None:
#ÊÍ·Å×ÔÉíÀ༼ÄÜ
return NPCUseSkill(attacker, curSkill, tick)
# ³èÎï¶ÔÖ÷ÈËÊͷż¼ÄÜ
elif skillAffectTag == ChConfig.Def_UseSkillTag_PetMaster:
if not PetControl.IsPet(attacker):
GameWorld.ErrLog("¸ÃNPC·Ç³èÎÎÞ·¨»ñµÃÖ÷ÈËÊͷż¼ÄÜ")
return False
petOwner = PetControl.GetPetOwner(attacker)
if petOwner == None:
GameWorld.ErrLog("³èÎ%s£©¶ÔÖ÷ÈËÊͷż¼ÄÜ£¬ÕÒ²»µ½Ö÷ÈË"%attacker.GetRolePet().PetID)
return False
curTag = petOwner
# ÕÙ»½ÊÞ¶ÔÖ÷ÈËÊͷż¼ÄÜ
elif skillAffectTag == ChConfig.Def_UseSkillTag_SummonMaster:
if not NPCCommon.IsSummonNPC(attacker):
GameWorld.ErrLog("¸ÃNPC·ÇÕÙ»½ÊÞ£¬ÎÞ·¨»ñµÃÖ÷ÈËÊͷż¼ÄÜ")
return False
curSummonOwner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, attacker)
if curSummonOwner == None:
curSummonOwner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotNPC, attacker)
if curSummonOwner == None:
GameWorld.ErrLog("ÕÙ»½ÊÞ£¨%s£©¶ÔÖ÷ÈËÊͷż¼ÄÜ£¬ÕÒ²»µ½Ö÷ÈË" % attacker.GetNPCID())
return
curTag = curSummonOwner
return NPCUseSkillTag(attacker, curTag, curSkill, tick)
return False
#---------------------------------------------------------------------
##ÅжÏÍæ¼ÒÊÇ·ñÓµÓÐÕâ¸öÀàÐͼ¼ÄÜ
# @param curPlayer Íæ¼ÒʵÀý
# @param skill ¼¼ÄÜʵÀý
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ÅжÏÍæ¼ÒÊÇ·ñÓµÓÐÕâ¸öÀàÐͼ¼ÄÜ
def CheckPlayerHasSkill(curPlayer , skill):
skillTypeID = skill.GetSkillTypeID()
skillManager = curPlayer.GetSkillManager()
for i in range(0 , skillManager.GetSkillCount()):
curPlayerSkill = skillManager.GetSkillByIndex(i)
if curPlayerSkill.GetSkillTypeID() == skillTypeID:
return True
return False
#---------------------------------------------------------------------
#===============================================================================
# //03 04 Íæ¼Òѧϰ¼¼ÄÜ#tagCAddSkillPoint
# tagCAddSkillPoint * GettagCAddSkillPoint();
#
# class IPY_CAddSkillPoint
# {
# public:
#
# int GetSkillID();
# };
#===============================================================================
##¿Í»§¶Ë·â°üÏìÓ¦ //03 04 Íæ¼Òѧϰ¼¼ÄÜ#tagCAddSkillPoint
# @param index Íæ¼ÒË÷Òý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks Íæ¼ÒÉý¼¶¼¼ÄÜ
def PlayerSkillLvUp(index, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
if curPlayer.GetPlayerAction() in ChConfig.Def_Player_Cannot_LearnLvSkill_State:
return
#»ñµÃ·â°ü
pack = IPY_GameWorld.IPY_CAddSkillPoint()
#Éý¼¶¼¼ÄÜID
skillTypeID = pack.GetSkillID()
#»ñµÃÍæ¼Ò¼¼ÄܹÜÀíÆ÷
skillManager = curPlayer.GetSkillManager()
#»ñµÃ¼¼ÄÜ
curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
if curSkill == None:
curSkillLV = 0
beforeFightPower = 0
else:
curSkillLV = curSkill.GetSkillLV()
beforeFightPower = curSkill.GetFightPower()
if curSkillLV == curSkill.GetSkillMaxLV():
#ÒѾÊÇ×î¸ßµÈ¼¶
PlayerControl.NotifyCode(curPlayer, "UseMagicLost16")
return
upSkillLv = curSkillLV + 1
curSkillID = skillTypeID if not curSkill else curSkill.GetSkillID()
upSkill = GameWorld.GetGameData().FindSkillByType(skillTypeID, upSkillLv)
if not upSkill:
return
#Éý¼¶¼¼ÄÜÏûºÄ
if not DoLogic_PlayerSkillLvUpCost(curPlayer, skillTypeID, curSkillID, upSkillLv, curSkill):
return
#Éý¼¶Õâ¸ö¼¼ÄÜ
skillManager.LVUPSkillByID(curSkillID)
# curPlayer.SetFreeSkillPoint(curPlayer.GetFreeSkillPoint() - 1 )
curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
#ÊDZ»¶¯¼¼ÄÜÒªÖØË¢ÊôÐÔ£¬ÐèÇø·Ö×°±¸²ÅÉúЧµÄ±»¶¯¼¼ÄÜ
#===========================================================================
# if SkillCommon.isPassiveSkill(curSkill) and \
# curSkill.GetFuncType() not in [ChConfig.Def_SkillFuncType_FbPassiveSkill, ChConfig.Def_SkillFuncType_FbSPSkill]:
# BuffSkill.AddBuffNoRefreshState(curPlayer, IPY_GameWorld.btPassiveBuf, curSkill,
# 0, [], buffOwner = curPlayer)
#===========================================================================
if curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_HorseSkill and SkillCommon.isPassiveAttr(curSkill):
PlayerHorse.RefreshHorseAttr(curPlayer)
else:
if SkillCommon.isPassiveAttr(curSkill):
curControl = PlayerControl.PlayerControl(curPlayer)
curControl.RefreshPlayerAttrState()
else:
PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, curSkill.GetSkillID())
#curControl = PlayerControl.PlayerControl(curPlayer)
#curControl.CalcPassiveBuffAttr()
#curControl.RefreshAllState()
PlayerControl.PlayerControl(curPlayer).RefreshSkillFightPowerEx(curSkill.GetSkillID(), beforeFightPower)
#Éý¼¶¼¼ÄÜCDÖ±½ÓÀäÈ´
curSkill.SetRemainTime(0)
if curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_HorseSkill:
PlayerControl.WorldNotify(0, 'GetMountSkill', [curPlayer.GetName(), curSkillID])
else:
#֪ͨ¼¼ÄÜÒÑÉý¼¶³É¹¦ GeRen_admin_31379
PlayerControl.NotifyCode(curPlayer, "GeRen_admin_31379", [curSkillID, curSkill.GetSkillLV()])
#»ñµÃ¼¼Äܵȼ¶
curSkillLV = curSkill.GetSkillLV()
DataRecordPack.DR_LearnORUPSkill(curPlayer, curSkillID, curSkillLV)
EventShell.EventRespons_SkillUp(curPlayer, curSkill.GetFuncType(), curSkillLV)
GameWorld.Log("Éý¼¶¼¼ÄÜÃû = %s ³É¹¦, µ±Ç°µÈ¼¶ = %s"%(curSkill.GetSkillName(), curSkill.GetSkillLV()), curPlayer.GetPlayerID())
return True
#---------------------------------------------------------------------
##ѧϰ¼¼ÄÜÏûºÄÂß¼
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkillTypeID ¼¼ÄÜÀàÐÍID
# @param curSkillID ¼¼ÄÜID
# @param upSkillLv ÏÂÒ»µÈ¼¶
# @return BOOL ÊÇ·ñ¿Û³ýÏûºÄ³É¹¦
def DoLogic_PlayerSkillLvUpCost(curPlayer, curSkillTypeID, curSkillID, upSkillLv, curSkill=None):
upSkill = GameWorld.GetGameData().FindSkillByType(curSkillTypeID, upSkillLv)
if upSkill == None:
#ÎÞ´ËÉý¼¶¼¼ÄÜ
GameWorld.ErrLog("ÎÞ´ËÉý¼¶¼¼ÄÜ = %s,%s"%(curSkillTypeID, upSkillLv), curPlayer.GetID())
return False
#ѧϰÌõ¼þ¼ì²é
if not CheckLearnSkillCondition(curPlayer, upSkill):
return False
# #×øÆï¼¼ÄÜѧϰÅжÏ
# if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_HorseSkill:
# if not PlayerHorse.CheckLearnHorseSkill(curPlayer, curSkillTypeID):
# return False
#Ì츳¼¼Ñ§Ï°µãÊýÅжÏ
if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_GiftSkill:
if not PlayerGreatMaster.GetGreatMasterFreeSkillPoint(curPlayer):
return False
#¾Ñé¼ì²â
skillLvUpNeedExp = upSkill.GetLVUpCostExp()
curExp = PlayerControl.GetPlayerTotalExp(curPlayer)
#GameWorld.Log("skillLvUpNeedExp=%s curExp=%s"%(skillLvUpNeedExp, curExp))
if curExp < skillLvUpNeedExp:
#¶Ô²»Æð£¬ÄúµÄ¾Ñé²»×㣡GeRen_jin_671654
PlayerControl.NotifyCode(curPlayer, "GeRen_jin_671654")
return False
#ËùÐè½ðÇ®ÀàÐÍ¡¢½ðÇ®ÊýÁ¿
skillLvUpNeedMoneyType = upSkill.GetLVUpCostMoneyType()
skillLvUpNeedMoneyCount = upSkill.GetLVUpCostMoney()
#GameWorld.Log("skillLvUpNeedMoneyType=%s skillLvUpNeedMoneyCount=%s"%(skillLvUpNeedMoneyType, skillLvUpNeedMoneyCount))
#realNeedZhenQi = GetLVUpCostZhenQi(upSkill)
#playerZhenQi = PlayerControl.GetZhenQi(curPlayer)
# if curSkill != None:
# skillProf = curSkill.GetProficiency() # µ±Ç°¼¼ÄÜÊìÁ·¶È
# maxSkillProf = GetSkillLVUpCostZhenQi(curSkill) # ×î´ó¼¼ÄÜÊìÁ·¶È
# proRedFormalZQ, proRedFormalMoney = ReadChConfig.GetEvalChConfig("UpSkillLVReduceCost")
# realNeedZhenQi = max(realNeedZhenQi - eval(proRedFormalZQ), 0) # ÕæÕýÐèÒª¿Û³ýµÄÕæÆø
# skillLvUpNeedMoneyCount = max(skillLvUpNeedMoneyCount - eval(proRedFormalMoney), 0) # ÕæÕýÐèÒª¿Û³ýµÄ½ðÇ®
#ÅжÏÕæÆøÏûºÄ
#if realNeedZhenQi > 0 and playerZhenQi < realNeedZhenQi:
# PlayerControl.NotifyCode(curPlayer, "GeRen_pan_367906") # ÄãµÄÕæÆø²»×ã
# return False
#ÅжÏÎïÆ·ÏûºÄ
itemIndexList = []
costItemId = GetUpLVCostItemId(upSkill)
costItemNum = GetUpLVCostItemNum(upSkill)
if costItemId > 0 and costItemNum > 0:
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
isEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(costItemId, itemPack, costItemNum)
if not isEnough:
GameWorld.DebugLog("DoLogic_PlayerSkillLvUpCost() up skill(%s) item(%s) no enough" \
% (upSkill.GetSkillID(), costItemId))
return
#¸¶Ç®
infoDict = {"SkillID":curSkillID, "SkillLV":upSkillLv, ChConfig.Def_Cost_Reason_SonKey:curSkillTypeID}
if skillLvUpNeedMoneyCount and not PlayerControl.PayMoney(curPlayer, skillLvUpNeedMoneyType, skillLvUpNeedMoneyCount, ChConfig.Def_Cost_SkillLvUp, infoDict):
return False
#¿ÛÎïÆ·
if itemIndexList:
ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemNum, False)
#¿ÛÕæÆø
#if realNeedZhenQi > 0:
# PlayerControl.PlayerLostZhenQi(curPlayer, realNeedZhenQi, "SkillLvUp", {"SkillTypeID":curSkillTypeID, "UpSkillLv":upSkillLv})
# DataRecordPack.DR_ChangeZhenQi(curPlayer, "SkillLvUp", realNeedZhenQi,
# {"skillID":curSkillTypeID, "LV":upSkillLv})
if skillLvUpNeedExp > 0:
#¿Û¾Ñé
PlayerControl.SetPlayerTotalExp(curPlayer, curExp - skillLvUpNeedExp)
#GeRen_jin_474794 ÄúÏûºÄÁ˾ÑéÖµ:{%S1%}
PlayerControl.NotifyCode(curPlayer, "GeRen_jin_474794", [skillLvUpNeedExp])
if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_GiftSkill:
PlayerGreatMaster.AddGreatMasterSkillPointByLV(curPlayer, -1)
return True
#---------------------------------------------------------------------
##¼ì²âѧϰ¼¼ÄÜÐèÇóÌõ¼þ
# @param curPlayer Íæ¼ÒʵÀý
# @param curSkill ʱ¼ä´Á
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
# @remarks ¼ì²âѧϰ¼¼ÄÜÐèÇóÌõ¼þ
def CheckLearnSkillCondition(curPlayer, curSkill):
# #²»¼ì²é×Ë̬¼¼ÄÜ
# return True
#Íæ¼ÒµÈ¼¶ÑéÖ¤Ö»Ñé֤δתÉúǰ
if curPlayer.GetLV() < curSkill.GetLVReq():
# Íæ¼ÒµÈ¼¶²»¹»Éý¼¶
GameWorld.DebugLog('Íæ¼ÒµÈ¼¶²»¹»Éý¼¶ curSkill.GetLVReq()=%s'%curSkill.GetLVReq())
#PlayerControl.NotifyCode(curPlayer, "UseMagicLost12", [upSkillLv])
return False
skillManager = curPlayer.GetSkillManager()
#ǰÖü¼ÄÜÐèÇó
hasLearnSkillReq = False
#·ÖÖ§µã×ܺÍ
numLearnSkillPoint = 0
#µ±Ç°¼¼ÄÜǰÖü¼ÄÜÐèÇó,ǰÖü¼Äܵȼ¶ÐèÇó
curSkillLearnReq = curSkill.GetLearnSkillReq()
lvCurSkillLearnReq = curSkill.GetLearnSkillLV()
#ÐèÒª¶ÔÓ¦Ì츳ϵ±ðµãÊý
learnSkillPointReq = curSkill.GetLearnSkillPointReq() #ϵ±ð*10000+ÐèÒªµãÊý
needSeries, needSeriesPoint= learnSkillPointReq/10000, learnSkillPointReq%10000
curSkillTypeID = curSkill.GetSkillTypeID()
ipyData = IpyGameDataPY.GetIpyGameDataNotLog('TalentSkill', curSkillTypeID)
curTalentType = ipyData.GetTalentType() if ipyData else 0
#»ñÈ¡Íæ¼ÒĿǰËùÓм¼ÄÜ
for i in xrange(skillManager.GetSkillCount()):
skill = skillManager.GetSkillByIndex(i)
if skill == None:
continue
skillTypeID = skill.GetSkillTypeID()
lvSkill = skill.GetSkillLV()
#Âú×ãǰÖü¼ÄÜÐèÇó
if skillTypeID == curSkillLearnReq and lvSkill >= lvCurSkillLearnReq and not hasLearnSkillReq:
hasLearnSkillReq = True
ipyData = IpyGameDataPY.GetIpyGameDataNotLog('TalentSkill', skillTypeID)
if ipyData and ipyData.GetTalentType() is curTalentType and ipyData.GetSeries() is needSeries:
#ͶÈë·ÖÖ§µã×ܺÍ
numLearnSkillPoint += skill.GetSkillLV()
#ÓÐǰÖü¼ÄÜIDÐèÒª
if curSkillLearnReq != 0 and not hasLearnSkillReq:
PlayerControl.NotifyCode(curPlayer, "GeRen_wjr_717982", [curSkillLearnReq, lvCurSkillLearnReq])
return False
#ÓзÖÖ§µã×ܺÍÒªÇó
if learnSkillPointReq != 0 and numLearnSkillPoint < needSeriesPoint:
PlayerControl.NotifyCode( curPlayer, "UseMagicLost13",[ needSeriesPoint ] )
return False
#Íæ¼ÒÊôÐÔµãÒªÇó
if not CheckLearnSkillNeedAttr(curPlayer, curSkill):
return False
return True
def CheckLearnSkillNeedAttr(curPlayer, curSkill):
#Íæ¼ÒÊôÐÔµãÒªÇó
curSkillTypeID = curSkill.GetSkillTypeID()
stateSkillLV = curSkill.GetStateSkillLV() #ÐèÒª»ù´¡ÊôÐÔID*100000+ÐèÒªÊôÐÔµã
needBaseAttrID, needBaseAttrValue = GetSkillUpNeedAttr(stateSkillLV)
if needBaseAttrID and needBaseAttrValue:
baseAttrDict = {
ShareDefine.Def_Effect_Metal:PlayerControl.GetMetal(curPlayer),
ShareDefine.Def_Effect_Wood:PlayerControl.GetWood(curPlayer),
ShareDefine.Def_Effect_Water:PlayerControl.GetWater(curPlayer),
ShareDefine.Def_Effect_Fire:PlayerControl.GetFire(curPlayer),
ShareDefine.Def_Effect_Earth:PlayerControl.GetEarth(curPlayer),
}
if needBaseAttrID not in baseAttrDict:
GameWorld.ErrLog(' ¼¼ÄÜÉý¼¶ÊôÐÔµãÌõ¼þÅäÖôíÎó£¬curSkillTypeID=%s,needBaseAttrID=%s'%(curSkillTypeID, needBaseAttrID))
return False
curBaseAttrValue = baseAttrDict.get(needBaseAttrID, 0)
if curBaseAttrValue < needBaseAttrValue:
#GameWorld.DebugLog('Éý¼¶¼¼ÄÜ%sÐèÒªÊôÐÔµã %s´ïµ½%s, µ±Ç°µãÊý=%s!'%(curSkillTypeID, needBaseAttrID, needBaseAttrValue, curBaseAttrValue))
return False
return True
## »ñÈ¡¼¼ÄÜÉý¼¶ÊôÐÔÐèÇó rutrun attrID, attrvalue
def GetSkillUpNeedAttr(stateSkillLV):return stateSkillLV /100000, stateSkillLV%100000
## »ñÈ¡¼¼ÄÜר¾«ÀàÐÍ
def GetSkillElementType(curSkill): return curSkill.GetStateSkillLV() /100000
#// A5 16 Ñ¡Ôñ¼¼ÄÜÎåÐÐר¾« #tagCMSelectSkillElement
#
#struct tagCMSelectSkillElement
#{
# tagHead Head;
# DWORD SkillTypeID; // ר¾«¼¼ÄÜID
# BYTE DoType; // 0-¼¤»îÉý¼¶ 1-ʹÓÃ
#};
def OnSelectSkillElement(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
selectSkillID = clientData.SkillTypeID
ipyData = IpyGameDataPY.GetIpyGameData('SkillElement', selectSkillID)
if not ipyData:
return
mainSkillID = ipyData.GetMainSkillID()
if curPlayer.GetLV() < ipyData.GetNeedLV():
GameWorld.DebugLog('Ñ¡Ôñ¼¼ÄÜÎåÐÐר¾«µÈ¼¶²»×㣡')
return
skillManager = curPlayer.GetSkillManager()
mainSkill = skillManager.FindSkillBySkillTypeID(mainSkillID)
if not mainSkill:
GameWorld.DebugLog('Ö÷¼¼ÄÜδѧϰ£¬ÎÞ·¨Ñ¡×¨¾«mainSkillID=%s'%mainSkillID)
return
doType = clientData.DoType
curElementSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % mainSkillID)
activeSkillLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % selectSkillID)
isChangeSkill = False #ÊÇ·ñ±ä¸üÉúЧµÄ¼¼ÄÜ
updSelectSkillLV = activeSkillLV
#ÏÈÅжÏÊÇ·ñ¿ÉÉý¼¶
if doType is 0:
nextSkill = GameWorld.GetGameData().FindSkillByType(selectSkillID, activeSkillLV + 1)
if not nextSkill:
return
if not CheckLearnSkillNeedAttr(curPlayer, nextSkill):
return
updSelectSkillLV = activeSkillLV + 1
skillElementType = GetSkillElementType(nextSkill)
#¿ÉÉý¼¶Ôò¼¤»îÉýÒ»¼¶
EventShell.EventRespons_ElementSkill(curPlayer, mainSkillID, skillElementType, updSelectSkillLV)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementLV % selectSkillID, updSelectSkillLV)
if curElementSkillID == selectSkillID:
#ÕýÔÚʹÓõÄר¾«¼¼ÄÜ£¬ÔòÁ¢¼´ÉúЧ
isChangeSkill = True
else: # ʹÓÃ
if not activeSkillLV:
#δ¼¤»î²»ÄÜʹÓÃ
return
if selectSkillID == curElementSkillID:
return
isChangeSkill = True
if isChangeSkill:
#¸ü»»×¨¾«
if not RefreshElementSkill(curPlayer, selectSkillID)[1]:
GameWorld.DebugLog('¸ü»»×¨¾« ²»³É¹¦ selectSkillID=%s'%selectSkillID)
return
UpdateElementSkillSelect(curPlayer, mainSkillID, selectSkillID)
#ChEquip.ChangeEquipfacadeByLingGen(curPlayer)
if curElementSkillID and curElementSkillID != selectSkillID:
#Ô¼¼ÄÜɾ³ý
skillManager.DeleteSkillBySkillTypeID(curElementSkillID)
# ÖØË¢±»¶¯¼¼ÄÜ
PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer)
# ÖØË¢¼¼ÄÜÕ½Á¦
curControl = PlayerControl.PlayerControl(curPlayer)
curControl.RefreshAllSkill()
curControl.RefreshPlayerAttrState()
NotifyElementSkillInfo(curPlayer, mainSkillID, selectSkillID if updSelectSkillLV != activeSkillLV else 0)
return
def UpdateElementSkillSelect(curPlayer, mainSkillID, selectSkillID):
## ¸üÐÂר¾«¼¼ÄÜÑ¡Ôñ, selectSkillID ¿ÉÄܱ»ÖØÖÃΪ0
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementID % mainSkillID, selectSkillID)
#GameWorld.DebugLog("¸üÐÂר¾«¼¼ÄÜÑ¡Ôñ mainSkillID=%s, selectSkillID=%s" % (mainSkillID, selectSkillID))
# ÒÔ϶îÍâ¸üÐÂÑ¡ÔñµÄר¾«¼¼ÄܶÔÓ¦±àºÅ£¬ÓÃÓÚ±íÏÖÆäËûÍæ¼Ò²»Í¬×¨¾«¼¼ÄÜÌØÐ§ÓÃ
mainSkillList = IpyGameDataPY.GetFuncEvalCfg("SkillActTypeIdSort", curPlayer.GetJob())
if mainSkillID not in mainSkillList:
return
mainSkillIndex = mainSkillList.index(mainSkillID)
if mainSkillIndex < ShareDefine.Def_PDictDigitCnt:
exAttrValue = curPlayer.GetExAttr7()
exAttrIndex = mainSkillIndex
else:
exAttrValue = curPlayer.GetExAttr8()
exAttrIndex = mainSkillIndex - ShareDefine.Def_PDictDigitCnt
elementSkillNum = 0
if selectSkillID:
ipyData = IpyGameDataPY.GetIpyGameData('SkillElement', selectSkillID)
if ipyData:
elementSkillNum = ipyData.GetElementSkillNum()
updExAttrValue = GameWorld.ChangeDataByDigitPlace(exAttrValue, exAttrIndex, elementSkillNum)
#GameWorld.DebugLog(" exAttrValue=%s,exAttrIndex=%s,elementSkillNum=%s,updExAttrValue=%s"
# % (exAttrValue, exAttrIndex, elementSkillNum, updExAttrValue))
# ÐèÒª¹ã²¥ÖÜÎ§Íæ¼Ò
if mainSkillIndex < ShareDefine.Def_PDictDigitCnt:
curPlayer.SetExAttr7(updExAttrValue, True)
else:
curPlayer.SetExAttr8(updExAttrValue, True)
return
def RefreshElementSkill(curPlayer, skillTypeID, isChangeLV=True):
##¸üÐÂר¾«¼¼ÄÜÉúЧµÄµÈ¼¶
isNotify, hasChangeLV = False, False
__InitElementSkillInfo()
if skillTypeID not in PyGameData.g_elemntSkillDict:
return isNotify, hasChangeLV
baseAttrDict = {
ShareDefine.Def_Effect_Metal:PlayerControl.GetMetal(curPlayer),
ShareDefine.Def_Effect_Wood:PlayerControl.GetWood(curPlayer),
ShareDefine.Def_Effect_Water:PlayerControl.GetWater(curPlayer),
ShareDefine.Def_Effect_Fire:PlayerControl.GetFire(curPlayer),
ShareDefine.Def_Effect_Earth:PlayerControl.GetEarth(curPlayer),
}
activeSkillLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % skillTypeID)
limitInfoList = PyGameData.g_elemntSkillDict[skillTypeID]
maxSkillLV = len(limitInfoList)
updSkillLV = 0
for i, limitInfo in enumerate(limitInfoList):
needAttrID, needAttrValue = GetSkillUpNeedAttr(limitInfo)
curAttrValue = baseAttrDict.get(needAttrID, 0)
if curAttrValue >= needAttrValue:
updSkillLV = maxSkillLV - i
break
if activeSkillLV > updSkillLV:
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementLV % skillTypeID, updSkillLV)
isNotify = True
updSkillLV = min(updSkillLV, activeSkillLV) #²»¿É³¬¹ý¼¤»îµÄµÈ¼¶
skillManager = curPlayer.GetSkillManager()
curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
curSkillLV = curSkill.GetSkillLV() if curSkill else 0
#GameWorld.DebugLog('¸üÐÂר¾«¼¼ÄÜÉúЧµÄµÈ¼¶ skillTypeID=%s,curSkillLV=%s,activeSkillLV=%s,updSkillLV=%s'%(skillTypeID, curSkillLV, activeSkillLV, updSkillLV))
if not isChangeLV:
return isNotify, hasChangeLV
if updSkillLV == curSkillLV:
return isNotify, hasChangeLV
elif updSkillLV < curSkillLV:
skillManager.DeleteSkillBySkillTypeID(skillTypeID)
for _ in xrange(updSkillLV):
skillManager.LVUpSkillBySkillTypeID(skillTypeID)
if updSkillLV == 0:#ÖØÖÃΪδѡ״̬
ipyData = IpyGameDataPY.GetIpyGameData('SkillElement', skillTypeID)
mainSkillID = ipyData.GetMainSkillID()
UpdateElementSkillSelect(curPlayer, mainSkillID, 0)
#ChEquip.ChangeEquipfacadeByLingGen(curPlayer)
isNotify = True
else:
for _ in xrange(updSkillLV-curSkillLV):
skillManager.LVUpSkillBySkillTypeID(skillTypeID)
return isNotify, True
def RefreshElementSkillByAttr(curPlayer, attrIDList):
#¼Óµã¡¢µ¤Ò©¡¢¾³½ç¡¢Ï´µã »áÓ°ÏìÁé¸ùµã
__InitElementSkillInfo()
needRefreshSkillIDDict = {} #{skillid:ÊÇ·ñ±ä¸ü¼¼Äܵȼ¶}
skillManager = curPlayer.GetSkillManager()
for i in xrange(skillManager.GetSkillCount()):
hasSkill = skillManager.GetSkillByIndex(i)
hasSkillID = hasSkill.GetSkillTypeID()
ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('SkillElement', {'MainSkillID':hasSkillID}, True, False)
if not ipyDataList:
continue
curSelectSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % hasSkillID)
for ipyData in ipyDataList:
curElementSkillID = ipyData.GetElementSkillID()
if curElementSkillID not in PyGameData.g_elemntSkillDict:
continue
attrID = GetSkillUpNeedAttr(PyGameData.g_elemntSkillDict[curElementSkillID][0])[0]
if attrID not in attrIDList:
continue
needRefreshSkillIDDict[curElementSkillID] = curSelectSkillID == curElementSkillID
#GameWorld.DebugLog('ÊôÐÔµã±ä¸ü Ë¢ÐÂר¾«attrIDList=%s,needRefreshSkillIDList=%s'%(attrIDList,needRefreshSkillIDList))
needNotify, isRefresh = False, False
for skillID, isChangeLV in needRefreshSkillIDDict.items():
isNotify, hasChangeLV = RefreshElementSkill(curPlayer, skillID, isChangeLV)
if isNotify:
needNotify = True
if hasChangeLV:
isRefresh = True
if isRefresh:
# ÖØË¢±»¶¯¼¼ÄÜ
PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer)
# ÖØË¢¼¼ÄÜÕ½Á¦
curControl = PlayerControl.PlayerControl(curPlayer)
curControl.RefreshAllSkill()
curControl.RefreshPlayerAttrState()
if needNotify:
NotifyElementSkillInfo(curPlayer)
return
def GetElementSkillCnt(curPlayer, mainSkillIDList, activeLV, elementType=0):
##»ñÈ¡ÒÑÑ¡ÔñµÄר¾«¼¼ÄÜÊýÁ¿
# @param elementType: ר¾«ÀàÐÍ£¬¶ÔÓ¦Áé¸ùID
gameData = GameWorld.GetGameData()
cnt = 0
skillManager = curPlayer.GetSkillManager()
for i in xrange(skillManager.GetSkillCount()):
hasSkill = skillManager.GetSkillByIndex(i)
hasSkillID = hasSkill.GetSkillTypeID()
if hasSkillID not in mainSkillIDList:
continue
ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('SkillElement', {'MainSkillID':hasSkillID}, True, False)
if not ipyDataList:
continue
for ipyData in ipyDataList:
elementSkillID = ipyData.GetElementSkillID()
if elementType:
elementSkillData = gameData.GetSkillBySkillID(elementSkillID)
if GetSkillElementType(elementSkillData) != elementType:
continue
curActiveLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % elementSkillID)
if curActiveLV >= activeLV:
cnt += 1
return cnt
def __InitElementSkillInfo():
#»º´æ¼¼ÄÜר¾«ÐÅÏ¢{skillID:[attrID*100000+needValue,..]}
if not PyGameData.g_elemntSkillDict:
ipyMgr = IpyGameDataPY.IPY_Data()
for i in xrange(ipyMgr.GetSkillElementCount()):
ipyData = ipyMgr.GetSkillElementByIndex(i)
elementSkillID = ipyData.GetElementSkillID()
skill = GameWorld.GetGameData().FindSkillByType(elementSkillID, 1)
if not skill:
continue
skillMaxLV = skill.GetSkillMaxLV() # ×î¸ß¼¼Äܵȼ¶
for skillLV in xrange(skillMaxLV, 0, -1):
curSkill = GameWorld.GetGameData().FindSkillByType(elementSkillID, skillLV)
if not curSkill:
continue
if elementSkillID not in PyGameData.g_elemntSkillDict:
PyGameData.g_elemntSkillDict[elementSkillID] = []
PyGameData.g_elemntSkillDict[elementSkillID].append(curSkill.GetStateSkillLV())
return
def NotifyElementSkillInfo(curPlayer, mainSkillID=0, changeSkillID=0):
##֪ͨÎåÐÐר¾«ÐÅÏ¢
if not mainSkillID:
syncMainSkillDict = {}
skillManager = curPlayer.GetSkillManager()
for i in xrange(skillManager.GetSkillCount()):
hasSkill = skillManager.GetSkillByIndex(i)
hasSkillID = hasSkill.GetSkillTypeID()
ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('SkillElement', {'MainSkillID':hasSkillID}, True, False)
if not ipyDataList:
continue
syncMainSkillDict[hasSkillID] = []
for ipyData in ipyDataList:
syncMainSkillDict[hasSkillID].append(ipyData.GetElementSkillID())
else:
syncMainSkillDict = {mainSkillID:[changeSkillID]} if changeSkillID else {mainSkillID:[]}
sendPack = ChPyNetSendPack.tagMCSkillElementInfo()
sendPack.InfoList = []
for mSkillID, elementList in syncMainSkillDict.items():
curElementSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % mSkillID)
elementData = ChPyNetSendPack.tagMCSkillElementData()
elementData.MainSkillID = mSkillID
elementData.ElementSkillID = curElementSkillID
elementData.ActiveSkill = []
for elementSkillID in elementList:
activeData = ChPyNetSendPack.tagMCSkillElementActiveData()
activeData.SkillID = elementSkillID
activeData.ActiveLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % elementSkillID)
elementData.ActiveSkill.append(activeData)
elementData.SkillCnt = len(elementData.ActiveSkill)
sendPack.InfoList.append(elementData)
sendPack.Cnt = len(sendPack.InfoList)
NetPackCommon.SendFakePack(curPlayer, sendPack)
return
#---------------------------------------------------------------------
##µ±Ç°buffÊÇ·ñÄܹ»´¥·¢BuffProcess_%d µÄ½Å±¾
# @param curObj ¶ÔÏó
# @param curBuffSkill ¼¼ÄÜʵÀý
# @return ·µ»ØÖµÕæ, ͨ¹ý
# @remarks µ±Ç°buffÊÇ·ñÄܹ»´¥·¢BuffProcess_%d µÄ½Å±¾
def __BuffCanProcess(curObj, curBuffSkill):
buffSkillType = curBuffSkill.GetSkillType()
if buffSkillType in ChConfig.Def_LstBuff_List:
#ÊǼä¸ô´¦ÀíµÄ¼¼ÄÜ
return True
#===============================================================================
# #¹â»·´¦Àí, Èç¹û¹âÔ´ÊÇ×Ô¼º, ÔòÈ¥BuffProcess´¦Àí( //Èç¹â»·, ïÚ³µ¼ÓËÙ )
# if (buffSkillType == 11 and curObj.GetID() == curBuff.GetOwnerID() and
# curObj.GetGameObjType() == curBuff.GetOwnerType()):
# return True
#===============================================================================
return False
#---------------------------------------------------------------------
##È¡µÃ³ÖÐøBUFFµÄ´¥·¢¼ä¸ô
# @param curBuffSkill BUFF¼¼ÄÜ
# @return ³ÖÐøÊ±¼ä¼ä¸ô
# @remarks È¡µÃ³ÖÐøBUFFµÄ´¥·¢¼ä¸ô
def GetProcessBuffTick(curBuffSkill, curObj):
buffTick = ChConfig.Def_ProcessPersistBuff
curEffect = SkillCommon.GetSkillEffectByEffectID(curBuffSkill, ChConfig.Def_Skill_Effect_BuffTick)
if curEffect != None:
buffTick = curEffect.GetEffectValue(0)
if curEffect.GetEffectValue(1):
# ¼ÓËÙ
buffTick = int(curObj.GetAtkInterval()/ChConfig.Def_AtkSpeedBase*buffTick)
return buffTick
##¼ÆËã³ÖÐøbuffЧ¹û
# @param curObj ¶ÔÏó
# @param buffState Buff¹ÜÀíÆ÷
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¼ÆËã³ÖÐøbuffЧ¹û
def __ProcessCurPersistBuff(curObj, buffState, tick):
buffStateCount = buffState.GetBuffCount()
if not buffStateCount:
return
#buff³ÖÐøÐ§¹û
for i in range(0, buffStateCount):
curBuff = buffState.GetBuff(i)
if not curBuff:
#ÔÚÒÔÏ´¦Àí¹ý³ÌÖÐ, ¶Ô·½ÓпÉÄÜËÀÍö, Èç¹ûËÀÍö, »áÇå¿Õbuff, µ¼ÖÂÕâÀïÈ¡µÃNone
#ËùÒÔÒ»¶¨Òªcontinue
continue
curBuffSkill = curBuff.GetSkill()
if not __BuffCanProcess(curObj, curBuffSkill):
continue
processBuffTick = GetProcessBuffTick(curBuffSkill, curObj)
#---ÑéÖ¤´¥·¢¼ä¸ôTICK---
if tick - curBuff.GetProcessInterval() <= processBuffTick:
continue
curBuff.SetProcessInterval(tick)
#µÃµ½µ±Ç°buff
for effIndex in range(0, curBuffSkill.GetEffectCount()):
#µÃµ½µ±Ç°Ð§¹û
curEffect = curBuffSkill.GetEffect(effIndex)
curEffectID = curEffect.GetEffectID()
if not curEffectID:
continue
processStr = "BuffProcess_%d.%s"%(curEffectID, "ProcessBuff")
callBuffProcessFunc = GameWorld.GetExecFunc(GameBuffs, processStr)
if not callBuffProcessFunc:
continue
callBuffProcessFunc(curObj, curBuff, curEffect, processBuffTick, tick)
#Ö´ÐÐProcessBuffÖÐÉ趨µÄÍæ¼Ò×Öµä
__DoProcessBuff_PlayerKey(curObj, tick)
#---------------------------------------------------------------------
##Ö´ÐÐProcessBuffÖÐÉ趨µÄÍæ¼Ò×Öµä
# @param curObj ¶ÔÏó
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks Ö´ÐÐProcessBuffÖÐÉ趨µÄÍæ¼Ò×Öµä
def __DoProcessBuff_PlayerKey(curObj, tick):
#===============================================================================
# if curObj.GetDictByKey(ChConfig.Def_Player_ProBuff_TruckSpeedUp):
# skillID = curObj.GetDictByKey(ChConfig.Def_Player_ProBuff_TruckSpeedUp)
# #±¾À´buffÀàÐÍÊÇ11, µ«ÊÇæô³µÃ»ÓÐÎïÆ·buff, ËùÒÔ¸ÄΪ8
# buffType = IPY_GameWorld.bfAura
# #¸ø×Ô¼ºµÄïÚ³µ¼Óbuff
# curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
# if not curSkill:
# GameWorld.Log('###ïÚ³µBuff¼¼ÄÜIDÒì³£ = %s'%(skillID))
# return
#
# BuffSkill.DoAddBuff(curObj.GetTruck() , buffType, curSkill, tick, 0, curObj)
# curObj.SetDict(ChConfig.Def_Player_ProBuff_TruckSpeedUp , 0)
#===============================================================================
return
#---------------------------------------------------------------------
##³ÖÐøÐÔbuffµÄÉ˺¦Ð§¹û
# @param curObj ¶ÔÏó
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ³ÖÐøÐÔbuffµÄÉ˺¦Ð§¹û
def ProcessPersistBuff(curObj, tick):
#³ÖÐøÔöÒæ
__ProcessCurPersistBuff(curObj, curObj.GetProcessBuffState(), tick)
#³ÖÐø¼õÒæ
__ProcessCurPersistBuff(curObj, curObj.GetProcessDeBuffState(), tick)
#Íæ¼Ò¶ÀÓÐ
if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
#Íæ¼Ò×°±¸¹â»·
__ProcessCurPersistBuff(curObj, curObj.GetEquipBuff(), tick)
#³¡¾°É˺¦
__ProcessCurPersistBuff(curObj, curObj.GetMapBuff(), tick)
return
#---------------------------------------------------------------------
##´¦Àí³¡¾°Buff
# @param curPlayer Íæ¼ÒʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ³¡¾°BuffÔö¼ÓºÍɾ³ý
def ProcessMapBuff(curPlayer, tick):
#³¡¾°BUFFˢмä¸ô
if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_MapBuff) \
< ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_MapBuff]:
return
curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_MapBuff, tick)
#³¡¾°BuffÊÇ·ñÓбä¸ü
if __ProcessMapEffect(curPlayer, tick):
#³¡¾°buff´¦Àí³É¹¦, ˢг¡¾°×´Ì¬
ProcessPlayerAreaState(curPlayer)
return
#---------------------------------------------------------------------
##ˢеØÍ¼BuffЧ¹û
# @param curPlayer Íæ¼ÒʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµ, ÊÇ·ñÖØË¢ÊôÐÔ
# @remarks ˢеØÍ¼BuffЧ¹û
def __ProcessMapEffect(curPlayer, tick):
gameMap = GameWorld.GetMap()
# Ôö¼Ó³¡¾°ÑéÖ¤, ÈôÖ»ÓÐÇøÓòÀàÐÍÅж¨¿É²»½øÈë´ËÂß¼£¬È簲ȫ¡¢PK¡¢¼Ò×åÇø£¬Ö±½ÓÈ¡×ø±êµôÅж¨¼´¿ÉGetAreaTypeByMapPos
# ÈôÊdz¡¾°É˺¦»òÕß¶¯Ì¬±ä»¯µÄÇøÓò£¬¿É½øÈë´ËÂß¼
# GetAreaType()Ö»ÓÐbuffÉèÖúó²ÅÄÜ»ñÈ¡µ½
if curPlayer.GetMapID() not in []:
#ÌØÊâÇøÓò´ý¹¦Äܰ²ÅÅ
return
curPosObj = gameMap.GetPosObj(curPlayer.GetPosX(), curPlayer.GetPosY())
mapBuffManager = curPlayer.GetMapBuff()
if curPosObj == None :
GameWorld.ErrLog("###´¦Àí³¡¾°buff²éÕÒÍæ¼Òʧ°Ü" , curPlayer.GetID())
mapBuffManager.Clear()
return True
effectCount = curPosObj.GetEffectCount()
if effectCount == 0 or not curPlayer.IsAlive():
#Íæ¼ÒÀ뿪³¡¾°, »òÕßËÀÍöÈ¡Ïûbuff
DoMapBuffClear(curPlayer)
#GameWorld.Log("Íæ¼ÒÀ뿪³¡¾°buff")
return True
#ËÀÍö²»Ìí¼Ó
#ÊÇ·ñÐèÒªÖØË¢³¡¾°Buff
processResult = False
index = 0
# ¸ù¾ÝÍæ¼ÒÏÖÓеĵØÍ¼buff¸öÊý´¦ÀíÏûʧÂß¼
while index < mapBuffManager.GetBuffCount():
curRoleBuff = mapBuffManager.GetBuff(index)
ownerID, ownerType = curRoleBuff.GetOwnerID(), curRoleBuff.GetOwnerType()
skillID = curRoleBuff.GetSkill().GetSkillID()
#MapPosµÄkeyΪskillID
if not curPosObj.HaveEffect(skillID):
curSkill = curRoleBuff.GetSkill()
for effectIndex in range(0, curSkill.GetEffectCount()):
curEffect = curSkill.GetEffect(effectIndex)
effectID = curEffect.GetEffectID()
if effectID == 0:
continue
callFunc = GameWorld.GetExecFunc(GameBuffs, "MapBuff_%d.%s"%(effectID, "OnMapBuffDel"))
if callFunc == None:
continue
#µ÷ÓÃË¢ÐÂbuff
callFunc(curPlayer, curEffect)
mapBuffManager.DeleteBuffByIndex(index)
ClearBuffEffectBySkillID(curPlayer, skillID, ownerID, ownerType)
#GameWorld.Log("ɾ³ý³¡¾°Buff %d"%skillID)
processResult = True
continue
index += 1
gameData = GameWorld.GetGameData()
for i in range(0, effectCount):
effectID = curPosObj.GetEffectID(i)
if effectID == 0:
continue
curSkill = gameData.GetSkillBySkillID(effectID)
if curSkill == None:
GameWorld.ErrLog("ProcessMapEffect skill = %s ²»´æÔÚ"%(effectID) , curPlayer.GetID())
break
#BuffµÄkeyΪskillTypeID
skillTypeID = curSkill.GetSkillTypeID()
findBuff = mapBuffManager.FindBuff(skillTypeID)
if findBuff:
# ¼¼ÄÜIDÏàͬ£¬»òÕ߲߻®²¿ÊðÁ½¸öµÈ¼¶µÄ²¢ÒÑÓµÓиü¸ßµÈ¼¶µÄ²»´¦Àí
if findBuff.GetSkill().GetSkillID() == curSkill.GetSkillID():
continue
if findBuff.GetSkill().GetSkillLV() > curSkill.GetSkillLV():
continue
#Ìí¼Ó³¡¾°buff
isOK = BuffSkill.AddBuffNoRefreshState(curPlayer, IPY_GameWorld.bfMapBuff, curSkill, tick)
processResult = processResult or isOK
return processResult
def DoMapBuffClear(curPlayer):
buffManager = curPlayer.GetMapBuff()
for buffIndex in range(0, buffManager.GetBuffCount()):
curBuff = buffManager.GetBuff(buffIndex)
curSkill = curBuff.GetSkill()
if curSkill.GetSkillID() == 0:
continue
for effectIndex in range(0, curSkill.GetEffectCount()):
curEffect = curSkill.GetEffect(effectIndex)
effectID = curEffect.GetEffectID()
if effectID == 0:
continue
callFunc = GameWorld.GetExecFunc(GameBuffs, "MapBuff_%d.%s"%(effectID, "OnMapBuffDel"))
if callFunc == None:
continue
#µ÷ÓÃË¢ÐÂbuff
callFunc(curPlayer, curEffect)
buffManager.Clear()
return
#---------------------------------------------------------------------
##Ë¢ÐÂÍæ¼Ò³¡¾°×´Ì¬
# @param curPlayer Íæ¼ÒʵÀý
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks Ë¢ÐÂÍæ¼Ò³¡¾°×´Ì¬
def ProcessPlayerAreaState(curPlayer):
#³õʼ»¯ËùÓеij¡¾°buff״̬
playerControl = PlayerControl.PlayerControl(curPlayer)
playerControl.InitMapBuffState()
buffManager = curPlayer.GetMapBuff()
for buffIndex in range(0, buffManager.GetBuffCount()):
curBuff = buffManager.GetBuff(buffIndex)
curSkill = curBuff.GetSkill()
if curSkill.GetSkillID() == 0:
continue
for effectIndex in range(0, curSkill.GetEffectCount()):
curEffect = curSkill.GetEffect(effectIndex)
effectID = curEffect.GetEffectID()
if effectID == 0:
continue
callFunc = GameWorld.GetExecFunc(GameBuffs, "MapBuff_%d.%s"%(effectID, "OnMapBuff"))
if callFunc == None:
continue
#µ÷ÓÃË¢ÐÂbuff
callFunc(curPlayer, curEffect)
return
#---------------------------------------------------------------------
##Ìí¼Ó×°±¸´¥·¢µÄBuff
# @param curPlayer Íæ¼ÒʵÀý
# @param curEquip ×°±¸ÊµÀý
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks Ìí¼Ó×°±¸´¥·¢µÄBuff
def RefreshSkillBuffByEquip(curPlayer, curEquip) :
#Ò»°ã×°±¸ÐÂÔöBuff
__DoEquip_AddBuff(curPlayer, curEquip)
return
#---------------------------------------------------------------------
##Ìí¼Ó×°±¸´¥·¢µÄBuff, Ò»°ã×°±¸ÐÂÔöBuff
# @param curPlayer Íæ¼ÒʵÀý
# @param curEquip ×°±¸ÊµÀý
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks Ìí¼Ó×°±¸´¥·¢µÄBuff, Ò»°ã×°±¸ÐÂÔöBuff
def __DoEquip_AddBuff(curPlayer, curEquip):
gameData = GameWorld.GetGameData()
playerVehicle = curPlayer.GetPlayerVehicle()
houseState = curPlayer.GetPlayerRidehorseState()
for index in range(0 , curEquip.GetAddSkillCount()):
curSkillID = curEquip.GetAddSkill(index)
if curSkillID == 0:
continue
#ͨ¹ý¼¼ÄÜID»ñµÃʹÓü¼ÄÜ
curSkill = gameData.GetSkillBySkillID(curSkillID)
if curSkill == None :
GameWorld.Log("×°±¸´¥·¢¼¼ÄÜ,ÎïÆ·±í´íÎó curSkillID = %s"%(curSkillID) , curPlayer.GetPlayerID())
continue
#ÆïÂí´¥·¢¼¼ÄÜ
houseSkill = ChConfig.Def_Skill_TypeID_Speed
curSkillType = curSkill.GetSkillTypeID()
if not SkillCommon.IsBuff(curSkill):
continue
if curSkillType in houseSkill:
#²»Ê¹ÓÃ,²»Ìí¼Óbuff
if playerVehicle != IPY_GameWorld.pvHorse :
continue
if curSkillType == houseSkill[0] and houseState != IPY_GameWorld.prsNormal :
continue
if curSkillType == houseSkill[1] and houseState != IPY_GameWorld.prsRun :
continue
#Ìí¼ÓBuff
BuffSkill.AddBuffNoRefreshState(curPlayer, IPY_GameWorld.bfEquipBuff, curSkill, 0, [], buffOwner = curPlayer)
return
#---------------------------------------------------------------------
##Ë¢ÐÂbuffµÄЧ¹û
# @param buffState Buff¹ÜÀíÆ÷
# @param sameEffectCanWork ÊÇ·ñ¿ÉÒÔµþ¼ÓÏàͬЧ¹û, : Ч¹ûÊÇ·ñ¿ÉÒÔµþ¼Ó, ĬÈÏΪ·ñ
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks Ë¢ÐÂbuffµÄЧ¹û (²ÎÊý -> buff¹ÜÀíÆ÷,ÊÇ·ñµþ¼Ó)
def __RefreshSkillBuffEffect(buffState, sameEffectCanWork = False):
return
#===========================================================================
# buffState.ClearEffects()
# for buffIndex in range(0, buffState.GetBuffCount()):
# curBuff = buffState.GetBuff(buffIndex)
# buffValue = curBuff.GetValue()
# curSkill = curBuff.GetSkill()
# skillID = curSkill.GetSkillID()
# if skillID == 0:
# continue
#
# for effectIndex in range(0, curSkill.GetEffectCount()):
# curEffect = curSkill.GetEffect(effectIndex)
# effectID = curEffect.GetEffectID()
# if effectID == 0:
# continue
#
# buffState.AddEffect(curEffect, buffValue, skillID, curBuff.GetOwnerID(), curBuff.GetOwnerType())
#===========================================================================
#---------------------------------------------------------------------
##¼ÆËãЧ¹ûÖµ
# @param buffState Buff¹ÜÀíÆ÷
# @param curObjDetail ¶ÔÏóʵÀý
# @param allAttrList Ч¹ûÁбí
# @param calcEffectIDList Ö¸¶¨¼ÆËãЧ¹û
# @param calcLevel ¼ÆËã²ã¼¶£¨Ä¿Ç°ÊǰٷֱÈÓÐÄÚÍâ²ãÖ®·Ö£©
# @return ·µ»ØÖµÎÞÒâÒå
def CalcCurBuffer_Effect(buffState, curObjDetail, allAttrList, calcEffectIDList = [], calcLevel = 0):
__CallBuffFunc(buffState, curObjDetail, allAttrList, calcEffectIDList, calcLevel)
return
#---------------------------------------------------------------------
##¼ÆËãBuffЧ¹û.ͨ¹ýÌî±í¼ÆËã
# @param buffState Buff¹ÜÀíÆ÷
# @param objDetel ¶ÔÏóʵÀý(Íæ¼Ò, NPC, ³èÎï)
# @param allAttrList Ч¹ûÁбí
# @return ·µ»ØÖµÎÞÒâÒå
def __CallBuffFunc(buffState, objDetel, allAttrList, calcEffectIDList = [], calcLevel = 0):
for i in xrange(0, buffState.GetBuffCount()):
curBuff = buffState.GetBuff(i)
buffSkill = curBuff.GetSkill()
attrMapID = GetAttrMapID(buffSkill) # Ö»ÓÐÔÚÖ¸¶¨µØÍ¼²ÅÄÜÉúЧµÄbuffЧ¹û
if attrMapID and objDetel.GetGameObjType() == IPY_GameWorld.gotPlayer \
and attrMapID != FBCommon.GetRecordMapID(objDetel.GetMapID()):
continue
for i in xrange(buffSkill.GetEffectCount()):
curEffect = buffSkill.GetEffect(i)
curEffectID = curEffect.GetEffectID()
if curEffectID == 0:
continue
if calcEffectIDList and curEffectID not in calcEffectIDList:
continue
CalcBuffEffAttr(objDetel, curEffect, allAttrList, calcLevel, curBuff.GetValue(), curBuff)
return
# plusValueΪbuffµÄµÚÒ»¸övalue
def CalcBuffEffAttr(objDetel, curEffect, allAttrList, calcLevel=0, plusValue=0, curBuff=None):
# ¼ÆËãbuffЧ¹ûÊôÐÔ
curEffectID = curEffect.GetEffectID()
if curEffectID == 0:
return
# »ñµÃbuffЧ¹ûµÄ¼ÆËãÄ£¿éÎļþºó׺
moduleSuffix = GetBuffModuleSuffix(curEffect, calcLevel)
skillTypeFunc = GameWorld.GetExecFunc(GameBuffs, "Buff_%s.%s"%(moduleSuffix, "GetCalcType"))
if not skillTypeFunc:
return
index = GetAttrListIndex(SkillCommon.IsBaseEffect(curEffect), skillTypeFunc())
if index == -1:
return
# ¼æÈÝÁ½ÖÖ¼ÆËã
callFunc = GameWorld.GetExecFunc(GameBuffs, "Buff_%s.%s"%(moduleSuffix, "OnCalcBuff"))
if callFunc:
# BUFF¼ÆËãÖ»Ö§³ÖÒ»ÖÖÔöÇ¿Èë¿Ú£¬Í¨¹ýGetEffectPlusValue´¦Àí
callFunc(objDetel, curEffect, allAttrList[index], plusValue)
else:
callFunc = GameWorld.GetExecFunc(GameBuffs, "Buff_%s.%s"%(moduleSuffix, "OnCalcBuffEx"))
if callFunc:
callFunc(objDetel, curEffect, allAttrList[index], curBuff)
#ÊÇ·ñ³ÖÐøÐÔ¼¼ÄÜ
if curBuff and curBuff.GetSkill().GetSkillType() in ChConfig.Def_LstBuff_List:
# ³ÖÐøÐÔÊôÐԱ仯µÄbuff£¬Ä¿Ç°Ö»ÓгÖÐø¼õÒæ
callFunc = GameWorld.GetExecFunc(GameBuffs, "BuffProcess_%s.%s"%(moduleSuffix, "OnCalcBuffEx"))
if callFunc:
callFunc(objDetel, curEffect, allAttrList[index], curBuff)
return
## »ñµÃbuffЧ¹ûµÄ¼ÆËãÄ£¿éÎļþºó׺
# @param curEffectID Ч¹ûid
# @return ÁбíË÷Òý
def GetBuffModuleSuffix(curEffect, calcLevel = 0):
curEffectID = curEffect.GetEffectID()
if calcLevel == ChConfig.CalcBuffLevel_1:
# Íâ²ã¼ÆËãÂß¼´¦Àí
return ChConfig.Def_Skill_BuffEffectOutside.get(curEffectID, ["", []])[0]
suffixName, attrList = BuffSkill.FindBuffAttrByEffectID(curEffect)
return suffixName if suffixName else curEffectID
##»ñµÃÊôÐÔÁбíË÷Òý, Ö»ÓÃÓÚË¢ÐÔÊôÐÔµÄallAttrList
# @param isBaseEff ÊÇ·ñ»ù´¡ÊôÐÔ
# @param calcType ÏßÐÔÀàÐÍ
# @return ÁбíË÷Òý
def GetAttrListIndex(isBaseEff, calcType):
if calcType is None:
return -1
return ChConfig.Def_CalcAttrIndexDict[(isBaseEff, calcType)]
##Ë¢ÐÂÍæ¼ÒËùÓÐÓ°ÏìÊôÐÔµÄBuff£¬Ìí¼ÓÊ±Ö»ÖØ¼ÆËãͬÀàÐÍBUFF£¬É¾³ýʱˢÐÂËùÓÐÀàÐÍBUFF
# @param curPlayer Íæ¼ÒʵÀý
# @param buffType buffÀàÐÍ -1´ú±íÈ«²¿Ë¢ÐÔ
# @return ·µ»ØÖµÎÞÒâÒå
def RefreshPlayerBuffOnAttrAddEffect(curPlayer, buffType=-1):
return
#===============================================================================
# GameWorld.DebugLog("Start RefreshPlayerBuffOnAttrAddEffect!!!")
#
# #[[BuffState, CanPileup]]
# if buffType == -1:
# buffRefreshList = [
# [curPlayer.GetBuffState(), False], [curPlayer.GetDeBuffState(), False],
# [curPlayer.GetAura(), False], [curPlayer.GetIncBuff(), True],
# [curPlayer.GetPassiveBuf(), True], [curPlayer.GetEquipBuff(), True],
# ]
# else:
# #Ö»ÖØ¼ÆËã¸Ä±äµÄBUFF, ÕâÀï²»·À·¶·ÇÊôÐÔÀàÐÍBUFFÍâ²ã¹ýÂË
# buffManagerInfo = SkillCommon.GetBuffManagerByBuffType(curPlayer, buffType)
# buffRefreshList = [[buffManagerInfo[0], buffManagerInfo[2]]]
#
# #Ö´ÐÐË¢ÐÂÂß¼
# __DoRefreshBuff(buffRefreshList)
#
# return
#===============================================================================
# ͨ¹ý¼¼ÄÜIDɾ³ýbuff¶ÔÓ¦µÄЧ¹ûID
def ClearBuffEffectBySkillID(curObj, skillID, ownerID, ownerType):
curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
buffType = SkillCommon.GetBuffType(curSkill)
buffTuple = SkillCommon.GetBuffManagerByBuffType(curObj, buffType)
#ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö
if buffTuple == ():
return
buffState = buffTuple[0]
effectIndexList = []
for i in xrange(0, buffState.GetEffectCount()):
curEffect = buffState.GetEffect(i)
curEffectID = curEffect.GetEffectID()
if curEffectID == 0:
continue
# Ч¹ûÀ´Ô´¼¼ÄÜID
if buffState.GetEffectFromSkillID(i) != skillID:
continue
if buffState.GetEffectOwnerID(i) != ownerID:
continue
if buffState.GetEffectOwnerType(i) != ownerType:
continue
effectIndexList.append(i)
# µ¹Ðòɾ³ý
effectIndexList.sort(reverse=True)
for i in effectIndexList:
buffState.DeleteEffectByIndex(i)
# ͨ¹ý¼¼ÄÜtypeIDɾ³ýbuff¶ÔÓ¦µÄЧ¹ûID
def ClearBuffEffectBySkillTypeID(curObj, skillTypeID, ownerID, ownerType):
curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillTypeID)
buffType = SkillCommon.GetBuffType(curSkill)
buffTuple = SkillCommon.GetBuffManagerByBuffType(curObj, buffType)
#ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö
if buffTuple == ():
return
buffState = buffTuple[0]
effectIndexList = []
for i in xrange(0, buffState.GetEffectCount()):
curEffect = buffState.GetEffect(i)
curEffectID = curEffect.GetEffectID()
if curEffectID == 0:
continue
if buffState.GetEffectOwnerID(i) != ownerID:
continue
if buffState.GetEffectOwnerType(i) != ownerType:
continue
buffSkillID = buffState.GetEffectFromSkillID(i)
buffSkill = GameWorld.GetGameData().GetSkillBySkillID(buffSkillID)
if buffSkill.GetSkillTypeID() != skillTypeID:
continue
effectIndexList.append(i)
# µ¹Ðòɾ³ý
effectIndexList.sort(reverse=True)
for i in effectIndexList:
buffState.DeleteEffectByIndex(i)
# ͨ¹ý¼¼ÄÜIDÁбíɾ³ýbuff¶ÔÓ¦µÄЧ¹ûID, ËÀÍöµ÷ÓÃ
def ClearBuffEffectBySkillIDList(curObj, buffState, skillIDList):
effectIndexList = []
for i in xrange(0, buffState.GetEffectCount()):
curEffect = buffState.GetEffect(i)
curEffectID = curEffect.GetEffectID()
if curEffectID == 0:
continue
#=======================================================================
# # [¼¼ÄÜID£¬ À´Ô´¶ÔÏóID£¬¶ÔÏóÀàÐÍ]
# if [buffState.GetEffectFromSkillID(i),
# buffState.GetEffectOwnerID(i),
# buffState.GetEffectOwnerType(i)] not in skillIDList:
# continue
#=======================================================================
# ¸Ä³ÉÖ»Åжϼ¼ÄÜID
if buffState.GetEffectFromSkillID(i) not in skillIDList:
continue
effectIndexList.append(i)
# µ¹Ðòɾ³ý
effectIndexList.sort(reverse=True)
for i in effectIndexList:
buffState.DeleteEffectByIndex(i)
##ˢйÜÀíÆ÷ÖеÄBuff
# @param buffRefreshList BuffË¢ÐÂÁбí[[BuffState, CanPileup]]
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks °´ÕÕµþ¼Ó¹æÔò, Ë¢ÐÂÖ¸¶¨¹ÜÀíÖеÄBuff
def __DoRefreshBuff(buffRefreshList):
for buffState, canPileUp in buffRefreshList:
__RefreshSkillBuffEffect(buffState, canPileUp)
return
##¼ÆËãÐÐΪBUFF¶ÔÈËÎïÐÐΪ״̬µÄ¸Ä±ä
# @param curPlayer Íæ¼ÒʵÀý
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¼ÆËãÐÐΪBUFF¶ÔÈËÎïÐÐΪ״̬µÄ¸Ä±ä
def CalcBuffer_ActionState(curObj):
#---´ÓBUFFÐÐΪ¹ÜÀíÆ÷ÖÐÈ¡µÃ
actionBuffManager = curObj.GetActionBuffManager()
for i in range(actionBuffManager.GetBuffCount()):
curBuff = actionBuffManager.GetBuff(i)
if not curBuff:
continue
buffSkill = curBuff.GetSkill()
if not buffSkill:
continue
#ÐÐΪBUFF¼¼ÄܵÄÀàÐÍIDÀ´Çø·Ö£¬ÔÝʱûÓ㬲ÎÊý䶨
#GameWorld.GetExecFunc(GameBuffs, "BuffAct_%d.%s"%(buffSkill.GetSkillTypeID(), "OnCalcBuff"))
#ÉèÖöÔÏóµÄÐÐΪ״̬
OperControlManager.SetObjActState(curObj, buffSkill)
# ¼ÆËãÊôÐÔÀ༼ÄܵÄÊôÐÔ£¬Í¬buff²ã²»ËãÕ½Á¦
def CalcPassiveAttr_Effect(curPlayer, allAttrList):
skillManager = curPlayer.GetSkillManager()
for i in xrange(skillManager.GetSkillCount()):
curPlayerSkill = skillManager.GetSkillByIndex(i)
if curPlayerSkill == None:
continue
if not SkillCommon.isPassiveAttr(curPlayerSkill):
continue
if curPlayerSkill.GetFuncType() not in [ChConfig.Def_SkillFuncType_FbSkill,
ChConfig.Def_SkillFuncType_FbSPSkill,
ChConfig.Def_SkillFuncType_GiftSkill,
ChConfig.Def_SkillFuncType_GWSkill,
ChConfig.Def_SkillFuncType_ZhuXian]:
# ¸ù¾Ý¼¼ÄÜÇé¿öµ÷Õû
continue
for i in xrange(curPlayerSkill.GetEffectCount()):
curEffect = curPlayerSkill.GetEffect(i)
curEffectID = curEffect.GetEffectID()
if curEffectID == 0:
continue
CalcBuffEffAttr(curPlayer, curEffect, allAttrList)
skills = PassiveBuffEffMng.FindUsePassiveSkills(curPlayer)
for skillID in skills:
curPlayerSkill = skillManager.FindSkillBySkillID(skillID)
if curPlayerSkill == None:
continue
if not SkillCommon.isPassiveAttr(curPlayerSkill):
continue
for i in xrange(curPlayerSkill.GetEffectCount()):
curEffect = curPlayerSkill.GetEffect(i)
curEffectID = curEffect.GetEffectID()
if curEffectID == 0:
continue
CalcBuffEffAttr(curPlayer, curEffect, allAttrList)
##¼ÆËãbuffÌí¼ÓµÄÊôÐÔÁбí, ×°±¸BUFF ²»Ëã´ËÁÐ
# @param curPlayer Íæ¼ÒʵÀý
# @return None
def CalcBuffers_Effect(curPlayer, allAttrList, calcEffectIDList=[]):
for buffType in range(IPY_GameWorld.bfBuff, IPY_GameWorld.btBufMax):
#ÕâЩÀàÐͲ»Ó°ÏìÍæ¼Ò¼ÆËãÊôÐÔ
if buffType in [IPY_GameWorld.bfProcessBuff, #IPY_GameWorld.bfProcessDeBuff,
IPY_GameWorld.bfMapBuff,
IPY_GameWorld.bfEquipBuff]:
continue
buffTuple = SkillCommon.GetBuffManagerByBuffType(curPlayer, buffType)
#ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö
if buffTuple == ():
continue
buffManager = buffTuple[0]
#Ò»´ÎÑ»·ÖмÆËã³öÏßÐԺͷÇÏßÐÔ½á¹û
CalcCurBuffer_Effect(buffManager, curPlayer, allAttrList, calcEffectIDList)
##¼ÆËã»ù±¾ÊôÐÔ¶ÔÈËÎï״̬µÄ¸Ä±ä(·ÇÏßÐÔ)
# @param curPlayer Íæ¼ÒʵÀý
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¼ÆËã»ù±¾ÊôÐÔ¶ÔÈËÎï״̬µÄ¸Ä±ä
#===============================================================================
# def CalcBuffer_BaseEffect_OutLine(curPlayer):
# effectList = list()
# for i in range(0, ChConfig.TYPE_Max_Attr):
# effectList.append(0)
#
# #·ÇÏßÐÔ
# for buffType in range(IPY_GameWorld.bfBuff, IPY_GameWorld.btBufMax):
# buffTuple = SkillCommon.GetBuffManagerByBuffType(curPlayer, buffType)
# #ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö
# if buffTuple == ():
# continue
#
# buffManager = buffTuple[0]
# CalcCurBuffer_BaseEffect(buffManager, curPlayer, ChConfig.TYPE_NoLinear, effectList)
#
# return effectList
# # #×îÖÕ¼ÆËã½á¹û
#===============================================================================
# CalcNoLineEffect.ChangePlayerAttrInNoLineEffectList(curPlayer, effectList)
#---------------------------------------------------------------------
##¼ÆËãÕ½¶·ÊôÐÔ¶ÔÈËÎï״̬µÄ¸Ä±ä(·ÇÏßÐÔ)
# @param curPlayer Íæ¼ÒʵÀý
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¼ÆËãÕ½¶·ÊôÐÔ¶ÔÈËÎï״̬µÄ¸Ä±ä
#===============================================================================
# def CalcBuffer_BattleEffect_OutLine(curPlayer):
# effectList = [0 for x in xrange(ChConfig.TYPE_Max_Attr)]
#
# #·ÇÏßÐÔ
# for buffType in range(IPY_GameWorld.bfBuff, IPY_GameWorld.btBufMax):
# buffTuple = SkillCommon.GetBuffManagerByBuffType(curPlayer, buffType)
# #ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö
# if buffTuple == ():
# continue
#
# #³ÖÐøÐÔBUFFºÍ¿ØÖÆBUFFÌø³ö
# if buffType in [IPY_GameWorld.bfActionBuff, IPY_GameWorld.bfProcessBuff,
# IPY_GameWorld.bfProcessDeBuff]:
# continue
#
# buffManager = buffTuple[0]
#
# #Ò»´ÎÑ»·ÖмÆËã³öÏßÐԺͷÇÏßÐÔ½á¹û
# CalcCurBuffer_BattleEffect(buffManager, curPlayer, ChConfig.TYPE_Linear, effectList)
#
# CalcCurBuffer_BattleEffect(buffManager, curPlayer, ChConfig.TYPE_NoLinear, effectList)
#
# CalcLineEffect.ChangePlayerAttrInLineEffectList(curPlayer, effectList)
#
# return effectList
#===============================================================================
#×îÖÕ¼ÆËã½á¹û
#CalcNoLineEffect.ChangePlayerAttrInNoLineEffectList(curPlayer, effectList)
##¼ÆËãÕ½¶·ÊôÐÔ¶ÔÈËÎï״̬µÄ¸Ä±ä(ÏßÐÔ)
# @param curPlayer Íæ¼ÒʵÀý
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¼ÆËãÕ½¶·ÊôÐÔ¶ÔÈËÎï״̬µÄ¸Ä±ä
#===============================================================================
# def CalcBuffer_BattleEffect_InLine(curPlayer):
# effectList = [0 for x in xrange(ChConfig.TYPE_Max_Attr)]
#
# #ÏßÐÔ
# for buffType in range(IPY_GameWorld.bfBuff, IPY_GameWorld.btBufMax):
# buffTuple = SkillCommon.GetBuffManagerByBuffType(curPlayer, buffType)
# #ͨ¹ýÀàÐÍ»ñȡĿ±êµÄbuff¹ÜÀíÆ÷Ϊ¿Õ£¬ÔòÌø³ö
# if buffTuple == ():
# continue
#
# buffManager = buffTuple[0]
# CalcCurBuffer_BattleEffect(buffManager, curPlayer, ChConfig.TYPE_Linear, effectList)
#
# #×îÖÕ¼ÆËãЧ¹û
# CalcLineEffect.ChangePlayerAttrInLineEffectList(curPlayer, effectList)
#===============================================================================
#---------------------------------------------------------------------
##¼ÆËãNPCÕ½¶·ÊôÐÔ
# @param curNPC NPCʵÀý
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¼ÆËãNPCÕ½¶·ÊôÐÔ
def CalcBuffer_NPCBattleEffect(curNPC):
#@warning:Õ½¶·ÊôÐÔÏÈËã·ÇÏßÐÔÔÚËãÏßÐÔ
buffRefreshList = NPCCommon.GetNPCBuffRefreshList(curNPC, True)
#ÏßÐÔ»ù´¡ÊôÐÔ£¬·ÇÏßÐÔ»ù´¡ÊôÐÔ£¬ÏßÐÔÕ½¶·ÊôÐÔ£¬·ÇÏßÐÔÕ½¶·ÊôÐÔ
allAttrList = [{} for i in range(4)]
for buffState, canPileup in buffRefreshList:
CalcCurBuffer_Effect(buffState, curNPC, allAttrList)
#·ÇÏßÐÔ
CalcNoLineEffect.ChangeNPCAttrInNoLineEffectList(curNPC, allAttrList[ChConfig.CalcAttr_BattleNoline])
#ÏßÐÔ
CalcLineEffect.ChangeNPCAttrInLineEffectList(curNPC, allAttrList[ChConfig.CalcAttr_Battle])
return allAttrList
#---------------------------------------------------------------------
##¼ÆËãNPC»ù´¡ÊôÐÔ
# @param rolePet Íæ¼Ò³èÎï
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¼ÆËãNPC»ù´¡ÊôÐÔ
def CalcBuffer_NPCBaseEffect(curNPC):
#@warning:»ù´¡ÊôÐÔÏÈËãÏßÐÔÔÚËã·ÇÏßÐÔ
#===========================================================================
# effectList = list()
# buffRefreshList = NPCCommon.GetNPCBuffRefreshList(curNPC)
#
# #---¼ÆËãÏßÐÔЧ¹û---
# for i in range(0, ChConfig.TYPE_Max_Attr):
# effectList.append(0)
#
# for buffState, canPileup in buffRefreshList:
# CalcCurBuffer_BaseEffect(buffState, curNPC, ChConfig.TYPE_Linear, effectList)
#
# #×îÖÕ¼ÆËãЧ¹û
# CalcLineEffect.ChangeNPCAttrInLineEffectList(curNPC, effectList)
#
# #---¼ÆËã·ÇÏßÐÔЧ¹û---
# for i in range(0, ChConfig.TYPE_Max_Attr):
# effectList[i] = 0
#
# for buffState, canPileup in buffRefreshList:
# CalcCurBuffer_BaseEffect(buffState, curNPC, ChConfig.TYPE_NoLinear, effectList)
#
# #×îÖÕ¼ÆËã½á¹û
# CalcNoLineEffect.ChangeNPCAttrInNoLineEffectList(curNPC, effectList)
#===========================================================================
return
#---------------------------------------------------------------------
##¼¼ÄÜ´¥·¢¸½¼Ó¼¼ÄÜ
# @param attacker ¹¥»÷·½
# @param defender ·ÀÊØ·½( ÔÊÐíΪ¿Õ )
# @param curSkill ¼¼ÄÜʵÀý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¼¼ÄÜ´¥·¢¸½¼Ó¼¼ÄÜ
def DoLogic_UseEnhanceSkill(attacker, defender, curSkill, tick, destX=-1, destY=-1):
#δʹÓü¼ÄÜ
if not curSkill:
return
#===============================================================================
# È«²¿Ä¬ÈÏ´¦Àí, ²»¿ªÌØÊâ½Ó¿Ú
# callFunc = GameWorld.GetExecFunc( GameSkills, "SkillAttack_%d.%s"%( curSkill.GetSkillTypeID(), "UseEnhanceSkill" ) )
#
# #µ¥¶À´¦Àí¸½¼Ó¼¼ÄÜ
# if callFunc:
# callFunc( attacker, defender, curSkill, tick )
# return
#===============================================================================
#===========================================================================
# if defender != None and defender.GetGameObjType() == IPY_GameWorld.gotNPC:
# if not defender.GetIsBoss() and GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull:
# #GameWorld.DebugLog("Ò°Íâ³£¹æµØÍ¼Ð¡¹Ö²»´¥·¢¼¼ÄÜ!")
# return
#===========================================================================
#ĬÈÏ´¦Àí
__SkillTrigSkill(attacker, defender, curSkill, destX, destY, curSkill.GetSkillEnhance1(), tick)
__SkillTrigSkill(attacker, defender, curSkill, destX, destY, curSkill.GetSkillEnhance2(), tick)
return
def SkillTrigSkill(attacker, defender, curSkill, skillEnhanceID, tick, destX=-1, destY=-1):
if not curSkill:
return
__SkillTrigSkill(attacker, defender, curSkill, destX, destY, skillEnhanceID, tick)
return
#---------------------------------------------------------------------
##´¥·¢¼¼Äܸ½¼Ó¼¼ÄÜ Ð¼ÓÌõ¼þ¸ù¾ÝѧϰµÄ±»¶¯¼¼ÄÜ´¥·¢
# @param attacker ¹¥»÷Õß
# @param defender ·ÀÊØÕß
# @param useSkill ¼¼ÄÜʵÀý
# @param skillEnhanceID ¸½¼Ó¼¼ÄÜID
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ´¥·¢¼¼Äܸ½¼Ó¼¼ÄÜ£¬Ð¼ÓÌõ¼þ¸ù¾ÝѧϰµÄ±»¶¯¼¼ÄÜ´¥·¢
def __SkillTrigSkill(attacker, defender, useSkill, destX, destY, skillEnhanceID, tick):
#¸½¼Ó¼¼ÄÜIDΪ0,·µ»Ø
if not skillEnhanceID:
return
skillLV = useSkill.GetSkillLV()
# ´¥·¢¼¼Äܵȼ¶ÊÇ·ñÐèÒªÌØÊâÈ¡
#===========================================================================
# curEffect = SkillCommon.GetSkillEffectByEffectID(useSkill, ChConfig.Def_Skill_Effect_ReEnhance)
# if curEffect != None:
#
# if curEffect.GetEffectValue(1) == skillEnhanceID:
# # »ñÈ¡¾ö¶¨´¥·¢¼¼Äܵȼ¶µÄÄ¿±ê¼¼ÄÜ
# tagSkillID = curEffect.GetEffectValue(0)
# tagSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(tagSkillID)
# #δѧϰ
# if tagSkill == None :
# return
#
# skillLV = tagSkill.GetSkillLV()
#===========================================================================
#--- 1. ÏÈÈ¡µÃ´¥·¢¼¼ÄÜ---
#Ïȼì²éÊý¾Ý¿âÓÐû¸ÃÀ༼ÄÜ£¬Èç¹û×î¸ßµÈ¼¶²»Ò»Ñù»áÕÒ²»µ½
#exSkill = GameWorld.GetGameData().FindSkillByType(skillEnhanceID, skillLV)
exSkill = GameWorld.GetGameData().GetSkillBySkillID(skillEnhanceID)
#Òì³£
if not exSkill:
GameWorld.ErrLog("¶ÔÏó = %s, ÕÒ²»µ½¸½¼Ó¼¼ÄÜID = %s, skillLv = %s"%(attacker.GetID() , skillEnhanceID , useSkill.GetSkillLV()))
return
#---ÒÑѧµÄ±»¶¯¼¼ÄÜ´¥·¢¸½¼Ó¼¼ÄÜ£¬·ñÔò¾ÍÊÇÌîдµÄ¸½¼Ó¼¼ÄÜ
#===========================================================================
# if SkillCommon.isPassiveSkill(exSkill):
# #---Èç¹û´¥·¢µÄ¼¼ÄÜÊÇÒÑѧϰµÄ¼¼ÄÜ£¬ÄÇô´¥·¢¸Ãѧϰ¼¼ÄܵĴ¥·¢¼¼ÄÜ---
# passiveSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillEnhanceID)
#
# #δѧϰ
# if passiveSkill == None :
# return
#
# #ÕÒµ½±»¶¯´¥·¢¼¼ÄÜ
# exSkillID = passiveSkill.GetSkillEnhance1()
# exSkill = GameWorld.GetGameData().FindSkillByType(exSkillID, passiveSkill.GetSkillLV())
# #Òì³£
# if not exSkill:
# GameWorld.ErrLog("¶ÔÏó = %s, ÕÒ²»µ½¸½¼Ó¼¼ÄÜID = %s, skillLv = %s"%(attacker.GetID() , skillEnhanceID , passiveSkill.GetSkillLV()))
# return
#===========================================================================
#--- 2. ¼ì²â¸½¼Ó¼¼ÄÜÊÇ·ñÓ¦¸Ã±»´¥·¢---
#ÔÙ´ÎÑéÖ¤¸½¼Ó¼¼ÄÜÊÇ·ñ¶ÔÄ¿±ê¿ÉÓÃ,²¢·µ»ØÊܼ¼ÄܶÔÏó (Bool, defender)
resultList = CheeckTrigSkillandTag(attacker, exSkill, defender, tick)
#¼ì²é¼¼ÄÜÊÇ·ñÊͷųɹ¦
if not resultList[0]:
return
#È¡µÃ·ÀÊØÕߣ¬ÒѾ¸Ä±äΪ¾ßÌåµÄÊ©·¨¶ÔÏó
defender = resultList[1]
#ÓжÔÏóÀ༼ÄÜ, ÐèÒªÅж¨¶ÔÏó״̬
if defender != None and (GameObj.GetHP(defender) <= 0 or GameWorld.GetNPC_Is_Gate(defender)):
return
#Ö÷¼¼Äܱ»ÉÁ±Ü Ôò²»´¥·¢¸½¼Ó¼¼ÄÜ, ¶Ô×Ô¼º·Å¼¼ÄÜÎÞÊÓÉÁ±Ü
if not GameWorld.IsSameObj(attacker, defender) \
and BaseAttack.GetHurtType(defender) == ChConfig.Def_HurtType_Miss:
return
#--- 3. ¼ÆËã¸ÅÂÊ´¥·¢¼¼ÄÜ---
#¼¸ÂÊ
rate = GetSkillOfSeriesHitRate(attacker, defender, exSkill)
if not GameWorld.CanHappen(rate, ChConfig.Def_MaxRateValue):
#¼¸ÂÊδ´¥·¢
return False
# #ÌØÊâÈ«¾ÖÐÍÖ÷¶¯ÔöÒæbuff,ÐèÒªÌí¼ÓÌØÊâ¼ä¸ô
# if attacker.GetGameObjType() == IPY_GameWorld.gotPlayer and useSkill.GetSkillTypeID() in ChConfig.Def_SkillID_Trig:
# attacker.GetSkillManager().SetTrigBuffSkillTick(tick)
#GameWorld.Log("µ±Ç°¼¼ÄÜ = %s,´¥·¢¸½¼Ó¼¼Äܳɹ¦ = %s,´¥·¢¼¸ÂÊ = %s"%(useSkill.GetSkillName(),exSkill.GetSkillName(),rate))
#----------------------------´¦Àí¸½¼Ó¼¼ÄÜ
return DoLogic_UseSkill(attacker, defender, exSkill, tick, destX, destY, True)
##¸½¼Ó¼¼ÄܵÄÔªËØÃüÖиÅÂÊ
# @param attacker ¹¥»÷Õß
# @return ¸ÅÂÊ
def GetSkillOfSeriesHitRate(attacker, defender, exSkill):
baseRate = exSkill.GetHappenRate()
return baseRate
##¼ì²é´¥·¢¼¼ÄܵÄʹÓÃÌõ¼þ
# @param attacker ¹¥»÷Õß
# @param exSkill ¼¼ÄÜʵÀý
# @param defender ¸½¼Ó¼¼ÄÜID
# @param tick ʱ¼ä´Á
# @return Ôª×飨ÊÇ·ñͨ¹ý£¬·ÀÊØ·½£©
# @remarks ¼ì²é´¥·¢¼¼ÄܵÄʹÓÃÌõ¼þ
def CheeckTrigSkillandTag(attacker, exSkill, defender, tick):
#ÔÙ´ÎÑéÖ¤¸½¼Ó¼¼ÄÜÊÇ·ñ¶ÔÄ¿±ê¿ÉÓÃ
if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
#¸Ã¼¼ÄÜÊǶÔ×Ô¼ºÊ¹ÓÃµÄ ·ÀÊØÕßÓ¦¸Ã¸ÄΪ¹¥»÷Õß
if GetSkillAffectTag(exSkill) in [ChConfig.Def_UseSkillTag_Self,
ChConfig.Def_UseSkillTag_SelfAndFriend]:
return True, attacker
return True, defender
#¸Ã¼¼ÄÜÊǶÔ×Ô¼ºÊ¹ÓÃµÄ ·ÀÊØÕßÓ¦¸Ã¸ÄΪ¹¥»÷Õß
if GetSkillAffectTag(exSkill) in [ChConfig.Def_UseSkillTag_Self,
ChConfig.Def_UseSkillTag_SelfAndFriend]:
return True, attacker
#¸Ã¼¼ÄÜÊǶԵØÊ¹ÓÃ
if GetSkillFireAim(exSkill) == ChConfig.Def_UseSkillAim_Ground:
# Íæ¼Ò¶ÔµØÈº¹¥Óпͻ§¶ËÄ¿±êÓÅÏÈÒÔµÚһĿ±êΪÖÐÐÄ
return True, defender
#===========================================================================
# -------GetSkillAffectTagÅж¨¼´¿É£¬²»½øÐÐÑϸñÅж¨-----
# ·ÀÊØÕßΪ¿Õ£¬Ôò¼´Îª¹¥»÷Õß,(Ⱥ¹¥¸ø×Ô¼º¼ÓBUFF)
# if defender == None:
# defender = attacker
#
# #¼ì²éÍæ¼Ò¹¥»÷Ä¿±êµÄ½á¹û
# result = CheckTag_DoPlayerUseSkillTag(attacker, exSkill, defender, tick)
#===========================================================================
return True, defender
##»ñµÃ¼¼Äܵ÷Óú¯Êý
# @param curSkill ¼¼ÄÜʵÀý
# @param pyNameEx ÌØÀýPYÃû
# @param funcName º¯ÊýÃû
# @return º¯ÊýÖ¸Õë
# @remarks »ñµÃ¼¼Äܵ÷Óú¯Êý
def GetSkillCallFuncByName(curSkill, pyNameEx, funcName):
atkType = curSkill.GetAtkType()
if atkType != 0:
pyName = "SkillModule_%s"%atkType
else:
pyName = "%s_%d"%(pyNameEx, curSkill.GetSkillTypeID())
fuctionName = "%s.%s"%(pyName, funcName)
callFunc = GameWorld.GetExecFunc(GameSkills, fuctionName)
#¹¥»÷¼¼ÄÜÈç¹ûʧ°ÜÔòÊä³öÈÕÖ¾
if callFunc == None and pyNameEx == "SkillAttack":
#¼¼Äܲ»¿ÉʹÓÃ
GameWorld.ErrLog('¹¥»÷¼¼ÄÜÎļþ²»¿Éµ÷Óà %s fuctionName: %s'%(pyName, fuctionName))
# if callFunc != None:
# GameWorld.Log("ʹÓü¼ÄÜ %s"%fuctionName)
#¼¼Äܲ»¿ÉʹÓÃ
return callFunc
##¼¼Äܹ¥»÷¶ÔÏóËÀÍöºó´¥·¢¼¼ÄÜ
# @param attacker ¹¥»÷Õß
# @param defender ·ÀÊØÕß
# @param useSkill ʹÓü¼ÄÜ
# @param tick ʱ¼äʵÀý
# @return
def DoLogic_SkillAttackDie(attacker, defender, useSkill, tick):
return
#===============================================================================
# if not useSkill:
# return False
#
# if GameObj.GetHP(defender) > 0:
# return False
#
# # ËÑË÷¼¼Äܹ¥»÷ËÀÍöЧ¹ûID
# curEffect = SkillCommon.GetSkillEffectByEffectID(useSkill, ChConfig.Def_Skill_Effect_SkillAttackDie)
# if not curEffect:
# return False
#
# # ´¥·¢¼¼ÄÜID
# touchSkillID = curEffect.GetEffectValue(0)
#
# touchSkill = GameWorld.GetGameData().GetSkillBySkillID(touchSkillID)
#
# if not touchSkill:
# GameWorld.Log("###Òì³£´íÎó£¬ÎÞ·¨ÕÒµ½¼¼Äܹ¥»÷¶ÔÏóËÀÍö´¥·¢¼¼ÄÜ(%s)"%(touchSkillID))
# return False
#
# return ObjAutoUseSkill(attacker, defender, touchSkill, tick)
#===============================================================================
#---------------------------------------------------------------------
##Êͷż¼ÄÜ
# @param attacker ¹¥»÷·½
# @param defender ·ÀÊØ·½
# @param curSkill ¼¼ÄÜʵÀý
# @param tick ʱ¼ä´Á
# @param tagRoundPosX ¶ÔµØÃæÇøÓò¹¥»÷×ø±êX
# @param tagRoundPosY ¶ÔµØÃæÇøÓò¹¥»÷×ø±êY
# @param isEnhanceSkill ÊÇ·ñÊǸ½¼ÓµÄ¼¼ÄÜ
# @return ·µ»ØÖµÕæ, Êͷųɹ¦
# @remarks ×Ô¶¨Ò庯Êý, Êͷż¼ÄÜ
def DoLogic_UseSkill(attacker, defender, curSkill, tick, tagRoundPosX = -1, tagRoundPosY = -1, isEnhanceSkill = False):
#ʹÓü¼ÄÜÐÐΪ״̬, ·þÎñ¶ËÏÞÖÆ
if not OperControlManager.IsObjCanDoAction(attacker,
ChConfig.Def_Obj_ActState_ServerSkill,
curSkill.GetSkillOfSeries()):
return
# Ç¿ÖÆ¶¨ÒåÎÞ¶ÔÏóµÄÆðµã×ø±êÒ»¶¨Êǹ¥»÷Õß×ø±ê
if curSkill and SkillShell.GetSkillFireAim(curSkill) == ChConfig.Def_UseSkillAim_None:
tagRoundPosX = attacker.GetPosX()
tagRoundPosY = attacker.GetPosY()
#Õâ¸ö¼¼ÄÜÊÇBuff
if SkillCommon.IsBuff(curSkill):
if curSkill.GetSkillType() in [ChConfig.Def_SkillType_LstPlsBuffAtk, ChConfig.Def_SkillType_PassiveLstPlsBuffAtk]:
defender = attacker
return __DoLogic_AddBuff(attacker, defender, curSkill, isEnhanceSkill, tick, tagRoundPosX, tagRoundPosY)
return __DoLogic_UseAttackSkill(attacker, defender, curSkill, tick, tagRoundPosX, tagRoundPosY, isEnhanceSkill)
# ²»ÊÜÏÞÖÆºÍÓ°ÏìµÄ¼¼ÄÜ
def Trigger_UseSkill(attacker, defender, curSkill, tick, tagRoundPosX = 0, tagRoundPosY = 0, isEnhanceSkill = False):
#Õâ¸ö¼¼ÄÜÊÇBuff
if SkillCommon.IsBuff(curSkill):
if ChConfig.Def_SkillType_LstPlsBuffAtk == curSkill.GetSkillType():
defender = attacker
return __DoLogic_AddBuff(attacker, defender, curSkill, isEnhanceSkill, tick, tagRoundPosX, tagRoundPosY)
return __DoLogic_UseAttackSkill(attacker, defender, curSkill, tick, tagRoundPosX, tagRoundPosY, isEnhanceSkill)
#---------------------------------------------------------------------
##ÊÍ·ÅBuff¼¼ÄÜ
# @param attacker ¹¥»÷·½
# @param defender ·ÀÊØ·½
# @param curSkill ¼¼ÄÜʵÀý
# @param isEnhanceSkill ÊÇ·ñÊǸ½¼ÓµÄ¼¼ÄÜ
# @param tick ʱ¼ä´Á
# @param tagRoundPosX ¶ÔµØÃæÇøÓò¹¥»÷×ø±êX
# @param tagRoundPosY ¶ÔµØÃæÇøÓò¹¥»÷×ø±êY
# @return ·µ»ØÖµÕæ, Êͷųɹ¦
# @remarks ×Ô¶¨Ò庯Êý, ÊÍ·ÅBuff¼¼ÄÜ
def __DoLogic_AddBuff(attacker, defender, curSkill, isEnhanceSkill, tick, tagRoundPosX = 0, tagRoundPosY = 0, addForce=False):
skillTypeID = curSkill.GetSkillTypeID()
skillBuffType = SkillCommon.GetBuffType(curSkill)
if defender and not SkillCommon.CheckCanAddBuff(defender, skillBuffType, skillTypeID, curSkill.GetSkillLV()):
#bug20140314 ²»¿ÉÓÐϵͳÌáʾ attacker²»Ò»¶¨ÊÇÍæ¼Ò, ifÅж¨µÄ¶ÔÏóÓ¦¸ÃÊÇdefender
#PlayerControl.NotifyCode(attacker, 'XW_ZZ_SkillInvalidation')
return
if not GameWorld.CanHappen(curSkill.GetHappenRate(), ChConfig.Def_MaxRateValue):
#¼¸ÂÊδ´¥·¢
return
if defender and curSkill.GetSkillType() in ChConfig.Def_Debuff_List:
# debuffÐèÒªÅжÏÊÇ·ñ¿É¹¥»÷£¬ÈçÎÞµÐ
if not AttackCommon.CheckCanAttackTag(attacker, defender):
return
BaseAttack.ClearSkillHurtList()
#---ÊÍ·ÅBuff¼¼ÄÜ---
callFunc = GetSkillCallFuncByName(curSkill, "SkillBuff", "UseBuff")
#Ö´ÐÐBuffÂß¼
if callFunc != None:
#ÀïÃæÐèÒª×öÒ»´ÎAddBuffOver
result = callFunc(attacker, defender, curSkill, tick, tagRoundPosX, tagRoundPosY)
if not result:
return
#ĬÈÏÖ±½ÓÌí¼Ó
else:
#---Ìí¼ÓµÄBuffÖµ---, ½öÖ§³Ö·ÅÔÚЧ¹û1µÄbuff
addBuffValueList = GetAddBuffValue(attacker, curSkill, defender)
result = BuffSkill.DoAddBuff(defender, skillBuffType, curSkill, tick, addBuffValueList, attacker, addForce=addForce)
# resultΪ0 ÊǵÖÏûµÄ²»ÐèÒª¶Ôbuff´¦Àí
if result is not 0:
#Ìí¼ÓBUFFºó£º´¦Àí¼¼ÄÜЧ¹û£¬´¥·¢¸½¼Ó¼¼ÄÜ£¬¼ÓBUFFºó²úÉúµÄЧ¹û£¬³Í·£ºÍ³ðºÞ
AddBuffOver(attacker, defender, curSkill, tick, isEnhanceSkill)
# #---Ö´ÐÐ×Ô¶¨ÒåBuffÌí¼Ó³É¹¦Âß¼´¦Àí, µ½ÕâÀïÓ¦¸ÃÒѾ´¦ÀíÍê ´¥·¢¼¼Äܺ͹¥»÷½á¹û---
# #´Ë´¦ÔÝʱûÓÐÓõ½£¬¿ªÆôʱÐèÈÏÕæ¿¼ÂÇ Ä£°åµÄÇé¿ö
# callFunc = GetSkillCallFuncByName(curSkill, "SkillBuff", "DoAddBuffOver")
#
# if callFunc:
# callFunc(attacker, defender, curSkill, tick)
# return True
if isEnhanceSkill:
BaseAttack.OnHurtTypeTriggerPassiveSkill(attacker, defender, curSkill, tick)
return True
#ÔÚÕâ±ßµ÷ÓñÜÃâȺ¹¥Ê±¶à´Î¿Û³ýÏûºÄ
#Èç¹ûûÓвå¼þ DoAddBuffOver, ĬÈÏÖ´Ðй¥»÷³É¹¦¶¯×÷ //Èç¿Ûħ, ֪ͨ¼¼ÄÜÊÍ·Å
BaseAttack.DoAttackSuccessEx(attacker, GameObj.GetHP(attacker), defender, curSkill, tick)
return True
#waring: ´ËÖµÓ°ÏìÁËBUFFµÄÌæ»»¹æÔò£¬Öµ´óÌæ»»Ð¡µÄ
##Ìí¼ÓBUFFǰѹÈëBUFFµÄÖµ£¬Õâ±ßÖ»¼ÆËãºÍ¹¥»÷ÕßÏà¹Ø£¬½öÖ§³Ö·ÅÔÚЧ¹û1µÄbuff
# @param attacker ¹¥»÷·½
# @param curSkill ¼¼ÄÜ
# @return ѹÈëÖµ£¬Êµ¼ÊÊý¾Ý¿ÉÄÜ»á¸ù¾ÝÊÜÐ§Òæ·½±ä»¯
def GetAddBuffValue(attacker, curSkill, defender):
#ÑéÖ¤¸Ã¼¼ÄÜЧ¹û1µÄID£¬ÌáÈ¡¹«Ê½
curEffect = curSkill.GetEffect(0)
moduleSuffix = GetBuffModuleSuffix(curEffect)
changeBuffValueDict = {}
#ÊÇ·ñÊdzÖÐøÐÔ¼¼ÄÜ
if curSkill.GetSkillType() in ChConfig.Def_LstBuff_List:
callFunc = GameWorld.GetExecFunc( GameBuffs, "BuffProcess_%s.%s"%(moduleSuffix, "CalcBuffValue") )
else:
callFunc = GameWorld.GetExecFunc( GameBuffs, "Buff_%s.%s"%(moduleSuffix, "CalcBuffValue") )
if not callFunc:
return []
return callFunc(attacker, defender, curSkill, changeBuffValueDict)
##Ìí¼ÓBUFFºó£º´¦Àí¼¼ÄÜЧ¹û£¬´¥·¢¸½¼Ó¼¼ÄÜ£¬¼ÓBUFFºó²úÉúµÄЧ¹û£¬³Í·£ºÍ³ðºÞ
# @param attacker ¹¥»÷·½
# @param defender ·ÀÊØ·½
# @param curSkill ¼¼ÄÜʵÀý
# @param tick ʱ¼ä´Á
# @param isEnhanceSkill ÊÇ·ñÊǸ½¼ÓµÄ¼¼ÄÜ
# @return ·µ»ØÖµÕæ, Êͷųɹ¦
# @remarks Ìí¼ÓBUFFºó£º´¦Àí¼¼ÄÜЧ¹û£¬´¥·¢¸½¼Ó¼¼ÄÜ£¬¼ÓBUFFºó²úÉúµÄЧ¹û£¬³Í·£ºÍ³ðºÞ
def AddBuffOver(attacker, defender, curSkill, tick, isEnhanceSkill):
#---Ê×´ÎÌí¼ÓÕâ¸öbuffµÄ´¥·¢, BuffÊÇÿ´ÎÖØËãµÄ, ÈçijЩֵֻÄÜËãÒ»´Î, ¾ÍÔÚÕâ¸ö²å¼þÖÐÌí¼Ó---
#@bug: һЩ¼¼ÄÜÖ»ÔÚµÚÒ»´ÎÌí¼ÓBuffµÄʱºò¼ÆËãBuffÖµ, ¶øÕý³£Buff¶¼ÊÇÇå¿ÕÖØËãµÄ, µ¼ÖÂBuffÖµ±»ÖØÖÃ
for effectIndex in range(0, curSkill.GetEffectCount()):
curEffect = curSkill.GetEffect(effectIndex)
callFunc = GameWorld.GetExecFunc(GameBuffs, "Buff_%d.%s"%(curEffect.GetEffectID(), "OnAddBuff"))
if callFunc == None:
continue
#@warning: defenderÓпÉÄÜΪNone( ȺÌå¹¥»÷ʱ )
callFunc(attacker, defender, curEffect, tick)
skillType = curSkill.GetSkillType()
#---¸øÄ¿±êÉϳÖÐøÐÔBuff¼¤»îÄ¿±êTick---
if defender != None and skillType in ChConfig.Def_LstBuff_List:
defender.SetIsNeedProcess(True)
#---Ö´ÐÐĬÈÏBuffÌí¼Ó³É¹¦Âß¼´¦Àí---
if isEnhanceSkill:
#¸½¼Ó¼¼Äܲ»Í¨Öª¹¥»÷½á¹û
return
#µ÷Óô¥·¢¸½¼Ó¼¼ÄÜ
DoLogic_UseEnhanceSkill(attacker, defender, curSkill, tick)
#´¥·¢¹¥»÷½áÊøÂß¼
if skillType in ChConfig.Def_Debuff_List and \
defender != None and not GameWorld.IsSameObj(attacker, defender):
#Èç¹ûÊǸøNPC¼ÓDeBuff, ÐèÒªÌí¼Ó³ðºÞ
if defender.GetGameObjType() == IPY_GameWorld.gotNPC:
npcControl = NPCCommon.NPCControl(defender)
npcControl.AddObjToAngryList(attacker, curSkill.GetSkillAngry() + 1)
#µ÷Óù¥»÷³Í·£Âß¼
BaseAttack.DoLogic_AttackResult(attacker, defender, None, tick)
return
#---------------------------------------------------------------------
##ÊÍ·ÅÆÕͨ¼¼ÄÜ
# @param attacker ¹¥»÷·½
# @param defender ·ÀÊØ·½
# @param curSkill ¼¼ÄÜʵÀý
# @param tick ʱ¼ä´Á
# @param tagRoundPosX ÊÍ·ÅÇøÓòX
# @param tagRoundPosY ÊÍ·ÅÇøÓòY
# @return ·µ»ØÖµÕæ, Êͷųɹ¦
# @remarks ×Ô¶¨Ò庯Êý, ÊÍ·ÅÆÕͨ¼¼ÄÜ
def __DoLogic_UseAttackSkill(attacker, defender, curSkill, tick, tagRoundPosX = -1,
tagRoundPosY = -1, isEnhanceSkill = False):
callFunc = GetSkillCallFuncByName(curSkill, "SkillAttack", "UseSkill")
#¼¼Äܲ»¿ÉʹÓÃ
if callFunc == None:
return False
#ʹÓü¼ÄÜ
return callFunc(attacker, defender, curSkill, tagRoundPosX, tagRoundPosY, isEnhanceSkill, tick)
#---------------------------------------------------------------------
#===============================================================================
# //06 0C ÉèÖÃ×Ô¶¯Êͷż¼ÄÜ#tagCSetAutoSkill
# tagCSetAutoSkill * GettagCSetAutoSkill();
#
# class IPY_CSetAutoSkill
# {
# public:
# //0±íʾʲô¶¼×ö;1±íʾÆÕ¹¥;2±íʾÉèÖü¼ÄÜID
# int GetType();
# //¼¼ÄÜID,Ö»ÔÚType=2ʱÓÐЧ
# int GetSkillID();
# };
#===============================================================================
##¿Í»§¶Ë·â°üÏìÓ¦ 06 0C ÉèÖÃ×Ô¶¯Êͷż¼ÄÜ#tagCSetAutoSkill
# @param index Íæ¼ÒË÷Òý
# @param tick ʱ¼ä´Á
# @return ·µ»ØÖµÎÞÒâÒå
# @remarks ¿Í»§¶Ë·â°üÏìÓ¦ 06 0C ÉèÖÃ×Ô¶¯Êͷż¼ÄÜ#tagCSetAutoSkill
def SetAutoSkill(index, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
sendPack = IPY_GameWorld.IPY_CSetAutoSkill()
#ÕâÀï²»¼ÓÑéÖ¤,ֻѹÈë,´ýÊͷż¼ÄܵÄʱºòÔÚÑéÖ¤
curPlayer.SetAutoAtk(sendPack.GetType(), sendPack.GetSkillID())
return
#---------------------------------------------------------------------
# »ñµÃ¹ØÁª¼¼ÄÜ,0 È«²¿ 1ÊÇÖ÷¶¯Ðͼ¼ÄÜ£¨·¨±¦£¬ÆÕ¹¥£© 2 ΪÈË×å·¨±¦¼¼ÄÜ 3ΪÆÕ¹¥ ÆäËû¼¼ÄÜID
def GetConnectSkillID(curSkill):
return curSkill.GetExAttr1()
##»ñµÃÉý¼¶¼¼ÄÜÏûºÄµÄÕæÆøÖµ
# @param curSkill Éý¼¶¼¼ÄÜ
# @return »ñµÃÉý¼¶¼¼ÄÜÏûºÄµÄÕæÆøÖµ
def GetLVUpCostZhenQi(curSkill):
return 0#curSkill.GetExAttr1()
##»ñµÃ¼¼Äܵıط¢Éú״̬:Èç±ØÃüÖУ¬±Ø±©»÷£¬´Ë¼¼ÄܱØÐëΪÖ÷¶¯·½Ö´Ðм¼ÄÜ£¬BUFF״̬ÐÔÅäÖÃÎÞЧ
# @param curSkill ¼¼ÄÜʵÀý
# @return »ñµÃ¼¼Äܵıط¢Éú״̬
def GetHappenState(curSkill):
if not curSkill:
return 0
return curSkill.GetExAttr2()
# Ö»ÓÐÔÚÖ¸¶¨µØÍ¼²ÅÄÜÉúЧµÄbuffЧ¹û£¬»òÕßÖ¸¶¨µØÍ¼¿É±»¶¯´¥·¢
def GetAttrMapID(curSkill):
return curSkill.GetExAttr3()
##¼¼ÄÜÉý¼¶ÏûºÄÎïÆ·ID
# @param curSkill ¼¼ÄÜʵÀý
# @return ¼¼ÄÜÉý¼¶ÏûºÄÎïÆ·ID
def GetUpLVCostItemId(curSkill):
return curSkill.GetExAttr4()
##¼¼ÄÜÉý¼¶ÏûºÄÎïÆ·ÊýÁ¿
# @param curSkill ¼¼ÄÜʵÀý
# @return ¼¼ÄÜÉý¼¶ÏûºÄÎïÆ·ÊýÁ¿
def GetUpLVCostItemNum(curSkill):
return curSkill.GetExAttr5()
##»ñµÃµ±Ç°¼¼ÄÜÉý¼¶ÏûºÄµÄÕæÆøÖµ
# @param curSkill µ±Ç°¼¼Äܼ¼ÄÜ
# @return »ñµÃÉý¼¶¼¼ÄÜÏûºÄµÄÕæÆøÖµ
def GetSkillLVUpCostZhenQi(curSkill):
curSkillTypeID = curSkill.GetSkillTypeID()
maxSkillLV = curSkill.GetSkillMaxLV() # ×î¸ß¼¼Äܵȼ¶
upSkillLv = curSkill.GetSkillLV() + 1
skillLv = min(maxSkillLV, upSkillLv)
upSkill = GameWorld.GetGameData().FindSkillByType(curSkillTypeID, skillLv)
if not upSkill:
GameWorld.Log('»ñÈ¡ÏûºÄÕæÆøÖµ´íÎó£¬skill is None')
return 0
skillLvUpNeedZhenQi = GetLVUpCostZhenQi(upSkill)
return skillLvUpNeedZhenQi
## Ö´Ðб»¶¯´¥·¢¼¼ÄÜÊÍ·Å
# @param taget
# @return None
def UsePassiveTriggerSkill(attacker, curSkill, target, tick, isEnhanceSkill=False):
result = False # ¹¥»÷½á¹û
#¾µÏñµ¥´Î¹¥»÷ͳ¼Æ£¬²éµ¥´Î¹¥»÷ÎÞÏÞ´¥·¢±»¶¯ËÀÑ»·ÁÙʱ´úÂë
if PyGameData.g_singleAtkRecordList != None and (attacker and attacker.GetDictByKey(ChConfig.Def_PlayerKey_MirrorBattleID)):
atkID = attacker.GetID()
tagID = target.GetID() if target else 0
skillID = curSkill.GetSkillID()
PyGameData.g_singleAtkRecordList.append([atkID, tagID, skillID])
#GameWorld.DebugLog("PyGameData.g_singleAtkRecordList: %s, %s" % (len(PyGameData.g_singleAtkRecordList), PyGameData.g_singleAtkRecordList))
#ÒÑÐÞ¸´SetUsingPassiveSkill¼ÆÊýÎÊÌ⣬Õâ¸ö¼Ç¼»¹ÊÇÏȱ£Áô£¬¹Û²ìÒ»¶Îʱ¼äºóûÎÊÌâ¿ÉÈ¥³ý
if len(PyGameData.g_singleAtkRecordList) >= 100:
#mapID = GameWorld.GetMap().GetMapID()
#GameWorld.SendGameError("MirrorAIAtkDepthError", "mapID=%s, %s" % (mapID, PyGameData.g_singleAtkRecordList))
PyGameData.g_singleAtkRecordList = None
return result
if curSkill.GetTag() == 0 and not isEnhanceSkill:
# µ±¼¼ÄÜÀàÐÍΪ±»¶¯¼¼Äܲ¢ÇÒtag×Ö¶ÎΪ0£¬Ôò´Ë¼¼ÄÜΪý½éÓÃÓÚ´¥·¢¼¼ÄÜ SkillEnhance1 SkillEnhance2
skill1 = GameWorld.GetGameData().GetSkillBySkillID(curSkill.GetSkillEnhance1())
if skill1 and GameWorld.CanHappen(skill1.GetHappenRate(), ChConfig.Def_MaxRateValue):
result = True if UsePassiveTriggerSkill(attacker, skill1, target, tick, True) else result
skill2 = GameWorld.GetGameData().GetSkillBySkillID(curSkill.GetSkillEnhance2())
if skill2 and GameWorld.CanHappen(skill2.GetHappenRate(), ChConfig.Def_MaxRateValue):
result = True if UsePassiveTriggerSkill(attacker, skill2, target, tick, True) else result
SkillCommon.SetSkillRemainTime(curSkill, PlayerControl.GetReduceSkillCDPer(attacker), tick, attacker)
return result
skillAim = GetSkillFireAim(curSkill)
affectTag = GetSkillAffectTag(curSkill)
GameWorld.DebugLog("Êͷű»¶¯´¥·¢¼¼ÄÜ : %s- %s %s"%(skillAim, curSkill.GetSkillID(), curSkill.GetSkillName()), attacker.GetID())
if skillAim == ChConfig.Def_UseSkillAim_None:
if curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List and affectTag != ChConfig.Def_UseSkillTag_Self:
if target and target.GetGameObjType() == IPY_GameWorld.gotNPC and target.GetGameNPCObjType() == IPY_GameWorld.gnotSummon:
owner = NPCCommon.GetNpcObjOwnerDetail(target)
if owner and owner.GetID() == attacker.GetID():
# Óк¦¼¼ÄÜÌØÊâ´¦Àí£¬²»ÄܶÔ×Ô¼ºµÄÕÙ»½ÎïÊÍ·Å
target = None
result = DoLogic_UseSkill(attacker, target, curSkill, tick, attacker.GetPosX(), attacker.GetPosY(), isEnhanceSkill=isEnhanceSkill)
else:
result = DoLogic_UseSkill(attacker, attacker, curSkill, tick, isEnhanceSkill=isEnhanceSkill)
#¶ÔµØÊÍ·ÅÀ༼ÄÜ
elif skillAim == ChConfig.Def_UseSkillAim_Ground:
if target:
posX, posY = target.GetPosX(), target.GetPosY()
else:
posX, posY = attacker.GetPosX(), attacker.GetPosY()
result = DoLogic_UseSkill(attacker, target, curSkill, tick, posX, posY, isEnhanceSkill=isEnhanceSkill)
else:
if affectTag == ChConfig.Def_UseSkillTag_PetMaster:
if not PetControl.IsPet(attacker):
return False
petOwner = PetControl.GetPetOwner(attacker)
if petOwner == None:
return False
target = petOwner
if GameObj.GetHP(target) <= 0:
return False
if affectTag not in [ChConfig.Def_UseSkillTag_None, ChConfig.Def_UseSkillTag_Self]:
if not target:
# ÅäÖÃÁ˿ɹ¥»÷Ä¿±ê£¬µ«Ã»Ä¿±ê¾Í²»Èô¥·¢
GameWorld.DebugLog("ÅäÖÃÁ˿ɹ¥»÷Ä¿±ê£¬µ«Ã»Ä¿±ê¾Í²»Èô¥·¢")
result = False
#result = DoLogic_UseSkill(curPlayer, target, curSkill, tick, curPlayer.GetPosX(), curPlayer.GetPosY(), isEnhanceSkill)
else:
#¼ì²éÄ¿±ê
if attacker.GetGameObjType() == IPY_GameWorld.gotPlayer and \
not CheckTag_DoPlayerUseSkillTag(attacker, curSkill, target, tick):
#GameWorld.Log("UsePassiveTriggerSkill = %s, ¼ì²éÄ¿±êÊÇ·ñ¿ÉÒÔ¹¥»÷ʧ°Ü = %s"%( curSkill.GetTag(), target.GetName() ) )
result = False
else:
result = DoLogic_UseSkill(attacker, target, curSkill, tick, isEnhanceSkill=isEnhanceSkill)
else:
# Ö¸¶¨Ä¿±êΪ×Ô¼º
result = DoLogic_UseSkill(attacker, attacker, curSkill, tick, isEnhanceSkill=isEnhanceSkill)
GameWorld.DebugLog("´¥·¢½á¹û-----------%s"%result, attacker.GetID())
return result
## »ñȡijÀàÐͼ¼ÄÜ´ïµ½XµÈ¼¶µÄ¸öÊý
# @param curPlayer
# @return
def GetSkillCntByFunc(curPlayer, funcType, skilllv=0):
allSkillCnt = 0
skillManager = curPlayer.GetSkillManager()
for i in xrange(skillManager.GetSkillCount()):
curPlayerSkill = skillManager.GetSkillByIndex(i)
if curPlayerSkill == None:
continue
if curPlayerSkill.GetFuncType() != funcType:
continue
if curPlayerSkill.GetSkillLV() >= skilllv:
allSkillCnt += 1
return allSkillCnt
## »ñÈ¡¼¼ÄÜ×ܵȼ¶
# @param curPlayer
# @return allSkillLV:×ܼ¼Äܵȼ¶
def GetAllSkillLV(curPlayer, funcType):
allSkillLV = 0
skillManager = curPlayer.GetSkillManager()
for i in xrange(skillManager.GetSkillCount()):
curPlayerSkill = skillManager.GetSkillByIndex(i)
if curPlayerSkill == None:
continue
if curPlayerSkill.GetFuncType() != funcType:
continue
skillLV = curPlayerSkill.GetSkillLV()
allSkillLV += skillLV
return allSkillLV