Skip to content

Commit f3887d2

Browse files
committed
* Newly introducing... Anvil GUI :)
1 parent 9777146 commit f3887d2

File tree

8 files changed

+334
-3
lines changed

8 files changed

+334
-3
lines changed

.idea/artifacts/Labyrinth_jar.xml

Lines changed: 9 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Labyrinth.iml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,27 @@
3131
<orderEntry type="library" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
3232
<orderEntry type="library" name="Maven: junit:junit:4.10" level="project" />
3333
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
34+
<orderEntry type="library" name="Maven: com.github.Hempfest:AnvilGUI:1.5.1" level="project" />
35+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui:1.5.1" level="project" />
36+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_10_R1:1.5.1" level="project" />
37+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_11_R1:1.5.1" level="project" />
38+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_12_R1:1.5.1" level="project" />
39+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_13_R1:1.5.1" level="project" />
40+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_13_R2:1.5.1" level="project" />
41+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_14_4_R1:1.5.1" level="project" />
42+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_14_R1:1.5.1" level="project" />
43+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_15_R1:1.5.1" level="project" />
44+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_16_R1:1.5.1" level="project" />
45+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_16_R2:1.5.1" level="project" />
46+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_16_R3:1.5.1" level="project" />
47+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_16_R5:1.5.1" level="project" />
48+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_7_R4:1.5.1" level="project" />
49+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_8_R1:1.5.1" level="project" />
50+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_8_R2:1.5.1" level="project" />
51+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_8_R3:1.5.1" level="project" />
52+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_9_R1:1.5.1" level="project" />
53+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_9_R2:1.5.1" level="project" />
54+
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-abstraction:1.5.1" level="project" />
3455
<orderEntry type="library" name="Maven: com.github.the-h-team:Enterprise:1.5" level="project" />
3556
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jetbrains:annotations:20.1.0" level="project" />
3657
</component>

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,12 @@
126126
<version>1.7</version>
127127
<scope>compile</scope>
128128
</dependency>
129+
<dependency>
130+
<groupId>com.github.Hempfest</groupId>
131+
<artifactId>AnvilGUI</artifactId>
132+
<version>1.5.1</version>
133+
<scope>compile</scope>
134+
</dependency>
129135
<dependency>
130136
<groupId>com.github.the-h-team</groupId>
131137
<artifactId>Enterprise</artifactId>

src/main/java/com/github/sanctum/labyrinth/Labyrinth.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,14 @@
1717
import java.util.stream.Collectors;
1818
import org.bukkit.Bukkit;
1919
import org.bukkit.Material;
20-
import org.bukkit.event.Listener;
2120
import org.bukkit.inventory.Inventory;
2221
import org.bukkit.inventory.ItemStack;
2322
import org.bukkit.inventory.meta.SkullMeta;
2423
import org.bukkit.plugin.Plugin;
2524
import org.bukkit.plugin.ServicePriority;
2625
import org.bukkit.plugin.java.JavaPlugin;
2726

28-
public final class Labyrinth extends JavaPlugin implements Listener {
27+
public final class Labyrinth extends JavaPlugin {
2928

3029
public static final LinkedList<Cooldown> COOLDOWNS = new LinkedList<>();
3130
private static Labyrinth instance;
@@ -80,6 +79,7 @@ public void onEnable() {
8079
});
8180
}).run();
8281
run(() -> new VaultHook(this)).applyAfter(() -> new AdvancedHook(this)).wait(2);
82+
8383
}
8484

