diff --git a/common/src/main/java/dev/dubhe/anvilcraft/block/entity/AutoCrafterBlockEntity.java b/common/src/main/java/dev/dubhe/anvilcraft/block/entity/AutoCrafterBlockEntity.java index f17febf01..63536a645 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/block/entity/AutoCrafterBlockEntity.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/block/entity/AutoCrafterBlockEntity.java @@ -1,6 +1,7 @@ package dev.dubhe.anvilcraft.block.entity; import dev.architectury.injectables.annotations.ExpectPlatform; +import dev.dubhe.anvilcraft.AnvilCraft; import dev.dubhe.anvilcraft.api.depository.FilteredItemDepository; import dev.dubhe.anvilcraft.api.depository.IItemDepository; import dev.dubhe.anvilcraft.api.depository.ItemDepositoryHelper; @@ -51,6 +52,7 @@ public void onContentsChanged(int slot) { setChanged(); } }; + private int cooldown = AnvilCraft.config.autoCrafterCooldown; private final CraftingContainer craftingContainer = new CraftingContainer() { @Override public int getWidth() { @@ -125,6 +127,7 @@ public void fillStackedContents(StackedContents contents) { } }; + public AutoCrafterBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { super(type, pos, blockState); } @@ -144,10 +147,25 @@ public void tick(@NotNull Level level, BlockPos pos) { if (state.getValue(AutoCrafterBlock.LIT)) craft(level); } + private boolean canCraft() { + if (cooldown > 0) return false; + if (!depository.isFilterEnabled()) return true; + for (int i = 0; i < depository.getSlots(); i++) { + if (depository.getStack(i).isEmpty()) return false; + if (!depository.isSlotDisabled(i) && depository.getStack(i).isEmpty()) return false; + } + return true; + } + @SuppressWarnings("UnreachableCode") private void craft(@NotNull Level level) { - ItemStack result; if (craftingContainer.isEmpty()) return; + if (cooldown <= 0) { + cooldown = AnvilCraft.config.autoCrafterCooldown; + } + cooldown--; + if (!canCraft()) return; + ItemStack result; Optional cacheOptional = cache.stream().filter(recipe -> recipe.test(craftingContainer)).findFirst(); Optional optional; NonNullList remaining; @@ -211,12 +229,14 @@ private void craft(@NotNull Level level) { public void load(@NotNull CompoundTag tag) { super.load(tag); depository.deserializeNBT(tag.getCompound("Inventory")); + cooldown = tag.getInt("Cooldown"); } @Override protected void saveAdditional(@NotNull CompoundTag tag) { super.saveAdditional(tag); tag.put("Inventory", this.depository.serializeNBT()); + tag.putInt("Cooldown", cooldown); } @Override @@ -296,7 +316,7 @@ private void spawnItemEntity(ItemStack stack) { Vec3 center = getBlockPos().relative(getDirection()).getCenter(); Vector3f step = getDirection().step(); ItemEntity itemEntity = new ItemEntity( - getLevel(), center.x - step.x / 2, center.y - step.y / 2, center.z - step.z / 2, + getLevel(), center.x, center.y, center.z, stack, 0.25 * step.x, 0.25 * step.y, 0.25 * step.z ); diff --git a/common/src/main/java/dev/dubhe/anvilcraft/block/entity/ChuteBlockEntity.java b/common/src/main/java/dev/dubhe/anvilcraft/block/entity/ChuteBlockEntity.java index 41387834f..161955e0f 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/block/entity/ChuteBlockEntity.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/block/entity/ChuteBlockEntity.java @@ -113,6 +113,8 @@ public void tick() { // TODO: 尝试吸取上方 ItemEntity List itemEntities = getLevel().getEntitiesOfClass(ItemEntity.class, new AABB(getBlockPos().relative(Direction.UP)), itemEntity -> !itemEntity.getItem().isEmpty()); for (ItemEntity itemEntity : itemEntities) { + ItemStack remaining = ItemDepositoryHelper.insertItem(depository, itemEntity.getItem(), true); + if (!remaining.isEmpty()) continue; ItemDepositoryHelper.insertItem(depository, itemEntity.getItem(), false); itemEntity.kill(); break; diff --git a/common/src/main/java/dev/dubhe/anvilcraft/config/AnvilCraftConfig.java b/common/src/main/java/dev/dubhe/anvilcraft/config/AnvilCraftConfig.java index 9db70479a..c88003d14 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/config/AnvilCraftConfig.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/config/AnvilCraftConfig.java @@ -43,4 +43,9 @@ public class AnvilCraftConfig implements ConfigData { @ConfigEntry.Gui.Tooltip @ConfigEntry.BoundedDiscrete(max = 64, min = 1) public int chuteMaxCooldown = 4; + + @Comment("Maximum cooldown time of auto crafter (in ticks)") + @ConfigEntry.Gui.Tooltip + @ConfigEntry.BoundedDiscrete(max = 64, min = 1) + public int autoCrafterCooldown = 20; } \ No newline at end of file diff --git a/common/src/main/java/dev/dubhe/anvilcraft/data/generator/lang/ConfigScreenLang.java b/common/src/main/java/dev/dubhe/anvilcraft/data/generator/lang/ConfigScreenLang.java index b1a9897bf..52a8c0550 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/data/generator/lang/ConfigScreenLang.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/data/generator/lang/ConfigScreenLang.java @@ -31,5 +31,8 @@ public static void init(RegistrateLangProvider provider) { provider.add(OPTION_STRING.formatted(AnvilCraft.MOD_ID, "chuteMaxCooldown"), "Chute Max Cooldown"); provider.add(OPTION_TOOLTIP_STRING.formatted(AnvilCraft.MOD_ID, "chuteMaxCooldown"), "Maximum distance of chute"); + + provider.add(OPTION_STRING.formatted(AnvilCraft.MOD_ID, "autoCrafterCooldown"), "Auto Crafter Cooldown"); + provider.add(OPTION_TOOLTIP_STRING.formatted(AnvilCraft.MOD_ID, "autoCrafterCooldown"), "Maximum cooldown time of auto crafter (in ticks)"); } }