diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Dynamite.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Dynamite.java new file mode 100644 index 00000000..41abe41b --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Dynamite.java @@ -0,0 +1,74 @@ +package com.willfp.ecoenchants.enchantments.ecoenchants.spell; + +import com.willfp.ecoenchants.EcoEnchantsPlugin; +import com.willfp.ecoenchants.enchantments.EcoEnchants; +import com.willfp.ecoenchants.enchantments.itemtypes.Spell; +import com.willfp.ecoenchants.integrations.anticheat.AnticheatManager; +import com.willfp.ecoenchants.integrations.antigrief.AntigriefManager; +import com.willfp.ecoenchants.nms.BlockBreak; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.HashSet; +import java.util.Set; + +public class Dynamite extends Spell { + public Dynamite() { + super("dynamite"); + } + + @Override + public void onRightClick(Player player, int level, PlayerInteractEvent event) { + Block block = event.getClickedBlock(); + + if (block.hasMetadata("from-drill") || block.hasMetadata("from-lumberjack") || block.hasMetadata("from-blastmining") || block.hasMetadata("from-vein")) { + return; + } + + AnticheatManager.exemptPlayer(player); + + Set toBreak = new HashSet<>(); + + int baseDiff = this.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "base-bonus"); + int bonusPerLevel = this.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "per-level-bonus"); + final int size = baseDiff + (bonusPerLevel * (level - 1)); + + + for(int x = -size; size <= 1; x++) { + for(int y = -size; y <= size; y++) { + for (int z = -size; z <= size; z++) { + if(x == 0 && y == 0 && z == 0) { + if(this.getConfig().getBool(EcoEnchants.CONFIG_LOCATION + "enable-sound")) { + block.getWorld().createExplosion(block.getLocation().clone().add(0.5, 0.5, 0.5), 0, false); + } else { + block.getWorld().spawnParticle(Particle.EXPLOSION_HUGE, block.getLocation().clone().add(0.5, 0.5, 0.5), 1); + } + continue; + } + Block block1 = block.getWorld().getBlockAt(block.getLocation().clone().add(x, y, z)); + + if(this.getConfig().getStrings(EcoEnchants.CONFIG_LOCATION + "blacklisted-blocks").contains(block1.getType().name().toLowerCase())) { + continue; + } + + if(block1.getType().getHardness() > block.getType().getHardness() && this.getConfig().getBool(EcoEnchants.CONFIG_LOCATION + "hardness-check")) continue; + + if(!AntigriefManager.canBreakBlock(player, block1)) continue; + + toBreak.add(block1); + } + } + } + + toBreak.forEach((block1 -> { + block1.setMetadata("from-blastmining", new FixedMetadataValue(EcoEnchantsPlugin.getInstance(), true)); + BlockBreak.breakBlock(player, block1); + block1.removeMetadata("from-blastmining", EcoEnchantsPlugin.getInstance()); + })); + + AnticheatManager.unexemptPlayer(player); + } +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Missile.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Missile.java index 9a73c278..5bf9aca7 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Missile.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Missile.java @@ -8,6 +8,7 @@ import org.bukkit.entity.WitherSkull; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.metadata.FixedMetadataValue; public class Missile extends Spell { @@ -16,7 +17,7 @@ public class Missile extends Spell { } @Override - public void onRightClick(Player player, int level) { + public void onRightClick(Player player, int level, PlayerInteractEvent event) { WitherSkull skull = player.launchProjectile(WitherSkull.class, player.getEyeLocation().getDirection().multiply(this.getConfig().getDouble(EcoEnchants.CONFIG_LOCATION + "velocity"))); skull.setCharged(true); skull.setIsIncendiary(false); diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Quake.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Quake.java index 6f20245b..2be923f9 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Quake.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Quake.java @@ -6,6 +6,7 @@ import com.willfp.ecoenchants.integrations.antigrief.AntigriefManager; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerInteractEvent; import java.util.Collection; @@ -15,7 +16,7 @@ public class Quake extends Spell { } @Override - public void onRightClick(Player player, int level) { + public void onRightClick(Player player, int level, PlayerInteractEvent event) { int radius = this.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "radius-per-level") * level; int damage = this.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "damage-per-level") * level; diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Vitalize.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Vitalize.java index 8ba25154..45708ab8 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Vitalize.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Vitalize.java @@ -3,6 +3,7 @@ package com.willfp.ecoenchants.enchantments.ecoenchants.spell; import com.willfp.ecoenchants.enchantments.itemtypes.Spell; import org.bukkit.attribute.Attribute; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerInteractEvent; public class Vitalize extends Spell { public Vitalize() { @@ -10,7 +11,7 @@ public class Vitalize extends Spell { } @Override - public void onRightClick(Player player, int level) { + public void onRightClick(Player player, int level, PlayerInteractEvent event) { player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); } } diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/itemtypes/Spell.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/itemtypes/Spell.java index 54f435c9..33713bdc 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/itemtypes/Spell.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/itemtypes/Spell.java @@ -46,7 +46,7 @@ public abstract class Spell extends EcoEnchant { SpellRunnable runnable = cooldownTracker.get(player.getUniqueId()); runnable.setTask(() -> { - this.onRightClick(player, level); + this.onRightClick(player, level, event); }); long msLeft = runnable.getEndTime() - System.currentTimeMillis(); @@ -64,5 +64,5 @@ public abstract class Spell extends EcoEnchant { runnable.run(); } - public abstract void onRightClick(Player player, int level); + public abstract void onRightClick(Player player, int level, PlayerInteractEvent event); } diff --git a/Plugin/src/main/resources/enchants/spell/dynamite.yml b/Plugin/src/main/resources/enchants/spell/dynamite.yml new file mode 100644 index 00000000..a65dfd44 --- /dev/null +++ b/Plugin/src/main/resources/enchants/spell/dynamite.yml @@ -0,0 +1,29 @@ +# +# Dynamite EcoEnchant +# + +name: "Dynamite" +description: Mines blocks in a large area. +enabled: true + +obtaining: + table: true + villager: true + loot: true + rarity: legendary + +general-config: + targets: + - pickaxe + grindstoneable: true + conflicts: [] + maximum-level: 2 + +config: + cooldown: 30 # In seconds + enable-sound: true # Play explosion sound + hardness-check: true # Only break blocks with hardness less than or equal to first block + blacklisted-blocks: + - bedrock + base-bonus: 2 # Base extra blocks on all sides to break (1 = 3x3x3, 2 = 5x5x5, 3 = 7x7x7) + per-level-bonus: 1 # Extra blocks on all sides per level \ No newline at end of file