/**
* Copyright (C) 2012 t7seven7t
*/
package net.t7seven7t.swornguard.handlers;
import java.io.File;
import java.util.logging.Level;
import net.dmulloy2.io.FileSerialization;
import net.dmulloy2.util.FormatUtil;
import net.dmulloy2.util.TimeUtil;
import net.dmulloy2.util.Util;
import net.t7seven7t.swornguard.SwornGuard;
import net.t7seven7t.swornguard.events.JailEvent;
import net.t7seven7t.swornguard.events.UnjailEvent;
import net.t7seven7t.swornguard.tasks.InmateTimerTask;
import net.t7seven7t.swornguard.types.JailData;
import net.t7seven7t.swornguard.types.PlayerData;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
/**
* @author t7seven7t
*/
public class JailHandler {
private final SwornGuard plugin;
private final JailData jail;
public JailHandler(final SwornGuard plugin) {
this.plugin = plugin;
this.jail = loadJail();
}
private final JailData loadJail() {
File file = new File(plugin.getDataFolder(), "jail.yml");
if (file.exists()) {
try {
JailData data = FileSerialization.load(file, JailData.class);
if (data != null)
return data;
} catch (Throwable ex) {
plugin.getLogHandler().log(Level.WARNING, Util.getUsefulStack(ex, "loading jail"));
plugin.getLogHandler().log(Level.INFO, "Creating a new jail save.");
}
}
return new JailData();
}
public void saveJail() {
try {
FileSerialization.save(jail, new File(plugin.getDataFolder(), "jail.yml"));
} catch (Throwable ex) {
plugin.getLogHandler().log(Level.WARNING, Util.getUsefulStack(ex, "saving jail"));
}
}
public void unjail(final OfflinePlayer offlinePlayer, String unjailer) {
PlayerData data = plugin.getPlayerDataCache().getData(offlinePlayer);
// Player isn't jailed
if (!data.isJailed())
return;
UnjailEvent event = new UnjailEvent(offlinePlayer);
plugin.getServer().getPluginManager().callEvent(event);
data.setJailed(false);
data.setJailTime(0);
if (unjailer != null)
data.getProfilerList().add(FormatUtil.format( plugin.getMessage("profiler_event"),
TimeUtil.getLongDateCurr(),
FormatUtil.format(plugin.getMessage("profiler_unjail"), unjailer)));
if (offlinePlayer.isOnline()) {
release(offlinePlayer.getPlayer());
} else {
data.setUnjailNextLogin(true);
}
}
public void release(final Player player) {
PlayerData data = plugin.getPlayerDataCache().getData(player);
data.setUnjailNextLogin(false);
player.teleport(jail.getExit());
player.sendMessage(FormatUtil.format(plugin.getMessage("jail_unjail")));
}
public void jail(final OfflinePlayer offlinePlayer, final long time, final String reason, final String jailer) {
PlayerData data = plugin.getPlayerDataCache().getData(offlinePlayer);
// Player is already jailed.
if (data.isJailed())
return;
JailEvent event = new JailEvent(offlinePlayer);
plugin.getServer().getPluginManager().callEvent(event);
if (event.isCancelled())
return;
data.setJailed(true);
data.setLastJail(System.currentTimeMillis());
data.setLastJailer(jailer);
data.setLastJailReason(reason);
if (data.getJails() == 0)
data.setJails(1);
else
data.setJails(data.getJails() + 1);
data.setJailTime(time);
data.getProfilerList().add(FormatUtil.format( plugin.getMessage("profiler_event"),
TimeUtil.getLongDateCurr(),
FormatUtil.format(plugin.getMessage("profiler_jail"), time, reason, jailer)));
if (offlinePlayer.isOnline()) {
Player player = offlinePlayer.getPlayer();
// Check if player is riding or being ridden
player.leaveVehicle();
player.eject();
// Teleport player to jail
player.teleport(jail.getSpawn());
player.sendMessage(FormatUtil.format(plugin.getMessage("jail_jail"), TimeUtil.formatTime(time), reason, jailer));
// Begin count down of player's time
new InmateTimerTask(plugin, player, data).runTaskTimer(plugin, 20L, 20L);
}
}
public void checkPlayerInJail(final Player player) {
if (! jail.isInside(player.getLocation())) {
// Check if player is riding or being ridden
player.leaveVehicle();
player.eject();
player.teleport(jail.getSpawn());
player.sendMessage(FormatUtil.format(plugin.getMessage("jail_escape")));
}
}
public final boolean isInsideJail(final Location location) {
return jail != null && jail.isInside(location);
}
public JailData getJail() {
return jail;
}
}