Skip to content

Commit

Permalink
* Newly introducing... Anvil GUI :)
Browse files Browse the repository at this point in the history
  • Loading branch information
Hempfest committed Apr 26, 2021
1 parent 9777146 commit f3887d2
Show file tree
Hide file tree
Showing 8 changed files with 334 additions and 3 deletions.
10 changes: 9 additions & 1 deletion .idea/artifacts/Labyrinth_jar.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions Labyrinth.iml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,27 @@
<orderEntry type="library" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.10" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest:AnvilGUI:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_10_R1:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_11_R1:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_12_R1:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_13_R1:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_13_R2:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_14_4_R1:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_14_R1:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_15_R1:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_16_R1:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_16_R2:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_16_R3:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_16_R5:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_7_R4:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_8_R1:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_8_R2:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_8_R3:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_9_R1:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-1_9_R2:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.Hempfest.AnvilGUI:anvilgui-abstraction:1.5.1" level="project" />
<orderEntry type="library" name="Maven: com.github.the-h-team:Enterprise:1.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jetbrains:annotations:20.1.0" level="project" />
</component>
Expand Down
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,12 @@
<version>1.7</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.github.Hempfest</groupId>
<artifactId>AnvilGUI</artifactId>
<version>1.5.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.github.the-h-team</groupId>
<artifactId>Enterprise</artifactId>
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/github/sanctum/labyrinth/Labyrinth.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,14 @@
import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.event.Listener;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.ServicePriority;
import org.bukkit.plugin.java.JavaPlugin;

public final class Labyrinth extends JavaPlugin implements Listener {
public final class Labyrinth extends JavaPlugin {

public static final LinkedList<Cooldown> COOLDOWNS = new LinkedList<>();
private static Labyrinth instance;
Expand Down Expand Up @@ -80,6 +79,7 @@ public void onEnable() {
});
}).run();
run(() -> new VaultHook(this)).applyAfter(() -> new AdvancedHook(this)).wait(2);

}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.github.sanctum.labyrinth.gui.printer;

import java.util.function.Consumer;
import org.bukkit.entity.Player;

