protected override void ClientSetupExplosionBlueprint(Tile tile, IClientBlueprint blueprint) { ProcessExplosionDirection(-1, 0); // left ProcessExplosionDirection(0, 1); // top ProcessExplosionDirection(1, 0); // right ProcessExplosionDirection(0, -1); // bottom void ProcessExplosionDirection(int xOffset, int yOffset) { foreach (var(_, offsetIndex) in WeaponExplosionSystem.SharedEnumerateExplosionBombermanDirectionTilesWithTargets( positionEpicenter: tile.Position.ToVector2D(), damageDistanceFullDamage: DamageRadiusFullDamage, damageDistanceMax: DamageRadiusMax, Api.Client.World, xOffset, yOffset)) { var rectangle = new Rectangle() { Width = 1 * ScriptingConstants.TileSizeVirtualPixels - 10, Height = 1 * ScriptingConstants.TileSizeVirtualPixels - 10, StrokeThickness = 4 }; if (offsetIndex <= DamageRadiusFullDamage) { rectangle.Stroke = ExplosionBlueprintBorderBrushRed.Value; rectangle.Fill = ExplosionBlueprintFillBrushRed.Value; } else { switch (offsetIndex) { case 5: case 6: case 7: rectangle.Stroke = ExplosionBlueprintBorderBrushYellow.Value; rectangle.Fill = ExplosionBlueprintFillBrushYellow.Value; break; default: throw new Exception("Should be impossible"); } } // workaround for NoesisGUI rectangle.SetValue(Shape.StrokeDashArrayProperty, "2,1"); Api.Client.UI.AttachControl( blueprint.SceneObject, positionOffset: this.Layout.Center + (offsetIndex * xOffset, offsetIndex * yOffset), uiElement: rectangle, isFocusable: false, isScaleWithCameraZoom: true); } } }
protected override void ClientOnObjectDestroyed(Vector2D position) { //base.ClientOnObjectDestroyed(position); Logger.Important(this + " exploded at " + position); var explosionPresetNode = ExplosionPresets.PragmiumResonanceBomb_NodeClientOnly; var positionEpicenter = position + this.Layout.Center; ProcessExplosionDirection(-1, 0); // left ProcessExplosionDirection(0, 1); // top ProcessExplosionDirection(1, 0); // right ProcessExplosionDirection(0, -1); // bottom ExplosionHelper.ClientExplode(position: position + this.Layout.Center, this.ExplosionPreset, this.VolumeExplosion); void ProcessExplosionDirection(int xOffset, int yOffset) { foreach (var(_, offsetIndex) in WeaponExplosionSystem.SharedEnumerateExplosionBombermanDirectionTilesWithTargets( positionEpicenter: positionEpicenter, damageDistanceFullDamage: DamageRadiusFullDamage, damageDistanceMax: DamageRadiusMax, Api.Client.World, xOffset, yOffset)) { ClientTimersSystem.AddAction( delaySeconds: 0.1 * offsetIndex, // please note the offsetIndex is starting with 1 () => ExplosionHelper.ClientExplode( position: positionEpicenter + (offsetIndex * xOffset, offsetIndex * yOffset), explosionPresetNode, volume: 0)); } } }