Search in sources :

Example 1 with SolidCubeProperty

use of org.spongepowered.api.data.property.block.SolidCubeProperty in project LanternServer by LanternPowered.

the class DoorBehavior method tryPlace.

@Override
public BehaviorResult tryPlace(BehaviorPipeline<Behavior> pipeline, BehaviorContext context) {
    final Location<World> location = context.requireContext(ContextKeys.BLOCK_LOCATION);
    final Direction face = context.requireContext(ContextKeys.INTERACTION_FACE);
    // Door can only be placed by clicking in the floor
    if (face != Direction.DOWN) {
        return BehaviorResult.PASS;
    }
    final Location<World> down = location.getBlockRelative(Direction.DOWN);
    final SolidCubeProperty solidProp = down.getProperty(SolidCubeProperty.class).get();
    // The door must be placed on a solid block
    if (!solidProp.getValue()) {
        return BehaviorResult.PASS;
    }
    final Location<World> up = location.getBlockRelative(Direction.UP);
    final ReplaceableProperty replaceableProp = up.getProperty(ReplaceableProperty.class).get();
    if (!replaceableProp.getValue()) {
        return BehaviorResult.PASS;
    }
    final BlockSnapshot snapshot = context.getContext(ContextKeys.BLOCK_SNAPSHOT).orElseThrow(() -> new IllegalStateException("The BlockSnapshotRetrieveBehavior BlockSnapshot isn't present."));
    final BlockSnapshotBuilder builder = BlockSnapshotBuilder.create().from(snapshot);
    context.populateBlockSnapshot(builder, BehaviorContext.PopulationFlags.CREATOR_AND_NOTIFIER);
    Direction facing = Direction.NORTH;
    Vector3i left = Vector3i.UNIT_X;
    final Optional<Entity> optSource = context.first(Entity.class);
    if (optSource.isPresent()) {
        final Entity source = optSource.get();
        final Vector3d rotVector;
        if (source instanceof Living) {
            rotVector = ((Living) source).getHeadRotation();
        } else {
            rotVector = optSource.get().getRotation();
        }
        // Calculate the direction the entity is looking
        final Vector3d dir = Quaternions.fromAxesAnglesDeg(rotVector.mul(-1)).rotate(Vector3d.FORWARD);
        facing = Direction.getClosestHorizontal(dir, Direction.Division.CARDINAL);
        left = LEFT_ANGLE.rotate(facing.asOffset()).toInt();
        facing = facing.getOpposite();
    }
    builder.add(Keys.DIRECTION, facing);
    // TODO: Hinges
    context.addBlockChange(builder.location(location).build());
    context.addBlockChange(builder.add(LanternKeys.DOOR_HALF, LanternDoorHalf.UPPER).location(up).build());
    return BehaviorResult.SUCCESS;
}
Also used : Entity(org.spongepowered.api.entity.Entity) Living(org.spongepowered.api.entity.living.Living) SolidCubeProperty(org.spongepowered.api.data.property.block.SolidCubeProperty) BlockSnapshot(org.spongepowered.api.block.BlockSnapshot) World(org.spongepowered.api.world.World) Direction(org.spongepowered.api.util.Direction) Vector3d(com.flowpowered.math.vector.Vector3d) ReplaceableProperty(org.spongepowered.api.data.property.block.ReplaceableProperty) Vector3i(com.flowpowered.math.vector.Vector3i) BlockSnapshotBuilder(org.lanternpowered.server.block.BlockSnapshotBuilder)

Example 2 with SolidCubeProperty

use of org.spongepowered.api.data.property.block.SolidCubeProperty in project LanternServer by LanternPowered.

the class BlockTypeBuilderImpl method build.