public class AnvilBuilder {

protected final Player player;
protected final String title;
protected AnvilMenu gui;
protected ItemBuilder left;
protected ItemBuilder right;

protected AnvilBuilder(Player player, String title) {
this.player = player;
this.title = title;

}

public static AnvilBuilder from(Player player, String title) {
return new AnvilBuilder(player, title);
}

public AnvilBuilder setLeftItem(Consumer<ItemBuilder> builderConsumer) {
this.left = ItemBuilder.next();
builderConsumer.accept(this.left);
return this;
}

public AnvilBuilder setRightItem(Consumer<ItemBuilder> builderConsumer) {
this.right = ItemBuilder.next();
builderConsumer.accept(this.right);
return this;
}

public AnvilMenu get() {
return new AnvilMenu(player, title, left, right);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.github.sanctum.labyrinth.gui.printer;

import org.bukkit.entity.Player;

/**
* A functional interface providing RUNTIME operations in the event of a menu click
*/
@FunctionalInterface
public interface AnvilItemClick {

void execute(Player player, String text, String[] args);

}
204 changes: 204 additions & 0 deletions src/main/java/com/github/sanctum/labyrinth/gui/printer/AnvilMenu.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
package com.github.sanctum.labyrinth.gui.printer;

import com.github.sanctum.labyrinth.Labyrinth;
import net.wesjd.anvilgui.version.VersionMatcher;
import net.wesjd.anvilgui.version.VersionWrapper;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

/**
* An anvil gui, used for gathering a user's input
*
* @author Wesley Smith
* @since 1.0
*/
public class AnvilMenu {

/**
* The player who has the GUI open
*/
private final Player holder;

/**
* The {@link VersionWrapper} for this server
*/
private final VersionWrapper nms;

private final String title;

/**
* The container id of the inventory, used for NMS methods
*/
private int containerId;
/**
* The inventory that is used on the Bukkit side of things
*/
private Inventory inventory;
/**
* The listener holder class
*/
private final AnvilListener listener;

protected ItemBuilder LEFT_ITEM;

protected ItemBuilder RIGHT_ITEM;

/**
* Represents the state of the inventory being open
*/
private boolean visible;


public AnvilMenu(Player holder, String title, ItemBuilder left, ItemBuilder right) {
this.holder = holder;
this.LEFT_ITEM = left;
this.title = title;
this.RIGHT_ITEM = right;
this.listener = new AnvilListener();
this.nms = new VersionMatcher().match();
}

public void open() {
nms.handleInventoryCloseEvent(holder);
nms.setActiveContainerDefault(holder);

Bukkit.getPluginManager().registerEvents(listener, Labyrinth.getInstance());

final Object container = nms.newContainerAnvil(holder, title);

inventory = nms.toBukkitInventory(container);

inventory.setItem(Slot.INPUT_LEFT, LEFT_ITEM.item);

if (RIGHT_ITEM != null) {
inventory.setItem(Slot.INPUT_RIGHT, RIGHT_ITEM.item);
}

containerId = nms.getNextContainerId(holder, container);
nms.sendPacketOpenWindow(holder, containerId, title);
nms.setActiveContainer(holder, container);
nms.setActiveContainerId(container, containerId);
nms.addActiveContainerSlotListener(container, holder);

visible = true;
}

/**
* Closes the inventory if it's open.
*
* @throws IllegalArgumentException If the inventory isn't open
*/
public void closeInventory(boolean sendClosePacket) {
if (!visible)
throw new IllegalArgumentException("You can't close an inventory that isn't open!");
visible = false;

if (!sendClosePacket)
nms.handleInventoryCloseEvent(holder);
nms.setActiveContainerDefault(holder);
nms.sendPacketCloseWindow(holder, containerId);

HandlerList.unregisterAll(listener);
}

public Inventory getInventory() {
return inventory;
}

public String getTitle() {
return title;
}

public AnvilListener getListener() {
return listener;
}

public ItemBuilder getLeft() {
return LEFT_ITEM;
}

public ItemBuilder getRight() {
return RIGHT_ITEM;
}

public boolean isVisible() {
return visible;
}

public Player getHolder() {
return holder;
}

/**
* Simply holds the listeners for the GUI
*/
private class AnvilListener implements Listener {

@EventHandler
public void onInventoryClick(InventoryClickEvent e) {
if (e.getInventory().equals(inventory)) {
e.setCancelled(true);
final Player clicker = (Player) e.getWhoClicked();
if (e.getRawSlot() == Slot.OUTPUT) {
final ItemStack clicked = inventory.getItem(e.getRawSlot());
if (clicked == null || clicked.getType() == Material.AIR) return;
if (getLeft() != null && getLeft().click != null) {
if (getRight() != null && getRight().click != null) {
if (clicked.getType() == getRight().item.getType()) {
final ItemMeta meta = clicked.getItemMeta();
getRight().click.execute(clicker, meta.getDisplayName(), meta.getDisplayName().split(" "));
return;
}
}
if (clicked.getType() == getLeft().item.getType()) {
final ItemMeta meta = clicked.getItemMeta();
getLeft().click.execute(clicker, meta.getDisplayName(), meta.getDisplayName().split(" "));
}
} else closeInventory(false);
}
}
}

@EventHandler
public void onInventoryClose(InventoryCloseEvent e) {
if (e.getInventory().equals(inventory)) {
if (visible)
closeInventory(true);
e.getInventory().clear();
}
}
}


/**
* Class wrapping the magic constants of slot numbers in an anvil GUI
*/
public static class Slot {

/**
* The slot on the far left, where the first input is inserted. An {@link ItemStack} is always inserted
* here to be renamed
*/
public static final int INPUT_LEFT = 0;
/**
* Not used, but in a real anvil you are able to put the second item you want to combine here
*/
public static final int INPUT_RIGHT = 1;
/**
* The output slot, where an item is put when two items are combined from {@link #INPUT_LEFT} and
* {@link #INPUT_RIGHT} or {@link #INPUT_LEFT} is renamed
*/
public static final int OUTPUT = 2;

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.github.sanctum.labyrinth.gui.printer;

import java.util.function.Supplier;
import org.bukkit.inventory.ItemStack;

public class ItemBuilder {

protected AnvilItemClick click;

protected ItemStack item;

protected ItemBuilder() {
}

protected ItemBuilder(ItemStack item, AnvilItemClick click) {
this.click = click;
this.item = item;
}

public static ItemBuilder next() {
return new ItemBuilder();
}

public static ItemBuilder next(Supplier<ItemStack> item, AnvilItemClick click) {
return new ItemBuilder(item.get(), click);
}

public void setClick(AnvilItemClick click) {
this.click = click;
}

public void setItem(ItemStack item) {
this.item = item;
}

public ItemStack getItem() {
return item;
}
}

0 comments on commit f3887d2

Please sign in to comment.