6613 子 【开发】【2.0】增加重击字体战斗飘字 / 【后端】【2.0】增加重击属性
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A7 19 查询玩家境界阶装备信息结果 #tagSCPlayerEquipCacheResult
|
| | |
|
| | | class tagSCPlayerEquipCacheResult(Structure):
|
| | | Head = tagHead()
|
| | | PlayerID = 0 #(DWORD PlayerID)//玩家ID
|
| | | EquipClassLV = 0 #(BYTE EquipClassLV)
|
| | | ItemDataSize = 0 #(WORD ItemDataSize)
|
| | | ItemData = "" #(String ItemData)//物品记录 |
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x19
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.EquipClassLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.ItemDataSize,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.ItemData,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x19
|
| | | self.PlayerID = 0
|
| | | self.EquipClassLV = 0
|
| | | self.ItemDataSize = 0
|
| | | self.ItemData = ""
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 1
|
| | | length += 2
|
| | | length += len(self.ItemData)
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.PlayerID)
|
| | | data = CommFunc.WriteBYTE(data, self.EquipClassLV)
|
| | | data = CommFunc.WriteWORD(data, self.ItemDataSize)
|
| | | data = CommFunc.WriteString(data, self.ItemDataSize, self.ItemData)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | PlayerID:%d,
|
| | | EquipClassLV:%d,
|
| | | ItemDataSize:%d,
|
| | | ItemData:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.PlayerID,
|
| | | self.EquipClassLV,
|
| | | self.ItemDataSize,
|
| | | self.ItemData
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagSCPlayerEquipCacheResult=tagSCPlayerEquipCacheResult()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCPlayerEquipCacheResult.Head.Cmd,m_NAtagSCPlayerEquipCacheResult.Head.SubCmd))] = m_NAtagSCPlayerEquipCacheResult
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A7 07 通知玩家自定义聊天 #tagMCPyTalk
|
| | |
|
| | | class tagMCPyTalk(Structure):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B1 08 开始印记流失时间 #tagMCYinjiStartTime
|
| | |
|
| | | class tagMCYinjiStartTime(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB1
|
| | | self.SubCmd = 0x08
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | | self.Clear()
|
| | | memmove(addressof(self), stringData[_pos:], self.GetLength())
|
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xB1
|
| | | self.SubCmd = 0x08
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCYinjiStartTime)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''//B1 08 开始印记流失时间 //tagMCYinjiStartTime:
|
| | | Cmd:%s,
|
| | | SubCmd:%s
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCYinjiStartTime=tagMCYinjiStartTime()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCYinjiStartTime.Cmd,m_NAtagMCYinjiStartTime.SubCmd))] = m_NAtagMCYinjiStartTime
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B2 08 获得仙缘币信息 #tagMCAddXianyuanCoinMsg
|
| | |
|
| | | class tagMCAddXianyuanCoinMsg(Structure):
|
| | |
| | | Def_Effect_DamagePVE = 141 # PVE固定伤害
|
| | | Def_Effect_FinalHurtPer = 142 # 最终伤害万分率
|
| | | Def_Effect_FinalHurtReducePer = 143 # 最终伤害减少万分
|
| | | Def_Effect_YinjiTime = 144 # 每X毫秒自动消失一个印记
|
| | |
|
| | | #增加%d物理伤害值,其中a值为伤害值
|
| | | Def_Effect_AddAtk = 1005
|
| | |
| | | CDBPlayerRefresh_SuperHitRateReduce, # 暴击概率抗性 210
|
| | | CDBPlayerRefresh_LuckyHitReduce, # 会心伤害减免固定值
|
| | | CDBPlayerRefresh_FinalHurtReducePer, # 最终伤害减少百分比
|
| | | ) = range(146, 213)
|
| | | CDBPlayerRefresh_YinjiTime, # 每X秒减少印记时间,毫秒
|
| | | ) = range(146, 214)
|
| | |
|
| | | TYPE_Price_Gold_Paper_Money = 5 # 金钱类型,(先用礼券,再用金子)
|
| | | TYPE_Price_Family_Contribution = 6 # 战盟贡献度(活跃度转换得来)
|
| | |
| | | def IsHappenStateByType(happenState, cmpType):
|
| | | return happenState & cmpType
|
| | |
|
| | | def CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState):
|
| | |
|
| | | # 表现形式 致命一击>(重击>暴击)>会心>格挡>境界压制
|
| | | # 重击定义:当触发重击时,则增加双倍暴击固定值伤害(重击与暴击互斥,优先判断重击,当重击触发时,暴击不触发)
|
| | | def CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState, curSkill):
|
| | | ''' 获取伤害类型结果
|
| | | 支持多种伤害类型同时触发, 飘字表现以最终表现伤害类型为主
|
| | | @return: 最终表现伤害类型, {伤害类型:[是否触发, 伤害计算值, 触发时防守方的伤害减免值], ...}
|
| | |
| | | ChConfig.Def_HurtType_Parry:[False, 0, 0],
|
| | | ChConfig.Def_HurtType_Zhuxian:[False, 0, 0],
|
| | | ChConfig.Def_HurtType_DeadlyHit:[False, 0, 0],
|
| | | ChConfig.Def_HurtType_ThumpHit:[False, 0, 0],
|
| | | }
|
| | |
|
| | | calcTypeList = []
|
| | | if atkObjType == IPY_GameWorld.gotPlayer:
|
| | | calcTypeList += [ChConfig.Def_HurtType_LuckyHit, ChConfig.Def_HurtType_SuperHit,
|
| | | ChConfig.Def_HurtType_Zhuxian, ChConfig.Def_HurtType_DeadlyHit]
|
| | | ChConfig.Def_HurtType_Zhuxian, ChConfig.Def_HurtType_DeadlyHit,
|
| | | ChConfig.Def_HurtType_ThumpHit]
|
| | | if defObjType == IPY_GameWorld.gotPlayer:
|
| | | calcTypeList += [ChConfig.Def_HurtType_Parry]
|
| | | # 暂时只计算玩家
|
| | |
| | | # 优先级列表, 互斥列表
|
| | | priorityList, mutexList = ReadChConfig.GetEvalChConfig("CalcHurtTypeInfo")
|
| | | happenFunc = {
|
| | | ChConfig.Def_HurtType_LuckyHit:lambda aObj, dObj, hState:__HurtTypeHappen_LuckyHit(aObj, dObj, hState),
|
| | | ChConfig.Def_HurtType_SuperHit:lambda aObj, dObj, hState:__HurtTypeHappen_SuperHit(aObj, dObj, hState),
|
| | | ChConfig.Def_HurtType_Parry:lambda aObj, dObj, hState:__HurtTypeHappen_Parry(aObj, dObj, hState),
|
| | | #ChConfig.Def_HurtType_Zhuxian:lambda aObj, dObj, hState:__HurtTypeHappen_Zhuxian(aObj, dObj, hState),
|
| | | ChConfig.Def_HurtType_DeadlyHit:lambda aObj, dObj, hState:__HurtTypeHappen_Deadly(aObj, dObj, hState),
|
| | | ChConfig.Def_HurtType_LuckyHit:__HurtTypeHappen_LuckyHit,
|
| | | ChConfig.Def_HurtType_SuperHit:__HurtTypeHappen_SuperHit,
|
| | | ChConfig.Def_HurtType_Parry:__HurtTypeHappen_Parry,
|
| | | #ChConfig.Def_HurtType_Zhuxian:__HurtTypeHappen_Zhuxian,
|
| | | ChConfig.Def_HurtType_DeadlyHit:__HurtTypeHappen_Deadly,
|
| | | ChConfig.Def_HurtType_ThumpHit:__HurtTypeHappen_ThumpHit,
|
| | | }
|
| | |
|
| | | hadCheckList = [] # 已经处理过的伤害类型列表
|
| | |
| | | if curMHHappen:
|
| | | # 只要其中一个已触发的则后面的均为默认不触发
|
| | | continue
|
| | | result = happenFunc[hType](atkObj, defObj, happenState)
|
| | | result = happenFunc[hType](atkObj, defObj, happenState, curSkill)
|
| | | if result: # 如果触发,更新相关数值
|
| | | hurtTypeResultDict[hType] = result
|
| | | curMHHappen = True
|
| | |
| | | continue
|
| | | if hType not in hadCheckList:
|
| | | hadCheckList.append(hType)
|
| | | result = happenFunc[hType](atkObj, defObj, happenState)
|
| | | result = happenFunc[hType](atkObj, defObj, happenState, curSkill)
|
| | | if result: # 如果触发,更新相关数值
|
| | | hurtTypeResultDict[hType] = result
|
| | |
|
| | |
| | | return hurtType, hurtTypeResultDict
|
| | |
|
| | |
|
| | | def __HurtTypeHappen_LuckyHit(atkObj, defObj, happenState):
|
| | | def __HurtTypeHappen_LuckyHit(atkObj, defObj, happenState, curSkill):
|
| | | ''' 判断伤害类型是否发生 - 会心一击
|
| | | @return: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
|
| | | '''
|
| | |
| | | return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReduce(defObj)
|
| | | return
|
| | |
|
| | | def __HurtTypeHappen_SuperHit(atkObj, defObj, happenState):
|
| | | def __HurtTypeHappen_SuperHit(atkObj, defObj, happenState, curSkill):
|
| | | ''' 判断伤害类型是否发生 - 暴击
|
| | | @return: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
|
| | | '''
|
| | |
| | | return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReduce(defObj)
|
| | | return
|
| | |
|
| | | def __HurtTypeHappen_Parry(atkObj, defObj, happenState):
|
| | | def __HurtTypeHappen_Parry(atkObj, defObj, happenState, curSkill):
|
| | | ''' 判断伤害类型是否发生 - 防守方抵御
|
| | | @return: 是否触发, 触发时伤害计算值, 触发时防守方的伤害减免值
|
| | | '''
|
| | |
| | | return True, 0, chanceDefPer
|
| | | return
|
| | |
|
| | | #def __HurtTypeHappen_Zhuxian(atkObj, defObj, happenState):
|
| | | #def __HurtTypeHappen_Zhuxian(atkObj, defObj, happenState, curSkill):
|
| | | # """诛仙一击"""
|
| | | # rate = PlayerControl.GetZhuXianRate(atkObj)
|
| | | # if not rate:
|
| | |
| | | # return
|
| | |
|
| | | # 致命一击
|
| | | def __HurtTypeHappen_Deadly(atkObj, defObj, happenState):
|
| | | def __HurtTypeHappen_Deadly(atkObj, defObj, happenState, curSkill):
|
| | | if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, None, ChConfig.TriggerType_IsDealy):
|
| | | return True, 0, 0
|
| | | return
|
| | |
|
| | | #重击定义:当触发重击时,则增加双倍暴击固定值伤害(重击与暴击互斥,优先判断重击,当重击触发时,暴击不触发)
|
| | | def __HurtTypeHappen_ThumpHit(atkObj, defObj, happenState, curSkill):
|
| | | |
| | | if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_ThumpHit):
|
| | | return True, atkObj.GetSuperHit()*2, PlayerControl.GetSuperHitReduce(defObj)
|
| | | |
| | | thumpHitRate = 0 |
| | | thumpHitRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, |
| | | ChConfig.TriggerType_AddThumpHitRate)
|
| | | thumpHitRate += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, |
| | | ChConfig.TriggerType_AddThumpHitRate)
|
| | | if thumpHitRate <= 0:
|
| | | return
|
| | | if GameWorld.CanHappen(thumpHitRate):
|
| | | return True, atkObj.GetSuperHit()*2, PlayerControl.GetSuperHitReduce(defObj)
|
| | | return
|
| | |
|
| | |
|
| | | def ChangeSkillHurtPer(atkObj, defObj, curSkill, skillPer):
|
| | |
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, None, ChConfig.TriggerType_ProDefValue, tick)
|
| | | return hurtValue - absortValue
|
| | |
|
| | |
|
| | | # 设置玩家一次主动型攻击中的第一个防御者
|
| | | def SetFirstDefender(attacker, defObj, curSkill):
|
| | | if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return
|
| | | |
| | | if curSkill and curSkill.GetFuncType() not in [ChConfig.Def_SkillFuncType_FbSkill,
|
| | | ChConfig.Def_SkillFuncType_NormalAttack]:
|
| | | return
|
| | | |
| | | if attacker.GetDictByKey(ChConfig.Def_PlayerKey_FirstDefender):
|
| | | return |
| | | |
| | | attacker.SetDict(ChConfig.Def_PlayerKey_FirstDefender, defObj.GetID())
|
| | | |
| | | return
|
| | |
|
| | | # 清除第一目标
|
| | | def ClearFirstDefender(attacker):
|
| | | if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return
|
| | | attacker.SetDict(ChConfig.Def_PlayerKey_FirstDefender, 0)
|
| | | |
| | | return
|
| | |
|
| | | def GetFirstDefenderID(attacker):
|
| | | return attacker.GetDictByKey(ChConfig.Def_PlayerKey_FirstDefender)
|
| | |
|
| | |
|
| | |
|
| | | ## 计算伤血值
|
| | | # @param atkObj 攻击者
|
| | | # @param defObj 防御者
|
| | |
| | | # @remarks 函数详细说明.
|
| | | def GetHurtHP(attacker, defObj, curSkill, atkSkillValue, atkSkillPer, tick):
|
| | | atkObj = ElfChangeAttacker(attacker) # Elf灵为替身攻击,要取玩家的属性
|
| | | |
| | | #设置第一个防御者
|
| | | SetFirstDefender(atkObj, defObj, curSkill)
|
| | |
|
| | | resultHurtType = HurtType()
|
| | | atkObjType = attacker.GetGameObjType()
|
| | |
| | |
|
| | | WriteHurtLog(attacker, defObj, curSkill, resultHurtType.LostHP, resultHurtType.HurtType, "最终扣血")
|
| | |
|
| | | #攻击触发事件, 该代码应该放在DoAttack函数中处理逻辑比较清晰,也不会破坏GetHurtHP函数
|
| | | #因为DoAttack修改点比较多,暂不迁移,相关攻击事件逻辑,就往此函数中添加
|
| | | AttackEventTrigger(atkObj, defObj, curSkill, resultHurtType, tick)
|
| | | #===========================================================================
|
| | | # if atkObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | # GameWorld.DebugAnswer(atkObj, "--%s剩余血量 %s"%(defObj.GetID(), defObj.GetHP()))
|
| | | #===========================================================================
|
| | |
|
| | | return resultHurtType
|
| | |
|
| | |
| | | return 0, ChConfig.Def_HurtType_Miss
|
| | |
|
| | |
|
| | | hurtType, hurtTypeResultDict = CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState)
|
| | | hurtType, hurtTypeResultDict = CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState, curSkill)
|
| | | #GameWorld.DebugLog("GetHurtHP hurtType=%s, hurtTypeResultDict=%s" % (hurtType, hurtTypeResultDict))
|
| | | isLuckyHit, aLuckyHit, dLuckyHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_LuckyHit] # 幸运一击
|
| | | isSuperHit, aSuperHit, dSuperHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_SuperHit] # 暴击
|
| | | |
| | | # 重击和暴击互斥,并且使用同一个参数
|
| | | isSuperHit, aSuperHit, dSuperHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_ThumpHit] |
| | | if not isSuperHit:
|
| | | isSuperHit, aSuperHit, dSuperHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_SuperHit] |
| | | else:
|
| | | # 重击加成
|
| | | thumpPer = 0
|
| | | thumpPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddThumpHitPer)
|
| | | thumpPer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddThumpHitPer)
|
| | | aSuperHit = aSuperHit*(thumpPer + 10000)/10000
|
| | | |
| | | dDamChanceDef = hurtTypeResultDict[ChConfig.Def_HurtType_Parry][2] # 抵御, 大于0代表触发抵御效果
|
| | | isZhuxianHit, aZhuxianHurtPer, dZhuxianReducePer = hurtTypeResultDict[ChConfig.Def_HurtType_Zhuxian] # 诛仙一击
|
| | | isDeadlyHit = hurtTypeResultDict[ChConfig.Def_HurtType_DeadlyHit][0] # 致命一击
|
| | |
| | | #PVP 攻击回血
|
| | | atkBackHP += PlayerControl.GetPVPAtkBackHP(atkObj)
|
| | | # 百分比吸血
|
| | | atkBackHPPer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, None, ChConfig.TriggerType_Buff_SuckBloodPer)
|
| | | atkBackHPPer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
|
| | | atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
|
| | |
|
| | | atkBackHP += int(hurtValue * atkBackHPPer*1.0 / ChConfig.Def_MaxRateValue)
|
| | |
| | | # 触发型技能根据伤血类型触发被动技能,群攻只触发一次,放在伤血列表被清之前
|
| | | # 只处理 isEnhanceSkill的情况,对应 OnHurtTypeTriggerSkill
|
| | | def OnHurtTypeTriggerPassiveSkill(attacker, target, curSkill, tick):
|
| | | AttackCommon.ClearFirstDefender(attacker)
|
| | |
|
| | | skillHurtLists = [] # 内部触发清除g_skillHurtList
|
| | | for i in xrange(g_skillHurtList.GetHurtCount()):
|
| | |
| | | continue
|
| | |
|
| | | skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()])
|
| | | |
| | | #只对第一目标造成某伤害类型时触发技能, 需先存储 skillHurtLists
|
| | | OnHurtTypeTriggerSkillFirstObj(attacker, curSkill, tick)
|
| | | |
| | |
|
| | | for hurtList in skillHurtLists:
|
| | | defender = GameWorld.GetObj(hurtList[0], hurtList[1])
|
| | |
| | | OnHurtTypeTriggerPassiveSkill(curPlayer, target, curSkill, tick)
|
| | | return True
|
| | |
|
| | | AttackCommon.ClearFirstDefender(curPlayer)
|
| | | |
| | | #玩家进入战斗状态
|
| | | #技能是光环, 不进入战斗状态 ,无对象,不进入战斗状态
|
| | | if (curSkill == None \
|
| | |
| | | return False
|
| | |
|
| | |
|
| | | #只对第一目标造成某伤害类型时触发技能
|
| | | def OnHurtTypeTriggerSkillFirstObj(attacker, curSkill, tick):
|
| | | if g_skillHurtList.GetHurtCount() == 0:
|
| | | return
|
| | | |
| | | hurtObj = g_skillHurtList.GetHurtAt(0)
|
| | | if not hurtObj:
|
| | | return
|
| | | |
| | | objID, objType, hurtType = hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType() |
| | | |
| | | defender = GameWorld.GetObj(objID, objType)
|
| | | if not defender:
|
| | | return
|
| | | if hurtType == ChConfig.Def_HurtType_SuperHit:
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SuperHit, tick)
|
| | | elif hurtType == ChConfig.Def_HurtType_ThumpHit:
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_ThumpHit, tick)
|
| | | return
|
| | | |
| | | # 根据伤血类型触发技能,群攻只触发一次,放在伤血列表被清之前
|
| | | def OnHurtTypeTriggerSkill(attacker, target, curSkill, tick):
|
| | | isSuperHit = False
|
| | | usePassiveSkillResult = True # 第一次判断不能调用,即代表都不可用无需循环
|
| | | usePassiveSkillResultOnSuperHit = True # 暴击对象1V1触发,第一次判断不能调用,即代表都不可用无需循环
|
| | |
|
| | |
| | |
|
| | | skillHurtLists.append([hurtObj.GetObjID(), hurtObj.GetObjType(), hurtObj.GetAttackType()])
|
| | |
|
| | | #只对第一目标造成某伤害类型时触发技能, 需先存储 skillHurtLists
|
| | | OnHurtTypeTriggerSkillFirstObj(attacker, curSkill, tick)
|
| | | |
| | | skillIDSet = set()
|
| | | for hurtList in skillHurtLists:
|
| | | if not isSuperHit and hurtList[2] == ChConfig.Def_HurtType_SuperHit:
|
| | | # 暴击只对主目标做处理
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, target, curSkill, ChConfig.TriggerType_SuperHit, tick)
|
| | | isSuperHit = True
|
| | | |
| | | defender = GameWorld.GetObj(hurtList[0], hurtList[1])
|
| | | objID, objType, hurtType = hurtList
|
| | | defender = GameWorld.GetObj(objID, objType)
|
| | | if not defender:
|
| | | continue
|
| | |
|
| | | if GameObj.GetHP(defender) <= 0:
|
| | | if hurtList[1] == IPY_GameWorld.gotPlayer:
|
| | | if hurtList[2] == ChConfig.Def_HurtType_Zhansha:
|
| | | if objType == IPY_GameWorld.gotPlayer:
|
| | | if hurtType == ChConfig.Def_HurtType_Zhansha:
|
| | | defender.SetDict(ChConfig.Def_PlayerKey_Zhansha, 1)
|
| | | elif hurtList[2] == ChConfig.Def_HurtType_ZhognjiZhansha:
|
| | | elif hurtType == ChConfig.Def_HurtType_ZhognjiZhansha:
|
| | | defender.SetDict(ChConfig.Def_PlayerKey_Zhansha, 2)
|
| | | # 濒死状态触发技能, 不能在GetHurtHP内部触发技能,否则会导致原技能的伤血列表异常
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_WillDead, tick)
|
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(defender, attacker, None, ChConfig.TriggerType_WillDead, tick)
|
| | | if hurtList[2] in [ChConfig.Def_HurtType_Zhansha, ChConfig.Def_HurtType_ZhognjiZhansha]:
|
| | | if hurtType in [ChConfig.Def_HurtType_Zhansha, ChConfig.Def_HurtType_ZhognjiZhansha]:
|
| | | defender.SetDict(ChConfig.Def_PlayerKey_Zhansha, 0)
|
| | | continue
|
| | |
|
| | |
| | | usePassiveSkillResult = PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill,
|
| | | ChConfig.TriggerType_HurtObjAddBuff, tick, skillIDSet=skillIDSet)
|
| | |
|
| | | if usePassiveSkillResultOnSuperHit and hurtList[2] == ChConfig.Def_HurtType_SuperHit:
|
| | | if usePassiveSkillResultOnSuperHit and hurtType == ChConfig.Def_HurtType_SuperHit:
|
| | | # 暴击对目标一一触发被动
|
| | | usePassiveSkillResultOnSuperHit = PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill,
|
| | | ChConfig.TriggerType_SuperHitOneByOne, tick, skillIDSet=skillIDSet)
|
| | | if hurtList[2] == ChConfig.Def_HurtType_SuperHit:
|
| | | if hurtType == ChConfig.Def_HurtType_SuperHit:
|
| | | #被暴击触发技能
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_BeSuperHit, tick)
|
| | | PassiveBuffEffMng.OnPetPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_BeSuperHit, tick)
|
| | | elif hurtList[2] == ChConfig.Def_HurtType_Miss:
|
| | | elif hurtType == ChConfig.Def_HurtType_Miss:
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_MissSkill, tick)
|
| | | elif hurtList[2] == ChConfig.Def_HurtType_LuckyHit:
|
| | | elif hurtType == ChConfig.Def_HurtType_LuckyHit:
|
| | | PassiveBuffEffMng.OnPetPassiveSkillTrigger(defender, attacker, None, ChConfig.TriggerType_BeLuckyHit, tick)
|
| | |
|
| | | if hurtList[2] in ChConfig.Def_RealAttack_Type:
|
| | | if hurtType in ChConfig.Def_RealAttack_Type:
|
| | | # 被攻击处理层级
|
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(defender, attacker, None, ChConfig.TriggerType_Buff_BeAttackSubLayer, tick)
|
| | |
|
| | |
| | | isEnhanceSkill=False, skillIDSet=skillIDSet)
|
| | |
|
| | | DoLogic_AttackResult(attacker, defObj, curSkill, tick)
|
| | | skillEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_ProcessAttack)
|
| | | if skillEffect:
|
| | | skillID = skillEffect.GetEffectValue(2)
|
| | | if skillID != 0:
|
| | | triggerSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not triggerSkill:
|
| | | continue
|
| | | SkillShell.UsePassiveTriggerSkill(attacker, triggerSkill, defObj, tick)
|
| | | #=======================================================================
|
| | | # #受攻击对象1V1触发技能,本技能效果自身附带,非被动,非触发技能
|
| | | # skillEffect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_ProcessAttack)
|
| | | # if skillEffect:
|
| | | # skillID = skillEffect.GetEffectValue(2)
|
| | | # if skillID != 0:
|
| | | # triggerSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | # if not triggerSkill:
|
| | | # continue
|
| | | # SkillShell.UsePassiveTriggerSkill(attacker, triggerSkill, defObj, tick)
|
| | | #=======================================================================
|
| | |
|
| | | # 一一触发技能需要在最后设置CD
|
| | | for skillTypeID in skillIDSet:
|
| | |
| | | Def_BuffValue_Count = 3 # buff记录的value个数
|
| | |
|
| | | #游戏对象属性--------------------------------------------
|
| | | Def_Calc_AllAttrType_MAX = 130
|
| | | Def_Calc_AllAttrType_MAX = 131
|
| | | #基本属性BUFF计算,顺序与 ObjProperty_AttrByIndex 对应,同时也为buff效果ID同步通知策划
|
| | | TYPE_Calc_AttrList = (
|
| | | TYPE_Calc_Metal, # 金 1
|
| | |
| | | TYPE_Calc_FabaoHurt, # 法宝技能增伤
|
| | | TYPE_Calc_FabaoHurtPer, # 法宝技能加成
|
| | | TYPE_Calc_FinalHurtReducePer, # 最终伤害减少百分比
|
| | | TYPE_Calc_YinjiTime, # 每X秒自动消失一个印记
|
| | | ) = range(1, Def_Calc_AllAttrType_MAX)
|
| | |
|
| | |
|
| | |
| | | Def_HurtType_Zhuxian, # 诛仙一击 13
|
| | | Def_HurtType_ZhognjiZhansha, # 终极斩杀 14
|
| | | Def_HurtType_DeadlyHit, # 致命一击 15
|
| | | ) = range(1, 16)
|
| | | Def_HurtType_ThumpHit, # 重击 16
|
| | | ) = range(1, 17)
|
| | | #Def_HurtType_SuckBlood, # 吸血
|
| | |
|
| | | (
|
| | |
| | | Def_HurtType_SuperHit, # 暴击 7
|
| | | Def_HurtType_LuckyHit, # 会心一击伤害 8
|
| | | Def_HurtType_RealmSupress, # 境界压制 11
|
| | | |
| | | Def_HurtType_Zhuxian, # 诛仙一击 13
|
| | | Def_HurtType_DeadlyHit, # 致命一击 15
|
| | | Def_HurtType_ThumpHit, # 重击 16
|
| | | ]
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | Def_Skill_HappenState_HitOn = 0x0001 # 必命中
|
| | | Def_Skill_HappenState_SuperHit = 0x0002 # 必暴击
|
| | | Def_Skill_HappenState_LuckyHit = 0x0004 # 必会心一击
|
| | | Def_Skill_HappenState_ThumpHit = 0x0008 # 必重击
|
| | |
|
| | |
|
| | | #技能施法目标
|
| | |
| | | Def_PlayerState_LoseBlood3, # 职业3持续掉血状态 15
|
| | | Def_PlayerState_MissSneerAtk, # 对嘲讽攻击免疫表现为miss 16
|
| | | Def_PlayerState_BeInAir, # 浮空(做法同眩晕类) 17
|
| | | ) = range(18)
|
| | | Def_PlayerState_zqdlj, # 紫气东来金灵根技能状态 18
|
| | | ) = range(19)
|
| | |
|
| | | #---SetDict 含NPC字典KEY,不存于数据库---
|
| | | Def_GameObjKey_InheritOwner = "InheritOwner" # 类暴风雪计算时用主人属性
|
| | |
|
| | | #---SetDict 玩家字典KEY,不存于数据库---
|
| | | # key的长度不能超过29个字节
|
| | | Def_PlayerKey_LostYinjiTime = "LostYinjiTime" # 每X秒自动消失一个印记
|
| | | Def_PlayerKey_1314HurtCount = "1314cnt" # 类剑刃风暴技能的1314效果,伤害次数处理
|
| | | Def_PlayerKey_FirstDefender = "FDID" # 第一个防守者,只用于比较
|
| | | Def_PlayerKey_SelectObjID = "selectID" # 锁定模式选中,不用SetActionObj
|
| | | Def_PlayerKey_SelectObjID = "selectID" # 锁定模式选中,不用SetActionObj
|
| | | Def_PlayerKey_SelectObjType = "selectType" # 锁定模式选中
|
| | | Def_PlayerKey_NormalHurt = "NormalHurt" # 属性普通攻击增伤:普通攻击附加的固定值伤害
|
| | |
| | | ShareDefine.Def_Effect_DamagePVE:[[TYPE_Calc_DamagePVE], False, TYPE_Linear], # PVE固定伤害
|
| | | ShareDefine.Def_Effect_FinalHurtPer:[[TYPE_Calc_FinalHurtPer], False, TYPE_Linear], # 最终伤害万分率
|
| | | ShareDefine.Def_Effect_FinalHurtReducePer:[[TYPE_Calc_FinalHurtReducePer], False, TYPE_Linear], # 最终伤害减少万分
|
| | | ShareDefine.Def_Effect_YinjiTime:[[TYPE_Calc_YinjiTime], False, TYPE_Linear], # 每X秒自动消失一个印记
|
| | |
|
| | | #战斗非线性
|
| | | ShareDefine.Def_Effect_SuperHitPer:[[TYPE_Calc_SuperHit], False, TYPE_NoLinear],
|
| | |
| | | TriggerType_4074PerValue, # 特殊效果的加成 70
|
| | | TriggerType_dFinalHurtReducePer, # 防守方的最终伤害减少百分比 71
|
| | | TriggerType_IsDealy, # 是否触发致命一击 72 暂且理解为和概率是独立,有新概念产生则重定义
|
| | | ) = range(1, 73)
|
| | | TriggerType_AddThumpHitRate, # 提高重击概率 73
|
| | | TriggerType_ThumpHit, # 重击时 触发技能74
|
| | | TriggerType_AddThumpHitPer, # 重击时 增加重击百分比 75
|
| | | ) = range(1, 76)
|
| | |
|
| | |
|
| | | #不可以佩戴翅膀的地图
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A7 19 查询玩家境界阶装备信息结果 #tagSCPlayerEquipCacheResult
|
| | |
|
| | | class tagSCPlayerEquipCacheResult(Structure):
|
| | | Head = tagHead()
|
| | | PlayerID = 0 #(DWORD PlayerID)//玩家ID
|
| | | EquipClassLV = 0 #(BYTE EquipClassLV)
|
| | | ItemDataSize = 0 #(WORD ItemDataSize)
|
| | | ItemData = "" #(String ItemData)//物品记录 |
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x19
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.EquipClassLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.ItemDataSize,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.ItemData,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x19
|
| | | self.PlayerID = 0
|
| | | self.EquipClassLV = 0
|
| | | self.ItemDataSize = 0
|
| | | self.ItemData = ""
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 1
|
| | | length += 2
|
| | | length += len(self.ItemData)
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.PlayerID)
|
| | | data = CommFunc.WriteBYTE(data, self.EquipClassLV)
|
| | | data = CommFunc.WriteWORD(data, self.ItemDataSize)
|
| | | data = CommFunc.WriteString(data, self.ItemDataSize, self.ItemData)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | PlayerID:%d,
|
| | | EquipClassLV:%d,
|
| | | ItemDataSize:%d,
|
| | | ItemData:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.PlayerID,
|
| | | self.EquipClassLV,
|
| | | self.ItemDataSize,
|
| | | self.ItemData
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagSCPlayerEquipCacheResult=tagSCPlayerEquipCacheResult()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCPlayerEquipCacheResult.Head.Cmd,m_NAtagSCPlayerEquipCacheResult.Head.SubCmd))] = m_NAtagSCPlayerEquipCacheResult
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A7 07 通知玩家自定义聊天 #tagMCPyTalk
|
| | |
|
| | | class tagMCPyTalk(Structure):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #B1 08 开始印记流失时间 #tagMCYinjiStartTime
|
| | |
|
| | | class tagMCYinjiStartTime(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB1
|
| | | self.SubCmd = 0x08
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | | self.Clear()
|
| | | memmove(addressof(self), stringData[_pos:], self.GetLength())
|
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xB1
|
| | | self.SubCmd = 0x08
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCYinjiStartTime)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''//B1 08 开始印记流失时间 //tagMCYinjiStartTime:
|
| | | Cmd:%s,
|
| | | SubCmd:%s
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCYinjiStartTime=tagMCYinjiStartTime()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCYinjiStartTime.Cmd,m_NAtagMCYinjiStartTime.SubCmd))] = m_NAtagMCYinjiStartTime
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B2 08 获得仙缘币信息 #tagMCAddXianyuanCoinMsg
|
| | |
|
| | | class tagMCAddXianyuanCoinMsg(Structure):
|
| | |
| | | def DoType_Add_Player_Xp(curPlayer, curMission, curActionNode):
|
| | | #增加玩家相关值<Add_Player_XP value="玩家xp值"/>
|
| | |
|
| | | xpValue = curActionNode.GetAttribute("value")
|
| | | |
| | | if xpValue != "":
|
| | | #设置玩家xp值
|
| | | openLV, addXPValue, maxXPValue = ReadChConfig.GetEvalChConfig('PlayerXP')
|
| | | curXp = min(int(xpValue), maxXPValue)
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_RecordXPValue, curXp)
|
| | | curPlayer.SetXP(curXp)
|
| | | |
| | | #===========================================================================
|
| | | # xpValue = curActionNode.GetAttribute("value")
|
| | | # |
| | | # if xpValue != "":
|
| | | # #设置玩家xp值
|
| | | # openLV, addXPValue, maxXPValue = ReadChConfig.GetEvalChConfig('PlayerXP')
|
| | | # curXp = min(int(xpValue), maxXPValue)
|
| | | # curPlayer.SetDict(ChConfig.Def_PlayerKey_RecordXPValue, curXp)
|
| | | # curPlayer.SetXP(curXp)
|
| | | # |
| | | #===========================================================================
|
| | | return
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | maxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV", 1)
|
| | |
|
| | | curPlayer.BeginRefreshState()
|
| | | befXP = curPlayer.GetXP()
|
| | | #befXP = curPlayer.GetXP()
|
| | | befLV = curPlayer.GetLV()
|
| | | befFreePoint = curPlayer.GetFreePoint()
|
| | | befBaseSTR = curPlayer.GetBaseSTR()
|
| | |
| | | ChConfig.TYPE_Calc_AttrPetExpRate:GameWorld.GetGameWorld().GetExpRate(),
|
| | | ChConfig.TYPE_Calc_HitSucessRate:ChConfig.Def_MaxRateValue,
|
| | | ChConfig.TYPE_Calc_CurePer:ChConfig.Def_MaxRateValue,
|
| | | |
| | | ChConfig.TYPE_Calc_YinjiTime:IpyGameDataPY.GetFuncCfg('Yinji', 1), # 每X秒自动消失一个印记
|
| | | }
|
| | |
|
| | | for i in xrange(1, ChConfig.Def_Calc_AllAttrType_MAX):
|
| | |
| | | def GetFabaoHurtPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_FabaoHurtPer)
|
| | | def SetFabaoHurtPer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_FabaoHurtPer, value)
|
| | |
|
| | | # 每X秒自动消失一个印记, 毫秒记录
|
| | | def GetLostYinjiTime(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_LostYinjiTime)
|
| | | def SetLostYinjiTime(curPlayer, value): |
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_LostYinjiTime, value)
|
| | | curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_YinjiTime, value, False)
|
| | |
|
| | | ## 计算功能背包物品属性
|
| | | # @param curPlayer 当前玩家
|
| | | # @param packType 背包类型
|
| | |
| | | import PlayerFlashSale
|
| | | import PlayerWing
|
| | | import ChEquip
|
| | | import PlayerYinji
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | #---------------------------------------------------------------------
|
| | |
| | | # @return None
|
| | | # @remarks 玩家自动回复XP值
|
| | | def ProcessAddXP(curPlayer, tick):
|
| | | #开放等级增加多少XP值, 最大XP值
|
| | | openLV, addXPValue, maxXPValue = ReadChConfig.GetEvalChConfig('PlayerXP')
|
| | | #还没到开放等级
|
| | | if openLV > curPlayer.GetLV():
|
| | | return
|
| | | lastTick = curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_AddXPTick)
|
| | | if not CommonCheckTick(curPlayer, tick, ChConfig.TYPE_Player_Tick_AddXPTick):
|
| | | #首次登陆,将当前的XP值记录到字典中
|
| | | if lastTick <= 0:
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_RecordXPValue, curPlayer.GetXP())
|
| | | return
|
| | | |
| | | #从字典中获取当前的XP值
|
| | | curXPValue = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_RecordXPValue)
|
| | | #当前XP值已经是最大值了,不做处理
|
| | | if curXPValue == maxXPValue:
|
| | | return
|
| | | xpRestorePer = PlayerControl.GetXPRestorePer(curPlayer)
|
| | | addXPValue = int(addXPValue * xpRestorePer/float(ChConfig.Def_MaxRateValue))
|
| | | nextXPValue = min(curXPValue + addXPValue, maxXPValue)
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_RecordXPValue, nextXPValue)
|
| | | #已经达到最大的XP值了,通知客户端
|
| | | if nextXPValue == maxXPValue:
|
| | | #这里进行设置的时候,将会通知客户端
|
| | | curPlayer.SetXP(nextXPValue)
|
| | | #===========================================================================
|
| | | # #开放等级增加多少XP值, 最大XP值
|
| | | # openLV, addXPValue, maxXPValue = ReadChConfig.GetEvalChConfig('PlayerXP')
|
| | | # #还没到开放等级
|
| | | # if openLV > curPlayer.GetLV():
|
| | | # return
|
| | | # lastTick = curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_AddXPTick)
|
| | | # if not CommonCheckTick(curPlayer, tick, ChConfig.TYPE_Player_Tick_AddXPTick):
|
| | | # #首次登陆,将当前的XP值记录到字典中
|
| | | # if lastTick <= 0:
|
| | | # curPlayer.SetDict(ChConfig.Def_PlayerKey_RecordXPValue, curPlayer.GetXP())
|
| | | # return
|
| | | # |
| | | # #从字典中获取当前的XP值
|
| | | # curXPValue = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_RecordXPValue)
|
| | | # #当前XP值已经是最大值了,不做处理
|
| | | # if curXPValue == maxXPValue:
|
| | | # return
|
| | | # xpRestorePer = PlayerControl.GetXPRestorePer(curPlayer)
|
| | | # addXPValue = int(addXPValue * xpRestorePer/float(ChConfig.Def_MaxRateValue))
|
| | | # nextXPValue = min(curXPValue + addXPValue, maxXPValue)
|
| | | # curPlayer.SetDict(ChConfig.Def_PlayerKey_RecordXPValue, nextXPValue)
|
| | | # #已经达到最大的XP值了,通知客户端
|
| | | # if nextXPValue == maxXPValue:
|
| | | # #这里进行设置的时候,将会通知客户端
|
| | | # curPlayer.SetXP(nextXPValue)
|
| | | #===========================================================================
|
| | |
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | #回血回魔状态处理
|
| | | ProcessHPMPState(curPlayer, tick)
|
| | |
|
| | | PlayerYinji.ProcessPlayerYinji(curPlayer, tick)
|
| | | |
| | | #刷新组队状态
|
| | | #ProcessTeamState(curPlayer, tick)
|
| | |
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 印记为玩家选择战士木灵根后会获得的能量点,SP技能会附带加成或者消耗印记点
|
| | | # |
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午03:05:54
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: 用XP接口记录
|
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import IpyGameDataPY
|
| | | import PlayerControl
|
| | | import GameWorld
|
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | |
|
| | | Def_LastYinji_Tick = "lastyjtick" # 上一次印记消失时间
|
| | |
|
| | | #CDBPlayerRefresh_XP
|
| | | def AddYinji(curPlayer, cnt):
|
| | | beforeCnt = GetYinjiCnt(curPlayer)
|
| | | #上限 X个
|
| | | curPlayer.SetXP(min(beforeCnt + cnt, IpyGameDataPY.GetFuncCfg('Yinji', 2)))
|
| | | |
| | | if beforeCnt == 0:
|
| | | # 第一次加印记需重计时
|
| | | StartYinjiTick(curPlayer)
|
| | | |
| | | return
|
| | |
|
| | | def SubYinji(curPlayer, cnt):
|
| | | curPlayer.SetXP(max(curPlayer.GetXP() - cnt, 0))
|
| | | return
|
| | |
|
| | | def GetYinjiCnt(curPlayer):
|
| | | return curPlayer.GetXP()
|
| | |
|
| | |
|
| | | # 每X秒自动减少1个印记
|
| | | def ProcessPlayerYinji(curPlayer, tick):
|
| | | if GetYinjiCnt(curPlayer) == 0:
|
| | | return
|
| | | |
| | | if tick - curPlayer.GetDictByKey(Def_LastYinji_Tick) < PlayerControl.GetLostYinjiTime(curPlayer):
|
| | | return
|
| | | |
| | | StartYinjiTick(curPlayer)
|
| | | |
| | | SubYinji(curPlayer, 1)
|
| | | |
| | | |
| | | def StartYinjiTick(curPlayer):
|
| | | curPlayer.SetDict(Def_LastYinji_Tick, GameWorld.GetGameWorld().GetTick())
|
| | | pack = ChPyNetSendPack.tagMCYinjiStartTime()
|
| | |
|
| | | NetPackCommon.SendFakePack(curPlayer, pack) |
| | |
| | | Def_Effect_DamagePVE = 141 # PVE固定伤害
|
| | | Def_Effect_FinalHurtPer = 142 # 最终伤害万分率
|
| | | Def_Effect_FinalHurtReducePer = 143 # 最终伤害减少万分
|
| | | Def_Effect_YinjiTime = 144 # 每X毫秒自动消失一个印记
|
| | |
|
| | | #增加%d物理伤害值,其中a值为伤害值
|
| | | Def_Effect_AddAtk = 1005
|
| | |
| | | CDBPlayerRefresh_SuperHitRateReduce, # 暴击概率抗性 210
|
| | | CDBPlayerRefresh_LuckyHitReduce, # 会心伤害减免固定值
|
| | | CDBPlayerRefresh_FinalHurtReducePer, # 最终伤害减少百分比
|
| | | ) = range(146, 213)
|
| | | CDBPlayerRefresh_YinjiTime, # 每X秒减少印记时间,毫秒
|
| | | ) = range(146, 214)
|
| | |
|
| | | TYPE_Price_Gold_Paper_Money = 5 # 金钱类型,(先用礼券,再用金子)
|
| | | TYPE_Price_Family_Contribution = 6 # 战盟贡献度(活跃度转换得来)
|
| | |
| | | [lambda curObj:PlayerControl.GetFabaoHurt(curObj), lambda curObj, value:PlayerControl.SetFabaoHurt(curObj, value), ShareDefine.CDBPlayerRefresh_FabaoHurt, 1, 0], # 属性法宝技能增伤
|
| | | [lambda curObj:PlayerControl.GetFabaoHurtPer(curObj), lambda curObj, value:PlayerControl.SetFabaoHurtPer(curObj, value), ShareDefine.CDBPlayerRefresh_FabaoHurtPer, 1, 0], # 属性法宝技能加成
|
| | | [lambda curObj:PlayerControl.GetFinalHurtReducePer(curObj), lambda curObj, value:PlayerControl.SetFinalHurtReducePer(curObj, value), ShareDefine.CDBPlayerRefresh_FinalHurtReducePer, 1, 0], # 最终伤害减少百分比
|
| | | [lambda curObj:PlayerControl.GetLostYinjiTime(curObj), lambda curObj, value:PlayerControl.SetLostYinjiTime(curObj, value), ShareDefine.CDBPlayerRefresh_YinjiTime, 1, 0], # 每X秒自动消失一个印记 毫秒
|
| | | ]
|
| | |
|
| | | ## 通过索引获得属性值
|
| | |
| | | # SwordStormAttack 可能因被动导致自己死亡,所以不能在攻击后处理
|
| | | curBuff.SetValue(max(curBuff.GetValue() - 1, 0))
|
| | |
|
| | | |
| | | BaseAttack.SwordStormAttack(tagObj, srcPosX, srcPosY, curSkill, skillPer,
|
| | | skillEnhance, skillMatrix, tick)
|
| | |
|
| | | if GameObj.GetHP(tagObj) > 0:
|
| | | if tagObj.GetDictByKey(ChConfig.Def_PlayerKey_1314HurtCount):
|
| | | # 需要时间配合,不然会导致伤害还没计算完毕 buff提前消失了
|
| | | curBuff.SetValue(curBuff.GetValue() + 1)
|
| | | tagObj.SetDict(ChConfig.Def_PlayerKey_1314HurtCount, 0)
|
| | |
|
| | | if curBuff.GetValue() == 0:
|
| | | # 让下一次循环取消buff,客户端退出旋转
|
| | | curBuff.SetRemainTime(1)
|
| | |
|
| | |
|
| | | #buffvalue第一个值为攻击次数, 第二个值为被动增强
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 根据印记增加属性值-线性
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午07:29:19
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | #导入
|
| | | import PlayerYinji
|
| | | import ChConfig
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | ## buff线性增加属性
|
| | | # @param defender Buff承受者
|
| | | # @param curEffect 技能效果
|
| | | # @param calcDict 技能效果累加总表
|
| | | # @return None
|
| | | def OnCalcBuffEx(defender, curEffect, calcDict, curBuff):
|
| | | attrType = curEffect.GetEffectValue(0)
|
| | |
|
| | | calcDict[attrType] = calcDict.get(attrType, 0) + curEffect.GetEffectValue(1)*min(curBuff.GetValue(), curEffect.GetEffectValue(2))
|
| | | return
|
| | |
|
| | |
|
| | | ## 返回buff类型,线性与否
|
| | | # @param |
| | | # @return None
|
| | | # @remarks 函数详细说明. |
| | | def GetCalcType():
|
| | | return ChConfig.TYPE_Linear
|
| | |
|
| | |
|
| | | ##计算增强值
|
| | | # @param attacker 攻击者实例
|
| | | # @param curSkill 技能实例
|
| | | # @param curEffect 当前技能效果1
|
| | | # @return 总值
|
| | | def CalcBuffValue(attacker, defender, curSkill, changeBuffValueDict):
|
| | | |
| | | return [PlayerYinji.GetYinjiCnt(defender)]
|
| | |
|
| | |
|
| | |
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: buff中提高重击概率 ,可附加条件是否针对第一目标
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-25 下午02:49:27
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import AttackCommon
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | useSkill = skillkwargs.get("useSkill", None)
|
| | | # 主动型技能才有效
|
| | | if passiveEffect.GetEffectValue(2) and useSkill:
|
| | | if useSkill.GetFuncType() not in [ChConfig.Def_SkillFuncType_FbSkill,
|
| | | ChConfig.Def_SkillFuncType_NormalAttack]:
|
| | | return False
|
| | | |
| | | if passiveEffect.GetEffectValue(1):
|
| | | if AttackCommon.GetFirstDefenderID(attacker) != defender.GetID():
|
| | | return False
|
| | | return True
|
| | |
|
| | |
|
| | | def GetValue(attacker, defender, passiveEffect):
|
| | | return passiveEffect.GetEffectValue(0)
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: buff中提高普通攻击的重击概率
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-25 下午03:52:01
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | useSkill = skillkwargs.get("useSkill", None)
|
| | | if not useSkill:
|
| | | # 普攻:无技能,技能型普攻
|
| | | return True
|
| | | if useSkill.GetFuncType() != ChConfig.Def_SkillFuncType_NormalAttack:
|
| | | return False
|
| | | return True
|
| | |
|
| | |
|
| | | def GetValue(attacker, defender, passiveEffect):
|
| | | return passiveEffect.GetEffectValue(0)
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: buff中增加重击伤害加成(重击下) ,可附加条件是否针对第一目标
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-25 下午02:49:27
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import AttackCommon
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | useSkill = skillkwargs.get("useSkill", None)
|
| | | # 主动型技能才有效
|
| | | if passiveEffect.GetEffectValue(2) and useSkill:
|
| | | if useSkill.GetFuncType() not in [ChConfig.Def_SkillFuncType_FbSkill,
|
| | | ChConfig.Def_SkillFuncType_NormalAttack]:
|
| | | return False
|
| | | |
| | | if passiveEffect.GetEffectValue(1):
|
| | | # 只针对第一目标
|
| | | if AttackCommon.GetFirstDefenderID(attacker) != defender.GetID():
|
| | | return False
|
| | | return True
|
| | |
|
| | |
|
| | | def GetValue(attacker, defender, passiveEffect):
|
| | | return passiveEffect.GetEffectValue(0)
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: buff中普通攻击回血百分比 是否针对第一目标
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午02:25:50
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import AttackCommon
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | useSkill = skillkwargs.get("useSkill", None)
|
| | | if not useSkill:
|
| | | return
|
| | | |
| | | |
| | | if useSkill.GetFuncType() != ChConfig.Def_SkillFuncType_NormalAttack:
|
| | | return
|
| | | |
| | | if passiveEffect.GetEffectValue(1):
|
| | | # 只针对第一目标
|
| | | if AttackCommon.GetFirstDefenderID(attacker) != defender.GetID():
|
| | | return False
|
| | | return True
|
| | |
|
| | |
|
| | | def GetValue(attacker, defender, passiveEffect):
|
| | | return passiveEffect.GetEffectValue(0)
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 提高重击概率
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-24 下午03:46:50
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | import AttackCommon
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if effect.GetEffectValue(1):
|
| | | # 只针对第一目标
|
| | | if AttackCommon.GetFirstDefenderID(attacker) != defender.GetID():
|
| | | return False
|
| | | return True
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return effect.GetEffectValue(0)
|
| | |
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 对第一目标重击触发技能 --特殊效果转为附加效果触发,且需主效果不使被动技能进入CD才可触发
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-25 下午01:57:16
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | import GameWorld
|
| | | import SkillShell
|
| | | import GameObj
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if effect.GetEffectValue(1):
|
| | | # 转为附加效果触发,且需主效果不使被动技能进入CD才可触发
|
| | | useSkill = GameWorld.GetGameData().GetSkillBySkillID(effect.GetEffectValue(1))
|
| | | if not useSkill:
|
| | | return False
|
| | | SkillShell.UsePassiveTriggerSkill(attacker, useSkill, defender, GameWorld.GetGameWorld().GetTick(), True)
|
| | | |
| | | return False
|
| | | |
| | | if not GameObj.GetPyPlayerState(attacker, effect.GetEffectValue(1)):
|
| | | #GameWorld.DebugLog("状态触发----%s"%effect.GetEffectValue(1))
|
| | | return False
|
| | | |
| | | return GameWorld.CanHappen(effect.GetEffectValue(0))
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 增加重击伤害加成(重击下)
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-25 下午10:14:25
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import AttackCommon
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if effect.GetEffectValue(1):
|
| | | # 只针对第一目标
|
| | | if AttackCommon.GetFirstDefenderID(attacker) != defender.GetID():
|
| | | return False
|
| | | |
| | | return True
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return effect.GetEffectValue(0)
|
| | |
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 类剑刃风暴每次攻击对第一目标重击触发多一次伤害(旋转)
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午12:31:37
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | import ChConfig
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | attacker.SetDict(ChConfig.Def_PlayerKey_1314HurtCount, 1)
|
| | | return False
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 使用技能后印记数量
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午05:52:27
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import PlayerYinji
|
| | |
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | |
|
| | | PlayerYinji.AddYinji(attacker, effect.GetEffectValue(0))
|
| | | return False |
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 根据印记来增加攻击(技能)伤害
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午05:58:01
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import AttackCommon
|
| | | import PlayerYinji
|
| | |
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if effect.GetEffectValue(1):
|
| | | # 只针对第一目标
|
| | | if AttackCommon.GetFirstDefenderID(attacker) != defender.GetID():
|
| | | return False
|
| | | |
| | | |
| | | return True if PlayerYinji.GetYinjiCnt(attacker) else False
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return float(effect.GetEffectValue(0)*min(PlayerYinji.GetYinjiCnt(attacker), effect.GetEffectValue(1)))/ChConfig.Def_MaxRateValue
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 印记达到X以上才增加技能伤害
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午07:46:07
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | import ChConfig
|
| | | import PlayerYinji
|
| | |
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | |
| | | return True if PlayerYinji.GetYinjiCnt(attacker) >= effect.GetEffectValue(1) else False
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return float(effect.GetEffectValue(0))/ChConfig.Def_MaxRateValue
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 消耗固定印记数量增加技能伤害
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午07:46:07
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | import ChConfig
|
| | | import PlayerYinji
|
| | |
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if PlayerYinji.GetYinjiCnt(attacker) < effect.GetEffectValue(1):
|
| | | return False
|
| | | |
| | | PlayerYinji.SubYinji(attacker, effect.GetEffectValue(1))
|
| | | return True
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return float(effect.GetEffectValue(0))/ChConfig.Def_MaxRateValue
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 消耗XX个印记数量增加技能伤害,并根据印记数加成
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午07:46:07
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | import ChConfig
|
| | | import PlayerYinji
|
| | |
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if not PlayerYinji.GetYinjiCnt(attacker):
|
| | | return False
|
| | | |
| | | PlayerYinji.SubYinji(attacker, min(PlayerYinji.GetYinjiCnt(attacker), effect.GetEffectValue(1)))
|
| | | return True
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return float(effect.GetEffectValue(0)*min(PlayerYinji.GetYinjiCnt(attacker), effect.GetEffectValue(1)))/ChConfig.Def_MaxRateValue
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 攻击后根据指定印记倍数触发技能
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午08:03:44
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | import PlayerYinji
|
| | |
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | cnt = PlayerYinji.GetYinjiCnt(attacker)
|
| | | if cnt == 0:
|
| | | return False
|
| | | |
| | | return True if cnt%effect.GetEffectValue(0) == 0 else False |
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 使用非攻击类技能后增加印记数, 可增加增益buff数的印记数
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-26 下午08:20:09
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import PlayerYinji
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | addCnt = effect.GetEffectValue(0)
|
| | | if effect.GetEffectValue(1):
|
| | | addCnt = min(attacker.GetBuffState().GetBuffCount(), effect.GetEffectValue(0))
|
| | | |
| | | if not addCnt:
|
| | | return False
|
| | | |
| | | PlayerYinji.AddYinji(attacker, addCnt)
|
| | | |
| | | return False
|
| | |
| | | # 刷被动效果和属性
|
| | | page = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GFPassivePage, 0, ChConfig.Def_PDictType_GFPassive)
|
| | | if clientData.Page == page:
|
| | | GetPassiveEffManager().RegistPassiveEffSet(curPlayer)
|
| | | GetPassiveEffManager().RegistPassiveEffSet(curPlayer, True)
|
| | | PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
| | |
|
| | | EventShell.EventRespons_PassiveSet(curPlayer)
|
| | |
| | | NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | |
|
| | | # 刷被动效果和属性
|
| | | GetPassiveEffManager().RegistPassiveEffSet(curPlayer)
|
| | | GetPassiveEffManager().RegistPassiveEffSet(curPlayer, True)
|
| | | PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
| | | return
|
| | |
|
| | |
| | | 4078:ChConfig.TriggerType_AttackOver, # 攻击(对敌技能)后被动技能被触发 4
|
| | | 4079:ChConfig.TriggerType_IsDealy, # 是否触发致命一击 72
|
| | | 4080:ChConfig.TriggerType_BounceHPPer, # 反弹伤害百分比值17,
|
| | | 4081:ChConfig.TriggerType_AddThumpHitRate, # 提高重击概率 73
|
| | | 4082:ChConfig.TriggerType_ThumpHit, # 对第一目标重击触发技能
|
| | | 4083:ChConfig.TriggerType_AddThumpHitPer, # 增加重击伤害百分比
|
| | | 4084:ChConfig.TriggerType_ThumpHit, # 对第一目标重击触发技能
|
| | | 4085:ChConfig.TriggerType_AttackOver, |
| | | 4086:ChConfig.TriggerType_AttackAddSkillPer, # 所有攻击伤害(SkillPer)增加,含普攻,计算时 5
|
| | | 4087:ChConfig.TriggerType_AttackAddSkillPer, # 所有攻击伤害(SkillPer)增加,含普攻,计算时 5
|
| | | 4088:ChConfig.TriggerType_AttackAddSkillPer, # 所有攻击伤害(SkillPer)增加,含普攻,计算时 5
|
| | | 4089:ChConfig.TriggerType_AttackAddSkillPer, # 所有攻击伤害(SkillPer)增加,含普攻,计算时 5
|
| | | 4090:ChConfig.TriggerType_AttackOver, # 攻击(对敌技能)后被动技能被触发 4
|
| | | 4091:ChConfig.TriggerType_SkillOverNoAttack, # 技能释放后 与TriggerType_AttackOver相反19,
|
| | | }
|
| | | return tdict.get(effectID, -1)
|
| | | #===========================================================================
|
| | |
| | | 4523:ChConfig.TriggerType_SuperHitSkillPer, # 暴击时,增加技能伤害 10
|
| | | 4524:ChConfig.TriggerType_SuperHitSubLayer, # 暴击减层 67
|
| | | 4525:ChConfig.TriggerType_SuperHitSkipCD, # 暴击无冷却 68
|
| | | 4526:ChConfig.TriggerType_AddThumpHitRate, # 增加重击概率
|
| | | 4527:ChConfig.TriggerType_AddThumpHitRate, # 增加重击概率
|
| | | 4528:ChConfig.TriggerType_AddThumpHitPer, # 重击时 增加重击百分比 75
|
| | | 4529:ChConfig.TriggerType_Buff_SuckBloodPer, # BUFF类: 百分比吸血, 此处非属性类
|
| | |
|
| | | 803:ChConfig.TriggerType_BloodShield, # 血盾
|
| | | 806:ChConfig.TriggerType_BloodShield, # 血盾
|
| | |
| | |
|
| | |
|
| | | # 重刷可装备的被动技能
|
| | | def RefreshPassiveSkillSet(self):
|
| | | def RefreshPassiveSkillSet(self, isCD=False):
|
| | | self.AffectPassiveSkillSetDict = {}
|
| | | skillManager = self.gameObj.GetSkillManager()
|
| | | skills = FindUsePassiveSkills(self.gameObj)
|
| | | |
| | | tick = GameWorld.GetGameWorld().GetTick()
|
| | |
|
| | | for skillID in skills:
|
| | | curSkill = skillManager.FindSkillBySkillID(skillID)
|
| | | if not curSkill:
|
| | | continue
|
| | | |
| | | if isCD:
|
| | | # 重切需进入CD
|
| | | SkillCommon.SetSkillRemainTime(curSkill, PlayerControl.GetReduceSkillCDPer(self.gameObj), tick, self.gameObj)
|
| | |
|
| | | skillTypeID = curSkill.GetSkillTypeID()
|
| | | connSkillID = SkillShell.GetConnectSkillID(curSkill) # 关联技能ID, 0代表不限技能
|
| | |
| | | return self.AffectSkillDict
|
| | |
|
| | |
|
| | | def GetPassiveSkillsByTriggerType(self, triggerType, connSkillID=0):
|
| | | def GetPassiveSkillsByTriggerType(self, triggerType, connSkill=None):
|
| | | connSkillID = connSkill.GetSkillTypeID() if connSkill else 0
|
| | | skillList = []
|
| | | ## bug:2018-03-15
|
| | | ## skillList=self.AffectSkillDict.get((triggerType, connSkillID), [])再用extend会导致AffectSkillDict无限增长
|
| | |
| | | skillList.extend(self.AffectPassiveSkillSetDict.get((triggerType, connSkillID), []))
|
| | | skillList.extend(self.AffectDogzSkillDict.get((triggerType, connSkillID), []))
|
| | | skillList.extend(self.AffectSuperEquipSkillDict.get((triggerType, connSkillID), []))
|
| | | |
| | | # 指定特殊类型可触发
|
| | | if connSkill and connSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_NormalAttack]:
|
| | | funcType = connSkill.GetFuncType()
|
| | | skillList.extend(self.AffectSkillDict.get((triggerType, funcType), []))
|
| | | skillList.extend(self.AffectPassiveSkillSetDict.get((triggerType, funcType), []))
|
| | | skillList.extend(self.AffectDogzSkillDict.get((triggerType, funcType), []))
|
| | | skillList.extend(self.AffectSuperEquipSkillDict.get((triggerType, funcType), []))
|
| | | |
| | | # 被动再触发被动限制为指定
|
| | | if connSkill and SkillCommon.isPassiveSkill(connSkill):
|
| | | return skillList
|
| | |
|
| | | if connSkillID != 0 and connSkillID != ChConfig.Def_SkillID_Somersault:
|
| | | skillList.extend(self.AffectSkillDict.get((triggerType, 0), []))
|
| | |
| | | return
|
| | |
|
| | | # 人物需同步注册被动技能
|
| | | def RegistPassiveEffSet(self, gameObj):
|
| | | def RegistPassiveEffSet(self, gameObj, isCD=False):
|
| | | passiveEff = self.GetPassiveEff(gameObj)
|
| | | if not passiveEff:
|
| | | # 强制刷新所有被动技能
|
| | | passiveEff = PassiveEff(gameObj)
|
| | | if not passiveEff.RefreshPassiveSkillSet():
|
| | | if not passiveEff.RefreshPassiveSkillSet(isCD):
|
| | | return
|
| | | self.AddPassiveEff(gameObj, passiveEff)
|
| | | else:
|
| | | passiveEff.RefreshPassiveSkillSet()
|
| | | passiveEff.RefreshPassiveSkillSet(isCD)
|
| | | return
|
| | |
|
| | |
|
| | |
| | | return 0, 0
|
| | |
|
| | | connSkillID = connSkill.GetSkillTypeID() if connSkill else 0
|
| | | skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkillID)
|
| | | skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)
|
| | | if not skills:
|
| | | return 0, 0
|
| | |
|
| | |
| | | if not attacker:
|
| | | return False
|
| | |
|
| | | stopPassiveSkill = False # 被动技能不能再触发被动技能,但可以触发天赋技能
|
| | | if connSkill:
|
| | | if not connSkill.GetFuncType():
|
| | | # 非功能类技能,避免死循环
|
| | | return False
|
| | | if SkillCommon.isPassiveSkill(connSkill):
|
| | | #GameWorld.DebugLog("被动技能不能再次触发被动技能")
|
| | | #return False
|
| | | stopPassiveSkill = True
|
| | | |
| | | if SkillCommon.GetUsingPassiveSkill(attacker) and triggerType != ChConfig.TriggerType_BuffState:
|
| | | # 防范被动技能触发的 非被动技能
|
| | | #GameWorld.DebugLog("被动技能释放中不能再次触发被动技能---%s"%triggerType)
|
| | | #return |
| | | stopPassiveSkill = True
|
| | |
|
| | | passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)
|
| | | if not passiveEff:
|
| | | return False
|
| | |
|
| | | connSkillID = connSkill.GetSkillTypeID() if connSkill else 0
|
| | | skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkillID)
|
| | | skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)
|
| | | if not skills:
|
| | | return False
|
| | |
|
| | |
| | | continue
|
| | |
|
| | | if not IsValidPassiveSkill(curSkill):
|
| | | continue
|
| | | |
| | | if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
|
| | | # 只有天赋才可以再次被触发
|
| | | continue
|
| | |
|
| | | effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)
|
| | |
| | | if not passiveEff:
|
| | | return 0
|
| | | connSkillID = connSkill.GetSkillTypeID() if connSkill else 0
|
| | | skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkillID)
|
| | | skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)
|
| | | if not skills:
|
| | | return 0
|
| | |
|
| | |
| | | if not passiveEff:
|
| | | return []
|
| | | connSkillID = connSkill.GetSkillTypeID() if connSkill else 0
|
| | | skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkillID)
|
| | | skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)
|
| | | if not skills:
|
| | | return []
|
| | |
|
| | |
| | | if not passiveEff:
|
| | | return
|
| | | connSkillID = connSkill.GetSkillTypeID() if connSkill else 0
|
| | | skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkillID)
|
| | | skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkill)
|
| | | if not skills:
|
| | | return
|
| | |
|
| | |
| | | OperControlManager.SetObjActState(curObj, buffSkill)
|
| | |
|
| | |
|
| | | # 非属性技能算属性 特殊处理
|
| | | # 法宝SP技能 如1-4级为增加属性,第5级为伤害效果,第6-10级就要包含属性和伤害效果
|
| | | def CalcFabaoSPSkillAttr(curPlayer, curPlayerSkill, allAttrList):
|
| | | if curPlayerSkill.GetFuncType() != ChConfig.Def_SkillFuncType_FbSPSkill:
|
| | | return
|
| | | |
| | | value = GetMaxHPAttrValue(curPlayerSkill)
|
| | | if value == 0:
|
| | | return
|
| | | |
| | | PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_MaxHP, value, allAttrList)
|
| | | return
|
| | |
|
| | |
|
| | | # 计算属性类技能的属性,同buff层不算战力
|
| | | def CalcPassiveAttr_Effect(curPlayer, allAttrList):
|
| | |
| | | if curPlayerSkill == None:
|
| | | continue
|
| | |
|
| | | CalcFabaoSPSkillAttr(curPlayer, curPlayerSkill, allAttrList)
|
| | | if not SkillCommon.isPassiveAttr(curPlayerSkill):
|
| | | continue
|
| | |
|
| | |
| | | def GetAddBuffValue(attacker, curSkill, defender):
|
| | | #验证该技能效果1的ID,提取公式
|
| | | curEffect = curSkill.GetEffect(0)
|
| | | effectID = curEffect.GetEffectID() |
| | |
|
| | | moduleSuffix = GetBuffModuleSuffix(curEffect)
|
| | |
|
| | |
| | | return
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | # 获得关联技能
|
| | | # 获得关联技能,0 全部 1是主动型技能(法宝,普攻) 其他技能ID
|
| | | def GetConnectSkillID(curSkill):
|
| | | return curSkill.GetExAttr1()
|
| | |
|
| | |
| | | def GetUpLVCostItemNum(curSkill):
|
| | | return curSkill.GetExAttr5()
|
| | |
|
| | | # 技能特殊增加属性配置,目前只支持生命,潜力技能专用
|
| | | def GetMaxHPAttrValue(curSkill):
|
| | | return curSkill.GetMP()
|
| | |
|
| | |
|
| | | ##获得当前技能升级消耗的真气值
|
| | | # @param curSkill 当前技能技能
|