public AttackResult DoDamage(Character attacker, IDamageable target, Vector2 worldPosition, float deltaTime, bool playSound = true) { Character targetCharacter = target as Character; if (OnlyHumans) { if (targetCharacter != null && !targetCharacter.IsHuman) { return(new AttackResult()); } } SetUser(attacker); DamageParticles(deltaTime, worldPosition); var attackResult = target.AddDamage(attacker, worldPosition, this, deltaTime, playSound); var effectType = attackResult.Damage > 0.0f ? ActionType.OnUse : ActionType.OnFailure; if (targetCharacter != null && targetCharacter.IsDead) { effectType = ActionType.OnEating; } foreach (StatusEffect effect in statusEffects) { // TODO: do we want to apply the effect at the world position or the entity positions in each cases? -> go through also other cases where status effects are applied if (effect.HasTargetType(StatusEffect.TargetType.This)) { effect.Apply(effectType, deltaTime, attacker, attacker, worldPosition); } if (targetCharacter != null) { if (effect.HasTargetType(StatusEffect.TargetType.Character)) { effect.Apply(effectType, deltaTime, targetCharacter, targetCharacter); } if (effect.HasTargetType(StatusEffect.TargetType.Limb)) { effect.Apply(effectType, deltaTime, targetCharacter, attackResult.HitLimb); } if (effect.HasTargetType(StatusEffect.TargetType.AllLimbs)) { effect.Apply(effectType, deltaTime, targetCharacter, targetCharacter.AnimController.Limbs.Cast <ISerializableEntity>().ToList()); } } if (target is Entity entity) { if (effect.HasTargetType(StatusEffect.TargetType.NearbyItems) || effect.HasTargetType(StatusEffect.TargetType.NearbyCharacters)) { var targets = new List <ISerializableEntity>(); effect.GetNearbyTargets(worldPosition, targets); effect.Apply(ActionType.OnActive, deltaTime, entity, targets); } } } return(attackResult); }
public AttackResult DoDamage(Character attacker, IDamageable target, Vector2 worldPosition, float deltaTime, bool playSound = true) { if (OnlyHumans) { Character character = target as Character; if (character != null && character.ConfigPath != Character.HumanConfigFile) { return(new AttackResult()); } } DamageParticles(deltaTime, worldPosition); var attackResult = target.AddDamage(attacker, worldPosition, this, deltaTime, playSound); var effectType = attackResult.Damage > 0.0f ? ActionType.OnUse : ActionType.OnFailure; if (statusEffects == null) { return(attackResult); } foreach (StatusEffect effect in statusEffects) { if (effect.Targets.HasFlag(StatusEffect.TargetType.This)) { effect.Apply(effectType, deltaTime, attacker, attacker); } if (effect.Targets.HasFlag(StatusEffect.TargetType.Character) && target is Character) { effect.Apply(effectType, deltaTime, (Character)target, (Character)target); } } return(attackResult); }
public AttackResult DoDamage(IDamageable attacker, IDamageable target, Vector2 worldPosition, float deltaTime, bool playSound = true) { if (particleEmitterPrefab != null) { particleEmitterPrefab.Emit(worldPosition); } if (sound != null) { sound.Play(1.0f, 500.0f, worldPosition); } var attackResult = target.AddDamage(attacker, worldPosition, this, deltaTime, playSound); var effectType = attackResult.Damage > 0.0f ? ActionType.OnUse : ActionType.OnFailure; foreach (StatusEffect effect in statusEffects) { if (effect.Targets.HasFlag(StatusEffect.TargetType.This) && attacker is Character) { effect.Apply(effectType, deltaTime, (Character)attacker, (Character)attacker); } if (effect.Targets.HasFlag(StatusEffect.TargetType.Character) && target is Character) { effect.Apply(effectType, deltaTime, (Character)target, (Character)target); } } return(attackResult); }
private void OnTriggerEnter(Collider collider) { if (!setuped) { return; } if (collider.transform.IsChildOf(launcher.transform) || collider.gameObject.layer == LayerMask.NameToLayer("FirstPass")) { return; // Don't collide with launcher or player arms } if (collider.gameObject.GetComponent <MagicProjectile>()) { return; // Don't collide with other projectiles } IDamageable target = collider.gameObject.GetComponent <IDamageable>(); if (target != null) { if (target.WillKill(Damage)) { if (OnKill != null) { OnKill(target); } } target.AddDamage(Damage); } AudioManager.PlaySfx(hitClip, transform.position); Destroy(gameObject); }
private void OnLevelUpCallback(object sender, EventArgs args) { IDamageable dmg = GetComponent <IDamageable>(); dmg.AddDamage(-dmg.Damage); Debug.Log("Congratulations ! You reached level " + currentLevel + " !"); Debug.Log("You have " + unspentPoints + " attributes point(s) to spend."); }
private void TryDoFreeze(IDamageable <float> healthManager, IFreezeable ifreeze, IInvulnerable iInvulnerable) { if (!iInvulnerable.InvFreeze) { healthManager.AddDamage(damage); ifreeze.FreezeMe(); } else { rejected = true; } }
public void Hit(IDamageable damageable) { float damages = Random.Range(minDamages, maxDamages); if (damageable is HealthManager && (damageable as HealthManager).MaxHealth > damageable.Damage && damageable.WillKill(damages)) { weapon.ProjectileOnKillCallback(this, damageable, damages); } else { weapon.ProjectileHitCallback(this, damageable, damages); } damageable.AddDamage(damages); }
public AttackResult DoDamage(Character attacker, IDamageable target, Vector2 worldPosition, float deltaTime, bool playSound = true) { Character targetCharacter = target as Character; if (OnlyHumans) { if (targetCharacter != null && targetCharacter.ConfigPath != Character.HumanConfigFile) { return(new AttackResult()); } } SetUser(attacker); DamageParticles(deltaTime, worldPosition); var attackResult = target.AddDamage(attacker, worldPosition, this, deltaTime, playSound); var effectType = attackResult.Damage > 0.0f ? ActionType.OnUse : ActionType.OnFailure; if (targetCharacter != null && targetCharacter.IsDead) { effectType = ActionType.OnEating; } if (statusEffects == null) { return(attackResult); } foreach (StatusEffect effect in statusEffects) { if (effect.HasTargetType(StatusEffect.TargetType.This)) { effect.Apply(effectType, deltaTime, attacker, attacker); } if (target is Character) { if (effect.HasTargetType(StatusEffect.TargetType.Character)) { effect.Apply(effectType, deltaTime, (Character)target, (Character)target); } if (effect.HasTargetType(StatusEffect.TargetType.Limb)) { effect.Apply(effectType, deltaTime, (Character)target, attackResult.HitLimb); } if (effect.HasTargetType(StatusEffect.TargetType.AllLimbs)) { effect.Apply(effectType, deltaTime, (Character)target, ((Character)target).AnimController.Limbs.Cast <ISerializableEntity>().ToList()); } } if (target is Entity entity) { if (effect.HasTargetType(StatusEffect.TargetType.NearbyItems) || effect.HasTargetType(StatusEffect.TargetType.NearbyCharacters)) { var targets = new List <ISerializableEntity>(); effect.GetNearbyTargets(worldPosition, targets); effect.Apply(ActionType.OnActive, deltaTime, entity, targets); } } } return(attackResult); }
private void TryRegisterHit(RaycastHit hit, IDamageable damageable) { if (stManager == null) { if ((damageable as Behaviour).gameObject.tag == transform.root.tag) { return; } } else { if ((damageable as Behaviour).gameObject.tag == stManager.tag) { return; } } if ((damageable = hit.collider.GetComponentInParent <IDamageable>()) != null && (damageable as Behaviour).enabled) { if (!hits.Exists(x => x == damageable)) { float damages = 0.0f; if (stManager != null) { damages = UnityEngine.Random.Range(minDamages, maxDamages) + (0.4f * stManager.Stats.Strength); } else { damages = UnityEngine.Random.Range(minDamages, maxDamages); } if (OnHit != null) { OnHit(this, new OnHitArgs(damageable, damages)); } if (stManager != null) { if (damageable.WillKill(damages, stManager)) { if (OnKill != null) { OnKill(this, new OnKillArgs(damageable)); } } } else { if (damageable.WillKill(damages)) { if (OnKill != null) { OnKill(this, new OnKillArgs(damageable)); } } } if (stManager != null) { damageable.AddDamage(damages, stManager); } else { damageable.AddDamage(damages); } hits.Add(damageable); if (hitEffectPrefab != null) { GameObject.Destroy(GameObject.Instantiate(hitEffectPrefab, hit.point, Quaternion.identity), 5.0f); } } } }
public void Attack(int damage) { target.AddDamage(damage); }