def playOuch(self, skillId, ammoSkillId, targetEffects, attacker, pos, itemEffects = [], multihit = 0, targetBonus = 0, skillResult = 0):
     (targetHp, targetPower, targetEffect, targetMojo, targetSwiftness) = targetEffects
     if attacker:
         self.addCombo(attacker.getDoId(), attacker.currentWeaponId, skillId, -targetHp)
     
     self.cleanupOuchIval()
     if not targetBonus:
         if ammoSkillId:
             effectId = WeaponGlobals.getHitEffect(ammoSkillId)
         else:
             effectId = WeaponGlobals.getHitEffect(skillId)
     
     if not targetBonus and not (self.NoPain) and not (self.noIntervals) and targetEffects[0] < 0:
         if self.gameFSM.state not in ('Ensnared', 'Knockdown', 'Stunned', 'Rooted', 'NPCInteract', 'ShipBoarding', 'Injured', 'Dying'):
             ouchSfx = None
             currentAnim = self.getCurrentAnim()
             if currentAnim == 'run':
                 painAnim = 'run_hit'
             elif currentAnim == 'walk':
                 painAnim = 'walk_hit'
             else:
                 painAnim = 'idle_hit'
             actorIval = self.actorInterval(painAnim, playRate = random.uniform(0.69999999999999996, 1.5))
             if self.currentWeapon and WeaponGlobals.getIsStaffAttackSkill(skillId):
                 skillInfo = WeaponGlobals.getSkillAnimInfo(skillId)
                 getOuchSfxFunc = skillInfo[WeaponGlobals.OUCH_SFX_INDEX]
                 if getOuchSfxFunc:
                     ouchSfx = getOuchSfxFunc()
                 
             else:
                 ouchSfx = self.getSfx('pain')
             if ouchSfx:
                 self.ouchAnim = Sequence(Func(base.playSfx, ouchSfx, node = self, cutoff = 75), actorIval)
             else:
                 self.ouchAnim = actorIval
             self.ouchAnim.start()
         
     
     if self.combatEffect:
         self.combatEffect.destroy()
         self.combatEffect = None
     
     self.combatEffect = CombatEffect.CombatEffect(effectId, multihit, attacker)
     self.combatEffect.reparentTo(self)
     self.combatEffect.setPos(self, pos[0], pos[1], pos[2])
     if not WeaponGlobals.getIsDollAttackSkill(skillId) and not WeaponGlobals.getIsStaffAttackSkill(skillId):
         if attacker and not attacker.isEmpty():
             self.combatEffect.lookAt(attacker)
         
         self.combatEffect.setH(self.combatEffect, 180)
     
     self.combatEffect.play()
     if WeaponGlobals.getIsDollAttackSkill(skillId):
         self.voodooSmokeEffect2 = AttuneSmoke.getEffect()
         if self.voodooSmokeEffect2:
             self.voodooSmokeEffect2.reparentTo(self)
             self.voodooSmokeEffect2.setPos(0, 0, 0.20000000000000001)
             self.voodooSmokeEffect2.play()
 def playOuch(self, skillId, ammoSkillId, targetEffects, attacker, pos, itemEffects=[], multihit=0, targetBonus=0, skillResult=0):
     targetHp, targetPower, targetEffect, targetMojo, targetSwiftness = targetEffects
     if attacker:
         self.addCombo(attacker.getDoId(), attacker.currentWeaponId, skillId, -targetHp)
     self.cleanupOuchIval()
     if not targetBonus:
         if ammoSkillId:
             effectId = WeaponGlobals.getHitEffect(ammoSkillId)
         else:
             effectId = WeaponGlobals.getHitEffect(skillId)
     if not targetBonus and not self.NoPain and not self.noIntervals and targetEffects[0] < 0:
         if self.gameFSM.state not in ('Ensnared', 'Knockdown', 'Stunned', 'Rooted',
                                       'NPCInteract', 'ShipBoarding', 'Injured',
                                       'Dying'):
             ouchSfx = None
             currentAnim = self.getCurrentAnim()
             if currentAnim == 'run':
                 painAnim = 'run_hit'
             else:
                 if currentAnim == 'walk':
                     painAnim = 'walk_hit'
                 else:
                     painAnim = 'idle_hit'
                 actorIval = self.actorInterval(painAnim, playRate=random.uniform(0.7, 1.5))
                 if self.currentWeapon and WeaponGlobals.getIsStaffAttackSkill(skillId):
                     skillInfo = WeaponGlobals.getSkillAnimInfo(skillId)
                     getOuchSfxFunc = skillInfo[WeaponGlobals.OUCH_SFX_INDEX]
                     if getOuchSfxFunc:
                         ouchSfx = getOuchSfxFunc()
                 else:
                     ouchSfx = self.getSfx('pain')
                 if ouchSfx:
                     self.ouchAnim = Sequence(Func(base.playSfx, ouchSfx, node=self, cutoff=75), actorIval)
                 self.ouchAnim = actorIval
             self.ouchAnim.start()
     if self.combatEffect:
         self.combatEffect.destroy()
         self.combatEffect = None
     self.combatEffect = CombatEffect.CombatEffect(effectId, multihit, attacker)
     self.combatEffect.reparentTo(self)
     self.combatEffect.setPos(self, pos[0], pos[1], pos[2])
     if not WeaponGlobals.getIsDollAttackSkill(skillId) and not WeaponGlobals.getIsStaffAttackSkill(skillId):
         if attacker and not attacker.isEmpty():
             self.combatEffect.lookAt(attacker)
         self.combatEffect.setH(self.combatEffect, 180)
     self.combatEffect.play()
     if WeaponGlobals.getIsDollAttackSkill(skillId):
         self.voodooSmokeEffect2 = AttuneSmoke.getEffect()
         if self.voodooSmokeEffect2:
             self.voodooSmokeEffect2.reparentTo(self)
             self.voodooSmokeEffect2.setPos(0, 0, 0.2)
             self.voodooSmokeEffect2.play()
     return
    def playOuch(self,
                 skillId,
                 ammoSkillId,
                 targetEffects,
                 attacker,
                 pos,
                 itemEffects=[],
                 multihit=0,
                 targetBonus=0,
                 skillResult=0):
        (targetHp, targetPower, targetEffect, targetMojo,
         targetSwiftness) = targetEffects
        if self.gameFSM.state in ('Injured', ):
            return None

        if not targetBonus:
            if ammoSkillId:
                effectId = WeaponGlobals.getHitEffect(ammoSkillId)
                skillEffectId = WeaponGlobals.getSkillEffectFlag(ammoSkillId)
            else:
                effectId = WeaponGlobals.getHitEffect(skillId)
                skillEffectId = WeaponGlobals.getSkillEffectFlag(skillId)

        if attacker:
            self.addCombo(attacker.getDoId(), attacker.currentWeaponId,
                          skillId, -targetHp, skillResult)

        if WeaponGlobals.C_KNOCKDOWN not in self.getSkillEffects(
        ) or skillEffectId == WeaponGlobals.C_KNOCKDOWN:
            self.cleanupOuchIval()

        if not targetBonus and not (self.NoPain) and not (
                self.noIntervals) and targetEffects[0] < 0:
            if self.gameFSM.state not in (
                    'Ensnared', 'Knockdown', 'Stunned', 'Rooted',
                    'NPCInteract', 'ShipBoarding', 'Injured', 'Dying', 'Death'
            ) or WeaponGlobals.C_KNOCKDOWN in self.getSkillEffects(
            ) or self.gameFSM.state not in ('ShipBoarding', 'Injured', 'Dying',
                                            'Death'):
                if WeaponGlobals.C_KNOCKDOWN not in self.getSkillEffects(
                ) or skillEffectId == WeaponGlobals.C_KNOCKDOWN:
                    ouchSfx = None
                    if self.currentWeapon:
                        if not self.avatarType.isA(
                                AvatarTypes.Creature
                        ) and skillEffectId == WeaponGlobals.C_KNOCKDOWN and not ItemGlobals.getWeaponAttributes(
                                self.currentWeaponId, ItemGlobals.SURE_FOOTED):
                            if self.isLocal():
                                actorIval = Sequence(
                                    self.actorInterval('injured_fall',
                                                       playRate=1.5,
                                                       blendOutT=0),
                                    self.actorInterval('injured_standup',
                                                       playRate=1.5,
                                                       blendInT=0),
                                    Func(messenger.send, 'skillFinished'))
                            else:
                                actorIval = Sequence(
                                    self.actorInterval('injured_fall',
                                                       playRate=1.5,
                                                       blendOutT=0),
                                    self.actorInterval('injured_standup',
                                                       playRate=1.5,
                                                       blendInT=0))
                        elif not self.avatarType.isA(
                                AvatarTypes.Creature
                        ) and effectId == WeaponGlobals.VFX_BLIND:
                            actorIval = self.actorInterval(
                                'sand_in_eyes_holdweapon_noswing',
                                playRate=random.uniform(
                                    0.69999999999999996, 1.5))
                        else:
                            actorIval = self.actorInterval(
                                self.currentWeapon.painAnim,
                                playRate=random.uniform(
                                    0.69999999999999996, 1.5))
                            if WeaponGlobals.getIsStaffAttackSkill(skillId):
                                skillInfo = WeaponGlobals.getSkillAnimInfo(
                                    skillId)
                                getOuchSfxFunc = skillInfo[
                                    WeaponGlobals.OUCH_SFX_INDEX]
                                if getOuchSfxFunc:
                                    ouchSfx = getOuchSfxFunc()

                            else:
                                ouchSfx = self.getSfx('pain')
                    elif not self.avatarType.isA(
                            AvatarTypes.Creature
                    ) and skillEffectId == WeaponGlobals.C_KNOCKDOWN:
                        actorIval = Sequence(
                            self.actorInterval('injured_fall',
                                               playRate=1.5,
                                               blendOutT=0),
                            self.actorInterval('injured_standup',
                                               playRate=1.5,
                                               blendInT=0))
                    elif not self.avatarType.isA(
                            AvatarTypes.Creature
                    ) and effectId == WeaponGlobals.VFX_BLIND:
                        actorIval = self.actorInterval('sand_in_eyes',
                                                       playRate=random.uniform(
                                                           0.69999999999999996,
                                                           1.5))
                    else:
                        actorIval = self.actorInterval('idle_hit',
                                                       playRate=random.uniform(
                                                           0.69999999999999996,
                                                           1.5))
                    if ouchSfx:
                        self.ouchAnim = Sequence(
                            Func(base.playSfx, ouchSfx, node=self, cutoff=75),
                            actorIval)
                    else:
                        self.ouchAnim = actorIval
                    self.ouchAnim.start()

            skillEffectId == WeaponGlobals.C_KNOCKDOWN

        if self.combatEffect:
            self.combatEffect.destroy()
            self.combatEffect = None

        self.combatEffect = CombatEffect.CombatEffect(effectId, multihit,
                                                      attacker, skillResult)
        self.combatEffect.reparentTo(self)
        self.combatEffect.setPos(self, pos[0], pos[1], pos[2])
        if not WeaponGlobals.getIsDollAttackSkill(
                skillId) and not WeaponGlobals.getIsStaffAttackSkill(skillId):
            if not WeaponGlobals.isSelfUseSkill(skillId):
                if attacker and not attacker.isEmpty():
                    self.combatEffect.lookAt(attacker)

                self.combatEffect.setH(self.combatEffect, 180)

        skillEffects = self.getSkillEffects()
        if WeaponGlobals.C_MELEE_SHIELD in skillEffects:
            if WeaponGlobals.getAttackClass(
                    skillId) == WeaponGlobals.AC_COMBAT:
                self.pulseGhostGuardEffect(attacker,
                                           Vec4(0, 0, 0, 1),
                                           wantBlending=False)

        elif WeaponGlobals.C_MISSILE_SHIELD in skillEffects:
            if WeaponGlobals.getAttackClass(
                    skillId) == WeaponGlobals.AC_MISSILE:
                self.pulseGhostGuardEffect(attacker,
                                           Vec4(1, 1, 1, 1),
                                           wantBlending=True)

        elif WeaponGlobals.C_MAGIC_SHIELD in skillEffects:
            if WeaponGlobals.getAttackClass(skillId) == WeaponGlobals.AC_MAGIC:
                self.pulseGhostGuardEffect(attacker,
                                           Vec4(0.5, 0.29999999999999999, 1,
                                                1),
                                           wantBlending=True)

        self.combatEffect.play()
        if WeaponGlobals.getIsDollAttackSkill(skillId):
            self.voodooSmokeEffect2 = AttuneSmoke.getEffect()
            if self.voodooSmokeEffect2:
                self.voodooSmokeEffect2.reparentTo(self)
                self.voodooSmokeEffect2.setPos(0, 0, 0.20000000000000001)
                self.voodooSmokeEffect2.play()
 def playOuch(self, skillId, ammoSkillId, targetEffects, attacker, pos, itemEffects = [], multihit = 0, targetBonus = 0, skillResult = 0):
     (targetHp, targetPower, targetEffect, targetMojo, targetSwiftness) = targetEffects
     if self.gameFSM.state in ('Injured',):
         return None
     
     if not targetBonus:
         if ammoSkillId:
             effectId = WeaponGlobals.getHitEffect(ammoSkillId)
             skillEffectId = WeaponGlobals.getSkillEffectFlag(ammoSkillId)
         else:
             effectId = WeaponGlobals.getHitEffect(skillId)
             skillEffectId = WeaponGlobals.getSkillEffectFlag(skillId)
     
     if attacker:
         self.addCombo(attacker.getDoId(), attacker.currentWeaponId, skillId, -targetHp, skillResult)
     
     if WeaponGlobals.C_KNOCKDOWN not in self.getSkillEffects() or skillEffectId == WeaponGlobals.C_KNOCKDOWN:
         self.cleanupOuchIval()
     
     if not targetBonus and not (self.NoPain) and not (self.noIntervals) and targetEffects[0] < 0:
         if self.gameFSM.state not in ('Ensnared', 'Knockdown', 'Stunned', 'Rooted', 'NPCInteract', 'ShipBoarding', 'Injured', 'Dying', 'Death') or WeaponGlobals.C_KNOCKDOWN in self.getSkillEffects() or self.gameFSM.state not in ('ShipBoarding', 'Injured', 'Dying', 'Death'):
             if WeaponGlobals.C_KNOCKDOWN not in self.getSkillEffects() or skillEffectId == WeaponGlobals.C_KNOCKDOWN:
                 ouchSfx = None
                 if self.currentWeapon:
                     if not self.avatarType.isA(AvatarTypes.Creature) and skillEffectId == WeaponGlobals.C_KNOCKDOWN and not ItemGlobals.getWeaponAttributes(self.currentWeaponId, ItemGlobals.SURE_FOOTED):
                         if self.isLocal():
                             actorIval = Sequence(self.actorInterval('injured_fall', playRate = 1.5, blendOutT = 0), self.actorInterval('injured_standup', playRate = 1.5, blendInT = 0), Func(messenger.send, 'skillFinished'))
                         else:
                             actorIval = Sequence(self.actorInterval('injured_fall', playRate = 1.5, blendOutT = 0), self.actorInterval('injured_standup', playRate = 1.5, blendInT = 0))
                     elif not self.avatarType.isA(AvatarTypes.Creature) and effectId == WeaponGlobals.VFX_BLIND:
                         actorIval = self.actorInterval('sand_in_eyes_holdweapon_noswing', playRate = random.uniform(0.69999999999999996, 1.5))
                     else:
                         actorIval = self.actorInterval(self.currentWeapon.painAnim, playRate = random.uniform(0.69999999999999996, 1.5))
                         if WeaponGlobals.getIsStaffAttackSkill(skillId):
                             skillInfo = WeaponGlobals.getSkillAnimInfo(skillId)
                             getOuchSfxFunc = skillInfo[WeaponGlobals.OUCH_SFX_INDEX]
                             if getOuchSfxFunc:
                                 ouchSfx = getOuchSfxFunc()
                             
                         else:
                             ouchSfx = self.getSfx('pain')
                 elif not self.avatarType.isA(AvatarTypes.Creature) and skillEffectId == WeaponGlobals.C_KNOCKDOWN:
                     actorIval = Sequence(self.actorInterval('injured_fall', playRate = 1.5, blendOutT = 0), self.actorInterval('injured_standup', playRate = 1.5, blendInT = 0))
                 elif not self.avatarType.isA(AvatarTypes.Creature) and effectId == WeaponGlobals.VFX_BLIND:
                     actorIval = self.actorInterval('sand_in_eyes', playRate = random.uniform(0.69999999999999996, 1.5))
                 else:
                     actorIval = self.actorInterval('idle_hit', playRate = random.uniform(0.69999999999999996, 1.5))
                 if ouchSfx:
                     self.ouchAnim = Sequence(Func(base.playSfx, ouchSfx, node = self, cutoff = 75), actorIval)
                 else:
                     self.ouchAnim = actorIval
                 self.ouchAnim.start()
             
         skillEffectId == WeaponGlobals.C_KNOCKDOWN
     
     if self.combatEffect:
         self.combatEffect.destroy()
         self.combatEffect = None
     
     self.combatEffect = CombatEffect.CombatEffect(effectId, multihit, attacker, skillResult)
     self.combatEffect.reparentTo(self)
     self.combatEffect.setPos(self, pos[0], pos[1], pos[2])
     if not WeaponGlobals.getIsDollAttackSkill(skillId) and not WeaponGlobals.getIsStaffAttackSkill(skillId):
         if not WeaponGlobals.isSelfUseSkill(skillId):
             if attacker and not attacker.isEmpty():
                 self.combatEffect.lookAt(attacker)
             
             self.combatEffect.setH(self.combatEffect, 180)
         
     
     skillEffects = self.getSkillEffects()
     if WeaponGlobals.C_MELEE_SHIELD in skillEffects:
         if WeaponGlobals.getAttackClass(skillId) == WeaponGlobals.AC_COMBAT:
             self.pulseGhostGuardEffect(attacker, Vec4(0, 0, 0, 1), wantBlending = False)
         
     elif WeaponGlobals.C_MISSILE_SHIELD in skillEffects:
         if WeaponGlobals.getAttackClass(skillId) == WeaponGlobals.AC_MISSILE:
             self.pulseGhostGuardEffect(attacker, Vec4(1, 1, 1, 1), wantBlending = True)
         
     elif WeaponGlobals.C_MAGIC_SHIELD in skillEffects:
         if WeaponGlobals.getAttackClass(skillId) == WeaponGlobals.AC_MAGIC:
             self.pulseGhostGuardEffect(attacker, Vec4(0.5, 0.29999999999999999, 1, 1), wantBlending = True)
         
     
     self.combatEffect.play()
     if WeaponGlobals.getIsDollAttackSkill(skillId):
         self.voodooSmokeEffect2 = AttuneSmoke.getEffect()
         if self.voodooSmokeEffect2:
             self.voodooSmokeEffect2.reparentTo(self)
             self.voodooSmokeEffect2.setPos(0, 0, 0.20000000000000001)
             self.voodooSmokeEffect2.play()