package net.diamonddominion.esaych.survival;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
import net.diamonddominion.esaych.CustomPlugin;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import com.codisimus.plugins.pvpreward.PvPReward;
public class TopPvPers {
private CustomPlugin plugin;
public TopPvPers(CustomPlugin plugin) {
this.plugin = plugin;
}
private ArrayList<String> records = readFile();
private boolean processing = false;
public void enable() {
Calendar c = Calendar.getInstance();
int day = c.get(Calendar.DAY_OF_WEEK);
log ("Day: " + day);
if (day == 2 && highestKill(300)) {
log("Clearing all KDR's shortly");
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
@Override
public void run() {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "pvp reset kdr all");
}
}, 200);
}
// updateSigns();
// plugin.getServer().getPluginManager().registerEvents(this, plugin);
log("Enabled");
}
public boolean highestKill(int max) {
for (String line : records) {
String[] splitLine = line.split(";");
if (Integer.parseInt(splitLine[1]) > max) {
return true;
}
}
return false;
}
public ArrayList<String> readFile() {
ArrayList<String> lines = new ArrayList<String>();
try{
Scanner reader = new Scanner(new File("plugins/PvPReward/pvpreward.records"));
while(reader.hasNextLine()){;
String currentLine = reader.nextLine();
lines.add(currentLine);
}
}catch(FileNotFoundException e){
log("Could not load PvPReward Records!");
}
return lines;
}
public void setIndividualStats(String player, Sign sign) {
records = readFile();
sign.setLine(0, Bukkit.getPlayer(player).getPlayerListName());
double kdr = 0;
String[] splitLine = {player,"0","0","0"};
for (String line : records) {
splitLine = line.split(";");
if (splitLine[0].equals(player)) {
if (Integer.parseInt(splitLine[2]) != 0) {
kdr = (double)Integer.parseInt(splitLine[1]) / Integer.parseInt(splitLine[2]);
} else {
kdr = Integer.parseInt(splitLine[1]);
}
break;
}
}
sign.setLine(1, ChatColor.DARK_RED + "KDR: " + ChatColor.DARK_BLUE + kdr + " ");
sign.setLine(2, ChatColor.DARK_RED + "Kills: " + ChatColor.DARK_BLUE + splitLine[1] + " ");
sign.setLine(3, ChatColor.DARK_RED + "Deaths: " + ChatColor.DARK_BLUE + splitLine[2] + " ");
sign.update();
}
@SuppressWarnings("null")
public void updateSigns() {
records = readFile();
processing = true;
@SuppressWarnings({ "unchecked", "rawtypes" })
Map<String, Double> data = new HashMap();
ValueComparator bvc = new ValueComparator(data);
TreeMap<String,Double> tops = new TreeMap<String,Double>(bvc);
for (String line : records) {
String[] splitLine = line.split(";");
double kdr;
if (Integer.parseInt(splitLine[2]) != 0) {
kdr = (double)Integer.parseInt(splitLine[1]) / Integer.parseInt(splitLine[2]);
} else {
kdr = Integer.parseInt(splitLine[1]);
}
data.put(splitLine[0], kdr);
}
tops.putAll(data);
@SuppressWarnings("rawtypes")
Iterator it = tops.entrySet().iterator();
@SuppressWarnings({ "unchecked", "rawtypes" })
ArrayList<String> write = new ArrayList(0);
int playerNum = 1;
while (it.hasNext()) {
@SuppressWarnings("rawtypes")
Map.Entry pairs = (Map.Entry)it.next();
String nameLine = playerNum + ". " + pairs.getKey();
if (nameLine.length() > 14)
nameLine = nameLine.substring(0, 14);
nameLine += ":";
if (write == null) {
write.set(0, nameLine);
} else {
write.add(nameLine);
}
write.add(ChatColor.DARK_RED + "KDR: " + pairs.getValue());
playerNum++;
it.remove();
}
Sign sign;
try {
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 321).getBlock().getState();
sign.setLine(0, write.get(0));
sign.setLine(1, write.get(1));
sign.setLine(2, write.get(2));
sign.setLine(3, write.get(3));
sign.update();
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 322).getBlock().getState();
sign.setLine(0, write.get(4));
sign.setLine(1, write.get(5));
sign.setLine(2, write.get(6));
sign.setLine(3, write.get(7));
sign.update();
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 323).getBlock().getState();
sign.setLine(0, write.get(8));
sign.setLine(1, write.get(9));
sign.setLine(2, write.get(10));
sign.setLine(3, write.get(11));
sign.update();
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 324).getBlock().getState();
sign.setLine(0, write.get(12));
sign.setLine(1, write.get(13));
sign.setLine(2, write.get(14));
sign.setLine(3, write.get(15));
sign.update();
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 325).getBlock().getState();
sign.setLine(0, write.get(16));
sign.setLine(1, write.get(17));
sign.setLine(2, write.get(18));
sign.setLine(3, write.get(19));
sign.update();
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 326).getBlock().getState();
sign.setLine(0, write.get(20));
sign.setLine(1, write.get(21));
sign.setLine(2, write.get(22));
sign.setLine(3, write.get(23));
sign.update();
} catch (Exception e) {
log("Failed to write signs on left side!");
}
try {
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 326).getBlock().getState();
sign.setLine(0, write.get(0));
sign.setLine(1, write.get(1));
sign.setLine(2, write.get(2));
sign.setLine(3, write.get(3));
sign.update();
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 325).getBlock().getState();
sign.setLine(0, write.get(4));
sign.setLine(1, write.get(5));
sign.setLine(2, write.get(6));
sign.setLine(3, write.get(7));
sign.update();
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 324).getBlock().getState();
sign.setLine(0, write.get(8));
sign.setLine(1, write.get(9));
sign.setLine(2, write.get(10));
sign.setLine(3, write.get(11));
sign.update();
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 323).getBlock().getState();
sign.setLine(0, write.get(12));
sign.setLine(1, write.get(13));
sign.setLine(2, write.get(14));
sign.setLine(3, write.get(15));
sign.update();
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 322).getBlock().getState();
sign.setLine(0, write.get(16));
sign.setLine(1, write.get(17));
sign.setLine(2, write.get(18));
sign.setLine(3, write.get(19));
sign.update();
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 321).getBlock().getState();
sign.setLine(0, write.get(20));
sign.setLine(1, write.get(21));
sign.setLine(2, write.get(22));
sign.setLine(3, write.get(23));
sign.update();
} catch (Exception e) {
log("Failed to write signs on right side!");
}
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
public void run() {
processing = false;
}
}, 100L);
}
public boolean alreadyHasASign(Player player) {
ArrayList<String> topLines = new ArrayList<String>();
try {
Sign sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 321).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 322).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 323).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 324).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 325).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 272, 65, 326).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 326).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 325).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 324).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 323).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 322).getBlock().getState();
topLines.add(sign.getLine(0));
sign = (Sign) new Location(Bukkit.getWorld("Survival"), 246, 65, 321).getBlock().getState();
topLines.add(sign.getLine(0));
} catch (Exception e) {}
boolean already = topLines.contains(player.getPlayerListName());
if (already) {
player.sendMessage(ChatColor.GOLD + "[" + ChatColor.GREEN + "LeaderBoard" + ChatColor.GOLD + "]" + ChatColor.RED + " You have your own sign!");
}
return already;
}
// @EventHandler
public void onPlayerInteractEvent(PlayerInteractEvent event) {
Block clicked = event.getClickedBlock();
if (clicked != null && clicked.getState() instanceof Sign) {
Location loc = clicked.getLocation();
if (loc.getBlockX() == 246 || loc.getBlockX() == 272) {
if (loc.getBlockY() == 66) {
if (loc.getBlockZ() == 322 || loc.getBlockZ() == 325) {
if (!processing) {
updateSigns();
log(event.getPlayer().getName() + " reset sign data");
}
}
} else if (loc.getBlockY() == 65) {
if (loc.getBlockZ() >= 321 && loc.getBlockZ() <= 326) {
if(!alreadyHasASign(event.getPlayer()))
setIndividualStats(event.getPlayer().getName(), (Sign) clicked.getState());
}
}
}
}
}
// @EventHandler
public void onPlayerDeathEvent(EntityDeathEvent event) {
if (event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity();
Player killer = player.getKiller();
String world = player.getWorld().getName();
if (killer != null && killer instanceof Player && !(world.equals("Build") || world.equals("Destruction"))) {
if (!PvPReward.hasPermisson(killer, player) || world.equals("GameWorld")) {
PvPReward.getRecord(player.getName()).incrementDeaths();
PvPReward.getRecord(killer.getName()).incrementKills();
}
}
}
}
public void log(String info) {
plugin.getLogger().info("<TopPvPers> " + info);
}
}
class ValueComparator implements Comparator<String> {
Map<String, Double> base;
public ValueComparator(Map<String, Double> base) {
this.base = base;
}
// Note: this comparator imposes orderings that are inconsistent with equals.
public int compare(String a, String b) {
if (base.get(a) >= base.get(b)) {
return -1;
} else {
return 1;
} // returning 0 would merge keys
}
}