Newer
Older
ChallengesJoinEntities / src / main / java / de / fanta / challengesjoinentities / adventure / ui / AdventureMapsUI.java
@fanta fanta on 29 Nov 2021 3 KB Update to 1.18-rc3
package de.fanta.challengesjoinentities.adventure.ui;

import de.fanta.challengesjoinentities.ChallengesJoinEntities;
import de.fanta.challengesjoinentities.ChatUtil;
import de.fanta.challengesjoinentities.Server;
import de.fanta.challengesjoinentities.adventure.AdventureMap;
import de.fanta.challengesjoinentities.adventure.Category;
import de.fanta.challengesjoinentities.utils.ui.AbstractWindow;
import de.fanta.challengesjoinentities.utils.ui.ItemUtil;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.TextColor;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

public class AdventureMapsUI extends AbstractWindow {
  private final ChallengesJoinEntities plugin;
  
  private final Category category;
  
  private final Map<Integer, AdventureMap> mapsPerSlot = new HashMap<>();
  
  private final int BACK_INDEX = getInventory().getSize() - 9;
  
  public AdventureMapsUI(ChallengesJoinEntities plugin, Category category, Player player) {
    super(player, Bukkit.createInventory(player, 9 * (category.getMaps().size() / 7 + ((category.getMaps().size() % 7 > 0) ? 1 : 0)) + 18, ChatUtil.RED + category.getName() + "Map's "));
    this.category = category;
    this.plugin = plugin;
  }
  
  protected void rebuildInventory() {
    List<AdventureMap> maps = this.category.getMaps().stream().sorted(Comparator.comparing(AdventureMap::getName)).toList();
    int row = 0;
    int cat = 0;
    for (AdventureMap category : maps) {
      int slot = row * 9 + cat + 10;
      getInventory().setItem(slot, category.getItem());
      this.mapsPerSlot.put(slot, category);
      if (cat < 6) {
        cat++;
        continue;
      } 
      row++;
      cat = 0;
    } 
    ItemStack backButtton = new ItemStack(Material.PAPER);
    ItemMeta meta = backButtton.getItemMeta();
    meta.setDisplayName("" + ChatColor.GREEN + "Zurück");
    backButtton.setItemMeta(meta);
    getInventory().setItem(this.BACK_INDEX, backButtton);
    for (int i1 = 0; i1 < getInventory().getSize(); i1++) {
      ItemStack item = getInventory().getItem(i1);
      if (item == null)
        getInventory().setItem(i1, ItemUtil.EMPTY_ICON); 
    } 
  }
  
  public void onItemClicked(InventoryClickEvent event) {
    super.onItemClicked(event);
    int slot = event.getSlot();
    AdventureMap map = this.mapsPerSlot.get(slot);
    Player p = getPlayer();
    if (map != null) {
      if (event.isRightClick()) {
        getPlayer().sendMessage(ChallengesJoinEntities.PREFIX_COMPONENT.append(Component.text("MapLink: klick mich :)", TextColor.color(Color.YELLOW.asRGB())).clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, map.getWebLink()))));
      } else if (!Server.serverPlayers.containsValue(p.getUniqueId())) {
        this.plugin.getPluginConfig().getOnlineAdventureServer().ifPresentOrElse(server -> server.loadNewAdventure(p, category.getName(), map.getName()), () -> ChatUtil.sendErrorMessage(p, "Aktuell ist kein Server Frei!"));
      } else {
        ChatUtil.sendErrorMessage(p, "Du kannst nur einen Server starten!");
      } 
      getPlayer().closeInventory();
    } 
    if (slot == this.BACK_INDEX)
      (new CategoryUI(this.plugin, this.plugin.getCategoriesConfig(), p)).open(); 
  }
}