Search in sources :

Example 6 with AABB

use of org.spongepowered.api.util.AABB in project LanternServer by LanternPowered.

the class LanternWorld method getIntersectingBlockCollisionBoxes.

public Set<AABB> getIntersectingBlockCollisionBoxes(AABB box, @Nullable Predicate<Entity> filter) {
    checkNotNull(box, "box");
    final ImmutableSet.Builder<AABB> boxes = ImmutableSet.builder();
    int minY = box.getMin().getFloorY();
    final int maxY = box.getMax().getFloorY();
    if (minY >= LanternWorld.BLOCK_MAX.getY() || maxY < 0) {
        return boxes.build();
    }
    minY = Math.max(0, minY);
    final int maxX = box.getMax().getFloorX();
    final int minX = box.getMin().getFloorX();
    final int maxZ = box.getMax().getFloorZ();
    final int minZ = box.getMin().getFloorZ();
    final int maxChunkX = maxX >> 4;
    final int minChunkX = minX >> 4;
    final int maxChunkZ = maxZ >> 4;
    final int minChunkZ = minZ >> 4;
    final int maxChunkSection = maxY >> 4;
    final int minChunkSection = minY >> 4;
    for (int chunkX = minChunkX; chunkX <= maxChunkX; chunkX++) {
        for (int chunkZ = minChunkZ; chunkZ <= maxChunkZ; chunkZ++) {
            final LanternChunk chunk = getChunkManager().getChunkIfLoaded(chunkX, chunkZ);
            if (chunk == null) {
                continue;
            }
            final int startX = Math.max(minX, chunkX << 4);
            final int endX = Math.min(maxX, (chunkX << 4) | 0xf);
            final int startZ = Math.max(minZ, chunkZ << 4);
            final int endZ = Math.min(maxZ, (chunkZ << 4) | 0xf);
            for (int x = startX; x <= endX; x++) {
                for (int z = startZ; z <= endZ; z++) {
                    for (int y = minY; y <= maxY; y++) {
                        final Optional<AABB> boundingBox = chunk.getBlockSelectionBox(x, y, z);
                        if (boundingBox.isPresent() && boundingBox.get().intersects(box)) {
                            boxes.add(boundingBox.get());
                        }
                    }
                }
            }
            if (filter != null) {
                chunk.addIntersectingEntitiesBoxes(boxes, maxChunkSection, minChunkSection, box, filter);
            }
        }
    }
    return boxes.build();
}
Also used : ImmutableSet(com.google.common.collect.ImmutableSet) AABB(org.spongepowered.api.util.AABB) LanternChunk(org.lanternpowered.server.world.chunk.LanternChunk)

Example 7 with AABB

use of org.spongepowered.api.util.AABB in project LanternServer by LanternPowered.

the class LanternEntity method getBoundingBox.

@Override
public Optional<AABB> getBoundingBox() {
    AABB boundingBox = this.boundingBox;
    if (boundingBox == null && this.boundingBoxBase != null) {
        boundingBox = this.boundingBoxBase.offset(this.position);
        this.boundingBox = boundingBox;
    }
    return Optional.ofNullable(boundingBox);
}
Also used : AABB(org.spongepowered.api.util.AABB)

Example 8 with AABB

use of org.spongepowered.api.util.AABB in project LanternServer by LanternPowered.

the class LanternChunk method getIntersectingCollisionBoxes.

@Override
public Set<AABB> getIntersectingCollisionBoxes(Entity owner, AABB box) {
    checkNotNull(owner, "owner");
    checkNotNull(box, "box");
    final ImmutableSet.Builder<AABB> collisionBoxes = ImmutableSet.builder();
    final int maxYSection = fixEntityYSection(((int) Math.ceil(box.getMax().getY() + 2.0)) >> 4);
    final int minYSection = fixEntityYSection(((int) Math.floor(box.getMin().getY() - 2.0)) >> 4);
    for (int i = minYSection; i <= maxYSection; i++) {
        forEachEntity(i, entity -> {
            final Optional<AABB> aabb = entity.getBoundingBox();
            if (aabb.isPresent() && aabb.get().intersects(box)) {
                collisionBoxes.add(aabb.get());
            }
        });
    }
    final Vector3i min = box.getMin().toInt();
    final Vector3i max = box.getMax().toInt();
    for (int x = min.getX(); x <= max.getX(); x++) {
        for (int y = min.getY(); y <= max.getY(); y++) {
            for (int z = min.getZ(); z <= max.getZ(); z++) {
                final Optional<AABB> aabb = getBlockSelectionBox(x, y, z);
                if (aabb.isPresent() && aabb.get().intersects(box)) {
                    collisionBoxes.add(aabb.get());
                }
            }
        }
    }
    return collisionBoxes.build();
}
Also used : ImmutableSet(com.google.common.collect.ImmutableSet) Vector3i(com.flowpowered.math.vector.Vector3i) AABB(org.spongepowered.api.util.AABB)

Example 9 with AABB

use of org.spongepowered.api.util.AABB in project LanternServer by LanternPowered.

the class ChestInteractionBehavior method validateOpenableChestSpace.

static boolean validateOpenableChestSpace(BehaviorContext context, Location<World> loc, List<Runnable> tasks) {
    final Location<World> relLoc = loc.getBlockRelative(Direction.UP);
    final AABB relAabb = relLoc.getExtent().getBlockSelectionBox(relLoc.getBlockPosition()).orElse(null);
    if (relAabb != null) {
        AABB aabb = loc.getExtent().getBlockSelectionBox(loc.getBlockPosition()).get();
        aabb = aabb.offset(0, 1, 0);
        aabb = new AABB(aabb.getMin(), aabb.getMax().mul(1, 0, 1).add(0, aabb.getMin().getY() + 0.43, 0));
        if (aabb.intersects(relAabb)) {
            final ReplaceableProperty replaceableProperty = relLoc.getProperty(ReplaceableProperty.class).orElse(null);
            // Replaceable blocks will be replaced when opened
            if (replaceableProperty != null && replaceableProperty.getValue()) {
                tasks.add(() -> context.addBlockChange(BlockSnapshotBuilder.create().location(relLoc).blockState(BlockTypes.AIR.getDefaultState()).build()));
            // TODO: Use break block pipeline instead
            } else {
                return false;
            }
        }
    }
    return true;
}
Also used : ReplaceableProperty(org.spongepowered.api.data.property.block.ReplaceableProperty) World(org.spongepowered.api.world.World) AABB(org.spongepowered.api.util.AABB)

Example 10 with AABB

use of org.spongepowered.api.util.AABB 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

AABB (org.spongepowered.api.util.AABB)11 Vector3d (com.flowpowered.math.vector.Vector3d)3 ImmutableSet (com.google.common.collect.ImmutableSet)3 World (org.spongepowered.api.world.World)3 Vector3i (com.flowpowered.math.vector.Vector3i)2 CachedSimpleObjectProvider (org.lanternpowered.server.block.provider.CachedSimpleObjectProvider)2 ConstantObjectProvider (org.lanternpowered.server.block.provider.ConstantObjectProvider)2 SimpleObjectProvider (org.lanternpowered.server.block.provider.SimpleObjectProvider)2 BlockState (org.spongepowered.api.block.BlockState)2 ReplaceableProperty (org.spongepowered.api.data.property.block.ReplaceableProperty)2 Direction (org.spongepowered.api.util.Direction)2 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 Entity (net.minecraft.entity.Entity)1