public void PlayerHitByExplosion(ExplosionDamageInfo _expDmg) { ExplosionDamageInfo expDmg = _expDmg; DamageInfo dmg = expDmg.damageInfo; float exCoef = expDmg.playerDamageSheddat; if (bulHit_StateY == BulletHitCameraRotState.None) { InitBulRotY(dmg, exCoef); } if (bulHit_StateZ == BulletHitCameraRotState.None) { InitBulRotZ(dmg, exCoef); } }
public void Explode() { explosionPos = transform.position; DamageInfo dmg = new DamageInfo(); if (isItPlayerGrenade && PlayerCharacterNew.Instance != null) { dmg.damageSource = PlayerCharacterNew.Instance.gameObject; //dmg.damageSourcePosition = PlayerCharacterNew.Instance.gameObject.transform.position; dmg.damageSourcePosition = transform.position; } else { dmg.damageSource = this.gameObject; dmg.damageSourcePosition = transform.position; } dmg.damageType = DamageType.Explosion; // Collider[] colliders = Physics.OverlapSphere(explosionPos, Radius, ExplosionLayer); foreach (Collider hit in colliders) { Vector3 closestPoint = hit.ClosestPointOnBounds(explosionPos); if ((hit.transform.root.tag.ToLower() == GeneralStats.allyTagName_ToLower) || (hit.transform.root.tag.ToLower() == GeneralStats.enemyTagName_ToLower)) { closestPoint = hit.transform.root.position; } float distance = Vector3.Distance(closestPoint, explosionPos); float hitRatio = Mathf.Clamp01(damageCurve.Evaluate(1 - Mathf.Clamp01(distance / Radius))); dmg.damageAmount = hitRatio * DamageAmount; if ((hit.transform.root.tag.ToLower() == GeneralStats.allyTagName_ToLower) || (hit.transform.root.tag.ToLower() == GeneralStats.enemyTagName_ToLower)) { bool isSoldAddedBefore = false; foreach (ExplosionHittedSold ehs in hittedSolds) { if (ehs.datSold == hit.transform.root.gameObject) { isSoldAddedBefore = true; if (ehs.dmgAmount < dmg.damageAmount) { ehs.dmgAmount = dmg.damageAmount; } } } if (!isSoldAddedBefore) { ExplosionHittedSold ehs = new ExplosionHittedSold(); ehs.datSold = hit.transform.root.gameObject; ehs.dmgAmount = dmg.damageAmount; hittedSolds.Add(ehs); } } else { hit.SendMessageUpwards("ApplyDamage", dmg, SendMessageOptions.DontRequireReceiver); } } foreach (ExplosionHittedSold ehs in hittedSolds) { if (ehs != null) { dmg.damageAmount = ehs.dmgAmount; if (ehs.datSold != null) { ehs.datSold.SendMessage("ApplyDamage", dmg, SendMessageOptions.DontRequireReceiver); } } } // colliders = Physics.OverlapSphere(explosionPos, Radius, ExplosionLayer); foreach (Collider hit in colliders) { if (hit.rigidbody && hit.gameObject.layer.ToString() != "Player") { hit.rigidbody.AddExplosionForce(ForcePower, explosionPos, Radius); } } // if (PlayerCharacterNew.Instance != null) { PlayerCharacterNew player = PlayerCharacterNew.Instance; float playerDist = (player.transform.position - explosionPos).magnitude; float playerCameraShakeRange = Radius * PlayerCamShakeRadiusCoef; float playerCameraShake_MinDistToDoMaxShakeEee = playerCameraShakeRange * playerMinDistToDoMaxShakeCoefOfRadius; float sourat = playerCameraShakeRange - playerDist; float makhraj = playerCameraShakeRange - playerCameraShake_MinDistToDoMaxShakeEee; float result = Mathf.Clamp01(sourat / makhraj); ExplosionDamageInfo expDmgInf = new ExplosionDamageInfo(); expDmgInf.damageInfo = dmg; expDmgInf.playerDamageSheddat = result; player.SetExplosionEffectIsNeeded(expDmgInf, true); } }