package me.gtacraft.plugins.gtarespawn;
import com.google.common.collect.Lists;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashMap;
import java.util.List;
/**
* Created by Connor on 6/25/14. Designed for the GTA-Respawn project.
*/
public class GTARespawn extends JavaPlugin implements Listener {
private static List<Location> respawn_locations = Lists.newArrayList();
public void onEnable() {
saveDefaultConfig();
for (String loc : getConfig().getStringList("hospitals")) {
String[] split = loc.split(",");
World world = Bukkit.getWorld(split[0]);
double x = Double.parseDouble(split[1]);
double y = Double.parseDouble(split[2]);
double z = Double.parseDouble(split[3]);
float yaw = Float.parseFloat(split[4]);
float pitch = Float.parseFloat(split[5]);
respawn_locations.add(new Location(world, x, y, z, yaw, pitch));
}
getServer().getPluginManager().registerEvents(this, this);
}
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (!(sender.isOp())) {
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4Error: &cYou do not have permission to use this command!"));
return true;
}
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4Error: &cYou must be a player to use this command!"));
return true;
}
Player player = (Player)sender;
Location at = player.getLocation();
String loc = at.getWorld().getName()+","+at.getX()+","+at.getY()+","+at.getZ()+","+at.getYaw()+","+at.getPitch();
List<String> config = getConfig().getStringList("hospitals");
config.add(loc);
getConfig().set("hospitals", config);
respawn_locations.add(at);
saveConfig();
player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eYou added a hospital respawn location at: &7"+loc+"&e!"));
return true;
}
public static Location getClosest(Location other) {
Location closest = null;
for (Location hospital : respawn_locations) {
if(closest == null)
closest = hospital;
if (closest.distance(other) > hospital.distance(other))
closest = hospital;
}
return closest.clone().add(0, 0.5, 0);
}
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
Location died = event.getEntity().getLocation();
respawn.put(event.getEntity(), getClosest(died));
}
private HashMap<Player, Location> respawn = new HashMap<>();
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerRespawn(final PlayerRespawnEvent event) {
Runnable respawn = new Runnable() {
@Override
public void run() {
event.getPlayer().teleport(GTARespawn.this.respawn.remove(event.getPlayer()));
}
};
Bukkit.getScheduler().scheduleSyncDelayedTask(this, respawn, 1l);
}
public void onDisable() {
saveDefaultConfig();
}
public static double distanceToClosest(Location location) {
Location closest = null;
for (Location hospital : respawn_locations) {
if(closest == null)
closest = hospital;
if (closest.distance(location) > hospital.distance(location))
closest = hospital;
}
return location.distance(closest);
}
}