Skip to content

Instantly share code, notes, and snippets.

@Exerosis
Created March 13, 2018 03:05
Show Gist options
  • Select an option

  • Save Exerosis/4e962a09f835cd964d72d81030b0cf34 to your computer and use it in GitHub Desktop.

Select an option

Save Exerosis/4e962a09f835cd964d72d81030b0cf34 to your computer and use it in GitHub Desktop.
package me.bhop.guide;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;
import static com.google.common.collect.Lists.partition;
import static com.google.common.collect.Streams.mapWithIndex;
import static java.util.stream.Collectors.toList;
import static me.bhop.guide.MiniWindow.Item;
import static me.bhop.guide.MiniWindow.Page;
import static org.bukkit.DyeColor.*;
import static org.bukkit.Material.APPLE;
import static org.bukkit.Material.DIRT;
import static org.bukkit.Material.STAINED_GLASS_PANE;
public class Main extends JavaPlugin {
private final Guide guide;
public Main() {
final List<Category> categories = new ArrayList<>();
categories.add(Category.create(page -> {
page.element()
.icon(APPLE)
.amount(10)
.title("Eat frequently!");
}, item -> item.title("How to eat!").icon(DIRT)));
guide = new Guide(categories, this, 3);
}
@EventHandler
void onJoin(PlayerJoinEvent event) {
event.getPlayer().openInventory(guide.getPage(0));
}
public static Supplier<Inventory> cache(Supplier<Inventory> creator) {
return new Supplier<Inventory>() {
Inventory inventory = null;
@Override
public Inventory get() {
if (inventory == null)
inventory = creator.get();
return inventory;
}
};
}
class Guide {
final List<Supplier<Inventory>> pages = new ArrayList<>();
public Guide(List<Category> categories, Plugin plugin, int rows) {
MiniWindow window = new MiniWindow(plugin);
List<List<Category>> partitions = partition(categories, rows * 9);
pages.addAll(mapWithIndex(partitions.stream(), (categoryList, index) ->
cache(() -> window.page(page -> {
//Title the page.
page.title("Page " + index);
//Add items for each category on the page.
categoryList.forEach(category -> {
//Create a new item for the category.
Item item = page.element();
//Let the category style it.
category.itemLike().accept(item);
//Cache the category's page as well.
Supplier<Inventory> categoryPage = cache(() ->
window.page(category.pageLike())
);
//Open the category's page when it's icon is clicked.
item.onClick(player ->
player.openInventory(categoryPage.get())
);
});
//Footer time.
for (int i = 0; i < 9; i++) {
Item item = page.element(rows + 1).icon(STAINED_GLASS_PANE);
if (index != 0 && i == 2)
item.data(RED.getDyeData()).onClick(player ->
//Navigate back one page.
player.openInventory(pages.get((int) (index - 1)).get())
);
else if (index != partitions.size() - 1 && i == 6)
item.data(GREEN.getDyeData()).onClick(player ->
//Navigate forward one page.
player.openInventory(pages.get((int) (index + 1)).get())
);
else
item.data(GRAY.getDyeData());
}
}))
).collect(toList()));
}
public Inventory getPage(int index) {
return pages.get(index).get();
}
}
interface Category {
static Category create(Consumer<Page> page, Consumer<Item> item) {
return new Category() {
@Override
public Consumer<Page> pageLike() {
return page;
}
@Override
public Consumer<Item> itemLike() {
return item;
}
};
}
Consumer<Page> pageLike();
Consumer<Item> itemLike();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment