Search in sources :

Example 6 with SimplePredicate

use of com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate in project Multiblocked by Low-Drag-MC.

the class ControllerBuilderWidget method updateScene.

@OnlyIn(Dist.CLIENT)
private void updateScene(JsonBlockPattern jsonPattern) {
    if (thread != null) {
        thread.interrupt();
        thread = null;
    }
    TrackedDummyWorld world = new TrackedDummyWorld();
    sceneWidget.createScene(world);
    ImageWidget imageWidget;
    sceneWidget.addWidget(imageWidget = new ImageWidget(0, 0, sceneWidget.getSize().width, sceneWidget.getSize().height));
    imageWidget.setVisible(jsonPattern.pattern.length * jsonPattern.pattern[0].length * jsonPattern.pattern[0][0].length() > 1000);
    thread = new Thread(() -> {
        int[] centerOffset = jsonPattern.getCenterOffset();
        String[][] pattern = jsonPattern.pattern;
        Set<BlockPos> posSet = new HashSet<>();
        int offset = Math.max(pattern.length, Math.max(pattern[0].length, pattern[0][0].length()));
        int sum = jsonPattern.pattern.length * jsonPattern.pattern[0].length * jsonPattern.pattern[0][0].length();
        AtomicDouble progress = new AtomicDouble(0);
        imageWidget.setImage(new TextTexture("multiblocked.gui.tips.building_scene").setSupplier(() -> I18n.get("multiblocked.gui.tips.building_scene") + String.format(" %.1f", progress.get()) + "%%").setWidth(sceneWidget.getSize().width));
        int count = 0;
        for (int i = 0; i < pattern.length; i++) {
            for (int j = 0; j < pattern[0].length; j++) {
                for (int k = 0; k < pattern[0][0].length(); k++) {
                    if (Thread.interrupted()) {
                        sceneWidget.waitToRemoved(imageWidget);
                        return;
                    }
                    count++;
                    progress.set(count * 100.0 / sum);
                    char symbol = pattern[i][j].charAt(k);
                    BlockPos pos = jsonPattern.getActualPosOffset(k - centerOffset[2], j - centerOffset[1], i - centerOffset[0], Direction.NORTH).offset(offset, offset, offset);
                    if (jsonPattern.symbolMap.containsKey(symbol)) {
                        List<BlockInfo> candidates = new ArrayList<>();
                        for (String s : jsonPattern.symbolMap.get(symbol)) {
                            SimplePredicate predicate = jsonPattern.predicates.get(s);
                            if (predicate instanceof PredicateComponent && ((PredicateComponent) predicate).definition != null) {
                                world.addBlock(pos, BlockInfo.fromBlock(MbdComponents.DummyComponentBlock));
                                DummyComponentTileEntity tileEntity = (DummyComponentTileEntity) world.getBlockEntity(pos);
                                assert tileEntity != null;
                                tileEntity.setDefinition(((PredicateComponent) predicate).definition);
                                tileEntity.isFormed = false;
                                tileEntity.setLevelAndPosition(world, pos);
                                posSet.add(pos);
                                break;
                            } else if (predicate != null && predicate.candidates != null) {
                                candidates.addAll(Arrays.asList(predicate.candidates.get()));
                            }
                        }
                        if (candidates.size() > 0) {
                            world.addBlock(pos, candidates.get(0));
                            posSet.add(pos);
                        }
                    }
                }
            }
        }
        Minecraft.getInstance().execute(() -> {
            sceneWidget.setRenderedCore(posSet, null);
            sceneWidget.waitToRemoved(imageWidget);
        });
        thread = null;
    });
    thread.start();
}
Also used : HashSet(java.util.HashSet) Set(java.util.Set) AtomicDouble(com.google.common.util.concurrent.AtomicDouble) TrackedDummyWorld(com.lowdragmc.lowdraglib.utils.TrackedDummyWorld) PredicateComponent(com.lowdragmc.multiblocked.api.pattern.predicates.PredicateComponent) SimplePredicate(com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate) TextTexture(com.lowdragmc.lowdraglib.gui.texture.TextTexture) BlockPos(net.minecraft.util.math.BlockPos) ArrayList(java.util.ArrayList) List(java.util.List) ImageWidget(com.lowdragmc.lowdraglib.gui.widget.ImageWidget) DummyComponentTileEntity(com.lowdragmc.multiblocked.api.tile.DummyComponentTileEntity) OnlyIn(net.minecraftforge.api.distmarker.OnlyIn)

