From cf6a9972bbc11c891e2b2b263692af56f5f36e77 Mon Sep 17 00:00:00 2001 From: Shyanne Date: Sun, 24 Mar 2024 11:53:22 -0400 Subject: [PATCH 1/5] Updated IridiumCore and dependent APIs mostly build script changes - updated IridiumCore to 1.8.9 - updated IridiumSkyblockAPI to 4.0.8 - updated SuperiorSkyblockAPI to use new repo - updated script to include LandsAPI because this wasn't here for some reason - removed MassiveCore and MassiveCore Factions because this is no longer available to compile with [see their github profile](https://github.com/MassiveCraft) --- build.gradle.kts | 20 +++++------- .../iridiumenchants/IridiumEnchants.java | 2 -- .../support/FactionsSupport.java | 31 ------------------- .../support/FactionsSupportHolder.java | 24 -------------- .../support/FactionsUUIDSupport.java | 30 ------------------ .../support/FactionsUUIDSupportHolder.java | 24 -------------- 6 files changed, 7 insertions(+), 124 deletions(-) delete mode 100644 src/main/java/com/iridium/iridiumenchants/support/FactionsSupport.java delete mode 100644 src/main/java/com/iridium/iridiumenchants/support/FactionsSupportHolder.java delete mode 100644 src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupport.java delete mode 100644 src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupportHolder.java diff --git a/build.gradle.kts b/build.gradle.kts index 1007515..ddea55d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,6 @@ plugins { } group = "com.iridium" -version = "4.1.5" description = "IridiumEnchants" repositories { @@ -19,13 +18,14 @@ repositories { maven("https://hub.jeff-media.com/nexus/repository/jeff-media-public/") maven("https://maven.enginehub.org/repo/") maven("https://repo.codemc.org/repository/maven-public/") + maven("https://repo.bg-software.com/repository/api/") mavenCentral() } dependencies { // Dependencies that we want to shade in implementation("org.jetbrains:annotations:23.0.0") - implementation("com.iridium:IridiumCore:1.7.4") + implementation("com.iridium:IridiumCore:1.8.9") implementation("org.bstats:bstats-bukkit:3.0.0") implementation("de.jeff_media:SpigotUpdateChecker:1.3.2") @@ -33,21 +33,15 @@ dependencies { compileOnly("org.projectlombok:lombok:1.18.22") compileOnly("org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT") compileOnly("me.clip:placeholderapi:2.9.2") - compileOnly("be.maximvdw:MVdWPlaceholderAPI:2.1.1") { - exclude("org.spigotmc") - } - compileOnly("com.iridium:IridiumSkyblock:3.2.8") - compileOnly("com.massivecraft.massivesuper:MassiveCore:2.14.0") - compileOnly("com.massivecraft.massivesuper:Factions:2.14.0") - compileOnly("com.massivecraft:Factions:1.6.9.5-U0.6.8") { - exclude("com.darkblade12") - exclude("org.kitteh") - } + + compileOnly("com.iridium:IridiumSkyblock:4.0.8") + compileOnly("com.wasteofplastic:askyblock:3.0.9.4") compileOnly("com.github.TownyAdvanced:Towny:0.96.7.0") compileOnly("com.sk89q.worldguard:worldguard-bukkit:7.0.5-SNAPSHOT") compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.6-SNAPSHOT") - compileOnly("com.bgsoftware:SuperiorSkyblock:1.10.2") + compileOnly("com.bgsoftware:SuperiorSkyblockAPI:1.10.2") + compileOnly("com.github.angeschossen:LandsAPI:6.44.14") // Enable lombok annotation processing annotationProcessor("org.projectlombok:lombok:1.18.22") diff --git a/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java b/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java index 95d48ee..689f38f 100644 --- a/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java +++ b/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java @@ -153,8 +153,6 @@ public void registerSupport() { this.buildSupport = new ArrayList<>(); Arrays.asList( new ASkyblockSupportHolder(), - new FactionsSupportHolder(), - new FactionsUUIDSupportHolder(), new IridiumSkyblockSupportHolder(), new LandsSupportHolder(), new TownySupportHolder(), diff --git a/src/main/java/com/iridium/iridiumenchants/support/FactionsSupport.java b/src/main/java/com/iridium/iridiumenchants/support/FactionsSupport.java deleted file mode 100644 index c1c1a92..0000000 --- a/src/main/java/com/iridium/iridiumenchants/support/FactionsSupport.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.iridium.iridiumenchants.support; - -import com.massivecraft.factions.Rel; -import com.massivecraft.factions.entity.BoardColl; -import com.massivecraft.factions.entity.Faction; -import com.massivecraft.factions.entity.MPlayer; -import com.massivecraft.massivecore.ps.PS; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; - -public class FactionsSupport implements BuildSupport, FriendlySupport { - @Override - public boolean canBuild(Player player, Location location) { - Faction P = MPlayer.get(player).getFaction(); - Faction B = BoardColl.get().getFactionAt(PS.valueOf(location)); - return (ChatColor.stripColor(B.getName()).equalsIgnoreCase("Wilderness")) || (P == B); - } - - @Override - public boolean isFriendly(LivingEntity player, LivingEntity livingEntity) { - if (player instanceof Player && livingEntity instanceof Player) { - Faction p = MPlayer.get(player).getFaction(); - Faction o = MPlayer.get(livingEntity).getFaction(); - Rel r = MPlayer.get(player).getRelationTo(MPlayer.get(livingEntity)); - return r.isFriend() || p == o; - } - return false; - } -} diff --git a/src/main/java/com/iridium/iridiumenchants/support/FactionsSupportHolder.java b/src/main/java/com/iridium/iridiumenchants/support/FactionsSupportHolder.java deleted file mode 100644 index 5c7f34a..0000000 --- a/src/main/java/com/iridium/iridiumenchants/support/FactionsSupportHolder.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.iridium.iridiumenchants.support; - -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -import java.util.function.Supplier; - -public class FactionsSupportHolder implements BuildSupportHolder, FriendlySupportHolder { - @Override - public boolean isInstalled() { - Plugin plugin = Bukkit.getPluginManager().getPlugin("Factions"); - return plugin != null && !plugin.getDescription().getAuthors().contains("drtshock"); - } - - @Override - public Supplier friendlySupport() { - return FactionsSupport::new; - } - - @Override - public Supplier buildSupport() { - return FactionsSupport::new; - } -} diff --git a/src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupport.java b/src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupport.java deleted file mode 100644 index 6d697a9..0000000 --- a/src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupport.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.iridium.iridiumenchants.support; - -import com.massivecraft.factions.Board; -import com.massivecraft.factions.FLocation; -import com.massivecraft.factions.FPlayers; -import com.massivecraft.factions.Faction; -import com.massivecraft.factions.perms.Relation; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; - -public class FactionsUUIDSupport implements BuildSupport, FriendlySupport { - @Override - public boolean canBuild(Player player, Location location) { - Faction faction = FPlayers.getInstance().getByPlayer(player).getFaction(); - FLocation loc = new FLocation(location); - Faction B = Board.getInstance().getFactionAt(loc); - return (ChatColor.stripColor(B.getTag()).equalsIgnoreCase("Wilderness")) || (faction == B); - } - - @Override - public boolean isFriendly(LivingEntity player, LivingEntity livingEntity) { - if (player instanceof Player && livingEntity instanceof Player) { - Relation r = FPlayers.getInstance().getByPlayer((Player) player).getRelationTo(FPlayers.getInstance().getByPlayer((Player) livingEntity)); - return r.isAlly() || r.isMember(); - } - return false; - } -} diff --git a/src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupportHolder.java b/src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupportHolder.java deleted file mode 100644 index 5a8e0e5..0000000 --- a/src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupportHolder.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.iridium.iridiumenchants.support; - -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -import java.util.function.Supplier; - -public class FactionsUUIDSupportHolder implements BuildSupportHolder, FriendlySupportHolder { - @Override - public boolean isInstalled() { - Plugin plugin = Bukkit.getPluginManager().getPlugin("Factions"); - return plugin != null && plugin.getDescription().getAuthors().contains("drtshock"); - } - - @Override - public Supplier friendlySupport() { - return FactionsUUIDSupport::new; - } - - @Override - public Supplier buildSupport() { - return FactionsUUIDSupport::new; - } -} From e233e0936e76a9097b75486dffe1434b27339d33 Mon Sep 17 00:00:00 2001 From: Shyanne Date: Fri, 3 May 2024 11:57:20 -0400 Subject: [PATCH 2/5] Added the OreSiphon enchant - updated WordUtils and NotImplementedException from core - fixed the name and display name for enchantments being swapped in the GUI - Added the VeinMine effect, with config options to determine what blocks you can mine with it, whether the enchantment can break tools, whether to allow the wrong tool to mine it, and what the cap on processed blocks is. The effect can be configured to have a chance not to damage the tool being used. - ill be real i have no idea what happened in the DropHead class --- build.gradle.kts | 3 +- .../iridiumenchants/CooldownProvider.java | 2 +- .../iridiumenchants/IridiumEnchants.java | 1 + .../configs/Configuration.java | 28 +++ .../configs/CustomEnchants.java | 5 + .../iridiumenchants/configs/GKits.java | 65 +++--- .../iridiumenchants/configs/Messages.java | 2 + .../iridiumenchants/effects/DropHead.java | 11 +- .../iridiumenchants/effects/VeinMine.java | 201 ++++++++++++++++++ .../gui/EnchantmentListGUI.java | 6 +- .../gui/EnchantmentTierListGUI.java | 6 +- .../managers/CustomEnchantManager.java | 2 +- .../support/IridiumSkyblockSupport.java | 2 +- 13 files changed, 286 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java diff --git a/build.gradle.kts b/build.gradle.kts index ddea55d..07623e5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,6 +5,7 @@ plugins { } group = "com.iridium" +version = "4.1.7" description = "IridiumEnchants" repositories { @@ -25,7 +26,7 @@ repositories { dependencies { // Dependencies that we want to shade in implementation("org.jetbrains:annotations:23.0.0") - implementation("com.iridium:IridiumCore:1.8.9") + implementation("com.iridium:IridiumCore:1.9.1.jar") implementation("org.bstats:bstats-bukkit:3.0.0") implementation("de.jeff_media:SpigotUpdateChecker:1.3.2") diff --git a/src/main/java/com/iridium/iridiumenchants/CooldownProvider.java b/src/main/java/com/iridium/iridiumenchants/CooldownProvider.java index e3704d4..47e985f 100644 --- a/src/main/java/com/iridium/iridiumenchants/CooldownProvider.java +++ b/src/main/java/com/iridium/iridiumenchants/CooldownProvider.java @@ -1,6 +1,6 @@ package com.iridium.iridiumenchants; -import org.apache.commons.lang.NotImplementedException; +import com.iridium.iridiumcore.dependencies.commons.lang3.NotImplementedException; import java.time.Duration; import java.util.HashMap; diff --git a/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java b/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java index 689f38f..5bebcfb 100644 --- a/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java +++ b/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java @@ -201,6 +201,7 @@ public void registerEffects() { effects.put("TELEPATHY", new Telepathy()); effects.put("ADD_EXTRA_HEALTH", new AddExtraHealth()); effects.put("REMOVE_EXTRA_HEALTH", new RemoveExtraHealth()); + effects.put("VEINMINE", new VeinMine()); } public void registerConditions() { diff --git a/src/main/java/com/iridium/iridiumenchants/configs/Configuration.java b/src/main/java/com/iridium/iridiumenchants/configs/Configuration.java index 23f1da9..ce0f5e3 100644 --- a/src/main/java/com/iridium/iridiumenchants/configs/Configuration.java +++ b/src/main/java/com/iridium/iridiumenchants/configs/Configuration.java @@ -33,6 +33,34 @@ public class Configuration { .put(XMaterial.DEEPSLATE_GOLD_ORE, XMaterial.GOLD_INGOT) .put(XMaterial.SAND, XMaterial.GLASS) .build(); + + public List veinMiner = Arrays.asList( + XMaterial.COAL_ORE, + XMaterial.DEEPSLATE_COAL_ORE, + XMaterial.COPPER_ORE, + XMaterial.DEEPSLATE_COPPER_ORE, + XMaterial.IRON_ORE, + XMaterial.DEEPSLATE_IRON_ORE, + XMaterial.LAPIS_ORE, + XMaterial.DEEPSLATE_LAPIS_ORE, + XMaterial.REDSTONE_ORE, + XMaterial.DEEPSLATE_REDSTONE_ORE, + XMaterial.GOLD_ORE, + XMaterial.DEEPSLATE_GOLD_ORE, + XMaterial.NETHER_GOLD_ORE, + XMaterial.EMERALD_ORE, + XMaterial.DEEPSLATE_EMERALD_ORE, + XMaterial.DIAMOND_ORE, + XMaterial.DEEPSLATE_DIAMOND_ORE, + XMaterial.NETHER_QUARTZ_ORE, + XMaterial.ANCIENT_DEBRIS + ); + + public boolean veinMinerDropsAtBreakLocation = true; + public boolean veinMinerBreaksTools = false; + public int veinMinerCap = 25; + public boolean veinMineWithWrongTool = false; + public List infusionBlacklist = Arrays.asList(XMaterial.BEDROCK, XMaterial.SPAWNER, XMaterial.CHEST, XMaterial.TRAPPED_CHEST, XMaterial.WATER, XMaterial.LAVA); public Map tiers = ImmutableMap.builder() .put("Common", new Tier(new Item(XMaterial.ENCHANTED_BOOK, 11, 1, "&b&lCOMMON ENCHANTMENT", Arrays.asList("&e&lCOST: &7%cost% levels", "", "&e&l[!] &7Left Click to purchase a random common enchantment", "&e&l[!] &7Right Click to view all common enchantments")), 20, ExperienceType.LEVEL)) diff --git a/src/main/java/com/iridium/iridiumenchants/configs/CustomEnchants.java b/src/main/java/com/iridium/iridiumenchants/configs/CustomEnchants.java index 9f767c0..eb52ec4 100644 --- a/src/main/java/com/iridium/iridiumenchants/configs/CustomEnchants.java +++ b/src/main/java/com/iridium/iridiumenchants/configs/CustomEnchants.java @@ -238,5 +238,10 @@ public class CustomEnchants { .put("Telepathy", new CustomEnchant("&7Telepathy", "Puts all blocks you break into your inventory", "Tool", "BLOCK_BREAK", ImmutableMap.builder() .put(1, new Level(100, Collections.singletonList("Common"), Collections.singletonList("TELEPATHY"), Collections.emptyList())) .build(), true, true)) + .put("OreSiphon", new CustomEnchant("&7Ore Siphon", "Breaks adjacent ores of the same type", "Tool", "BLOCK_BREAK", ImmutableMap.builder() + .put(1, new Level(100, Collections.singletonList("Common"), Collections.singletonList("VEINMINE:15"), Collections.emptyList())) + .put(2, new Level(100, Collections.singletonList("Elite"), Collections.singletonList("VEINMINE:35"), Collections.emptyList())) + .put(3, new Level(100, Collections.singletonList("Legendary"), Collections.singletonList("VEINMINE:65"), Collections.emptyList())) + .build(), true, true)) .build(); } diff --git a/src/main/java/com/iridium/iridiumenchants/configs/GKits.java b/src/main/java/com/iridium/iridiumenchants/configs/GKits.java index 42db029..a2fc2f8 100644 --- a/src/main/java/com/iridium/iridiumenchants/configs/GKits.java +++ b/src/main/java/com/iridium/iridiumenchants/configs/GKits.java @@ -4,40 +4,41 @@ import com.iridium.iridiumcore.Item; import com.iridium.iridiumcore.dependencies.xseries.XMaterial; import com.iridium.iridiumenchants.GKit; -import org.bukkit.enchantments.Enchantment; import java.util.Arrays; import java.util.Map; +import static com.iridium.iridiumcore.dependencies.xseries.XEnchantment.*; + public class GKits { public Map gkits = ImmutableMap.builder() .put("Frosty", new GKit(259200, "iridiumenchants.gkits.frosty", new Item(XMaterial.SNOWBALL, 11, 1, "&b&lFrosty Kit", Arrays.asList("&bCooldown: &7%days% Days %hours% Hours %minutes% Minutes and %seconds% Seconds", "", "&b&l[!] &7Left click to redeem this Gkit", "&b&l[!] &7Right click to preview this Gkit")), ImmutableMap.builder() .put(1, new GKit.GKitItem(XMaterial.DIAMOND_HELMET, 1, "&b&lFrosty Helmet", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Replenish", 1) .build())) .put(2, new GKit.GKitItem(XMaterial.DIAMOND_CHESTPLATE, 1, "&b&lFrosty Chestplate", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Resistance", 3) .put("Evade", 3) .build())) .put(3, new GKit.GKitItem(XMaterial.DIAMOND_LEGGINGS, 1, "&b&lFrosty Leggings", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Jacket", 3) .build())) .put(4, new GKit.GKitItem(XMaterial.DIAMOND_BOOTS, 1, "&b&lFrosty Boots", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Frosty", 1) .put("Speed", 3) .put("Jump", 3) .build())) .put(5, new GKit.GKitItem(XMaterial.DIAMOND_SWORD, 1, "&b&lFrosty Sword", ImmutableMap.builder() - .put(Enchantment.DAMAGE_ALL.getName(), 5) - .put(Enchantment.DURABILITY.getName(), 3) + .put(DAMAGE_ALL.name(), 5) + .put(DURABILITY.name(), 3) .put("IceAspect", 3) .put("Poison", 3) .put("Renewal", 3) @@ -45,32 +46,32 @@ public class GKits { .build())) .put("Spooky", new GKit(259200, "iridiumenchants.gkits.spooky", new Item(XMaterial.PUMPKIN, 13, 1, "&c&lSpooky Kit", Arrays.asList("&cCooldown: &7%days% Days %hours% Hours %minutes% Minutes and %seconds% Seconds", "", "&c&l[!] &7Left click to redeem this Gkit", "&c&l[!] &7Right click to preview this Gkit")), ImmutableMap.builder() .put(1, new GKit.GKitItem(XMaterial.DIAMOND_HELMET, 1, "&c&lSpooky Helmet", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Replenish", 1) .build())) .put(2, new GKit.GKitItem(XMaterial.DIAMOND_CHESTPLATE, 1, "&c&lSpooky Chestplate", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Netherskin", 1) .put("Ignition", 3) .put("SelfDestruct", 3) .build())) .put(3, new GKit.GKitItem(XMaterial.DIAMOND_LEGGINGS, 1, "&c&lSpooky Leggings", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Jacket", 3) .build())) .put(4, new GKit.GKitItem(XMaterial.DIAMOND_BOOTS, 1, "&c&lSpooky Boots", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Magma", 1) .put("Speed", 3) .put("Jump", 3) .build())) .put(5, new GKit.GKitItem(XMaterial.DIAMOND_AXE, 1, "&c&lSpooky Axe", ImmutableMap.builder() - .put(Enchantment.DAMAGE_ALL.getName(), 5) - .put(Enchantment.DURABILITY.getName(), 3) + .put(DAMAGE_ALL.name(), 5) + .put(DURABILITY.name(), 3) .put("Decapitate", 3) .put("Wither", 3) .put("Thunder", 1) @@ -78,35 +79,35 @@ public class GKits { .build())) .put("Valentines", new GKit(259200, "iridiumenchants.gkits.valentines", new Item(XMaterial.BOW, 15, 1, "&d&lValentine's Kit", Arrays.asList("&dCooldown: &7%days% Days %hours% Hours %minutes% Minutes and %seconds% Seconds", "", "&d&l[!] &7Left click to redeem this Gkit", "&d&l[!] &7Right click to preview this Gkit")), ImmutableMap.builder() .put(1, new GKit.GKitItem(XMaterial.DIAMOND_HELMET, 1, "&d&lValentine's Helmet", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Replenish", 1) .put("Visionary", 1) .put("Aquatic", 1) .build())) .put(2, new GKit.GKitItem(XMaterial.DIAMOND_CHESTPLATE, 1, "&d&lValentine's Chestplate", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Resistance", 3) .put("Evade", 3) .put("Cursed", 3) .put("Grace", 3) .build())) .put(3, new GKit.GKitItem(XMaterial.DIAMOND_LEGGINGS, 1, "&d&lValentine's Leggings", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Jacket", 3) .build())) .put(4, new GKit.GKitItem(XMaterial.DIAMOND_BOOTS, 1, "&d&lValentine's Boots", ImmutableMap.builder() - .put(Enchantment.PROTECTION_ENVIRONMENTAL.getName(), 4) - .put(Enchantment.DURABILITY.getName(), 3) + .put(PROTECTION_ENVIRONMENTAL.name(), 4) + .put(DURABILITY.name(), 3) .put("Speed", 3) .put("Jump", 3) .build())) .put(5, new GKit.GKitItem(XMaterial.BOW, 1, "&d&lValentine's Bow", ImmutableMap.builder() - .put(Enchantment.ARROW_INFINITE.getName(), 5) - .put(Enchantment.DURABILITY.getName(), 3) - .put(Enchantment.ARROW_DAMAGE.getName(), 5) + .put(ARROW_INFINITE.name(), 5) + .put(DURABILITY.name(), 3) + .put(ARROW_DAMAGE.name(), 5) .put("Multishot", 3) .put("SoulReaper", 3) .put("Piercing", 3) diff --git a/src/main/java/com/iridium/iridiumenchants/configs/Messages.java b/src/main/java/com/iridium/iridiumenchants/configs/Messages.java index 6086195..6b25397 100644 --- a/src/main/java/com/iridium/iridiumenchants/configs/Messages.java +++ b/src/main/java/com/iridium/iridiumenchants/configs/Messages.java @@ -25,4 +25,6 @@ public class Messages { public String noGkit = "%prefix% &7No GKit by that name exists."; public String gaveGKit = "%prefix% &7You gave the %name% gkit to %player%."; public String recievedGKit = "%prefix% &7You received a %name% gkit from %player%."; + public String cannotVeinMine = "%prefix% &7Your &e%tool% &7is low on durability, so you cannot break the block(s)."; + public String veinMineWrongTool = "%prefix% &7Your %tool% is not capable of getting drops from this block, so it will not be mined."; } diff --git a/src/main/java/com/iridium/iridiumenchants/effects/DropHead.java b/src/main/java/com/iridium/iridiumenchants/effects/DropHead.java index b05a2cd..9082c7a 100644 --- a/src/main/java/com/iridium/iridiumenchants/effects/DropHead.java +++ b/src/main/java/com/iridium/iridiumenchants/effects/DropHead.java @@ -9,19 +9,18 @@ public class DropHead implements Effect { @Override public void apply(LivingEntity player, LivingEntity target, String[] args, ItemStack itemStack, Event event) { + + ItemStack head = XMaterial.PLAYER_HEAD.parseItem(); + if (head == null) return; + SkullMeta meta = (SkullMeta) head.getItemMeta(); + if (args.length == 2 && args[1].equalsIgnoreCase("target")) { if (target == null) return; - ItemStack head = XMaterial.PLAYER_HEAD.parseItem(); - if (head == null) return; - SkullMeta meta = (SkullMeta) head.getItemMeta(); meta.setOwner(target.getName()); head.setItemMeta(meta); target.getLocation().getWorld().dropItem(target.getLocation(), head); } else { if (player == null) return; - ItemStack head = XMaterial.PLAYER_HEAD.parseItem(); - if (head == null) return; - SkullMeta meta = (SkullMeta) head.getItemMeta(); meta.setOwner(player.getName()); head.setItemMeta(meta); player.getLocation().getWorld().dropItem(player.getLocation(), head); diff --git a/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java b/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java new file mode 100644 index 0000000..e39e455 --- /dev/null +++ b/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java @@ -0,0 +1,201 @@ +package com.iridium.iridiumenchants.effects; + +import com.iridium.iridiumcore.dependencies.commons.lang3.text.WordUtils; +import com.iridium.iridiumcore.dependencies.xseries.XMaterial; +import com.iridium.iridiumcore.utils.StringUtils; +import com.iridium.iridiumenchants.IridiumEnchants; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.*; + +public class VeinMine implements Effect { + + private final HashSet blocksBuffer = new HashSet<>(), recent = new HashSet<>(); + private boolean safetyFired = false; + + @Override + public void apply(LivingEntity player, LivingEntity target, String[] args, ItemStack itemStack, Event event) { + if (player instanceof Player && event instanceof BlockBreakEvent) { + Player realPlayer = (Player) player; + BlockBreakEvent blockBreakEvent = (BlockBreakEvent) event; + Block eventBlock = blockBreakEvent.getBlock(); + + if (IridiumEnchants.getInstance().getConfiguration().veinMiner.contains(XMaterial.matchXMaterial(eventBlock.getType()))) { + blockBreakEvent.setCancelled(true); + + ItemStack mainHand = realPlayer.getInventory().getItemInMainHand(); + ItemStack offHand = realPlayer.getInventory().getItemInOffHand(); + ItemStack usedTool; + if(isTool(mainHand)) usedTool = mainHand; + else usedTool = offHand; + + HashSet blocksToMine = allocateBlocks(eventBlock); + int blockCount = blocksToMine.size(); + + int chance; + if (args.length < 2) chance = 100; + else { + try { + chance = Integer.parseInt(args[1]); + } catch (NumberFormatException exception) { + chance = 100; + } + } + + if(eventBlock.getDrops(usedTool).isEmpty()) { + String displayName; + if(usedTool.getItemMeta().hasDisplayName()) displayName = usedTool.getItemMeta().getDisplayName(); + else displayName = usedTool.getType().toString().toLowerCase(); + + player.sendMessage(StringUtils.color(IridiumEnchants.getInstance().getMessages().veinMineWrongTool + .replace("%prefix%", IridiumEnchants.getInstance().getConfiguration().prefix) + .replace("%tool%", WordUtils.capitalize(displayName.replace("_", " "))) + )); + return; + } + + if(usedTool.getItemMeta() instanceof Damageable) { + + int toolDamage = damageTool(blockCount, usedTool, chance); + + if (safetyFired) { + + String displayName; + if(usedTool.getItemMeta().hasDisplayName()) displayName = usedTool.getItemMeta().getDisplayName(); + else displayName = usedTool.getType().toString().toLowerCase(); + + player.sendMessage(StringUtils.color(IridiumEnchants.getInstance().getMessages().cannotVeinMine + .replace("%prefix%", IridiumEnchants.getInstance().getConfiguration().prefix) + .replace("%tool%", WordUtils.capitalize(displayName.replace("_", " "))) + )); + safetyFired = false; + return; + } + + Damageable toolMeta = (Damageable) usedTool.getItemMeta(); + toolMeta.setDamage(toolDamage); + usedTool.setItemMeta(toolMeta); + } + + if (IridiumEnchants.getInstance().getConfiguration().veinMinerDropsAtBreakLocation) { + ArrayList> blockDrops = new ArrayList<>(); + + for (Block adjacentBlock : blocksToMine) { + blockDrops.add(adjacentBlock.getDrops(usedTool)); + } + + for (Collection drops : blockDrops) { + for (ItemStack item : drops) { + eventBlock.getLocation().getWorld().dropItemNaturally(eventBlock.getLocation(), item); + } + } + + } else { + for (Block adjacentBlock : blocksToMine) { + for (ItemStack item : adjacentBlock.getDrops(usedTool)) { + adjacentBlock.getLocation().getWorld().dropItemNaturally(adjacentBlock.getLocation(), item); + } + } + } + + for(Block block : blocksToMine) { + block.setType(getAir(block)); + } + } + } + } + + private boolean isTool(ItemStack itemStack) { + return itemStack.getType().name().toUpperCase().contains("_AXE") + || itemStack.getType().name().toUpperCase().contains("PICKAXE") + || itemStack.getType().name().toUpperCase().contains("SHOVEL") + || itemStack.getType().name().toUpperCase().contains("HOE"); + } + + private int damageTool(int blockCount, ItemStack itemStack, int chance) { + + ItemMeta toolMeta = itemStack.getItemMeta(); + int toolDamage = 0; + if (toolMeta instanceof Damageable) { + Damageable realToolMeta = (Damageable) toolMeta; + int maxToolDamage = itemStack.getType().getMaxDurability(); + toolDamage = realToolMeta.getDamage(); + + Random random = new Random(); + int rolledChance = random.nextInt(101); + if (chance <= rolledChance) { + if (toolDamage + blockCount >= maxToolDamage && !IridiumEnchants.getInstance().getConfiguration().veinMinerBreaksTools) { + safetyFired = true; + toolDamage = maxToolDamage - 1; + } else { toolDamage = toolDamage + blockCount; } + } + } + + return toolDamage; + } + + public HashSet allocateBlocks(Block block) { + HashSet blocks = new HashSet<>(); + this.recent.add(block); + int maxVeinSize = IridiumEnchants.getInstance().getConfiguration().veinMinerCap; + + while (blocksBuffer.size() < maxVeinSize) { + recentSearch: + for (Block current : recent) { + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + + if (x == 0 && y == 0 && z == 0) continue; + + Block relative = current.getRelative(x, y, z); + if (blocks.contains(relative) || blocksBuffer.contains(relative)) { + continue; + } + + if (relative.getType() != current.getType()) { + continue; + } + + if (blocks.size() + blocksBuffer.size() >= maxVeinSize) { + break recentSearch; + } + + this.blocksBuffer.add(relative); + } + } + } + } + + if (blocksBuffer.isEmpty()) { + break; + } + + this.recent.clear(); + this.recent.addAll(blocksBuffer); + blocks.addAll(blocksBuffer); + + this.blocksBuffer.clear(); + } + + this.recent.clear(); + return blocks; + } + + public Material getAir(Block block) { + for(BlockFace blockFace : BlockFace.values()) { + if(block.getRelative(blockFace).getType() == Material.CAVE_AIR) return Material.CAVE_AIR; + } + return Material.AIR; + } +} diff --git a/src/main/java/com/iridium/iridiumenchants/gui/EnchantmentListGUI.java b/src/main/java/com/iridium/iridiumenchants/gui/EnchantmentListGUI.java index aeab450..680051f 100644 --- a/src/main/java/com/iridium/iridiumenchants/gui/EnchantmentListGUI.java +++ b/src/main/java/com/iridium/iridiumenchants/gui/EnchantmentListGUI.java @@ -7,7 +7,7 @@ import com.iridium.iridiumenchants.CustomEnchant; import com.iridium.iridiumenchants.IridiumEnchants; import com.iridium.iridiumenchants.configs.inventories.NoItemGUI; -import org.apache.commons.lang.WordUtils; +import com.iridium.iridiumcore.dependencies.commons.lang3.text.WordUtils; import org.bukkit.Bukkit; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -36,8 +36,8 @@ public Inventory getInventory() { @Override public ItemStack getItemStack(Map.Entry customEnchantEntry) { return ItemStackUtils.makeItem(IridiumEnchants.getInstance().getInventories().enchantsListGUI.item, Arrays.asList( - new Placeholder("enchant_name", WordUtils.capitalize(customEnchantEntry.getKey())), - new Placeholder("enchant_type", WordUtils.capitalize(customEnchantEntry.getValue().type)), + new Placeholder("enchant_name", WordUtils.capitalize(customEnchantEntry.getValue().displayName)), + new Placeholder("enchant_type", WordUtils.capitalize(customEnchantEntry.getKey())), new Placeholder("enchant_description", customEnchantEntry.getValue().description) )); } diff --git a/src/main/java/com/iridium/iridiumenchants/gui/EnchantmentTierListGUI.java b/src/main/java/com/iridium/iridiumenchants/gui/EnchantmentTierListGUI.java index 318c2d9..c19ad6f 100644 --- a/src/main/java/com/iridium/iridiumenchants/gui/EnchantmentTierListGUI.java +++ b/src/main/java/com/iridium/iridiumenchants/gui/EnchantmentTierListGUI.java @@ -10,7 +10,7 @@ import com.iridium.iridiumenchants.configs.inventories.NoItemGUI; import lombok.AllArgsConstructor; import lombok.Getter; -import org.apache.commons.lang.WordUtils; +import com.iridium.iridiumcore.dependencies.commons.lang3.text.WordUtils; import org.bukkit.Bukkit; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -38,8 +38,8 @@ public Inventory getInventory() { @Override public ItemStack getItemStack(CustomEnchantLevel customEnchantLevel) { return ItemStackUtils.makeItem(IridiumEnchants.getInstance().getInventories().enchantsTierListGUI.item, Arrays.asList( - new Placeholder("enchant_name", WordUtils.capitalize(customEnchantLevel.customEnchant.getKey())), - new Placeholder("enchant_type", WordUtils.capitalize(customEnchantLevel.customEnchant.getValue().type)), + new Placeholder("enchant_name", WordUtils.capitalize(customEnchantLevel.customEnchant.getValue().displayName)), + new Placeholder("enchant_type", WordUtils.capitalize(customEnchantLevel.customEnchant.getKey())), new Placeholder("enchant_description", customEnchantLevel.customEnchant.getValue().description), new Placeholder("enchant_level", IridiumEnchants.getInstance().getCustomEnchantManager().toRomanNumerals(customEnchantLevel.level.getKey())) )); diff --git a/src/main/java/com/iridium/iridiumenchants/managers/CustomEnchantManager.java b/src/main/java/com/iridium/iridiumenchants/managers/CustomEnchantManager.java index 25aed39..291cd75 100644 --- a/src/main/java/com/iridium/iridiumenchants/managers/CustomEnchantManager.java +++ b/src/main/java/com/iridium/iridiumenchants/managers/CustomEnchantManager.java @@ -9,7 +9,7 @@ import com.iridium.iridiumenchants.*; import com.iridium.iridiumenchants.conditions.Condition; import com.iridium.iridiumenchants.effects.Effect; -import org.apache.commons.lang.WordUtils; +import com.iridium.iridiumcore.dependencies.commons.lang3.text.WordUtils; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; diff --git a/src/main/java/com/iridium/iridiumenchants/support/IridiumSkyblockSupport.java b/src/main/java/com/iridium/iridiumenchants/support/IridiumSkyblockSupport.java index 53902f8..8347b04 100644 --- a/src/main/java/com/iridium/iridiumenchants/support/IridiumSkyblockSupport.java +++ b/src/main/java/com/iridium/iridiumenchants/support/IridiumSkyblockSupport.java @@ -1,9 +1,9 @@ package com.iridium.iridiumenchants.support; -import com.iridium.iridiumskyblock.PermissionType; import com.iridium.iridiumskyblock.api.IridiumSkyblockAPI; import com.iridium.iridiumskyblock.database.Island; import com.iridium.iridiumskyblock.database.User; +import com.iridium.iridiumteams.PermissionType; import org.bukkit.Location; import org.bukkit.OfflinePlayer; import org.bukkit.entity.LivingEntity; From 0fcd1e16e8020132a1048f006192cae59c48af47 Mon Sep 17 00:00:00 2001 From: Peaches_MLG Date: Fri, 3 May 2024 17:09:31 +0100 Subject: [PATCH 3/5] Revert --- .../iridiumenchants/IridiumEnchants.java | 2 ++ .../support/FactionsSupport.java | 31 +++++++++++++++++++ .../support/FactionsSupportHolder.java | 24 ++++++++++++++ .../support/FactionsUUIDSupportHolder.java | 24 ++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 src/main/java/com/iridium/iridiumenchants/support/FactionsSupport.java create mode 100644 src/main/java/com/iridium/iridiumenchants/support/FactionsSupportHolder.java create mode 100644 src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupportHolder.java diff --git a/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java b/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java index 5bebcfb..1fbc54a 100644 --- a/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java +++ b/src/main/java/com/iridium/iridiumenchants/IridiumEnchants.java @@ -153,6 +153,8 @@ public void registerSupport() { this.buildSupport = new ArrayList<>(); Arrays.asList( new ASkyblockSupportHolder(), + new FactionsSupportHolder(), + new FactionsUUIDSupportHolder(), new IridiumSkyblockSupportHolder(), new LandsSupportHolder(), new TownySupportHolder(), diff --git a/src/main/java/com/iridium/iridiumenchants/support/FactionsSupport.java b/src/main/java/com/iridium/iridiumenchants/support/FactionsSupport.java new file mode 100644 index 0000000..c1c1a92 --- /dev/null +++ b/src/main/java/com/iridium/iridiumenchants/support/FactionsSupport.java @@ -0,0 +1,31 @@ +package com.iridium.iridiumenchants.support; + +import com.massivecraft.factions.Rel; +import com.massivecraft.factions.entity.BoardColl; +import com.massivecraft.factions.entity.Faction; +import com.massivecraft.factions.entity.MPlayer; +import com.massivecraft.massivecore.ps.PS; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; + +public class FactionsSupport implements BuildSupport, FriendlySupport { + @Override + public boolean canBuild(Player player, Location location) { + Faction P = MPlayer.get(player).getFaction(); + Faction B = BoardColl.get().getFactionAt(PS.valueOf(location)); + return (ChatColor.stripColor(B.getName()).equalsIgnoreCase("Wilderness")) || (P == B); + } + + @Override + public boolean isFriendly(LivingEntity player, LivingEntity livingEntity) { + if (player instanceof Player && livingEntity instanceof Player) { + Faction p = MPlayer.get(player).getFaction(); + Faction o = MPlayer.get(livingEntity).getFaction(); + Rel r = MPlayer.get(player).getRelationTo(MPlayer.get(livingEntity)); + return r.isFriend() || p == o; + } + return false; + } +} diff --git a/src/main/java/com/iridium/iridiumenchants/support/FactionsSupportHolder.java b/src/main/java/com/iridium/iridiumenchants/support/FactionsSupportHolder.java new file mode 100644 index 0000000..5c7f34a --- /dev/null +++ b/src/main/java/com/iridium/iridiumenchants/support/FactionsSupportHolder.java @@ -0,0 +1,24 @@ +package com.iridium.iridiumenchants.support; + +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +import java.util.function.Supplier; + +public class FactionsSupportHolder implements BuildSupportHolder, FriendlySupportHolder { + @Override + public boolean isInstalled() { + Plugin plugin = Bukkit.getPluginManager().getPlugin("Factions"); + return plugin != null && !plugin.getDescription().getAuthors().contains("drtshock"); + } + + @Override + public Supplier friendlySupport() { + return FactionsSupport::new; + } + + @Override + public Supplier buildSupport() { + return FactionsSupport::new; + } +} diff --git a/src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupportHolder.java b/src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupportHolder.java new file mode 100644 index 0000000..5a8e0e5 --- /dev/null +++ b/src/main/java/com/iridium/iridiumenchants/support/FactionsUUIDSupportHolder.java @@ -0,0 +1,24 @@ +package com.iridium.iridiumenchants.support; + +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +import java.util.function.Supplier; + +public class FactionsUUIDSupportHolder implements BuildSupportHolder, FriendlySupportHolder { + @Override + public boolean isInstalled() { + Plugin plugin = Bukkit.getPluginManager().getPlugin("Factions"); + return plugin != null && plugin.getDescription().getAuthors().contains("drtshock"); + } + + @Override + public Supplier friendlySupport() { + return FactionsUUIDSupport::new; + } + + @Override + public Supplier buildSupport() { + return FactionsUUIDSupport::new; + } +} From cc88f5ab8afd8101dd441d724fdc6d538de701ef Mon Sep 17 00:00:00 2001 From: Shyanne Date: Tue, 7 May 2024 14:08:11 -0400 Subject: [PATCH 4/5] Added exp penalty, refactored for clarity and performance --- .../configs/Configuration.java | 5 +- .../configs/CustomEnchants.java | 9 +- .../iridiumenchants/configs/Messages.java | 4 +- .../iridiumenchants/effects/VeinMine.java | 334 ++++++++++++------ 4 files changed, 235 insertions(+), 117 deletions(-) diff --git a/src/main/java/com/iridium/iridiumenchants/configs/Configuration.java b/src/main/java/com/iridium/iridiumenchants/configs/Configuration.java index ce0f5e3..3f3e858 100644 --- a/src/main/java/com/iridium/iridiumenchants/configs/Configuration.java +++ b/src/main/java/com/iridium/iridiumenchants/configs/Configuration.java @@ -56,10 +56,7 @@ public class Configuration { XMaterial.ANCIENT_DEBRIS ); - public boolean veinMinerDropsAtBreakLocation = true; - public boolean veinMinerBreaksTools = false; - public int veinMinerCap = 25; - public boolean veinMineWithWrongTool = false; + public int veinMineExpPenaltyAmount = 5; public List infusionBlacklist = Arrays.asList(XMaterial.BEDROCK, XMaterial.SPAWNER, XMaterial.CHEST, XMaterial.TRAPPED_CHEST, XMaterial.WATER, XMaterial.LAVA); public Map tiers = ImmutableMap.builder() diff --git a/src/main/java/com/iridium/iridiumenchants/configs/CustomEnchants.java b/src/main/java/com/iridium/iridiumenchants/configs/CustomEnchants.java index eb52ec4..8c17b89 100644 --- a/src/main/java/com/iridium/iridiumenchants/configs/CustomEnchants.java +++ b/src/main/java/com/iridium/iridiumenchants/configs/CustomEnchants.java @@ -239,9 +239,12 @@ public class CustomEnchants { .put(1, new Level(100, Collections.singletonList("Common"), Collections.singletonList("TELEPATHY"), Collections.emptyList())) .build(), true, true)) .put("OreSiphon", new CustomEnchant("&7Ore Siphon", "Breaks adjacent ores of the same type", "Tool", "BLOCK_BREAK", ImmutableMap.builder() - .put(1, new Level(100, Collections.singletonList("Common"), Collections.singletonList("VEINMINE:15"), Collections.emptyList())) - .put(2, new Level(100, Collections.singletonList("Elite"), Collections.singletonList("VEINMINE:35"), Collections.emptyList())) - .put(3, new Level(100, Collections.singletonList("Legendary"), Collections.singletonList("VEINMINE:65"), Collections.emptyList())) + .put(1, new Level(100, Collections.singletonList("Common"), Collections.singletonList("VEINMINE:0:25:FALSE:FALSE:TRUE:TRUE"), Collections.emptyList())) + .put(2, new Level(100, Collections.singletonList("Common"), Collections.singletonList("VEINMINE:15:30:FALSE:FALSE:TRUE:TRUE"), Collections.emptyList())) + .put(3, new Level(100, Collections.singletonList("Common"), Collections.singletonList("VEINMINE:30:35:FALSE:TRUE:FALSE:TRUE"), Collections.emptyList())) + .put(4, new Level(100, Collections.singletonList("Elite"), Collections.singletonList("VEINMINE:45:40:TRUE:TRUE:FALSE:TRUE"), Collections.emptyList())) + .put(5, new Level(100, Collections.singletonList("Elite"), Collections.singletonList("VEINMINE:60:45:TRUE:TRUE:FALSE:TRUE"), Collections.emptyList())) + .put(6, new Level(100, Collections.singletonList("Legendary"), Collections.singletonList("VEINMINE:75:50:TRUE:TRUE:FALSE:FALSE"), Collections.emptyList())) .build(), true, true)) .build(); } diff --git a/src/main/java/com/iridium/iridiumenchants/configs/Messages.java b/src/main/java/com/iridium/iridiumenchants/configs/Messages.java index 6b25397..bda36fe 100644 --- a/src/main/java/com/iridium/iridiumenchants/configs/Messages.java +++ b/src/main/java/com/iridium/iridiumenchants/configs/Messages.java @@ -25,6 +25,6 @@ public class Messages { public String noGkit = "%prefix% &7No GKit by that name exists."; public String gaveGKit = "%prefix% &7You gave the %name% gkit to %player%."; public String recievedGKit = "%prefix% &7You received a %name% gkit from %player%."; - public String cannotVeinMine = "%prefix% &7Your &e%tool% &7is low on durability, so you cannot break the block(s)."; - public String veinMineWrongTool = "%prefix% &7Your %tool% is not capable of getting drops from this block, so it will not be mined."; + public String cannotVeinMine = "%prefix% &7Your &e%tool% &7is low on durability, so you cannot break these blocks."; + public String veinMineWrongTool = "%prefix% &7Your &e%tool% is not capable of getting drops from these blocks, so they will not be mined."; } diff --git a/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java b/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java index 978ed16..4ac399f 100644 --- a/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java +++ b/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java @@ -4,152 +4,192 @@ import com.iridium.iridiumcore.utils.StringUtils; import com.iridium.iridiumenchants.IridiumEnchants; +import com.iridium.iridiumenchants.listeners.BlockBreakListener; +import lombok.Setter; import org.apache.commons.lang3.text.WordUtils; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; +import org.bukkit.entity.*; import org.bukkit.event.Event; import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.player.PlayerItemBreakEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; import java.util.*; public class VeinMine implements Effect { - private final HashSet blocksBuffer = new HashSet<>(), recent = new HashSet<>(); - private boolean safetyFired = false; + private int chance; + private int veinCap; + @Setter + private boolean placeDropsAtOrigin; + @Setter + private boolean protectTool; + @Setter + private boolean allowWrongTool; + @Setter + private boolean expPenalty; + private int expPenaltyAmount = IridiumEnchants.getInstance().getConfiguration().veinMineExpPenaltyAmount; + + private final LinkedHashSet blocksBuffer = new LinkedHashSet<>(), recent = new LinkedHashSet<>(); + private final List events = new ArrayList<>(); @Override public void apply(LivingEntity player, LivingEntity target, String[] args, ItemStack itemStack, Event event) { - if (player instanceof Player && event instanceof BlockBreakEvent) { - Player realPlayer = (Player) player; - BlockBreakEvent blockBreakEvent = (BlockBreakEvent) event; - Block eventBlock = blockBreakEvent.getBlock(); - - if (IridiumEnchants.getInstance().getConfiguration().veinMiner.contains(XMaterial.matchXMaterial(eventBlock.getType()))) { - blockBreakEvent.setCancelled(true); - - ItemStack mainHand = realPlayer.getInventory().getItemInMainHand(); - ItemStack offHand = realPlayer.getInventory().getItemInOffHand(); - ItemStack usedTool; - if(isTool(mainHand)) usedTool = mainHand; - else usedTool = offHand; - - HashSet blocksToMine = allocateBlocks(eventBlock); - int blockCount = blocksToMine.size(); - - int chance; - if (args.length < 2) chance = 100; - else { - try { - chance = Integer.parseInt(args[1]); - } catch (NumberFormatException exception) { - chance = 100; - } - } + if (!(player instanceof Player) && !(event instanceof BlockBreakEvent)) return; - if(eventBlock.getDrops(usedTool).isEmpty()) { - String displayName; - if(usedTool.getItemMeta().hasDisplayName()) displayName = usedTool.getItemMeta().getDisplayName(); - else displayName = usedTool.getType().toString().toLowerCase(); + // Create blockBreakEvent + Player realPlayer = (Player) player; + BlockBreakEvent blockBreakEvent = (BlockBreakEvent) event; - player.sendMessage(StringUtils.color(IridiumEnchants.getInstance().getMessages().veinMineWrongTool - .replace("%prefix%", IridiumEnchants.getInstance().getConfiguration().prefix) - .replace("%tool%", WordUtils.capitalize(displayName.replace("_", " "))) - )); - return; - } + if (events.contains(blockBreakEvent)) { + events.remove(blockBreakEvent); + return; + } - if(usedTool.getItemMeta() instanceof Damageable) { + // Check if we should trigger vein mine at all + if (!IridiumEnchants.getInstance().getConfiguration().veinMiner.contains( + XMaterial.matchXMaterial(blockBreakEvent.getBlock().getType()))) return; - int toolDamage = damageTool(blockCount, usedTool, chance); + // Create variables for event block + Block eventBlock = blockBreakEvent.getBlock(); + Location eventBlockLocation = eventBlock.getLocation(); - if (safetyFired) { + // Get the current vein mine settings + setConfigOptions(args); - String displayName; - if(usedTool.getItemMeta().hasDisplayName()) displayName = usedTool.getItemMeta().getDisplayName(); - else displayName = usedTool.getType().toString().toLowerCase(); + // Get the blocks to be mined and check if we're vein mining based on how many are returned + LinkedHashSet blocksToMine = allocateBlocks(eventBlock); + if (blocksToMine.size() < 2) return; - player.sendMessage(StringUtils.color(IridiumEnchants.getInstance().getMessages().cannotVeinMine - .replace("%prefix%", IridiumEnchants.getInstance().getConfiguration().prefix) - .replace("%tool%", WordUtils.capitalize(displayName.replace("_", " "))) - )); - safetyFired = false; - return; - } + // Check if we should allow vein mining if the tool will not give drops + blockBreakEvent.setCancelled(triggerWrongToolProtection(itemStack, realPlayer, eventBlock)); + if (blockBreakEvent.isCancelled()) return; - Damageable toolMeta = (Damageable) usedTool.getItemMeta(); - toolMeta.setDamage(toolDamage); - usedTool.setItemMeta(toolMeta); - } + // Vein mining + for (Block block : blocksToMine) { - if (IridiumEnchants.getInstance().getConfiguration().veinMinerDropsAtBreakLocation) { - ArrayList> blockDrops = new ArrayList<>(); + // Create new event for each block + BlockBreakEvent breakEvent = new BlockBreakEvent(block, realPlayer); + events.add(breakEvent); + new BlockBreakListener().onBlockBreak(breakEvent); + if (breakEvent.isCancelled()) continue; - for (Block adjacentBlock : blocksToMine) { - blockDrops.add(adjacentBlock.getDrops(usedTool)); - } + // Check if we should continue to vein mine based on location permission + breakEvent.setCancelled(triggerLocationProtection(realPlayer, block.getLocation())); + if (breakEvent.isCancelled()) return; - for (Collection drops : blockDrops) { - for (ItemStack item : drops) { - eventBlock.getLocation().getWorld().dropItemNaturally(eventBlock.getLocation(), item); - } - } + // Check if we should protect the tool from breaking + breakEvent.setCancelled(triggerToolProtection(itemStack, realPlayer)); + if (breakEvent.isCancelled()) return; - } else { - for (Block adjacentBlock : blocksToMine) { - for (ItemStack item : adjacentBlock.getDrops(usedTool)) { - adjacentBlock.getLocation().getWorld().dropItemNaturally(adjacentBlock.getLocation(), item); - } - } - } + // Roll the chance of damaging the tool + Random random = new Random(); + int rolledChance = random.nextInt(101); - for(Block block : blocksToMine) { - block.setType(getAir(block)); + // Check if we need to change the amount of exp the block will drop + if (expPenalty) breakEvent.setExpToDrop(breakEvent.getExpToDrop() - expPenaltyAmount); + + // Check if we need to relocate the drops + if (placeDropsAtOrigin) { + for (ItemStack drop : block.getDrops(itemStack)) { + eventBlockLocation.getWorld().dropItemNaturally(eventBlockLocation, drop); } + block.setType(getAir(block)); + } else block.breakNaturally(itemStack); + + // Check if we need to damage the tool + if (chance <= rolledChance) { + // Check if we need to break the tool + if (damageTool(itemStack, realPlayer)) return; } } } - private boolean isTool(ItemStack itemStack) { - return itemStack.getType().name().toUpperCase().contains("_AXE") - || itemStack.getType().name().toUpperCase().contains("PICKAXE") - || itemStack.getType().name().toUpperCase().contains("SHOVEL") - || itemStack.getType().name().toUpperCase().contains("HOE"); + public Material getAir(Block block) { + for (BlockFace blockFace : BlockFace.values()) { + if (blockFace == BlockFace.SELF) continue; + if (block.getRelative(blockFace).getType() == Material.CAVE_AIR) return Material.CAVE_AIR; + } + return Material.AIR; } - private int damageTool(int blockCount, ItemStack itemStack, int chance) { + public String getToolName(ItemStack itemStack) { + if (itemStack.getItemMeta().hasDisplayName()) return itemStack.getItemMeta().getDisplayName(); + else return itemStack.getType().toString().toLowerCase(); + } - ItemMeta toolMeta = itemStack.getItemMeta(); - int toolDamage = 0; - if (toolMeta instanceof Damageable) { - Damageable realToolMeta = (Damageable) toolMeta; - int maxToolDamage = itemStack.getType().getMaxDurability(); - toolDamage = realToolMeta.getDamage(); + public boolean triggerWrongToolProtection(ItemStack itemStack, Player player, Block block) { + if (block.getDrops(itemStack).isEmpty() && !allowWrongTool) { + String displayName = getToolName(itemStack); + player.sendMessage(StringUtils.color(IridiumEnchants.getInstance().getMessages().veinMineWrongTool + .replace("%prefix%", IridiumEnchants.getInstance().getConfiguration().prefix) + .replace("%tool%", WordUtils.capitalize(displayName.replace("_", " "))) + )); + return true; + } + return false; + } - Random random = new Random(); - int rolledChance = random.nextInt(101); - if (chance <= rolledChance) { - if (toolDamage + blockCount >= maxToolDamage && !IridiumEnchants.getInstance().getConfiguration().veinMinerBreaksTools) { - safetyFired = true; - toolDamage = maxToolDamage - 1; - } else { toolDamage = toolDamage + blockCount; } - } + public boolean triggerToolProtection(ItemStack itemStack, Player player) { + if (getDamage(itemStack) + 1 == getMaxDamage(itemStack) && protectTool) { + String displayName = getToolName(itemStack); + player.sendMessage(StringUtils.color(IridiumEnchants.getInstance().getMessages().cannotVeinMine + .replace("%prefix%", IridiumEnchants.getInstance().getConfiguration().prefix) + .replace("%tool%", WordUtils.capitalize(displayName.replace("_", " "))) + )); + return true; } + return false; + } - return toolDamage; + public boolean triggerLocationProtection(Player player, Location location) { + if (!IridiumEnchants.getInstance().canBuild(player, location)) { + player.sendMessage(StringUtils.color(IridiumEnchants.getInstance().getMessages().noPermission + .replace("%prefix%", IridiumEnchants.getInstance().getConfiguration().prefix))); + return true; + } + return false; } - public HashSet allocateBlocks(Block block) { - HashSet blocks = new HashSet<>(); + private int getDamage(ItemStack itemStack) { + if(itemStack.getItemMeta() instanceof Damageable) { + if(((Damageable) itemStack.getItemMeta()).hasDamage()) return ((Damageable) itemStack.getItemMeta()).getDamage(); + } + return itemStack.getDurability(); + } + + private int getMaxDamage(ItemStack itemStack) { + return itemStack.getType().getMaxDurability(); + } + + private boolean damageTool(ItemStack itemStack, Player player) { + Damageable toolMeta = (Damageable) itemStack.getItemMeta(); + int toolDamage = getDamage(itemStack); + int maxToolDamage = getMaxDamage(itemStack); + + toolDamage++; + if (toolDamage == maxToolDamage) { + PlayerItemBreakEvent itemBreakEvent = new PlayerItemBreakEvent(player, itemStack); + itemBreakEvent.getBrokenItem().setAmount(1); + return true; + } + + toolMeta.setDamage(toolDamage); + itemStack.setItemMeta(toolMeta); + + return false; + } + + public LinkedHashSet allocateBlocks(Block block) { + LinkedHashSet blocks = new LinkedHashSet<>(); + blocks.add(block); this.recent.add(block); - int maxVeinSize = IridiumEnchants.getInstance().getConfiguration().veinMinerCap; - while (blocksBuffer.size() < maxVeinSize) { + while (blocksBuffer.size() < veinCap) { recentSearch: for (Block current : recent) { for (int x = -1; x <= 1; x++) { @@ -167,7 +207,7 @@ public HashSet allocateBlocks(Block block) { continue; } - if (blocks.size() + blocksBuffer.size() >= maxVeinSize) { + if (blocks.size() + blocksBuffer.size() >= veinCap) { break recentSearch; } @@ -192,10 +232,88 @@ public HashSet allocateBlocks(Block block) { return blocks; } - public Material getAir(Block block) { - for(BlockFace blockFace : BlockFace.values()) { - if(block.getRelative(blockFace).getType() == Material.CAVE_AIR) return Material.CAVE_AIR; + private void setChance(String arg) { + try { + chance = Integer.parseInt(arg); + } catch(NumberFormatException e) { + chance = 0; + } + } + + private void setVeinCap(String arg) { + try { + veinCap = Integer.parseInt(arg); + } catch(NumberFormatException e) { + veinCap = 25; + } + } + + public void setConfigOptions(String[] args) { + + switch(args.length) { + case 0: {} + case 1: { + setChance(""); + setVeinCap(""); + setPlaceDropsAtOrigin(false); + setProtectTool(false); + setAllowWrongTool(false); + setExpPenalty(false); + break; + } + case 2: { + setChance(args[1]); + setVeinCap(""); + setPlaceDropsAtOrigin(false); + setProtectTool(false); + setAllowWrongTool(false); + setExpPenalty(false); + break; + } + case 3: { + setChance(args[1]); + setVeinCap(args[2]); + setPlaceDropsAtOrigin(false); + setProtectTool(false); + setAllowWrongTool(false); + setExpPenalty(false); + break; + } + case 4: { + setChance(args[1]); + setVeinCap(args[2]); + setPlaceDropsAtOrigin(Boolean.parseBoolean(args[3])); + setProtectTool(false); + setAllowWrongTool(false); + setExpPenalty(false); + break; + } + case 5: { + setChance(args[1]); + setVeinCap(args[2]); + setPlaceDropsAtOrigin(Boolean.parseBoolean(args[3])); + setProtectTool(Boolean.parseBoolean(args[4])); + setAllowWrongTool(false); + setExpPenalty(false); + break; + } + case 6: { + setChance(args[1]); + setVeinCap(args[2]); + setPlaceDropsAtOrigin(Boolean.parseBoolean(args[3])); + setProtectTool(Boolean.parseBoolean(args[4])); + setAllowWrongTool(Boolean.parseBoolean(args[5])); + setExpPenalty(false); + break; + } + default: { + setChance(args[1]); + setVeinCap(args[2]); + setPlaceDropsAtOrigin(Boolean.parseBoolean(args[3])); + setProtectTool(Boolean.parseBoolean(args[4])); + setAllowWrongTool(Boolean.parseBoolean(args[5])); + setExpPenalty(Boolean.parseBoolean(args[6])); + } } - return Material.AIR; } -} +} \ No newline at end of file From 9468e59d0e0da4a3802cfbbfecd585ed8d078d0c Mon Sep 17 00:00:00 2001 From: Daniel Scherf Date: Wed, 4 Sep 2024 23:31:14 +0200 Subject: [PATCH 5/5] Fix import --- src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java b/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java index 4ac399f..7b2daf6 100644 --- a/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java +++ b/src/main/java/com/iridium/iridiumenchants/effects/VeinMine.java @@ -1,6 +1,6 @@ package com.iridium.iridiumenchants.effects; -import com.iridium.iridiumcore.dependencies.xseries.XMaterial; +import com.cryptomorin.xseries.XMaterial; import com.iridium.iridiumcore.utils.StringUtils; import com.iridium.iridiumenchants.IridiumEnchants;