Skip to content

Commit d15b415

Browse files
Controllable Furnace- and BrewerWindow progress
1 parent 4d247a2 commit d15b415

9 files changed

Lines changed: 342 additions & 5 deletions

File tree

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package xyz.xenondevs.invui.window
2+
3+
import xyz.xenondevs.commons.provider.MutableProvider
4+
import xyz.xenondevs.invui.ExperimentalReactiveApi
5+
import xyz.xenondevs.invui.MutablePropertyAdapter
6+
7+
@ExperimentalReactiveApi
8+
fun BrewerWindow.Builder.setBrewProgress(progress: MutableProvider<Double>): BrewerWindow.Builder =
9+
setBrewProgress(MutablePropertyAdapter(progress))
10+
11+
@ExperimentalReactiveApi
12+
fun BrewerWindow.Builder.setFuelProgress(progress: MutableProvider<Double>): BrewerWindow.Builder =
13+
setFuelProgress(MutablePropertyAdapter(progress))
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package xyz.xenondevs.invui.window
2+
3+
import xyz.xenondevs.commons.provider.MutableProvider
4+
import xyz.xenondevs.invui.ExperimentalReactiveApi
5+
import xyz.xenondevs.invui.MutablePropertyAdapter
6+
7+
@ExperimentalReactiveApi
8+
fun FurnaceWindow.Builder.setCookProgress(progress: MutableProvider<Double>): FurnaceWindow.Builder =
9+
setCookProgress(MutablePropertyAdapter(progress))
10+
11+
@ExperimentalReactiveApi
12+
fun FurnaceWindow.Builder.setBurnProgress(progress: MutableProvider<Double>): FurnaceWindow.Builder =
13+
setBurnProgress(MutablePropertyAdapter(progress))

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,32 @@ public CustomBrewingStandMenu(Player player) {
1717
super(MenuType.BREWING_STAND, player);
1818
}
1919

20+
/**
21+
* Sets the brew progress, i.e. how much of the arrow is white.
22+
*
23+
* @param progress The brew progress, between 0.0 and 1.0.
24+
* @throws IllegalArgumentException If the progress is not between 0.0 and 1.0.
25+
*/
26+
public void setBrewProgress(double progress) {
27+
if (progress < 0 || progress > 1)
28+
throw new IllegalArgumentException("Brew progress must be between 0 and 1, but was " + progress);
29+
30+
int brewTicks = (int) Math.round((1 - progress) * 400);
31+
dataSlots[0] = brewTicks;
32+
}
33+
34+
/**
35+
* Sets the fuel progress, i.e. how much of the blaze bar is filled in.
36+
*
37+
* @param progress The fuel progress, between 0.0 and 1.0.
38+
* @throws IllegalArgumentException If the progress is not between 0.0 and 1.0.
39+
*/
40+
public void setFuelProgress(double progress) {
41+
if (progress < 0 || progress > 1)
42+
throw new IllegalArgumentException("Fuel progress must be between 0 and 1, but was " + progress);
43+
44+
int fuelUses = (int) Math.round(progress * 20);
45+
dataSlots[1] = fuelUses;
46+
}
47+
2048
}

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,35 @@ public CustomFurnaceMenu(Player player) {
1717
super(MenuType.FURNACE, player);
1818
}
1919

20+
/**
21+
* Sets the cook progress, i.e. how much of the arrow is white.
22+
*
23+
* @param progress The cook progress, between 0.0 and 1.0.
24+
* @throws IllegalArgumentException If the progress is not between 0.0 and 1.0.
25+
*/
26+
public void setCookProgress(double progress) {
27+
setProgress(progress, 1, 2);
28+
}
29+
30+
/**
31+
* Sets the burn progress, i.e. how much of the fire is white.
32+
*
33+
* @param progress The burn progress, between 0.0 and 1.0.
34+
* @throws IllegalArgumentException If the progress is not between 0.0 and 1.0.
35+
*/
36+
public void setBurnProgress(double progress) {
37+
setProgress(progress, 0, 1);
38+
}
39+
40+
private void setProgress(double progress, int ticksField, int durationField) {
41+
if (progress < 0 || progress > 1)
42+
throw new IllegalArgumentException("Burn progress must be between 0 and 1, but was " + progress);
43+
44+
int duration = 256;
45+
int ticks = (int) Math.round(progress * duration);
46+
47+
dataSlots[ticksField] = ticks;
48+
dataSlots[durationField] = duration;
49+
}
50+
2051
}

