Only load signs if we need to.
Large servers were having some performance issues in the blockphysicsevent in the signlistener class, this helps relieve that stress.
This commit is contained in:
@@ -18,6 +18,7 @@ package com.drtshock.playervaults;
|
||||
|
||||
import com.drtshock.playervaults.commands.*;
|
||||
import com.drtshock.playervaults.listeners.Listeners;
|
||||
import com.drtshock.playervaults.listeners.SignListener;
|
||||
import com.drtshock.playervaults.listeners.VaultPreloadListener;
|
||||
import com.drtshock.playervaults.tasks.Cleanup;
|
||||
import com.drtshock.playervaults.tasks.UUIDConversion;
|
||||
@@ -90,7 +91,6 @@ public class PlayerVaults extends JavaPlugin {
|
||||
debug("check update", System.currentTimeMillis());
|
||||
getCommand("pv").setExecutor(new VaultCommand());
|
||||
getCommand("pvdel").setExecutor(new DeleteCommand());
|
||||
getCommand("pvsign").setExecutor(new SignCommand());
|
||||
getCommand("workbench").setExecutor(new WorkbenchCommand());
|
||||
getCommand("pvconvert").setExecutor(new ConvertCommand());
|
||||
debug("registered commands", System.currentTimeMillis());
|
||||
@@ -130,7 +130,10 @@ public class PlayerVaults extends JavaPlugin {
|
||||
|
||||
player.closeInventory();
|
||||
}
|
||||
saveSignsFile();
|
||||
|
||||
if (getConfig().getBoolean("cleanup.enable", false)) {
|
||||
saveSignsFile();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -196,6 +199,12 @@ public class PlayerVaults extends JavaPlugin {
|
||||
}
|
||||
|
||||
private void loadSigns() {
|
||||
if (!getConfig().getBoolean("signs-enabled", true)) {
|
||||
return;
|
||||
}
|
||||
|
||||
getCommand("pvsign").setExecutor(new SignCommand());
|
||||
getServer().getPluginManager().registerEvents(new SignListener(this), this);
|
||||
File signs = new File(getDataFolder(), "signs.yml");
|
||||
if (!signs.exists()) {
|
||||
try {
|
||||
@@ -227,6 +236,10 @@ public class PlayerVaults extends JavaPlugin {
|
||||
}
|
||||
|
||||
private void saveSignsFile() {
|
||||
if (!getConfig().getBoolean("signs-enabled", true)) {
|
||||
return;
|
||||
}
|
||||
|
||||
saveQueued = false;
|
||||
try {
|
||||
signs.save(this.signsFile);
|
||||
|
||||
@@ -31,9 +31,6 @@ import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||
import org.bukkit.event.entity.EntityChangeBlockEvent;
|
||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
@@ -101,125 +98,6 @@ public class Listeners implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onInteract(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
if (PlayerVaults.getInstance().getInVault().containsKey(player.getName())) {
|
||||
Block block = event.getClickedBlock();
|
||||
// Different inventories that we don't want the player to open.
|
||||
if (block.getType() == Material.CHEST || block.getType() == Material.TRAPPED_CHEST || block.getType() == Material.ENDER_CHEST || block.getType() == Material.FURNACE || block.getType() == Material.BURNING_FURNACE || block.getType() == Material.BREWING_STAND || block.getType() == Material.ENCHANTMENT_TABLE || block.getType() == Material.BEACON) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (PlayerVaults.getInstance().getSetSign().containsKey(player.getName())) {
|
||||
int i = PlayerVaults.getInstance().getSetSign().get(player.getName()).getChest();
|
||||
boolean self = PlayerVaults.getInstance().getSetSign().get(player.getName()).isSelf();
|
||||
String owner = self ? null : PlayerVaults.getInstance().getSetSign().get(player.getName()).getOwner();
|
||||
PlayerVaults.getInstance().getSetSign().remove(player.getName());
|
||||
event.setCancelled(true);
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
if (event.getClickedBlock().getType() == Material.WALL_SIGN || event.getClickedBlock().getType() == Material.SIGN_POST) {
|
||||
Sign s = (Sign) event.getClickedBlock().getState();
|
||||
Location l = s.getLocation();
|
||||
String world = l.getWorld().getName();
|
||||
int x = l.getBlockX();
|
||||
int y = l.getBlockY();
|
||||
int z = l.getBlockZ();
|
||||
if (self) {
|
||||
plugin.getSigns().set(world + ";;" + x + ";;" + y + ";;" + z + ".self", true);
|
||||
} else {
|
||||
plugin.getSigns().set(world + ";;" + x + ";;" + y + ";;" + z + ".owner", owner);
|
||||
}
|
||||
plugin.getSigns().set(world + ";;" + x + ";;" + y + ";;" + z + ".chest", i);
|
||||
plugin.saveSigns();
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.SET_SIGN);
|
||||
} else {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.NOT_A_SIGN);
|
||||
}
|
||||
} else {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.NOT_A_SIGN);
|
||||
}
|
||||
return;
|
||||
}
|
||||
Block b = event.getClickedBlock();
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
if (b.getType() == Material.WALL_SIGN || b.getType() == Material.SIGN_POST) {
|
||||
Location l = b.getLocation();
|
||||
String world = l.getWorld().getName();
|
||||
int x = l.getBlockX();
|
||||
int y = l.getBlockY();
|
||||
int z = l.getBlockZ();
|
||||
if (plugin.getSigns().getKeys(false).contains(world + ";;" + x + ";;" + y + ";;" + z)) {
|
||||
int num = PlayerVaults.getInstance().getSigns().getInt(world + ";;" + x + ";;" + y + ";;" + z + ".chest", 1);
|
||||
if (player.hasPermission("playervaults.signs.use") || player.hasPermission("playervaults.signs.bypass")) {
|
||||
boolean self = PlayerVaults.getInstance().getSigns().getBoolean(world + ";;" + x + ";;" + y + ";;" + z + ".self", false);
|
||||
String owner = self ? player.getName() : PlayerVaults.getInstance().getSigns().getString(world + ";;" + x + ";;" + y + ";;" + z + ".owner");
|
||||
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(owner != null ? owner : event.getPlayer().getName()); // Not best way but :\
|
||||
if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore()) {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.VAULT_DOES_NOT_EXIST.toString());
|
||||
return;
|
||||
}
|
||||
if (self) {
|
||||
// We already checked that they can use signs, now lets check if they have this many vaults.
|
||||
if (VaultOperations.checkPerms(player, num)) {
|
||||
Inventory inv = UUIDVaultManager.getInstance().loadOwnVault(player, num, VaultOperations.getMaxVaultSize(player));
|
||||
player.openInventory(inv);
|
||||
} else {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.NO_PERMS.toString());
|
||||
return; // Otherwise it would try to add vault view info down there.
|
||||
}
|
||||
} else {
|
||||
Inventory inv = UUIDVaultManager.getInstance().loadOtherVault(offlinePlayer.getUniqueId(), num, VaultOperations.getMaxVaultSize(offlinePlayer));
|
||||
if (inv == null) {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.VAULT_DOES_NOT_EXIST.toString());
|
||||
} else {
|
||||
player.openInventory(inv);
|
||||
}
|
||||
}
|
||||
PlayerVaults.getInstance().getInVault().put(player.getUniqueId().toString(), new VaultViewInfo((self) ? player.getName() : owner, num));
|
||||
event.setCancelled(true);
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.OPEN_WITH_SIGN.toString().replace("%v", String.valueOf(num)).replace("%p", (self) ? player.getName() : owner));
|
||||
} else {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.NO_PERMS);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onBlockPhysics(BlockPhysicsEvent event) {
|
||||
blockChangeCheck(event.getBlock().getLocation());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onEntityChangeBlock(EntityChangeBlockEvent event) {
|
||||
blockChangeCheck(event.getBlock().getLocation());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
blockChangeCheck(event.getBlock().getLocation());
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the location given is a sign, and if so, remove it from the signs.yml file
|
||||
*
|
||||
* @param location The location to check
|
||||
*/
|
||||
public void blockChangeCheck(Location location) {
|
||||
String world = location.getWorld().getName();
|
||||
int x = location.getBlockX();
|
||||
int y = location.getBlockY();
|
||||
int z = location.getBlockZ();
|
||||
if (plugin.getSigns().getKeys(false).contains(world + ";;" + x + ";;" + y + ";;" + z)) {
|
||||
plugin.getSigns().set(world + ";;" + x + ";;" + y + ";;" + z, null);
|
||||
plugin.saveSigns();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onInteractEntity(PlayerInteractEntityEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
package com.drtshock.playervaults.listeners;
|
||||
|
||||
import com.drtshock.playervaults.PlayerVaults;
|
||||
import com.drtshock.playervaults.util.Lang;
|
||||
import com.drtshock.playervaults.vaultmanagement.UUIDVaultManager;
|
||||
import com.drtshock.playervaults.vaultmanagement.VaultOperations;
|
||||
import com.drtshock.playervaults.vaultmanagement.VaultViewInfo;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||
import org.bukkit.event.entity.EntityChangeBlockEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
|
||||
public class SignListener implements Listener {
|
||||
|
||||
private PlayerVaults plugin;
|
||||
|
||||
public SignListener(PlayerVaults plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onInteract(PlayerInteractEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
if (PlayerVaults.getInstance().getInVault().containsKey(player.getName())) {
|
||||
Block block = event.getClickedBlock();
|
||||
// Different inventories that we don't want the player to open.
|
||||
if (block.getType() == Material.CHEST || block.getType() == Material.TRAPPED_CHEST || block.getType() == Material.ENDER_CHEST || block.getType() == Material.FURNACE || block.getType() == Material.BURNING_FURNACE || block.getType() == Material.BREWING_STAND || block.getType() == Material.ENCHANTMENT_TABLE || block.getType() == Material.BEACON) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (PlayerVaults.getInstance().getSetSign().containsKey(player.getName())) {
|
||||
int i = PlayerVaults.getInstance().getSetSign().get(player.getName()).getChest();
|
||||
boolean self = PlayerVaults.getInstance().getSetSign().get(player.getName()).isSelf();
|
||||
String owner = self ? null : PlayerVaults.getInstance().getSetSign().get(player.getName()).getOwner();
|
||||
PlayerVaults.getInstance().getSetSign().remove(player.getName());
|
||||
event.setCancelled(true);
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
if (event.getClickedBlock().getType() == Material.WALL_SIGN || event.getClickedBlock().getType() == Material.SIGN_POST) {
|
||||
Sign s = (Sign) event.getClickedBlock().getState();
|
||||
Location l = s.getLocation();
|
||||
String world = l.getWorld().getName();
|
||||
int x = l.getBlockX();
|
||||
int y = l.getBlockY();
|
||||
int z = l.getBlockZ();
|
||||
if (self) {
|
||||
plugin.getSigns().set(world + ";;" + x + ";;" + y + ";;" + z + ".self", true);
|
||||
} else {
|
||||
plugin.getSigns().set(world + ";;" + x + ";;" + y + ";;" + z + ".owner", owner);
|
||||
}
|
||||
plugin.getSigns().set(world + ";;" + x + ";;" + y + ";;" + z + ".chest", i);
|
||||
plugin.saveSigns();
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.SET_SIGN);
|
||||
} else {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.NOT_A_SIGN);
|
||||
}
|
||||
} else {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.NOT_A_SIGN);
|
||||
}
|
||||
return;
|
||||
}
|
||||
Block b = event.getClickedBlock();
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
if (b.getType() == Material.WALL_SIGN || b.getType() == Material.SIGN_POST) {
|
||||
Location l = b.getLocation();
|
||||
String world = l.getWorld().getName();
|
||||
int x = l.getBlockX();
|
||||
int y = l.getBlockY();
|
||||
int z = l.getBlockZ();
|
||||
if (plugin.getSigns().getKeys(false).contains(world + ";;" + x + ";;" + y + ";;" + z)) {
|
||||
int num = PlayerVaults.getInstance().getSigns().getInt(world + ";;" + x + ";;" + y + ";;" + z + ".chest", 1);
|
||||
if (player.hasPermission("playervaults.signs.use") || player.hasPermission("playervaults.signs.bypass")) {
|
||||
boolean self = PlayerVaults.getInstance().getSigns().getBoolean(world + ";;" + x + ";;" + y + ";;" + z + ".self", false);
|
||||
String owner = self ? player.getName() : PlayerVaults.getInstance().getSigns().getString(world + ";;" + x + ";;" + y + ";;" + z + ".owner");
|
||||
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(owner != null ? owner : event.getPlayer().getName()); // Not best way but :\
|
||||
if (offlinePlayer == null || !offlinePlayer.hasPlayedBefore()) {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.VAULT_DOES_NOT_EXIST.toString());
|
||||
return;
|
||||
}
|
||||
if (self) {
|
||||
// We already checked that they can use signs, now lets check if they have this many vaults.
|
||||
if (VaultOperations.checkPerms(player, num)) {
|
||||
Inventory inv = UUIDVaultManager.getInstance().loadOwnVault(player, num, VaultOperations.getMaxVaultSize(player));
|
||||
player.openInventory(inv);
|
||||
} else {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.NO_PERMS.toString());
|
||||
return; // Otherwise it would try to add vault view info down there.
|
||||
}
|
||||
} else {
|
||||
Inventory inv = UUIDVaultManager.getInstance().loadOtherVault(offlinePlayer.getUniqueId(), num, VaultOperations.getMaxVaultSize(offlinePlayer));
|
||||
if (inv == null) {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.VAULT_DOES_NOT_EXIST.toString());
|
||||
} else {
|
||||
player.openInventory(inv);
|
||||
}
|
||||
}
|
||||
PlayerVaults.getInstance().getInVault().put(player.getUniqueId().toString(), new VaultViewInfo((self) ? player.getName() : owner, num));
|
||||
event.setCancelled(true);
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.OPEN_WITH_SIGN.toString().replace("%v", String.valueOf(num)).replace("%p", (self) ? player.getName() : owner));
|
||||
} else {
|
||||
player.sendMessage(Lang.TITLE.toString() + Lang.NO_PERMS);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onBlockPhysics(BlockPhysicsEvent event) {
|
||||
blockChangeCheck(event.getBlock().getLocation());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onEntityChangeBlock(EntityChangeBlockEvent event) {
|
||||
blockChangeCheck(event.getBlock().getLocation());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
blockChangeCheck(event.getBlock().getLocation());
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the location given is a sign, and if so, remove it from the signs.yml file
|
||||
*
|
||||
* @param location The location to check
|
||||
*/
|
||||
public void blockChangeCheck(Location location) {
|
||||
if (plugin.getSigns().getKeys(false).isEmpty()) {
|
||||
return; // Save us a check.
|
||||
}
|
||||
|
||||
String world = location.getWorld().getName();
|
||||
int x = location.getBlockX();
|
||||
int y = location.getBlockY();
|
||||
int z = location.getBlockZ();
|
||||
if (plugin.getSigns().getKeys(false).contains(world + ";;" + x + ";;" + y + ";;" + z)) {
|
||||
plugin.getSigns().set(world + ";;" + x + ";;" + y + ";;" + z, null);
|
||||
plugin.saveSigns();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user