diff --git a/build.gradle b/build.gradle index bb7a7aa53..b3eff2a0a 100644 --- a/build.gradle +++ b/build.gradle @@ -85,7 +85,6 @@ slimJar { dependencies { - // Slimjar implementation slimjar("1.2.6") @@ -110,8 +109,9 @@ dependencies { // Cross-Version Support implementation('com.github.cryptomorin:XSeries:8.4.0') - // Adventure + // Adventure and MiniMessage implementation("net.kyori:adventure-platform-bukkit:4.0.0-SNAPSHOT") + //implementation("net.kyori:adventure-text-minimessage:4.2.0-SNAPSHOT") // GUI Lib implementation("dev.triumphteam:triumph-gui:3.0.3") diff --git a/src/main/java/me/glaremasters/guilds/Guilds.java b/src/main/java/me/glaremasters/guilds/Guilds.java index 888f28557..2731682d5 100644 --- a/src/main/java/me/glaremasters/guilds/Guilds.java +++ b/src/main/java/me/glaremasters/guilds/Guilds.java @@ -39,6 +39,7 @@ import me.glaremasters.guilds.api.GuildsAPI; import me.glaremasters.guilds.arena.ArenaHandler; import me.glaremasters.guilds.challenges.ChallengeHandler; +import me.glaremasters.guilds.claim.ClaimUtils; import me.glaremasters.guilds.conf.GuildBuffSettings; import me.glaremasters.guilds.configuration.SettingsHandler; import me.glaremasters.guilds.configuration.sections.HooksSettings; @@ -291,6 +292,10 @@ public void onEnable() { chatListener = new ChatListener(this); + if (ClaimUtils.isEnable(settingsHandler.getMainConf())) { + ClaimUtils.reload(this, settingsHandler.getMainConf()); + } + LoggingUtils.info("Ready to go! That only took " + (System.currentTimeMillis() - startingTime) + "ms"); getServer().getScheduler().scheduleAsyncRepeatingTask(this, () -> { try { diff --git a/src/main/java/me/glaremasters/guilds/configuration/GuildConfigurationBuilder.java b/src/main/java/me/glaremasters/guilds/configuration/GuildConfigurationBuilder.java index cddb9f327..f603348a3 100644 --- a/src/main/java/me/glaremasters/guilds/configuration/GuildConfigurationBuilder.java +++ b/src/main/java/me/glaremasters/guilds/configuration/GuildConfigurationBuilder.java @@ -27,23 +27,7 @@ import ch.jalu.configme.configurationdata.ConfigurationData; import ch.jalu.configme.configurationdata.ConfigurationDataBuilder; import me.glaremasters.guilds.conf.GuildBuffSettings; -import me.glaremasters.guilds.configuration.sections.ClaimSettings; -import me.glaremasters.guilds.configuration.sections.CodeSettings; -import me.glaremasters.guilds.configuration.sections.CooldownSettings; -import me.glaremasters.guilds.configuration.sections.CostSettings; -import me.glaremasters.guilds.configuration.sections.GuildInfoMemberSettings; -import me.glaremasters.guilds.configuration.sections.GuildInfoSettings; -import me.glaremasters.guilds.configuration.sections.GuildListSettings; -import me.glaremasters.guilds.configuration.sections.GuildSettings; -import me.glaremasters.guilds.configuration.sections.GuildVaultSettings; -import me.glaremasters.guilds.configuration.sections.HooksSettings; -import me.glaremasters.guilds.configuration.sections.PluginSettings; -import me.glaremasters.guilds.configuration.sections.RoleSettings; -import me.glaremasters.guilds.configuration.sections.StorageSettings; -import me.glaremasters.guilds.configuration.sections.TicketSettings; -import me.glaremasters.guilds.configuration.sections.TierSettings; -import me.glaremasters.guilds.configuration.sections.VaultPickerSettings; -import me.glaremasters.guilds.configuration.sections.WarSettings; +import me.glaremasters.guilds.configuration.sections.*; /** * Created by GlareMasters @@ -57,7 +41,7 @@ private GuildConfigurationBuilder() { public static ConfigurationData buildConfigurationData() { return ConfigurationDataBuilder.createConfiguration( - PluginSettings.class, StorageSettings.class, HooksSettings.class, GuildListSettings.class, + PluginSettings.class, StorageSettings.class, HooksSettings.class, GuildListSettings.class, GuildMapSettings.class, VaultPickerSettings.class, GuildVaultSettings.class, GuildInfoSettings.class, GuildInfoMemberSettings.class, GuildSettings.class, WarSettings.class, CooldownSettings.class, CostSettings.class, diff --git a/src/main/java/me/glaremasters/guilds/configuration/sections/ClaimSettings.java b/src/main/java/me/glaremasters/guilds/configuration/sections/ClaimSettings.java index 886b9546d..eb8bc8200 100644 --- a/src/main/java/me/glaremasters/guilds/configuration/sections/ClaimSettings.java +++ b/src/main/java/me/glaremasters/guilds/configuration/sections/ClaimSettings.java @@ -41,14 +41,6 @@ */ public class ClaimSettings implements SettingsHolder { - @Comment({"This is the number of blocks around the player it will try to create the region.", - "Keep in mind this is the RADIUS, it will go this many blocks in both directions.", - "For example, if you take the default 15, it'll do 30 total as it will go 15 blocks in both directions.", - "This is a CUBOID region, not SPHERE." - }) - public static final Property RADIUS = - newProperty("claims.radius", 15); - @Comment({"Customize the entrance and exit message of joining claims.", "Supports {prefix} for guild prefix and {guild} for guild name.", "Also supports color codes!" @@ -77,6 +69,14 @@ public class ClaimSettings implements SettingsHolder { public static final Property FORCE_CLAIM_SIGNS = newProperty("claims.force-claim-signs", false); + @Comment({"Would you like to require claims to be made next to other claimed land?"}) + public static final Property CLAIM_ADJACENT = + newProperty("claims.claim-adjacent", true); + + @Comment({"How far would you like claims from different guilds to be apart? e.g as a buffer."}) + public static final Property CLAIM_PROXIMITY = + newProperty("claims.claim-proximity", 5); + private ClaimSettings() { } diff --git a/src/main/java/me/glaremasters/guilds/configuration/sections/GuildMapSettings.java b/src/main/java/me/glaremasters/guilds/configuration/sections/GuildMapSettings.java new file mode 100644 index 000000000..a7c22e440 --- /dev/null +++ b/src/main/java/me/glaremasters/guilds/configuration/sections/GuildMapSettings.java @@ -0,0 +1,92 @@ +/* + * MIT License + * + * Copyright (c) 2019 Glare + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.glaremasters.guilds.configuration.sections; + +import ch.jalu.configme.Comment; +import ch.jalu.configme.SettingsHolder; +import ch.jalu.configme.configurationdata.CommentsConfiguration; +import ch.jalu.configme.properties.Property; + +import java.util.List; + +import static ch.jalu.configme.properties.PropertyInitializer.newListProperty; +import static ch.jalu.configme.properties.PropertyInitializer.newProperty; + +/** + * Created by Glare + * Date: 4/13/2019 + * Time: 8:24 PM + */ +public class GuildMapSettings implements SettingsHolder { + + private static final String LIST_PATH = "guis.guild-map."; + + @Comment("What should the name of the inventory be?") + public static final Property GUILD_MAP_NAME = + newProperty(LIST_PATH + "gui-name", "Area Map"); + + @Comment({"What should the name of the all the items be in the inventory?", + "Currently supports {player} and {guild}."}) + public static final Property GUILD_MAP_ITEM_NAME = + newProperty(LIST_PATH + "guilds-on-map-name", "&f{player}'s Guild"); + + @Comment({"What should the name of the all the items be in the inventory?", + "Currently supports {player} and {guild}."}) + public static final Property GUILD_MAP_CENTER_NAME = + newProperty(LIST_PATH + "center-item-name", "You"); + + @Comment("What should be the default texture url for textures that fail to load in? Refer to the Guild Manage settings to see how to change the texture!") + public static final Property GUILD_MAP_HEAD_DEFAULT_URL = + newProperty(LIST_PATH + "head-default-url", "7a2df315b43583b1896231b77bae1a507dbd7e43ad86c1cfbe3b2b8ef3430e9e"); + + @Comment("What should be the texture url for the point representing the person upon the map?") + public static final Property GUILD_MAP_CENTER_HEAD_DEFAULT_URL = + newProperty(LIST_PATH + "head-center-url", "7a2df315b43583b1896231b77bae1a507dbd7e43ad86c1cfbe3b2b8ef3430e9e"); + + @Comment("Do we want to try to use skull textures or just ignore them and use the one provided?") + public static final Property USE_DEFAULT_TEXTURE = + newProperty(LIST_PATH + "use-default-texture", false); + + @Comment({"You are free to design this to your liking", "This is just an example of all the available placeholders that you can use for the lore!", + "Note: With v3.6.7 and on, you can now use {guild-tier-name} for the name of the tier.", + "Also, from v3.6.7 and on, {guild-status} will now apply from what you set for the guild-info GUI for the status being public or private.", + "In version 3.5.2.2, {guild-challenge-wins} and {guild-challenge-loses} have been added.", + "In version 3.5.3.3, {creation} was added to display the creation date of the guild"}) + public static final Property> GUILD_MAP_ITEM_LORE = + newListProperty(LIST_PATH + "head-lore", "&cName&8: &a{guild-name}", "&cPrefix&8: &a{guild-prefix}", "&cMaster&8: &a{guild-master}", "&cStatus&8: &a{guild-status}", "&cTier&8: &a{guild-tier}", "&cBalance&8: &a{guild-balance}", "&cMember Count&8: &a{guild-member-count}", "&cCreation Date&8: &a{creation}"); + + + private GuildMapSettings() { + } + + @Override + public void registerComments(CommentsConfiguration conf) { + String[] pluginHeader = { + "Use the following website to get available materials: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html", + "This can work across all MC versions and will attempt to use the proper material based on what version of MC you are using." + }; + conf.setComment("guis", pluginHeader); + } +} diff --git a/src/main/java/me/glaremasters/guilds/configuration/sections/TierSettings.java b/src/main/java/me/glaremasters/guilds/configuration/sections/TierSettings.java index eddee5b8e..38c4c0e3f 100644 --- a/src/main/java/me/glaremasters/guilds/configuration/sections/TierSettings.java +++ b/src/main/java/me/glaremasters/guilds/configuration/sections/TierSettings.java @@ -90,6 +90,10 @@ public class TierSettings implements SettingsHolder { public static final Property ONE_BUFFS = newProperty(LIST_PATH + "1.use-buffs", true); + @Comment("How many claims would you like this tier to be able to use?") + public static final Property ONE_CLAIMABLE = + newProperty(LIST_PATH + "1.claimable-land", 1); + @Comment("If you wish to give this tier extra permissions, put them here.") public static final Property> ONE_PERMS = newListProperty(LIST_PATH + "1.permissions", "example.perm.here"); @@ -137,6 +141,10 @@ public class TierSettings implements SettingsHolder { public static final Property TWO_BUFFS = newProperty(LIST_PATH + "2.use-buffs", true); + @Comment("How many claims would you like this tier to be able to use?") + public static final Property TWO_CLAIMABLE = + newProperty(LIST_PATH + "2.claimable-land", 5); + @Comment("If you wish to give this tier extra permissions, put them here.") public static final Property> TWO_PERMS = newListProperty(LIST_PATH + "2.permissions", "example.perm.here"); @@ -184,6 +192,10 @@ public class TierSettings implements SettingsHolder { public static final Property THREE_BUFFS = newProperty(LIST_PATH + "3.use-buffs", true); + @Comment("How many claims would you like this tier to be able to use?") + public static final Property THREE_CLAIMABLE = + newProperty(LIST_PATH + "3.claimable-land", 10); + @Comment("If you wish to give this tier extra permissions, put them here.") public static final Property> THREE_PERMS = newListProperty(LIST_PATH + "3.permissions", "example.perm.here"); diff --git a/src/main/java/me/glaremasters/guilds/guild/Guild.java b/src/main/java/me/glaremasters/guilds/guild/Guild.java index 55660ab86..d96e1d4d1 100644 --- a/src/main/java/me/glaremasters/guilds/guild/Guild.java +++ b/src/main/java/me/glaremasters/guilds/guild/Guild.java @@ -28,6 +28,7 @@ import co.aikar.commands.ACFUtil; import co.aikar.commands.CommandManager; import me.glaremasters.guilds.Guilds; +import me.glaremasters.guilds.claim.GuildClaim; import me.glaremasters.guilds.configuration.sections.GuildListSettings; import me.glaremasters.guilds.exceptions.ExpectationNotMet; import me.glaremasters.guilds.messages.Messages; @@ -51,7 +52,7 @@ public Guild(UUID id) { this.id = id; } - public Guild(UUID id, String name, String prefix, String motd, GuildMember guildMaster, GuildHome home, GuildSkull guildSkull, Status status, GuildTier tier, GuildScore guildScore, double balance, List members, List invitedMembers, List allies, List pendingAllies, List codes, List vaults, long lastDefended) { + public Guild(UUID id, String name, String prefix, String motd, GuildMember guildMaster, GuildHome home, GuildSkull guildSkull, Status status, GuildTier tier, GuildScore guildScore, double balance, List members, List invitedMembers, List allies, List pendingAllies, List codes, List vaults, long lastDefended, List claimedLand) { this.id = id; this.name = name; this.prefix = prefix; @@ -70,6 +71,7 @@ public Guild(UUID id, String name, String prefix, String motd, GuildMember guild this.codes = codes; this.vaults = vaults; this.lastDefended = lastDefended; + this.claimedLand = claimedLand; } public static GuildBuilder builder() { @@ -132,9 +134,7 @@ public void setPendingAllies(List pendingAllies) { this.pendingAllies = pendingAllies; } - public void setCodes(List codes) { - this.codes = codes; - } + public void setCodes(List codes) {this.codes = codes;} public void setVaults(List vaults) { this.vaults = vaults; @@ -148,9 +148,9 @@ public long getCreationDate() { return creationDate; } - public void setCreationDate(long creationDate) { - this.creationDate = creationDate; - } + public void setCreationDate(long creationDate) {this.creationDate = creationDate; } + + public void setClaimedLand(List newClaimedLand) { this.claimedLand = newClaimedLand; } public enum Status { Public("Public"), @@ -184,6 +184,7 @@ public enum Status { private long lastDefended; private long creationDate; + private List claimedLand; /** * Get a member in the guild * @param uuid the uuid of the member @@ -566,6 +567,29 @@ public boolean memberHasPermission(Player player, GuildRolePerm perm) { return role.hasPerm(perm); } + /** + * Add a guild claim to the list of claims + * @param claim the claim to add + */ + public void addGuildClaim(GuildClaim claim) { + claimedLand.add(claim); + } + + /** + * Remove a guild claim from the list of claims + * @param claim the claim to remove + */ + public void removeGuildClaim(GuildClaim claim) { + claimedLand.remove(claim); + } + + /** + * Clear all the guild claims in list + */ + public void clearGuildClaims() { + claimedLand.clear(); + } + public void updateGuildSkull(Player player, SettingsManager settingsManager) { Guilds.newChain().async(() -> { try{ @@ -673,6 +697,13 @@ public long getLastDefended() { return lastDefended; } + public List getClaimedLand() { + if (this.claimedLand == null) { + this.claimedLand = new ArrayList<>(); + } + return this.claimedLand; + } + public static class GuildBuilder { private UUID id; private String name; @@ -692,6 +723,7 @@ public static class GuildBuilder { private List codes; private List vaults; private long lastDefended; + private List claimedLand; GuildBuilder() { } @@ -786,12 +818,17 @@ public Guild.GuildBuilder lastDefended(long lastDefended) { return this; } + public Guild.GuildBuilder claimedLand(List claimedLand) { + this.claimedLand = claimedLand; + return this; + } + public Guild build() { - return new Guild(id, name, prefix, motd, guildMaster, home, guildSkull, status, tier, guildScore, balance, members, invitedMembers, allies, pendingAllies, codes, vaults, lastDefended); + return new Guild(id, name, prefix, motd, guildMaster, home, guildSkull, status, tier, guildScore, balance, members, invitedMembers, allies, pendingAllies, codes, vaults, lastDefended, claimedLand); } public String toString() { - return "Guild.GuildBuilder(id=" + this.id + ", name=" + this.name + ", prefix=" + this.prefix + ", motd=" + this.motd + ", guildMaster=" + this.guildMaster + ", home=" + this.home + ", guildSkull=" + this.guildSkull + ", status=" + this.status + ", tier=" + this.tier + ", guildScore=" + this.guildScore + ", balance=" + this.balance + ", members=" + this.members + ", invitedMembers=" + this.invitedMembers + ", allies=" + this.allies + ", pendingAllies=" + this.pendingAllies + ", codes=" + this.codes + ", vaults=" + this.vaults + ", lastDefended=" + this.lastDefended + ")"; + return "Guild.GuildBuilder(id=" + this.id + ", name=" + this.name + ", prefix=" + this.prefix + ", motd=" + this.motd + ", guildMaster=" + this.guildMaster + ", home=" + this.home + ", guildSkull=" + this.guildSkull + ", status=" + this.status + ", tier=" + this.tier + ", guildScore=" + this.guildScore + ", balance=" + this.balance + ", members=" + this.members + ", invitedMembers=" + this.invitedMembers + ", allies=" + this.allies + ", pendingAllies=" + this.pendingAllies + ", codes=" + this.codes + ", vaults=" + this.vaults + ", lastDefended=" + this.lastDefended + ", claimedLand=" + this.claimedLand.toString() + ")"; } } } diff --git a/src/main/java/me/glaremasters/guilds/guild/GuildHandler.java b/src/main/java/me/glaremasters/guilds/guild/GuildHandler.java index 60b7ea9b7..e7945441f 100644 --- a/src/main/java/me/glaremasters/guilds/guild/GuildHandler.java +++ b/src/main/java/me/glaremasters/guilds/guild/GuildHandler.java @@ -27,16 +27,17 @@ import ch.jalu.configme.SettingsManager; import co.aikar.commands.ACFBukkitUtil; import co.aikar.commands.ACFUtil; -import co.aikar.commands.CommandManager; import co.aikar.commands.PaperCommandManager; import me.glaremasters.guilds.Guilds; +import me.glaremasters.guilds.claim.ClaimEditor; +import me.glaremasters.guilds.claim.GuildClaim; import me.glaremasters.guilds.configuration.sections.GuildSettings; import me.glaremasters.guilds.configuration.sections.GuildVaultSettings; import me.glaremasters.guilds.configuration.sections.PluginSettings; import me.glaremasters.guilds.configuration.sections.TicketSettings; import me.glaremasters.guilds.exceptions.ExpectationNotMet; import me.glaremasters.guilds.messages.Messages; -import me.glaremasters.guilds.utils.ClaimUtils; +import me.glaremasters.guilds.claim.ClaimUtils; import me.glaremasters.guilds.utils.ItemBuilder; import me.glaremasters.guilds.utils.LoggingUtils; import me.glaremasters.guilds.utils.Serialization; @@ -57,12 +58,7 @@ import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -175,6 +171,7 @@ private void loadTiers() { .membersToRankup(tierSec.getInt(key + ".members-to-rankup", 5)) .maxAllies(tierSec.getInt(key + ".max-allies", 10)) .useBuffs(tierSec.getBoolean(key + ".use-buffs", true)) + .claimableLand(tierSec.getInt(key + ".claimable-land", 5)) .permissions(tierSec.getStringList(key + ".permissions")) .build()); } @@ -874,7 +871,9 @@ public void handleInvite(PaperCommandManager manager, Player player, Guild guild if (ClaimUtils.isEnable(settingsManager)) { WorldGuardWrapper wrapper = WorldGuardWrapper.getInstance(); - ClaimUtils.getGuildClaim(wrapper, player, guild).ifPresent(region -> ClaimUtils.addMember(region, player)); + for (GuildClaim claim : guild.getClaimedLand()) { + ClaimEditor.addMember(wrapper, claim, player); + } } manager.getCommandIssuer(player).sendInfo(Messages.CODES__JOINED, "{guild}", guild.getName()); diff --git a/src/main/java/me/glaremasters/guilds/guild/GuildTier.java b/src/main/java/me/glaremasters/guilds/guild/GuildTier.java index 3595e1dcc..09e0c4d53 100644 --- a/src/main/java/me/glaremasters/guilds/guild/GuildTier.java +++ b/src/main/java/me/glaremasters/guilds/guild/GuildTier.java @@ -40,8 +40,9 @@ public class GuildTier { private final transient int maxAllies; private final transient boolean useBuffs; private final transient List permissions; + private final transient int claimableLand; - public GuildTier(int level, String name, double cost, int maxMembers, int vaultAmount, double mobXpMultiplier, double damageMultiplier, double maxBankBalance, int membersToRankup, int maxAllies, boolean useBuffs, List permissions) { + public GuildTier(int level, String name, double cost, int maxMembers, int vaultAmount, double mobXpMultiplier, double damageMultiplier, double maxBankBalance, int membersToRankup, int maxAllies, boolean useBuffs, List permissions, int claimableLand) { this.level = level; this.name = name; this.cost = cost; @@ -54,6 +55,7 @@ public GuildTier(int level, String name, double cost, int maxMembers, int vaultA this.maxAllies = maxAllies; this.useBuffs = useBuffs; this.permissions = permissions; + this.claimableLand = claimableLand; } public static GuildTierBuilder builder() { @@ -108,6 +110,8 @@ public List getPermissions() { return this.permissions; } + public int getClaimableLand() { return this.claimableLand; } + public String toString() { return "GuildTier(level=" + this.getLevel() + ", name=" + this.getName() + ", cost=" + this.getCost() + ", maxMembers=" + this.getMaxMembers() + ", vaultAmount=" + this.getVaultAmount() + ", mobXpMultiplier=" + this.getMobXpMultiplier() + ", damageMultiplier=" + this.getDamageMultiplier() + ", maxBankBalance=" + this.getMaxBankBalance() + ", membersToRankup=" + this.getMembersToRankup() + ", useBuffs=" + this.isUseBuffs() + ", permissions=" + this.getPermissions() + ")"; } @@ -125,6 +129,7 @@ public static class GuildTierBuilder { private int maxAllies; private boolean useBuffs; private List permissions; + private int claimableLand; GuildTierBuilder() { } @@ -189,12 +194,17 @@ public GuildTier.GuildTierBuilder permissions(List permissions) { return this; } + public GuildTier.GuildTierBuilder claimableLand(int claimable) { + this.claimableLand = claimable; + return this; + } + public GuildTier build() { - return new GuildTier(level, name, cost, maxMembers, vaultAmount, mobXpMultiplier, damageMultiplier, maxBankBalance, membersToRankup, maxAllies, useBuffs, permissions); + return new GuildTier(level, name, cost, maxMembers, vaultAmount, mobXpMultiplier, damageMultiplier, maxBankBalance, membersToRankup, maxAllies, useBuffs, permissions, claimableLand); } public String toString() { - return "GuildTier.GuildTierBuilder(level=" + this.level + ", name=" + this.name + ", cost=" + this.cost + ", maxMembers=" + this.maxMembers + ", vaultAmount=" + this.vaultAmount + ", mobXpMultiplier=" + this.mobXpMultiplier + ", damageMultiplier=" + this.damageMultiplier + ", maxBankBalance=" + this.maxBankBalance + ", membersToRankup=" + this.membersToRankup + ", useBuffs=" + this.useBuffs + ", permissions=" + this.permissions + ")"; + return "GuildTier.GuildTierBuilder(level=" + this.level + ", name=" + this.name + ", cost=" + this.cost + ", maxMembers=" + this.maxMembers + ", vaultAmount=" + this.vaultAmount + ", mobXpMultiplier=" + this.mobXpMultiplier + ", damageMultiplier=" + this.damageMultiplier + ", maxBankBalance=" + this.maxBankBalance + ", membersToRankup=" + this.membersToRankup + ", useBuffs=" + this.useBuffs + ", permissions=" + this.permissions + ", claimableLand=" + this.claimableLand + ")"; } } } diff --git a/src/main/java/me/glaremasters/guilds/listeners/ClaimSignListener.java b/src/main/java/me/glaremasters/guilds/listeners/ClaimSignListener.java index 367f0d9f6..50aea10e8 100644 --- a/src/main/java/me/glaremasters/guilds/listeners/ClaimSignListener.java +++ b/src/main/java/me/glaremasters/guilds/listeners/ClaimSignListener.java @@ -26,21 +26,28 @@ import ch.jalu.configme.SettingsManager; import me.glaremasters.guilds.Guilds; +import me.glaremasters.guilds.api.events.GuildClaimEvent; +import me.glaremasters.guilds.claim.ClaimEditor; +import me.glaremasters.guilds.claim.ClaimRegionHandler; +import me.glaremasters.guilds.claim.GuildClaim; import me.glaremasters.guilds.configuration.sections.ClaimSettings; import me.glaremasters.guilds.guild.Guild; import me.glaremasters.guilds.guild.GuildHandler; import me.glaremasters.guilds.guild.GuildRolePerm; import me.glaremasters.guilds.messages.Messages; -import me.glaremasters.guilds.utils.ClaimUtils; +import me.glaremasters.guilds.claim.ClaimUtils; +import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.codemc.worldguardwrapper.WorldGuardWrapper; +import org.codemc.worldguardwrapper.region.IWrappedRegion; import org.codemc.worldguardwrapper.selection.ICuboidSelection; /** @@ -61,6 +68,8 @@ public ClaimSignListener(Guilds guilds, SettingsManager settingsManager, GuildHa this.guildHandler = guildHandler; } + //TODO Fix all of this because Claim Signs... + @EventHandler public void onSignChange(SignChangeEvent event) { Player player = event.getPlayer(); @@ -68,14 +77,14 @@ public void onSignChange(SignChangeEvent event) { if (!event.getLine(0).equalsIgnoreCase(settingsManager.getProperty(ClaimSettings.CLAIM_SIGN_TEXT))) return; - if (!player.hasPermission("guilds.claimsigns.place") && !player.hasPermission("worldguard.region.redefine.*")) { - guilds.getCommandManager().getCommandIssuer(player).sendInfo(Messages.CLAIM__SIGN_NO_PERMISSION); + if (!settingsManager.getProperty(ClaimSettings.CLAIM_SIGNS)) { + guilds.getCommandManager().getCommandIssuer(player).sendInfo(Messages.CLAIM__SIGN_NOT_ENABLED); event.setCancelled(true); return; } - if (!settingsManager.getProperty(ClaimSettings.CLAIM_SIGNS)) { - guilds.getCommandManager().getCommandIssuer(player).sendInfo(Messages.CLAIM__SIGN_NOT_ENABLED); + if (!player.hasPermission("guilds.claimsigns.place") && !player.hasPermission("worldguard.region.redefine.*")) { + guilds.getCommandManager().getCommandIssuer(player).sendInfo(Messages.CLAIM__SIGN_NO_PERMISSION); event.setCancelled(true); return; } @@ -86,11 +95,13 @@ public void onSignChange(SignChangeEvent event) { return; } - if (!ClaimUtils.checkAlreadyExist(wrapper, player, event.getLine(1))) { + + if (!ClaimUtils.checkOverlap(wrapper, player)) { guilds.getCommandManager().getCommandIssuer(player).sendInfo(Messages.CLAIM__SIGN_INVALID_REGION); event.setCancelled(true); return; } + guilds.getCommandManager().getCommandIssuer(player).sendInfo(Messages.CLAIM__SIGN_PLACED, "{region}", event.getLine(1), "{price}", event.getLine(2)); } @@ -132,32 +143,40 @@ public void onSignInteract(PlayerInteractEvent event) { return; } - if (ClaimUtils.checkAlreadyExist(wrapper, guild)) { + if (ClaimUtils.checkMaxAlreadyExist(wrapper, guild)) { guilds.getCommandManager().getCommandIssuer(player).sendInfo(Messages.CLAIM__ALREADY_EXISTS); return; } - if (guild.getBalance() < Double.valueOf(sign.getLine(2))) { + if (guild.getBalance() < Double.parseDouble(sign.getLine(2))) { guilds.getCommandManager().getCommandIssuer(player).sendInfo(Messages.CLAIM__SIGN_NOT_ENOUGH); return; } - ClaimUtils.getClaim(wrapper, player, sign.getLine(1)).ifPresent(region -> { - ICuboidSelection selection = ClaimUtils.getSelection(wrapper, player, region.getId()); - wrapper.removeRegion(player.getWorld(), region.getId()); - ClaimUtils.createClaim(wrapper, guild, selection); - }); + IWrappedRegion region = ClaimUtils.getRegionFromName(wrapper, sign.getLine(1)); - ClaimUtils.getGuildClaim(wrapper, player, guild).ifPresent(region -> { - ClaimUtils.addOwner(region, guild); - ClaimUtils.addMembers(region, guild); - ClaimUtils.setEnterMessage(wrapper, region, settingsManager, guild); - ClaimUtils.setExitMessage(wrapper, region, settingsManager, guild); - }); + if (region == null) { + guilds.getCommandManager().getCommandIssuer(player).sendInfo(Messages.CLAIM__SIGN_INVALID_REGION); + return; + } + + ICuboidSelection selection = ClaimUtils.getSelection(wrapper, player, region.getId()); + wrapper.removeRegion(player.getWorld(), region.getId()); + + GuildClaim claim = ClaimRegionHandler.createClaim(wrapper, guild, selection); + guild.addGuildClaim(claim); + + ClaimEditor.addOwner(wrapper, claim, guild); + ClaimEditor.addMembers(wrapper, claim, guild); + ClaimEditor.setEnterMessage(wrapper, claim, settingsManager, guild); + ClaimEditor.setExitMessage(wrapper, claim, settingsManager, guild); player.getWorld().getBlockAt(block.getLocation()).breakNaturally(); - guild.setBalance(guild.getBalance() - Double.valueOf(sign.getLine(2))); + guild.setBalance(guild.getBalance() - Double.parseDouble(sign.getLine(2))); + + Event firedEvent = new GuildClaimEvent(player, guild, claim); + Bukkit.getPluginManager().callEvent(firedEvent); guilds.getCommandManager().getCommandIssuer(player).sendInfo(Messages.CLAIM__SIGN_BUY_SUCCESS); } diff --git a/src/main/java/me/glaremasters/guilds/listeners/EntityListener.java b/src/main/java/me/glaremasters/guilds/listeners/EntityListener.java index cbc199b3f..824add307 100644 --- a/src/main/java/me/glaremasters/guilds/listeners/EntityListener.java +++ b/src/main/java/me/glaremasters/guilds/listeners/EntityListener.java @@ -30,7 +30,6 @@ import me.glaremasters.guilds.guild.Guild; import me.glaremasters.guilds.guild.GuildChallenge; import me.glaremasters.guilds.guild.GuildHandler; -import me.glaremasters.guilds.utils.ClaimUtils; import org.bukkit.entity.Arrow; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Monster; diff --git a/src/main/java/me/glaremasters/guilds/utils/StringUtils.java b/src/main/java/me/glaremasters/guilds/utils/StringUtils.java index f62c8b3be..b17d4f87c 100644 --- a/src/main/java/me/glaremasters/guilds/utils/StringUtils.java +++ b/src/main/java/me/glaremasters/guilds/utils/StringUtils.java @@ -24,6 +24,8 @@ package me.glaremasters.guilds.utils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.ChatColor; import org.bukkit.plugin.java.JavaPlugin; @@ -45,6 +47,10 @@ public static String color(String input) { return ChatColor.translateAlternateColorCodes('&', input); } + public static Component converter(String input) { + return LegacyComponentSerializer.legacySection().deserialize(input); + } + /** * Get the announcements for the plugin * @return announcements @@ -84,7 +90,7 @@ public static String convert_html(String html) { * here, where in the other one, it grows it. */ - StringBuffer newstr = new StringBuffer(html.length()); + StringBuilder newstr = new StringBuilder(html.length()); boolean saw_backslash = false; diff --git a/src/main/kotlin/me/glaremasters/guilds/acf/ACFHandler.kt b/src/main/kotlin/me/glaremasters/guilds/acf/ACFHandler.kt index a37244826..f87a78064 100644 --- a/src/main/kotlin/me/glaremasters/guilds/acf/ACFHandler.kt +++ b/src/main/kotlin/me/glaremasters/guilds/acf/ACFHandler.kt @@ -146,6 +146,12 @@ class ACFHandler(private val plugin: Guilds, private val commandManager: PaperCo val guild = guildHandler.getGuild(c.player) ?: return@registerAsyncCompletion emptyList() guild.members.mapNotNull { guildHandler.lookupCache[it.uuid] ?: it.name } } + + commandManager.commandCompletions.registerCompletion("claimed") { c -> + val guild = guildHandler.getGuild(c.player) ?: return@registerCompletion emptyList() + return@registerCompletion mutableListOf("this", "all") + } + commandManager.commandCompletions.registerCompletion("members-admin") { c -> val guild = c.getContextValue(Guild::class.java, 1) ?: return@registerCompletion emptyList() guild.members.mapNotNull { guildHandler.lookupCache[it.uuid] ?: it.name } diff --git a/src/main/kotlin/me/glaremasters/guilds/api/events/GuildClaimEvent.kt b/src/main/kotlin/me/glaremasters/guilds/api/events/GuildClaimEvent.kt new file mode 100644 index 000000000..8736ae64f --- /dev/null +++ b/src/main/kotlin/me/glaremasters/guilds/api/events/GuildClaimEvent.kt @@ -0,0 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2019 Glare + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package me.glaremasters.guilds.api.events + +import me.glaremasters.guilds.api.events.base.GuildEvent +import me.glaremasters.guilds.claim.GuildClaim +import me.glaremasters.guilds.guild.Guild +import org.bukkit.entity.Player + +class GuildClaimEvent(player: Player, guild: Guild, var claim: GuildClaim) : GuildEvent(player, guild) diff --git a/src/main/kotlin/me/glaremasters/guilds/api/events/GuildUnclaimAllEvent.kt b/src/main/kotlin/me/glaremasters/guilds/api/events/GuildUnclaimAllEvent.kt new file mode 100644 index 000000000..6587b60c2 --- /dev/null +++ b/src/main/kotlin/me/glaremasters/guilds/api/events/GuildUnclaimAllEvent.kt @@ -0,0 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2019 Glare + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package me.glaremasters.guilds.api.events + +import me.glaremasters.guilds.api.events.base.GuildEvent +import me.glaremasters.guilds.claim.GuildClaim +import me.glaremasters.guilds.guild.Guild +import org.bukkit.entity.Player + +class GuildUnclaimAllEvent(player: Player, guild: Guild) : GuildEvent(player, guild) diff --git a/src/main/kotlin/me/glaremasters/guilds/api/events/GuildUnclaimEvent.kt b/src/main/kotlin/me/glaremasters/guilds/api/events/GuildUnclaimEvent.kt new file mode 100644 index 000000000..9e03ff45a --- /dev/null +++ b/src/main/kotlin/me/glaremasters/guilds/api/events/GuildUnclaimEvent.kt @@ -0,0 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2019 Glare + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package me.glaremasters.guilds.api.events + +import me.glaremasters.guilds.api.events.base.GuildEvent +import me.glaremasters.guilds.claim.GuildClaim +import me.glaremasters.guilds.guild.Guild +import org.bukkit.entity.Player + +class GuildUnclaimEvent(player: Player, guild: Guild, var claim: GuildClaim) : GuildEvent(player, guild) diff --git a/src/main/kotlin/me/glaremasters/guilds/claim/ClaimEditor.kt b/src/main/kotlin/me/glaremasters/guilds/claim/ClaimEditor.kt new file mode 100644 index 000000000..f17bbce66 --- /dev/null +++ b/src/main/kotlin/me/glaremasters/guilds/claim/ClaimEditor.kt @@ -0,0 +1,197 @@ +/* + * MIT License + * + * Copyright (c) 2019 Glare + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package me.glaremasters.guilds.claim + +import ch.jalu.configme.SettingsManager +import me.glaremasters.guilds.configuration.sections.ClaimSettings +import me.glaremasters.guilds.guild.Guild +import me.glaremasters.guilds.utils.StringUtils +import org.bukkit.OfflinePlayer +import org.bukkit.entity.Player +import org.codemc.worldguardwrapper.WorldGuardWrapper +import org.codemc.worldguardwrapper.flag.WrappedState +import org.codemc.worldguardwrapper.region.IWrappedDomain +import java.util.* + +object ClaimEditor { + + // Owner handlers + @JvmStatic + fun addOwner(wrapper: WorldGuardWrapper, claim: GuildClaim, guild: Guild) { + val region = claim.getRegion(wrapper) + region.owners.addPlayer(guild.guildMaster.uuid) + } + + @JvmStatic + fun addOwner(wrapper: WorldGuardWrapper, claim: GuildClaim, player: Player) { + val region = claim.getRegion(wrapper) + region.owners.addPlayer(player.uniqueId) + } + + @JvmStatic + fun addOwner(wrapper: WorldGuardWrapper, claim: GuildClaim, uuid: UUID) { + val region = claim.getRegion(wrapper) + region.owners.addPlayer(uuid) + } + + @JvmStatic + fun removeOwner(wrapper: WorldGuardWrapper, claim: GuildClaim, player: Player) { + val region = claim.getRegion(wrapper) + region.owners.removePlayer(player.uniqueId) + } + + @JvmStatic + fun removeOwner(wrapper: WorldGuardWrapper, claim: GuildClaim, uuid: UUID) { + val region = claim.getRegion(wrapper) + region.owners.removePlayer(uuid) + } + + + @JvmStatic + fun transferOwner(wrapper: WorldGuardWrapper, claim: GuildClaim, playerGive: Player, playerTake: Player) { + removeOwner(wrapper, claim, playerTake) + addOwner(wrapper, claim, playerGive) + } + + @JvmStatic + fun transferOwner(wrapper: WorldGuardWrapper, claim: GuildClaim, playerGive: UUID, playerTake: UUID) { + removeOwner(wrapper, claim, playerTake) + addOwner(wrapper, claim, playerGive) + } + + + + + + + + + + + // Member handling + @JvmStatic + fun getMembers(wrapper: WorldGuardWrapper, claim: GuildClaim): IWrappedDomain { + return claim.getRegion(wrapper).members + } + + @JvmStatic + fun addMembers(wrapper: WorldGuardWrapper, claim: GuildClaim, guild: Guild) { + guild.members.forEach { + getMembers(wrapper, claim).addPlayer(it.uuid) + } + } + + @JvmStatic + fun addMember(wrapper: WorldGuardWrapper, claim: GuildClaim, player: Player) { + getMembers(wrapper, claim).addPlayer(player.uniqueId) + } + + @JvmStatic + fun addMember(wrapper: WorldGuardWrapper, claim: GuildClaim, uuid: UUID) { + getMembers(wrapper, claim).addPlayer(uuid) + } + + @JvmStatic + fun removeMember(wrapper: WorldGuardWrapper, claim: GuildClaim, player: OfflinePlayer) { + getMembers(wrapper, claim).removePlayer(player.uniqueId) + } + + @JvmStatic + fun removeMember(wrapper: WorldGuardWrapper, claim: GuildClaim, uuid: UUID) { + getMembers(wrapper, claim).removePlayer(uuid) + } + + @JvmStatic + fun kickMember(wrapper: WorldGuardWrapper, claim: GuildClaim, playerKicked: OfflinePlayer) { + removeMember(wrapper, claim, playerKicked) + } + + @JvmStatic + fun kickMember(wrapper: WorldGuardWrapper, claim: GuildClaim, uuid: UUID) { + removeMember(wrapper, claim, uuid) + } + + + + + + + + + + + // Decoration Handler + @JvmStatic + fun setEnterMessage(wrapper: WorldGuardWrapper, claim: GuildClaim, settingsManager: SettingsManager, guild: Guild) { + val region = claim.getRegion(wrapper) + region.setFlag(wrapper.getFlag("greeting", String::class.java).orElse(null), + StringUtils.color( + settingsManager.getProperty(ClaimSettings.ENTER_MESSAGE).replace("{guild}", guild.name) + .replace("{prefix}", guild.prefix) + ) + ) + } + + @JvmStatic + fun setExitMessage(wrapper: WorldGuardWrapper, claim: GuildClaim, settingsManager: SettingsManager, guild: Guild) { + val region = claim.getRegion(wrapper) + region.setFlag(wrapper.getFlag("farewell", String::class.java).orElse(null), + StringUtils.color( + settingsManager.getProperty(ClaimSettings.EXIT_MESSAGE).replace("{guild}", guild.name) + .replace("{prefix}", guild.prefix) + ) + ) + } + + + + + + + + + + + // Misc + @JvmStatic + fun checkPvpDisabled(player: Player): Boolean { + val wrapper = WorldGuardWrapper.getInstance() + val flag = wrapper.getFlag("pvp", WrappedState::class.java) + var state = WrappedState.ALLOW + + if (!flag.isPresent) { + return false + } + + val check = flag.map { f -> wrapper.queryFlag(player, player.location, f) } + check.ifPresent { + state = try { + it.get() + } catch (ex: Exception) { + WrappedState.ALLOW + } + } + return state == WrappedState.DENY + } +} \ No newline at end of file diff --git a/src/main/kotlin/me/glaremasters/guilds/claim/ClaimRegionHandler.kt b/src/main/kotlin/me/glaremasters/guilds/claim/ClaimRegionHandler.kt new file mode 100644 index 000000000..1c829e11d --- /dev/null +++ b/src/main/kotlin/me/glaremasters/guilds/claim/ClaimRegionHandler.kt @@ -0,0 +1,87 @@ +/* + * MIT License + * + * Copyright (c) 2019 Glare + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package me.glaremasters.guilds.claim + +import me.glaremasters.guilds.api.events.GuildClaimEvent +import me.glaremasters.guilds.api.events.GuildUnclaimAllEvent +import me.glaremasters.guilds.guild.Guild +import org.bukkit.Bukkit +import org.bukkit.entity.Player +import org.codemc.worldguardwrapper.WorldGuardWrapper +import org.codemc.worldguardwrapper.selection.ICuboidSelection +import java.util.* + +object ClaimRegionHandler { + + @JvmStatic + fun createClaim(wrapper: WorldGuardWrapper, guild: Guild, player: Player): GuildClaim { + val name = ClaimUtils.getNextAvailableClaimName() + wrapper.addCuboidRegion(name.toString(), ClaimUtils.claimPointOne(player), ClaimUtils.claimPointTwo(player)) + return GuildClaim.builder().name(name).guildId(guild.id).build() + } + + @JvmStatic + fun createClaim(wrapper: WorldGuardWrapper, guild: Guild, selection: ICuboidSelection): GuildClaim { + val name = ClaimUtils.getNextAvailableClaimName() + + wrapper.addCuboidRegion(name.toString(), selection.minimumPoint, selection.maximumPoint) + return GuildClaim.builder().name(name).guildId(guild.id).build() + + } + + + @JvmStatic + fun removeClaim(wrapper: WorldGuardWrapper, name: UUID) { + for (world in Bukkit.getWorlds()) { + wrapper.removeRegion(world, name.toString()) + } + } + + @JvmStatic + fun removeClaim(wrapper: WorldGuardWrapper, claim: GuildClaim) { + for (world in Bukkit.getWorlds()) { + wrapper.removeRegion(world, claim.name.toString()) + } + } + + @JvmStatic + fun removeAllClaims(wrapper: WorldGuardWrapper, guild: Guild) { + for (world in Bukkit.getWorlds()) { + for (claim in guild.claimedLand) { + wrapper.removeRegion(world, claim.name.toString()) + } + } + } + + @JvmStatic + fun deleteWithGuild(wrapper: WorldGuardWrapper, guild: Guild) { + if (!ClaimUtils.checkIfHaveClaims(wrapper, guild)) { + return + } + + removeAllClaims(wrapper, guild) + + guild.claimedLand.clear() + } +} \ No newline at end of file diff --git a/src/main/kotlin/me/glaremasters/guilds/claim/ClaimRelations.kt b/src/main/kotlin/me/glaremasters/guilds/claim/ClaimRelations.kt new file mode 100644 index 000000000..ef2a208ae --- /dev/null +++ b/src/main/kotlin/me/glaremasters/guilds/claim/ClaimRelations.kt @@ -0,0 +1,202 @@ +package me.glaremasters.guilds.claim + +import ch.jalu.configme.SettingsManager +import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.configuration.sections.ClaimSettings +import me.glaremasters.guilds.guild.Guild +import org.bukkit.Chunk +import org.bukkit.Location +import org.bukkit.entity.Player +import org.codemc.worldguardwrapper.WorldGuardWrapper +import org.codemc.worldguardwrapper.region.IWrappedRegion + +object ClaimRelations { + + @JvmStatic + fun getMap(wrapper: WorldGuardWrapper, player: Player, guilds: Guilds): List> { + + val chunkArray = ArrayList>() + val bottomChunk = getBottomChunk(player) + + outer@for (i in 0..4) { + val row = ArrayList() + inner@for (j in 0..8) { + var haveAdded = false + val chunk = getChunkFromBottomCorner(player, bottomChunk, i, j) + + val locBoundOne = getBottomCorner(player, chunk) + val locBoundTwo = getTopCorner(player, chunk) + + val tempRegions = wrapper.getRegions(locBoundOne, locBoundTwo) + + for (tempRegion in tempRegions) { + val claim = ClaimUtils.getGuildsRegion(guilds, tempRegion) + if (claim != null) { + row.add(claim) + haveAdded = true + } + } + if (!haveAdded) { + row.add(null) + } + } + chunkArray.add(row) + } + return chunkArray.reversed() + } + + + + + @JvmStatic + fun getBottomChunk(player: Player): Chunk { + + val world = player.world + val chunk = player.location.chunk + val baseX = chunk.x + val baseZ = chunk.z + val rotation = (player.location.yaw + 225) + + return when { + rotation <= 90 -> { + world.getChunkAt(baseX - 4, baseZ + 2) + } + rotation <= 180 -> { + world.getChunkAt(baseX - 2, baseZ - 4) + } + rotation <= 270 -> { + world.getChunkAt(baseX + 4, baseZ - 2) + } + rotation <= 360 -> { + world.getChunkAt(baseX + 2, baseZ + 4) + } + else -> { + world.getChunkAt(baseX - 4, baseZ + 2) + } + } + } + + @JvmStatic + fun getChunkFromBottomCorner(player: Player, chunk: Chunk, x: Int, z: Int):Chunk { + + val rotation = (player.location.yaw + 225) + + return when { + rotation <= 90 -> { + player.world.getChunkAt(chunk.x+z, chunk.z-x) + } + rotation <= 180 -> { + player.world.getChunkAt(chunk.x+x, chunk.z+z) + } + rotation <= 270 -> { + player.world.getChunkAt(chunk.x-z, chunk.z+x) + } + rotation <= 360 -> { + player.world.getChunkAt(chunk.x-x, chunk.z-z) + + } + else -> { + player.world.getChunkAt(chunk.x+z, chunk.z-x) + } + } + } + + @JvmStatic + fun getBottomCorner(player: Player, chunk: Chunk): Location { + return chunk.getBlock(0, player.world.minHeight, 0).location + } + + @JvmStatic + fun getTopCorner(player: Player, chunk: Chunk): Location { + return chunk.getBlock(15, player.world.maxHeight, 15).location + } + + + + + + + + + + + @JvmStatic + fun isInProximity(wrapper: WorldGuardWrapper, player: Player, settingsManager: SettingsManager, guild: Guild, guilds: Guilds): Boolean { + + if (settingsManager.getProperty(ClaimSettings.CLAIM_PROXIMITY) <= 0) { + return false + } + else { + val chunk = player.location.chunk + val proximity = settingsManager.getProperty(ClaimSettings.CLAIM_PROXIMITY) + + val bottomChunk = player.world.getChunkAt(chunk.x-proximity, chunk.z-proximity) + val topChunk = player.world.getChunkAt(chunk.x+proximity, chunk.z+proximity) + + val bottomLocation = bottomChunk.getBlock(0, player.world.minHeight, 0).location + val topLocation = topChunk.getBlock(0, player.world.maxHeight, 0).location + + val regions = wrapper.getRegions(bottomLocation, topLocation) + + if (!guild.claimedLand.isNullOrEmpty()) { + return !setContainsOnlyGuildClaims(regions, guild, guilds) + } + else { + return !wrapper.getRegions(bottomLocation, topLocation).isNullOrEmpty() + } + } + } + + @JvmStatic + fun setContainsOnlyGuildClaims(regions: MutableSet, guild: Guild, guilds: Guilds): Boolean { + for (region in regions) { + val claim = ClaimUtils.getGuildsRegion(guilds, region) + if (claim != null) { + if (!claim.getGuild(guilds.guildHandler).equals(guild)) { + return false + } + } else { + return false + } + } + return true + } + + + + + + + + + + @JvmStatic + fun isAdjacent(wrapper: WorldGuardWrapper, player: Player, settingsManager: SettingsManager, guild: Guild): Boolean { + if (settingsManager.getProperty(ClaimSettings.CLAIM_ADJACENT)) { + val chunk = player.location.chunk + + val bottomChunk = player.world.getChunkAt(chunk.x-1, chunk.z-1) + val topChunk = player.world.getChunkAt(chunk.x+1, chunk.z+1) + + val bottomLocation = bottomChunk.getBlock(0, player.world.minHeight, 0).location + val topLocation = topChunk.getBlock(0, player.world.maxHeight, 0).location + + val regions = wrapper.getRegions(bottomLocation, topLocation) + + for (region in regions) { + for (claim in guild.claimedLand) { + if (claim.name.toString().equals(region.id.toString())) { + return true + } + } + } + if (guild.claimedLand.isNullOrEmpty()) { + return true + } + return false + } + else { + return true + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/me/glaremasters/guilds/claim/ClaimUtils.kt b/src/main/kotlin/me/glaremasters/guilds/claim/ClaimUtils.kt new file mode 100644 index 000000000..39c8c8e0b --- /dev/null +++ b/src/main/kotlin/me/glaremasters/guilds/claim/ClaimUtils.kt @@ -0,0 +1,279 @@ +/* + * MIT License + * + * Copyright (c) 2019 Glare + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package me.glaremasters.guilds.claim + +import ch.jalu.configme.SettingsManager +import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.configuration.sections.ClaimSettings +import me.glaremasters.guilds.configuration.sections.HooksSettings +import me.glaremasters.guilds.guild.Guild +import org.bukkit.Bukkit +import org.bukkit.Location +import org.bukkit.entity.Player +import org.codemc.worldguardwrapper.WorldGuardWrapper +import org.codemc.worldguardwrapper.region.IWrappedRegion +import org.codemc.worldguardwrapper.selection.ICuboidSelection +import java.util.* + +/** + * Created by Glare + * Date: 4/4/2019 + * Time: 9:44 PM + */ +object ClaimUtils { + + @JvmStatic + fun isEnable(settingsManager: SettingsManager): Boolean { + return settingsManager.getProperty(HooksSettings.WORLDGUARD) + } + + @JvmStatic + fun claimPointOne(player: Player): Location { + return player.location.chunk.getBlock(0, player.world.minHeight, 0).location + //return player.location.subtract(getRadius(settingsManager).toDouble(), player.location.y, getRadius(settingsManager).toDouble()) + } + + @JvmStatic + fun claimPointTwo(player: Player): Location { + return player.location.chunk.getBlock(15, player.world.maxHeight, 15).location + //return player.location.add(getRadius(settingsManager).toDouble(), player.world.maxHeight - player.location.y, getRadius(settingsManager).toDouble()) + } + + @JvmStatic + fun getNextAvailableClaimName(): UUID { + return UUID.randomUUID() + //return guild.id.toString() + } + + @JvmStatic + fun getClaimAmount(guild: Guild): Int { + return if (!guild.claimedLand.isNullOrEmpty()) { + guild.claimedLand.size + } else { + 0 + } + } + + @JvmStatic + fun getSelection(wrapper: WorldGuardWrapper, player: Player, name: String): ICuboidSelection { + return wrapper.getRegion(player.world, name).get().selection as ICuboidSelection + } + + @JvmStatic + fun getSelection(wrapper: WorldGuardWrapper, name: String): ICuboidSelection? { + for (world in Bukkit.getWorlds()) { + val tempSelection = wrapper.getRegion(world, name).get().selection as ICuboidSelection + if (tempSelection != null) { + return tempSelection + } + } + return null + } + + @JvmStatic + fun regions(wrapper: WorldGuardWrapper, player: Player): Set { + return wrapper.getRegions(claimPointOne(player), claimPointTwo(player)) + } + + @JvmStatic + fun checkOverlap(wrapper: WorldGuardWrapper, player: Player): Boolean { + return regions(wrapper, player).isNotEmpty() + } + + @JvmStatic + fun isInDisabledWorld(player: Player, settingsManager: SettingsManager): Boolean { + return settingsManager.getProperty(ClaimSettings.DISABLED_WORLDS).contains(player.world.name) + } + + @JvmStatic + fun getStandingOnClaim(wrapper: WorldGuardWrapper, player: Player, guild: Guild): GuildClaim? { + for (claim in guild.claimedLand) { + for (region in regions(wrapper, player)) { + if (region.id.toString().equals(claim.getRegion(wrapper).id.toString())) { + return claim + } + } + } + return null + } + + +// @JvmStatic +// fun findRegionClaims(wrapper: WorldGuardWrapper, world: World, guild: Guild): List> { +// val claims = mutableListOf>() +// for (claim in guild.claimedLand) { +// val tempRegion = wrapper.getRegion(world, claim.name.toString()) +// try { +// tempRegion.get().id +// claims.add(tempRegion) +// } catch (ex: Exception) { +// continue +// } +// } +// return claims +// } + + @JvmStatic + fun findRegionClaims(wrapper: WorldGuardWrapper, guild: Guild): List> { + val claims = mutableListOf>() + for (world in Bukkit.getWorlds()) { + for (claim in guild.claimedLand) { + val tempRegion = wrapper.getRegion(world, claim.name.toString()) + try { + tempRegion.get().id + claims.add(tempRegion) + } catch (ex: Exception) { + continue + } + } + } + return claims + } + + @JvmStatic + fun getGuildClaimFromRegion(wrapper: WorldGuardWrapper, region: Optional, guild: Guild): GuildClaim? { + for (claim in guild.claimedLand) { + if (claim.getRegion(wrapper).equals(region.get())) { + return claim + } + } + return null + } + + @JvmStatic + fun getGuildClaimFromRegion(wrapper: WorldGuardWrapper, region: IWrappedRegion, guild: Guild): GuildClaim? { + for (claim in guild.claimedLand) { + if (claim.getRegion(wrapper).equals(region)) { + return claim + } + } + return null + } + + @JvmStatic + fun getRegionFromName(wrapper: WorldGuardWrapper, name: UUID): IWrappedRegion? { + for (world in Bukkit.getWorlds()) { + val tempRegion = wrapper.getRegion(world, name.toString()) + return try { + tempRegion.get().id + tempRegion.get() + } catch (ex: Exception) { + null + } + } + return null + } + + @JvmStatic + fun getRegionFromName(wrapper: WorldGuardWrapper, name: String): IWrappedRegion? { + for (world in Bukkit.getWorlds()) { + val tempRegion = wrapper.getRegion(world, name) + return try { + tempRegion.get().id + tempRegion.get() + } catch (ex: Exception) { + null + } + } + return null + } + + @JvmStatic + fun getClaimFromName(wrapper: WorldGuardWrapper, player: Player, name: String, guild: Guild): GuildClaim { + return getGuildClaimFromRegion(wrapper, wrapper.getRegion(player.world, name), guild)!! + } + + @JvmStatic + fun checkIfHaveClaims(wrapper: WorldGuardWrapper, guild: Guild): Boolean { + val foundClaims = findRegionClaims(wrapper, guild) + return if (guild.claimedLand.size == 0) { + false + } else { + !foundClaims.isNullOrEmpty() + } +// for (world in Bukkit.getWorlds()) { +// guild.tier.claimableLand +// val tempRegion = wrapper.getRegion(world, getAvailableClaimName(guild)) +// try { +// tempRegion.get().id +// return true +// } catch (ex: Exception) { +// continue +// } +// } +// return false + } + + @JvmStatic + fun checkMaxAlreadyExist(wrapper: WorldGuardWrapper, guild: Guild): Boolean { + return if (!guild.claimedLand.isNullOrEmpty()) { + guild.claimedLand.size >= guild.tier.claimableLand + } else { + false + } +// for (world in Bukkit.getWorlds()) { +// val tempRegion = wrapper.getRegion(world, getClaimNameFormat(guild, guild.tier.claimableLand)) +// try { +// tempRegion.get().id +// return true +// } catch (ex: Exception) { +// continue +// } +// } +// return false + } + + @JvmStatic + fun getGuildsRegion(guilds: Guilds, iWrappedRegion: IWrappedRegion): GuildClaim? { + for (guild in guilds.guildHandler.guilds) { + for (claim in guild.claimedLand) { + if (claim.name.toString() == iWrappedRegion.id.toString()) { + return claim + } + } + } + return null + } + + + + + + + + + + + @JvmStatic + fun reload(guilds: Guilds, settingsManager: SettingsManager) { + val wrapper = WorldGuardWrapper.getInstance() + + for (guild in guilds.guildHandler.guilds) { + for (claim in guild.claimedLand) { + ClaimEditor.setEnterMessage(wrapper, claim, settingsManager, guild) + ClaimEditor.setExitMessage(wrapper, claim, settingsManager, guild) + } + } + } +} diff --git a/src/main/kotlin/me/glaremasters/guilds/claim/GuildClaim.kt b/src/main/kotlin/me/glaremasters/guilds/claim/GuildClaim.kt new file mode 100644 index 000000000..575d168dc --- /dev/null +++ b/src/main/kotlin/me/glaremasters/guilds/claim/GuildClaim.kt @@ -0,0 +1,103 @@ +/* + * MIT License + * + * Copyright (c) 2019 Glare + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package me.glaremasters.guilds.claim + +import me.glaremasters.guilds.guild.Guild +import me.glaremasters.guilds.guild.GuildHandler +import org.bukkit.Location +import org.codemc.worldguardwrapper.WorldGuardWrapper +import org.codemc.worldguardwrapper.region.IWrappedRegion +import org.codemc.worldguardwrapper.selection.ICuboidSelection +import java.util.* +import kotlin.properties.Delegates + +class GuildClaim (var name: UUID, var guildId: UUID) { + + fun changeName(name: UUID) { + this.name = name + return + } + + fun changeGuildId(guildID: UUID) { + this.guildId = guildID + return + } + + fun getRegion(wrapper: WorldGuardWrapper): IWrappedRegion { + return ClaimUtils.getRegionFromName(wrapper, name)!! + } + + fun getGuild(guildHandler: GuildHandler): Guild { + return guildHandler.getGuild(guildId) + } + + fun getClaimFirstCorner(): Location { + val wrapper = WorldGuardWrapper.getInstance() + + val selection = ClaimUtils.getSelection(wrapper, name.toString()) + + return selection?.minimumPoint!! + } + + fun getClaimSecondCorner(): Location { + val wrapper = WorldGuardWrapper.getInstance() + + val selection = ClaimUtils.getSelection(wrapper, name.toString()) + + return selection?.maximumPoint!! + } + + override fun toString(): String { + return "GuildClaim(name=$name, guildId=$guildId)" + } + + class GuildClaimBuilder internal constructor() { + private lateinit var name: UUID + private lateinit var guildId: UUID + + fun name(name: UUID): GuildClaimBuilder { + this.name = name + return this + } + + fun guildId(guildId: UUID): GuildClaimBuilder { + this.guildId = guildId + return this + } + + fun build(): GuildClaim { + return GuildClaim( name, guildId) + } + + override fun toString(): String { + return "GuildClaim.GuildClaimBuilder(name=$name, guildId=$guildId)" + } + } + + companion object { + fun builder(): GuildClaimBuilder { + return GuildClaimBuilder() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/admin/CommandReload.kt b/src/main/kotlin/me/glaremasters/guilds/commands/admin/CommandReload.kt index 7ee8aa017..07402b396 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/admin/CommandReload.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/admin/CommandReload.kt @@ -33,6 +33,7 @@ import co.aikar.commands.annotation.Dependency import co.aikar.commands.annotation.Description import co.aikar.commands.annotation.Subcommand import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages import me.glaremasters.guilds.utils.Constants @@ -51,5 +52,9 @@ internal class CommandReload : BaseCommand() { guilds.settingsHandler.buffConf.reload() guilds.acfHandler.loadLang() currentCommandIssuer.sendInfo(Messages.RELOAD__RELOADED) + + if (ClaimUtils.isEnable(settingsManager)) { + ClaimUtils.reload(guilds, settingsManager) + } } } diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/admin/claims/CommandAdminClaim.kt b/src/main/kotlin/me/glaremasters/guilds/commands/admin/claims/CommandAdminClaim.kt index ac09d570c..d3f745687 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/admin/claims/CommandAdminClaim.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/admin/claims/CommandAdminClaim.kt @@ -27,22 +27,21 @@ package me.glaremasters.guilds.commands.admin.claims import ch.jalu.configme.SettingsManager import co.aikar.commands.ACFBukkitUtil import co.aikar.commands.BaseCommand -import co.aikar.commands.annotation.CommandAlias -import co.aikar.commands.annotation.CommandCompletion -import co.aikar.commands.annotation.CommandPermission -import co.aikar.commands.annotation.Dependency -import co.aikar.commands.annotation.Description -import co.aikar.commands.annotation.Flags -import co.aikar.commands.annotation.Subcommand -import co.aikar.commands.annotation.Syntax -import co.aikar.commands.annotation.Values +import co.aikar.commands.annotation.* import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.api.events.GuildClaimEvent +import me.glaremasters.guilds.api.events.GuildKickEvent +import me.glaremasters.guilds.api.events.GuildUnclaimAllEvent +import me.glaremasters.guilds.api.events.GuildUnclaimEvent +import me.glaremasters.guilds.claim.ClaimEditor +import me.glaremasters.guilds.claim.ClaimRegionHandler import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages -import me.glaremasters.guilds.utils.ClaimUtils +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.utils.Constants +import org.bukkit.Bukkit import org.bukkit.entity.Player import org.codemc.worldguardwrapper.WorldGuardWrapper @@ -64,45 +63,67 @@ internal class CommandAdminClaim : BaseCommand() { val wrapper = WorldGuardWrapper.getInstance() - if (ClaimUtils.checkAlreadyExist(wrapper, guild)) { - throw ExpectationNotMet(Messages.CLAIM__ALREADY_EXISTS) - } + val claim = ClaimRegionHandler.createClaim(wrapper, guild, player) + guild.addGuildClaim(claim) - if (ClaimUtils.checkOverlap(wrapper, player, settingsManager)) { - throw ExpectationNotMet(Messages.CLAIM__OVERLAP) - } + ClaimEditor.addOwner(wrapper, claim, guild) + ClaimEditor.addMembers(wrapper, claim, guild) + ClaimEditor.setEnterMessage(wrapper, claim, settingsManager, guild) + ClaimEditor.setExitMessage(wrapper, claim, settingsManager, guild) - ClaimUtils.createClaim(wrapper, guild, player, settingsManager) + val event = GuildClaimEvent(player, guild, claim) + Bukkit.getPluginManager().callEvent(event) - ClaimUtils.getGuildClaim(wrapper, player, guild).ifPresent { region -> - ClaimUtils.addOwner(region, guild) - ClaimUtils.addMembers(region, guild) - ClaimUtils.setEnterMessage(wrapper, region, settingsManager, guild) - ClaimUtils.setExitMessage(wrapper, region, settingsManager, guild) - } currentCommandIssuer.sendInfo(Messages.CLAIM__SUCCESS, - "{loc1}", ACFBukkitUtil.formatLocation(ClaimUtils.claimPointOne(player, settingsManager)), - "{loc2}", ACFBukkitUtil.formatLocation(ClaimUtils.claimPointTwo(player, settingsManager))) + "{loc1}", ACFBukkitUtil.formatLocation(ClaimUtils.claimPointOne(player)), + "{loc2}", ACFBukkitUtil.formatLocation(ClaimUtils.claimPointTwo(player))) } @Subcommand("admin unclaim") @Description("{@@descriptions.admin-unclaim}") @CommandPermission(Constants.ADMIN_PERM) - @CommandCompletion("@guilds") - @Syntax("<%syntax>") - fun unclaim(player: Player, @Flags("other") @Values("@guilds") guild: Guild) { + @CommandCompletion("@guilds @claimed") + @Syntax("<%syntax> ") + fun unclaim(player: Player, @Flags("other") @Values("@guilds") guild: Guild, @Values("@claimed") @Single option: String) { if (!ClaimUtils.isEnable(settingsManager)) { throw ExpectationNotMet(Messages.CLAIM__HOOK_DISABLED) } val wrapper = WorldGuardWrapper.getInstance() - if (!ClaimUtils.checkAlreadyExist(wrapper, guild)) { + if (!ClaimUtils.checkIfHaveClaims(wrapper, guild)) { throw (ExpectationNotMet(Messages.UNCLAIM__NOT_FOUND)) } - ClaimUtils.removeClaim(wrapper, guild) - currentCommandIssuer.sendInfo(Messages.UNCLAIM__SUCCESS) + when (option) { + "all" -> { + ClaimRegionHandler.removeAllClaims(wrapper, guild) + guild.clearGuildClaims() + + val event = GuildUnclaimAllEvent(player, guild) + Bukkit.getPluginManager().callEvent(event) + + currentCommandIssuer.sendInfo(Messages.UNCLAIM__SUCCESS) + } + "this" -> { + val standingClaim = ClaimUtils.getStandingOnClaim(wrapper, player, guild) + if (standingClaim != null) { + ClaimRegionHandler.removeClaim(wrapper, standingClaim) + guild.removeGuildClaim(standingClaim) + + val event = GuildUnclaimEvent(player, guild, standingClaim) + Bukkit.getPluginManager().callEvent(event) + + currentCommandIssuer.sendInfo(Messages.UNCLAIM__SUCCESS) + } + else { + currentCommandIssuer.sendInfo(Messages.UNCLAIM__NOT_FOUND) + } + } + else -> { + currentCommandIssuer.sendInfo(Messages.UNCLAIM__NOT_FOUND) + } + } } } diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/admin/manage/CommandAdminRemove.kt b/src/main/kotlin/me/glaremasters/guilds/commands/admin/manage/CommandAdminRemove.kt index 061500a25..35b1b9211 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/admin/manage/CommandAdminRemove.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/admin/manage/CommandAdminRemove.kt @@ -39,16 +39,19 @@ import co.aikar.commands.annotation.Values import me.glaremasters.guilds.Guilds import me.glaremasters.guilds.actions.ActionHandler import me.glaremasters.guilds.actions.ConfirmAction +import me.glaremasters.guilds.api.events.GuildClaimEvent import me.glaremasters.guilds.api.events.GuildRemoveEvent -import me.glaremasters.guilds.configuration.sections.PluginSettings +import me.glaremasters.guilds.api.events.GuildUnclaimAllEvent +import me.glaremasters.guilds.claim.ClaimRegionHandler import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages -import me.glaremasters.guilds.utils.ClaimUtils +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.utils.Constants import net.milkbowl.vault.permission.Permission import org.bukkit.Bukkit import org.bukkit.entity.Player +import org.codemc.worldguardwrapper.WorldGuardWrapper @CommandAlias("%guilds") internal class CommandAdminRemove : BaseCommand() { @@ -71,6 +74,7 @@ internal class CommandAdminRemove : BaseCommand() { actionHandler.addAction(player, object : ConfirmAction { override fun accept() { val event = GuildRemoveEvent(player, guild, GuildRemoveEvent.Cause.ADMIN_DELETED) + Bukkit.getPluginManager().callEvent(event) if (event.isCancelled) { @@ -80,7 +84,17 @@ internal class CommandAdminRemove : BaseCommand() { guildHandler.removeGuildPermsFromAll(permission, guild) guildHandler.removeAlliesOnDelete(guild) guildHandler.notifyAllies(guild, guilds.commandManager) - ClaimUtils.deleteWithGuild(guild, settingsManager) + + if (ClaimUtils.isEnable(settingsManager)) { + val wrapper = WorldGuardWrapper.getInstance() + + ClaimRegionHandler.deleteWithGuild(wrapper, guild) + + val firedEvent = GuildUnclaimAllEvent(player, guild) + Bukkit.getPluginManager().callEvent(firedEvent) + + } + guild.sendMessage(currentCommandManager, Messages.LEAVE__GUILDMASTER_LEFT, "{player}", guild.guildMaster.name) guildHandler.removeGuild(guild) currentCommandIssuer.sendInfo(Messages.ADMIN__DELETE_SUCCESS, "{guild}", name) diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/admin/manage/CommandAdminTransfer.kt b/src/main/kotlin/me/glaremasters/guilds/commands/admin/manage/CommandAdminTransfer.kt index 44bdc2ebd..6a7392a2e 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/admin/manage/CommandAdminTransfer.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/admin/manage/CommandAdminTransfer.kt @@ -37,6 +37,8 @@ import co.aikar.commands.annotation.Subcommand import co.aikar.commands.annotation.Syntax import co.aikar.commands.annotation.Values import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.claim.ClaimEditor +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler @@ -44,6 +46,7 @@ import me.glaremasters.guilds.messages.Messages import me.glaremasters.guilds.utils.Constants import org.bukkit.Bukkit import org.bukkit.entity.Player +import org.codemc.worldguardwrapper.WorldGuardWrapper @CommandAlias("%guilds") internal class CommandAdminTransfer : BaseCommand() { @@ -63,6 +66,14 @@ internal class CommandAdminTransfer : BaseCommand() { throw ExpectationNotMet(Messages.ERROR__TRANSFER_SAME_PERSON) } + if (ClaimUtils.isEnable(settingsManager)) { + val wrapper = WorldGuardWrapper.getInstance() + + for (claim in guild.claimedLand) { + ClaimEditor.transferOwner(wrapper, claim, transfer.uniqueId, guild.guildMaster.uuid) + } + } + guild.transferGuildAdmin(transfer, guildHandler) currentCommandIssuer.sendInfo(Messages.TRANSFER__SUCCESS) } diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/admin/member/CommandAdminAddPlayer.kt b/src/main/kotlin/me/glaremasters/guilds/commands/admin/member/CommandAdminAddPlayer.kt index 1d57c3dd0..1fb29e3ca 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/admin/member/CommandAdminAddPlayer.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/admin/member/CommandAdminAddPlayer.kt @@ -24,6 +24,7 @@ package me.glaremasters.guilds.commands.admin.member +import ch.jalu.configme.SettingsManager import co.aikar.commands.BaseCommand import co.aikar.commands.CommandIssuer import co.aikar.commands.annotation.CommandAlias @@ -36,17 +37,21 @@ import co.aikar.commands.annotation.Subcommand import co.aikar.commands.annotation.Syntax import co.aikar.commands.annotation.Values import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.claim.ClaimEditor +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages import me.glaremasters.guilds.utils.Constants import org.bukkit.Bukkit +import org.codemc.worldguardwrapper.WorldGuardWrapper @CommandAlias("%guilds") internal class CommandAdminAddPlayer : BaseCommand() { @Dependency lateinit var guilds: Guilds @Dependency lateinit var guildHandler: GuildHandler + @Dependency lateinit var settingsManager: SettingsManager @Subcommand("admin addplayer") @Description("{@@descriptions.admin-addplayer}") @@ -72,6 +77,14 @@ internal class CommandAdminAddPlayer : BaseCommand() { currentCommandManager.getCommandIssuer(user).sendInfo(Messages.ADMIN__PLAYER_ADDED, "{guild}", name) } + if (ClaimUtils.isEnable(settingsManager)) { + val wrapper = WorldGuardWrapper.getInstance() + + for (claim in guild.claimedLand) { + ClaimEditor.addMember(wrapper, claim, user.uniqueId) + } + } + currentCommandIssuer.sendInfo(Messages.ADMIN__ADMIN_PLAYER_ADDED, "{player}", user.name, "{guild}", name) guild.sendMessage(currentCommandManager, Messages.ADMIN__ADMIN_GUILD_ADD, "{player}", user.name) } diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/admin/member/CommandAdminRemovePlayer.kt b/src/main/kotlin/me/glaremasters/guilds/commands/admin/member/CommandAdminRemovePlayer.kt index 2b38ea1cd..c85660e42 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/admin/member/CommandAdminRemovePlayer.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/admin/member/CommandAdminRemovePlayer.kt @@ -34,13 +34,15 @@ import co.aikar.commands.annotation.Subcommand import co.aikar.commands.annotation.Syntax import me.glaremasters.guilds.Guilds import me.glaremasters.guilds.api.events.GuildKickEvent +import me.glaremasters.guilds.claim.ClaimEditor import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages -import me.glaremasters.guilds.utils.ClaimUtils +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.utils.Constants import org.bukkit.Bukkit import org.bukkit.entity.Player +import org.codemc.worldguardwrapper.WorldGuardWrapper // todo Fix the logic on this because what if you force remove the guild master? @CommandAlias("%guilds") @@ -63,7 +65,14 @@ internal class CommandAdminRemovePlayer : BaseCommand() { return } - ClaimUtils.kickMember(user, player, guild, settingsManager) + if (ClaimUtils.isEnable(settingsManager)) { + val wrapper = WorldGuardWrapper.getInstance() + + for (claim in guild.claimedLand) { + ClaimEditor.kickMember(wrapper, claim, user) + } + } + guild.removeMember(user) if (user.isOnline) { diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/claims/CommandClaim.kt b/src/main/kotlin/me/glaremasters/guilds/commands/claims/CommandClaim.kt index 49d6dbc21..024091bd6 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/claims/CommandClaim.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/claims/CommandClaim.kt @@ -27,21 +27,19 @@ package me.glaremasters.guilds.commands.claims import ch.jalu.configme.SettingsManager import co.aikar.commands.ACFBukkitUtil import co.aikar.commands.BaseCommand -import co.aikar.commands.annotation.CommandAlias -import co.aikar.commands.annotation.CommandPermission -import co.aikar.commands.annotation.Conditions -import co.aikar.commands.annotation.Dependency -import co.aikar.commands.annotation.Description -import co.aikar.commands.annotation.Subcommand -import co.aikar.commands.annotation.Syntax +import co.aikar.commands.annotation.* import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.api.events.GuildClaimEvent +import me.glaremasters.guilds.api.events.GuildUnclaimAllEvent +import me.glaremasters.guilds.api.events.GuildUnclaimEvent +import me.glaremasters.guilds.claim.* import me.glaremasters.guilds.configuration.sections.ClaimSettings import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages -import me.glaremasters.guilds.utils.ClaimUtils import me.glaremasters.guilds.utils.Constants +import org.bukkit.Bukkit import org.bukkit.entity.Player import org.codemc.worldguardwrapper.WorldGuardWrapper @@ -73,33 +71,44 @@ internal class CommandClaim : BaseCommand() { val wrapper = WorldGuardWrapper.getInstance() - if (ClaimUtils.checkAlreadyExist(wrapper, guild)) { - throw ExpectationNotMet(Messages.CLAIM__ALREADY_EXISTS) + if (ClaimUtils.checkMaxAlreadyExist(wrapper, guild)) { + throw ExpectationNotMet(Messages.CLAIM__TOO_MANY_CLAIMS) } - if (ClaimUtils.checkOverlap(wrapper, player, settingsManager)) { + if (ClaimUtils.checkOverlap(wrapper, player)) { throw ExpectationNotMet(Messages.CLAIM__OVERLAP) } - ClaimUtils.createClaim(wrapper, guild, player, settingsManager) + if (ClaimRelations.isInProximity(wrapper, player, settingsManager, guild, guilds)) { + throw ExpectationNotMet(Messages.CLAIM__IS_IN_PROXIMITY) + } - ClaimUtils.getGuildClaim(wrapper, player, guild).ifPresent { region -> - ClaimUtils.addOwner(region, guild) - ClaimUtils.addMembers(region, guild) - ClaimUtils.setEnterMessage(wrapper, region, settingsManager, guild) - ClaimUtils.setExitMessage(wrapper, region, settingsManager, guild) + if (!ClaimRelations.isAdjacent(wrapper, player, settingsManager, guild)) { + throw ExpectationNotMet(Messages.CLAIM__MUST_BE_ADJACENT) } + val claim = ClaimRegionHandler.createClaim(wrapper, guild, player) + guild.addGuildClaim(claim) + + ClaimEditor.addOwner(wrapper, claim, guild) + ClaimEditor.addMembers(wrapper, claim, guild) + ClaimEditor.setEnterMessage(wrapper, claim, settingsManager, guild) + ClaimEditor.setExitMessage(wrapper, claim, settingsManager, guild) + + val event = GuildClaimEvent(player, guild, claim) + Bukkit.getPluginManager().callEvent(event) + currentCommandIssuer.sendInfo(Messages.CLAIM__SUCCESS, - "{loc1}", ACFBukkitUtil.formatLocation(ClaimUtils.claimPointOne(player, settingsManager)), - "{loc2}", ACFBukkitUtil.formatLocation(ClaimUtils.claimPointTwo(player, settingsManager))) + "{loc1}", ACFBukkitUtil.formatLocation(ClaimUtils.claimPointOne(player)), + "{loc2}", ACFBukkitUtil.formatLocation(ClaimUtils.claimPointTwo(player))) } @Subcommand("unclaim") @Description("{@@descriptions.unclaim}") @CommandPermission(Constants.BASE_PERM + "unclaim") - @Syntax("") - fun unclaim(player: Player, @Conditions("perm:perm=UNCLAIM_LAND") guild: Guild) { + @CommandCompletion("@claimed") + @Syntax("") + fun unclaim(player: Player, @Conditions("perm:perm=UNCLAIM_LAND") guild: Guild, @Values("@claimed") @Single option: String) { if (!ClaimUtils.isEnable(settingsManager)) { throw ExpectationNotMet(Messages.CLAIM__HOOK_DISABLED) } @@ -114,11 +123,38 @@ internal class CommandClaim : BaseCommand() { val wrapper = WorldGuardWrapper.getInstance() - if (!ClaimUtils.checkAlreadyExist(wrapper, guild)) { + if (!ClaimUtils.checkIfHaveClaims(wrapper, guild)) { throw ExpectationNotMet(Messages.UNCLAIM__NOT_FOUND) } - ClaimUtils.removeClaim(wrapper, guild) - currentCommandIssuer.sendInfo(Messages.UNCLAIM__SUCCESS) + when (option) { + "all" -> { + ClaimRegionHandler.removeAllClaims(wrapper, guild) + guild.clearGuildClaims() + + val event = GuildUnclaimAllEvent(player, guild) + Bukkit.getPluginManager().callEvent(event) + + currentCommandIssuer.sendInfo(Messages.UNCLAIM__SUCCESS) + } + "this" -> { + val standingClaim = ClaimUtils.getStandingOnClaim(wrapper, player, guild) + if (standingClaim != null) { + ClaimRegionHandler.removeClaim(wrapper, standingClaim) + guild.removeGuildClaim(standingClaim) + + val event = GuildClaimEvent(player, guild, standingClaim) + Bukkit.getPluginManager().callEvent(event) + + currentCommandIssuer.sendInfo(Messages.UNCLAIM__SUCCESS) + } + else { + currentCommandIssuer.sendInfo(Messages.UNCLAIM__NOT_FOUND) + } + } + else -> { + currentCommandIssuer.sendInfo(Messages.UNCLAIM__NOT_FOUND) + } + } } } diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/console/CommandConsole.kt b/src/main/kotlin/me/glaremasters/guilds/commands/console/CommandConsole.kt index f99c46589..c25da8373 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/console/CommandConsole.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/console/CommandConsole.kt @@ -40,13 +40,14 @@ import me.glaremasters.guilds.actions.ActionHandler import me.glaremasters.guilds.actions.ConfirmAction import me.glaremasters.guilds.arena.ArenaHandler import me.glaremasters.guilds.challenges.ChallengeHandler +import me.glaremasters.guilds.claim.ClaimRegionHandler import me.glaremasters.guilds.cooldowns.CooldownHandler import me.glaremasters.guilds.database.DatabaseBackend import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages import me.glaremasters.guilds.utils.BackupUtils -import me.glaremasters.guilds.utils.ClaimUtils +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.utils.Constants import org.codemc.worldguardwrapper.WorldGuardWrapper @@ -157,10 +158,8 @@ internal class CommandConsole : BaseCommand() { actionHandler.addAction(issuer.getIssuer(), object : ConfirmAction { override fun accept() { val wrapper = WorldGuardWrapper.getInstance() - guildHandler.guilds.forEach { guild -> - if (ClaimUtils.checkAlreadyExist(wrapper, guild)) { - ClaimUtils.removeClaim(wrapper, guild) - } + for (guild in guildHandler.guilds) { + ClaimRegionHandler.removeAllClaims(wrapper, guild) } currentCommandIssuer.sendInfo(Messages.UNCLAIM__ALL_SUCCESS) } diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/gui/CommandGUI.kt b/src/main/kotlin/me/glaremasters/guilds/commands/gui/CommandGUI.kt index e8bcaffc2..4cc10140c 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/gui/CommandGUI.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/gui/CommandGUI.kt @@ -24,6 +24,7 @@ package me.glaremasters.guilds.commands.gui +import ch.jalu.configme.SettingsManager import co.aikar.commands.BaseCommand import co.aikar.commands.annotation.CommandAlias import co.aikar.commands.annotation.CommandPermission @@ -34,8 +35,11 @@ import co.aikar.commands.annotation.Subcommand import co.aikar.commands.annotation.Syntax import dev.triumphteam.gui.guis.PaginatedGui import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.claim.ClaimUtils +import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.exceptions.InvalidTierException import me.glaremasters.guilds.guild.Guild +import me.glaremasters.guilds.messages.Messages import me.glaremasters.guilds.utils.Constants import org.bukkit.entity.Player @@ -43,6 +47,8 @@ import org.bukkit.entity.Player internal class CommandGUI : BaseCommand() { @Dependency lateinit var guilds: Guilds + @Dependency + lateinit var settingsManager: SettingsManager @Subcommand("buff") @Description("{@@descriptions.buff}") @@ -92,4 +98,19 @@ internal class CommandGUI : BaseCommand() { fun vault(player: Player, @Conditions("perm:perm=OPEN_VAULT") guild: Guild) { guilds.guiHandler.vaults.get(guild, player).open(player) } + + @Subcommand("map") + @Description("{@@descriptions.map}") + @Syntax("") + @CommandPermission(Constants.BASE_PERM + "map") fun map(player: Player) { + if (!ClaimUtils.isEnable(settingsManager)) { + throw ExpectationNotMet(Messages.CLAIM__HOOK_DISABLED) + } + + if (ClaimUtils.isInDisabledWorld(player, settingsManager)) { + throw ExpectationNotMet(Messages.CLAIM__HOOK_DISABLED) + } + + guilds.guiHandler.map.get(player).open(player) + } } diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandDelete.kt b/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandDelete.kt index 5dbb17c4c..ab93f4787 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandDelete.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandDelete.kt @@ -26,26 +26,24 @@ package me.glaremasters.guilds.commands.management import ch.jalu.configme.SettingsManager import co.aikar.commands.BaseCommand -import co.aikar.commands.annotation.CommandAlias -import co.aikar.commands.annotation.CommandPermission -import co.aikar.commands.annotation.Conditions -import co.aikar.commands.annotation.Dependency -import co.aikar.commands.annotation.Description -import co.aikar.commands.annotation.Subcommand -import co.aikar.commands.annotation.Syntax +import co.aikar.commands.annotation.* import me.glaremasters.guilds.Guilds import me.glaremasters.guilds.actions.ActionHandler import me.glaremasters.guilds.actions.ConfirmAction +import me.glaremasters.guilds.api.events.GuildClaimEvent import me.glaremasters.guilds.api.events.GuildRemoveEvent -import me.glaremasters.guilds.configuration.sections.PluginSettings +import me.glaremasters.guilds.api.events.GuildUnclaimAllEvent +import me.glaremasters.guilds.claim.ClaimRegionHandler +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages -import me.glaremasters.guilds.utils.ClaimUtils import me.glaremasters.guilds.utils.Constants import net.milkbowl.vault.permission.Permission import org.bukkit.Bukkit import org.bukkit.entity.Player +import org.bukkit.event.Event +import org.codemc.worldguardwrapper.WorldGuardWrapper @CommandAlias("%guilds") internal class CommandDelete : BaseCommand() { @@ -80,7 +78,14 @@ internal class CommandDelete : BaseCommand() { guildHandler.removeAlliesOnDelete(guild) guildHandler.notifyAllies(guild, guilds.commandManager) guild.sendMessage(currentCommandManager, Messages.LEAVE__GUILDMASTER_LEFT, "{player}", player.name) - ClaimUtils.deleteWithGuild(guild, settingsManager) + if (ClaimUtils.isEnable(settingsManager)) { + val wrapper = WorldGuardWrapper.getInstance() + + val firedEvent = GuildUnclaimAllEvent(player, guild) + Bukkit.getPluginManager().callEvent(firedEvent) + + ClaimRegionHandler.deleteWithGuild(wrapper, guild) + } guildHandler.removeGuild(guild) currentCommandIssuer.sendInfo(Messages.DELETE__SUCCESSFUL, "{guild}", guild.name) actionHandler.removeAction(player) diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandKick.kt b/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandKick.kt index c71b37c32..0cc513604 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandKick.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandKick.kt @@ -39,8 +39,8 @@ import co.aikar.commands.annotation.Values import java.util.concurrent.TimeUnit import me.glaremasters.guilds.Guilds import me.glaremasters.guilds.api.events.GuildKickEvent +import me.glaremasters.guilds.claim.ClaimEditor import me.glaremasters.guilds.configuration.sections.CooldownSettings -import me.glaremasters.guilds.configuration.sections.PluginSettings import me.glaremasters.guilds.cooldowns.Cooldown import me.glaremasters.guilds.cooldowns.CooldownHandler import me.glaremasters.guilds.exceptions.ExpectationNotMet @@ -48,12 +48,13 @@ import me.glaremasters.guilds.exceptions.InvalidPermissionException import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages -import me.glaremasters.guilds.utils.ClaimUtils +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.utils.Constants import me.glaremasters.guilds.utils.RoleUtils import net.milkbowl.vault.permission.Permission import org.bukkit.Bukkit import org.bukkit.entity.Player +import org.codemc.worldguardwrapper.WorldGuardWrapper @CommandAlias("%guilds") internal class CommandKick : BaseCommand() { @@ -94,7 +95,15 @@ internal class CommandKick : BaseCommand() { guildHandler.removeGuildPerms(permission, user) cooldownHandler.addCooldown(user, Cooldown.Type.Join.name, settingsManager.getProperty(CooldownSettings.JOIN), TimeUnit.SECONDS) - ClaimUtils.kickMember(user, player, guild, settingsManager) + + if (ClaimUtils.isEnable(settingsManager)) { + val wrapper = WorldGuardWrapper.getInstance() + + for (claim in guild.claimedLand) { + ClaimEditor.kickMember(wrapper, claim, player) + } + } + guild.removeMember(asMember) currentCommandIssuer.sendInfo(Messages.BOOT__SUCCESSFUL, "{player}", user.name) guild.sendMessage(currentCommandManager, Messages.BOOT__PLAYER_KICKED, "{player}", user.name, "{kicker}", player.name) diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandRename.kt b/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandRename.kt index ef3b4393a..351fa9beb 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandRename.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandRename.kt @@ -35,13 +35,14 @@ import co.aikar.commands.annotation.Subcommand import co.aikar.commands.annotation.Syntax import me.glaremasters.guilds.Guilds import me.glaremasters.guilds.api.events.GuildRenameEvent +import me.glaremasters.guilds.claim.ClaimEditor import me.glaremasters.guilds.configuration.sections.CostSettings import me.glaremasters.guilds.configuration.sections.GuildSettings import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages -import me.glaremasters.guilds.utils.ClaimUtils +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.utils.Constants import me.glaremasters.guilds.utils.EconomyUtils import me.glaremasters.guilds.utils.StringUtils @@ -95,10 +96,11 @@ internal class CommandRename : BaseCommand() { if (ClaimUtils.isEnable(settingsManager)) { val wrapper = WorldGuardWrapper.getInstance() - if (ClaimUtils.checkAlreadyExist(wrapper, guild)) { - ClaimUtils.getGuildClaim(wrapper, player, guild).ifPresent { region -> - ClaimUtils.setEnterMessage(wrapper, region, settingsManager, guild) - ClaimUtils.setExitMessage(wrapper, region, settingsManager, guild) + + if (ClaimUtils.checkIfHaveClaims(wrapper, guild)) { + for (claim in guild.claimedLand) { + ClaimEditor.setEnterMessage(wrapper, claim, settingsManager, guild) + ClaimEditor.setExitMessage(wrapper, claim, settingsManager, guild) } } } diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandTransfer.kt b/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandTransfer.kt index 5e5b23516..a022d7e6a 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandTransfer.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/management/CommandTransfer.kt @@ -38,6 +38,8 @@ import co.aikar.commands.annotation.Syntax import co.aikar.commands.annotation.Values import me.glaremasters.guilds.Guilds import me.glaremasters.guilds.api.events.GuildTransferEvent +import me.glaremasters.guilds.claim.ClaimEditor +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler @@ -45,6 +47,7 @@ import me.glaremasters.guilds.messages.Messages import me.glaremasters.guilds.utils.Constants import org.bukkit.Bukkit import org.bukkit.entity.Player +import org.codemc.worldguardwrapper.WorldGuardWrapper @CommandAlias("%guilds") internal class CommandTransfer : BaseCommand() { @@ -78,6 +81,14 @@ internal class CommandTransfer : BaseCommand() { return } + if (ClaimUtils.isEnable(settingsManager)) { + val wrapper = WorldGuardWrapper.getInstance(); + + for (claim in guild.claimedLand) { + ClaimEditor.transferOwner(wrapper, claim, user.uniqueId, guild.guildMaster.uuid) + } + } + guild.transferGuild(player, user) currentCommandIssuer.sendInfo(Messages.TRANSFER__SUCCESS) diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandAccept.kt b/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandAccept.kt index 131714c3b..183cc584a 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandAccept.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandAccept.kt @@ -37,14 +37,14 @@ import co.aikar.commands.annotation.Subcommand import co.aikar.commands.annotation.Syntax import me.glaremasters.guilds.Guilds import me.glaremasters.guilds.api.events.GuildJoinEvent -import me.glaremasters.guilds.configuration.sections.PluginSettings +import me.glaremasters.guilds.claim.ClaimEditor import me.glaremasters.guilds.cooldowns.Cooldown import me.glaremasters.guilds.cooldowns.CooldownHandler import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages -import me.glaremasters.guilds.utils.ClaimUtils +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.utils.Constants import net.milkbowl.vault.permission.Permission import org.bukkit.Bukkit @@ -97,7 +97,10 @@ internal class CommandAccept : BaseCommand() { if (ClaimUtils.isEnable(settingsManager)) { val wrapper = WorldGuardWrapper.getInstance() - ClaimUtils.getGuildClaim(wrapper, player, guild).ifPresent { region -> ClaimUtils.addMember(region, player) } + + for (claim in guild.claimedLand) { + ClaimEditor.addMember(wrapper, claim, player) + } } currentCommandIssuer.sendInfo(Messages.ACCEPT__SUCCESSFUL, "{guild}", guild.name) diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandLeave.kt b/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandLeave.kt index 29e2322bb..253a462a0 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandLeave.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandLeave.kt @@ -39,14 +39,15 @@ import me.glaremasters.guilds.actions.ActionHandler import me.glaremasters.guilds.actions.ConfirmAction import me.glaremasters.guilds.api.events.GuildLeaveEvent import me.glaremasters.guilds.api.events.GuildRemoveEvent +import me.glaremasters.guilds.claim.ClaimEditor +import me.glaremasters.guilds.claim.ClaimRegionHandler import me.glaremasters.guilds.configuration.sections.CooldownSettings -import me.glaremasters.guilds.configuration.sections.PluginSettings import me.glaremasters.guilds.cooldowns.Cooldown import me.glaremasters.guilds.cooldowns.CooldownHandler import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler import me.glaremasters.guilds.messages.Messages -import me.glaremasters.guilds.utils.ClaimUtils +import me.glaremasters.guilds.claim.ClaimUtils import me.glaremasters.guilds.utils.Constants import net.milkbowl.vault.permission.Permission import org.bukkit.Bukkit @@ -103,7 +104,13 @@ internal class CommandLeave : BaseCommand() { guildHandler.removeAlliesOnDelete(guild) guildHandler.notifyAllies(guild, guilds.commandManager) cooldownHandler.addCooldown(player, cooldownName, cooldownTime, TimeUnit.SECONDS) - ClaimUtils.deleteWithGuild(guild, settingsManager) + + if (ClaimUtils.isEnable(settingsManager)) { + val wrapper = WorldGuardWrapper.getInstance() + + ClaimRegionHandler.deleteWithGuild(wrapper, guild) + } + guildHandler.removeGuild(guild) } else { guildHandler.removeGuildPerms(permission, player) @@ -111,7 +118,10 @@ internal class CommandLeave : BaseCommand() { if (ClaimUtils.isEnable(settingsManager)) { val wrapper = WorldGuardWrapper.getInstance() - ClaimUtils.getGuildClaim(wrapper, player, guild).ifPresent { region -> ClaimUtils.removeMember(region, player) } + + for (claim in guild.claimedLand) { + ClaimEditor.removeMember(wrapper, claim, player) + } } guild.removeMember(player) diff --git a/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandPromote.kt b/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandPromote.kt index 23a87fa5d..44383b6b3 100644 --- a/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandPromote.kt +++ b/src/main/kotlin/me/glaremasters/guilds/commands/member/CommandPromote.kt @@ -36,6 +36,7 @@ import co.aikar.commands.annotation.Subcommand import co.aikar.commands.annotation.Syntax import co.aikar.commands.annotation.Values import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.api.events.GuildClaimEvent import me.glaremasters.guilds.exceptions.ExpectationNotMet import me.glaremasters.guilds.guild.Guild import me.glaremasters.guilds.guild.GuildHandler diff --git a/src/main/kotlin/me/glaremasters/guilds/guis/GUIHandler.kt b/src/main/kotlin/me/glaremasters/guilds/guis/GUIHandler.kt index 9d5a655b3..6b59fab31 100644 --- a/src/main/kotlin/me/glaremasters/guilds/guis/GUIHandler.kt +++ b/src/main/kotlin/me/glaremasters/guilds/guis/GUIHandler.kt @@ -40,4 +40,5 @@ class GUIHandler(guilds: Guilds, settingsManager: SettingsManager, guildHandler: val info = InfoGUI(guilds, settingsManager, guildHandler, cooldownHandler, commandManager) val members = MembersGUI(guilds, settingsManager, guildHandler) val vaults = VaultGUI(guilds, settingsManager, guildHandler) + val map = MapGUI(guilds, settingsManager, guildHandler) } diff --git a/src/main/kotlin/me/glaremasters/guilds/guis/MapGUI.kt b/src/main/kotlin/me/glaremasters/guilds/guis/MapGUI.kt new file mode 100644 index 000000000..0bde13cad --- /dev/null +++ b/src/main/kotlin/me/glaremasters/guilds/guis/MapGUI.kt @@ -0,0 +1,189 @@ +/* + * MIT License + * + * Copyright (c) 2019 Glare + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.glaremasters.guilds.guis + +import ch.jalu.configme.SettingsManager +import com.cryptomorin.xseries.SkullUtils +import com.cryptomorin.xseries.XMaterial +import dev.triumphteam.gui.guis.Gui +import dev.triumphteam.gui.guis.GuiItem +import me.glaremasters.guilds.Guilds +import me.glaremasters.guilds.claim.ClaimRelations +import me.glaremasters.guilds.configuration.sections.GuildInfoSettings +import me.glaremasters.guilds.configuration.sections.GuildListSettings +import me.glaremasters.guilds.configuration.sections.GuildMapSettings + +import me.glaremasters.guilds.exte.addBackground +import me.glaremasters.guilds.guild.Guild +import me.glaremasters.guilds.guild.GuildHandler +import me.glaremasters.guilds.guild.GuildSkull +import me.glaremasters.guilds.utils.EconomyUtils +import me.glaremasters.guilds.utils.ItemBuilder +import me.glaremasters.guilds.utils.StringUtils +import org.bukkit.Material +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import org.codemc.worldguardwrapper.WorldGuardWrapper +import java.text.SimpleDateFormat + +class MapGUI(private val guilds: Guilds, private val settingsManager: SettingsManager, private val guildHandler: GuildHandler) { + private val items: MutableList + + fun get(player: Player): Gui { + val name = settingsManager.getProperty(GuildMapSettings.GUILD_MAP_NAME) + + val gui = Gui(5, StringUtils.color(name)) + + gui.setDefaultClickAction { event -> + event.isCancelled = true + } + + populateMap(gui, player) + setYouPoint(gui, player) + addBackground(gui) + + return gui + } + + private fun setYouPoint(gui: Gui, player: Player) { + val guild = guildHandler.getGuild(player) + + val defaultUrl = settingsManager.getProperty(GuildMapSettings.GUILD_MAP_CENTER_HEAD_DEFAULT_URL) + val useDefaultUrl = settingsManager.getProperty(GuildMapSettings.USE_DEFAULT_TEXTURE) + val item = if (!useDefaultUrl) SkullUtils.getSkull(player.uniqueId) else GuildSkull(defaultUrl).itemStack + val meta = item.itemMeta + + var name = settingsManager.getProperty(GuildMapSettings.GUILD_MAP_CENTER_NAME) + + name = StringUtils.color(name) + name = name.replace("{player}", if (guild.guildMaster != null) guild.guildMaster.name.toString() else "Master") + name = name.replace("{guild}", guild.name) + + meta?.setDisplayName(name) + meta?.lore = updatedLore(guild, settingsManager.getProperty(GuildMapSettings.GUILD_MAP_ITEM_LORE)) + + item.itemMeta = meta + + val guiItem = GuiItem(item) + + guiItem.setAction { event -> + event.isCancelled = true + guilds.guiHandler.members.get(guild, player).open(event.whoClicked) + } + + gui.setItem(3, 5, guiItem) + } + + private fun populateMap(gui: Gui, player: Player) { + val wrapper = WorldGuardWrapper.getInstance() + + val claims = ClaimRelations.getMap(wrapper, player, guilds) + + + val defaultUrl = settingsManager.getProperty(GuildMapSettings.GUILD_MAP_HEAD_DEFAULT_URL) + val useDefaultUrl = settingsManager.getProperty(GuildMapSettings.USE_DEFAULT_TEXTURE) + + for (i in 0..4) { + for (j in 0..8) { + + val claim = claims[i][j] + + if (claim != null) { + val guild = claim.getGuild(guilds.guildHandler) + + val item = if (!useDefaultUrl) guild.skull else GuildSkull(defaultUrl).itemStack + val meta = item.itemMeta + + var name = settingsManager.getProperty(GuildMapSettings.GUILD_MAP_ITEM_NAME) + + name = StringUtils.color(name) + name = name.replace("{player}", if (guild.guildMaster != null) guild.guildMaster.name.toString() else "Master") + name = name.replace("{guild}", guild.name) + + meta?.setDisplayName(name) + meta?.lore = updatedLore(guild, settingsManager.getProperty(GuildMapSettings.GUILD_MAP_ITEM_LORE)) + + item.itemMeta = meta + + val guiItem = GuiItem(item) + + guiItem.setAction { event -> + event.isCancelled = true + guilds.guiHandler.members.get(guild, player).open(event.whoClicked) + } + + gui.setItem(i+1, j+1, guiItem) + } + else { + val builder = ItemBuilder(XMaterial.GRAY_STAINED_GLASS_PANE.parseItem() ?: ItemStack(Material.GLASS_PANE)) + builder.setName(StringUtils.color("&r")) + val item = GuiItem(builder.build()) + item.setAction { event -> + event.isCancelled = true + } + gui.setItem(i+1, j+1, item) + } + } + } + } + + /** + * Update lore with replacements + * + * @param guild the guild being edited + * @param lore the lore to change + * @return updated lore + */ + private fun updatedLore(guild: Guild, lore: List): List { + val sdf = SimpleDateFormat(settingsManager.getProperty(GuildListSettings.GUI_TIME_FORMAT)) + val status = if (guild.isPrivate) settingsManager.getProperty(GuildInfoSettings.STATUS_PRIVATE) else settingsManager.getProperty(GuildInfoSettings.STATUS_PUBLIC) + + val tier = if (guild.tier != null) guild.tier.level.toString() else "1" + val tierName = if (guild.tier != null) guild.tier.name else "Default" + + val updated: MutableList = ArrayList() + + lore.forEach { line -> + updated.add(StringUtils.color(line + .replace("{guild-name}", guild.name) + .replace("{guild-prefix}", guild.prefix) + .replace("{guild-master}", guild.guildMaster.asOfflinePlayer.name.toString()) + .replace("{guild-status}", status) + .replace("{guild-tier}", tier) + .replace("{guild-balance}", EconomyUtils.format(guild.balance)) + .replace("{guild-member-count}", guild.size.toString()) + .replace("{guild-challenge-wins}", guild.guildScore.wins.toString()) + .replace("{guild-challenge-loses}", guild.guildScore.loses.toString()) + .replace("{creation}", sdf.format(guild.creationDate)) + .replace("{guild-tier-name}", tierName))) + } + + return updated + } + + init { + items = ArrayList() + } +} diff --git a/src/main/kotlin/me/glaremasters/guilds/messages/Messages.kt b/src/main/kotlin/me/glaremasters/guilds/messages/Messages.kt index 0603f5d8f..10e5a40e2 100644 --- a/src/main/kotlin/me/glaremasters/guilds/messages/Messages.kt +++ b/src/main/kotlin/me/glaremasters/guilds/messages/Messages.kt @@ -187,7 +187,10 @@ enum class Messages : MessageKeyProvider { REQUEST__COOLDOWN, CLAIM__ALREADY_EXISTS, + CLAIM__TOO_MANY_CLAIMS, CLAIM__OVERLAP, + CLAIM__MUST_BE_ADJACENT, + CLAIM__IS_IN_PROXIMITY, CLAIM__SUCCESS, CLAIM__HOOK_DISABLED, CLAIM__SIGN_NO_PERMISSION, diff --git a/src/main/kotlin/me/glaremasters/guilds/placeholders/PlaceholderAPI.kt b/src/main/kotlin/me/glaremasters/guilds/placeholders/PlaceholderAPI.kt index 1403cd93e..61d8fbe7a 100644 --- a/src/main/kotlin/me/glaremasters/guilds/placeholders/PlaceholderAPI.kt +++ b/src/main/kotlin/me/glaremasters/guilds/placeholders/PlaceholderAPI.kt @@ -71,6 +71,7 @@ class PlaceholderAPI(private val guildHandler: GuildHandler) : PlaceholderExpans "role" -> guild.getMember(player.uniqueId).role.name "tier" -> guild.tier.level.toString() "tier_name" -> guild.tier.name + "claimed_land_count" -> guild.claimedLand.size.toString() "balance" -> EconomyUtils.format(guild.balance) "balance_raw" -> guild.balance.toString() "code_amount" -> guild.codes.size.toString() diff --git a/src/main/kotlin/me/glaremasters/guilds/utils/ClaimUtils.kt b/src/main/kotlin/me/glaremasters/guilds/utils/ClaimUtils.kt deleted file mode 100644 index c123ecdfb..000000000 --- a/src/main/kotlin/me/glaremasters/guilds/utils/ClaimUtils.kt +++ /dev/null @@ -1,216 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2019 Glare - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package me.glaremasters.guilds.utils - -import ch.jalu.configme.SettingsManager -import java.util.Optional -import me.glaremasters.guilds.configuration.sections.ClaimSettings -import me.glaremasters.guilds.configuration.sections.HooksSettings -import me.glaremasters.guilds.guild.Guild -import org.bukkit.Bukkit -import org.bukkit.Location -import org.bukkit.OfflinePlayer -import org.bukkit.entity.Player -import org.codemc.worldguardwrapper.WorldGuardWrapper -import org.codemc.worldguardwrapper.flag.WrappedState -import org.codemc.worldguardwrapper.region.IWrappedDomain -import org.codemc.worldguardwrapper.region.IWrappedRegion -import org.codemc.worldguardwrapper.selection.ICuboidSelection - -/** - * Created by Glare - * Date: 4/4/2019 - * Time: 9:44 PM - */ -object ClaimUtils { - - @JvmStatic - fun isEnable(settingsManager: SettingsManager): Boolean { - return settingsManager.getProperty(HooksSettings.WORLDGUARD) - } - - @JvmStatic - fun getRadius(settingsManager: SettingsManager): Int { - return settingsManager.getProperty(ClaimSettings.RADIUS) - } - - @JvmStatic - fun claimPointOne(player: Player, settingsManager: SettingsManager): Location { - return player.location.subtract(getRadius(settingsManager).toDouble(), player.location.y, getRadius(settingsManager).toDouble()) - } - - @JvmStatic - fun claimPointTwo(player: Player, settingsManager: SettingsManager): Location { - return player.location.add(getRadius(settingsManager).toDouble(), player.world.maxHeight - player.location.y, getRadius(settingsManager).toDouble()) - } - - @JvmStatic - fun getClaimName(guild: Guild): String { - return guild.id.toString() - } - - @JvmStatic - fun checkAlreadyExist(wrapper: WorldGuardWrapper, guild: Guild): Boolean { - for (world in Bukkit.getWorlds()) { - val tempRegion = wrapper.getRegion(world, getClaimName(guild)) - try { - tempRegion.get().id - return true - } catch (ex: Exception) { - continue - } - } - return false - } - - @JvmStatic - fun checkAlreadyExist(wrapper: WorldGuardWrapper, player: Player, name: String): Boolean { - return wrapper.getRegion(player.world, name).isPresent - } - - @JvmStatic - fun regions(wrapper: WorldGuardWrapper, player: Player, settingsManager: SettingsManager): Set { - return wrapper.getRegions(claimPointOne(player, settingsManager), claimPointTwo(player, settingsManager)) - } - - @JvmStatic - fun checkOverlap(wrapper: WorldGuardWrapper, player: Player, settingsManager: SettingsManager): Boolean { - return regions(wrapper, player, settingsManager).isNotEmpty() - } - - @JvmStatic - fun isInDisabledWorld(player: Player, settingsManager: SettingsManager): Boolean { - return settingsManager.getProperty(ClaimSettings.DISABLED_WORLDS).contains(player.world.name) - } - - @JvmStatic - fun createClaim(wrapper: WorldGuardWrapper, guild: Guild, player: Player, settingsManager: SettingsManager) { - wrapper.addCuboidRegion(getClaimName(guild), claimPointOne(player, settingsManager), claimPointTwo(player, settingsManager)) - } - - @JvmStatic - fun createClaim(wrapper: WorldGuardWrapper, guild: Guild, selection: ICuboidSelection) { - wrapper.addCuboidRegion(getClaimName(guild), selection.minimumPoint, selection.maximumPoint) - } - - @JvmStatic - fun removeClaim(wrapper: WorldGuardWrapper, guild: Guild) { - for (world in Bukkit.getWorlds()) { - wrapper.removeRegion(world, getClaimName(guild)) - } - } - - @JvmStatic - fun getGuildClaim(wrapper: WorldGuardWrapper, player: Player, guild: Guild): Optional { - return wrapper.getRegion(player.world, getClaimName(guild)) - } - - @JvmStatic - fun getClaim(wrapper: WorldGuardWrapper, player: Player, name: String): Optional { - return wrapper.getRegion(player.world, name) - } - - @JvmStatic - fun getSelection(wrapper: WorldGuardWrapper, player: Player, name: String): ICuboidSelection { - return wrapper.getRegion(player.world, name).get().selection as ICuboidSelection - } - - @JvmStatic - fun addOwner(claim: IWrappedRegion, guild: Guild) { - claim.owners.addPlayer(guild.guildMaster.uuid) - } - - @JvmStatic - fun getMembers(claim: IWrappedRegion): IWrappedDomain { - return claim.members - } - - @JvmStatic - fun addMembers(claim: IWrappedRegion, guild: Guild) { - guild.members.forEach { - getMembers(claim).addPlayer(it.uuid) - } - } - - @JvmStatic - fun addMember(claim: IWrappedRegion, player: Player) { - getMembers(claim).addPlayer(player.uniqueId) - } - - @JvmStatic - fun removeMember(claim: IWrappedRegion, player: OfflinePlayer) { - getMembers(claim).removePlayer(player.uniqueId) - } - - @JvmStatic - fun kickMember(playerKicked: OfflinePlayer, playerExecuting: Player, guild: Guild, settingsManager: SettingsManager) { - if (isEnable(settingsManager)) { - val wrapper = WorldGuardWrapper.getInstance() - getGuildClaim(wrapper, playerExecuting, guild).ifPresent { r -> removeMember(r, playerKicked) } - } - } - - @JvmStatic - fun setEnterMessage(wrapper: WorldGuardWrapper, claim: IWrappedRegion, settingsManager: SettingsManager, guild: Guild) { - claim.setFlag(wrapper.getFlag("greeting", String::class.java).orElse(null), StringUtils.color(settingsManager.getProperty(ClaimSettings.ENTER_MESSAGE).replace("{guild}", guild.name).replace("{prefix}", guild.prefix))) - } - - @JvmStatic - fun setExitMessage(wrapper: WorldGuardWrapper, claim: IWrappedRegion, settingsManager: SettingsManager, guild: Guild) { - claim.setFlag(wrapper.getFlag("farewell", String::class.java).orElse(null), StringUtils.color(settingsManager.getProperty(ClaimSettings.EXIT_MESSAGE).replace("{guild}", guild.name).replace("{prefix}", guild.prefix))) - } - - @JvmStatic - fun checkPvpDisabled(player: Player): Boolean { - val wrapper = WorldGuardWrapper.getInstance() - val flag = wrapper.getFlag("pvp", WrappedState::class.java) - var state = WrappedState.ALLOW - - if (!flag.isPresent) { - return false - } - - val check = flag.map { f -> wrapper.queryFlag(player, player.location, f) } - check.ifPresent { - state = try { - it.get() - } catch (ex: Exception) { - WrappedState.ALLOW - } - } - return state == WrappedState.DENY - } - - @JvmStatic - fun deleteWithGuild(guild: Guild, settingsManager: SettingsManager) { - if (!isEnable(settingsManager)) { - return - } - val wrapper = WorldGuardWrapper.getInstance() - if (!checkAlreadyExist(wrapper, guild)) { - return - } - removeClaim(wrapper, guild) - } -} diff --git a/src/main/resources/languages/en-US.yml b/src/main/resources/languages/en-US.yml index 80a604081..492f15a1b 100644 --- a/src/main/resources/languages/en-US.yml +++ b/src/main/resources/languages/en-US.yml @@ -69,6 +69,7 @@ descriptions: language: "Change the language of the plugin messages for you" leave: "Leave your Guild" list: "List all Guilds" + map: "Map of claims around you" members: "Opens the Member List GUI" motd: "View your Guild's MOTD" motd-set: "Set your Guild's MOTD" @@ -246,8 +247,11 @@ accept: successful: "&aYou joined guild '{guild}&r&a' successfully" cooldown: "&cYou are currently on cooldown from joining a guild. Try again in {amount} seconds." claim: - already-exists: "&cYou already have a claim. Please remove your previous claim to create a new one" + already-exists: "&cYou already have a claim. Please remove your previous claim to create a new one." + too-many-claims: "&cYou already have used all your claims. Please remove your previous claims to create new ones." overlap: "&cYour claim could not be created because there is another claim nearby" + must-be-adjacent: "&cYour claim must be adjacent to another one of your claims!" + is-in-proximity: "&cYour claim must not be in proximity to another!" success: "&aNew claim created! It goes from {loc1} to {loc2}!" hook-disabled: "&cPlease enable claims in the config to utilize this feature" sign-not-enabled: "&cThis feature is not enabled. To use it, you must turn it on via the config."