Skip to content

Commit 8d4182d

Browse files
committed
feat: improve timer sample
1 parent a74ecb5 commit 8d4182d

5 files changed

Lines changed: 105 additions & 53 deletions

File tree

examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/SamplePlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public void onEnable() {
2222
new Failing(),
2323
new SimplePagination(),
2424
new AutoUpdate(),
25-
new TimerView())
25+
new TimerSample())
2626
.register();
2727

2828
IFExampleCommandExecutor command = new IFExampleCommandExecutor(viewFrame);

examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/commands/IFExampleCommandExecutor.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.devnatan.inventoryframework.runtime.commands;
22

33
import java.util.ArrayList;
4+
import java.util.HashMap;
45
import java.util.List;
56
import java.util.Map;
67
import me.devnatan.inventoryframework.View;
@@ -9,6 +10,7 @@
910
import me.devnatan.inventoryframework.runtime.view.AutoUpdate;
1011
import me.devnatan.inventoryframework.runtime.view.Failing;
1112
import me.devnatan.inventoryframework.runtime.view.SimplePagination;
13+
import me.devnatan.inventoryframework.runtime.view.TimerSample;
1214
import org.bukkit.command.Command;
1315
import org.bukkit.command.CommandExecutor;
1416
import org.bukkit.command.CommandSender;
@@ -19,11 +21,15 @@
1921

2022
public class IFExampleCommandExecutor implements CommandExecutor, TabCompleter {
2123

22-
private static final Map<String, Class<? extends View>> views = Map.of(
23-
"anvil", AnvilInputSample.class,
24-
"failing", Failing.class,
25-
"simple-pagination", SimplePagination.class,
26-
"auto-update", AutoUpdate.class);
24+
private static final Map<String, Class<? extends View>> views = new HashMap<>();
25+
26+
static {
27+
views.put("anvil", AnvilInputSample.class);
28+
views.put("failing", Failing.class);
29+
views.put("simple-pagination", SimplePagination.class);
30+
views.put("auto-update", AutoUpdate.class);
31+
views.put("timer", TimerSample.class);
32+
}
2733

2834
private final ViewFrame viewFrame;
2935

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package me.devnatan.inventoryframework.runtime.view;
2+
3+
import me.devnatan.inventoryframework.View;
4+
import me.devnatan.inventoryframework.ViewConfigBuilder;
5+
import me.devnatan.inventoryframework.context.Context;
6+
import me.devnatan.inventoryframework.context.RenderContext;
7+
import me.devnatan.inventoryframework.context.SlotClickContext;
8+
import me.devnatan.inventoryframework.context.SlotRenderContext;
9+
import me.devnatan.inventoryframework.state.MutableIntState;
10+
import me.devnatan.inventoryframework.state.timer.Timer;
11+
import me.devnatan.inventoryframework.state.timer.TimerState;
12+
import org.bukkit.Material;
13+
import org.bukkit.inventory.ItemStack;
14+
import org.bukkit.inventory.meta.ItemMeta;
15+
import org.jetbrains.annotations.NotNull;
16+
17+
import java.util.Arrays;
18+
19+
public class TimerSample extends View {
20+
21+
private final MutableIntState countState = mutableState(0);
22+
private final TimerState timerState = timerState(20);
23+
24+
@Override
25+
public void onInit(@NotNull ViewConfigBuilder config) {
26+
config.cancelOnClick().title("Timer (?)").scheduleUpdate(timerState);
27+
}
28+
29+
@Override
30+
public void onFirstRender(@NotNull RenderContext render) {
31+
render.firstSlot()
32+
.onRender(this::onClockItemRender)
33+
.onClick(this::onClockItemClick)
34+
.updateOnStateChange(timerState);
35+
36+
render.lastSlot()
37+
.renderWith(() -> createIntervalItem(timerState.get(render)))
38+
.onClick(this::onIntervalItemClicked)
39+
.updateOnStateChange(timerState);
40+
}
41+
42+
@Override
43+
public void onUpdate(@NotNull Context update) {
44+
final int count = countState.increment(update);
45+
final String pause = timerState.get(update).isPaused() ? "paused" : "running";
46+
update.updateTitleForPlayer(String.format("Timer (%d) [%b]", count, pause));
47+
}
48+
49+
private void onIntervalItemClicked(SlotClickContext click) {
50+
final Timer timer = timerState.get(click);
51+
final long newInterval = (timer.currentInterval() + 1) % 20;
52+
53+
click.getPlayer().sendMessage(String.format(
54+
"Timer interval changed from %d to %d ticks",
55+
timer.currentInterval(), newInterval
56+
));
57+
timer.changeInterval(newInterval);
58+
}
59+
60+
private static @NotNull ItemStack createIntervalItem(Timer timer) {
61+
final long intervalInSeconds = Math.max(timer.currentInterval(), 1) / 20L; // ticks to seconds
62+
final ItemStack item = new ItemStack(Material.ARROW, (int) intervalInSeconds);
63+
final ItemMeta meta = item.getItemMeta();
64+
meta.setDisplayName("Current clock interval");
65+
meta.setLore(Arrays.asList("Initial: " + timer.initialInterval(), "Current: " + timer.currentInterval()));
66+
item.setItemMeta(meta);
67+
68+
return item;
69+
}
70+
71+
private void onClockItemRender(SlotRenderContext context) {
72+
final Timer timer = timerState.get(context);
73+
74+
final ItemStack stack = new ItemStack(Material.CLOCK);
75+
final ItemMeta meta = stack.getItemMeta();
76+
meta.setDisplayName("Timer");
77+
meta.setLore(Arrays.asList(timer.isPaused() ? "Click to unpause" : "Click to pause"));
78+
stack.setItemMeta(meta);
79+
80+
context.setItem(stack);
81+
}
82+
83+
private void onClockItemClick(SlotClickContext context) {
84+
final Timer timer = timerState.get(context);
85+
if (timer.pause()) {
86+
context.getPlayer().sendMessage("Paused");
87+
} else {
88+
context.getPlayer().sendMessage("Unpaused");
89+
}
90+
}
91+
}

examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/view/TimerView.java

Lines changed: 0 additions & 47 deletions
This file was deleted.

inventory-framework-api/src/main/java/me/devnatan/inventoryframework/state/timer/Timer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ public interface Timer {
66

77
long currentInterval();
88

9+
void changeInterval(long interval);
10+
911
boolean isPaused();
1012

1113
boolean pause();

0 commit comments

Comments
 (0)