From 0294a606754961980a0b2a18b92c31c3944f62b5 Mon Sep 17 00:00:00 2001 From: Trent Hensler Date: Mon, 30 May 2016 16:22:45 -0700 Subject: [PATCH] Add Faction vaults. These can be accessed with /f vault Set a Faction's max vaults with /f setmaxvaults - can be run from console so Buycraft can execute it. * This is a not very tested implementation. Should be tested more in depth before being pushed to a release. --- pom.xml | 9 ++ .../java/com/massivecraft/factions/Conf.java | 3 + .../com/massivecraft/factions/Faction.java | 4 + .../java/com/massivecraft/factions/P.java | 13 +++ .../factions/cmd/CmdSetMaxVaults.java | 49 +++++++++++ .../massivecraft/factions/cmd/CmdVault.java | 84 +++++++++++++++++++ .../massivecraft/factions/cmd/FCmdRoot.java | 6 ++ .../factions/struct/Permission.java | 2 + .../factions/zcore/persist/MemoryFaction.java | 9 ++ .../massivecraft/factions/zcore/util/TL.java | 5 ++ src/main/resources/plugin.yml | 10 ++- 11 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdSetMaxVaults.java create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdVault.java diff --git a/pom.xml b/pom.xml index 07c89bca..22618e78 100644 --- a/pom.xml +++ b/pom.xml @@ -310,6 +310,11 @@ + + com.drtshock + PlayerVaults + 3.6.0-SNAPSHOT + @@ -337,5 +342,9 @@ stealthyone-snapshots http://repo.stealthyone.com/content/repositories/snapshots/ + + playervaults + https://ci.drtshock.net/plugin/repository/everything/ + diff --git a/src/main/java/com/massivecraft/factions/Conf.java b/src/main/java/com/massivecraft/factions/Conf.java index 6fa68888..9e2a6c53 100644 --- a/src/main/java/com/massivecraft/factions/Conf.java +++ b/src/main/java/com/massivecraft/factions/Conf.java @@ -356,6 +356,9 @@ public class Conf { public static Set worldsIgnorePvP = new LinkedHashSet(); public static Set worldsNoWildernessProtection = new LinkedHashSet(); + // faction- + public static String vaultPrefix = "faction-%s"; + public static Backend backEnd = Backend.JSON; public static transient int mapHeight = 8; diff --git a/src/main/java/com/massivecraft/factions/Faction.java b/src/main/java/com/massivecraft/factions/Faction.java index e8a53a62..5ff09d14 100644 --- a/src/main/java/com/massivecraft/factions/Faction.java +++ b/src/main/java/com/massivecraft/factions/Faction.java @@ -27,6 +27,10 @@ public interface Faction extends EconomyParticipator { public void clearWarps(); + public int getMaxVaults(); + + public void setMaxVaults(int value); + public void addAnnouncement(FPlayer fPlayer, String msg); public void sendUnreadAnnouncements(FPlayer fPlayer); diff --git a/src/main/java/com/massivecraft/factions/P.java b/src/main/java/com/massivecraft/factions/P.java index b370d920..17a879cb 100644 --- a/src/main/java/com/massivecraft/factions/P.java +++ b/src/main/java/com/massivecraft/factions/P.java @@ -20,6 +20,7 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredServiceProvider; import java.lang.reflect.Modifier; @@ -56,6 +57,8 @@ public class P extends MPlugin { public FCmdRoot cmdBase; public CmdAutoHelp cmdAutoHelp; + private boolean hookedPlayervaults; + public P() { p = this; } @@ -71,6 +74,7 @@ public class P extends MPlugin { // Load Conf from disk Conf.load(); Essentials.setup(); + hookedPlayervaults = setupPlayervaults(); FPlayers.getInstance().load(); Factions.getInstance().load(); for (FPlayer fPlayer : FPlayers.getInstance().getAllFPlayers()) { @@ -128,6 +132,11 @@ public class P extends MPlugin { return perms != null; } + private boolean setupPlayervaults() { + Plugin plugin = getServer().getPluginManager().getPlugin("PlayerVaults"); + return plugin != null && plugin.isEnabled(); + } + @Override public GsonBuilder getGsonBuilder() { Type mapFLocToStringSetType = new TypeToken>>() { @@ -312,6 +321,10 @@ public class P extends MPlugin { return players; } + public boolean isHookedPlayervaults() { + return hookedPlayervaults; + } + public String getPrimaryGroup(OfflinePlayer player) { return perms == null || !perms.hasGroupSupport() ? " " : perms.getPrimaryGroup(Bukkit.getWorlds().get(0).toString(), player); } diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdSetMaxVaults.java b/src/main/java/com/massivecraft/factions/cmd/CmdSetMaxVaults.java new file mode 100644 index 00000000..b9847c07 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/CmdSetMaxVaults.java @@ -0,0 +1,49 @@ +package com.massivecraft.factions.cmd; + +import com.massivecraft.factions.Faction; +import com.massivecraft.factions.P; +import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.ChatColor; + +public class CmdSetMaxVaults extends FCommand { + + public CmdSetMaxVaults() { + this.aliases.add("setmaxvaults"); + this.aliases.add("smv"); + + this.requiredArgs.add("faction"); + this.requiredArgs.add("number"); + + this.permission = Permission.SETMAXVAULTS.node; + this.disableOnLock = false; + + senderMustBePlayer = false; + senderMustBeMember = false; + senderMustBeModerator = false; + senderMustBeAdmin = false; + } + + @Override + public void perform() { + Faction targetFaction = argAsFaction(0); + int value = argAsInt(1, -1); + if(value < 0) { + sender.sendMessage(ChatColor.RED + "Number must be greater than 0."); + return; + } + + if(targetFaction == null) { + sender.sendMessage(ChatColor.RED + "Couldn't find Faction: " + ChatColor.YELLOW + argAsString(0)); + return; + } + + targetFaction.setMaxVaults(value); + sender.sendMessage(TL.COMMAND_SETMAXVAULTS_SUCCESS.format(targetFaction.getTag(), value)); + } + + @Override + public TL getUsageTranslation() { + return TL.COMMAND_SETMAXVAULTS_DESCRIPTION; + } +} diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdVault.java b/src/main/java/com/massivecraft/factions/cmd/CmdVault.java new file mode 100644 index 00000000..583c5c62 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/CmdVault.java @@ -0,0 +1,84 @@ +package com.massivecraft.factions.cmd; + +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 com.massivecraft.factions.Conf; +import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +public class CmdVault extends FCommand { + + public CmdVault() { + this.aliases.add("vault"); + + //this.requiredArgs.add(""); + this.optionalArgs.put("number", "number"); + + this.permission = Permission.VAULT.node; + this.disableOnLock = false; + + senderMustBePlayer = true; + senderMustBeMember = true; + senderMustBeModerator = false; + senderMustBeAdmin = false; + } + + @Override + public void perform() { + /* + /f vault + */ + + int number = argAsInt(0, 0); // Default to 0 or show on 0 + + Player player = me; + + if (PlayerVaults.getInstance().getInVault().containsKey(player.getUniqueId().toString())) { + return; // Already in a vault so they must be trying to dupe. + } + + int max = myFaction.getMaxVaults(); + if (number > max) { + me.sendMessage(TL.COMMAND_VAULTS_TOOHIGH.format(number, max)); + return; + } + + // Something like faction-id + String vaultName = String.format(Conf.vaultPrefix, myFaction.getId()); + + if (number < 1) { + // Message about which vaults that Faction has. + // List the target + YamlConfiguration file = UUIDVaultManager.getInstance().getPlayerVaultFile(vaultName); + if (file == null) { + sender.sendMessage(Lang.TITLE.toString() + Lang.VAULT_DOES_NOT_EXIST.toString()); + } else { + StringBuilder sb = new StringBuilder(); + for (String key : file.getKeys(false)) { + sb.append(key.replace("vault", "")).append(" "); + } + + sender.sendMessage(Lang.TITLE.toString() + Lang.EXISTING_VAULTS.toString().replaceAll("%p", fme.getTag()).replaceAll("%v", sb.toString().trim())); + } + return; + } // end listing vaults. + + // Attempt to open vault. + if (VaultOperations.openOtherVault(player, vaultName, String.valueOf(number))) { + // Success + PlayerVaults.getInstance().getInVault().put(player.getUniqueId().toString(), new VaultViewInfo(vaultName, number)); + } + } + + @Override + public TL getUsageTranslation() { + return TL.COMMAND_VERSION_DESCRIPTION; + } +} diff --git a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java index 366e2fa3..48f49fc5 100644 --- a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java +++ b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java @@ -1,6 +1,7 @@ package com.massivecraft.factions.cmd; import com.massivecraft.factions.Conf; +import com.massivecraft.factions.P; import com.massivecraft.factions.zcore.util.TL; import java.util.Collections; @@ -151,6 +152,11 @@ public class FCmdRoot extends FCommand { this.addSubCommand(this.cmdClaimLine); this.addSubCommand(this.cmdTop); this.addSubCommand(this.cmdAHome); + if (P.p.isHookedPlayervaults()) { + P.p.log("Found playervaults hook, adding /f vault and /f setmaxvault commands."); + this.addSubCommand(new CmdSetMaxVaults()); + this.addSubCommand(new CmdVault()); + } } @Override diff --git a/src/main/java/com/massivecraft/factions/struct/Permission.java b/src/main/java/com/massivecraft/factions/struct/Permission.java index d090c08c..ce1e8263 100644 --- a/src/main/java/com/massivecraft/factions/struct/Permission.java +++ b/src/main/java/com/massivecraft/factions/struct/Permission.java @@ -78,6 +78,8 @@ public enum Permission { SEECHUNK("seechunk"), SETWARP("setwarp"), TOP("top"), + VAULT("vault"), + SETMAXVAULTS("setmaxvaults"), WARP("warp"); public final String node; 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 7d0508c8..0f01ffec 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFaction.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFaction.java @@ -42,6 +42,7 @@ public abstract class MemoryFaction implements Faction, EconomyParticipator { protected HashMap> announcements = new HashMap>(); protected ConcurrentHashMap warps = new ConcurrentHashMap(); private long lastDeath; + protected int maxVaults; public HashMap> getAnnouncements() { return this.announcements; @@ -95,6 +96,14 @@ public abstract class MemoryFaction implements Faction, EconomyParticipator { warps.clear(); } + public int getMaxVaults() { + return this.maxVaults; + } + + public void setMaxVaults(int value) { + this.maxVaults = value; + } + public Set getInvites() { return invites; } 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 bf4ae8da..fc2f93ef 100644 --- a/src/main/java/com/massivecraft/factions/zcore/util/TL.java +++ b/src/main/java/com/massivecraft/factions/zcore/util/TL.java @@ -434,6 +434,11 @@ public enum TL { COMMAND_SETHOME_SETOTHER("You have set the home for the %1$s faction."), COMMAND_SETHOME_DESCRIPTION("Set the faction home"), + COMMAND_SETMAXVAULTS_DESCRIPTION("Set max vaults for a Faction."), + COMMAND_SETMAXVAULTS_SUCCESS("&aSet max vaults for &e%s &ato &b%d"), + + COMMAND_VAULTS_TOOHIGH("You tried to open vault %d but your Faction only has %d vaults."), + COMMAND_SHOW_NOFACTION_SELF("You are not in a faction"), COMMAND_SHOW_NOFACTION_OTHER("That's not a faction"), COMMAND_SHOW_TOSHOW("to show faction information"), diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 38854c23..e9ef39be 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -2,7 +2,7 @@ name: Factions version: ${project.version} main: com.massivecraft.factions.P authors: [Olof Larsson, Brett Flannigan, drtshock] -softdepend: [PermissionsEx, Permissions, Essentials, EssentialsChat, HeroChat, iChat, LocalAreaChat, LWC, nChat, ChatManager, CAPI, AuthMe, Vault, Spout, WorldEdit, WorldGuard, AuthDB, CaptureThePoints, CombatTag, dynmap] +softdepend: [PlayerVaults, PermissionsEx, Permissions, Essentials, EssentialsChat, HeroChat, iChat, LocalAreaChat, LWC, nChat, ChatManager, CAPI, AuthMe, Vault, Spout, WorldEdit, WorldGuard, AuthDB, CaptureThePoints, CombatTag, dynmap] commands: factions: description: Reference command for Factions. @@ -18,6 +18,7 @@ permissions: factions.save: true factions.modifypower: true factions.ahome: true + factions.setmaxvaults: true factions.*: description: This is just an alias for factions.kit.admin children: @@ -96,6 +97,7 @@ permissions: factions.monitorlogins: true factions.top: true factions.togglealliancechat: true + factions.vault: true factions.admin: description: hand over your admin rights factions.admin.any: @@ -264,4 +266,8 @@ permissions: factions.ahome: description: Ability to send players to their faction home. factions.autoleavebypass: - description: Bypass autoleave. \ No newline at end of file + description: Bypass autoleave. + factions.vault: + description: Access faction vault. + factions.setmaxvault: + description: Set a faction's max vaults. \ No newline at end of file