@Override
public LanternBlockType build(String pluginId, String id) {
    MutableBehaviorPipeline<Behavior> behaviorPipeline = this.behaviorPipeline;
    if (behaviorPipeline == null) {
        behaviorPipeline = new MutableBehaviorPipelineImpl<>(Behavior.class, new ArrayList<>());
    } else {
        behaviorPipeline = new MutableBehaviorPipelineImpl<>(Behavior.class, new ArrayList<>(behaviorPipeline.getBehaviors()));
    }
    TranslationProvider translationProvider = this.translationProvider;
    if (translationProvider == null) {
        String path = "tile." + id + ".name";
        if (!pluginId.equals("minecraft")) {
            path = pluginId + '.' + path;
        }
        translationProvider = TranslationProvider.of(tr(path));
    }
    PropertyProviderCollection.Builder properties;
    if (this.propertiesBuilder != null) {
        properties = this.propertiesBuilder;
    } else {
        properties = PropertyProviderCollections.DEFAULT.toBuilder();
    }
    ExtendedBlockStateProvider extendedBlockStateProvider = this.extendedBlockStateProvider;
    if (extendedBlockStateProvider == null) {
        extendedBlockStateProvider = new ExtendedBlockStateProvider() {

            @Override
            public BlockState get(BlockState blockState, @Nullable Location<World> location, @Nullable Direction face) {
                return blockState;
            }

            @Override
            public BlockState remove(BlockState blockState) {
                return blockState;
            }
        };
    }
    final LanternBlockType blockType = new LanternBlockType(pluginId, id, this.traits, translationProvider, behaviorPipeline, this.tileEntityProvider, extendedBlockStateProvider);
    // Override the default solid cube property provider if necessary
    final PropertyProvider<SolidCubeProperty> provider = properties.build().get(SolidCubeProperty.class).orElse(null);
    ObjectProvider<AABB> boundingBoxProvider = this.boundingBoxProvider;
    if (boundingBoxProvider instanceof SimpleObjectProvider) {
        // noinspection unchecked
        boundingBoxProvider = new CachedSimpleObjectProvider(blockType, ((SimpleObjectProvider) boundingBoxProvider).getProvider());
    }
    // noinspection ConstantConditions
    if (provider instanceof ConstantObjectProvider && provider.get(null, null, null).getValue()) {
        if (boundingBoxProvider instanceof ConstantObjectProvider) {
            // noinspection ConstantConditions
            final AABB aabb = boundingBoxProvider.get(null, null, null);
            final boolean isSolid = isSolid(aabb);
            if (isSolid) {
                properties.add(solidCube(true));
                properties.add(solidSide(true));
            } else {
                properties.add(solidCube(false));
                final BitSet solidSides = compileSidePropertyBitSet(aabb);
                // Check if all the direction bits are set
                final byte[] bytes = solidSides.toByteArray();
                if (bytes.length == 0 || bytes[0] != (1 << DIRECTION_INDEXES) - 1) {
                    properties.add(solidSide((blockState, location, face) -> {
                        final int index = getDirectionIndex(face);
                        return index != -1 && solidSides.get(index);
                    }));
                } else {
                    properties.add(solidSide(false));
                }
            }
        } else if (boundingBoxProvider instanceof CachedSimpleObjectProvider) {
            final List<AABB> values = ((CachedSimpleObjectProvider<AABB>) boundingBoxProvider).getValues();
            final BitSet bitSet = new BitSet();
            int count = 0;
            for (int i = 0; i < values.size(); i++) {
                if (isSolid(values.get(i))) {
                    bitSet.set(i);
                    count++;
                }
            }
            final boolean flag1 = count == values.size();
            final boolean flag2 = count == 0;
            // Use the best possible solid cube property
            if (flag1) {
                properties.add(solidCube(true));
                properties.add(solidSide(false));
            } else if (flag2) {
                properties.add(solidCube(false));
            } else {
                properties.add(solidCube(((blockState, location, face) -> bitSet.get(((LanternBlockState) blockState).getInternalId()))));
            }
            if (!flag1) {
                final BitSet[] solidSides = new BitSet[values.size()];
                int solidCount = 0;
                for (int i = 0; i < values.size(); i++) {
                    solidSides[i] = compileSidePropertyBitSet(values.get(i));
                    // Check if all the direction bits are set
                    final byte[] bytes = solidSides[i].toByteArray();
                    if (bytes.length != 0 && bytes[0] == (1 << DIRECTION_INDEXES) - 1) {
                        solidCount++;
                    }
                }
                if (solidCount == 0) {
                    properties.add(solidSide(false));
                } else {
                    properties.add(solidSide((blockState, location, face) -> {
                        final int index = getDirectionIndex(face);
                        if (index == -1) {
                            return false;
                        }
                        final int state = ((LanternBlockState) blockState).getInternalId();
                        return solidSides[state].get(index);
                    }));
                }
            }
        } else {
            final ObjectProvider<AABB> boundingBoxProvider1 = boundingBoxProvider;
            properties.add(solidCube(((blockState, location, face) -> isSolid(boundingBoxProvider1.get(blockState, location, face)))));
            properties.add(solidSide(((blockState, location, face) -> isSideSolid(boundingBoxProvider1.get(blockState, location, face), face))));
        }
    }
    blockType.setBoundingBoxProvider(boundingBoxProvider);
    blockType.setPropertyProviderCollection(properties.build());
    if (this.defaultStateProvider != null) {
        blockType.setDefaultBlockState(this.defaultStateProvider.apply(blockType.getDefaultState()));
    }
    if (this.itemTypeBuilder != null) {
        final ItemType itemType = this.itemTypeBuilder.blockType(blockType).behaviors(pipeline -> {
            // Only add the default behavior if there isn't any interaction behavior present
            if (pipeline.pipeline(InteractWithItemBehavior.class).getBehaviors().isEmpty()) {
                pipeline.add(new InteractWithBlockItemBehavior());
            }
        }).build(blockType.getPluginId(), blockType.getName());
        blockType.setItemType(itemType);
    }
    return blockType;
}
Also used : PropertyProviders.solidSide(org.lanternpowered.server.block.provider.property.PropertyProviders.solidSide) BehaviorPipeline(org.lanternpowered.server.behavior.pipeline.BehaviorPipeline) Vector3d(com.flowpowered.math.vector.Vector3d) AABB(org.spongepowered.api.util.AABB) Behavior(org.lanternpowered.server.behavior.Behavior) InteractWithBlockItemBehavior(org.lanternpowered.server.item.behavior.simple.InteractWithBlockItemBehavior) Function(java.util.function.Function) Supplier(java.util.function.Supplier) BoundingBoxes(org.lanternpowered.server.block.aabb.BoundingBoxes) ArrayList(java.util.ArrayList) TileEntity(org.spongepowered.api.block.tileentity.TileEntity) ObjectProvider(org.lanternpowered.server.block.provider.ObjectProvider) PropertyProviderCollection(org.lanternpowered.server.block.provider.property.PropertyProviderCollection) InteractWithItemBehavior(org.lanternpowered.server.item.behavior.types.InteractWithItemBehavior) ItemTypeBuilderImpl(org.lanternpowered.server.item.ItemTypeBuilderImpl) SolidCubeProperty(org.spongepowered.api.data.property.block.SolidCubeProperty) BlockTrait(org.spongepowered.api.block.trait.BlockTrait) PropertyProvider(org.lanternpowered.server.block.provider.property.PropertyProvider) ConstantObjectProvider(org.lanternpowered.server.block.provider.ConstantObjectProvider) Nullable(javax.annotation.Nullable) Translation(org.spongepowered.api.text.translation.Translation) MutableBehaviorPipeline(org.lanternpowered.server.behavior.pipeline.MutableBehaviorPipeline) Location(org.spongepowered.api.world.Location) TranslationHelper.tr(org.lanternpowered.server.text.translation.TranslationHelper.tr) Preconditions.checkNotNull(com.google.common.base.Preconditions.checkNotNull) PropertyProviders.solidCube(org.lanternpowered.server.block.provider.property.PropertyProviders.solidCube) MutableBehaviorPipelineImpl(org.lanternpowered.server.behavior.pipeline.impl.MutableBehaviorPipelineImpl) PropertyProviderCollections(org.lanternpowered.server.block.provider.property.PropertyProviderCollections) CachedSimpleObjectProvider(org.lanternpowered.server.block.provider.CachedSimpleObjectProvider) LanternTileEntityType(org.lanternpowered.server.block.tile.LanternTileEntityType) BlockState(org.spongepowered.api.block.BlockState) Consumer(java.util.function.Consumer) LanternBlockState(org.lanternpowered.server.block.state.LanternBlockState) ItemTypeBuilder(org.lanternpowered.server.item.ItemTypeBuilder) Direction(org.spongepowered.api.util.Direction) TileEntityType(org.spongepowered.api.block.tileentity.TileEntityType) List(java.util.List) SimpleObjectProvider(org.lanternpowered.server.block.provider.SimpleObjectProvider) World(org.spongepowered.api.world.World) BitSet(java.util.BitSet) ItemType(org.spongepowered.api.item.ItemType) InteractWithBlockItemBehavior(org.lanternpowered.server.item.behavior.simple.InteractWithBlockItemBehavior) PropertyProviderCollection(org.lanternpowered.server.block.provider.property.PropertyProviderCollection) SolidCubeProperty(org.spongepowered.api.data.property.block.SolidCubeProperty) ItemType(org.spongepowered.api.item.ItemType) ArrayList(java.util.ArrayList) World(org.spongepowered.api.world.World) Direction(org.spongepowered.api.util.Direction) CachedSimpleObjectProvider(org.lanternpowered.server.block.provider.CachedSimpleObjectProvider) ArrayList(java.util.ArrayList) List(java.util.List) Behavior(org.lanternpowered.server.behavior.Behavior) InteractWithBlockItemBehavior(org.lanternpowered.server.item.behavior.simple.InteractWithBlockItemBehavior) InteractWithItemBehavior(org.lanternpowered.server.item.behavior.types.InteractWithItemBehavior) BitSet(java.util.BitSet) LanternBlockState(org.lanternpowered.server.block.state.LanternBlockState) CachedSimpleObjectProvider(org.lanternpowered.server.block.provider.CachedSimpleObjectProvider) SimpleObjectProvider(org.lanternpowered.server.block.provider.SimpleObjectProvider) InteractWithItemBehavior(org.lanternpowered.server.item.behavior.types.InteractWithItemBehavior) BlockState(org.spongepowered.api.block.BlockState) LanternBlockState(org.lanternpowered.server.block.state.LanternBlockState) ConstantObjectProvider(org.lanternpowered.server.block.provider.ConstantObjectProvider) ObjectProvider(org.lanternpowered.server.block.provider.ObjectProvider) ConstantObjectProvider(org.lanternpowered.server.block.provider.ConstantObjectProvider) CachedSimpleObjectProvider(org.lanternpowered.server.block.provider.CachedSimpleObjectProvider) SimpleObjectProvider(org.lanternpowered.server.block.provider.SimpleObjectProvider) AABB(org.spongepowered.api.util.AABB)

