From d95c80ae5b05d1034871501cc6673ddce7373fc1 Mon Sep 17 00:00:00 2001 From: ProSavage Date: Fri, 11 May 2018 17:47:58 -0500 Subject: [PATCH] 1.4-STABLE ------------------------------------------------------------------ No Enderpearls in fly fixed - The option was bugged, so if it was true it would do the opposite. Improved /f map visuals and title! Title fadeout time, showtime, and fadeintime options added for 1.9+ servers Fixed Bug in /f upgrades where the slots option for exp would move the spawner instead. Added Faction chest, an upgradable shared "enderchest" for factions to share! Added some more entries into /f help in config. Added Upgrade for faction chest Banner pattern storage ------------------------------------------------------------------ --- .../com/massivecraft/factions/Faction.java | 285 +++++++++--------- .../java/com/massivecraft/factions/P.java | 13 +- .../massivecraft/factions/cmd/CmdBanner.java | 18 +- .../massivecraft/factions/cmd/CmdChest.java | 48 +++ .../factions/cmd/CmdSetBanner.java | 39 +++ .../massivecraft/factions/cmd/FCmdRoot.java | 3 +- .../listeners/FactionsBlockListener.java | 10 + .../listeners/FactionsEntityListener.java | 94 +++--- .../listeners/FactionsPlayerListener.java | 37 ++- .../factions/struct/Permission.java | 3 +- .../zcore/fperms/PermissableAction.java | 6 +- .../zcore/fupgrades/FUpgradesGUI.java | 88 +++++- .../factions/zcore/persist/MemoryBoard.java | 4 +- .../factions/zcore/persist/MemoryFaction.java | 116 ++++++- .../massivecraft/factions/zcore/util/TL.java | 5 + .../factions/zcore/util/TextUtil.java | 6 +- src/main/resources/config.yml | 70 ++++- src/main/resources/plugin.yml | 2 +- 18 files changed, 614 insertions(+), 233 deletions(-) create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdChest.java create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdSetBanner.java diff --git a/src/main/java/com/massivecraft/factions/Faction.java b/src/main/java/com/massivecraft/factions/Faction.java index cd3062d4..a0ce347a 100644 --- a/src/main/java/com/massivecraft/factions/Faction.java +++ b/src/main/java/com/massivecraft/factions/Faction.java @@ -13,306 +13,315 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; import java.util.*; import java.util.concurrent.ConcurrentHashMap; public interface Faction extends EconomyParticipator { - public HashMap> getAnnouncements(); + HashMap> getAnnouncements(); - public ConcurrentHashMap getWarps(); + ConcurrentHashMap getWarps(); - public LazyLocation getWarp(String name); + LazyLocation getWarp(String name); - public void setWarp(String name, LazyLocation loc); + void setWarp(String name, LazyLocation loc); - public boolean isWarp(String name); + boolean isWarp(String name); - public boolean hasWarpPassword(String warp); + boolean hasWarpPassword(String warp); - public boolean isWarpPassword(String warp, String password); + boolean isWarpPassword(String warp, String password); - public void setWarpPassword(String warp, String password); + void setWarpPassword(String warp, String password); - public boolean removeWarp(String name); + boolean removeWarp(String name); - public void clearWarps(); + void clearWarps(); - public int getMaxVaults(); + int getMaxVaults(); - public void setMaxVaults(int value); + void setMaxVaults(int value); - public void addAnnouncement(FPlayer fPlayer, String msg); + void addAnnouncement(FPlayer fPlayer, String msg); - public void sendUnreadAnnouncements(FPlayer fPlayer); + void sendUnreadAnnouncements(FPlayer fPlayer); - public void removeAnnouncements(FPlayer fPlayer); + void removeAnnouncements(FPlayer fPlayer); - public Set getInvites(); + Set getInvites(); - public String getId(); + String getId(); - public void invite(FPlayer fplayer); + void setId(String id); - public void deinvite(FPlayer fplayer); + void invite(FPlayer fplayer); - public void setUpgrades(String key, int level); + void deinvite(FPlayer fplayer); - public int getUpgrade(String key); + void setUpgrades(String key, int level); - public boolean isInvited(FPlayer fplayer); + int getUpgrade(String key); - public void ban(FPlayer target, FPlayer banner); + boolean isInvited(FPlayer fplayer); - public void unban(FPlayer player); + void ban(FPlayer target, FPlayer banner); - public boolean isBanned(FPlayer player); + void unban(FPlayer player); - public Set getBannedPlayers(); + boolean isBanned(FPlayer player); - public HashMap getRulesMap(); + Set getBannedPlayers(); - public void setRule(int index, String rule); + HashMap getRulesMap(); - public void addRule(String rule); + void setRule(int index, String rule); - public void removeRule(int index); + void addRule(String rule); - public void clearRules(); + void removeRule(int index); - public void setCheckpoint(Location location); + void clearRules(); - public Location getCheckpoint(); + Location getCheckpoint(); - public void addTnt(int amt); + void setCheckpoint(Location location); - public void takeTnt(int amt); + void addTnt(int amt); - public Location getVault(); + void takeTnt(int amt); - public void setVault(Location vaultLocation); + Location getVault(); - public int getTnt(); + void setVault(Location vaultLocation); - public String getRule(int index); + Inventory getChest(); - public boolean getOpen(); + void setChest(Inventory inventory); - public void setOpen(boolean isOpen); + void setBannerPattern(ItemStack banner); - public boolean isPeaceful(); + ItemStack getBanner(); - public void setPeaceful(boolean isPeaceful); + int getTnt(); - public void setPeacefulExplosionsEnabled(boolean val); + String getRule(int index); - public boolean getPeacefulExplosionsEnabled(); + boolean getOpen(); - public boolean noExplosionsInTerritory(); + void setOpen(boolean isOpen); - public boolean isPermanent(); + boolean isPeaceful(); - public void setPermanent(boolean isPermanent); + void setPeaceful(boolean isPeaceful); - public String getTag(); + boolean getPeacefulExplosionsEnabled(); - public String getTag(String prefix); + void setPeacefulExplosionsEnabled(boolean val); - public String getTag(Faction otherFaction); + boolean noExplosionsInTerritory(); - public String getTag(FPlayer otherFplayer); + boolean isPermanent(); - public void setTag(String str); + void setPermanent(boolean isPermanent); - public String getComparisonTag(); + String getTag(); - public String getDescription(); + void setTag(String str); - public void setDescription(String value); + String getTag(String prefix); - public void setHome(Location home); + String getTag(Faction otherFaction); - public boolean hasHome(); + String getTag(FPlayer otherFplayer); - public Location getHome(); + String getComparisonTag(); - public long getFoundedDate(); + String getDescription(); - public void setFoundedDate(long newDate); + void setDescription(String value); - public void confirmValidHome(); + boolean hasHome(); - public String getAccountId(); + Location getHome(); - public Integer getPermanentPower(); + void setHome(Location home); - public void setPermanentPower(Integer permanentPower); + long getFoundedDate(); - public boolean hasPermanentPower(); + void setFoundedDate(long newDate); - public double getPowerBoost(); + void confirmValidHome(); - public void setPowerBoost(double powerBoost); + String getAccountId(); - public boolean noPvPInTerritory(); + Integer getPermanentPower(); - public boolean noMonstersInTerritory(); + void setPermanentPower(Integer permanentPower); - public boolean isNormal(); + boolean hasPermanentPower(); + + double getPowerBoost(); + + void setPowerBoost(double powerBoost); + + boolean noPvPInTerritory(); + + boolean noMonstersInTerritory(); + + boolean isNormal(); @Deprecated - public boolean isNone(); + boolean isNone(); - public boolean isWilderness(); + boolean isWilderness(); - public boolean isSafeZone(); + boolean isSafeZone(); - public boolean isWarZone(); + boolean isWarZone(); - public boolean isPlayerFreeType(); + boolean isPlayerFreeType(); - public boolean isPowerFrozen(); + boolean isPowerFrozen(); - public void setLastDeath(long time); + void setLastDeath(long time); - public int getKills(); + int getKills(); - public int getDeaths(); + int getDeaths(); - public Access getAccess(Permissable permissable, PermissableAction permissableAction); + Access getAccess(Permissable permissable, PermissableAction permissableAction); - public Access getAccess(FPlayer player, PermissableAction permissableAction); + Access getAccess(FPlayer player, PermissableAction permissableAction); - public void setPermission(Permissable permissable, PermissableAction permissableAction, Access access); + void setPermission(Permissable permissable, PermissableAction permissableAction, Access access); - public void resetPerms(); - - public Map> getPermissions(); + void resetPerms(); // ------------------------------- // Relation and relation colors // ------------------------------- - @Override - public String describeTo(RelationParticipator that, boolean ucfirst); + Map> getPermissions(); @Override - public String describeTo(RelationParticipator that); + String describeTo(RelationParticipator that, boolean ucfirst); @Override - public Relation getRelationTo(RelationParticipator rp); + String describeTo(RelationParticipator that); @Override - public Relation getRelationTo(RelationParticipator rp, boolean ignorePeaceful); + Relation getRelationTo(RelationParticipator rp); @Override - public ChatColor getColorTo(RelationParticipator rp); + Relation getRelationTo(RelationParticipator rp, boolean ignorePeaceful); - public Relation getRelationWish(Faction otherFaction); + @Override + ChatColor getColorTo(RelationParticipator rp); - public void setRelationWish(Faction otherFaction, Relation relation); + Relation getRelationWish(Faction otherFaction); - public int getRelationCount(Relation relation); + void setRelationWish(Faction otherFaction, Relation relation); + + int getRelationCount(Relation relation); // ----------------------------------------------// // Power // ----------------------------------------------// - public double getPower(); + double getPower(); - public double getPowerMax(); + double getPowerMax(); - public int getPowerRounded(); + int getPowerRounded(); - public int getPowerMaxRounded(); + int getPowerMaxRounded(); - public int getLandRounded(); + int getLandRounded(); - public int getLandRoundedInWorld(String worldName); - - public boolean hasLandInflation(); + int getLandRoundedInWorld(String worldName); // ------------------------------- // FPlayers // ------------------------------- + boolean hasLandInflation(); + // maintain the reference list of FPlayers in this faction - public void refreshFPlayers(); + void refreshFPlayers(); - public boolean addFPlayer(FPlayer fplayer); + boolean addFPlayer(FPlayer fplayer); - public boolean removeFPlayer(FPlayer fplayer); + boolean removeFPlayer(FPlayer fplayer); - public int getSize(); + int getSize(); - public Set getFPlayers(); + Set getFPlayers(); - public Set getFPlayersWhereOnline(boolean online); + Set getFPlayersWhereOnline(boolean online); - public Set getFPlayersWhereOnline(boolean online, FPlayer viewer); + Set getFPlayersWhereOnline(boolean online, FPlayer viewer); - public FPlayer getFPlayerAdmin(); + FPlayer getFPlayerAdmin(); - public ArrayList getFPlayersWhereRole(Role role); + ArrayList getFPlayersWhereRole(Role role); - public ArrayList getOnlinePlayers(); + ArrayList getOnlinePlayers(); // slightly faster check than getOnlinePlayers() if you just want to see if // there are any players online - public boolean hasPlayersOnline(); + boolean hasPlayersOnline(); - public void memberLoggedOff(); + void memberLoggedOff(); // used when current leader is about to be removed from the faction; // promotes new leader, or disbands faction if no other members left - public void promoteNewLeader(); + void promoteNewLeader(); - public Role getDefaultRole(); + Role getDefaultRole(); - public void setDefaultRole(Role role); + void setDefaultRole(Role role); // ----------------------------------------------// // Messages // ----------------------------------------------// - public void msg(String message, Object... args); + void msg(String message, Object... args); - public void sendMessage(String message); - - public void sendMessage(List messages); + void sendMessage(String message); // ----------------------------------------------// // Ownership of specific claims // ----------------------------------------------// - public Map> getClaimOwnership(); + void sendMessage(List messages); - public void clearAllClaimOwnership(); + Map> getClaimOwnership(); - public void clearClaimOwnership(FLocation loc); + void clearAllClaimOwnership(); - public void clearClaimOwnership(FPlayer player); + void clearClaimOwnership(FLocation loc); - public int getCountOfClaimsWithOwners(); + void clearClaimOwnership(FPlayer player); - public boolean doesLocationHaveOwnersSet(FLocation loc); + int getCountOfClaimsWithOwners(); - public boolean isPlayerInOwnerList(FPlayer player, FLocation loc); + boolean doesLocationHaveOwnersSet(FLocation loc); - public void setPlayerAsOwner(FPlayer player, FLocation loc); + boolean isPlayerInOwnerList(FPlayer player, FLocation loc); - public void removePlayerAsOwner(FPlayer player, FLocation loc); + void setPlayerAsOwner(FPlayer player, FLocation loc); - public Set getOwnerList(FLocation loc); + void removePlayerAsOwner(FPlayer player, FLocation loc); - public String getOwnerListString(FLocation loc); + Set getOwnerList(FLocation loc); - public boolean playerHasOwnershipRights(FPlayer fplayer, FLocation loc); + String getOwnerListString(FLocation loc); + + boolean playerHasOwnershipRights(FPlayer fplayer, FLocation loc); // ----------------------------------------------// // Persistance and entity management // ----------------------------------------------// - public void remove(); + void remove(); - public Set getAllClaims(); - - public void setId(String id); + Set getAllClaims(); } diff --git a/src/main/java/com/massivecraft/factions/P.java b/src/main/java/com/massivecraft/factions/P.java index 143b41a1..99472398 100644 --- a/src/main/java/com/massivecraft/factions/P.java +++ b/src/main/java/com/massivecraft/factions/P.java @@ -99,6 +99,9 @@ public class P extends MPlugin { } public boolean mc17 = false; + public boolean mc18 = false; + + @Override public void onEnable() { if (!preEnable()) { @@ -150,8 +153,11 @@ public class P extends MPlugin { int version = Integer.parseInt(ReflectionUtils.PackageType.getServerVersion().split("_")[1]); if (version == 7) { - P.p.log("Version 1.7 found, disabling banners, itemflags inside GUIs, and Titles."); + P.p.log("Minecraft Version 1.7 found, disabling banners, itemflags inside GUIs, and Titles."); mc17 = true; + } else if (version == 8) { + P.p.log("Minecraft Version 1.8 found, Title Fadeouttime etc will not be configurable."); + mc18 = true; } // Register Event Handlers @@ -345,11 +351,6 @@ public class P extends MPlugin { } - - - - - // Does player have Faction Chat enabled? If so, chat plugins should preferably not do channels, // local chat, or anything else which targets individual recipients, so Faction Chat can be done public boolean isPlayerFactionChatting(Player player) { diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdBanner.java b/src/main/java/com/massivecraft/factions/cmd/CmdBanner.java index 050e11b4..1d41576f 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdBanner.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdBanner.java @@ -10,6 +10,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.ItemMeta; public class CmdBanner extends FCommand { public CmdBanner() { @@ -39,11 +40,24 @@ public class CmdBanner extends FCommand { return; } takeMoney(fme, P.p.getConfig().getInt("fbanners.Banner-Cost", 5000)); - ItemStack warBanner = P.p.createItem(Material.BANNER, 1, (short) 1, P.p.getConfig().getString("fbanners.Item.Name"), P.p.getConfig().getStringList("fbanners.Item.Lore")); - me.getInventory().addItem(warBanner); + + //ItemStack warBanner = P.p.createItem(Material.BANNER, 1, (short) 1, P.p.getConfig().getString("fbanners.Item.Name"), P.p.getConfig().getStringList("fbanners.Item.Lore")); + //BannerMeta bannerMeta = (BannerMeta) warBanner.getItemMeta(); + ItemStack warBanner = fme.getFaction().getBanner(); + if (warBanner != null) { + ItemMeta warmeta = warBanner.getItemMeta(); + warmeta.setDisplayName(P.p.getConfig().getString("fbanners.Item.Name")); + warmeta.setLore(P.p.getConfig().getStringList("fbanners.Item.Lore")); + warBanner.setItemMeta(warmeta); + me.getInventory().addItem(warBanner); + + } else { + warBanner = P.p.createItem(Material.BANNER, 1, (short) 1, P.p.getConfig().getString("fbanners.Item.Name"), P.p.getConfig().getStringList("fbanners.Item.Lore")); + } fme.msg(TL.COMMAND_BANNER_SUCCESS); } + public boolean hasMoney(FPlayer fme, int amt) { Economy econ = P.p.getEcon(); if (econ.getBalance(fme.getPlayer()) >= amt) { diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdChest.java b/src/main/java/com/massivecraft/factions/cmd/CmdChest.java new file mode 100644 index 00000000..9d207729 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/CmdChest.java @@ -0,0 +1,48 @@ +package com.massivecraft.factions.cmd; + +import com.massivecraft.factions.P; +import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.fperms.Access; +import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.TL; + +public class CmdChest extends FCommand { + + public CmdChest() { + this.aliases.add("chest"); + + //this.requiredArgs.add(""); + + + this.permission = Permission.CHEST.node; + this.disableOnLock = false; + + senderMustBePlayer = true; + senderMustBeMember = true; + senderMustBeModerator = false; + senderMustBeAdmin = false; + } + + @Override + public void perform() { + + if (!P.p.getConfig().getBoolean("fchest.Enabled")) { + fme.sendMessage("This command is disabled!"); + return; + } + Access access = fme.getFaction().getAccess(fme, PermissableAction.CHEST); + if (access.equals(Access.DENY)) { + fme.msg(TL.GENERIC_NOPERMISSION, "chest"); + } + //debug Bukkit.broadcastMessage(fme.getFaction().getUpgrade("Chest") + ""); + + me.openInventory(fme.getFaction().getChest()); + + + } + + @Override + public TL getUsageTranslation() { + return TL.COMMAND_VAULT_DESCRIPTION; + } +} diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdSetBanner.java b/src/main/java/com/massivecraft/factions/cmd/CmdSetBanner.java new file mode 100644 index 00000000..fe95e447 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/CmdSetBanner.java @@ -0,0 +1,39 @@ +package com.massivecraft.factions.cmd; + +import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.Material; + +public class CmdSetBanner extends FCommand { + + public CmdSetBanner() { + super(); + aliases.add("setbanner"); + + permission = Permission.BANNER.node; + + senderMustBePlayer = true; + senderMustBeMember = false; + senderMustBeModerator = false; + senderMustBeAdmin = true; + + } + + public void perform() { + if (me.getItemInHand().getType() != Material.BANNER) { + fme.msg(TL.COMMAND_SETBANNER_NOTBANNER); + return; + } + + fme.getFaction().setBannerPattern(me.getItemInHand()); + fme.msg(TL.COMMAND_SETBANNER_SUCCESS); + + + } + + @Override + public TL getUsageTranslation() { + return TL.COMMAND_SETBANNER_DESCRIPTION; + } + +} diff --git a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java index 51fa6a40..047d44aa 100644 --- a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java +++ b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java @@ -3,7 +3,6 @@ package com.massivecraft.factions.cmd; import com.massivecraft.factions.Conf; import com.massivecraft.factions.P; import com.massivecraft.factions.zcore.util.TL; -import net.coreprotect.CoreProtect; import org.bukkit.Bukkit; import java.util.Collections; @@ -99,6 +98,7 @@ public class FCmdRoot extends FCommand { public CmdShowClaims cmdShowClaims = new CmdShowClaims(); public CmdLowPower cmdLowPower = new CmdLowPower(); public CmdTntFill cmdTntFill = new CmdTntFill(); + public CmdChest cmdChest = new CmdChest(); @@ -209,6 +209,7 @@ public class FCmdRoot extends FCommand { this.addSubCommand(this.cmdShowClaims); this.addSubCommand(this.cmdLowPower); this.addSubCommand(this.cmdTntFill); + this.addSubCommand(this.cmdChest); if (Bukkit.getServer().getPluginManager().getPlugin("CoreProtect") != null){ P.p.log("Found CoreProtect, enabling Inspect"); diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java index 2c54954b..0849291a 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java @@ -70,6 +70,16 @@ public class FactionsBlockListener implements Listener { public void onBlockBreak(BlockBreakEvent event) { if (!playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "destroy", false)) { event.setCancelled(true); + return; + } + FPlayer fme = FPlayers.getInstance().getByPlayer(event.getPlayer()); + if (event.getBlock().getType() == Material.MOB_SPAWNER) { + Access access = fme.getFaction().getAccess(fme, PermissableAction.SPAWNER); + if (access.equals(Access.DENY) || access.equals(Access.UNDEFINED)) { + fme.msg(TL.GENERIC_NOPERMISSION, "mine spawners"); + event.setCancelled(true); + + } } } diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java index ae2645c9..e36aafc9 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -1,14 +1,12 @@ package com.massivecraft.factions.listeners; import com.massivecraft.factions.*; -import com.massivecraft.factions.event.FPlayerJoinEvent; import com.massivecraft.factions.event.PowerLossEvent; import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.util.MiscUtil; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.TravelAgent; import org.bukkit.block.Block; import org.bukkit.entity.*; @@ -21,7 +19,6 @@ import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.hanging.HangingBreakEvent.RemoveCause; import org.bukkit.event.hanging.HangingPlaceEvent; -import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -207,44 +204,37 @@ public class FactionsEntityListener implements Listener { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onEntityExplode(EntityExplodeEvent event) { - Location loc = event.getLocation(); Entity boomer = event.getEntity(); - Faction faction = Board.getInstance().getFactionAt(new FLocation(loc)); - if (faction.noExplosionsInTerritory() || (faction.isPeaceful() && Conf.peacefulTerritoryDisableBoom)) { - // faction is peaceful and has explosions set to disabled + // Before we need to check the location where the block is placed + if (!this.checkExplosionForBlock(boomer, event.getLocation().getBlock())) { event.setCancelled(true); return; } - boolean online = faction.hasPlayersOnline(); + // Loop the blocklist to run checks on each aimed block + Iterator blockList = event.blockList().iterator(); - //TODO: :( - if (boomer instanceof Creeper && ((faction.isWilderness() && Conf.wildernessBlockCreepers && !Conf.worldsNoWildernessProtection.contains(loc.getWorld().getName())) || - (faction.isNormal() && (online ? Conf.territoryBlockCreepers : Conf.territoryBlockCreepersWhenOffline)) || - (faction.isWarZone() && Conf.warZoneBlockCreepers) || - faction.isSafeZone())) { - // creeper which needs prevention - event.setCancelled(true); - } else if ( - // it's a bit crude just using fireball protection for Wither boss too, but I'd rather not add in a whole new set of xxxBlockWitherExplosion or whatever - (boomer instanceof Fireball || boomer instanceof WitherSkull || boomer instanceof Wither) && ((faction.isWilderness() && Conf.wildernessBlockFireballs && !Conf.worldsNoWildernessProtection.contains(loc.getWorld().getName())) || - (faction.isNormal() && (online ? Conf.territoryBlockFireballs : Conf.territoryBlockFireballsWhenOffline)) || - (faction.isWarZone() && Conf.warZoneBlockFireballs) || - faction.isSafeZone())) { - // ghast fireball which needs prevention - event.setCancelled(true); - } else if ((boomer instanceof TNTPrimed || boomer instanceof ExplosiveMinecart) && ((faction.isWilderness() && Conf.wildernessBlockTNT && !Conf.worldsNoWildernessProtection.contains(loc.getWorld().getName())) || - (faction.isNormal() && (online ? Conf.territoryBlockTNT : Conf.territoryBlockTNTWhenOffline)) || - (faction.isWarZone() && Conf.warZoneBlockTNT) || - (faction.isSafeZone() && Conf.safeZoneBlockTNT))) { - // TNT which needs prevention + while (blockList.hasNext()) { + Block block = blockList.next(); + + if (!this.checkExplosionForBlock(boomer, block)) { + // The block don't have to explode + blockList.remove(); + } + } + + // Cancel the event if no block will explode + if (event.blockList().isEmpty()) { event.setCancelled(true); + + // Or handle the exploit of TNT in water/lava } else if ((boomer instanceof TNTPrimed || boomer instanceof ExplosiveMinecart) && Conf.handleExploitTNTWaterlog) { // TNT in water/lava doesn't normally destroy any surrounding blocks, which is usually desired behavior, but... // this change below provides workaround for waterwalling providing perfect protection, // and makes cheap (non-obsidian) TNT cannons require minor maintenance between shots - Block center = loc.getBlock(); + Block center = event.getLocation().getBlock(); + if (center.isLiquid()) { // a single surrounding block in all 6 directions is broken if the material is weak enough List targets = new ArrayList<>(); @@ -265,22 +255,42 @@ public class FactionsEntityListener implements Listener { } } - //For disabling enderpearl throws - @EventHandler - public void onPearl(PlayerInteractEvent e) { - Player player = e.getPlayer(); - if (player.getItemInHand().getType() == Material.ENDER_PEARL) { - FPlayer fPlayer = FPlayers.getInstance().getByPlayer(player); - if (fPlayer.isFlying()){ - if (!Conf.noEnderpearlsInFly){ - fPlayer.msg(TL.COMMAND_FLY_NO_EPEARL); - e.setCancelled(true); - } - } + private boolean checkExplosionForBlock(Entity boomer, Block block) { + Faction faction = Board.getInstance().getFactionAt(new FLocation(block.getLocation())); + + if (faction.noExplosionsInTerritory() || (faction.isPeaceful() && Conf.peacefulTerritoryDisableBoom)) { + // faction is peaceful and has explosions set to disabled + return false; } + + boolean online = faction.hasPlayersOnline(); + + if (boomer instanceof Creeper && ((faction.isWilderness() && Conf.wildernessBlockCreepers && !Conf.worldsNoWildernessProtection.contains(block.getWorld().getName())) || + (faction.isNormal() && (online ? Conf.territoryBlockCreepers : Conf.territoryBlockCreepersWhenOffline)) || + (faction.isWarZone() && Conf.warZoneBlockCreepers) || + faction.isSafeZone())) { + // creeper which needs prevention + return false; + } else if ( + // it's a bit crude just using fireball protection for Wither boss too, but I'd rather not add in a whole new set of xxxBlockWitherExplosion or whatever + (boomer instanceof Fireball || boomer instanceof WitherSkull || boomer instanceof Wither) && ((faction.isWilderness() && Conf.wildernessBlockFireballs && !Conf.worldsNoWildernessProtection.contains(block.getWorld().getName())) || + (faction.isNormal() && (online ? Conf.territoryBlockFireballs : Conf.territoryBlockFireballsWhenOffline)) || + (faction.isWarZone() && Conf.warZoneBlockFireballs) || + faction.isSafeZone())) { + // ghast fireball which needs prevention + return false; + } else + return (!(boomer instanceof TNTPrimed) && !(boomer instanceof ExplosiveMinecart)) || ((!faction.isWilderness() || !Conf.wildernessBlockTNT || Conf.worldsNoWildernessProtection.contains(block.getWorld().getName())) && + (!faction.isNormal() || (online ? !Conf.territoryBlockTNT : !Conf.territoryBlockTNTWhenOffline)) && + (!faction.isWarZone() || !Conf.warZoneBlockTNT) && + (!faction.isSafeZone() || !Conf.safeZoneBlockTNT)); + + // No condition retained, destroy the block! } + + // mainly for flaming arrows; don't want allies or people in safe zones to be ignited even after damage event is cancelled @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onEntityCombustByEntity(EntityCombustByEntityEvent event) { @@ -702,4 +712,4 @@ public class FactionsEntityListener implements Listener { return false; } -} +} \ No newline at end of file diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java index dd2a1115..f0c5c7dc 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -300,7 +300,22 @@ public class FactionsPlayerListener implements Listener { .replace("{player}",row.getPlayer()) .replace("{block-type}",row.getType().toString().toLowerCase())); } + } + } + + //For disabling enderpearl throws + @EventHandler + public void onPearl(PlayerInteractEvent e) { + Player player = e.getPlayer(); + if (player.getItemInHand().getType() == Material.ENDER_PEARL) { + FPlayer fPlayer = FPlayers.getInstance().getByPlayer(player); + if (fPlayer.isFlying()) { + if (Conf.noEnderpearlsInFly) { + fPlayer.msg(TL.COMMAND_FLY_NO_EPEARL); + e.setCancelled(true); + } + } } } @@ -310,6 +325,18 @@ public class FactionsPlayerListener implements Listener { return (result.length() == 3 ? result + "0" : result) + "/hrs ago"; } + + @EventHandler + public void onCloseChest(InventoryCloseEvent e) { + if (e.getInventory().getTitle() == null) { + return; + } + + if (e.getInventory().getTitle().equalsIgnoreCase(P.p.color(P.p.getConfig().getString("fchest.Inventory-Title")))) { + FPlayers.getInstance().getByPlayer((Player) e.getPlayer()).getFaction().setChest(e.getInventory()); + } + } + // Holds the next time a player can have a map shown. private HashMap showTimes = new HashMap<>(); @@ -357,7 +384,15 @@ public class FactionsPlayerListener implements Listener { String subTitle = P.p.getConfig().getString("Title.Format.Subtitle").replace("{Description}", factionTo.getDescription()).replace("{Faction}", factionTo.getColorTo(me) + factionTo.getTag()); subTitle = parseAllPlaceholders(subTitle, factionTo); if (!P.p.mc17) { - me.getPlayer().sendTitle(P.p.color(title), P.p.color(subTitle)); + if (!P.p.mc18) { + me.getPlayer().sendTitle(P.p.color(title), P.p.color(subTitle), P.p.getConfig().getInt("Title.Options.FadeInTime"), + P.p.getConfig().getInt("Title.Options.ShowTime"), + P.p.getConfig().getInt("Title.Options.FadeOutTime")); + } else { + me.getPlayer().sendTitle(P.p.color(title), P.p.color(subTitle)); + } + + } } diff --git a/src/main/java/com/massivecraft/factions/struct/Permission.java b/src/main/java/com/massivecraft/factions/struct/Permission.java index 959394b2..a9343244 100644 --- a/src/main/java/com/massivecraft/factions/struct/Permission.java +++ b/src/main/java/com/massivecraft/factions/struct/Permission.java @@ -102,7 +102,8 @@ public enum Permission { TNTFILL("tntfill"), COORD("coords"), SHOWCLAIMS("showclaims"), - WARP("warp"); + WARP("warp"), + CHEST("Chest"); public final String node; diff --git a/src/main/java/com/massivecraft/factions/zcore/fperms/PermissableAction.java b/src/main/java/com/massivecraft/factions/zcore/fperms/PermissableAction.java index 77c42d6f..abee55d9 100644 --- a/src/main/java/com/massivecraft/factions/zcore/fperms/PermissableAction.java +++ b/src/main/java/com/massivecraft/factions/zcore/fperms/PermissableAction.java @@ -27,7 +27,6 @@ public enum PermissableAction { KICK("kick"), ITEM("items"), // generic for most items SETHOME("sethome"), - WITHDRAW("withdraw"), TERRITORY("territory"), ACCESS("access"), DISBAND("disband"), @@ -38,8 +37,9 @@ public enum PermissableAction { VAULT("vault"), TNTBANK("tntbank"), TNTFILL("tntfill"), - WIDTHDRAW("widthdraw"), - DEPOSIT("deposit"); + WITHDRAW("withdraw"), + CHEST("chest"), + SPAWNER("spawner"); private String name; diff --git a/src/main/java/com/massivecraft/factions/zcore/fupgrades/FUpgradesGUI.java b/src/main/java/com/massivecraft/factions/zcore/fupgrades/FUpgradesGUI.java index a4f295dc..77b79834 100644 --- a/src/main/java/com/massivecraft/factions/zcore/fupgrades/FUpgradesGUI.java +++ b/src/main/java/com/massivecraft/factions/zcore/fupgrades/FUpgradesGUI.java @@ -43,11 +43,15 @@ public class FUpgradesGUI implements Listener { } List spawnerSlots = P.p.getConfig().getIntegerList("fupgrades.MainMenu.Spawners.SpawnerItem.slots"); for (int i = 0; i <= spawnerSlots.size() - 1; i++) { - inventory.setItem(spawnerSlots.get(i), items[0]); + inventory.setItem(spawnerSlots.get(i), items[1]); } List expSlots = P.p.getConfig().getIntegerList("fupgrades.MainMenu.EXP.EXPItem.slots"); for (int i = 0; i <= expSlots.size() - 1; i++) { - inventory.setItem(expSlots.get(i), items[1]); + inventory.setItem(expSlots.get(i), items[0]); + } + List chestSlots = P.p.getConfig().getIntegerList("fupgrades.MainMenu.Chest.ChestItem.slots"); + for (int i = 0; i <= chestSlots.size() - 1; i++) { + inventory.setItem(chestSlots.get(i), items[3]); } fme.getPlayer().openInventory(inventory); } @@ -63,6 +67,7 @@ public class FUpgradesGUI implements Listener { ItemStack[] items = buildItems(fme); ItemStack cropItem = items[2]; ItemStack expItem = items[0]; + ItemStack chestitem = items[3]; ItemStack spawnerItem = items[1]; int cropLevel = fme.getFaction().getUpgrade("Crop"); if (e.getCurrentItem().equals(cropItem)) { @@ -164,9 +169,43 @@ public class FUpgradesGUI implements Listener { fme.getPlayer().closeInventory(); } } + int chestLevel = fme.getFaction().getUpgrade("Chest"); + if (e.getCurrentItem().equals(chestitem)) { + if (expLevel == 3) { + return; + } + if (chestLevel == 2) { + int cost = P.p.getConfig().getInt("fupgrades.MainMenu.Chest.Cost.level-3"); + if (!hasMoney(fme, cost)) { + return; + } + takeMoney(fme, cost); + fme.getFaction().setUpgrades("Chest", 3); + fme.getPlayer().closeInventory(); + } + if (chestLevel == 1) { + int cost = P.p.getConfig().getInt("fupgrades.MainMenu.Chest.Cost.level-2"); + if (!hasMoney(fme, cost)) { + return; + } + takeMoney(fme, cost); + fme.getFaction().setUpgrades("Chest", 2); + fme.getPlayer().closeInventory(); + } + if (chestLevel == 0) { + int cost = P.p.getConfig().getInt("fupgrades.MainMenu.Chest.Cost.level-1"); + if (!hasMoney(fme, cost)) { + return; + } + takeMoney(fme, cost); + fme.getFaction().setUpgrades("Chest", 1); + fme.getPlayer().closeInventory(); + } + } } + } public ItemStack[] buildItems(FPlayer fme) { @@ -182,10 +221,7 @@ public class FUpgradesGUI implements Listener { ItemStack expItem = P.p.createItem(expMaterial, expAmt, expData, expName, expLore); if (expLevel >= 1) { ItemMeta itemMeta = expItem.getItemMeta(); - if (!P.p.mc17) { - itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - } - + itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); itemMeta.addEnchant(Enchantment.DURABILITY, 3, true); expItem.setItemMeta(itemMeta); } @@ -223,10 +259,7 @@ public class FUpgradesGUI implements Listener { cropItem.getItemMeta().setLore(cropLore); if (cropLevel >= 1) { ItemMeta itemMeta = cropItem.getItemMeta(); - if (!P.p.mc17) { - itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - } - + itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); itemMeta.addEnchant(Enchantment.DURABILITY, 3, true); cropItem.setItemMeta(itemMeta); } @@ -239,10 +272,7 @@ public class FUpgradesGUI implements Listener { spawnerItem.getItemMeta().setLore(spawnerLore); if (spawnerLevel >= 1) { ItemMeta itemMeta = spawnerItem.getItemMeta(); - if (!P.p.mc17) { - itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - } - + itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); itemMeta.addEnchant(Enchantment.DURABILITY, 3, true); spawnerItem.setItemMeta(itemMeta); } @@ -251,7 +281,35 @@ public class FUpgradesGUI implements Listener { } else if (spawnerLevel == 3) { spawnerItem.setAmount(3); } - ItemStack[] items = {expItem, spawnerItem, cropItem}; + Material chestMaterial = Material.getMaterial(P.p.getConfig().getString("fupgrades.MainMenu.Chest.ChestItem.Type")); + int chesttAmt = P.p.getConfig().getInt("fupgrades.MainMenu.Chest.ChestItem.Amount"); + short chestData = Short.parseShort(P.p.getConfig().getInt("fupgrades.MainMenu.Chest.ChestItem.Damage") + ""); + String chestName = P.p.color(P.p.getConfig().getString("fupgrades.MainMenu.Chest.ChestItem.Name", "&e&lUpgrade Chest Size")); + List chestLore = P.p.colorList(P.p.getConfig().getStringList("fupgrades.MainMenu.Chest.ChestItem.Lore")); + int chestlevel = fme.getFaction().getUpgrade("Chest"); + for (int i = 0; i <= chestLore.size() - 1; i++) { + String line = chestLore.get(i); + line = line.replace("{level}", chestlevel + ""); + chestLore.set(i, line); + + } + + ItemStack chestItem = P.p.createItem(chestMaterial, chesttAmt, chestData, chestName, chestLore); + + if (chestlevel >= 1) { + ItemMeta itemMeta = chestItem.getItemMeta(); + itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + itemMeta.addEnchant(Enchantment.DURABILITY, 3, true); + chestItem.setItemMeta(itemMeta); + } + if (chestlevel == 2) { + chestItem.setAmount(2); + } else if (chestlevel == 3) { + chestItem.setAmount(3); + } + + + ItemStack[] items = {expItem, spawnerItem, cropItem, chestItem}; return items; } diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryBoard.java b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryBoard.java index b922f4ad..19cd04cb 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryBoard.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryBoard.java @@ -249,12 +249,12 @@ public abstract class MemoryBoard extends Board { Faction faction = fplayer.getFaction(); ArrayList ret = new ArrayList<>(); Faction factionLoc = getFactionAt(flocation); - ret.add(new FancyMessage(P.p.txt.titleize("(" + flocation.getCoordString() + ") " + factionLoc.getTag(fplayer)))); + ret.add(new FancyMessage(ChatColor.DARK_GRAY + P.p.txt.titleize("(" + flocation.getCoordString() + ") " + factionLoc.getTag(fplayer)))); int buffer = P.p.getConfig().getInt("world-border.buffer", 0); // Get the compass - ArrayList asciiCompass = AsciiCompass.getAsciiCompass(inDegrees, ChatColor.RED, P.p.txt.parse("")); + ArrayList asciiCompass = AsciiCompass.getAsciiCompass(inDegrees, ChatColor.DARK_GREEN, P.p.txt.parse("")); int halfWidth = Conf.mapWidth / 2; // Use player's value for height diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFaction.java b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFaction.java index 6fdc49a5..9ef8f881 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFaction.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFaction.java @@ -15,11 +15,11 @@ import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.Permissable; import com.massivecraft.factions.zcore.fperms.PermissableAction; import com.massivecraft.factions.zcore.util.TL; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; +import org.bukkit.*; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; import java.util.*; import java.util.Map.Entry; @@ -237,6 +237,114 @@ public abstract class MemoryFaction implements Faction, EconomyParticipator { return 0; } + String chestSerialized = null; + Map bannerSerialized; + + @Override + public Inventory getChest() { + int level = getUpgrade("Chest"); + int size = 9; + if (level == 1) { + size = P.p.getConfig().getInt("fupgrades.MainMenu.Chest.Chest-Size.level-1") * 9; + } else if (level == 2) { + size = P.p.getConfig().getInt("fupgrades.MainMenu.Chest.Chest-Size.level-2") * 9; + } else if (level == 3) { + size = P.p.getConfig().getInt("fupgrades.MainMenu.Chest.Chest-Size.level-3") * 9; + } + Inventory inventory = Bukkit.createInventory(null, size, P.p.color(P.p.getConfig().getString("fchest.Inventory-Title"))); + if (chestSerialized == null) { + return inventory; + } else { + Inventory contents = StringToInventory(chestSerialized); + inventory.setContents(contents.getContents()); + return inventory; + } + } + + @Override + public void setChest(Inventory inventory) { + chestSerialized = InventoryToString(inventory); + } + + public String InventoryToString(Inventory invInventory) { + String serialization = invInventory.getSize() + ";"; + for (int i = 0; i < invInventory.getSize(); i++) { + ItemStack is = invInventory.getItem(i); + if (is != null) { + String serializedItemStack = new String(); + + String isType = String.valueOf(is.getType().getId()); + serializedItemStack += "t@" + isType; + + if (is.getDurability() != 0) { + String isDurability = String.valueOf(is.getDurability()); + serializedItemStack += ":d@" + isDurability; + } + + if (is.getAmount() != 1) { + String isAmount = String.valueOf(is.getAmount()); + serializedItemStack += ":a@" + isAmount; + } + + Map isEnch = is.getEnchantments(); + if (isEnch.size() > 0) { + for (Entry ench : isEnch.entrySet()) { + serializedItemStack += ":e@" + ench.getKey().getId() + "@" + ench.getValue(); + } + } + + serialization += i + "#" + serializedItemStack + ";"; + } + } + return serialization; + } + + public Inventory StringToInventory(String invString) { + String[] serializedBlocks = invString.split(";"); + String invInfo = serializedBlocks[0]; + Inventory deserializedInventory = Bukkit.getServer().createInventory(null, Integer.valueOf(invInfo)); + + for (int i = 1; i < serializedBlocks.length; i++) { + String[] serializedBlock = serializedBlocks[i].split("#"); + int stackPosition = Integer.valueOf(serializedBlock[0]); + + if (stackPosition >= deserializedInventory.getSize()) { + continue; + } + + ItemStack is = null; + Boolean createdItemStack = false; + + String[] serializedItemStack = serializedBlock[1].split(":"); + for (String itemInfo : serializedItemStack) { + String[] itemAttribute = itemInfo.split("@"); + if (itemAttribute[0].equals("t")) { + is = new ItemStack(Material.getMaterial(Integer.valueOf(itemAttribute[1]))); + createdItemStack = true; + } else if (itemAttribute[0].equals("d") && createdItemStack) { + is.setDurability(Short.valueOf(itemAttribute[1])); + } else if (itemAttribute[0].equals("a") && createdItemStack) { + is.setAmount(Integer.valueOf(itemAttribute[1])); + } else if (itemAttribute[0].equals("e") && createdItemStack) { + is.addEnchantment(Enchantment.getById(Integer.valueOf(itemAttribute[1])), Integer.valueOf(itemAttribute[2])); + } + } + deserializedInventory.setItem(stackPosition, is); + } + + return deserializedInventory; + } + + @Override + public void setBannerPattern(ItemStack banner) { + bannerSerialized = banner.serialize(); + } + + @Override + public ItemStack getBanner() { + return ItemStack.deserialize(bannerSerialized); + } + public void setUpgrades(String key,int level){ upgrades.put(key,level); } 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 06973e25..eb676ced 100644 --- a/src/main/java/com/massivecraft/factions/zcore/util/TL.java +++ b/src/main/java/com/massivecraft/factions/zcore/util/TL.java @@ -548,6 +548,11 @@ public enum TL { COMMAND_SCOREBOARD_DESCRIPTION("Scoreboardy things"), + COMMAND_SETBANNER_SUCCESS("&c&l[!] &7Banner Pattern Set!"), + COMMAND_SETBANNER_NOTBANNER("&c&l[!] &7The item is &cnot&7 a banner!"), + COMMAND_SETBANNER_DESCRIPTION("set banner pattern for your faction"), + + COMMAND_SETDEFAULTROLE_DESCRIPTION("/f defaultrole - set your Faction's default role."), COMMAND_SETDEFAULTROLE_NOTTHATROLE("&c&l[!]&7 You cannot set the default to admin."), COMMAND_SETDEFAULTROLE_SUCCESS("Set default role of your faction to %1$s"), diff --git a/src/main/java/com/massivecraft/factions/zcore/util/TextUtil.java b/src/main/java/com/massivecraft/factions/zcore/util/TextUtil.java index c73ae8b8..724a4355 100644 --- a/src/main/java/com/massivecraft/factions/zcore/util/TextUtil.java +++ b/src/main/java/com/massivecraft/factions/zcore/util/TextUtil.java @@ -169,18 +169,18 @@ public class TextUtil { // Paging and chrome-tools like titleize // -------------------------------------------- // - private final static String titleizeLine = repeat("_", 52); + private final static String titleizeLine = repeat("-", 52); private final static int titleizeBalance = -1; public String titleize(String str) { - String center = ".[ " + parseTags("") + str + parseTags("") + " ]."; + String center = ChatColor.DARK_GRAY + "< " + parseTags("") + str + parseTags("") + ChatColor.DARK_GRAY + " >"; int centerlen = ChatColor.stripColor(center).length(); int pivot = titleizeLine.length() / 2; int eatLeft = (centerlen / 2) - titleizeBalance; int eatRight = (centerlen - eatLeft) + titleizeBalance; if (eatLeft < pivot) { - return parseTags("") + titleizeLine.substring(0, pivot - eatLeft) + center + titleizeLine.substring(pivot + eatRight); + return parseTags("") + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + titleizeLine.substring(0, pivot - eatLeft) + center + ChatColor.DARK_GRAY + ChatColor.STRIKETHROUGH + titleizeLine.substring(pivot + eatRight); } else { return parseTags("") + center; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index fac674bb..bea4955a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -349,6 +349,7 @@ help: - '&e/f map &8- &7Map of the surrounding area, click chunks to claim.' - '&e/f sethome &8- &7Teleport to faction home.' - '&e/f home &8- &7Set your faction home.' + - '&e/f title &f &8- &7Set a player''s title, color codes supported.' - '&e/f ban &8- &7Ban a member from your faction.' - '&e/f unban &8- &7Unban a member from your faction.' - '&e/f banlist &8- &7List banned players from your faction.' @@ -373,9 +374,11 @@ help: - '&e/f warp &8- &7Opens the warp menu.' - '&e/f setwarp &8- &7Set a warp.' - '&e/f perms &8- &7Change what players can do in your claims.' - - '&e/f upgrades &8- &7Upgrade your factions core.' + - '&e/f upgrades &8- &7Upgrade various perks in your faction.' - '&e/f checkpoint &8- &7Set a faction checkpoint.' - - '&e/f tnt add/take <amount> &8- &7Faction Based TNT Bank.' + - '&e/f tnt add/take &f<amount> &8- &7Faction Based TNT Bank.' + - '&e/f tntfill &f<radius> <amount> &8- &7Tnt fill integrated into the tntbank!' + - '&e/f chest &8- &7Open a virtual faction chest! ' - '&e/f version &8- &7Display current faction version.' - '&7&m--------------------&r &e/f help 3 &7&m-----------------------' ############################################################ @@ -486,7 +489,6 @@ fperm-gui: relation: 4 # Back button slot back: 0 - # Start action slots build: 10 destroy: 11 @@ -500,7 +502,7 @@ fperm-gui: kick: 21 item: 22 sethome: 23 - widthdraw: 24 + withdraw: 24 territory: 25 access: 28 promote: 29 @@ -512,6 +514,8 @@ fperm-gui: vault: 40 tntbank: 39 tntfill: 41 + chest: 42 + spawner: 38 # Material to show, if the material is colorable eg: Wool, Stained Clay it will update with it's access color materials: build: STAINED_GLASS @@ -526,7 +530,7 @@ fperm-gui: kick: STAINED_GLASS item: STAINED_GLASS sethome: STAINED_GLASS - widthdraw: STAINED_GLASS + withdraw: STAINED_GLASS territory: STAINED_GLASS access: STAINED_GLASS promote: STAINED_GLASS @@ -538,6 +542,8 @@ fperm-gui: vault: STAINED_GLASS tntbank: STAINED_GLASS tntfill: STAINED_GLASS + chest: STAINED_GLASS + spawner: STAINED_GLASS # Same dummy items format as above dummy-items: '0': @@ -581,15 +587,6 @@ fperm-gui: - 42 - 43 - 44 - - 45 - - 46 - - 47 - - 48 - - 49 - - 50 - - 51 - - 52 - - 53 # {action} Action name eg: Setwarp, Kick # {action-access} Access name eg: Allow, Deny # {action-access-color} Access color eg: Allow;GREEN @@ -735,6 +732,14 @@ fvault: ############################################################ # +------------------------------------------------------+ # +# | Faction Vault | # +# +------------------------------------------------------+ # +fchest: + Enabled: true + Inventory-Title: '&2&lFaction Chest' + # Vault size upgrades can be configured in the upgrades section of config +############################################################ +# +------------------------------------------------------+ # # | Faction Upgrades | # # +------------------------------------------------------+ # ############################################################ @@ -873,6 +878,38 @@ fupgrades: - '&e&lClick to &nUnlock' slots: - 16 + Chest: + Chest-Size: + # This is rows + level-1: 1 + level-2: 2 + level-3: 3 + Cost: + level-1: 1000000 + level-2: 2000000 + level-3: 3000000 + ChestItem: + Name: '&e&lUpgrade Faction Chest Size' + Type: CHEST + Amount: 1 + Damage: 0 + Lore: + - '&7Increased Faction Chest Size.' + - '' + - '&e&lTier' + - '&f&l* &7Current Level: &n{level}' + - '' + - '&e&lPerks' + - '&f&l* &7Level 1 - &f2 Rows' + - '&7 - Cost: $1,000,000' + - '&f&l* &7Level 2 - &f3 Rows' + - '&7 - Cost: $2,000,000' + - '&f&l* &7Level 3 - &f4 Rows' + - '&7 - Cost: $3,000,000' + - '' + - '&e&lClick to &nUnlock' + slots: + - 22 fbanners: Enabled: true @@ -897,6 +934,11 @@ fbanners: #Title when moving between chunks Title: Show-Title: true + # You can configure the time in 1.9 or higher! The values are in seconds + Options: + FadeInTime: 1 + ShowTime: 1 + FadeOutTime: 1 Format: Title: '{Faction}' Subtitle: '{Description}' diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 37f30c02..44d65824 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: Factions -version: ${project.version}-1.3-STABLE +version: ${project.version}-1.4-STABLE main: com.massivecraft.factions.P authors: [Olof Larsson, Brett Flannigan, drtshock, ProSavage] softdepend: [CoreProtect, PlayerVaults, PlaceholderAPI, MVdWPlaceholderAPI, PermissionsEx, Permissions, Essentials, EssentialsChat, HeroChat, iChat, LocalAreaChat, LWC, nChat, ChatManager, CAPI, AuthMe, Vault, Spout, WorldEdit, WorldGuard, AuthDB, CaptureThePoints, CombatTag, dynmap, FactionsTop]