8585
@Override
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.github.sanctum.labyrinth.gui.printer;
2+
3+
import java.util.function.Consumer;
4+
import org.bukkit.entity.Player;
5+
6+
public class AnvilBuilder {
7+
8+
protected final Player player;
9+
protected final String title;
10+
protected AnvilMenu gui;
11+
protected ItemBuilder left;
12+
protected ItemBuilder right;
13+
14+
protected AnvilBuilder(Player player, String title) {
15+
this.player = player;
16+
this.title = title;
17+
18+
}
19+
20+
public static AnvilBuilder from(Player player, String title) {
21+
return new AnvilBuilder(player, title);
22+
}
23+
24+
public AnvilBuilder setLeftItem(Consumer<ItemBuilder> builderConsumer) {
25+
this.left = ItemBuilder.next();
26+
builderConsumer.accept(this.left);
27+
return this;
28+
}
29+
30+
public AnvilBuilder setRightItem(Consumer<ItemBuilder> builderConsumer) {
31+
this.right = ItemBuilder.next();
32+
builderConsumer.accept(this.right);
33+
return this;
34+
}
35+
36+
public AnvilMenu get() {
37+
return new AnvilMenu(player, title, left, right);
38+
}
39+
40+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.github.sanctum.labyrinth.gui.printer;
2+
3+
import org.bukkit.entity.Player;
4+
5+
/**
6+
* A functional interface providing RUNTIME operations in the event of a menu click
7+
*/
8+
@FunctionalInterface
9+
public interface AnvilItemClick {
10+
11+
void execute(Player player, String text, String[] args);
12+
13+
}
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
package com.github.sanctum.labyrinth.gui.printer;
2+
3+
import com.github.sanctum.labyrinth.Labyrinth;
4+
import net.wesjd.anvilgui.version.VersionMatcher;
5+
import net.wesjd.anvilgui.version.VersionWrapper;
6+
import org.bukkit.Bukkit;
7+
import org.bukkit.Material;
8+
import org.bukkit.entity.Player;
9+
import org.bukkit.event.EventHandler;
10+
import org.bukkit.event.HandlerList;
11+
import org.bukkit.event.Listener;
12+
import org.bukkit.event.inventory.InventoryClickEvent;
13+
import org.bukkit.event.inventory.InventoryCloseEvent;
14+
import org.bukkit.inventory.Inventory;
15+
import org.bukkit.inventory.ItemStack;
16+
import org.bukkit.inventory.meta.ItemMeta;
17+
18+
/**
19+
* An anvil gui, used for gathering a user's input
20+
*
21+
* @author Wesley Smith
22+
* @since 1.0
23+
*/
24+
public class AnvilMenu {
25+
26+
/**
27+
* The player who has the GUI open
28+
*/
29+
private final Player holder;
30+
31+
/**
32+
* The {@link VersionWrapper} for this server
33+
*/
34+
private final VersionWrapper nms;
35+
36+
private final String title;
37+
38+
/**
39+
* The container id of the inventory, used for NMS methods
40+
*/
41+
private int containerId;
42+
/**
43+
* The inventory that is used on the Bukkit side of things
44+
*/
45+
private Inventory inventory;
46+
/**
47+
* The listener holder class
48+
*/
49+
private final AnvilListener listener;
50+
51+
protected ItemBuilder LEFT_ITEM;
52+
53+
protected ItemBuilder RIGHT_ITEM;
54+
55+
/**
56+
* Represents the state of the inventory being open
57+
*/
58+
private boolean visible;
59+
60+
61+
public AnvilMenu(Player holder, String title, ItemBuilder left, ItemBuilder right) {
62+
this.holder = holder;
63+
this.LEFT_ITEM = left;
64+
this.title = title;
65+
this.RIGHT_ITEM = right;
66+
this.listener = new AnvilListener();
67+
this.nms = new VersionMatcher().match();
68+
}
69+
70+
public void open() {
71+
nms.handleInventoryCloseEvent(holder);
72+
nms.setActiveContainerDefault(holder);
73+
74+
Bukkit.getPluginManager().registerEvents(listener, Labyrinth.getInstance());
75+
76+
final Object container = nms.newContainerAnvil(holder, title);
77+
78+
inventory = nms.toBukkitInventory(container);
79+
80+
inventory.setItem(Slot.INPUT_LEFT, LEFT_ITEM.item);
81+
82+
if (RIGHT_ITEM != null) {
83+
inventory.setItem(Slot.INPUT_RIGHT, RIGHT_ITEM.item);
84+
}
85+
86+
containerId = nms.getNextContainerId(holder, container);
87+
nms.sendPacketOpenWindow(holder, containerId, title);
88+
nms.setActiveContainer(holder, container);
89+
nms.setActiveContainerId(container, containerId);
90+
nms.addActiveContainerSlotListener(container, holder);
91+
92+
visible = true;
93+
}
94+
95+
/**
96+
* Closes the inventory if it's open.
97+
*
98+
* @throws IllegalArgumentException If the inventory isn't open
99+
*/
100+
public void closeInventory(boolean sendClosePacket) {
101+
if (!visible)
102+
throw new IllegalArgumentException("You can't close an inventory that isn't open!");
103+
visible = false;
104+
105+
if (!sendClosePacket)
106+
nms.handleInventoryCloseEvent(holder);
107+
nms.setActiveContainerDefault(holder);
108+
nms.sendPacketCloseWindow(holder, containerId);
109+
110+
HandlerList.unregisterAll(listener);
111+
}
112+
113+
public Inventory getInventory() {
114+
return inventory;
115+
}
116+
117+
public String getTitle() {
118+
return title;
119+
}
120+
121+
public AnvilListener getListener() {
122+
return listener;
123+
}
124+
125+
public ItemBuilder getLeft() {
126+
return LEFT_ITEM;
127+
}
128+
129+
public ItemBuilder getRight() {
130+
return RIGHT_ITEM;
131+
}
132+
133+
public boolean isVisible() {
134+
return visible;
135+
}
136+
137+
public Player getHolder() {
138+
return holder;
139+
}
140+
141+
/**
142+
* Simply holds the listeners for the GUI
143+
*/
144+
private class AnvilListener implements Listener {
145+
146+
@EventHandler
147+
public void onInventoryClick(InventoryClickEvent e) {
148+
if (e.getInventory().equals(inventory)) {
149+
e.setCancelled(true);
150+
final Player clicker = (Player) e.getWhoClicked();
151+
if (e.getRawSlot() == Slot.OUTPUT) {
152+
final ItemStack clicked = inventory.getItem(e.getRawSlot());
153+
if (clicked == null || clicked.getType() == Material.AIR) return;
154+
if (getLeft() != null && getLeft().click != null) {
155+
if (getRight() != null && getRight().click != null) {
156+
if (clicked.getType() == getRight().item.getType()) {
157+
final ItemMeta meta = clicked.getItemMeta();
158+
getRight().click.execute(clicker, meta.getDisplayName(), meta.getDisplayName().split(" "));
159+
return;
160+
}
161+
}
162+
if (clicked.getType() == getLeft().item.getType()) {
163+
final ItemMeta meta = clicked.getItemMeta();
164+
getLeft().click.execute(clicker, meta.getDisplayName(), meta.getDisplayName().split(" "));
165+
}
166+
} else closeInventory(false);
167+
}
168+
}
169+
}
170+
171+
@EventHandler
172+
public void onInventoryClose(InventoryCloseEvent e) {
173+
if (e.getInventory().equals(inventory)) {
174+
if (visible)
175+
closeInventory(true);
176+
e.getInventory().clear();
177+
}
178+
}
179+
}
180+
181+
182+
/**
183+
* Class wrapping the magic constants of slot numbers in an anvil GUI
184+
*/
185+
public static class Slot {
186+
187+
/**
188+
* The slot on the far left, where the first input is inserted. An {@link ItemStack} is always inserted
189+
* here to be renamed
190+
*/
191+
public static final int INPUT_LEFT = 0;
192+
/**
193+
* Not used, but in a real anvil you are able to put the second item you want to combine here
194+
*/
195+
public static final int INPUT_RIGHT = 1;
196+
/**
197+
* The output slot, where an item is put when two items are combined from {@link #INPUT_LEFT} and
198+
* {@link #INPUT_RIGHT} or {@link #INPUT_LEFT} is renamed
199+
*/
200+
public static final int OUTPUT = 2;
201+
202+
}
203+
204+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.github.sanctum.labyrinth.gui.printer;
2+
3+
import java.util.function.Supplier;
4+
import org.bukkit.inventory.ItemStack;
5+
6+
public class ItemBuilder {
7+
8+
protected AnvilItemClick click;
9+
10+
protected ItemStack item;
11+
12+
protected ItemBuilder() {
13+
}
14+
15+
protected ItemBuilder(ItemStack item, AnvilItemClick click) {
16+
this.click = click;
17+
this.item = item;
18+
}
19+
20+
public static ItemBuilder next() {
21+
return new ItemBuilder();
22+
}
23+
24+
public static ItemBuilder next(Supplier<ItemStack> item, AnvilItemClick click) {
25+
return new ItemBuilder(item.get(), click);
26+
}
27+
28+
public void setClick(AnvilItemClick click) {
29+
this.click = click;
30+
}
31+
32+
public void setItem(ItemStack item) {
33+
this.item = item;
34+
}
35+
36+
public ItemStack getItem() {
37+
return item;
38+
}
39+
}

0 commit comments

Comments
 (0)