Aggregations

Vector3d (com.flowpowered.math.vector.Vector3d)2 SolidCubeProperty (org.spongepowered.api.data.property.block.SolidCubeProperty)2 Direction (org.spongepowered.api.util.Direction)2 World (org.spongepowered.api.world.World)2 Vector3i (com.flowpowered.math.vector.Vector3i)1 Preconditions.checkNotNull (com.google.common.base.Preconditions.checkNotNull)1 ArrayList (java.util.ArrayList)1 BitSet (java.util.BitSet)1 List (java.util.List)1 Consumer (java.util.function.Consumer)1 Function (java.util.function.Function)1 Supplier (java.util.function.Supplier)1 Nullable (javax.annotation.Nullable)1 Behavior (org.lanternpowered.server.behavior.Behavior)1 BehaviorPipeline (org.lanternpowered.server.behavior.pipeline.BehaviorPipeline)1 MutableBehaviorPipeline (org.lanternpowered.server.behavior.pipeline.MutableBehaviorPipeline)1 MutableBehaviorPipelineImpl (org.lanternpowered.server.behavior.pipeline.impl.MutableBehaviorPipelineImpl)1 BlockSnapshotBuilder (org.lanternpowered.server.block.BlockSnapshotBuilder)1 BoundingBoxes (org.lanternpowered.server.block.aabb.BoundingBoxes)1 CachedSimpleObjectProvider (org.lanternpowered.server.block.provider.CachedSimpleObjectProvider)1