private void Trigger(ExplosionInstance explosionInstance) { if (mCanBeTriggeredByExplosion) { Ignite(); } }
public void Explode(ExplosionInstance explosionInstance) { foreach (Chunk chunk in Chunks) { chunk.Explode(explosionInstance); } }
private void OnTriggered(ExplosionInstance explosionInstance) { if (!explosionInstance.ExplosionData.Friendly && Owner.OverrideController.IsOverrideEnabled(Owner.OverrideController.CurrentOverrides.CanBeHurt)) { mHealth -= explosionInstance.ExplosionData.Damage; if (mHealth <= 0.0f) { OnKilled?.Invoke(Owner); Destroy(gameObject); } } }
public void Explode(ExplosionInstance explosionInstance) { bool dirty = false; for (int y = 0; y < mChunkSettings.NumberOfRows; ++y) { for (int x = 0; x < mChunkSettings.NumberOfColumns; ++x) { for (int z = 0; z < mChunkSettings.NumberOfLayers; ++z) { int tileId = GetTileId(x, y, z); bool isIndistructible = mChunkSettings.TileData[tileId].IsIndestructible; if (isIndistructible) { continue; } Vector3 tilePosition = GetTileWorldPosition(x, y, z); float distance = Vector3.Distance(tilePosition, explosionInstance.Position); if (distance <= explosionInstance.ExplosionData.Radius) { int index = x + y * mChunkSettings.NumberOfColumns + z * mChunkSettings.NumberOfColumns * mChunkSettings.NumberOfRows; mTileHealths[index] -= explosionInstance.ExplosionData.Damage; if (mTileHealths[index] <= 0) { OnTileDestroyed(tilePosition, tileId, mTileDepth[index], mTileVariant[index], explosionInstance); SetTile(x, y, z, 0); dirty = true; } } } } } if (dirty) { Sanitize(); ResetData(); CalculateTileDepth(); GenerateMeshData(); GenerateColliderData(); Build(); } }
public void Explode(ExplosionInstance explosionInstance) { mChunkControllerInstance.Explode(explosionInstance); Collider[] colliders = Physics.OverlapSphere(explosionInstance.Position, explosionInstance.ExplosionData.Radius); foreach (Collider collider in colliders) { Triggerable triggerable = collider.gameObject.GetComponent <Triggerable>(); if (triggerable != null) { triggerable.Trigger(explosionInstance); if (triggerable.HasPhysics == true) { Vector3 delta = collider.transform.position - explosionInstance.Position; float distance = delta.magnitude; if (distance <= explosionInstance.ExplosionData.Radius) { triggerable.ApplyConstantVelocityOverTime(explosionInstance.ExplosionData.Knockback, delta.normalized, 0.5f); } } } } }
public void Trigger(ExplosionInstance explosionInstance) { OnTriggered?.Invoke(explosionInstance); }
private void OnTileDestroyed(Vector3 tilePosition, int tileId, int depth, int variant, ExplosionInstance explosionInstance) { const int SPLITS = 2; for (int x = 0; x < SPLITS; ++x) { float positionX = tilePosition.x - (SPLITS == 1 ? 0 : (mChunkSettings.TileSize / (SPLITS * 2) - x * mChunkSettings.TileSize / SPLITS)); for (int y = 0; y < SPLITS; ++y) { float positionY = tilePosition.y - (SPLITS == 1 ? 0 : (mChunkSettings.TileSize / (SPLITS * 2) - y * mChunkSettings.TileSize / SPLITS)); for (int z = 0; z < SPLITS; ++z) { float positionZ = tilePosition.z - (SPLITS == 1 ? 0 : (mChunkSettings.TileSize / (SPLITS * 2) - z * mChunkSettings.TileSize / SPLITS)); Vector3 spawnPosition = new Vector3(positionX, positionY, positionZ); GameObject debrisObject = Instantiate(mDebrisPrefab); debrisObject.transform.position = spawnPosition; debrisObject.transform.localScale = Vector3.one * mChunkSettings.TileSize / SPLITS; MeshRenderer debrisMeshRenderer = debrisObject.GetComponent <MeshRenderer>(); debrisMeshRenderer.material = mChunkSettings.GetMaterial(tileId, depth, variant); debrisMeshRenderer.material.color = mChunkSettings.TileData[tileId].TileColor; Rigidbody debrisRigidbody = debrisObject.GetComponent <Rigidbody>(); Vector3 alignedExplosionSource = new Vector3(explosionInstance.Position.x, explosionInstance.Position.y, spawnPosition.z); Vector3 delta = spawnPosition - alignedExplosionSource; float distance = delta.magnitude; float falloff = 1.0f - (distance / explosionInstance.ExplosionData.Radius); float force = 10.0f * falloff * Random.Range(0.25f, 1.0f); float forceZ = Random.Range(force / 2, -force / 2); debrisRigidbody.velocity += delta.normalized * force + Vector3.up * force + Vector3.forward * forceZ; debrisRigidbody.angularVelocity += Random.onUnitSphere * force; Destroy(debrisObject, 3.0f); } } } }