Example 7 with SimplePredicate

use of com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate in project Multiblocked by Low-Drag-MC.

the class ControllerWidget method updateScene.

@OnlyIn(Dist.CLIENT)
private void updateScene(JsonBlockPattern jsonPattern) {
    if (thread != null) {
        thread.interrupt();
        thread = null;
    }
    TrackedDummyWorld world = new TrackedDummyWorld();
    tiles.clear();
    sceneWidget.createScene(world);
    ImageWidget imageWidget;
    sceneWidget.addWidget(imageWidget = new ImageWidget(0, 0, sceneWidget.getSize().width, sceneWidget.getSize().height));
    imageWidget.setVisible(jsonPattern.pattern.length * jsonPattern.pattern[0].length * jsonPattern.pattern[0][0].length() > 1000);
    thread = new Thread(() -> {
        int[] centerOffset = jsonPattern.getCenterOffset();
        String[][] pattern = jsonPattern.pattern;
        Set<BlockPos> posSet = new HashSet<>();
        int offset = Math.max(pattern.length, Math.max(pattern[0].length, pattern[0][0].length()));
        int sum = jsonPattern.pattern.length * jsonPattern.pattern[0].length * jsonPattern.pattern[0][0].length();
        AtomicDouble progress = new AtomicDouble(0);
        imageWidget.setImage(new TextTexture("building scene!").setSupplier(() -> "building scene! " + String.format("%.1f", progress.get()) + "%%").setWidth(sceneWidget.getSize().width));
        int count = 0;
        for (int i = 0; i < pattern.length; i++) {
            for (int j = 0; j < pattern[0].length; j++) {
                for (int k = 0; k < pattern[0][0].length(); k++) {
                    if (Thread.interrupted()) {
                        sceneWidget.waitToRemoved(imageWidget);
                        return;
                    }
                    count++;
                    progress.set(count * 100.0 / sum);
                    char symbol = pattern[i][j].charAt(k);
                    BlockPos pos = jsonPattern.getActualPosOffset(k - centerOffset[2], j - centerOffset[1], i - centerOffset[0], Direction.NORTH).offset(offset, offset, offset);
                    world.addBlock(pos, BlockInfo.fromBlockState(MbdComponents.DummyComponentBlock.defaultBlockState()));
                    DummyComponentTileEntity tileEntity = (DummyComponentTileEntity) world.getBlockEntity(pos);
                    ComponentDefinition definition = null;
                    assert tileEntity != null;
                    boolean disableFormed = false;
                    if (jsonPattern.symbolMap.containsKey(symbol)) {
                        Set<BlockInfo> candidates = new HashSet<>();
                        for (String s : jsonPattern.symbolMap.get(symbol)) {
                            SimplePredicate predicate = jsonPattern.predicates.get(s);
                            if (predicate instanceof PredicateComponent && ((PredicateComponent) predicate).definition != null) {
                                definition = ((PredicateComponent) predicate).definition;
                                disableFormed |= predicate.disableRenderFormed;
                                break;
                            } else if (predicate != null && predicate.candidates != null) {
                                candidates.addAll(Arrays.asList(predicate.candidates.get()));
                                disableFormed |= predicate.disableRenderFormed;
                            }
                        }
                        definition = TemplateBuilderWidget.getComponentDefinition(definition, candidates);
                    }
                    if (definition != null) {
                        tileEntity.setDefinition(definition);
                        if (disableFormed) {
                            definition.formedRenderer = new MBDBlockStateRenderer(Blocks.AIR.defaultBlockState());
                        }
                    }
                    tileEntity.isFormed = isFormed;
                    tileEntity.setLevelAndPosition(world, pos);
                    posSet.add(pos);
                    tiles.add(tileEntity);
                }
            }
        }
        Minecraft.getInstance().execute(() -> {
            sceneWidget.setRenderedCore(posSet, null);
            sceneWidget.waitToRemoved(imageWidget);
        });
        thread = null;
    });
    thread.start();
}
Also used : MBDBlockStateRenderer(com.lowdragmc.multiblocked.client.renderer.impl.MBDBlockStateRenderer) HashSet(java.util.HashSet) Set(java.util.Set) AtomicDouble(com.google.common.util.concurrent.AtomicDouble) TrackedDummyWorld(com.lowdragmc.lowdraglib.utils.TrackedDummyWorld) PredicateComponent(com.lowdragmc.multiblocked.api.pattern.predicates.PredicateComponent) SimplePredicate(com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate) TextTexture(com.lowdragmc.lowdraglib.gui.texture.TextTexture) BlockPos(net.minecraft.util.math.BlockPos) ImageWidget(com.lowdragmc.lowdraglib.gui.widget.ImageWidget) DummyComponentTileEntity(com.lowdragmc.multiblocked.api.tile.DummyComponentTileEntity) ComponentDefinition(com.lowdragmc.multiblocked.api.definition.ComponentDefinition) OnlyIn(net.minecraftforge.api.distmarker.OnlyIn)

