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:
drtshock
2015-07-25 14:21:51 -05:00
parent 67b11db40d
commit 444ae3d1ab
5 changed files with 177 additions and 125 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<groupId>com.drtshock</groupId> <groupId>com.drtshock</groupId>
<artifactId>PlayerVaults</artifactId> <artifactId>PlayerVaults</artifactId>
<version>3.5.6</version> <version>3.5.7</version>
<name>PlayerVaults</name> <name>PlayerVaults</name>
<url>http://dev.bukkit.org/bukkit-plugins/playervaults/</url> <url>http://dev.bukkit.org/bukkit-plugins/playervaults/</url>
@@ -18,6 +18,7 @@ package com.drtshock.playervaults;
import com.drtshock.playervaults.commands.*; import com.drtshock.playervaults.commands.*;
import com.drtshock.playervaults.listeners.Listeners; import com.drtshock.playervaults.listeners.Listeners;
import com.drtshock.playervaults.listeners.SignListener;
import com.drtshock.playervaults.listeners.VaultPreloadListener; import com.drtshock.playervaults.listeners.VaultPreloadListener;
import com.drtshock.playervaults.tasks.Cleanup; import com.drtshock.playervaults.tasks.Cleanup;
import com.drtshock.playervaults.tasks.UUIDConversion; import com.drtshock.playervaults.tasks.UUIDConversion;
@@ -90,7 +91,6 @@ public class PlayerVaults extends JavaPlugin {
debug("check update", System.currentTimeMillis()); debug("check update", System.currentTimeMillis());
getCommand("pv").setExecutor(new VaultCommand()); getCommand("pv").setExecutor(new VaultCommand());
getCommand("pvdel").setExecutor(new DeleteCommand()); getCommand("pvdel").setExecutor(new DeleteCommand());
getCommand("pvsign").setExecutor(new SignCommand());
getCommand("workbench").setExecutor(new WorkbenchCommand()); getCommand("workbench").setExecutor(new WorkbenchCommand());
getCommand("pvconvert").setExecutor(new ConvertCommand()); getCommand("pvconvert").setExecutor(new ConvertCommand());
debug("registered commands", System.currentTimeMillis()); debug("registered commands", System.currentTimeMillis());
@@ -130,8 +130,11 @@ public class PlayerVaults extends JavaPlugin {
player.closeInventory(); player.closeInventory();
} }
if (getConfig().getBoolean("cleanup.enable", false)) {
saveSignsFile(); saveSignsFile();
} }
}
@Override @Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String args[]) { public boolean onCommand(CommandSender sender, Command cmd, String label, String args[]) {
@@ -196,6 +199,12 @@ public class PlayerVaults extends JavaPlugin {
} }
private void loadSigns() { 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"); File signs = new File(getDataFolder(), "signs.yml");
if (!signs.exists()) { if (!signs.exists()) {
try { try {
@@ -227,6 +236,10 @@ public class PlayerVaults extends JavaPlugin {
} }
private void saveSignsFile() { private void saveSignsFile() {
if (!getConfig().getBoolean("signs-enabled", true)) {
return;
}
saveQueued = false; saveQueued = false;
try { try {
signs.save(this.signsFile); signs.save(this.signsFile);
@@ -31,9 +31,6 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; 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.entity.PlayerDeathEvent;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent; 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) @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onInteractEntity(PlayerInteractEntityEvent event) { public void onInteractEntity(PlayerInteractEntityEvent event) {
Player player = event.getPlayer(); 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();
}
}
}
+6
View File
@@ -14,6 +14,12 @@ download-update: false
# Should probably only enabled this if you're working with drtshock to fix something. # Should probably only enabled this if you're working with drtshock to fix something.
debug: false debug: false
# Signs
# Do you want to enable signs?
# You can checkout the project page for info on what this is if you don't know.
# This can save some performance on servers with 250+ players if disabled.
signs-enabled: false
# Settings here are for economy integration. playervaults.free bypasses it. # Settings here are for economy integration. playervaults.free bypasses it.
economy: economy:
enabled: false enabled: false