Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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);
 }
Пример #4
0
 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);
 }
Пример #5
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 expecting that they will be not damaged when they stand outside the circles.
         collisionGroups: new[] { CollisionGroup.Default });
 }
Пример #6
0
        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));
                }
            }
        }
Пример #7
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);
        }