6613 子 【开发】【2.0】增加重击字体战斗飘字 / 【后端】【2.0】增加重击属性
14个文件已修改
17个文件已添加
1205 ■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py 106 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerYinji.py 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1314.py 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_900.py 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4526.py 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4527.py 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4528.py 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4529.py 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4081.py 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4082.py 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4083.py 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4084.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4085.py 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4086.py 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4087.py 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4088.py 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4089.py 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4090.py 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4091.py 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -20334,6 +20334,84 @@
#------------------------------------------------------
# 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):
@@ -28040,6 +28118,54 @@
#------------------------------------------------------
#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):
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -544,6 +544,7 @@
Def_Effect_DamagePVE = 141  # PVE固定伤害
Def_Effect_FinalHurtPer = 142   # 最终伤害万分率
Def_Effect_FinalHurtReducePer = 143    # 最终伤害减少万分
Def_Effect_YinjiTime = 144    # 每X毫秒自动消失一个印记
#增加%d物理伤害值,其中a值为伤害值
Def_Effect_AddAtk = 1005
@@ -854,7 +855,8 @@
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 # 战盟贡献度(活跃度转换得来)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -1293,7 +1293,10 @@
def IsHappenStateByType(happenState, cmpType):
    return happenState & cmpType
def CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState):
# 表现形式 致命一击>(重击>暴击)>会心>格挡>境界压制
# 重击定义:当触发重击时,则增加双倍暴击固定值伤害(重击与暴击互斥,优先判断重击,当重击触发时,暴击不触发)
def CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState, curSkill):
    ''' 获取伤害类型结果 
    支持多种伤害类型同时触发, 飘字表现以最终表现伤害类型为主
    @return: 最终表现伤害类型, {伤害类型:[是否触发, 伤害计算值, 触发时防守方的伤害减免值], ...}
@@ -1306,12 +1309,14 @@
                          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]
    # 暂时只计算玩家
@@ -1321,11 +1326,12 @@
    # 优先级列表, 互斥列表
    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 = [] # 已经处理过的伤害类型列表
@@ -1342,7 +1348,7 @@
            if curMHHappen:
                # 只要其中一个已触发的则后面的均为默认不触发
                continue
            result = happenFunc[hType](atkObj, defObj, happenState)
            result = happenFunc[hType](atkObj, defObj, happenState, curSkill)
            if result: # 如果触发,更新相关数值
                hurtTypeResultDict[hType] = result
                curMHHappen = True
@@ -1353,7 +1359,7 @@
            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
                
@@ -1364,7 +1370,7 @@
    return hurtType, hurtTypeResultDict
def __HurtTypeHappen_LuckyHit(atkObj, defObj, happenState):
def __HurtTypeHappen_LuckyHit(atkObj, defObj, happenState, curSkill):
    ''' 判断伤害类型是否发生 - 会心一击
    @return: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
    '''
@@ -1382,7 +1388,7 @@
        return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReduce(defObj)
    return
def __HurtTypeHappen_SuperHit(atkObj, defObj, happenState):
def __HurtTypeHappen_SuperHit(atkObj, defObj, happenState, curSkill):
    ''' 判断伤害类型是否发生 - 暴击
    @return: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
    '''
@@ -1401,7 +1407,7 @@
        return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReduce(defObj)
    return
def __HurtTypeHappen_Parry(atkObj, defObj, happenState):
def __HurtTypeHappen_Parry(atkObj, defObj, happenState, curSkill):
    ''' 判断伤害类型是否发生 - 防守方抵御
    @return: 是否触发, 触发时伤害计算值, 触发时防守方的伤害减免值
    '''
@@ -1412,7 +1418,7 @@
        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:
@@ -1423,11 +1429,27 @@
#    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):
@@ -1602,6 +1624,36 @@
    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 防御者
@@ -1615,6 +1667,9 @@
#  @remarks 函数详细说明.
def GetHurtHP(attacker, defObj, curSkill, atkSkillValue, atkSkillPer, tick):
    atkObj = ElfChangeAttacker(attacker)  # Elf灵为替身攻击,要取玩家的属性
    #设置第一个防御者
    SetFirstDefender(atkObj, defObj, curSkill)
    
    resultHurtType = HurtType()
    atkObjType = attacker.GetGameObjType()
@@ -1749,13 +1804,7 @@
    
    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
@@ -2008,10 +2057,21 @@
            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] # 致命一击
@@ -2424,7 +2484,7 @@
        #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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
@@ -217,6 +217,7 @@
# 触发型技能根据伤血类型触发被动技能,群攻只触发一次,放在伤血列表被清之前
# 只处理 isEnhanceSkill的情况,对应 OnHurtTypeTriggerSkill
def OnHurtTypeTriggerPassiveSkill(attacker, target, curSkill, tick):
    AttackCommon.ClearFirstDefender(attacker)
    
    skillHurtLists = [] # 内部触发清除g_skillHurtList
    for i in xrange(g_skillHurtList.GetHurtCount()):
@@ -225,6 +226,10 @@
            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])
@@ -1471,6 +1476,8 @@
            OnHurtTypeTriggerPassiveSkill(curPlayer, target, curSkill, tick)
        return True
    
    AttackCommon.ClearFirstDefender(curPlayer)
    #玩家进入战斗状态
    #技能是光环, 不进入战斗状态 ,无对象,不进入战斗状态
    if (curSkill == None \
@@ -1543,10 +1550,29 @@
            return True
    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触发,第一次判断不能调用,即代表都不可用无需循环
    
@@ -1558,27 +1584,26 @@
        
        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
        
@@ -1586,20 +1611,20 @@
            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)
        
@@ -2389,14 +2414,17 @@
                                                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:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -68,7 +68,7 @@
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
@@ -212,6 +212,7 @@
TYPE_Calc_FabaoHurt,                    # 法宝技能增伤 
TYPE_Calc_FabaoHurtPer,                 # 法宝技能加成 
TYPE_Calc_FinalHurtReducePer,           # 最终伤害减少百分比
TYPE_Calc_YinjiTime,                    # 每X秒自动消失一个印记
) = range(1, Def_Calc_AllAttrType_MAX)
@@ -751,7 +752,8 @@
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,      # 吸血 
(
@@ -778,6 +780,10 @@
                       Def_HurtType_SuperHit,       # 暴击 7
                       Def_HurtType_LuckyHit,       # 会心一击伤害 8
                       Def_HurtType_RealmSupress,     # 境界压制 11
                        Def_HurtType_Zhuxian,     # 诛仙一击 13
                        Def_HurtType_DeadlyHit,     # 致命一击 15
                        Def_HurtType_ThumpHit,     # 重击 16
                       ]
#---------------------------------------------------------------------
@@ -1147,6 +1153,7 @@
Def_Skill_HappenState_HitOn = 0x0001  # 必命中
Def_Skill_HappenState_SuperHit = 0x0002  # 必暴击
Def_Skill_HappenState_LuckyHit = 0x0004  # 必会心一击
Def_Skill_HappenState_ThumpHit = 0x0008  # 必重击
#技能施法目标
@@ -3004,13 +3011,18 @@
    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"   # 属性普通攻击增伤:普通攻击附加的固定值伤害
@@ -4177,6 +4189,7 @@
    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],
@@ -4432,7 +4445,10 @@
TriggerType_4074PerValue, # 特殊效果的加成 70
TriggerType_dFinalHurtReducePer,    # 防守方的最终伤害减少百分比 71
TriggerType_IsDealy,    # 是否触发致命一击 72 暂且理解为和概率是独立,有新概念产生则重定义  
) = range(1, 73)
TriggerType_AddThumpHitRate, # 提高重击概率 73
TriggerType_ThumpHit, # 重击时 触发技能74
TriggerType_AddThumpHitPer, # 重击时 增加重击百分比 75
) = range(1, 76)
#不可以佩戴翅膀的地图
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -20334,6 +20334,84 @@
#------------------------------------------------------
# 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):
@@ -28040,6 +28118,54 @@
#------------------------------------------------------
#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):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
@@ -1414,15 +1414,17 @@
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
#---------------------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -3936,7 +3936,7 @@
        maxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV", 1)
        
        curPlayer.BeginRefreshState()
        befXP = curPlayer.GetXP()
        #befXP = curPlayer.GetXP()
        befLV = curPlayer.GetLV()
        befFreePoint = curPlayer.GetFreePoint()
        befBaseSTR = curPlayer.GetBaseSTR()
@@ -5010,7 +5010,7 @@
                        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):
@@ -6668,6 +6668,12 @@
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 背包类型
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -56,6 +56,7 @@
import PlayerFlashSale
import PlayerWing
import ChEquip
import PlayerYinji
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -840,31 +841,34 @@
# @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)
    return
    #===========================================================================
    # #开放等级增加多少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)
    #===========================================================================
#---------------------------------------------------------------------
@@ -1235,6 +1239,8 @@
    #回血回魔状态处理
    ProcessHPMPState(curPlayer, tick)
    
    PlayerYinji.ProcessPlayerYinji(curPlayer, tick)
    #刷新组队状态
    #ProcessTeamState(curPlayer, tick)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerYinji.py
New file
@@ -0,0 +1,61 @@
#!/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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -544,6 +544,7 @@
Def_Effect_DamagePVE = 141  # PVE固定伤害
Def_Effect_FinalHurtPer = 142   # 最终伤害万分率
Def_Effect_FinalHurtReducePer = 143    # 最终伤害减少万分
Def_Effect_YinjiTime = 144    # 每X毫秒自动消失一个印记
#增加%d物理伤害值,其中a值为伤害值
Def_Effect_AddAtk = 1005
@@ -854,7 +855,8 @@
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 # 战盟贡献度(活跃度转换得来)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
@@ -169,6 +169,7 @@
   [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秒自动消失一个印记 毫秒
]
## 通过索引获得属性值
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1314.py
@@ -72,13 +72,20 @@
    #攻击次数处理,配置为0的说明是以持续时间为主
    # 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第一个值为攻击次数, 第二个值为被动增强
def CalcBuffValue(attacker, defender, curSkill, changeBuffValueDict):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_900.py
New file
@@ -0,0 +1,50 @@
#!/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)]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4526.py
New file
@@ -0,0 +1,35 @@
#!/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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4527.py
New file
@@ -0,0 +1,32 @@
#!/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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4528.py
New file
@@ -0,0 +1,36 @@
#!/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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4529.py
New file
@@ -0,0 +1,37 @@
#!/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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4081.py
New file
@@ -0,0 +1,27 @@
#!/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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4082.py
New file
@@ -0,0 +1,33 @@
#!/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))
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4083.py
New file
@@ -0,0 +1,29 @@
#!/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)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4084.py
New file
@@ -0,0 +1,19 @@
#!/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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4085.py
New file
@@ -0,0 +1,22 @@
#!/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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4086.py
New file
@@ -0,0 +1,32 @@
#!/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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4087.py
New file
@@ -0,0 +1,25 @@
#!/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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4088.py
New file
@@ -0,0 +1,28 @@
#!/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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4089.py
New file
@@ -0,0 +1,28 @@
#!/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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4090.py
New file
@@ -0,0 +1,23 @@
#!/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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4091.py
New file
@@ -0,0 +1,28 @@
#!/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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -121,7 +121,7 @@
    # 刷被动效果和属性
    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)
@@ -157,7 +157,7 @@
    NetPackCommon.SendFakePack(curPlayer, sendPack)
    
    # 刷被动效果和属性
    GetPassiveEffManager().RegistPassiveEffSet(curPlayer)
    GetPassiveEffManager().RegistPassiveEffSet(curPlayer, True)
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    return
@@ -362,6 +362,17 @@
             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) 
    #===========================================================================
@@ -403,6 +414,10 @@
             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,  # 血盾
@@ -551,15 +566,21 @@
    
    
    # 重刷可装备的被动技能
    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代表不限技能
@@ -650,7 +671,8 @@
        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无限增长
@@ -658,6 +680,18 @@
        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), []))
@@ -713,16 +747,16 @@
        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
        
        
@@ -859,7 +893,7 @@
        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
        
@@ -993,28 +1027,17 @@
    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
        
@@ -1033,10 +1056,6 @@
        if not IsValidPassiveSkill(curSkill):
            continue
        if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
            # 只有天赋才可以再次被触发
            continue
        
        effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)
        if not effect:
@@ -1114,7 +1133,7 @@
    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
    
@@ -1179,7 +1198,7 @@
    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 []
    
@@ -1228,7 +1247,7 @@
    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
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -2867,19 +2867,6 @@
        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):
@@ -2889,7 +2876,6 @@
        if curPlayerSkill == None:
            continue
        
        CalcFabaoSPSkillAttr(curPlayer, curPlayerSkill, allAttrList)
        if not SkillCommon.isPassiveAttr(curPlayerSkill):
            continue
        
@@ -3469,7 +3455,6 @@
def GetAddBuffValue(attacker, curSkill, defender):
    #验证该技能效果1的ID,提取公式
    curEffect = curSkill.GetEffect(0)
    effectID = curEffect.GetEffectID()
    
    moduleSuffix = GetBuffModuleSuffix(curEffect)
    
@@ -3586,7 +3571,7 @@
    return
#---------------------------------------------------------------------
# 获得关联技能
# 获得关联技能,0 全部 1是主动型技能(法宝,普攻)   其他技能ID
def GetConnectSkillID(curSkill):
    return curSkill.GetExAttr1()
@@ -3623,9 +3608,7 @@
def GetUpLVCostItemNum(curSkill):
    return curSkill.GetExAttr5()
# 技能特殊增加属性配置,目前只支持生命,潜力技能专用
def GetMaxHPAttrValue(curSkill):
    return curSkill.GetMP()
##获得当前技能升级消耗的真气值
# @param curSkill 当前技能技能