Example 8 with SimplePredicate

use of com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate in project Multiblocked by Low-Drag-MC.

the class ControllerWidget method updateRegistryName.

@Override
protected void updateRegistryName(String s) {
    super.updateRegistryName(s);
    SimplePredicate predicate = pattern.predicates.get("controller");
    if (predicate instanceof PredicateComponent) {
        ((PredicateComponent) predicate).location = location;
    }
}
Also used : PredicateComponent(com.lowdragmc.multiblocked.api.pattern.predicates.PredicateComponent) SimplePredicate(com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate)

Example 9 with SimplePredicate

use of com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate in project Multiblocked by Low-Drag-MC.

the class BlockPattern method autoBuild.

public void autoBuild(PlayerEntity player, MultiblockState worldState) {
    World world = player.level;
    int minZ = -centerOffset[4];
    worldState.clean();
    ControllerTileEntity controller = worldState.getController();
    BlockPos centerPos = controller.getBlockPos();
    Direction facing = controller.getFrontFacing();
    Map<SimplePredicate, Integer> cacheGlobal = worldState.globalCount;
    Map<BlockPos, Object> blocks = new HashMap<>();
    blocks.put(centerPos, controller);
    for (int c = 0, z = minZ++, r; c < this.fingerLength; c++) {
        for (r = 0; r < aisleRepetitions[c][0]; r++) {
            for (int b = 0, y = -centerOffset[1]; b < this.thumbLength; b++, y++) {
                for (int a = 0, x = -centerOffset[0]; a < this.palmLength; a++, x++) {
                    TraceabilityPredicate predicate = this.blockMatches[c][b][a];
                    BlockPos pos = setActualRelativeOffset(x, y, z, facing).offset(centerPos.getX(), centerPos.getY(), centerPos.getZ());
                    worldState.update(pos, predicate);
                    if (!world.isEmptyBlock(pos)) {
                        blocks.put(pos, world.getBlockState(pos));
                        for (SimplePredicate limit : predicate.limited) {
                            limit.testLimited(worldState);
                        }
                    } else {
                        boolean find = false;
                        BlockInfo[] infos = new BlockInfo[0];
                        for (SimplePredicate limit : predicate.limited) {
                            if (limit.minCount > 0) {
                                if (!cacheGlobal.containsKey(limit)) {
                                    cacheGlobal.put(limit, 1);
                                } else if (cacheGlobal.get(limit) < limit.minCount && (limit.maxCount == -1 || cacheGlobal.get(limit) < limit.maxCount)) {
                                    cacheGlobal.put(limit, cacheGlobal.get(limit) + 1);
                                } else {
                                    continue;
                                }
                            } else {
                                continue;
                            }
                            infos = limit.candidates == null ? null : limit.candidates.get();
                            find = true;
                            break;
                        }
                        if (!find) {
                            // no limited
                            for (SimplePredicate limit : predicate.limited) {
                                if (limit.maxCount != -1 && cacheGlobal.getOrDefault(limit, Integer.MAX_VALUE) == limit.maxCount)
                                    continue;
                                if (cacheGlobal.containsKey(limit)) {
                                    cacheGlobal.put(limit, cacheGlobal.get(limit) + 1);
                                } else {
                                    cacheGlobal.put(limit, 1);
                                }
                                infos = ArrayUtils.addAll(infos, limit.candidates == null ? null : limit.candidates.get());
                            }
                            for (SimplePredicate common : predicate.common) {
                                infos = ArrayUtils.addAll(infos, common.candidates == null ? null : common.candidates.get());
                            }
                        }
                        List<ItemStack> candidates = new ArrayList<>();
                        if (infos != null) {
                            for (BlockInfo info : infos) {
                                if (info.getBlockState().getBlock() != Blocks.AIR) {
                                    BlockState blockState = info.getBlockState();
                                    if (blockState.getBlock() instanceof BlockComponent && ((BlockComponent) blockState.getBlock()).definition != null) {
                                        if (((BlockComponent) blockState.getBlock()).definition.baseRenderer instanceof CycleBlockStateRenderer) {
                                            CycleBlockStateRenderer renderer = (CycleBlockStateRenderer) ((BlockComponent) blockState.getBlock()).definition.baseRenderer;
                                            for (BlockInfo blockInfo : renderer.blockInfos) {
                                                candidates.add(blockInfo.getItemStackForm());
                                            }
                                        } else {
                                            candidates.add(info.getItemStackForm());
                                        }
                                    } else {
                                        candidates.add(info.getItemStackForm());
                                    }
                                }
                            }
                        }
                        // check inventory
                        ItemStack found = null;
                        if (!player.isCreative()) {
                            for (ItemStack itemStack : player.inventory.items) {
                                if (candidates.stream().anyMatch(candidate -> candidate.equals(itemStack, false)) && !itemStack.isEmpty() && itemStack.getItem() instanceof BlockItem) {
                                    found = itemStack.copy();
                                    itemStack.setCount(itemStack.getCount() - 1);
                                    break;
                                }
                            }
                        } else {
                            for (ItemStack candidate : candidates) {
                                found = candidate.copy();
                                if (!found.isEmpty() && found.getItem() instanceof BlockItem) {
                                    break;
                                }
                                found = null;
                            }
                        }
                        if (found == null)
                            continue;
                        BlockItem itemBlock = (BlockItem) found.getItem();
                        BlockItemUseContext context = new BlockItemUseContext(world, player, Hand.MAIN_HAND, found, BlockRayTraceResult.miss(player.getEyePosition(0), Direction.UP, pos));
                        itemBlock.place(context);
                        TileEntity tileEntity = world.getBlockEntity(pos);
                        if (tileEntity instanceof ComponentTileEntity) {
                            blocks.put(pos, tileEntity);
                        } else {
                            blocks.put(pos, world.getBlockState(pos));
                        }
                    }
                }
            }
            z++;
        }
    }
    Direction frontFacing = controller.getFrontFacing();
    blocks.forEach((pos, block) -> {
        // adjust facing
        if (block instanceof BlockState) {
            resetFacing(pos, (BlockState) block, frontFacing, (p, f) -> {
                Object object = blocks.get(p.relative(f));
                return object == null || (object instanceof BlockState && ((BlockState) object).getBlock() == Blocks.AIR);
            }, state -> world.setBlock(pos, state, 3));
        } else if (block instanceof ComponentTileEntity) {
            resetFacing(pos, ((ComponentTileEntity<?>) block).getBlockState(), frontFacing, (p, f) -> {
                Object object = blocks.get(p.relative(f));
                if (object == null || (object instanceof BlockState && ((BlockState) object).getBlock() == Blocks.AIR)) {
                    return ((ComponentTileEntity<?>) block).isValidFrontFacing(f);
                }
                return false;
            }, state -> world.setBlock(pos, state, 3));
        }
    });
}
Also used : PatternError(com.lowdragmc.multiblocked.api.pattern.error.PatternError) ComponentTileEntity(com.lowdragmc.multiblocked.api.tile.ComponentTileEntity) Array(java.lang.reflect.Array) BlockComponent(com.lowdragmc.multiblocked.api.block.BlockComponent) BiFunction(java.util.function.BiFunction) ArrayUtils(org.apache.commons.lang3.ArrayUtils) HashMap(java.util.HashMap) SinglePredicateError(com.lowdragmc.multiblocked.api.pattern.error.SinglePredicateError) Direction(net.minecraft.util.Direction) MultiblockCapability(com.lowdragmc.multiblocked.api.capability.MultiblockCapability) Supplier(java.util.function.Supplier) ControllerTileEntity(com.lowdragmc.multiblocked.api.tile.ControllerTileEntity) ArrayList(java.util.ArrayList) RelativeDirection(com.lowdragmc.multiblocked.api.pattern.util.RelativeDirection) HashSet(java.util.HashSet) ItemStack(net.minecraft.item.ItemStack) BlockInfo(com.lowdragmc.lowdraglib.utils.BlockInfo) Long2ObjectOpenHashMap(it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap) Map(java.util.Map) IO(com.lowdragmc.multiblocked.api.capability.IO) Hand(net.minecraft.util.Hand) BlockState(net.minecraft.block.BlockState) PatternStringError(com.lowdragmc.multiblocked.api.pattern.error.PatternStringError) PatternMatchContext(com.lowdragmc.multiblocked.api.pattern.util.PatternMatchContext) PlayerEntity(net.minecraft.entity.player.PlayerEntity) CycleBlockStateRenderer(com.lowdragmc.multiblocked.client.renderer.impl.CycleBlockStateRenderer) EnumMap(java.util.EnumMap) World(net.minecraft.world.World) IPartComponent(com.lowdragmc.multiblocked.api.tile.part.IPartComponent) Set(java.util.Set) BlockPos(net.minecraft.util.math.BlockPos) BlockItemUseContext(net.minecraft.item.BlockItemUseContext) Blocks(net.minecraft.block.Blocks) BlockRayTraceResult(net.minecraft.util.math.BlockRayTraceResult) Consumer(java.util.function.Consumer) List(java.util.List) LongOpenHashSet(it.unimi.dsi.fastutil.longs.LongOpenHashSet) BlockItem(net.minecraft.item.BlockItem) SimplePredicate(com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate) TileEntity(net.minecraft.tileentity.TileEntity) DirectionProperty(net.minecraft.state.DirectionProperty) BlockStateProperties(net.minecraft.state.properties.BlockStateProperties) HashMap(java.util.HashMap) Long2ObjectOpenHashMap(it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap) ArrayList(java.util.ArrayList) World(net.minecraft.world.World) Direction(net.minecraft.util.Direction) RelativeDirection(com.lowdragmc.multiblocked.api.pattern.util.RelativeDirection) BlockItem(net.minecraft.item.BlockItem) ControllerTileEntity(com.lowdragmc.multiblocked.api.tile.ControllerTileEntity) BlockItemUseContext(net.minecraft.item.BlockItemUseContext) ComponentTileEntity(com.lowdragmc.multiblocked.api.tile.ComponentTileEntity) ControllerTileEntity(com.lowdragmc.multiblocked.api.tile.ControllerTileEntity) TileEntity(net.minecraft.tileentity.TileEntity) BlockInfo(com.lowdragmc.lowdraglib.utils.BlockInfo) BlockPos(net.minecraft.util.math.BlockPos) CycleBlockStateRenderer(com.lowdragmc.multiblocked.client.renderer.impl.CycleBlockStateRenderer) SimplePredicate(com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate) BlockComponent(com.lowdragmc.multiblocked.api.block.BlockComponent) BlockState(net.minecraft.block.BlockState) ComponentTileEntity(com.lowdragmc.multiblocked.api.tile.ComponentTileEntity) ItemStack(net.minecraft.item.ItemStack)

