diff --git a/src/main/java/com/massivecraft/factions/FPlayer.java b/src/main/java/com/massivecraft/factions/FPlayer.java index 89bbcb3b..377c9ee2 100644 --- a/src/main/java/com/massivecraft/factions/FPlayer.java +++ b/src/main/java/com/massivecraft/factions/FPlayer.java @@ -261,7 +261,7 @@ public interface FPlayer extends EconomyParticipator { int getDeaths(); - void takeMoney(int amt); + boolean takeMoney(int amt); boolean hasMoney(int amt); diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdBanner.java b/src/main/java/com/massivecraft/factions/cmd/CmdBanner.java index 6258b8f5..1638ebd0 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdBanner.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdBanner.java @@ -34,12 +34,10 @@ public class CmdBanner extends FCommand { context.msg(TL.COMMAND_BANNER_NOBANNER); return; } - if (!context.fPlayer.hasMoney(FactionsPlugin.getInstance().getConfig().getInt("fbanners.Banner-Cost", 5000))) { + if (!context.fPlayer.takeMoney(FactionsPlugin.getInstance().getConfig().getInt("fbanners.Banner-Cost", 5000))) { context.msg(TL.COMMAND_BANNER_NOTENOUGHMONEY); return; } - this.takeMoney(context.fPlayer, FactionsPlugin.getInstance().getConfig().getInt("fbanners.Banner-Cost", 5000)); - this.takeMoney(context.fPlayer, FactionsPlugin.getInstance().getConfig().getInt("fbanners.Banner-Cost", 5000)); ItemStack warBanner = context.fPlayer.getFaction().getBanner(); ItemMeta warmeta = warBanner.getItemMeta(); warmeta.setDisplayName(FactionsPlugin.getInstance().color(FactionsPlugin.getInstance().getConfig().getString("fbanners.Item.Name"))); @@ -49,7 +47,7 @@ public class CmdBanner extends FCommand { warBanner.setAmount(1); context.player.getInventory().addItem(warBanner); } - + @Deprecated public boolean hasMoney(FPlayer fme, int amt) { Economy econ = FactionsPlugin.getInstance().getEcon(); if (econ.getBalance(fme.getPlayer()) >= amt) { @@ -58,11 +56,10 @@ public class CmdBanner extends FCommand { fme.msg(TL.COMMAND_BANNER_NOTENOUGHMONEY); return false; } - + @Deprecated public void takeMoney(FPlayer fme, int amt) { if (this.hasMoney(fme, amt)) { Economy econ = FactionsPlugin.getInstance().getEcon(); - econ.withdrawPlayer(fme.getPlayer(), (double) amt); fme.sendMessage(TL.COMMAND_BANNER_MONEYTAKE.toString().replace("{amount}", amt + "")); } } diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdGetVault.java b/src/main/java/com/massivecraft/factions/cmd/CmdGetVault.java index 9d2a18e5..9f450505 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdGetVault.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdGetVault.java @@ -47,9 +47,9 @@ public class CmdGetVault extends FCommand { return; } + if (!context.fPlayer.takeMoney(amount)) {return;} //success :) - context.fPlayer.takeMoney(amount); context.player.getInventory().addItem(vault); context.fPlayer.msg(TL.COMMAND_GETVAULT_RECEIVE); diff --git a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java index a483b68d..8e585ed8 100644 --- a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java +++ b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java @@ -20,6 +20,7 @@ import com.massivecraft.factions.cmd.roles.CmdDemote; import com.massivecraft.factions.cmd.roles.CmdPromote; import com.massivecraft.factions.cmd.tnt.CmdTnt; import com.massivecraft.factions.cmd.tnt.CmdTntFill; +import com.massivecraft.factions.cmd.wild.CmdWild; import com.massivecraft.factions.discord.CmdInviteBot; import com.massivecraft.factions.discord.CmdSetGuild; import com.massivecraft.factions.missions.CmdMissions; @@ -152,6 +153,7 @@ public class FCmdRoot extends FCommand implements CommandExecutor { public CmdStrikes cmdStrikes = new CmdStrikes(); public CmdCheck cmdCheck = new CmdCheck(); public CmdWeeWoo cmdWeeWoo = new CmdWeeWoo(); + public CmdWild cmdWild = new CmdWild(); public CmdConvertConfig cmdConvertConfig = new CmdConvertConfig(); public CmdSpawnerLock cmdSpawnerLock = new CmdSpawnerLock(); public CmdSetDiscord cmdSetDiscord = new CmdSetDiscord(); @@ -174,6 +176,7 @@ public class FCmdRoot extends FCommand implements CommandExecutor { public Boolean fPayPalEnabled = false; public Boolean coreProtectEnabled = false; public Boolean internalFTOPEnabled = false; + public Boolean fWildEnabled = false; public FCmdRoot() { super(); @@ -334,6 +337,10 @@ public class FCmdRoot extends FCommand implements CommandExecutor { internalFTOPEnabled = true; } //Other + if (FactionsPlugin.getInstance().getConfig().getBoolean("Wild.Enabled", false) && !fWildEnabled) { + this.addSubCommand(this.cmdWild); + fWildEnabled = true; + } if (FactionsPlugin.getInstance().getConfig().getBoolean("Missions-Enabled", false) && !missionsEnabled) { this.addSubCommand(this.cmdMissions); missionsEnabled = true; diff --git a/src/main/java/com/massivecraft/factions/cmd/wild/CmdWild.java b/src/main/java/com/massivecraft/factions/cmd/wild/CmdWild.java new file mode 100644 index 00000000..1d45cc0d --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/wild/CmdWild.java @@ -0,0 +1,110 @@ +package com.massivecraft.factions.cmd.wild; + + +import com.massivecraft.factions.Board; +import com.massivecraft.factions.FLocation; +import com.massivecraft.factions.FPlayers; +import com.massivecraft.factions.FactionsPlugin; +import com.massivecraft.factions.cmd.CommandContext; +import com.massivecraft.factions.cmd.CommandRequirements; +import com.massivecraft.factions.cmd.FCommand; +import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Random; + +public class CmdWild extends FCommand { + public static HashMap waitingTeleport; + public static HashMap teleportRange; + public static HashSet teleporting; + public CmdWild() { + super(); + this.aliases.add("wild"); + this.requirements = new CommandRequirements.Builder(Permission.WILD) + .playerOnly() + .build(); + waitingTeleport = new HashMap<>(); + teleporting = new HashSet<>(); + teleportRange = new HashMap<>(); + startWild(); + } + @Override + public void perform(CommandContext context) { + if (!waitingTeleport.keySet().contains(context.player)) { + context.player.openInventory(new WildGUI(context.player, context.fPlayer).getInventory()); + } else {context.fPlayer.msg(TL.COMMAND_WILD_WAIT);} + } + + public void startWild() { + Bukkit.getScheduler().scheduleSyncRepeatingTask(FactionsPlugin.instance, () -> { + for (Player p : waitingTeleport.keySet()) { + int i = waitingTeleport.get(p) - 1; + if (i > 0) { + if (i != 1) { + p.sendMessage(TL.COMMAND_WILD_WAIT.format((i + " Seconds"))); + } else { + p.sendMessage(TL.COMMAND_WILD_WAIT.format((i + " Second"))); + } + waitingTeleport.replace(p, i); + } else { + p.sendMessage(TL.COMMAND_WILD_SUCCESS.toString()); + waitingTeleport.remove(p); + attemptTeleport(p); + } + } + }, 0L, 20L); + } + public void attemptTeleport(Player p) { + boolean success = false; + int tries = 0; + ConfigurationSection c = FactionsPlugin.getInstance().getConfig().getConfigurationSection("Wild.Zones." + teleportRange.get(p)); + while (tries < 5) { + int x = new Random().nextInt((c.getInt("Range.MaxX") - c.getInt("Range.MinX")) + 1) + c.getInt("Range.MinX"); + int z = new Random().nextInt((c.getInt("Range.MaxZ") - c.getInt("Range.MinZ")) + 1) + c.getInt("Range.MinZ"); + if (Board.getInstance().getFactionAt(new FLocation(p.getWorld().getName(), x, z)).isWilderness()) { + success = true; + FLocation loc = new FLocation(p.getWorld().getName(), x, z); + teleportRange.remove(p); + if (!FPlayers.getInstance().getByPlayer(p).takeMoney(c.getInt("Cost"))) { + p.sendMessage(TL.GENERIC_NOTENOUGHMONEY.toString()); + return; + } + teleportPlayer(p, loc); + break; + } + tries++; + } + if (!success) {p.sendMessage(TL.COMMAND_WILD_FAILED.toString());} + } + public void teleportPlayer(Player p, FLocation loc) { + Location finalLoc; + if (FactionsPlugin.getInstance().getConfig().getBoolean("Wild.Arrival.SpawnAbove")) { + finalLoc = new Location(p.getWorld(), loc.getX(), p.getWorld().getHighestBlockYAt(Math.round(loc.getX()), Math.round(loc.getZ())) + FactionsPlugin.getInstance().getConfig().getInt("Wild.Arrival.SpawnAboveBlocks", 1), loc.getZ()); + } else {finalLoc = new Location(p.getWorld(), loc.getX(), p.getWorld().getHighestBlockYAt(Math.round(loc.getX()), Math.round(loc.getZ())), loc.getZ());} + p.teleport(finalLoc, PlayerTeleportEvent.TeleportCause.PLUGIN); + setTeleporting(p); + applyEffects(p); + } + public void applyEffects(Player p) { + for (String s : FactionsPlugin.getInstance().getConfig().getStringList("Wild.Arrival.Effects")) { + p.addPotionEffect(new PotionEffect(PotionEffectType.getByName(s), 40, 1)); + } + } + public void setTeleporting(Player p) { + teleporting.add(p); + Bukkit.getScheduler().scheduleSyncDelayedTask(FactionsPlugin.instance, () -> teleporting.remove(p), FactionsPlugin.getInstance().getConfig().getInt("Wild.Arrival.FallDamageWindow") * 20); + } + @Override + public TL getUsageTranslation() { + return TL.COMMAND_WILD_DESCRIPTION; + } +} diff --git a/src/main/java/com/massivecraft/factions/cmd/wild/WildGUI.java b/src/main/java/com/massivecraft/factions/cmd/wild/WildGUI.java new file mode 100644 index 00000000..4ba35ce8 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/wild/WildGUI.java @@ -0,0 +1,74 @@ +package com.massivecraft.factions.cmd.wild; + +import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.FactionsPlugin; +import com.massivecraft.factions.integration.Essentials; +import com.massivecraft.factions.util.FactionGUI; +import com.massivecraft.factions.util.XMaterial; +import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class WildGUI implements FactionGUI { + Player player; + FPlayer fplayer; + HashMap map; + Inventory inv; + public WildGUI(Player player, FPlayer fplayer) { + this.player = player; + this.fplayer = fplayer; + map = new HashMap<>(); + } + @Override + public void onClick(int slot, ClickType action) { + if (map.keySet().contains(slot)) { + String zone = map.get(slot); + if (fplayer.hasMoney(FactionsPlugin.getInstance().getConfig().getInt("Wild.Zones." + zone + ".Cost"))) { + CmdWild.waitingTeleport.put(player, FactionsPlugin.getInstance().getConfig().getInt("Wild.Wait")); + CmdWild.teleportRange.put(player, zone); + fplayer.msg(TL.COMMAND_WILD_WAIT, FactionsPlugin.getInstance().getConfig().getInt("Wild.Wait") + " Seconds"); + player.closeInventory(); + } + } + } + + @Override + public void build() { + inv = Bukkit.createInventory(this, FactionsPlugin.getInstance().getConfig().getInt("Wild.GUI.Size"), FactionsPlugin.getInstance().color(FactionsPlugin.getInstance().getConfig().getString("Wild.GUI.Name"))); + ItemStack fillItem = XMaterial.matchXMaterial(FactionsPlugin.getInstance().getConfig().getString("Wild.GUI.FillMaterial")).parseItem(); + ItemMeta meta = fillItem.getItemMeta(); + meta.setDisplayName(""); + fillItem.setItemMeta(meta); + for (int fill = 0; fill < FactionsPlugin.getInstance().getConfig().getInt("Wild.GUI.Size"); ++fill) { + inv.setItem(fill, fillItem); + } + for (String key : FactionsPlugin.getInstance().getConfig().getConfigurationSection("Wild.Zones").getKeys(false)) { + ItemStack zoneItem = XMaterial.matchXMaterial(FactionsPlugin.getInstance().getConfig().getString("Wild.Zones." + key + ".Material")).parseItem(); + ItemMeta zoneMeta = zoneItem.getItemMeta(); + List lore = new ArrayList<>(); + for (String s : FactionsPlugin.getInstance().getConfig().getStringList("Wild.Zones." + key + ".Lore")) { + lore.add(FactionsPlugin.getInstance().color(s)); + } + zoneMeta.setLore(lore); + zoneMeta.setDisplayName(FactionsPlugin.getInstance().color(FactionsPlugin.getInstance().getConfig().getString("Wild.Zones." + key + ".Name"))); + zoneItem.setItemMeta(zoneMeta); + int slot = FactionsPlugin.getInstance().getConfig().getInt("Wild.Zones." + key + ".Slot"); + map.put(slot, key); + inv.setItem(slot, zoneItem); + } + } + + @Override + public Inventory getInventory() { + if (inv == null) {build();} + return inv; + } +} diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java index bc62897e..5c87f2ab 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -5,6 +5,7 @@ import com.massivecraft.factions.cmd.CmdFGlobal; import com.massivecraft.factions.cmd.CmdFly; import com.massivecraft.factions.cmd.CmdSeeChunk; import com.massivecraft.factions.cmd.logout.LogoutHandler; +import com.massivecraft.factions.cmd.wild.CmdWild; import com.massivecraft.factions.discord.Discord; import com.massivecraft.factions.event.FPlayerEnteredFactionEvent; import com.massivecraft.factions.event.FPlayerJoinEvent; @@ -924,6 +925,10 @@ public class FactionsPlayerListener implements Listener { handler.cancelLogout(e.getPlayer()); e.getPlayer().sendMessage(String.valueOf(TL.COMMAND_LOGOUT_MOVED)); } + if (CmdWild.waitingTeleport.containsKey(e.getPlayer())) { + CmdWild.waitingTeleport.remove(e.getPlayer()); + FPlayers.getInstance().getByPlayer(e.getPlayer()).msg(TL.COMMAND_WILD_INTERUPTED); + } } @EventHandler @@ -935,6 +940,15 @@ public class FactionsPlayerListener implements Listener { handler.cancelLogout(player); player.sendMessage(String.valueOf(TL.COMMAND_LOGOUT_DAMAGE_TAKEN)); } + if (CmdWild.waitingTeleport.containsKey(player)) { + CmdWild.waitingTeleport.remove(player); + FPlayers.getInstance().getByPlayer(player).msg(TL.COMMAND_WILD_INTERUPTED); + } + if (CmdWild.teleporting.contains(player)) { + if (!FactionsPlugin.getInstance().getConfig().getBoolean("Wild.FallDamage") && e.getCause() == EntityDamageEvent.DamageCause.FALL) { + e.setCancelled(true); + } + } } } diff --git a/src/main/java/com/massivecraft/factions/missions/MissionGUI.java b/src/main/java/com/massivecraft/factions/missions/MissionGUI.java index 48978b96..79adc98e 100644 --- a/src/main/java/com/massivecraft/factions/missions/MissionGUI.java +++ b/src/main/java/com/massivecraft/factions/missions/MissionGUI.java @@ -96,11 +96,12 @@ public class MissionGUI implements FactionGUI { if (configurationSection == null) { return; } + ItemStack fillItem = XMaterial.matchXMaterial(configurationSection.getString("FillItem.Material")).parseItem(); + ItemMeta fillmeta = fillItem.getItemMeta(); + fillmeta.setDisplayName(""); + fillItem.setItemMeta(fillmeta); for (int fill = 0; fill < configurationSection.getInt("FillItem.Rows") * 9; ++fill) { - ItemStack fillItem = new ItemStack(XMaterial.matchXMaterial(configurationSection.getString("FillItem.Material")).parseItem()); - ItemMeta meta = fillItem.getItemMeta(); - meta.setDisplayName(""); - fillItem.setItemMeta(meta); + //Why were we generating a new itemstack per slot????? inventory.setItem(fill, fillItem); } for (String key : configurationSection.getKeys(false)) { diff --git a/src/main/java/com/massivecraft/factions/struct/Permission.java b/src/main/java/com/massivecraft/factions/struct/Permission.java index d76e141b..4877e60c 100755 --- a/src/main/java/com/massivecraft/factions/struct/Permission.java +++ b/src/main/java/com/massivecraft/factions/struct/Permission.java @@ -146,6 +146,7 @@ public enum Permission { COORD("coords"), SHOWCLAIMS("showclaims"), WARP("warp"), + WILD("wild"), CHEST("chest"); public final String node; 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 3969aebb..4a55fb91 100644 --- a/src/main/java/com/massivecraft/factions/zcore/fupgrades/FUpgradesGUI.java +++ b/src/main/java/com/massivecraft/factions/zcore/fupgrades/FUpgradesGUI.java @@ -651,13 +651,16 @@ public class FUpgradesGUI implements Listener { return fme.hasMoney(amt); } - private void takeMoney(FPlayer fme, int amt) { - fme.takeMoney(amt); + private boolean takeMoney(FPlayer fme, int amt) { + if (fme.takeMoney(amt)) { + return true; + } + return false; } private boolean upgradeItem(FPlayer fme, UpgradeType upgrade, int level, int cost) { if (hasMoney(fme, cost)) { - takeMoney(fme, cost); + if (!takeMoney(fme, cost)) {return false;} fme.getFaction().setUpgrade(upgrade, level); fme.getPlayer().closeInventory(); return true; diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java index 6b7e2b61..f509655a 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java @@ -1376,11 +1376,14 @@ public abstract class MemoryFPlayer implements FPlayer { } @Override - public void takeMoney(int amt) { + public boolean takeMoney(int amt) { if (hasMoney(amt)) { Economy econ = FactionsPlugin.getInstance().getEcon(); - econ.withdrawPlayer(getPlayer(), amt); - sendMessage(TL.GENERIC_MONEYTAKE.toString().replace("{amount}", commas(amt))); + if (econ.withdrawPlayer(getPlayer(), amt).transactionSuccess()) { + sendMessage(TL.GENERIC_MONEYTAKE.toString().replace("{amount}", commas(amt))); + return true; + } } + return false; } } \ No newline at end of file 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 0c9b135d..a76a600b 100644 --- a/src/main/java/com/massivecraft/factions/zcore/util/TL.java +++ b/src/main/java/com/massivecraft/factions/zcore/util/TL.java @@ -959,6 +959,13 @@ public enum TL { COMMAND_WARUNCLAIMALL_SUCCESS("You unclaimed ALL war zone land."), COMMAND_WARUNCLAIMALL_LOG("%1$s unclaimed all war zones."), + COMMAND_WILD_DESCRIPTION("Teleport to a random location"), + COMMAND_WILD_WAIT("&c&l[!] &7Teleporting in %1$s"), + COMMAND_WILD_SUCCESS("&c&l[!] &7Teleporting..."), + COMMAND_WILD_INTERUPTED("&c&l[!] &7Teleport cancelled!"), + COMMAND_WILD_FAILED("&c&l[!] &7Could not find a location to teleport you to!"), + COMMAND_WILD_INPROGRESS("&c&l[!] &7You are already teleporting somewhere!"), + COMMAND_RULES_DISABLED_MSG("&cThis command is disabled!"), COMMAND_RULES_DESCRIPTION("set/remove/add rules!"), COMMAND_RULES_ADD_INVALIDARGS("Please include a rule!"), diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index d5a0ede7..adf98a47 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1330,6 +1330,71 @@ Tntfill: enabled: true max-radius: 32 max-amount: 64 +Wild: + Enabled: true + # Time to wait in seconds # + Wait: 5 + # General GUI Settings # + GUI: + Name: 'Teleporter' + Size: 9 + # Should the GUI fill empty spaces? # + Fill: true + FillMaterial: BLACK_STAINED_GLASS_PANE + Zones: + # You may create your own zones here please just follow the original format # + Close: + Range: + MinX: -200 + MaxX: 200 + MinZ: -200 + MaxZ: 200 + Cost: 5000 + Material: IRON_INGOT + Lore: + - '&eTeleport to a random location close by' + - '&e X &b-200 &f- &b200 &eZ &b-200 &f- &b200' + - '&2&l&o$5000' + Name: '&cLow Range' + Slot: 1 + Medium: + Range: + MinX: -400 + MaxX: 400 + MinZ: -400 + MaxZ: 400 + Cost: 10000 + Material: GOLD_INGOT + Lore: + - '&eTeleport to a random location in a medium proximity' + - '&e X &b-400 &f- &b400 &eZ &b-400 &f- &b400' + - '&2&l&o$10000' + Name: '&cMedium Range' + Slot: 4 + Far: + Range: + MinX: -800 + MaxX: 800 + MinZ: -800 + MaxZ: 800 + Cost: 15000 + Material: DIAMOND + Lore: + - '&eTeleport to a random location far away' + - '&e X &b-800 &f- &b800 &eZ &b-800 &f- &b800' + - '&2&l&o$15000' + Name: '&cHigh Range' + Slot: 7 + # Settings that change how a player arrives to their random location # + Arrival: + # if FallDamage is false and the player is about to take fall damage while in the FallDamageWindow it will be denied # + FallDamage: false + # Window to revert fall damage in seconds # + FallDamageWindow: 2 + SpawnAbove: true + SpawnAboveBlocks: 10 + Effects: + - 'NIGHT_VISION' ############################################################ # +------------------------------------------------------+ #