Skip to content

Commit 325eb80

Browse files
authored
Merge pull request #896 from Gu-ZT/releases/1.20.1
实现Emi拖拽设置过滤
2 parents 6cc1f59 + cbf7626 commit 325eb80

15 files changed

+133
-30
lines changed

common/src/main/java/dev/dubhe/anvilcraft/api/depository/FilteredItemDepository.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
public class FilteredItemDepository extends ItemDepository {
2020

2121
public static final Codec<FilteredItemDepository> CODEC = RecordCodecBuilder.create(ins -> ins.group(
22-
Codec.BOOL.fieldOf("filterEnabled").forGetter(o -> o.filterEnabled),
23-
ItemStack.CODEC.listOf().fieldOf("filteredItems").forGetter(o -> o.filteredItems),
24-
Codec.BOOL.listOf().fieldOf("disabled").forGetter(o -> o.disabled)
22+
Codec.BOOL.fieldOf("filterEnabled").forGetter(o -> o.filterEnabled),
23+
ItemStack.CODEC.listOf().fieldOf("filteredItems").forGetter(o -> o.filteredItems),
24+
Codec.BOOL.listOf().fieldOf("disabled").forGetter(o -> o.disabled)
2525
).apply(ins, FilteredItemDepository::new));
2626

2727
private boolean filterEnabled = false;
@@ -140,10 +140,12 @@ public boolean isFiltered(int slot, ItemStack stack) {
140140
* @param slot 槽位
141141
* @param stack 过滤物品堆栈(不检查NBT)
142142
*/
143-
public void setFilter(int slot, @NotNull ItemStack stack) {
144-
if (stack.isEmpty()) return;
143+
public boolean setFilter(int slot, @NotNull ItemStack stack) {
144+
if (slot < 0 || slot >= this.filteredItems.size()) return false;
145+
if (stack.isEmpty()) return false;
145146
this.setSlotDisabled(slot, false);
146147
this.filteredItems.set(slot, new ItemStack(stack.getItem(), 1));
148+
return true;
147149
}
148150

149151
/**
@@ -203,18 +205,18 @@ public void deserializeNbt(@NotNull CompoundTag tag) {
203205
*/
204206
public CompoundTag serializeFiltering() {
205207
return (CompoundTag) CODEC.encodeStart(NbtOps.INSTANCE, this)
206-
.getOrThrow(false, e -> {
207-
});
208+
.getOrThrow(false, e -> {
209+
});
208210
}
209211

210212
/**
211213
*
212214
*/
213215
public void deserializeFiltering(@NotNull CompoundTag tag) {
214216
FilteredItemDepository depository = CODEC.decode(NbtOps.INSTANCE, tag)
215-
.getOrThrow(false, s -> {
216-
})
217-
.getFirst();
217+
.getOrThrow(false, s -> {
218+
})
219+
.getFirst();
218220
if (this.getSize() != depository.getSize()) throw new IllegalArgumentException("Depository size mismatch");
219221
this.filterEnabled = tag.getBoolean("filterEnabled");
220222
int size = depository.filteredItems.size();

common/src/main/java/dev/dubhe/anvilcraft/block/entity/IFilterBlockEntity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ default ItemStack getFilter(int slot) {
7676
* @param slot 槽位
7777
* @param filter 过滤
7878
*/
79-
default void setFilter(int slot, ItemStack filter) {
80-
this.getFilteredItemDepository().setFilter(slot, filter);
79+
default boolean setFilter(int slot, ItemStack filter) {
80+
return this.getFilteredItemDepository().setFilter(slot, filter);
8181
}
8282
}

common/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/inventory/AutoCrafterScreen.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import dev.dubhe.anvilcraft.api.depository.ItemDepositorySlot;
55
import dev.dubhe.anvilcraft.client.gui.component.EnableFilterButton;
66
import dev.dubhe.anvilcraft.inventory.AutoCrafterMenu;
7-
import dev.dubhe.anvilcraft.inventory.IFilterMenu;
87
import dev.dubhe.anvilcraft.network.SlotDisableChangePack;
98
import lombok.Getter;
109
import net.minecraft.client.gui.GuiGraphics;
@@ -17,7 +16,7 @@
1716

1817
import java.util.function.BiFunction;
1918

20-
public class AutoCrafterScreen extends BaseMachineScreen<AutoCrafterMenu> implements IFilterScreen {
19+
public class AutoCrafterScreen extends BaseMachineScreen<AutoCrafterMenu> implements IFilterScreen<AutoCrafterMenu> {
2120
private static final ResourceLocation CONTAINER_LOCATION =
2221
AnvilCraft.of("textures/gui/container/machine/background/auto_crafter.png");
2322
BiFunction<Integer, Integer, EnableFilterButton> enableFilterButtonSupplier = this
@@ -67,7 +66,7 @@ protected void renderSlotTooltip(@NotNull GuiGraphics guiGraphics, int x, int y)
6766
}
6867

6968
@Override
70-
public IFilterMenu getFilterMenu() {
69+
public AutoCrafterMenu getFilterMenu() {
7170
return this.menu;
7271
}
7372

@@ -92,4 +91,14 @@ protected void slotClicked(@NotNull Slot slot, int slotId, int mouseButton, @Not
9291
}
9392
super.slotClicked(slot, slotId, mouseButton, type);
9493
}
94+
95+
@Override
96+
public int getOffsetX() {
97+
return (this.width - this.imageWidth) / 2;
98+
}
99+
100+
@Override
101+
public int getOffsetY() {
102+
return (this.height - this.imageHeight) / 2;
103+
}
95104
}

common/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/inventory/ChuteScreen.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import dev.dubhe.anvilcraft.api.depository.ItemDepositorySlot;
66
import dev.dubhe.anvilcraft.client.gui.component.EnableFilterButton;
77
import dev.dubhe.anvilcraft.inventory.ChuteMenu;
8-
import dev.dubhe.anvilcraft.inventory.IFilterMenu;
98
import dev.dubhe.anvilcraft.network.SlotDisableChangePack;
109
import lombok.Getter;
1110
import net.minecraft.client.gui.GuiGraphics;
@@ -19,7 +18,7 @@
1918

2019
import java.util.function.BiFunction;
2120

22-
public class ChuteScreen extends BaseMachineScreen<ChuteMenu> implements IFilterScreen {
21+
public class ChuteScreen extends BaseMachineScreen<ChuteMenu> implements IFilterScreen<ChuteMenu> {
2322
private static final ResourceLocation CONTAINER_LOCATION =
2423
AnvilCraft.of("textures/gui/container/machine/background/chute.png");
2524

@@ -72,7 +71,7 @@ protected void renderSlotTooltip(@NotNull GuiGraphics guiGraphics, int x, int y)
7271
}
7372

7473
@Override
75-
public IFilterMenu getFilterMenu() {
74+
public ChuteMenu getFilterMenu() {
7675
return menu;
7776
}
7877

@@ -98,4 +97,14 @@ protected void slotClicked(@NotNull Slot slot, int slotId, int mouseButton, @Not
9897
}
9998
super.slotClicked(slot, slotId, mouseButton, type);
10099
}
100+
101+
@Override
102+
public int getOffsetX() {
103+
return (this.width - this.imageWidth) / 2;
104+
}
105+
106+
@Override
107+
public int getOffsetY() {
108+
return (this.height - this.imageHeight) / 2;
109+
}
101110
}

common/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/inventory/IFilterScreen.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import dev.dubhe.anvilcraft.network.MachineEnableFilterPack;
99
import net.minecraft.client.gui.GuiGraphics;
1010
import net.minecraft.resources.ResourceLocation;
11+
import net.minecraft.world.inventory.AbstractContainerMenu;
1112
import net.minecraft.world.inventory.Slot;
1213
import net.minecraft.world.item.ItemStack;
1314
import org.jetbrains.annotations.NotNull;
@@ -17,10 +18,10 @@
1718
/**
1819
* 有过滤的 GUI
1920
*/
20-
public interface IFilterScreen {
21+
public interface IFilterScreen<T extends AbstractContainerMenu & IFilterMenu> {
2122
ResourceLocation DISABLED_SLOT = AnvilCraft.of("textures/gui/container/machine/disabled_slot.png");
2223

23-
IFilterMenu getFilterMenu();
24+
T getFilterMenu();
2425

2526
/**
2627
* 获取是否开启过滤
@@ -65,8 +66,8 @@ default boolean isSlotDisabled(int slot) {
6566
* @param slot 槽位
6667
* @param filter 过滤
6768
*/
68-
default void setFilter(int slot, ItemStack filter) {
69-
this.getFilterMenu().setFilter(slot, filter);
69+
default boolean setFilter(int slot, ItemStack filter) {
70+
return this.getFilterMenu().setFilter(slot, filter);
7071
}
7172

7273
/**
@@ -143,4 +144,12 @@ default void renderFilterItem(@NotNull GuiGraphics guiGraphics, @NotNull Slot sl
143144
guiGraphics.renderFakeItem(stack, i, j);
144145
guiGraphics.fill(i, j, i + 16, j + 16, 0x80ffaaaa);
145146
}
147+
148+
default int getOffsetY() {
149+
return 0;
150+
}
151+
152+
default int getOffsetX() {
153+
return 0;
154+
}
146155
}

common/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/inventory/ItemCollectorScreen.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import dev.dubhe.anvilcraft.client.gui.component.EnableFilterButton;
66
import dev.dubhe.anvilcraft.client.gui.component.ItemCollectorButton;
77
import dev.dubhe.anvilcraft.client.gui.component.TextWidget;
8-
import dev.dubhe.anvilcraft.inventory.IFilterMenu;
98
import dev.dubhe.anvilcraft.inventory.ItemCollectorMenu;
109
import dev.dubhe.anvilcraft.network.SlotDisableChangePack;
1110
import lombok.Getter;
@@ -21,7 +20,8 @@
2120

2221
import java.util.function.BiFunction;
2322

24-
public class ItemCollectorScreen extends AbstractContainerScreen<ItemCollectorMenu> implements IFilterScreen {
23+
public class ItemCollectorScreen extends AbstractContainerScreen<ItemCollectorMenu>
24+
implements IFilterScreen<ItemCollectorMenu> {
2525
private static final ResourceLocation CONTAINER_LOCATION =
2626
AnvilCraft.of("textures/gui/container/machine/background/item_collector.png");
2727
BiFunction<Integer, Integer, EnableFilterButton> enableFilterButtonSupplier =
@@ -123,7 +123,7 @@ protected void renderSlotTooltip(@NotNull GuiGraphics guiGraphics, int x, int y)
123123
}
124124

125125
@Override
126-
public IFilterMenu getFilterMenu() {
126+
public ItemCollectorMenu getFilterMenu() {
127127
return this.menu;
128128
}
129129

@@ -148,4 +148,14 @@ protected void slotClicked(@NotNull Slot slot, int slotId, int mouseButton, @Not
148148
}
149149
super.slotClicked(slot, slotId, mouseButton, type);
150150
}
151+
152+
@Override
153+
public int getOffsetX() {
154+
return (this.width - this.imageWidth) / 2;
155+
}
156+
157+
@Override
158+
public int getOffsetY() {
159+
return (this.height - this.imageHeight) / 2;
160+
}
151161
}

common/src/main/java/dev/dubhe/anvilcraft/integration/emi/AnvilCraftEmiPlugin.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package dev.dubhe.anvilcraft.integration.emi;
22

33
import dev.dubhe.anvilcraft.api.recipe.AnvilRecipeManager;
4+
import dev.dubhe.anvilcraft.client.gui.screen.inventory.AutoCrafterScreen;
5+
import dev.dubhe.anvilcraft.client.gui.screen.inventory.ChuteScreen;
6+
import dev.dubhe.anvilcraft.client.gui.screen.inventory.ItemCollectorScreen;
47
import dev.dubhe.anvilcraft.init.ModBlocks;
58
import dev.dubhe.anvilcraft.integration.emi.recipe.AnvilProcessEmiRecipe;
69
import dev.emi.emi.api.EmiEntrypoint;
@@ -16,6 +19,10 @@ public class AnvilCraftEmiPlugin implements EmiPlugin {
1619
public void register(@NotNull EmiRegistry registry) {
1720
AnvilRecipeCategory.ALL.forEach(registry::addCategory);
1821

22+
registry.addDragDropHandler(AutoCrafterScreen.class, new GhostIngredientHandler<>());
23+
registry.addDragDropHandler(ChuteScreen.class, new GhostIngredientHandler<>());
24+
registry.addDragDropHandler(ItemCollectorScreen.class, new GhostIngredientHandler<>());
25+
1926
registry.addWorkstation(AnvilRecipeCategory.STAMPING, EmiStack.of(ModBlocks.STAMPING_PLATFORM.get()));
2027
registry.addWorkstation(AnvilRecipeCategory.STAMPING, EmiStack.of(ModBlocks.ROYAL_ANVIL));
2128
registry.addWorkstation(AnvilRecipeCategory.STAMPING, EmiStack.of(Blocks.ANVIL));
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package dev.dubhe.anvilcraft.integration.emi;
2+
3+
import dev.dubhe.anvilcraft.client.gui.screen.inventory.IFilterScreen;
4+
import dev.dubhe.anvilcraft.network.SlotFilterChangePack;
5+
import dev.emi.emi.api.EmiDragDropHandler;
6+
import dev.emi.emi.api.stack.EmiIngredient;
7+
import dev.emi.emi.api.stack.EmiStack;
8+
import net.minecraft.client.gui.screens.Screen;
9+
import net.minecraft.client.renderer.Rect2i;
10+
import net.minecraft.world.inventory.Slot;
11+
import net.minecraft.world.item.ItemStack;
12+
import org.jetbrains.annotations.NotNull;
13+
14+
import java.util.List;
15+
16+
public class GhostIngredientHandler<T extends Screen & IFilterScreen<?>> implements EmiDragDropHandler<T> {
17+
@Override
18+
public boolean dropStack(
19+
@NotNull T screen, @NotNull EmiIngredient ingredient, int x, int y
20+
) {
21+
if (!screen.isFilterEnabled()) return false;
22+
List<EmiStack> stacks = ingredient.getEmiStacks();
23+
if (stacks.size() != 1) return false;
24+
ItemStack stack = stacks.get(0).getItemStack();
25+
if (stack.isEmpty()) return false;
26+
for (Slot slot : screen.getFilterMenu().slots) {
27+
Rect2i rect2i = new Rect2i(screen.getOffsetX() + slot.x, screen.getOffsetY() + slot.y, 16, 16);
28+
if (rect2i.contains(x, y)) {
29+
if (screen.setFilter(screen.getFilterMenu().getFilterSlotIndex(slot), stack)) {
30+
new SlotFilterChangePack(screen.getFilterMenu().getFilterSlotIndex(slot), stack).send();
31+
return true;
32+
}
33+
}
34+
}
35+
return false;
36+
}
37+
}

common/src/main/java/dev/dubhe/anvilcraft/inventory/AutoCrafterMenu.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@ public IFilterBlockEntity getFilterBlockEntity() {
177177
return this.blockEntity;
178178
}
179179

180+
@Override
181+
public int getFilterSlotIndex(@NotNull Slot slot) {
182+
return slot.index - 36;
183+
}
184+
180185
@Override
181186
public void setItem(int slotId, int stateId, @NotNull ItemStack stack) {
182187
super.setItem(slotId, stateId, stack);

common/src/main/java/dev/dubhe/anvilcraft/inventory/ChuteMenu.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,9 @@ public boolean stillValid(@NotNull Player player) {
134134
public IFilterBlockEntity getFilterBlockEntity() {
135135
return blockEntity;
136136
}
137+
138+
@Override
139+
public int getFilterSlotIndex(@NotNull Slot slot) {
140+
return slot.index - 36;
141+
}
137142
}

0 commit comments

Comments
 (0)