public static void InitProjectileBounceEffect(Projectiles.Projectile projectile) { GameObject eGO = Instantiate(Inst.projectileBouncePrefab, Inst.transform); eGO.name = "ProjectileBounceEffect"; eGO.transform.position = projectile.GetPreviousPosition(); eGO.transform.rotation = projectile.transform.rotation; eGO.transform.localScale *= projectile.FromTurret.GunsCaliber / Global.Effects.PROJECTILE_PEN_EFFECT_SIZEMOD_REFERENCE_CALIBER; Destroy(eGO, eGO.GetComponent <ParticleSystem>().main.duration); }
public void Init(Projectiles.Projectile projectileParam, Projectiles.ImpactEffect[] impactEffectsParam, MetaData.PlayerMetaData senderParam) { hasHit = false; sender = senderParam; projectile = projectileParam; impactEffects = impactEffectsParam; if (impactEffects.Length == 0) { print("<color=olive>Warning ! no impact effects found</color>\n" + "Making no effort to collision check"); } }
public override void InflictDamage(DamageZone damageZone, Projectiles.Projectile projectile, DamageParams param = default) { if (PenetrationCheck(projectile, damageZone.Ship.HullArmor, Vector3.Angle(damageZone.Ship.transform.forward, projectile.transform.forward))) { // Penetration effects EffectManager.InitProjectilePenEffect(projectile); damageZone.Ship.Rigidbody.AddForceAtPosition(projectile.Velocity * projectile.FromTurret.GunsCaliber * damageZone.Ship.Armament.GunTurrets[0].ShipRecoil, projectile.GetPreviousPosition(), ForceMode.Impulse); // Add water ingress to ship damageZone.Ship.AddWaterIngress((byte)param.fparam[0]); } else { // Bounce effects EffectManager.InitProjectileBounceEffect(projectile); } }
protected bool PenetrationCheck(Projectiles.Projectile projectile, ushort armorThickness, float angle) { float penetrationMM = ((projectile.Velocity.magnitude * Mathf.Sqrt(projectile.Mass)) / (SHELL_SHAPE_AND_ARMOR_QUALITY_K * Mathf.Sqrt((float)projectile.FromTurret.GunsCaliber / 100f))) * 100f; float varianceMM = Mathf.Lerp(-Global.Penetration.PENETRATION_VARIANCE_MM, Global.Penetration.PENETRATION_VARIANCE_MM, SafeRandom.Range(0f, 1f)); float angleImpact = 1f - (Mathf.InverseLerp(0f, 90f, Mathf.Abs(90f - angle)) * Global.Penetration.MAX_PENETRATION_REDUCTION_FROM_ANGLE_PERCENTAGE); float appliedPenetrationMM = (penetrationMM + varianceMM) * angleImpact; if (appliedPenetrationMM > armorThickness) { return(true); } else { return(false); } }
public override void InflictDamage(DamageZone damageZone, Projectiles.Projectile projectile, DamageParams param = default) { GunTurret turret = ((GameObject)param.oparam[0]).GetComponent <GunTurret>(); if (PenetrationCheck(projectile, turret.TurretArmor, Vector3.Angle(damageZone.Ship.transform.forward, projectile.transform.forward))) { // Penetration effects EffectManager.InitProjectilePenEffect(projectile); damageZone.Ship.Rigidbody.AddForceAtPosition(projectile.Velocity * projectile.FromTurret.GunsCaliber * damageZone.Ship.Armament.GunTurrets[0].ShipRecoil, projectile.GetPreviousPosition(), ForceMode.Impulse); // Destroy Turret turret.Disable(); } else { // Bounce effects EffectManager.InitProjectileBounceEffect(projectile); } }
protected override void OnHit(RaycastHit hit, Projectiles.Projectile projectile, float damage) { Debug.Log("I took an arrow to the knee * " + damage); }
public abstract void InflictDamage( DamageZone damageZone, Projectiles.Projectile projectile, DamageParams param = default );