package me.gtacraft.plugins.safezone;
import com.google.common.collect.Lists;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import lombok.Getter;
import me.gtacraft.economy.EconomyAPI;
import me.gtacraft.plugins.gtarespawn.GTARespawn;
import me.gtacraft.plugins.safezone.event.SafezoneListener;
import me.gtacraft.plugins.safezone.hook.WorldHooks;
import me.gtacraft.plugins.safezone.task.ScanLocationTask;
import me.gtacraft.plugins.safezone.util.SafezoneUtil;
import me.vaqxine.GTAWS.WantedAPI;
import org.bukkit.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Minecart;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by Connor on 6/27/14. Designed for the GTA-Safezone project.
*/
public class Safezone extends JavaPlugin {
@Getter
private static Safezone instance;
@Getter
private List<ProtectedRegion> safeZoneRegions = Lists.newArrayList();
@Getter
private World world;
public static volatile ConcurrentHashMap<Player, Integer> async_player_map = new ConcurrentHashMap<Player, Integer>();
public void onEnable() {
instance = this;
saveDefaultConfig();
WorldHooks.init();
world = Bukkit.getWorld(getConfig().getString("world"));
for (String region : getConfig().getStringList("zones")) {
ProtectedRegion pr = WorldHooks.getRegion(world, region);
if (pr == null)
continue;
safeZoneRegions.add(pr);
}
new SafezoneListener();
Bukkit.getScheduler().scheduleAsyncRepeatingTask(this, new ScanLocationTask(), 5l, 5l);
SafezoneUtil.tick();
}
public static HashMap<UUID, Integer> safezone_teleport_task_ids = new HashMap<UUID, Integer>();
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (cmd.getName().equalsIgnoreCase("safezone")) {
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED+"You must be a player to use this command!");
return true;
}
final Player pl = (Player)sender;
int wantedLevel = WantedAPI.getWantedLevel(pl.getName());
final int taxiTime = (wantedLevel == 0 ? 6 : wantedLevel*10);
if (taxiTime > 20) {
pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c&l(!) &cYou cannot hail a taxi with your current wanted level!"));
pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7... No one wants to drive a criminal :(..."));
return true;
}
if (SafezoneUtil.isInSafeZone(pl.getLocation())) {
pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c&l(!) &cYou are already in a safezone!"));
return true;
}
if (pl.getVehicle() != null && pl.getVehicle() instanceof Minecart) {
pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c&l(!) &cYou cannot hail a taxi while in a car!"));
return true;
}
pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a&l(!) &7A taxi will drive you to the nearest safezone!"));
int taskID = Bukkit.getScheduler().runTaskTimerAsynchronously(this, new Runnable() {
int i = 0;
final Location cast_loc = pl.getLocation();
public void run() {
if (pl == null || !pl.isOnline() || !safezone_teleport_task_ids.containsKey(pl.getUniqueId()))
return; // Cancelled soon enough.
if (SafezoneUtil.getSubscribedTime(pl.getName() + "_combat") != -1) {
// They're in combat, cancel task.
pl.sendMessage(ChatColor.RED.toString() + ChatColor.BOLD + "(!)" + ChatColor.RED + " You took damage, the taxi driver was scared off!");
if (safezone_teleport_task_ids.containsKey(pl.getUniqueId())) {
int taskid = safezone_teleport_task_ids.get(pl.getUniqueId());
safezone_teleport_task_ids.remove(pl.getUniqueId());
Bukkit.getScheduler().cancelTask(taskid);
return;
}
}
if (pl.getLocation().distanceSquared(cast_loc) > 4.0D) {
// Too much movement.
pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c&l(!) &cYou moved, the taxi can't find you!"));
if (safezone_teleport_task_ids.containsKey(pl.getUniqueId())) {
// Cancel task.
int taskid = safezone_teleport_task_ids.get(pl.getUniqueId());
safezone_teleport_task_ids.remove(pl.getUniqueId());
Bukkit.getScheduler().cancelTask(taskid);
return;
}
}
i++;
if (i >= taxiTime + 1) {
// Teleport! Yay!
Bukkit.getServer().getScheduler().runTask(Safezone.this, new Runnable() {
public void run() {
pl.teleport(GTARespawn.getClosest(pl.getLocation()));
double cash = EconomyAPI.getUserBalance(pl.getUniqueId());
boolean charge = (cash >= 2);
pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a&l(!) &aThe taxi dropped you off at the closest safe zone!"));
if (charge) {
pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7You paid &a&l$2&r&7 to the taxi driver!"));
EconomyAPI.setUserBalance(pl.getUniqueId(), cash - 2);
}
pl.playSound(pl.getLocation(), Sound.LEVEL_UP, 1F, 1F);
}
});
int taskid = safezone_teleport_task_ids.get(pl.getUniqueId());
safezone_teleport_task_ids.remove(pl.getUniqueId());
Bukkit.getScheduler().cancelTask(taskid);
return;
} else {
pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7The taxi will arrive in &e" + (taxiTime - i) + " &7second(s)!"));
pl.playSound(pl.getLocation(), Sound.CLICK, 1F, 2F);
}
}
}, 20L, 20L).getTaskId();
safezone_teleport_task_ids.put(pl.getUniqueId(), taskID);
return true;
}
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED+"You must be a player to use this command!");
return true;
}
if (!(sender.hasPermission("safezone.addsafezone"))) {
sender.sendMessage(ChatColor.RED+"You do not have permission to use this command!");
return true;
}
Player player = (Player)sender;
if (args.length == 0) {
player.sendMessage(ChatColor.RED+"Please specify a region to add as a safe zone!");
return true;
}
String zoneName = args[0];
for (ProtectedRegion possibleMatch : WorldHooks.getAllRegions(player.getWorld())) {
if (possibleMatch.getId().equalsIgnoreCase(zoneName)) {
String saveConf = possibleMatch.getId();
List<String> config = getConfig().getStringList("zones");
config.add(saveConf);
getConfig().set("zones", config);
saveConfig();
reloadConfig();
safeZoneRegions.add(possibleMatch);
player.sendMessage(ChatColor.GREEN+"Safe zone location saved! Region ID: "+ChatColor.YELLOW+saveConf+ChatColor.GREEN+"!");
return true;
}
}
player.sendMessage(ChatColor.RED+"No such region in this world!");
return true;
}
public void onDisable() {
saveDefaultConfig();
}
}