diff --git a/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/Firewand.java b/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/precision/Firewand.java similarity index 96% rename from Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/Firewand.java rename to Extensions/Firewand/src/main/java/com/willfp/ecoenchants/precision/Firewand.java index 8d2c1069..b3fa71d6 100644 --- a/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/Firewand.java +++ b/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/precision/Firewand.java @@ -1,9 +1,8 @@ -package com.willfp.ecoenchants.firewand; +package com.willfp.ecoenchants.precision; 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.SmallFireball; import org.bukkit.event.EventHandler; diff --git a/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/FirewandMain.java b/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/precision/FirewandMain.java similarity index 92% rename from Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/FirewandMain.java rename to Extensions/Firewand/src/main/java/com/willfp/ecoenchants/precision/FirewandMain.java index 04320a8d..3f58fdb9 100644 --- a/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/firewand/FirewandMain.java +++ b/Extensions/Firewand/src/main/java/com/willfp/ecoenchants/precision/FirewandMain.java @@ -1,4 +1,4 @@ -package com.willfp.ecoenchants.firewand; +package com.willfp.ecoenchants.precision; import com.willfp.ecoenchants.EcoEnchantsPlugin; import com.willfp.ecoenchants.enchantments.EcoEnchant; diff --git a/Extensions/Precision/build.gradle b/Extensions/Precision/build.gradle new file mode 100644 index 00000000..7f12f931 --- /dev/null +++ b/Extensions/Precision/build.gradle @@ -0,0 +1,14 @@ +dependencies { + compileOnly 'org.spigotmc:spigot-api:1.15.2-R0.1-SNAPSHOT' + compileOnly project(':plugin') +} + +jar{ + archiveFileName = project.name + " Extension" + ".jar" +} + +description = 'Precision' + +tasks.withType(Jar) { + destinationDirectory = file("$rootDir/bin/") +} \ No newline at end of file diff --git a/Extensions/Precision/src/main/java/com/willfp/ecoenchants/precision/Precision.java b/Extensions/Precision/src/main/java/com/willfp/ecoenchants/precision/Precision.java new file mode 100644 index 00000000..171731f6 --- /dev/null +++ b/Extensions/Precision/src/main/java/com/willfp/ecoenchants/precision/Precision.java @@ -0,0 +1,100 @@ +package com.willfp.ecoenchants.precision; + +import com.willfp.ecoenchants.EcoEnchantsPlugin; +import com.willfp.ecoenchants.enchantments.EcoEnchant; +import com.willfp.ecoenchants.enchantments.EcoEnchants; +import com.willfp.ecoenchants.enchantments.util.EnchantChecks; +import com.willfp.ecoenchants.nms.TridentStack; +import com.willfp.ecoenchants.util.NumberUtils; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.entity.Enderman; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Trident; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +@SuppressWarnings("unchecked") +public final class Precision extends EcoEnchant { + public Precision() { + super( + "precision", EnchantmentType.SPECIAL + ); + } + + // START OF LISTENERS + + @EventHandler + public void aimingLaunch(ProjectileLaunchEvent event) { + if (!(event.getEntity().getShooter() instanceof Player)) + return; + + if(!(event.getEntity() instanceof Trident)) + return; + + if(event.isCancelled()) return; + + Player player = (Player) event.getEntity().getShooter(); + Trident trident = (Trident) event.getEntity(); + + ItemStack itemStack = TridentStack.getTridentStack(trident); + if (!EnchantChecks.item(itemStack, this)) return; + + int level = EnchantChecks.getMainhandLevel(player, this); + + double multiplier = this.getConfig().getDouble(EcoEnchants.CONFIG_LOCATION + "distance-per-level"); + + final double finalDistance = level * multiplier; + Runnable runnable = new BukkitRunnable() { + @Override + public void run() { + List nearbyEntities = (List)(List) Arrays.asList(trident.getNearbyEntities(finalDistance, finalDistance, finalDistance).stream() + .filter(entity -> entity instanceof LivingEntity) + .filter(entity -> !entity.equals(player)) + .filter(entity -> !(entity instanceof Enderman)) + .filter(entity -> { + if (entity instanceof Player) { + return ((Player) entity).getGameMode().equals(GameMode.SURVIVAL) || ((Player) entity).getGameMode().equals(GameMode.ADVENTURE); + } + return true; + }).toArray()); + if(nearbyEntities.isEmpty()) return; + LivingEntity entity = nearbyEntities.get(0); + double distance = Double.MAX_VALUE; + for(LivingEntity livingEntity : nearbyEntities) { + double currentDistance = livingEntity.getLocation().distance(trident.getLocation()); + if(currentDistance >= distance) continue; + + distance = currentDistance; + entity = livingEntity; + } + if(entity != null) { + Vector vector = entity.getEyeLocation().toVector().clone().subtract(trident.getLocation().toVector()).normalize(); + trident.setVelocity(vector); + } + } + }; + + final int period = this.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "check-ticks"); + final int checks = this.getConfig().getInt(EcoEnchants.CONFIG_LOCATION + "checks-per-level") * level; + AtomicInteger checksPerformed = new AtomicInteger(0); + + new BukkitRunnable() { + @Override + public void run() { + checksPerformed.addAndGet(1); + if(checksPerformed.get() > checks) this.cancel(); + if(trident.isDead() || trident.isInBlock() || trident.isOnGround()) this.cancel(); + Bukkit.getScheduler().runTask(EcoEnchantsPlugin.getInstance(), runnable); + } + }.runTaskTimer(EcoEnchantsPlugin.getInstance(), 3, period); + } +} diff --git a/Extensions/Precision/src/main/java/com/willfp/ecoenchants/precision/PrecisionMain.java b/Extensions/Precision/src/main/java/com/willfp/ecoenchants/precision/PrecisionMain.java new file mode 100644 index 00000000..40e57b98 --- /dev/null +++ b/Extensions/Precision/src/main/java/com/willfp/ecoenchants/precision/PrecisionMain.java @@ -0,0 +1,20 @@ +package com.willfp.ecoenchants.precision; + +import com.willfp.ecoenchants.EcoEnchantsPlugin; +import com.willfp.ecoenchants.enchantments.EcoEnchant; +import com.willfp.ecoenchants.extensions.Extension; +import org.bukkit.Bukkit; + +public class PrecisionMain extends Extension { + public static final EcoEnchant PRECISION = new Precision(); + + @Override + public void onEnable() { + Bukkit.getPluginManager().registerEvents(PRECISION, EcoEnchantsPlugin.getInstance()); + } + + @Override + public void onDisable() { + + } +} diff --git a/Extensions/Precision/src/main/resources/enchants/special/precision.yml b/Extensions/Precision/src/main/resources/enchants/special/precision.yml new file mode 100644 index 00000000..c827abfe --- /dev/null +++ b/Extensions/Precision/src/main/resources/enchants/special/precision.yml @@ -0,0 +1,25 @@ +# +# Precision EcoEnchant +# + +name: "Precision" +description: Tridents hone in on your target. +enabled: true + +obtaining: + table: true + villager: true + loot: true + rarity: special + +general-config: + targets: + - trident + grindstoneable: true + conflicts: [] + maximum-level: 5 + +config: + distance-per-level: 4 # Distance to scan per level + check-ticks: 10 # Ticks between rotations + checks-per-level: 2 # Amount of times to rotate arrow per level (prevents "floating") \ No newline at end of file diff --git a/Extensions/Precision/src/main/resources/extension.yml b/Extensions/Precision/src/main/resources/extension.yml new file mode 100644 index 00000000..38b950a3 --- /dev/null +++ b/Extensions/Precision/src/main/resources/extension.yml @@ -0,0 +1,2 @@ +name: Precision +main: com.willfp.ecoenchants.precision.PrecisionMain \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 1b338980..8ad71afc 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,7 +5,6 @@ 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') @@ -13,4 +12,11 @@ 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') + +// Extensions +include('Firewand') project(":Firewand").projectDir = file('Extensions/Firewand') + +include('Precision') +project(":Precision").projectDir = file('Extensions/Precision') +