protected override void PrepareTileRequirements(ConstructionTileRequirements tileRequirements)
        {
            tileRequirements.Clear()
            //// do these checks if the bomb will have physics!
            //.Add(ConstructionTileRequirements.ValidatorClientOnlyNoCurrentPlayer)
            //.Add(ConstructionTileRequirements.ValidatorNoPhysicsBodyDynamic)
            .Add(new ConstructionTileRequirements.Validator(
                     ConstructionTileRequirements.ErrorNoFreeSpace,
                     c => !ConstructionTileRequirements.TileHasAnyPhysicsObjectsWhere(
                         c.Tile,
                         t =>
            {
                if (!t.PhysicsBody.IsStatic)
                {
                    // allow
                    return(false);
                }

                switch (t.PhysicsBody.AssociatedWorldObject
                        ?.ProtoWorldObject)
                {
                case IProtoObjectDeposit _:                                       // allow deposits
                case ObjectWallDestroyed _:                                       // allow destroyed walls
                    return(false);
                }

                return(true);
            })));
        }
Example #2
0
 protected override void PrepareTileRequirements(ConstructionTileRequirements tileRequirements)
 {
     tileRequirements
     .Clear()
     // skip this check as it's usually fine to drop the loot if player could stand there
     //.Add(ConstructionTileRequirements.ValidatorNoStaticObjectsExceptFloor)
     // validate no static physics objects there except destroyed walls and opened doors
     .Add(ConstructionTileRequirements.ValidatorSolidGroundOrPlatform)
     .Add(ConstructionTileRequirements.ValidatorNotCliffOrSlope)
     .Add(new ConstructionTileRequirements.Validator(
              ConstructionTileRequirements.ErrorCode.NoFreeSpace,
              c => !ConstructionTileRequirements.TileHasAnyPhysicsObjectsWhere(
                  c.Tile,
                  t => t.PhysicsBody.IsStatic
                  // allow destroyed walls physics in the tile
                  && t.PhysicsBody.AssociatedWorldObject
                  ?.ProtoWorldObject is not ObjectWallDestroyed
                  // allow opened doors in the tile
                  && !(t.PhysicsBody.AssociatedWorldObject
                       ?.ProtoWorldObject is ProtoObjectDoor &&
                       t.PhysicsBody.AssociatedWorldObject
                       .GetPublicState <ObjectDoorPublicState>().IsOpened))))
     // ensure no other loot containers
     .Add(new ConstructionTileRequirements.Validator(
              // ReSharper disable once CanExtractXamlLocalizableStringCSharp
              "Tile already has a loot container",
              c => !c.Tile.StaticObjects.Any(
                  so => so.ProtoStaticWorldObject is ObjectPlayerLootContainer)));
 }