void TakeDamage(float damage) { if (IsInvulnerable) { return; } damage *= entityStats.GetDamageReceivedModifier(); LowerHealthAmount(damage); // Trigger floating damage text. Vector3 damageTextPosition = mainCamera.WorldToScreenPoint(transform.position); damageTextPosition.y += 15f; Transform instantiatedDamageText = Instantiate(floatingDamageTextPrefab, GameManager.HUD.transform); FloatingDamageText floatingDamageText = instantiatedDamageText.GetComponent <FloatingDamageText>(); floatingDamageText.DamageValue = damage; floatingDamageText.attachedTransform = transform; // Expose & update attached health bar. unitHealthBarObject.SetActive(true); unitHealthBar.UpdateHealth(currentHealth); entityEmitter.EmitEvent(EntityEvents.HealthChanged); }
public static void Initialize() { canvas = GameObject.Find("HubGUI"); if (!popupText) { popupText = Resources.Load <FloatingDamageText>("Prefabs/DTextParent"); } }
public static void CreateFloatingText(string text, Transform location) { FloatingDamageText instance = Instantiate(popupText); Vector2 screenPosition = Camera.main.WorldToScreenPoint(new Vector2(location.position.x + Random.Range(0f, 2.5f), location.position.y + Random.Range(1f, 1.5f))); instance.transform.SetParent(canvas.transform, false); instance.transform.position = screenPosition; instance.SetText(text); }
public void GetHealed(float healing) { RaiseHealthAmount(healing); // Trigger floating damage text. Vector3 damageTextPosition = mainCamera.WorldToScreenPoint(transform.position); damageTextPosition.y += 15f; Transform instantiatedDamageText = Instantiate(floatingDamageTextPrefab, GameManager.HUD.transform); FloatingDamageText floatingDamageText = instantiatedDamageText.GetComponent <FloatingDamageText>(); floatingDamageText.isHealing = true; floatingDamageText.DamageValue = healing; floatingDamageText.attachedTransform = transform; // Expose & update attached health bar. unitHealthBarObject.SetActive(true); unitHealthBar.UpdateHealth(currentHealth); }
protected override void Start() { moveSpeed = 5.0f; control = GetComponent<CharacterController>(); base.Start(); //gets reference to weapon, among other things. healthBar = (Transform) GameObject.Instantiate(healthBarStatic, transform.position, Quaternion.identity); floatingDamageText = (GameObject) GameObject.Instantiate(Resources.Load("FloatingDamageText"), transform.position, Quaternion.identity); floatingDamageTextScript = floatingDamageText.GetComponent<FloatingDamageText>(); floatingDamageTextScript.parent = transform; floatingXPText = (GameObject) GameObject.Instantiate(Resources.Load("FloatingXPText"), transform.position, Quaternion.identity); floatingXPTextScript = floatingXPText.GetComponent<FloatingXPText>(); floatingXPTextScript.parent2 = transform; }
public void ApplyDamage(Dictionary <ElementType, float> damage, OnHitDataContainer onHitData, bool isHit, bool isFromSecondaryEffect, EffectType?sourceType = null, EffectApplicationFlags restrictionFlags = EffectApplicationFlags.NONE) { float total = 0; if (Data.IsDead) { return; } if (Data.IsDead && isHit) { return; } Dictionary <ElementType, float> damageTaken = new Dictionary <ElementType, float>(damage); float damageTakenModifier = Data.DamageTakenModifier; float blockDamageReduction = 1f; if (isHit) { if (!isFromSecondaryEffect) { damageTakenModifier *= onHitData.directHitDamage; } if (DidTargetBlock(this)) { blockDamageReduction *= 1f - Data.BlockProtection; damageTakenModifier *= blockDamageReduction; Data.OnHitData.ApplyTriggerEffects(TriggerType.ON_BLOCK, onHitData.SourceActor); } //if (isBoss) //damageTakenModifier *= onHitData.vsBossDamage; } foreach (ElementType elementType in damage.Keys) { bool isDamageTakenNonZero = false; if (elementType == ElementType.PHYSICAL && damage.ContainsKey(ElementType.PHYSICAL)) { float armorReductionRate = 1.0f; if (isHit && Data.Armor > 0) { armorReductionRate = 1.0f - (Data.Armor / (Data.Armor + damage[ElementType.PHYSICAL])); } float resistanceReductionRate = 1.0f - (Data.GetResistance(ElementType.PHYSICAL) / 100f); float physicalReduction = (armorReductionRate * resistanceReductionRate) + (onHitData.GetNegation(ElementType.PHYSICAL) / 100f); //Debug.Log(Data.GetResistance(ElementType.PHYSICAL) + " " + onHitData.physicalNegation + " " + damage[ElementType.PHYSICAL]); float physicalDamage = physicalReduction * damage[ElementType.PHYSICAL] * damageTakenModifier; total += Math.Max(0, physicalDamage); damageTaken[ElementType.PHYSICAL] = (damage[ElementType.PHYSICAL] * blockDamageReduction); isDamageTakenNonZero = physicalDamage > 0; } else { if (damage.ContainsKey(elementType)) { float nonPhysicalDamage = (1f - (Data.GetResistance(elementType) - onHitData.GetNegation(elementType)) / 100f) * damage[elementType] * damageTakenModifier; total += Math.Max(0, nonPhysicalDamage); damageTaken[elementType] = (damage[elementType] * blockDamageReduction); isDamageTakenNonZero = nonPhysicalDamage > 0; } } if (isHit && isDamageTakenNonZero) { ParticleManager.Instance.EmitOnHitEffect(elementType, transform.position); } } float actualDamageTaken = total; if (sourceType == EffectType.POISON) { total = ModifyCurrentShield(total * Data.PoisonResistance, true) + (total * (1f - Data.PoisonResistance)); } else { total = ModifyCurrentShield(total, true); } actualDamageTaken -= total; if (Data.HealthIsHitsToKill && isHit && total >= 1f) { ModifyCurrentHealth(1); actualDamageTaken += 1; } else if (total > 0) { MassShieldAura massShield = (MassShieldAura)GetStatusEffect(EffectType.MASS_SHIELD_AURA); if (massShield != null && massShield.Source != this) { total = massShield.TransferDamage(total * massShield.DamageTransferRate) + total * (1f - massShield.DamageTransferRate); } BodyguardAura bodyguard = (BodyguardAura)GetStatusEffect(EffectType.BODYGUARD_AURA); if (isHit && bodyguard != null && bodyguard.Source != this) { if (bodyguard.TransferDamage(total, out float damageMod)) { total *= 1f - bodyguard.DamageTransferRate; foreach (ElementType element in Enum.GetValues(typeof(ElementType))) { if (damage.ContainsKey(element)) { damage[element] *= damageMod; } } bodyguard.Source.ApplyAfterHitEffects(damage, onHitData, restrictionFlags); } } actualDamageTaken += total; ModifyCurrentHealth(total); } if (onHitData.SourceActor != this) { if (Data.IsDead) { if (onHitData.SourceActor is HeroActor hero) { hero.Data.killCount++; } onHitData.ApplyTriggerEffects(TriggerType.ON_KILL, this); if (isHit) { onHitData.ApplyTriggerEffects(TriggerType.ON_HIT_KILL, this); } } else if (isHit) { Data.OnHitData.ApplyTriggerEffects(TriggerType.WHEN_HIT_BY, onHitData.SourceActor); } } if ((GameManager.Instance.PlayerStats.showDamageNumbers) && (isHit || sourceType == EffectType.RETALIATION_DAMAGE)) { FloatingDamageText damageText = StageManager.Instance.BattleManager.DamageTextPool.GetDamageText(); damageText.transform.SetParent(StageManager.Instance.WorldCanvas.transform, false); damageText.transform.position = this.transform.position; if (sourceType == EffectType.RETALIATION_DAMAGE) { damageText.SetDamageText(actualDamageTaken, Color.gray); } else { damageText.SetDamageText(actualDamageTaken, Color.white); } } if (isHit) { ApplyAfterHitEffects(damageTaken, onHitData, restrictionFlags); } }