1
0
mirror of https://github.com/Zrips/Jobs.git synced 2025-01-02 14:29:07 +01:00

Option to limit furnace and brewind stand amount

Option to reset brewing stands and furnaces after server restart
This commit is contained in:
Zrips 2018-01-21 17:25:10 +02:00
parent 7cebc15fe9
commit 0f8d2c12dd
7 changed files with 542 additions and 23 deletions

View File

@ -96,6 +96,7 @@ import com.gamingmesh.jobs.listeners.PistonProtectionListener;
import com.gamingmesh.jobs.selection.SelectionManager;
import com.gamingmesh.jobs.stuff.ActionBar;
import com.gamingmesh.jobs.stuff.CMIScoreboardManager;
import com.gamingmesh.jobs.stuff.FurnaceBrewingHandling;
import com.gamingmesh.jobs.stuff.Loging;
import com.gamingmesh.jobs.stuff.RawMessage;
import com.gamingmesh.jobs.stuff.TabComplete;
@ -526,7 +527,6 @@ public class Jobs extends JavaPlugin {
* @throws IOException
*/
public void startup() {
instance = this;
try {
reload();
} catch (IOException e1) {
@ -740,6 +740,8 @@ public class Jobs extends JavaPlugin {
@Override
public void onEnable() {
instance = this;
running = true;
this.setEnabled(true);
@ -780,6 +782,8 @@ public class Jobs extends JavaPlugin {
YmlMaker jobShopItems = new YmlMaker(this, "shopItems.yml");
jobShopItems.saveDefaultConfig();
FurnaceBrewingHandling.load();
setPermissionHandler(new PermissionHandler(this));
setJobsClassloader();
setPlayerManager();
@ -849,6 +853,9 @@ public class Jobs extends JavaPlugin {
shopManager.CloseInventories();
dao.saveExplore();
dao.saveBlockProtection();
FurnaceBrewingHandling.save();
Jobs.shutdown();
String message = ChatColor.translateAlternateColorCodes('&', "&e[Jobs] &2Plugin has been disabled succesfully.");
ConsoleCommandSender console = Bukkit.getServer().getConsoleSender();

View File

@ -52,6 +52,8 @@ public class PermissionManager {
jobs_boost_all_all_AMOUNT(remade("jobs.boost.all.all.%AMOUNT%"), 60 * 1000),
jobs_spawner_AMOUNT(remade("jobs.nearspawner.%AMOUNT%"), 60 * 1000),
jobs_petpay_AMOUNT(remade("jobs.petpay.%AMOUNT%"), 60 * 1000),
jobs_maxfurnaces_AMOUNT(remade("jobs.maxfurnaces.%AMOUNT%"), 2 * 1000),
jobs_maxbrewingstands_AMOUNT(remade("jobs.maxbrewingstands.%AMOUNT%"), 2 * 1000),
// jobs_world_WORLDNAME(remade("jobs.world.%WORLDNAME%"), 60 * 1000)
;

View File

@ -139,6 +139,8 @@ public class LanguageManager {
c.get("general.error.ingame", "&cYou can use this command only in game!");
c.get("general.error.fromconsole", "&cYou can use this command only from console!");
c.get("general.error.worldisdisabled", "&cYou cant use command in this world!");
c.get("general.error.noFurnaceRegistration", "&cYou reached max furnace count!");
c.get("general.error.noBrewingRegistration", "&cYou reached max brewing stand count!");
c.get("command.help.output.info", "Type /jobs [cmd] ? for more information about a command.");
c.get("command.help.output.cmdUsage", "&2Usage: &7[command]");

View File

@ -76,6 +76,20 @@ public class YmlMaker {
}
}
public boolean exists() {
return this.ConfigFile.exists();
}
public void createNewFile() {
if (!this.ConfigFile.exists()) {
try {
this.ConfigFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void saveDefaultConfig() {
if (!this.ConfigFile.exists()) {
this.plugin.saveResource(this.fileName, false);

View File

@ -20,6 +20,7 @@ package com.gamingmesh.jobs.listeners;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@ -95,12 +96,13 @@ import com.gamingmesh.jobs.container.FastPayment;
import com.gamingmesh.jobs.container.JobProgression;
import com.gamingmesh.jobs.container.JobsPlayer;
import com.gamingmesh.jobs.stuff.Debug;
import com.gamingmesh.jobs.stuff.FurnaceBrewingHandling;
import com.google.common.base.Objects;
public class JobsPaymentListener implements Listener {
private Jobs plugin;
private final String furnaceOwnerMetadata = "jobsFurnaceOwner";
private final String brewingOwnerMetadata = "jobsBrewingOwner";
public static final String furnaceOwnerMetadata = "jobsFurnaceOwner";
public static final String brewingOwnerMetadata = "jobsBrewingOwner";
private final String BlockMetadata = "BlockOwner";
public static final String VegyMetadata = "VegyTimer";
private final String CowMetadata = "CowTimer";
@ -178,7 +180,7 @@ public class JobsPaymentListener implements Listener {
//disabling plugin in world
if (event.getPlayer() != null && !Jobs.getGCManager().canPerformActionInWorld(event.getPlayer().getWorld()))
return;
if (!(event.getEntity() instanceof Sheep))
return;
Sheep sheep = (Sheep) event.getEntity();
@ -233,7 +235,12 @@ public class JobsPaymentListener implements Listener {
MetadataValue value = data.get(0);
String playerName = value.asString();
JobsPlayer jPlayer = Jobs.getPlayerManager().getJobsPlayer(playerName);
UUID uuid = UUID.fromString(playerName);
if (uuid == null)
return;
JobsPlayer jPlayer = Jobs.getPlayerManager().getJobsPlayer(uuid);
if (jPlayer == null || !jPlayer.isOnline())
return;
@ -259,8 +266,8 @@ public class JobsPaymentListener implements Listener {
Block block = event.getBlock();
if (block == null)
return;
if (block.getType() == Material.FURNACE && block.hasMetadata(this.furnaceOwnerMetadata))
block.removeMetadata(this.furnaceOwnerMetadata, this.plugin);
if (block.getType() == Material.FURNACE && block.hasMetadata(furnaceOwnerMetadata))
FurnaceBrewingHandling.removeFurnace(block);
// make sure plugin is enabled
if (!this.plugin.isEnabled())
@ -750,8 +757,8 @@ public class JobsPaymentListener implements Listener {
return;
Block block = furnace.getBlock();
if (block.hasMetadata(this.furnaceOwnerMetadata))
block.removeMetadata(this.furnaceOwnerMetadata, this.plugin);
if (block.hasMetadata(furnaceOwnerMetadata))
FurnaceBrewingHandling.removeFurnace(block);
} catch (Exception e) {
e.printStackTrace();
}
@ -775,8 +782,8 @@ public class JobsPaymentListener implements Listener {
return;
Block block = stand.getBlock();
if (block.hasMetadata(this.brewingOwnerMetadata))
block.removeMetadata(this.brewingOwnerMetadata, this.plugin);
if (block.hasMetadata(brewingOwnerMetadata))
FurnaceBrewingHandling.removeBrewing(block);
} catch (Exception e) {
e.printStackTrace();
}
@ -793,16 +800,23 @@ public class JobsPaymentListener implements Listener {
if (block == null)
return;
if (!block.hasMetadata(this.furnaceOwnerMetadata))
if (!block.hasMetadata(furnaceOwnerMetadata))
return;
List<MetadataValue> data = block.getMetadata(this.furnaceOwnerMetadata);
List<MetadataValue> data = block.getMetadata(furnaceOwnerMetadata);
if (data.isEmpty())
return;
// only care about first
MetadataValue value = data.get(0);
String playerName = value.asString();
Player player = Bukkit.getServer().getPlayerExact(playerName);
Player player = null;
UUID uuid = UUID.fromString(playerName);
if (uuid == null)
return;
player = Bukkit.getPlayer(uuid);
if (player == null || !player.isOnline())
return;
@ -1283,8 +1297,8 @@ public class JobsPaymentListener implements Listener {
if (block == null)
continue;
if (block.getType() == Material.FURNACE && block.hasMetadata(this.furnaceOwnerMetadata))
block.removeMetadata(this.furnaceOwnerMetadata, this.plugin);
if (block.getType() == Material.FURNACE && block.hasMetadata(furnaceOwnerMetadata))
FurnaceBrewingHandling.removeFurnace(block);
if (Jobs.getGCManager().useBlockProtection)
if (block.getState().hasMetadata(BlockMetadata))
@ -1311,14 +1325,49 @@ public class JobsPaymentListener implements Listener {
return;
if (block.getType() == Material.FURNACE || block.getType() == Material.BURNING_FURNACE) {
if (block.hasMetadata(this.furnaceOwnerMetadata))
block.removeMetadata(this.furnaceOwnerMetadata, this.plugin);
block.setMetadata(this.furnaceOwnerMetadata, new FixedMetadataValue(this.plugin, event.getPlayer().getName()));
} else if (block.getType() == Material.BREWING_STAND) {
if (block.hasMetadata(brewingOwnerMetadata))
block.removeMetadata(brewingOwnerMetadata, this.plugin);
block.setMetadata(brewingOwnerMetadata, new FixedMetadataValue(this.plugin, event.getPlayer().getName()));
boolean done = FurnaceBrewingHandling.registerFurnaces(event.getPlayer(), block);
if (!done) {
boolean report = false;
if (block.hasMetadata(furnaceOwnerMetadata)) {
List<MetadataValue> data = block.getMetadata(furnaceOwnerMetadata);
if (data.isEmpty())
return;
// only care about first
MetadataValue value = data.get(0);
String uuid = value.asString();
if (!uuid.equals(event.getPlayer().getUniqueId().toString()))
report = true;
} else
report = true;
if (report)
Jobs.getActionBar().send(event.getPlayer(), Jobs.getLanguage().getMessage("general.error.noFurnaceRegistration"));
}
} else if (block.getType() == Material.BREWING_STAND) {
boolean done = FurnaceBrewingHandling.registerBrewingStand(event.getPlayer(), block);
if (!done) {
boolean report = false;
if (block.hasMetadata(brewingOwnerMetadata)) {
List<MetadataValue> data = block.getMetadata(brewingOwnerMetadata);
if (data.isEmpty())
return;
// only care about first
MetadataValue value = data.get(0);
String uuid = value.asString();
if (!uuid.equals(event.getPlayer().getUniqueId().toString()))
report = true;
} else
report = true;
if (report)
Jobs.getActionBar().send(event.getPlayer(), Jobs.getLanguage().getMessage("general.error.noBrewingRegistration"));
}
}
}

View File

@ -0,0 +1,342 @@
package com.gamingmesh.jobs.stuff;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.config.YmlMaker;
import com.gamingmesh.jobs.listeners.JobsPaymentListener;
public class FurnaceBrewingHandling {
public FurnaceBrewingHandling() {
}
static HashMap<UUID, List<blockLoc>> furnaceMap = new HashMap<UUID, List<blockLoc>>();
static HashMap<UUID, List<blockLoc>> brewingMap = new HashMap<UUID, List<blockLoc>>();
public static void load() {
YmlMaker f = new YmlMaker(Jobs.getInstance(), "furnaceBrewingStands.yml");
if (!f.exists())
return;
FileConfiguration config = f.getConfig();
if (config.contains("Furnace")) {
ConfigurationSection section = config.getConfigurationSection("Furnace");
try {
for (String one : section.getKeys(false)) {
String value = section.getString(one);
List<String> ls = new ArrayList<String>();
if (value.contains(";"))
ls.addAll(Arrays.asList(value.split(";")));
else
ls.add(value);
UUID uuid = UUID.fromString(one);
if (uuid == null)
continue;
List<blockLoc> blist = new ArrayList<blockLoc>();
for (String oneL : ls) {
blockLoc bl = new blockLoc(oneL);
Block block = bl.getBlock();
if (block == null)
continue;
block.removeMetadata(JobsPaymentListener.furnaceOwnerMetadata, Jobs.getInstance());
block.setMetadata(JobsPaymentListener.furnaceOwnerMetadata, new FixedMetadataValue(Jobs.getInstance(), one));
Debug.D("set meta " + block.getLocation().toString() + " " + one);
blist.add(bl);
}
if (!blist.isEmpty()) {
Debug.D("adding furnace " + uuid.toString() + " " + blist.size());
furnaceMap.put(uuid, blist);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
if (config.contains("Brewing")) {
ConfigurationSection section = config.getConfigurationSection("Brewing");
try {
for (String one : section.getKeys(false)) {
String value = section.getString(one);
List<String> ls = new ArrayList<String>();
if (value.contains(";"))
ls.addAll(Arrays.asList(value.split(";")));
else
ls.add(value);
UUID uuid = UUID.fromString(one);
if (uuid == null)
continue;
List<blockLoc> blist = new ArrayList<blockLoc>();
for (String oneL : ls) {
blockLoc bl = new blockLoc(oneL);
Block block = bl.getBlock();
if (block == null)
continue;
block.removeMetadata(JobsPaymentListener.brewingOwnerMetadata, Jobs.getInstance());
block.setMetadata(JobsPaymentListener.brewingOwnerMetadata, new FixedMetadataValue(Jobs.getInstance(), one));
blist.add(bl);
}
if (!blist.isEmpty())
brewingMap.put(uuid, blist);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void save() {
YmlMaker f = new YmlMaker(Jobs.getInstance(), "furnaceBrewingStands.yml");
f.createNewFile();
f.saveDefaultConfig();
FileConfiguration config = f.getConfig();
for (Entry<UUID, List<blockLoc>> one : furnaceMap.entrySet()) {
String full = "";
for (blockLoc oneL : one.getValue()) {
if (!full.isEmpty())
full += ";";
full += oneL.toString();
}
if (!full.isEmpty()) {
config.set("Furnace." + one.getKey().toString(), full);
}
}
for (Entry<UUID, List<blockLoc>> one : brewingMap.entrySet()) {
String full = "";
Debug.D("saving brewing stands " + one.getValue().size());
for (blockLoc oneL : one.getValue()) {
if (!full.isEmpty())
full += ";";
full += oneL.toString();
}
if (!full.isEmpty())
config.set("Brewing." + one.getKey().toString(), full);
}
f.saveConfig();
}
public static int getTotalFurnaces(Player player) {
List<blockLoc> ls = furnaceMap.get(player.getUniqueId());
if (ls == null)
return 0;
return ls.size();
}
public static int getTotalBrewingStands(Player player) {
List<blockLoc> ls = brewingMap.get(player.getUniqueId());
if (ls == null)
return 0;
return ls.size();
}
public static boolean removeFurnace(Block block) {
UUID uuid = null;
if (block.hasMetadata(JobsPaymentListener.furnaceOwnerMetadata)) {
List<MetadataValue> data = block.getMetadata(JobsPaymentListener.furnaceOwnerMetadata);
if (!data.isEmpty()) {
// only care about first
MetadataValue value = data.get(0);
String uuidS = value.asString();
uuid = UUID.fromString(uuidS);
}
}
List<blockLoc> ls = furnaceMap.get(uuid);
if (ls == null)
return true;
for (blockLoc one : ls) {
if (!one.getLocation().equals(block.getLocation()))
continue;
block.removeMetadata(JobsPaymentListener.furnaceOwnerMetadata, Jobs.getInstance());
ls.remove(one);
return true;
}
return false;
}
public static boolean removeBrewing(Block block) {
UUID uuid = null;
if (block.hasMetadata(JobsPaymentListener.furnaceOwnerMetadata)) {
List<MetadataValue> data = block.getMetadata(JobsPaymentListener.furnaceOwnerMetadata);
if (!data.isEmpty()) {
// only care about first
MetadataValue value = data.get(0);
String uuidS = value.asString();
uuid = UUID.fromString(uuidS);
}
}
List<blockLoc> ls = brewingMap.get(uuid);
if (ls == null)
return true;
for (blockLoc one : ls) {
if (!one.getLocation().equals(block.getLocation()))
continue;
block.removeMetadata(JobsPaymentListener.brewingOwnerMetadata, Jobs.getInstance());
ls.remove(one);
return true;
}
return false;
}
public static boolean registerFurnaces(Player player, Block block) {
if (block.getType() != Material.FURNACE && block.getType() != Material.BURNING_FURNACE) {
return false;
}
Double maxV = Jobs.getPermissionManager().getMaxPermission(Jobs.getPlayerManager().getJobsPlayer(player), "jobs.maxfurnaces");
if (maxV == null)
maxV = 0D;
int max = maxV.intValue();
int have = getTotalFurnaces(player);
boolean owner = false;
if (block.hasMetadata(JobsPaymentListener.furnaceOwnerMetadata)) {
List<MetadataValue> data = block.getMetadata(JobsPaymentListener.furnaceOwnerMetadata);
if (!data.isEmpty()) {
// only care about first
MetadataValue value = data.get(0);
String uuid = value.asString();
if (uuid.equals(player.getUniqueId().toString())) {
if (have > max)
removeFurnace(block);
owner = true;
}
}
}
if (owner)
return true;
if (have >= max && max > 0)
return false;
block.setMetadata(JobsPaymentListener.furnaceOwnerMetadata, new FixedMetadataValue(Jobs.getInstance(), player.getUniqueId().toString()));
// if (max == 0)
// return true;
List<blockLoc> ls = furnaceMap.get(player.getUniqueId());
if (ls == null)
ls = new ArrayList<blockLoc>();
ls.add(new blockLoc(block.getLocation()));
furnaceMap.put(player.getUniqueId(), ls);
return true;
}
public static boolean registerBrewingStand(Player player, Block block) {
if (block.getType() != Material.BREWING_STAND) {
return false;
}
Double maxV = Jobs.getPermissionManager().getMaxPermission(Jobs.getPlayerManager().getJobsPlayer(player), "jobs.maxbrewingstands");
if (maxV == null)
maxV = 0D;
int max = maxV.intValue();
int have = getTotalFurnaces(player);
boolean owner = false;
if (block.hasMetadata(JobsPaymentListener.brewingOwnerMetadata)) {
List<MetadataValue> data = block.getMetadata(JobsPaymentListener.brewingOwnerMetadata);
if (!data.isEmpty()) {
// only care about first
MetadataValue value = data.get(0);
String uuid = value.asString();
if (uuid.equals(player.getUniqueId().toString())) {
if (have > max)
removeBrewing(block);
owner = true;
}
}
}
if (owner)
return true;
if (have >= max && max > 0)
return false;
block.setMetadata(JobsPaymentListener.brewingOwnerMetadata, new FixedMetadataValue(Jobs.getInstance(), player.getUniqueId().toString()));
// if (max == 0)
// return true;
List<blockLoc> ls = brewingMap.get(player.getUniqueId());
if (ls == null)
ls = new ArrayList<blockLoc>();
ls.add(new blockLoc(block.getLocation()));
brewingMap.put(player.getUniqueId(), ls);
return true;
}
public static boolean clearFurnaces(Player player) {
furnaceMap.remove(player.getUniqueId());
return true;
}
public static boolean clearBrewingStands(Player player) {
brewingMap.remove(player.getUniqueId());
return true;
}
}

View File

@ -0,0 +1,103 @@
package com.gamingmesh.jobs.stuff;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
public class blockLoc {
private int x;
private int y;
private int z;
private String worldName;
private World w;
public blockLoc(String loc) {
this.fromString(loc);
}
public blockLoc(Location loc) {
x = loc.getBlockX();
y = loc.getBlockY();
z = loc.getBlockZ();
w = loc.getWorld();
worldName = loc.getWorld().getName();
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getZ() {
return z;
}
public void setZ(int z) {
this.z = z;
}
public String getWorldName() {
return worldName;
}
public void setWorldName(String worldName) {
this.worldName = worldName;
}
@Override
public String toString() {
return (w == null ? worldName : w.getName()) + ":" + x + ":" + y + ":" + z;
}
public boolean fromString(String loc) {
if (!loc.contains(":"))
return false;
String[] split = loc.split(":");
World w = Bukkit.getWorld(split[0]);
if (w == null)
return false;
this.w = w;
try {
x = Integer.parseInt(split[1]);
y = Integer.parseInt(split[2]);
z = Integer.parseInt(split[3]);
return true;
} catch (Exception e) {
return false;
}
}
public Block getBlock() {
Location loc = this.getLocation();
if (loc == null)
return null;
return loc.getBlock();
}
public Location getLocation() {
World w = this.w == null ? Bukkit.getWorld(worldName) : this.w;
if (w == null)
return null;
this.w = w;
Location loc = new Location(w, x, y, z);
return loc;
}
}