package com.leontg77.uhc.cmds;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Difficulty;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.Sound;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scoreboard.Team;
import com.leontg77.uhc.Game;
import com.leontg77.uhc.Main;
import com.leontg77.uhc.Parkour;
import com.leontg77.uhc.Scoreboards;
import com.leontg77.uhc.State;
import com.leontg77.uhc.Teams;
import com.leontg77.uhc.utils.EntityUtils;
import com.leontg77.uhc.utils.GameUtils;
import com.leontg77.uhc.utils.PlayerUtils;
import com.leontg77.uhc.utils.ScatterUtils;
/**
* Spread command class.
*
* @author LeonTG77
*/
public class SpreadCommand implements CommandExecutor {
public static final HashMap<String, Location> scatterLocs = new HashMap<String, Location>();
public static boolean isReady = true;
@Override
public boolean onCommand(final CommandSender sender, Command cmd, String label, String[] args) {
if (!sender.hasPermission("uhc.spread")) {
sender.sendMessage(Main.NO_PERM_MSG);
return true;
}
if (args.length < 3) {
sender.sendMessage(Main.PREFIX + "Usage: /spread <radius> <teamspread> <player|*>");
return true;
}
Game game = Game.getInstance();
final String name = game.getWorld().getName();
if (Bukkit.getWorld(name) == null) {
sender.sendMessage(ChatColor.RED + "There are no worlds called " + name + ".");
return true;
}
final boolean teams;
final int radius;
try {
radius = Integer.parseInt(args[0]);
} catch (Exception e) {
sender.sendMessage(ChatColor.RED + "Invaild radius.");
return true;
}
if (args[1].equalsIgnoreCase("true")) {
teams = true;
}
else if (args[1].equalsIgnoreCase("false")) {
teams = false;
}
else {
sender.sendMessage(ChatColor.RED + "Teamspread must be true of false");
return true;
}
if (args[2].equalsIgnoreCase("*")) {
State.setState(State.SCATTER);
Parkour.getInstance().reset();
isReady = false;
int t = 0;
int s = 0;
if (!game.isFFA() && game.getTeamSize() > 1) {
for (OfflinePlayer whitelisted : Bukkit.getServer().getWhitelistedPlayers()) {
if (Scoreboards.getInstance().board.getEntryTeam(whitelisted.getName()) == null) {
Team team = Teams.getInstance().findAvailableTeam();
if (team != null) {
team.addEntry(whitelisted.getName());
}
}
}
}
for (Team te : Teams.getInstance().getTeams()) {
if (te.getSize() > 0) {
if (te.getSize() > 1) {
t++;
} else {
s++;
}
}
}
for (World world : GameUtils.getGameWorlds()) {
world.setTime(0);
world.setDifficulty(Difficulty.HARD);
world.setPVP(false);
world.setGameRuleValue("doDaylightCycle", "true");
world.setSpawnFlags(false, true);
world.setThundering(false);
world.setStorm(false);
for (Entity mob : world.getEntities()) {
if (EntityUtils.isButcherable(mob.getType())) {
mob.remove();
}
}
}
final int te = t;
final int so = s;
if (teams) {
PlayerUtils.broadcast(Main.PREFIX + "Scattering �a" + t + " �7teams and �a" + s + " �7solos...");
} else {
PlayerUtils.broadcast(Main.PREFIX + "Scattering �a" + Bukkit.getServer().getWhitelistedPlayers().size() + " �7players...");
}
for (Player online : PlayerUtils.getPlayers()) {
online.playSound(online.getLocation(), Sound.FIREWORK_LAUNCH, 1, 1);
}
new BukkitRunnable() {
public void run() {
PlayerUtils.broadcast(Main.PREFIX + "Finding scatter locations...");
for (Player online : PlayerUtils.getPlayers()) {
online.playSound(online.getLocation(), Sound.NOTE_BASS, 1, 1);
}
if (teams) {
List<Location> loc = ScatterUtils.getScatterLocations(Bukkit.getWorld(name), radius, te + so);
int index = 0;
for (Team tem : Teams.getInstance().getTeamsWithPlayers()) {
for (String player : tem.getEntries()) {
scatterLocs.put(player, loc.get(index));
PlayerUtils.getOfflinePlayer(player).setWhitelisted(true);
}
index++;
}
for (OfflinePlayer online : Bukkit.getServer().getWhitelistedPlayers()) {
if (Scoreboards.getInstance().board.getEntryTeam(online.getName()) == null) {
scatterLocs.put(online.getName(), loc.get(index));
index++;
}
}
} else {
List<Location> loc = ScatterUtils.getScatterLocations(Bukkit.getWorld(name), radius, Bukkit.getServer().getWhitelistedPlayers().size());
int index = 0;
for (OfflinePlayer online : Bukkit.getServer().getWhitelistedPlayers()) {
scatterLocs.put(online.getName(), loc.get(index));
index++;
}
}
}
}.runTaskLater(Main.plugin, 30);
new BukkitRunnable() {
public void run() {
PlayerUtils.broadcast(Main.PREFIX + "Locations found, loading chunks...");
for (Player online : PlayerUtils.getPlayers()) {
online.playSound(online.getLocation(), Sound.NOTE_BASS, 1, 1);
}
final ArrayList<Location> locs = new ArrayList<Location>(scatterLocs.values());
final ArrayList<String> names = new ArrayList<String>(scatterLocs.keySet());
new BukkitRunnable() {
int i = 0;
public void run() {
if (i < locs.size()) {
if (sender instanceof Player) {
Player player = (Player) sender;
player.teleport(locs.get(i));
} else {
locs.get(i).getChunk().load(true);
}
i++;
} else {
cancel();
locs.clear();
PlayerUtils.broadcast(Main.PREFIX + "All chunks loaded, starting scatter...");
for (Player online : PlayerUtils.getPlayers()) {
online.playSound(online.getLocation(), Sound.NOTE_BASS, 1, 1);
}
new BukkitRunnable() {
int i = 0;
public void run() {
if (i < names.size()) {
Player scatter = Bukkit.getServer().getPlayer(names.get(i));
if (scatter == null) {
PlayerUtils.broadcast(Main.PREFIX + "- �c" + names.get(i) + " �7offline, scheduled.");
for (Player online : PlayerUtils.getPlayers()) {
online.playSound(online.getLocation(), "random.pop", 1, 0);
}
} else {
scatter.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 1726272000, 128));
scatter.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 1726272000, 6));
scatter.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 1726272000, 6));
scatter.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_DIGGING, 1726272000, 10));
scatter.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 1726272000, 6));
scatter.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1726272000, 2));
scatter.teleport(scatterLocs.get(names.get(i)));
PlayerUtils.broadcast(Main.PREFIX + "- �a" + names.get(i) + " �7has been scattered.");
scatterLocs.remove(names.get(i));
for (Player online : PlayerUtils.getPlayers()) {
online.playSound(online.getLocation(), "random.pop", 1, 0);
}
}
i++;
} else {
PlayerUtils.broadcast(Main.PREFIX + "The scatter has finished.");
isReady = true;
names.clear();
cancel();
for (Player online : PlayerUtils.getPlayers()) {
online.playSound(online.getLocation(), Sound.FIREWORK_TWINKLE, 1, 1);
}
}
}
}.runTaskTimer(Main.plugin, 40, 3);
}
}
}.runTaskTimer(Main.plugin, 5, 5);
}
}.runTaskLater(Main.plugin, 60);
} else {
final Player target = Bukkit.getPlayer(args[2]);
if (target == null) {
sender.sendMessage(ChatColor.RED + "That player is not online.");
return true;
}
PlayerUtils.broadcast(Main.PREFIX + "Scattering �a" + target.getName() + "�7...");
new BukkitRunnable() {
public void run() {
PlayerUtils.broadcast(Main.PREFIX + "Finding scatter location...");
if (teams) {
if (target.getScoreboard().getEntryTeam(target.getName()) == null) {
List<Location> loc = ScatterUtils.getScatterLocations(Bukkit.getWorld(name), radius, 1);
scatterLocs.put(target.getName(), loc.get(0));
return;
}
Team tem = target.getScoreboard().getEntryTeam(target.getName());
for (String tm : tem.getEntries()) {
Player temmate = Bukkit.getServer().getPlayer(tm);
if (temmate != null) {
scatterLocs.put(target.getName(), temmate.getLocation());
break;
}
}
} else {
List<Location> loc = ScatterUtils.getScatterLocations(Bukkit.getWorld(name), radius, 1);
scatterLocs.put(target.getName(), loc.get(0));
}
}
}.runTaskLater(Main.plugin, 30);
new BukkitRunnable() {
public void run() {
PlayerUtils.broadcast(Main.PREFIX + "Location found, scattering...");
if (!target.isOnline()) {
PlayerUtils.broadcast(Main.PREFIX + "- �c" + target.getName() + " �7offline, scheduled.");
} else {
if (State.isState(State.SCATTER)) {
target.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 1726272000, 128));
target.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 1726272000, 6));
target.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 1726272000, 6));
target.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_DIGGING, 1726272000, 10));
target.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 1726272000, 6));
target.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1726272000, 2));
}
target.teleport(scatterLocs.get(target.getName()));
PlayerUtils.broadcast(Main.PREFIX + "- �a" + target.getName() + " �7has been scattered.");
scatterLocs.remove(target.getName());
}
}
}.runTaskLater(Main.plugin, 60);
}
return true;
}
}