Core/src/main/java/eu/univento/core/api/map/MapVoting.java

193 lines
5.9 KiB
Java

package eu.univento.core.api.map;
import eu.univento.core.api.player.CustomPlayer;
import eu.univento.core.api.player.Ranks;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
/**
* @author joethei
* @version 0.1
*/
public class MapVoting implements Listener{
private Map map1;
private Map map2;
private Map map3;
private String invTitle;
private ArrayList<CustomPlayer> votes1 = new ArrayList<>();
private ArrayList<CustomPlayer> votes2 = new ArrayList<>();
private ArrayList<CustomPlayer> votes3 = new ArrayList<>();
private Map forcedMap;
private ArrayList<Map> allMaps = new ArrayList<>();
public MapVoting(String invTitle) {
this.invTitle = invTitle;
}
public void vote(CustomPlayer p, Integer map) {
switch (map) {
case 1 : votes1.add(p);
case 2 : votes2.add(p);
case 3 : votes3.add(p);
}
}
public int getVotes(Integer map) {
switch (map) {
case 1 : return votes1.size();
case 2 : return votes2.size();
case 3 : return votes3.size();
default: return 0;
}
}
public Map getForcedMap() {
return forcedMap;
}
public Map getWinningMap() {
if(forcedMap != null) {
return forcedMap;
}
ArrayList<Integer> votes = new ArrayList<>();
votes.add(votes1.size());
votes.add(votes2.size());
votes.add(votes3.size());
int max = Collections.max(votes);
return getMap(getMapID(max));
}
public Map getMap(int id) {
switch (id) {
case 1: return map1;
case 2: return map2;
case 3: return map3;
default: return null;
}
}
public int getMapID(int votes) {
if(votes == votes1.size()) {
return 1;
}
if(votes == votes2.size()) {
return 2;
}
if(votes == votes3.size()) {
return 3;
}
return 0;
}
public void setVotingMaps() {
ArrayList<Map> temp = allMaps;
Random random = new Random();
map1 = allMaps.get(random.nextInt(temp.size()));
temp.remove(map1);
map2 = allMaps.get(random.nextInt(temp.size()));
temp.remove(map2);
map3 = allMaps.get(random.nextInt(temp.size()));
temp.remove(map3);
}
public void addMap(Map map) {
allMaps.add(map);
}
public Inventory getInventory(CustomPlayer p) {
if(p.isAllowed(Ranks.Admin)) {
Inventory inv = Bukkit.createInventory(p, 45, invTitle);
for(Map map : allMaps) {
ItemStack item = new ItemStack(map.getItem());
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(map.getName());
ArrayList<String> lore = new ArrayList<>();
lore.add("§aby " + map.getBuilder());
meta.setLore(lore);
inv.addItem(item);
}
return inv;
}else{
Inventory inv = Bukkit.createInventory(p, 9, invTitle);
ItemStack map1 = new ItemStack(this.map1.getItem());
ItemMeta map1Meta = map1.getItemMeta();
map1Meta.setDisplayName(this.map1.getName());
ArrayList<String> map1Lore = new ArrayList<>();
map1Lore.add("§aby " + this.map1.getBuilder());
map1Meta.setLore(map1Lore);
map1.setItemMeta(map1Meta);
ItemStack map2 = new ItemStack(this.map2.getItem());
ItemMeta map2Meta = map2.getItemMeta();
map2Meta.setDisplayName(this.map2.getName());
ArrayList<String> map2Lore = new ArrayList<>();
map2Lore.add("§aby " + this.map2.getBuilder());
map2Meta.setLore(map2Lore);
map2.setItemMeta(map2Meta);
ItemStack map3 = new ItemStack(this.map3.getItem());
ItemMeta map3Meta = map3.getItemMeta();
map3Meta.setDisplayName(this.map3.getName());
ArrayList<String> map3Lore = new ArrayList<>();
map3Lore.add("§aby " + this.map3.getBuilder());
map3Meta.setLore(map3Lore);
map3.setItemMeta(map3Meta);
inv.setItem(1, map1);
inv.setItem(4, map2);
inv.setItem(7, map3);
return inv;
}
}
@EventHandler
public void onInventoryClick(InventoryClickEvent e) {
if(e.getWhoClicked() instanceof Player) {
CustomPlayer p = CustomPlayer.getPlayer(e.getWhoClicked().getName());
if(e.getInventory().getName().equals(invTitle)) {
if(p.isAllowed(Ranks.Admin)) {
allMaps.stream().filter(map -> e.getCurrentItem().getType() == map.getItem()).forEach(map -> {
forcedMap = map;
});
}else{
if(e.getCurrentItem().getType() == map1.getItem()) {
vote(p, 1);
p.closeInventory();
}
if(e.getCurrentItem().getType() == map2.getItem()) {
vote(p, 2);
p.closeInventory();
}
if(e.getCurrentItem().getType() == map3.getItem()) {
vote(p, 3);
p.closeInventory();
}
}
}
}
}
public void registerListener(Plugin plugin) {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
}