diff --git a/Extensions/Firewand/build.gradle b/Extensions/Firewand/build.gradle new file mode 100644 index 00000000..0ac00e95 --- /dev/null +++ b/Extensions/Firewand/build.gradle @@ -0,0 +1,14 @@ +dependencies { + compileOnly 'org.spigotmc:spigot-api:1.15.2-R0.1-SNAPSHOT' + compileOnly project(':plugin') +} + +jar{ + archiveFileName = findProperty("Name") + " v" + findProperty("version") + ".jar" +} + +description = 'FireWand' + +tasks.withType(Jar) { + destinationDirectory = file("$rootDir/bin/") +} \ No newline at end of file diff --git a/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/Firewand.java b/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/Firewand.java new file mode 100644 index 00000000..67ed69f7 --- /dev/null +++ b/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/Firewand.java @@ -0,0 +1,49 @@ +package com.willfp.ecoenchants.firewand; + +import com.willfp.ecoenchants.EcoEnchantsPlugin; +import com.willfp.ecoenchants.enchantments.EcoEnchants; +import com.willfp.ecoenchants.enchantments.itemtypes.Spell; +import org.bukkit.entity.Fireball; +import org.bukkit.entity.Player; +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.entity.EntityExplodeEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.metadata.FixedMetadataValue; + +public class Firewand extends Spell { + public Firewand() { + super("firewand"); + } + + @Override + public void onUse(Player player, int level, PlayerInteractEvent event) { + Fireball fireball = player.launchProjectile(Fireball.class, player.getEyeLocation().getDirection().multiply(this.getConfig().getDouble(EcoEnchants.CONFIG_LOCATION + "velocity"))); + fireball.setIsIncendiary(false); + fireball.setMetadata("eco-damage", new FixedMetadataValue(EcoEnchantsPlugin.getInstance(), this.getConfig().getDouble(EcoEnchants.CONFIG_LOCATION + "damage-per-level") * level)); + if(this.getConfig().getBool(EcoEnchants.CONFIG_LOCATION + "no-explode")) { + fireball.setMetadata("nobreak", new FixedMetadataValue(EcoEnchantsPlugin.getInstance(), true)); + } + fireball.setShooter(player); + } + + @EventHandler(priority = EventPriority.LOW) + public void onFireballDamage(EntityDamageByEntityEvent event) { + if(!(event.getDamager() instanceof Fireball)) return; + if(event.getDamager().getMetadata("eco-damage").isEmpty()) return; + + double multiplier = event.getDamager().getMetadata("eco-damage").get(0).asDouble(); + + event.setDamage(multiplier); + } + + @EventHandler + public void onFireballExplode(EntityExplodeEvent event) { + if(!(event.getEntity() instanceof Fireball)) return; + if(event.getEntity().getMetadata("nobreak").isEmpty()) return; + + event.setCancelled(true); + } +} diff --git a/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/FirewandMain.java b/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/FirewandMain.java new file mode 100644 index 00000000..04320a8d --- /dev/null +++ b/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/FirewandMain.java @@ -0,0 +1,20 @@ +package com.willfp.ecoenchants.firewand; + +import com.willfp.ecoenchants.EcoEnchantsPlugin; +import com.willfp.ecoenchants.enchantments.EcoEnchant; +import com.willfp.ecoenchants.extensions.Extension; +import org.bukkit.Bukkit; + +public class FirewandMain extends Extension { + public static final EcoEnchant FIREWAND = new Firewand(); + + @Override + public void onEnable() { + Bukkit.getPluginManager().registerEvents(FIREWAND, EcoEnchantsPlugin.getInstance()); + } + + @Override + public void onDisable() { + + } +} diff --git a/Extensions/Firewand/src/main/resources/enchants/spell/firewand.yml b/Extensions/Firewand/src/main/resources/enchants/spell/firewand.yml new file mode 100644 index 00000000..4a83a6b1 --- /dev/null +++ b/Extensions/Firewand/src/main/resources/enchants/spell/firewand.yml @@ -0,0 +1,27 @@ +# +# Firewand EcoEnchant +# + +name: "Firewand" +description: Shoots a fireball +enabled: true + +obtaining: + table: true + villager: true + loot: true + rarity: legendary + +general-config: + targets: + - rod + grindstoneable: true + conflicts: [] + maximum-level: 3 + +config: + activation-sound: ENTITY_WITHER_SHOOT + cooldown: 60 # In seconds + velocity: 3 + damage-per-level: 8 + no-explode: false # Don't explode \ No newline at end of file diff --git a/Extensions/Firewand/src/main/resources/extension.yml b/Extensions/Firewand/src/main/resources/extension.yml new file mode 100644 index 00000000..6dd4b004 --- /dev/null +++ b/Extensions/Firewand/src/main/resources/extension.yml @@ -0,0 +1,2 @@ +name: Firewand +main: com.willfp.ecoenchants.firewand.FirewandMain \ No newline at end of file diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Charge.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Charge.java index bc1376ad..5330223a 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Charge.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/spell/Charge.java @@ -12,7 +12,7 @@ public class Charge extends Spell { } @Override - public void onRightClick(Player player, int level, PlayerInteractEvent event) { + public void onUse(Player player, int level, PlayerInteractEvent event) { Vector velocity = player.getEyeLocation().getDirection().clone(); velocity.normalize(); velocity.multiply(level * this.getConfig().getDouble(EcoEnchants.CONFIG_LOCATION + "velocity-per-level")); 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 index 19bb746b..1fb98a9a 100644 --- 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 @@ -22,7 +22,7 @@ public class Dynamite extends Spell { } @Override - public void onRightClick(Player player, int level, PlayerInteractEvent event) { + public void onUse(Player player, int level, PlayerInteractEvent event) { Block block = event.getClickedBlock(); if(!event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) 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 ec042cce..f88271eb 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 @@ -18,7 +18,7 @@ public class Missile extends Spell { } @Override - public void onRightClick(Player player, int level, PlayerInteractEvent event) { + public void onUse(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 2be923f9..5b33de12 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 @@ -16,7 +16,7 @@ public class Quake extends Spell { } @Override - public void onRightClick(Player player, int level, PlayerInteractEvent event) { + public void onUse(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 45708ab8..3338be70 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 @@ -11,7 +11,7 @@ public class Vitalize extends Spell { } @Override - public void onRightClick(Player player, int level, PlayerInteractEvent event) { + public void onUse(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 6fe59afb..1eabaada 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 @@ -9,6 +9,7 @@ import com.willfp.ecoenchants.enchantments.util.EnchantChecks; import com.willfp.ecoenchants.enchantments.util.SpellRunnable; import com.willfp.ecoenchants.util.optional.Prerequisite; import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.SoundCategory; import org.bukkit.entity.Player; @@ -16,8 +17,10 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -27,6 +30,10 @@ import java.util.UUID; public abstract class Spell extends EcoEnchant { private final HashMap cooldownTracker = new HashMap<>(); private final Set runningSpell = new HashSet<>(); + private static final List leftClickItems = Arrays.asList( + Material.FISHING_ROD, + Material.BOW + ); protected Spell(String key, Prerequisite... prerequisites) { super(key, EnchantmentType.SPELL, prerequisites); @@ -41,12 +48,17 @@ public abstract class Spell extends EcoEnchant { } @EventHandler - public void onRightClickEventHandler(PlayerInteractEvent event) { - if(!(event.getAction().equals(Action.RIGHT_CLICK_AIR) || event.getAction().equals(Action.RIGHT_CLICK_BLOCK))) - return; - + public void onUseEventHandler(PlayerInteractEvent event) { Player player = event.getPlayer(); + if(!leftClickItems.contains(player.getInventory().getItemInMainHand().getType())) { + if(!(event.getAction().equals(Action.RIGHT_CLICK_AIR) || event.getAction().equals(Action.RIGHT_CLICK_BLOCK))) + return; + } else { + if(!(event.getAction().equals(Action.LEFT_CLICK_BLOCK) || event.getAction().equals(Action.LEFT_CLICK_BLOCK))) + return; + } + if(runningSpell.contains(player.getUniqueId())) return; runningSpell.add(player.getUniqueId()); @@ -62,7 +74,7 @@ public abstract class Spell extends EcoEnchant { SpellRunnable runnable = cooldownTracker.get(player.getUniqueId()); runnable.setTask(() -> { - this.onRightClick(player, level, event); + this.onUse(player, level, event); }); int cooldown = getCooldown(this, player); @@ -80,7 +92,7 @@ public abstract class Spell extends EcoEnchant { runnable.run(); } - public abstract void onRightClick(Player player, int level, PlayerInteractEvent event); + public abstract void onUse(Player player, int level, PlayerInteractEvent event); public static int getCooldown(Spell spell, Player player) { if(!spell.cooldownTracker.containsKey(player.getUniqueId())) diff --git a/settings.gradle b/settings.gradle index 9592b4a5..1b338980 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,10 +5,12 @@ include('API') include('v1_16_R1') include('v1_16_R2') include('v1_16_R3') +include('Firewand') project(":v1_15_R1").projectDir = file('NMS/v1_15_R1') project(":plugin").projectDir = file('Plugin') project(":API").projectDir = file('NMS/API') project(":v1_16_R1").projectDir = file('NMS/v1_16_R1') project(":v1_16_R2").projectDir = file('NMS/v1_16_R2') -project(":v1_16_R3").projectDir = file('NMS/v1_16_R3') \ No newline at end of file +project(":v1_16_R3").projectDir = file('NMS/v1_16_R3') +project(":Firewand").projectDir = file('Extensions/Firewand')