2011-12-06 16:28:48 +00:00
|
|
|
package com.earth2me.essentials;
|
|
|
|
|
2012-01-31 08:06:50 +00:00
|
|
|
import static com.earth2me.essentials.I18n._;
|
2011-12-06 16:28:48 +00:00
|
|
|
import com.earth2me.essentials.api.IJails;
|
|
|
|
import com.earth2me.essentials.storage.AsyncStorageObjectHolder;
|
|
|
|
import java.io.File;
|
|
|
|
import java.util.*;
|
|
|
|
import java.util.logging.Level;
|
|
|
|
import java.util.logging.Logger;
|
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
import org.bukkit.Location;
|
2012-04-05 02:22:49 +00:00
|
|
|
import org.bukkit.entity.Entity;
|
|
|
|
import org.bukkit.entity.EntityType;
|
2012-01-31 08:06:50 +00:00
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.EventPriority;
|
|
|
|
import org.bukkit.event.Listener;
|
|
|
|
import org.bukkit.event.block.BlockBreakEvent;
|
|
|
|
import org.bukkit.event.block.BlockDamageEvent;
|
|
|
|
import org.bukkit.event.block.BlockPlaceEvent;
|
2012-04-05 02:22:49 +00:00
|
|
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
|
|
|
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
2012-01-31 08:06:50 +00:00
|
|
|
import org.bukkit.event.player.PlayerInteractEvent;
|
|
|
|
import org.bukkit.event.player.PlayerJoinEvent;
|
|
|
|
import org.bukkit.event.player.PlayerRespawnEvent;
|
|
|
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
2011-12-07 01:12:36 +00:00
|
|
|
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
2011-12-06 16:28:48 +00:00
|
|
|
import org.bukkit.plugin.PluginManager;
|
|
|
|
|
|
|
|
|
|
|
|
public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.settings.Jails> implements IJails
|
|
|
|
{
|
|
|
|
private static final transient Logger LOGGER = Bukkit.getLogger();
|
2012-03-28 13:54:48 +00:00
|
|
|
private static transient boolean enabled = false;
|
2011-12-06 16:28:48 +00:00
|
|
|
|
|
|
|
public Jails(final IEssentials ess)
|
|
|
|
{
|
|
|
|
super(ess, com.earth2me.essentials.settings.Jails.class);
|
2011-12-07 15:50:16 +00:00
|
|
|
reloadConfig();
|
2011-12-06 16:28:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private void registerListeners()
|
|
|
|
{
|
2012-03-28 13:54:48 +00:00
|
|
|
enabled = true;
|
2011-12-06 16:28:48 +00:00
|
|
|
final PluginManager pluginManager = ess.getServer().getPluginManager();
|
2012-04-05 02:22:49 +00:00
|
|
|
final JailListener blockListener = new JailListener();
|
2012-01-31 08:06:50 +00:00
|
|
|
pluginManager.registerEvents(blockListener, ess);
|
2011-12-06 16:28:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public File getStorageFile()
|
|
|
|
{
|
|
|
|
return new File(ess.getDataFolder(), "jail.yml");
|
|
|
|
}
|
|
|
|
|
2012-03-28 13:54:48 +00:00
|
|
|
@Override
|
|
|
|
public void finishRead()
|
|
|
|
{
|
|
|
|
if (enabled == false && getCount() > 0)
|
|
|
|
{
|
|
|
|
registerListeners();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void finishWrite()
|
|
|
|
{
|
|
|
|
if (enabled == false)
|
|
|
|
{
|
|
|
|
registerListeners();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-12-06 16:28:48 +00:00
|
|
|
@Override
|
|
|
|
public Location getJail(final String jailName) throws Exception
|
|
|
|
{
|
|
|
|
acquireReadLock();
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if (getData().getJails() == null || jailName == null
|
|
|
|
|| !getData().getJails().containsKey(jailName.toLowerCase(Locale.ENGLISH)))
|
|
|
|
{
|
|
|
|
throw new Exception(_("jailNotExist"));
|
|
|
|
}
|
2011-12-19 10:53:34 +00:00
|
|
|
Location loc = getData().getJails().get(jailName.toLowerCase(Locale.ENGLISH));
|
|
|
|
if (loc == null || loc.getWorld() == null)
|
|
|
|
{
|
|
|
|
throw new Exception(_("jailNotExist"));
|
|
|
|
}
|
|
|
|
return loc;
|
2011-12-06 16:28:48 +00:00
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
|
|
|
unlock();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Collection<String> getList() throws Exception
|
|
|
|
{
|
|
|
|
acquireReadLock();
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if (getData().getJails() == null)
|
|
|
|
{
|
|
|
|
return Collections.emptyList();
|
|
|
|
}
|
|
|
|
return new ArrayList<String>(getData().getJails().keySet());
|
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
|
|
|
unlock();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void removeJail(final String jail) throws Exception
|
|
|
|
{
|
|
|
|
acquireWriteLock();
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if (getData().getJails() == null)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
getData().getJails().remove(jail.toLowerCase(Locale.ENGLISH));
|
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
|
|
|
unlock();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void sendToJail(final IUser user, final String jail) throws Exception
|
|
|
|
{
|
|
|
|
acquireReadLock();
|
|
|
|
try
|
|
|
|
{
|
2012-03-12 01:00:57 +00:00
|
|
|
if (user.isOnline())
|
2011-12-06 16:28:48 +00:00
|
|
|
{
|
2011-12-19 10:53:34 +00:00
|
|
|
Location loc = getJail(jail);
|
|
|
|
user.getTeleport().now(loc, false, TeleportCause.COMMAND);
|
2011-12-06 16:28:48 +00:00
|
|
|
}
|
|
|
|
user.setJail(jail);
|
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
|
|
|
unlock();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void setJail(final String jailName, final Location loc) throws Exception
|
|
|
|
{
|
|
|
|
acquireWriteLock();
|
|
|
|
try
|
|
|
|
{
|
|
|
|
if (getData().getJails() == null)
|
|
|
|
{
|
|
|
|
getData().setJails(new HashMap<String, Location>());
|
|
|
|
}
|
|
|
|
getData().getJails().put(jailName.toLowerCase(Locale.ENGLISH), loc);
|
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
|
|
|
unlock();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-15 08:08:25 +00:00
|
|
|
@Override
|
|
|
|
public int getCount()
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
return getList().size();
|
|
|
|
}
|
|
|
|
catch (Exception ex)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-12-06 16:28:48 +00:00
|
|
|
|
2012-04-05 02:22:49 +00:00
|
|
|
private class JailListener implements Listener
|
2011-12-06 16:28:48 +00:00
|
|
|
{
|
2012-03-10 21:42:46 +00:00
|
|
|
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
2011-12-06 16:28:48 +00:00
|
|
|
public void onBlockBreak(final BlockBreakEvent event)
|
|
|
|
{
|
|
|
|
final User user = ess.getUser(event.getPlayer());
|
|
|
|
if (user.isJailed())
|
|
|
|
{
|
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-10 21:42:46 +00:00
|
|
|
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
2011-12-06 16:28:48 +00:00
|
|
|
public void onBlockPlace(final BlockPlaceEvent event)
|
|
|
|
{
|
|
|
|
final User user = ess.getUser(event.getPlayer());
|
|
|
|
if (user.isJailed())
|
|
|
|
{
|
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-10 21:42:46 +00:00
|
|
|
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
2011-12-06 16:28:48 +00:00
|
|
|
public void onBlockDamage(final BlockDamageEvent event)
|
|
|
|
{
|
|
|
|
final User user = ess.getUser(event.getPlayer());
|
|
|
|
if (user.isJailed())
|
|
|
|
{
|
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-05 02:22:49 +00:00
|
|
|
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
|
|
|
public void onEntityDamageByEntity(final EntityDamageByEntityEvent event)
|
|
|
|
{
|
|
|
|
if (event.getCause() != DamageCause.ENTITY_ATTACK || event.getEntity().getType() != EntityType.PLAYER)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
final Entity damager = event.getDamager();
|
2012-04-05 12:28:23 +00:00
|
|
|
if (damager.getType() == EntityType.PLAYER)
|
2012-04-05 02:22:49 +00:00
|
|
|
{
|
2012-04-05 12:28:23 +00:00
|
|
|
final User user = ess.getUser(damager);
|
|
|
|
if (user != null && user.isJailed())
|
|
|
|
{
|
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
2012-04-05 02:22:49 +00:00
|
|
|
}
|
|
|
|
}
|
2011-12-06 16:28:48 +00:00
|
|
|
|
2012-03-10 21:42:46 +00:00
|
|
|
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
2011-12-06 16:28:48 +00:00
|
|
|
public void onPlayerInteract(final PlayerInteractEvent event)
|
|
|
|
{
|
|
|
|
final User user = ess.getUser(event.getPlayer());
|
|
|
|
if (user.isJailed())
|
|
|
|
{
|
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-27 03:24:58 +00:00
|
|
|
@EventHandler(priority = EventPriority.HIGHEST)
|
2011-12-06 16:28:48 +00:00
|
|
|
public void onPlayerRespawn(final PlayerRespawnEvent event)
|
|
|
|
{
|
|
|
|
final User user = ess.getUser(event.getPlayer());
|
|
|
|
if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
event.setRespawnLocation(getJail(user.getJail()));
|
|
|
|
}
|
|
|
|
catch (Exception ex)
|
|
|
|
{
|
2012-01-31 08:33:14 +00:00
|
|
|
if (ess.getSettings().isDebug())
|
|
|
|
{
|
|
|
|
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
|
|
|
|
}
|
2011-12-06 16:28:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-31 08:06:50 +00:00
|
|
|
@EventHandler(priority = EventPriority.HIGH)
|
2011-12-06 16:28:48 +00:00
|
|
|
public void onPlayerTeleport(final PlayerTeleportEvent event)
|
|
|
|
{
|
|
|
|
final User user = ess.getUser(event.getPlayer());
|
|
|
|
if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
event.setTo(getJail(user.getJail()));
|
|
|
|
}
|
|
|
|
catch (Exception ex)
|
|
|
|
{
|
2012-01-31 08:33:14 +00:00
|
|
|
if (ess.getSettings().isDebug())
|
|
|
|
{
|
|
|
|
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
|
|
|
|
}
|
2011-12-06 16:28:48 +00:00
|
|
|
}
|
|
|
|
user.sendMessage(_("jailMessage"));
|
|
|
|
}
|
|
|
|
|
2012-02-27 03:24:58 +00:00
|
|
|
@EventHandler(priority = EventPriority.HIGHEST)
|
2011-12-06 16:28:48 +00:00
|
|
|
public void onPlayerJoin(final PlayerJoinEvent event)
|
|
|
|
{
|
|
|
|
final User user = ess.getUser(event.getPlayer());
|
|
|
|
if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sendToJail(user, user.getJail());
|
|
|
|
}
|
|
|
|
catch (Exception ex)
|
|
|
|
{
|
2012-01-31 08:33:14 +00:00
|
|
|
if (ess.getSettings().isDebug())
|
|
|
|
{
|
|
|
|
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()), ex);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
LOGGER.log(Level.INFO, _("returnPlayerToJailError", user.getName(), ex.getLocalizedMessage()));
|
|
|
|
}
|
2011-12-06 16:28:48 +00:00
|
|
|
}
|
|
|
|
user.sendMessage(_("jailMessage"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|