Example 10 with SimplePredicate

use of com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate in project Multiblocked by Low-Drag-MC.

the class TraceabilityPredicate method setMaxGlobalLimited.

/**
 * Set the maximum number of candidate blocks.
 */
public TraceabilityPredicate setMaxGlobalLimited(int max) {
    limited.addAll(common);
    common.clear();
    for (SimplePredicate predicate : limited) {
        predicate.maxCount = max;
    }
    return this;
}
Also used : SimplePredicate(com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate)

Aggregations

SimplePredicate (com.lowdragmc.multiblocked.api.pattern.predicates.SimplePredicate)13 BlockPos (net.minecraft.util.math.BlockPos)7 ArrayList (java.util.ArrayList)6 HashSet (java.util.HashSet)6 List (java.util.List)6 Set (java.util.Set)6 BlockInfo (com.lowdragmc.lowdraglib.utils.BlockInfo)5 TrackedDummyWorld (com.lowdragmc.lowdraglib.utils.TrackedDummyWorld)4 ControllerTileEntity (com.lowdragmc.multiblocked.api.tile.ControllerTileEntity)4 HashMap (java.util.HashMap)4 OnlyIn (net.minecraftforge.api.distmarker.OnlyIn)4 TextTexture (com.lowdragmc.lowdraglib.gui.texture.TextTexture)3 ImageWidget (com.lowdragmc.lowdraglib.gui.widget.ImageWidget)3 BlockComponent (com.lowdragmc.multiblocked.api.block.BlockComponent)3 IO (com.lowdragmc.multiblocked.api.capability.IO)3 PredicateComponent (com.lowdragmc.multiblocked.api.pattern.predicates.PredicateComponent)3 ComponentTileEntity (com.lowdragmc.multiblocked.api.tile.ComponentTileEntity)3 CycleBlockStateRenderer (com.lowdragmc.multiblocked.client.renderer.impl.CycleBlockStateRenderer)3 Long2ObjectOpenHashMap (it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap)3 Map (java.util.Map)3