invui/src/main/java/xyz/xenondevs/invui/internal/util/InventoryUtils.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,24 @@ public static int getSizeOf(MenuType<?> type) {
7676
* @return The amount of data slots
7777
*/
7878
public static int getDataSlotCountOf(MenuType<?> type) {
79+
if (type == MenuType.CRAFTER_3x3)
80+
return 9;
7981
if (type == MenuType.ANVIL)
8082
return 1;
83+
if (type == MenuType.BEACON)
84+
return 3;
85+
if (type == MenuType.FURNACE || type == MenuType.BLAST_FURNACE || type == MenuType.SMOKER)
86+
return 4;
87+
if (type == MenuType.BREWING_STAND)
88+
return 2;
89+
if (type == MenuType.ENCHANTMENT)
90+
return 10;
91+
if (type == MenuType.LECTERN)
92+
return 1;
93+
if (type == MenuType.LOOM)
94+
return 1;
8195
if (type == MenuType.STONECUTTER)
8296
return 1;
83-
if (type == MenuType.CRAFTER_3x3)
84-
return 9;
85-
86-
// TODO: all types
87-
8897
return 0;
8998
}
9099

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

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package xyz.xenondevs.invui.window;
22

33
import xyz.xenondevs.invui.gui.Gui;
4+
import xyz.xenondevs.invui.state.Property;
45

56
import java.util.function.Supplier;
67

@@ -18,6 +19,35 @@ static Builder builder() {
1819
return new BrewerWindowImpl.BuilderImpl();
1920
}
2021

22+
/**
23+
* Sets the brew progress, i.e. how much of the arrow is white.
24+
*
25+
* @param progress The brew progress, between 0.0 and 1.0.
26+
* @throws IllegalArgumentException If the progress is not between 0.0 and 1.0.
27+
*/
28+
void setBrewProgress(double progress);
29+
30+
/**
31+
* Gets the brew progress, i.e. how much of the arrow is white.
32+
*
33+
* @return The brew progress, between 0.0 and 1.0.
34+
*/
35+
double getBrewProgress();
36+
37+
/**
38+
* Sets the fuel progress, i.e. how much of the blaze bar is filled in.
39+
*
40+
* @param progress The fuel progress, between 0.0 and 1.0.
41+
*/
42+
void setFuelProgress(double progress);
43+
44+
/**
45+
* Gets the fuel progress, i.e. how much of the blaze bar is filled in.
46+
*
47+
* @return The fuel progress, between 0.0 and 1.0.
48+
*/
49+
double getFuelProgress();
50+
2151
/**
2252
* A {@link BrewerWindow} builder.
2353
*/
@@ -113,6 +143,38 @@ default Builder setResultGui(Gui.Builder<?, ?> builder) {
113143
*/
114144
Builder setResultGui(Supplier<? extends Gui> guiSupplier);
115145

146+
/**
147+
* Sets the brew progress, i.e. how much of the arrow is white.
148+
* @param progress The brew progress, between 0.0 and 1.0.
149+
* @return This {@link Builder}
150+
*/
151+
default Builder setBrewProgress(double progress) {
152+
return setBrewProgress(Property.of(progress));
153+
}
154+
155+
/**
156+
* Sets the property containing the brew progress, i.e. how much of the arrow is white.
157+
* @param progress The brew progress property, between 0.0 and 1.0.
158+
* @return This {@link Builder}
159+
*/
160+
Builder setBrewProgress(Property<Double> progress);
161+
162+
/**
163+
* Sets the fuel progress, i.e. how much of the blaze bar is filled in.
164+
* @param progress The fuel progress, between 0.0 and 1.0.
165+
* @return This {@link Builder}
166+
*/
167+
default Builder setFuelProgress(double progress) {
168+
return setFuelProgress(Property.of(progress));
169+
}
170+
171+
/**
172+
* Sets the property containing the fuel progress, i.e. how much of the blaze bar is filled in.
173+
* @param progress The fuel progress property, between 0.0 and 1.0.
174+
* @return This {@link Builder}
175+
*/
176+
Builder setFuelProgress(Property<Double> progress);
177+
116178
}
117179

118180
}

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import xyz.xenondevs.invui.gui.AbstractGui;
77
import xyz.xenondevs.invui.gui.Gui;
88
import xyz.xenondevs.invui.internal.menu.CustomBrewingStandMenu;
9+
import xyz.xenondevs.invui.state.Property;
910

