Initial commit
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
package com.alttd.GUI;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.Merchant;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.UUID;
|
||||
|
||||
public interface GUI {
|
||||
HashMap<UUID, GUI> GUIByUUID = new HashMap<>();
|
||||
|
||||
void open(Player player);
|
||||
|
||||
GUIAction getAction(int slot);
|
||||
|
||||
Inventory getInventory();
|
||||
|
||||
Merchant getMerchant();
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.alttd.GUI;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public interface GUIAction {
|
||||
void click(Player player);
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.alttd.GUI;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.Merchant;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public abstract class GUIInventory implements GUI {
|
||||
|
||||
protected final Inventory inventory;
|
||||
protected final HashMap<Integer, GUIAction> actions;
|
||||
|
||||
public GUIInventory(InventoryType type, Component name) {
|
||||
inventory = Bukkit.createInventory(null, type, name);
|
||||
actions = new HashMap<>();
|
||||
}
|
||||
|
||||
public Merchant getMerchant() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Inventory getInventory() {
|
||||
return inventory;
|
||||
}
|
||||
|
||||
public void setItem(int slot, ItemStack stack, GUIAction action){
|
||||
inventory.setItem(slot, stack);
|
||||
if (action != null){
|
||||
actions.put(slot, action);
|
||||
}
|
||||
}
|
||||
|
||||
public void setItem(int slot, ItemStack stack){
|
||||
setItem(slot, stack, null);
|
||||
}
|
||||
|
||||
public void open(Player player){
|
||||
player.openInventory(inventory);
|
||||
GUIByUUID.put(player.getUniqueId(), this);
|
||||
}
|
||||
|
||||
public GUIAction getAction(int slot) {
|
||||
return actions.get(slot);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
package com.alttd.GUI;
|
||||
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.event.inventory.TradeSelectEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.MerchantRecipe;
|
||||
|
||||
public class GUIListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onClick(InventoryClickEvent event){
|
||||
if (!(event.getWhoClicked() instanceof Player player)){
|
||||
return;
|
||||
}
|
||||
|
||||
GUI gui = GUI.GUIByUUID.get(player.getUniqueId());
|
||||
if (gui == null || gui.getInventory() == null) {
|
||||
if (event.getSlotType().equals(InventoryType.SlotType.CRAFTING) && event.getRawSlot() < 2)
|
||||
event.setCancelled(true);
|
||||
else if (event.getRawSlot() == 2 && event.getSlotType().equals(InventoryType.SlotType.RESULT)) {
|
||||
event.setCancelled(true);
|
||||
onResultSlotClick(event, gui);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!gui.getInventory().equals(event.getInventory())) {
|
||||
return;
|
||||
}
|
||||
event.setCancelled(true);
|
||||
GUIAction action = gui.getAction(event.getSlot());
|
||||
|
||||
if (action != null){
|
||||
action.click(player);
|
||||
}
|
||||
}
|
||||
|
||||
private void onResultSlotClick(InventoryClickEvent event, GUI gui) {
|
||||
ItemStack currentItem = event.getCurrentItem();
|
||||
if (currentItem == null)
|
||||
return;
|
||||
if (event.getClick().isShiftClick())
|
||||
event.getWhoClicked().sendMessage(MiniMessage.get().parse(currentItem.getType().name() + ": " + event.getCurrentItem().getType().getMaxStackSize()));
|
||||
else
|
||||
event.getWhoClicked().sendMessage(MiniMessage.get().parse(currentItem.getType().name() + ": " + event.getCurrentItem().getAmount()));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onTradeSelect(TradeSelectEvent event) {
|
||||
if (!(event.getWhoClicked() instanceof Player player)){
|
||||
return;
|
||||
}
|
||||
|
||||
GUI gui = GUI.GUIByUUID.get(player.getUniqueId());
|
||||
if ((!(gui instanceof GUIMerchant guiMerchant)))
|
||||
return;
|
||||
if (!gui.getMerchant().equals(event.getMerchant())) {
|
||||
return;
|
||||
}
|
||||
event.setCancelled(true);
|
||||
GUIAction action = guiMerchant.getAction(event.getIndex());
|
||||
|
||||
if (action != null){
|
||||
action.click(player);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onClose(InventoryCloseEvent event) {
|
||||
GUI.GUIByUUID.remove(event.getPlayer().getUniqueId());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onQuit(PlayerQuitEvent event){
|
||||
GUI.GUIByUUID.remove(event.getPlayer().getUniqueId());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package com.alttd.GUI;
|
||||
|
||||
import com.alttd.objects.VillagerType;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.*;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
public abstract class GUIMerchant implements GUI{
|
||||
|
||||
protected final Merchant merchant;
|
||||
protected final HashMap<Integer, GUIAction> actions;
|
||||
private final VillagerType villagerType;
|
||||
|
||||
public GUIMerchant(Component name, VillagerType villagerType) {
|
||||
merchant = Bukkit.createMerchant(name);
|
||||
actions = new HashMap<>();
|
||||
this.villagerType = villagerType;
|
||||
}
|
||||
|
||||
public Merchant getMerchant() {
|
||||
return merchant;
|
||||
}
|
||||
|
||||
public Inventory getInventory() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addItem(@NotNull ItemStack result, @NotNull ItemStack one, @Nullable ItemStack two, @Nullable GUIAction action){
|
||||
MerchantRecipe merchantRecipe = new MerchantRecipe(result, 0, 10000, false, 0, 0);
|
||||
merchantRecipe.addIngredient(one);
|
||||
if (two != null)
|
||||
merchantRecipe.addIngredient(two);
|
||||
merchantRecipe.setPriceMultiplier(0);
|
||||
ArrayList<MerchantRecipe> recipes = new ArrayList<>(merchant.getRecipes());
|
||||
recipes.add(merchantRecipe);
|
||||
merchant.setRecipes(recipes);
|
||||
|
||||
if (action != null){
|
||||
actions.put(recipes.size() - 1, action);
|
||||
}
|
||||
}
|
||||
|
||||
public void open(Player player){
|
||||
player.openMerchant(merchant, false);
|
||||
GUIByUUID.put(player.getUniqueId(), this);
|
||||
}
|
||||
|
||||
public GUIAction getAction(int slot) {
|
||||
return actions.get(slot);
|
||||
}
|
||||
|
||||
public VillagerType getVillagerType() {
|
||||
return villagerType;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.alttd.GUI.windows;
|
||||
|
||||
import com.alttd.GUI.GUIMerchant;
|
||||
import com.alttd.config.Config;
|
||||
import com.alttd.economy.Calculation;
|
||||
import com.alttd.objects.VillagerType;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.Template;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
public class BuyGUI extends GUIMerchant {
|
||||
|
||||
private static final MiniMessage miniMessage = MiniMessage.get();
|
||||
|
||||
public BuyGUI(VillagerType villagerType) {
|
||||
super(MiniMessage.get().parse(Config.BUY_WINDOW,
|
||||
Template.of("trader", villagerType.getDisplayName()),
|
||||
Template.of("percentage", "100")), villagerType); //TODO get percentage from player somehow
|
||||
for (ItemStack itemStack : villagerType.getBuying()) {
|
||||
double price = Calculation.price(itemStack);
|
||||
addItem(itemStack,
|
||||
getPriceItem(price),
|
||||
null,
|
||||
player -> player.sendMessage(MiniMessage.get().parse("Hi! you bought: " + itemStack.getAmount() + " " + itemStack.getType().name() + " for " + price + "."))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private ItemStack getPriceItem(double price) {
|
||||
if (price < 0) return nameItem(new ItemStack(Material.BARRIER), -1);
|
||||
else if (price <= 10) return nameItem(new ItemStack(Material.IRON_INGOT), price);
|
||||
else if (price <= 100) return nameItem(new ItemStack(Material.GOLD_INGOT), price);
|
||||
else if (price <= 500) return nameItem(new ItemStack(Material.DIAMOND), price);
|
||||
else return nameItem(new ItemStack(Material.NETHERITE_INGOT), price);
|
||||
}
|
||||
|
||||
private ItemStack nameItem(ItemStack itemStack, double price) {
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
itemMeta.displayName(miniMessage.parse("<green>" + price + "</green>")); //TODO configurable
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
return itemStack;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.alttd.GUI.windows;
|
||||
|
||||
import com.alttd.GUI.GUIInventory;
|
||||
import com.alttd.config.Config;
|
||||
import com.alttd.objects.VillagerType;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.Template;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
public class OpenGUI extends GUIInventory {
|
||||
|
||||
private static final ItemStack BUY = new ItemStack(Material.GOLD_INGOT);
|
||||
private static final ItemStack SELL = new ItemStack(Material.BUCKET);
|
||||
|
||||
static {
|
||||
MiniMessage miniMessage = MiniMessage.get();
|
||||
ItemMeta itemMeta;
|
||||
{
|
||||
itemMeta = BUY.getItemMeta();
|
||||
itemMeta.displayName(miniMessage.parse("<green>Buy</green>"));
|
||||
BUY.setItemMeta(itemMeta);
|
||||
}
|
||||
{
|
||||
itemMeta = SELL.getItemMeta();
|
||||
itemMeta.displayName(miniMessage.parse("<green>Sell</green>"));
|
||||
SELL.setItemMeta(itemMeta);
|
||||
}
|
||||
}
|
||||
|
||||
public OpenGUI(VillagerType villagerType) {
|
||||
super(InventoryType.HOPPER, MiniMessage.get().parse(Config.INITIAL_VILLAGER_WINDOW,
|
||||
Template.of("trader", villagerType.getDisplayName()),
|
||||
Template.of("percentage", "100"))); //TODO get percentage from player somehow
|
||||
setItem(1, BUY, player -> new BuyGUI(villagerType).open(player));
|
||||
setItem(3, SELL, player -> new SellGUI(villagerType).open(player));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.alttd.GUI.windows;
|
||||
|
||||
import com.alttd.GUI.GUIMerchant;
|
||||
import com.alttd.config.Config;
|
||||
import com.alttd.economy.Calculation;
|
||||
import com.alttd.objects.VillagerType;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.Template;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
public class SellGUI extends GUIMerchant {
|
||||
|
||||
private static final MiniMessage miniMessage = MiniMessage.get();
|
||||
|
||||
public SellGUI(VillagerType villagerType) {
|
||||
super(MiniMessage.get().parse(Config.SELL_WINDOW,
|
||||
Template.of("trader", villagerType.getDisplayName()),
|
||||
Template.of("percentage", "100")), villagerType); //TODO get percentage from player somehow
|
||||
for (ItemStack itemStack : villagerType.getSelling()) {
|
||||
double price = Calculation.price(itemStack);
|
||||
addItem(itemStack,
|
||||
getPriceItem(price),
|
||||
null,
|
||||
player -> player.sendMessage(MiniMessage.get().parse("Hi! you sold: " + itemStack.getAmount() + " " + itemStack.getType().name() + " for " + price + "."))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private ItemStack getPriceItem(double price) {
|
||||
if (price < 0) return nameItem(new ItemStack(Material.BARRIER), -1);
|
||||
else if (price <= 10) return nameItem(new ItemStack(Material.IRON_INGOT), price);
|
||||
else if (price <= 100) return nameItem(new ItemStack(Material.GOLD_INGOT), price);
|
||||
else if (price <= 500) return nameItem(new ItemStack(Material.DIAMOND), price);
|
||||
else return nameItem(new ItemStack(Material.NETHERITE_INGOT), price);
|
||||
}
|
||||
|
||||
private ItemStack nameItem(ItemStack itemStack, double price) {
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
itemMeta.displayName(miniMessage.parse("<red>" + price * -1 + "</red>")); //TODO configurable
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
return itemStack;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user