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 virtual void ServerExecuteVehicleExplosion( Vector2D positionEpicenter, IPhysicsSpace physicsSpace, WeaponFinalCache weaponFinalCache) { WeaponExplosionSystem.ServerProcessExplosionCircle( positionEpicenter: positionEpicenter, physicsSpace: physicsSpace, damageDistanceMax: this.DestroyedVehicleDamageRadius, weaponFinalCache: weaponFinalCache, damageOnlyDynamicObjects: false, isDamageThroughObstacles: false, callbackCalculateDamageCoefByDistanceForStaticObjects: CalcDamageCoefByDistance, callbackCalculateDamageCoefByDistanceForDynamicObjects: CalcDamageCoefByDistance); double CalcDamageCoefByDistance(double distance) { var distanceThreshold = 0.5; if (distance <= distanceThreshold) { return(1); } distance -= distanceThreshold; distance = Math.Max(0, distance); var maxDistance = this.DestroyedVehicleDamageRadius; maxDistance -= distanceThreshold; maxDistance = Math.Max(0, maxDistance); return(1 - Math.Min(distance / maxDistance, 1)); } }
protected virtual void ServerExecuteExplosion( Vector2D positionEpicenter, IPhysicsSpace physicsSpace, WeaponFinalCache weaponFinalCache) { WeaponExplosionSystem.ServerProcessExplosionCircle( positionEpicenter: positionEpicenter, physicsSpace: physicsSpace, damageDistanceMax: this.DamageRadius, weaponFinalCache: weaponFinalCache, damageOnlyDynamicObjects: false, callbackCalculateDamageCoefByDistance: this.ServerCalculateDamageCoefByDistance); }
protected override void ServerExecuteExplosion( Vector2D positionEpicenter, IPhysicsSpace physicsSpace, WeaponFinalCache weaponFinalCache) { WeaponExplosionSystem.ServerProcessExplosionBomberman( positionEpicenter: positionEpicenter, physicsSpace: physicsSpace, damageDistanceFullDamage: DamageRadiusFullDamage, damageDistanceMax: DamageRadiusMax, damageDistanceDynamicObjectsOnly: DamageRadiusDynamicObjectsOnly, weaponFinalCache: weaponFinalCache, callbackCalculateDamageCoefByDistanceForStaticObjects: this.ServerCalculateDamageCoefByDistance, callbackCalculateDamageCoefByDistanceForDynamicObjects: ServerCalculateDamageCoefByDistanceForDynamicObjects); }
public override void ServerExecuteExplosion( Vector2D positionEpicenter, IPhysicsSpace physicsSpace, WeaponFinalCache weaponFinalCache) { WeaponExplosionSystem.ServerProcessExplosionCircle( positionEpicenter: positionEpicenter, physicsSpace: physicsSpace, damageDistanceMax: this.DamageRadius, weaponFinalCache: weaponFinalCache, damageOnlyDynamicObjects: true, isDamageThroughObstacles: this.IsDamageThroughObstacles, callbackCalculateDamageCoefByDistanceForStaticObjects: this.ServerCalculateDamageCoefByDistanceForStaticObjects, callbackCalculateDamageCoefByDistanceForDynamicObjects: this .ServerCalculateDamageCoefByDistanceForDynamicObjects, // Missiles are falling from the sky and the explosion circles are clearly designated. // Players expecting that they will be not damaged when they stand outside the circles. collisionGroups: new[] { CollisionGroup.Default }); }
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)); } } }
public override void ServerExecuteExplosion( Vector2D positionEpicenter, IPhysicsSpace physicsSpace, WeaponFinalCache weaponFinalCache) { WeaponExplosionSystem.ServerProcessExplosionCircle( positionEpicenter: positionEpicenter, physicsSpace: physicsSpace, damageDistanceMax: this.DamageRadius, weaponFinalCache: weaponFinalCache, damageOnlyDynamicObjects: true, isDamageThroughObstacles: this.IsDamageThroughObstacles, callbackCalculateDamageCoefByDistanceForStaticObjects: this.ServerCalculateDamageCoefByDistanceForStaticObjects, callbackCalculateDamageCoefByDistanceForDynamicObjects: this .ServerCalculateDamageCoefByDistanceForDynamicObjects, // Missiles are falling from the sky and the explosion circles are clearly designated. // Players are expecting that they will be not damaged when they stand outside the circles. collisionGroups: new[] { CollisionGroups.Default }); // this is only for hoverboards as hoverboards on the ground have no physical collider WeaponExplosionSystem.ServerProcessExplosionCircle( positionEpicenter: positionEpicenter, physicsSpace: physicsSpace, damageDistanceMax: this.DamageRadius, weaponFinalCache: weaponFinalCache, damageOnlyDynamicObjects: true, isDamageThroughObstacles: this.IsDamageThroughObstacles, callbackCalculateDamageCoefByDistanceForStaticObjects: this.ServerCalculateDamageCoefByDistanceForStaticObjects, callbackCalculateDamageCoefByDistanceForDynamicObjects: this .ServerCalculateDamageCoefByDistanceForDynamicObjects, // this is only for hoverboards collisionGroups: new[] { CollisionGroups.HitboxMelee }, // can damage only hoverboards filterCanDamage: worldObject => worldObject.ProtoGameObject is IProtoVehicleHoverboard); }