1011
import java.util.List;
1112
import java.util.function.Supplier;
@@ -16,6 +17,8 @@ final class BrewerWindowImpl extends AbstractSplitWindow<CustomBrewingStandMenu>
1617
private final AbstractGui fuelGui;
1718
private final AbstractGui resultGui;
1819
private final AbstractGui lowerGui;
20+
private Property<Double> brewProgress;
21+
private Property<Double> fuelProgress;
1922

2023
public BrewerWindowImpl(
2124
Player player,
@@ -24,6 +27,8 @@ public BrewerWindowImpl(
2427
AbstractGui fuelGui,
2528
AbstractGui resultGui,
2629
AbstractGui lowerGui,
30+
Property<Double> brewProgress,
31+
Property<Double> fuelProgress,
2732
boolean closeable
2833
) {
2934
super(player, title, lowerGui, 41, new CustomBrewingStandMenu(player), closeable);
@@ -38,6 +43,43 @@ public BrewerWindowImpl(
3843
this.fuelGui = fuelGui;
3944
this.resultGui = resultGui;
4045
this.lowerGui = lowerGui;
46+
this.brewProgress = brewProgress;
47+
this.fuelProgress = fuelProgress;
48+
49+
brewProgress.observeWeak(this, thisRef -> thisRef.menu.setBrewProgress(brewProgress.get()));
50+
fuelProgress.observeWeak(this, thisRef -> thisRef.menu.setFuelProgress(fuelProgress.get()));
51+
menu.setBrewProgress(brewProgress.get());
52+
menu.setFuelProgress(fuelProgress.get());
53+
}
54+
55+
@Override
56+
public void setBrewProgress(double progress) {
57+
if (progress < 0 || progress > 1)
58+
throw new IllegalArgumentException("Brew progress must be between 0 and 1, but was " + progress);
59+
60+
brewProgress.unobserveWeak(this);
61+
brewProgress = Property.of(progress);
62+
menu.setBrewProgress(progress);
63+
}
64+
65+
@Override
66+
public double getBrewProgress() {
67+
return brewProgress.get();
68+
}
69+
70+
@Override
71+
public void setFuelProgress(double progress) {
72+
if (progress < 0 || progress > 1)
73+
throw new IllegalArgumentException("Fuel progress must be between 0 and 1, but was " + progress);
74+
75+
fuelProgress.unobserveWeak(this);
76+
fuelProgress = Property.of(progress);
77+
menu.setFuelProgress(progress);
78+
}
79+
80+
@Override
81+
public double getFuelProgress() {
82+
return fuelProgress.get();
4183
}
4284

4385
@Override
@@ -53,6 +95,8 @@ public static final class BuilderImpl
5395
private Supplier<? extends Gui> inputGuiSupplier = () -> Gui.empty(1, 1);
5496
private Supplier<? extends Gui> fuelGuiSupplier = () -> Gui.empty(1, 1);
5597
private Supplier<? extends Gui> resultGuiSupplier = () -> Gui.empty(3, 1);
98+
private Property<Double> brewProgress = Property.of(0.0);
99+
private Property<Double> fuelProgress = Property.of(0.0);
56100

57101
@Override
58102
public BrewerWindow.Builder setInputGui(Supplier<? extends Gui> guiSupplier) {
@@ -72,6 +116,18 @@ public BrewerWindow.Builder setResultGui(Supplier<? extends Gui> guiSupplier) {
72116
return this;
73117
}
74118

119+
@Override
120+
public BrewerWindow.Builder setBrewProgress(Property<Double> progress) {
121+
this.brewProgress = progress;
122+
return this;
123+
}
124+
125+
@Override
126+
public BrewerWindow.Builder setFuelProgress(Property<Double> progress) {
127+
this.fuelProgress = progress;
128+
return this;
129+
}
130+
75131
@Override
76132
public BrewerWindow build(Player viewer) {
77133
var window = new BrewerWindowImpl(
@@ -81,6 +137,8 @@ public BrewerWindow build(Player viewer) {
81137
(AbstractGui) fuelGuiSupplier.get(),
82138
(AbstractGui) resultGuiSupplier.get(),
83139
supplyLowerGui(viewer),
140+
brewProgress,
141+
fuelProgress,
84142
closeable
85143
);
86144

0 commit comments

Comments
 (0)