Skip to content

Commit 4c8bc01

Browse files
Add BrewerWindow, GrindstoneWindow, SmithingWindow
1 parent 0ef6cc0 commit 4c8bc01

13 files changed

Lines changed: 602 additions & 8 deletions
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package xyz.xenondevs.invui.internal.menu;
2+
3+
import net.minecraft.world.inventory.MenuType;
4+
import org.bukkit.entity.Player;
5+
6+
/**
7+
* A packet-based smithing table menu.
8+
*/
9+
public class CustomBrewingStandMenu extends CustomContainerMenu {
10+
11+
/**
12+
* Creates a new {@link CustomBrewingStandMenu} for the specified player.
13+
*
14+
* @param player The player that will view the menu
15+
*/
16+
public CustomBrewingStandMenu(Player player) {
17+
super(MenuType.BREWING_STAND, player);
18+
}
19+
20+
}

invui/src/main/java/xyz/xenondevs/invui/internal/menu/CustomCraftingTableMenu.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/**
77
* A packet-based crafting table menu.
88
*/
9-
public class CustomCraftingTableMenu extends CustomRecipeBookPoweredMenu{
9+
public class CustomCraftingTableMenu extends CustomRecipeBookPoweredMenu {
1010

1111
/**
1212
* Creates a new {@link CustomCraftingTableMenu} for the specified viewer.

invui/src/main/java/xyz/xenondevs/invui/internal/menu/CustomFurnaceMenu.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/**
77
* A packet-based furnace menu.
88
*/
9-
public class CustomFurnaceMenu extends CustomRecipeBookPoweredMenu{
9+
public class CustomFurnaceMenu extends CustomRecipeBookPoweredMenu {
1010

1111
/**
1212
* Creates a new {@link CustomFurnaceMenu} for the specified viewer.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package xyz.xenondevs.invui.internal.menu;
2+
3+
import net.minecraft.network.HashedStack;
4+
import net.minecraft.world.inventory.MenuType;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.inventory.ItemStack;
7+
import org.jspecify.annotations.Nullable;
8+
9+
/**
10+
* A packet-based smithing table menu.
11+
*/
12+
public class CustomGrindstoneMenu extends CustomContainerMenu {
13+
14+
/**
15+
* Creates a new {@link CustomGrindstoneMenu} for the specified player.
16+
*
17+
* @param player The player that will view the menu
18+
*/
19+
public CustomGrindstoneMenu(Player player) {
20+
super(MenuType.GRINDSTONE, player);
21+
}
22+
23+
@Override
24+
public void setItem(int slot, @Nullable ItemStack item) {
25+
super.setItem(slot, item);
26+
27+
// client-side prediction clears output slot when input slots are modified
28+
if (slot == 0 || slot == 1) {
29+
remoteItems.set(2, HashedStack.EMPTY);
30+
}
31+
}
32+
33+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package xyz.xenondevs.invui.internal.menu;
2+
3+
import net.minecraft.network.HashedStack;
4+
import net.minecraft.world.inventory.MenuType;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.inventory.ItemStack;
7+
import org.jspecify.annotations.Nullable;
8+
9+
/**
10+
* A packet-based smithing table menu.
11+
*/
12+
public class CustomSmithingTableMenu extends CustomContainerMenu {
13+
14+
/**
15+
* Creates a new {@link CustomSmithingTableMenu} for the specified player.
16+
*
17+
* @param player The player that will view the menu
18+
*/
19+
public CustomSmithingTableMenu(Player player) {
20+
super(MenuType.SMITHING, player);
21+
}
22+
23+
@Override
24+
public void setItem(int slot, @Nullable ItemStack item) {
25+
super.setItem(slot, item);
26+
27+
// client-side prediction clears output slot when input slots are modified
28+
if (slot == 0 || slot == 1 || slot == 2) {
29+
remoteItems.set(3, HashedStack.EMPTY);
30+
}
31+
}
32+
33+
}

invui/src/main/java/xyz/xenondevs/invui/window/AbstractSplitWindow.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
@ApiStatus.Internal
2020
sealed abstract class AbstractSplitWindow<M extends CustomContainerMenu>
2121
extends AbstractWindow<M>
22-
permits AnvilWindowImpl, CartographyWindowImpl, CrafterWindowImpl, CraftingTableWindowImpl, FurnaceWindowImpl, MerchantWindowImpl, NormalSplitWindowImpl, StonecutterWindowImpl
22+
permits AnvilWindowImpl, BrewerWindowImpl, CartographyWindowImpl, CrafterWindowImpl, CraftingTableWindowImpl, FurnaceWindowImpl, GrindstoneWindowImpl, MerchantWindowImpl, NormalSplitWindowImpl, SmithingWindowImpl, StonecutterWindowImpl
2323
{
2424

2525
private final AbstractGui lowerGui;
@@ -41,7 +41,7 @@ sealed abstract class AbstractSplitWindow<M extends CustomContainerMenu>
4141
static sealed abstract class AbstractBuilder<W extends Window, S extends Builder.Split<W, S>>
4242
extends AbstractWindow.AbstractBuilder<W, S>
4343
implements Builder.Split<W, S>
44-
permits AnvilWindowImpl.BuilderImpl, CartographyWindowImpl.BuilderImpl, CrafterWindowImpl.BuilderImpl, CraftingTableWindowImpl.BuilderImpl, FurnaceWindowImpl.BuilderImpl, MerchantWindowImpl.BuilderImpl, NormalSplitWindowImpl.BuilderImpl, StonecutterWindowImpl.BuilderImpl
44+
permits AnvilWindowImpl.BuilderImpl, BrewerWindowImpl.BuilderImpl, CartographyWindowImpl.BuilderImpl, CrafterWindowImpl.BuilderImpl, CraftingTableWindowImpl.BuilderImpl, FurnaceWindowImpl.BuilderImpl, GrindstoneWindowImpl.BuilderImpl, MerchantWindowImpl.BuilderImpl, NormalSplitWindowImpl.BuilderImpl, SmithingWindowImpl.BuilderImpl, StonecutterWindowImpl.BuilderImpl
4545
{
4646

4747
private @Nullable Supplier<? extends Gui> lowerGuiSupplier;
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package xyz.xenondevs.invui.window;
2+
3+
import xyz.xenondevs.invui.gui.Gui;
4+
5+
import java.util.function.Supplier;
6+
7+
/**
8+
* A {@link Window} that uses a brewing stand inventory.
9+
*/
10+
public sealed interface BrewerWindow extends Window permits BrewerWindowImpl {
11+
12+
/**
13+
* Creates a new {@link Builder} for a split {@link BrewerWindow}.
14+
*
15+
* @return The new {@link Builder}
16+
*/
17+
static Builder builder() {
18+
return new BrewerWindowImpl.BuilderImpl();
19+
}
20+
21+
/**
22+
* A {@link BrewerWindow} builder.
23+
*/
24+
sealed interface Builder extends Window.Builder.Split<BrewerWindow, BrewerWindow.Builder> permits BrewerWindowImpl.BuilderImpl {
25+
26+
/**
27+
* Sets the 1x1 input {@link Gui} of the {@link BrewerWindow}.
28+
*
29+
* @param gui The 1x1 input {@link Gui}
30+
* @return This {@link Builder}
31+
*/
32+
default Builder setInputGui(Gui gui) {
33+
return setInputGui(() -> gui);
34+
}
35+
36+
/**
37+
* Sets the {@link Gui.Builder} for the 1x1 input {@link Gui} of this {@link Builder}.
38+
* The {@link Gui.Builder} will be called every time a new {@link BrewerWindow} is created using this builder.
39+
*
40+
* @param builder The {@link Gui.Builder} for the 1x1 input {@link Gui}
41+
* @return This {@link Builder}
42+
*/
43+
default Builder setInputGui(Gui.Builder<?, ?> builder) {
44+
return setInputGui(builder::build);
45+
}
46+
47+
/**
48+
* Sets the {@link Gui} {@link Supplier} for the 1x1 input {@link Gui} of this {@link Builder}.
49+
* The {@link Supplier} will be called every time a new {@link BrewerWindow} is created using this builder.
50+
*
51+
* @param guiSupplier The {@link Gui} {@link Supplier} for the 1x1 input {@link Gui}
52+
* @return This {@link Builder}
53+
*/
54+
Builder setInputGui(Supplier<? extends Gui> guiSupplier);
55+
56+
/**
57+
* Sets the 1x1 fuel {@link Gui} of the {@link BrewerWindow}.
58+
*
59+
* @param gui The 1x1 fuel {@link Gui}
60+
* @return This {@link Builder}
61+
*/
62+
default Builder setFuelGui(Gui gui) {
63+
return setFuelGui(() -> gui);
64+
}
65+
66+
/**
67+
* Sets the {@link Gui.Builder} for the 1x1 fuel {@link Gui} of this {@link Builder}.
68+
* The {@link Gui.Builder} will be called every time a new {@link BrewerWindow} is created using this builder.
69+
*
70+
* @param builder The {@link Gui.Builder} for the 1x1 fuel {@link Gui}
71+
* @return This {@link Builder}
72+
*/
73+
default Builder setFuelGui(Gui.Builder<?, ?> builder) {
74+
return setFuelGui(builder::build);
75+
}
76+
77+
/**
78+
* Sets the {@link Gui} {@link Supplier} for the 1x1 fuel {@link Gui} of this {@link Builder}.
79+
* The {@link Supplier} will be called every time a new {@link BrewerWindow} is created using this builder.
80+
*
81+
* @param guiSupplier The {@link Gui} {@link Supplier} for the 1x1 fuel {@link Gui}
82+
* @return This {@link Builder}
83+
*/
84+
Builder setFuelGui(Supplier<? extends Gui> guiSupplier);
85+
86+
/**
87+
* Sets the 3x1 result {@link Gui} of the {@link BrewerWindow}.
88+
*
89+
* @param gui The 3x1 result {@link Gui}
90+
* @return This {@link Builder}
91+
*/
92+
default Builder setResultGui(Gui gui) {
93+
return setResultGui(() -> gui);
94+
}
95+
96+
/**
97+
* Sets the {@link Gui.Builder} for the 3x1 result {@link Gui} of this {@link Builder}.
98+
* The {@link Gui.Builder} will be called every time a new {@link BrewerWindow} is created using this builder.
99+
*
100+
* @param builder The {@link Gui.Builder} for the 3x1 result {@link Gui}
101+
* @return This {@link Builder}
102+
*/
103+
default Builder setResultGui(Gui.Builder<?, ?> builder) {
104+
return setResultGui(builder::build);
105+
}
106+
107+
/**
108+
* Sets the {@link Gui} {@link Supplier} for the 3x1 result {@link Gui} of this {@link Builder}.
109+
* The {@link Supplier} will be called every time a new {@link BrewerWindow} is created using this builder.
110+
*
111+
* @param guiSupplier The {@link Gui} {@link Supplier} for the 3x1 result {@link Gui}
112+
* @return This {@link Builder}
113+
*/
114+
Builder setResultGui(Supplier<? extends Gui> guiSupplier);
115+
116+
}
117+
118+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package xyz.xenondevs.invui.window;
2+
3+
import net.kyori.adventure.text.Component;
4+
import org.bukkit.entity.Player;
5+
import org.jetbrains.annotations.Unmodifiable;
6+
import xyz.xenondevs.invui.gui.AbstractGui;
7+
import xyz.xenondevs.invui.gui.Gui;
8+
import xyz.xenondevs.invui.internal.menu.CustomBrewingStandMenu;
9+
10+
import java.util.List;
11+
import java.util.function.Supplier;
12+
13+
final class BrewerWindowImpl extends AbstractSplitWindow<CustomBrewingStandMenu> implements BrewerWindow {
14+
15+
private final AbstractGui inputGui;
16+
private final AbstractGui fuelGui;
17+
private final AbstractGui resultGui;
18+
private final AbstractGui lowerGui;
19+
20+
public BrewerWindowImpl(
21+
Player player,
22+
Supplier<? extends Component> title,
23+
AbstractGui inputGui,
24+
AbstractGui fuelGui,
25+
AbstractGui resultGui,
26+
AbstractGui lowerGui,
27+
boolean closeable
28+
) {
29+
super(player, title, lowerGui, 41, new CustomBrewingStandMenu(player), closeable);
30+
if (inputGui.getWidth() != 1 || inputGui.getHeight() != 1)
31+
throw new IllegalArgumentException("Input Gui must be of dimensions 1x1");
32+
if (fuelGui.getWidth() != 1 || fuelGui.getHeight() != 1)
33+
throw new IllegalArgumentException("Fuel Gui must be of dimensions 1x1");
34+
if (resultGui.getWidth() != 3 || resultGui.getHeight() != 1)
35+
throw new IllegalArgumentException("Result Gui must be of dimensions 3x1");
36+
37+
this.inputGui = inputGui;
38+
this.fuelGui = fuelGui;
39+
this.resultGui = resultGui;
40+
this.lowerGui = lowerGui;
41+
}
42+
43+
@Override
44+
public @Unmodifiable List<Gui> getGuis() {
45+
return List.of(resultGui, inputGui, fuelGui, lowerGui);
46+
}
47+
48+
public static final class BuilderImpl
49+
extends AbstractSplitWindow.AbstractBuilder<BrewerWindow, BrewerWindow.Builder>
50+
implements BrewerWindow.Builder
51+
{
52+
53+
private Supplier<? extends Gui> inputGuiSupplier = () -> Gui.empty(1, 1);
54+
private Supplier<? extends Gui> fuelGuiSupplier = () -> Gui.empty(1, 1);
55+
private Supplier<? extends Gui> resultGuiSupplier = () -> Gui.empty(3, 1);
56+
57+
@Override
58+
public BrewerWindow.Builder setInputGui(Supplier<? extends Gui> guiSupplier) {
59+
this.inputGuiSupplier = guiSupplier;
60+
return this;
61+
}
62+
63+
@Override
64+
public BrewerWindow.Builder setFuelGui(Supplier<? extends Gui> guiSupplier) {
65+
this.fuelGuiSupplier = guiSupplier;
66+
return this;
67+
}
68+
69+
@Override
70+
public BrewerWindow.Builder setResultGui(Supplier<? extends Gui> guiSupplier) {
71+
this.resultGuiSupplier = guiSupplier;
72+
return this;
73+
}
74+
75+
@Override
76+
public BrewerWindow build(Player viewer) {
77+
var window = new BrewerWindowImpl(
78+
viewer,
79+
titleSupplier,
80+
(AbstractGui) inputGuiSupplier.get(),
81+
(AbstractGui) fuelGuiSupplier.get(),
82+
(AbstractGui) resultGuiSupplier.get(),
83+
supplyLowerGui(viewer),
84+
closeable
85+
);
86+
87+
applyModifiers(window);
88+
89+
return window;
90+
}
91+
92+
}
93+
94+
}

0 commit comments

Comments
 (0)