/// <summary> /// The entity's health can only be changed by other scripts through this method, which ensures the correct aftereffects /// will be applied. /// </summary> /// <param name="value"> The value to be added to/subtracted from the entity's health </param> /// <param name="hitVector"> The direction in which the damage was inflicted in </param> /// <param name="damageType"> The damage type or attack type </param> /// <returns> Whether or not it was successful (false when player is invulnerable) </returns> public bool Damage(int value, Vector2 hitVector, DamageType damageType) { if (isInvulnerable) { return(false); } switch (damageType) { case DamageType.EnemyAttack: OnKnockback?.Invoke(hitVector); goto case DamageType.NormalDamage; case DamageType.LevelHazard: goto case DamageType.NormalDamage; case DamageType.NormalDamage: Hp -= value; break; case DamageType.Heal: if (Hp == maxHP) { return(false); } Hp += value; break; default: break; } return(true); }
protected virtual bool TryApplyForce(Vector3 force, int power) { if (power >= _knockbackThreshold) { OnKnockback?.Invoke(force, power); return(true); } else if (power >= _stunThreshold) { OnStun?.Invoke(force, power); return(true); } return(false); }
private IEnumerator ApplyKnockback(Transform origin) { OnKnockbackEvent.Invoke(stunTimer); isInvinsible = true; GetComponent <SpriteRenderer>().color = new Color(1, 1, 1, 0.4f); //DEBUG PROGRAMMER ART if (receivesKnockback) { Vector3 direction = (transform.position - origin.position).normalized; direction *= knockbackMultiplier; float time = 0; IsStunned = true; while (time <= stunTimer) { rb2d.MovePosition(transform.position + direction * Time.deltaTime); yield return(null); time += Time.deltaTime; } IsStunned = false; } }