public void Detonate() { item.Destroy(); item.World.AddEffect(new ExplosionSource(item.World, item.Position, 6)); foreach (var offset in Main.GetWithin(type.explosionRadius)) { var pos = item.Position + offset; var displacement = pos - item.Position; var dist2 = displacement.Magnitude2; var radius2 = type.explosionRadius * type.explosionRadius; if (dist2 > radius2) { continue; } foreach (var hit in item.World.entities[pos]) { if (hit is ICharacter d && hit != item) { var multiplier = (radius2 - displacement.Magnitude2) / radius2; ExplosionDamage damage = new ExplosionDamage() { damage = (int)(type.explosionDamage * multiplier), knockback = displacement.Normal * type.explosionForce * multiplier }; d.OnDamaged(damage); } } } }