diff --git a/pom.xml b/pom.xml
index 476366cc..dc08668f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -126,6 +126,11 @@
+
+ org.ocpsoft.prettytime
+ prettytime
+ 4.0.0.Final
+
net.milkbowl.vault
VaultAPI
@@ -376,6 +381,12 @@
+
+ me.rayzr522
+ jsonmessage
+ 1.0.0
+ compile
+
org.codemc.worldguardwrapper
worldguardwrapper
@@ -411,6 +422,14 @@
spigot-repo
https://hub.spigotmc.org/nexus/content/groups/public/
+
+ org.ocpsoft.prettytime
+ https://mvnrepository.com/artifact/org.ocpsoft.prettytime/prettytime
+
+
+ rayzr-repo
+ https://cdn.rawgit.com/Rayzr522/maven-repo/master/
+
maven.sk89q.com
http://maven.sk89q.com/repo/
diff --git a/src/main/java/com/massivecraft/factions/Conf.java b/src/main/java/com/massivecraft/factions/Conf.java
index 43e702bf..274095dd 100644
--- a/src/main/java/com/massivecraft/factions/Conf.java
+++ b/src/main/java/com/massivecraft/factions/Conf.java
@@ -70,6 +70,7 @@ public class Conf {
public static boolean chatTagEnabled = true;
public static transient boolean chatTagHandledByAnotherPlugin = false;
public static boolean chatTagRelationColored = true;
+ public static List blacklistedFactionNames = new ArrayList<>();
public static String chatTagReplaceString = "[FACTION]";
public static String chatTagInsertAfterString = "";
public static String chatTagInsertBeforeString = "";
@@ -378,6 +379,8 @@ public class Conf {
static {
baseCommandAliases.add("f");
+ blacklistedFactionNames.add("somenamehere");
+
territoryEnemyDenyCommands.add("home");
territoryEnemyDenyCommands.add("sethome");
territoryEnemyDenyCommands.add("spawn");
diff --git a/src/main/java/com/massivecraft/factions/FactionsPlugin.java b/src/main/java/com/massivecraft/factions/FactionsPlugin.java
index 52e5757f..223ac265 100755
--- a/src/main/java/com/massivecraft/factions/FactionsPlugin.java
+++ b/src/main/java/com/massivecraft/factions/FactionsPlugin.java
@@ -11,7 +11,6 @@ import com.massivecraft.factions.cmd.FCommand;
import com.massivecraft.factions.cmd.check.CheckTask;
import com.massivecraft.factions.cmd.check.WeeWooTask;
import com.massivecraft.factions.cmd.chest.AntiChestListener;
-import com.massivecraft.factions.cmd.chest.ChestLogsHandler;
import com.massivecraft.factions.discord.DiscordListener;
import com.massivecraft.factions.discord.FactionChatHandler;
import com.massivecraft.factions.integration.Econ;
@@ -288,8 +287,7 @@ public class FactionsPlugin extends MPlugin {
new FUpgradesGUI(),
new UpgradesListener(),
new MissionHandler(this),
- new AntiChestListener(),
- new ChestLogsHandler()
+ new AntiChestListener()
};
for (Listener eventListener : eventsListener)
diff --git a/src/main/java/com/massivecraft/factions/cmd/chest/ChestLogsHandler.java b/src/main/java/com/massivecraft/factions/cmd/chest/ChestLogsHandler.java
deleted file mode 100644
index 0a8e1edd..00000000
--- a/src/main/java/com/massivecraft/factions/cmd/chest/ChestLogsHandler.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.massivecraft.factions.cmd.chest;
-
-import com.massivecraft.factions.FPlayers;
-import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class ChestLogsHandler implements Listener {
-
-
- public static HashMap> removeMap = new HashMap<>();
- public static HashMap> addMap = new HashMap<>();
- public static HashMap totalMap = new HashMap<>();
-
- public static int getAll(String uuid) {
- int t = 0;
- t = t + removeMap.get(uuid).size();
- t = t + addMap.get(uuid).size();
- return t;
- }
-
- public static int getAll() {
- int t = 0;
- for (Map.Entry> entry : removeMap.entrySet()) {
- t = t + entry.getValue().size();
- }
- for (Map.Entry> entry : addMap.entrySet()) {
- t = t + entry.getValue().size();
- }
- return t;
- }
-
- public void mapAdd(String uuid, String string) {
- List list = new ArrayList<>();
- if (addMap.get(uuid) != null) {
- list = addMap.get(uuid);
- }
- list.add(string);
- addMap.remove(uuid);
- addMap.put(uuid, list);
-
- if (totalMap.get(uuid) == null) {
- totalMap.put(uuid, 1);
- } else {
- int t = totalMap.get(uuid);
- totalMap.remove(uuid);
- totalMap.put(uuid, t + 1);
- }
- }
-
- public void mapRemove(String uuid, String string) {
- List list = new ArrayList<>();
- if (removeMap.get(uuid) != null) {
- list = removeMap.get(uuid);
- }
- list.add(string);
- removeMap.remove(uuid);
- removeMap.put(uuid, list);
- if (totalMap.get(uuid) == null) {
- totalMap.put(uuid, 1);
- } else {
- int t = totalMap.get(uuid);
- totalMap.remove(uuid);
- totalMap.put(uuid, t + 1);
- }
- }
-
- public String itemString(ItemStack itemStack) {
- String s = "x" + itemStack.getAmount() + " " + itemStack.getType().name().toLowerCase();
- if (itemStack.hasItemMeta() && itemStack.getItemMeta().hasDisplayName()) {
- s = s + " (" + itemStack.getItemMeta().getDisplayName() + ")";
- }
- return s.replace("_", " ");
- }
-
- @EventHandler
- public void fChestInventoryClick(InventoryClickEvent e) {
- Player p = (Player) e.getWhoClicked();
-
- Inventory topInventory = p.getOpenInventory().getTopInventory();
- Inventory bottomInventory = p.getOpenInventory().getBottomInventory();
- if (topInventory != null) {
- if (topInventory.equals(FPlayers.getInstance().getByPlayer(p).getFaction().getChestInventory())) {
-
- if (e.getClickedInventory() != null) {
- if (e.getClickedInventory().equals(topInventory)) {
- ItemStack current = e.getCurrentItem();
- if (current == null) return;
- ItemStack cursor = e.getCursor();
- if (e.getClick().isShiftClick()) return;
- if (cursor != null) {
- if (current.getType().equals(Material.AIR)) {
- if (!cursor.getType().equals(Material.AIR)) {
- mapAdd(p.getName(), itemString(cursor));
- }
- } else {
- if (!current.getType().equals(Material.AIR)) {
- mapRemove(p.getName(), itemString(current));
- }
- }
- }
- } else {
- if (e.getClickedInventory().equals(bottomInventory)) {
- //clicking from bottom inventory
- if (e.getClick().isShiftClick()) {
- }
- }
- }
- }
- }
- }
- }
-}
-
diff --git a/src/main/java/com/massivecraft/factions/util/ClipPlaceholderAPIManager.java b/src/main/java/com/massivecraft/factions/util/ClipPlaceholderAPIManager.java
index 13b59e6f..e2aae64e 100644
--- a/src/main/java/com/massivecraft/factions/util/ClipPlaceholderAPIManager.java
+++ b/src/main/java/com/massivecraft/factions/util/ClipPlaceholderAPIManager.java
@@ -3,6 +3,7 @@ package com.massivecraft.factions.util;
import com.massivecraft.factions.*;
import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Relation;
+import com.massivecraft.factions.tag.Tag;
import com.massivecraft.factions.zcore.util.TL;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import me.clip.placeholderapi.expansion.Relational;
@@ -104,6 +105,10 @@ public class ClipPlaceholderAPIManager extends PlaceholderExpansion implements R
// Then Faction stuff
case "faction_name":
return fPlayer.hasFaction() ? faction.getTag() : TL.NOFACTION_PREFIX.toString();
+ case "faction_name_custom":
+ return fPlayer.hasFaction() ? Tag.parsePlain(fPlayer, TL.PLACEHOLDER_CUSTOM_FACTION.toString()) : "";
+ case "faction_only_space":
+ return fPlayer.hasFaction() ? " " : "";
case "faction_power":
return String.valueOf(faction.getPowerRounded());
case "faction_powermax":
diff --git a/src/main/java/com/massivecraft/factions/util/ItemBuilder.java b/src/main/java/com/massivecraft/factions/util/ItemBuilder.java
new file mode 100644
index 00000000..c6ec344c
--- /dev/null
+++ b/src/main/java/com/massivecraft/factions/util/ItemBuilder.java
@@ -0,0 +1,97 @@
+package com.massivecraft.factions.util;
+
+
+import com.massivecraft.factions.FactionsPlugin;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.inventory.ItemFlag;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ItemBuilder {
+ private ItemMeta meta;
+ private ItemStack item;
+
+ public ItemBuilder(ItemStack item) {
+ this.item = item;
+ this.meta = item.getItemMeta();
+ }
+
+ public ItemBuilder(Material material, int amount, int durability) {
+ this(new ItemStack(material, amount, (short) durability));
+ }
+
+ public ItemBuilder(Material material, int amount) {
+ this(material, amount, 0);
+ }
+
+ public ItemBuilder(Material material) {
+ this(material, 1);
+ }
+
+ public static List color(List string) {
+ List colored = new ArrayList<>();
+ for (String line : string) {
+ colored.add(FactionsPlugin.instance.color(line));
+ }
+ return colored;
+ }
+
+ public ItemBuilder durability(short durability) {
+ this.item.setDurability(durability);
+ return this;
+ }
+
+ public ItemBuilder lore(String... lore) {
+ if (lore != null) {
+ ArrayList arrayList = new ArrayList<>();
+ for (String line : lore) {
+ arrayList.add(FactionsPlugin.instance.color(line));
+ }
+ this.meta.setLore(arrayList);
+ }
+ return this;
+ }
+
+ public ItemBuilder lore(List lore) {
+ this.meta.setLore(color(lore));
+ return this;
+ }
+
+ public ItemBuilder name(String name) {
+ this.meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
+ return this;
+ }
+
+ public ItemStack build() {
+ this.item.setItemMeta(this.meta);
+ return this.item;
+ }
+
+ public ItemBuilder amount(int amount) {
+ this.item.setAmount(amount);
+ return this;
+ }
+
+ public ItemBuilder glowing(boolean status) {
+ if (status) {
+ this.meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
+ this.meta.addEnchant(Enchantment.DURABILITY, 1, true);
+ } else {
+ this.meta.removeItemFlags(ItemFlag.HIDE_ENCHANTS);
+ this.meta.removeEnchant(Enchantment.DURABILITY);
+ }
+ return this;
+ }
+
+ public ItemBuilder addLineToLore(String line) {
+ List lore = this.meta.getLore();
+ lore.add(FactionsPlugin.instance.color(line));
+ this.meta.setLore(lore);
+ return this;
+ }
+}
diff --git a/src/main/java/com/massivecraft/factions/util/MiscUtil.java b/src/main/java/com/massivecraft/factions/util/MiscUtil.java
index 18cf68a4..9490d402 100644
--- a/src/main/java/com/massivecraft/factions/util/MiscUtil.java
+++ b/src/main/java/com/massivecraft/factions/util/MiscUtil.java
@@ -67,6 +67,13 @@ public class MiscUtil {
public static ArrayList validateTag(String str) {
ArrayList errors = new ArrayList<>();
+ for (String blacklistItem : Conf.blacklistedFactionNames) {
+ if (str.toLowerCase().contains(blacklistItem.toLowerCase())) {
+ errors.add(FactionsPlugin.instance.txt.parse(TL.GENERIC_FACTIONTAG_BLACKLIST.toString()));
+ break;
+ }
+ }
+
if (getComparisonString(str).length() < Conf.factionTagLengthMin) {
errors.add(FactionsPlugin.getInstance().txt.parse(TL.GENERIC_FACTIONTAG_TOOSHORT.toString(), Conf.factionTagLengthMin));
}
diff --git a/src/main/java/com/massivecraft/factions/util/RomanNumber.java b/src/main/java/com/massivecraft/factions/util/RomanNumber.java
new file mode 100644
index 00000000..277b04bc
--- /dev/null
+++ b/src/main/java/com/massivecraft/factions/util/RomanNumber.java
@@ -0,0 +1,31 @@
+package com.massivecraft.factions.util;
+
+import java.util.TreeMap;
+
+public class RomanNumber {
+ private static TreeMap map;
+
+ static {
+ (map = new TreeMap<>()).put(1000, "M");
+ RomanNumber.map.put(900, "CM");
+ RomanNumber.map.put(500, "D");
+ RomanNumber.map.put(400, "CD");
+ RomanNumber.map.put(100, "C");
+ RomanNumber.map.put(90, "XC");
+ RomanNumber.map.put(50, "L");
+ RomanNumber.map.put(40, "XL");
+ RomanNumber.map.put(10, "X");
+ RomanNumber.map.put(9, "IX");
+ RomanNumber.map.put(5, "V");
+ RomanNumber.map.put(4, "IV");
+ RomanNumber.map.put(1, "I");
+ }
+
+ public static String toRoman(int number) {
+ int l = RomanNumber.map.floorKey(number);
+ if (number == l) {
+ return RomanNumber.map.get(number);
+ }
+ return RomanNumber.map.get(l) + toRoman(number - l);
+ }
+}
diff --git a/src/main/java/com/massivecraft/factions/util/serializable/InventoryUtils.java b/src/main/java/com/massivecraft/factions/util/serializable/InventoryUtils.java
new file mode 100644
index 00000000..0a38d8f4
--- /dev/null
+++ b/src/main/java/com/massivecraft/factions/util/serializable/InventoryUtils.java
@@ -0,0 +1,20 @@
+package com.massivecraft.factions.util.serializable;
+
+public class InventoryUtils {
+ private int x;
+ private int y;
+ private int rows;
+
+ public InventoryUtils(int x, int y, int rows) {
+ this.x = x;
+ this.y = y;
+ this.rows = rows;
+ }
+
+ public void increment() {
+ if (this.x == 9) {
+ this.x = 0;
+ ++this.y;
+ }
+ }
+}
diff --git a/src/main/java/com/massivecraft/factions/util/serializable/Item.java b/src/main/java/com/massivecraft/factions/util/serializable/Item.java
new file mode 100644
index 00000000..762614c7
--- /dev/null
+++ b/src/main/java/com/massivecraft/factions/util/serializable/Item.java
@@ -0,0 +1,40 @@
+package com.massivecraft.factions.util.serializable;
+
+
+import com.massivecraft.factions.util.ItemBuilder;
+import com.massivecraft.factions.util.XMaterial;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.List;
+
+public class Item {
+ private String name;
+ private List lore;
+ private XMaterial material;
+ private int amount;
+ private int slot;
+
+ public Item(String name, List lore, XMaterial material, int amount, int slot) {
+ this.name = name;
+ this.lore = lore;
+ this.material = material;
+ this.amount = amount;
+ this.slot = slot;
+ }
+
+ public ItemStack buildItemStack(boolean isSelected) {
+ return new ItemBuilder(material.parseItem()).name(name).lore(lore).glowing(isSelected).amount(amount).build();
+ }
+
+ public int getAmount() {
+ return this.amount;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public int getSlot() {
+ return this.slot;
+ }
+}
diff --git a/src/main/java/com/massivecraft/factions/zcore/util/TL.java b/src/main/java/com/massivecraft/factions/zcore/util/TL.java
index 5aa8666b..2f3e2fb5 100644
--- a/src/main/java/com/massivecraft/factions/zcore/util/TL.java
+++ b/src/main/java/com/massivecraft/factions/zcore/util/TL.java
@@ -1020,6 +1020,7 @@ public enum TL {
GENERIC_TRANSLATION_VERSION("Translation: %1$s(%2$s,%3$s) State: %4$s"),
GENERIC_TRANSLATION_CONTRIBUTORS("Translation contributors: %1$s"),
GENERIC_TRANSLATION_RESPONSIBLE("Responsible for translation: %1$s"),
+ GENERIC_FACTIONTAG_BLACKLIST("&cThat faction tag is blacklisted."),
GENERIC_FACTIONTAG_TOOSHORT("The faction tag can't be shorter than %1$s chars."),
GENERIC_FACTIONTAG_TOOLONG("The faction tag can't be longer than %s chars."),
GENERIC_FACTIONTAG_ALPHANUMERIC("Faction tag must be alphanumeric. \"%s\" is not allowed."),
@@ -1043,6 +1044,7 @@ public enum TL {
PLAYER_NOT_FOUND("&c&l[!] &b%1$s &7is either not online or not in your faction!"),
PLACEHOLDER_ROLE_NAME("None"),
+ PLACEHOLDER_CUSTOM_FACTION("{faction} "),
WARBANNER_NOFACTION("&cYou need a faction to use a warbanner!"),