diff --git a/src/main/java/net/countercraft/movecraft/combat/MovecraftCombat.java b/src/main/java/net/countercraft/movecraft/combat/MovecraftCombat.java index 21584c8e..0526add8 100644 --- a/src/main/java/net/countercraft/movecraft/combat/MovecraftCombat.java +++ b/src/main/java/net/countercraft/movecraft/combat/MovecraftCombat.java @@ -64,8 +64,8 @@ public void onEnable() { } - FileConfiguration config = getConfig(); // Load localisation and features from config + FileConfiguration config = getConfig(); I18nSupport.load(config); CombatRelease.load(config); @@ -84,13 +84,13 @@ public void onEnable() { AntiRadar.load(config); ContactExplosives.load(config); DurabilityOverride.load(config); - FireballLifespan.load(config); + FireballBehaviour.load(config); FireballPenetration.load(config); ReImplementTNTTranslocation.load(config); BlockBehaviorOverride.load(config); - PluginManager pluginManager = getServer().getPluginManager(); // Register event translation listeners + PluginManager pluginManager = getServer().getPluginManager(); pluginManager.registerEvents(new CraftCollisionExplosionListener(), this); pluginManager.registerEvents(new ExplosionListener(), this); @@ -129,10 +129,9 @@ public void onEnable() { pluginManager.registerEvents(contactExplosives, this); contactExplosives.runTaskTimer(this, 0, 1); // Every tick pluginManager.registerEvents(new DurabilityOverride(), this); - var fireballLifespan = new FireballLifespan(); - pluginManager.registerEvents(fireballLifespan, this); - fireballLifespan.runTaskTimer(this, 0, 20); // Every 1 second - pluginManager.registerEvents(new FireballLifespan(), this); + var fireballBehavior = new FireballBehaviour(); + pluginManager.registerEvents(fireballBehavior, this); + fireballBehavior.runTaskTimer(this, 0, 20); // Every 1 second pluginManager.registerEvents(new FireballPenetration(), this); pluginManager.registerEvents(new ReImplementTNTTranslocation(), this); diff --git a/src/main/java/net/countercraft/movecraft/combat/features/FireballLifespan.java b/src/main/java/net/countercraft/movecraft/combat/features/FireballBehaviour.java similarity index 66% rename from src/main/java/net/countercraft/movecraft/combat/features/FireballLifespan.java rename to src/main/java/net/countercraft/movecraft/combat/features/FireballBehaviour.java index 3f5b3992..10812106 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/FireballLifespan.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/FireballBehaviour.java @@ -9,19 +9,22 @@ import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.Deque; import java.util.LinkedList; -public class FireballLifespan extends BukkitRunnable implements Listener { +public class FireballBehaviour extends BukkitRunnable implements Listener { private static final String METADATA_KEY = "MCC-Expiry"; public static int FireballLifespan = 0; + private static double FireballSpeed = 1.0; private final Deque queue = new LinkedList<>(); public static void load(@NotNull FileConfiguration config) { FireballLifespan = config.getInt("FireballLifespan", 6); - FireballLifespan *= 20 * 50; // Convert from seconds to milliseconds + FireballSpeed = config.getDouble("FireballSpeed", 1.0); + FireballLifespan *= 1000; // Convert from seconds to milliseconds } @Override @@ -39,9 +42,22 @@ public void run() { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onProjectileLaunch(@NotNull ProjectileLaunchEvent e) { - if (!(e.getEntity() instanceof SmallFireball)) + if (!(e.getEntity() instanceof SmallFireball fireball)) return; - SmallFireball fireball = (SmallFireball) e.getEntity(); + + new BukkitRunnable() { + @Override + public void run() { + Vector fireballVector = fireball.getVelocity(); + double speed = fireballVector.length() * FireballSpeed; + + fireballVector = fireballVector.normalize(); + fireballVector.multiply(speed); + + fireball.setVelocity(fireballVector); + } + }.runTaskTimer(MovecraftCombat.getInstance(), 1L, 1L); + fireball.setMetadata(METADATA_KEY, new FixedMetadataValue(MovecraftCombat.getInstance(), System.currentTimeMillis())); queue.add(fireball); } diff --git a/src/main/java/net/countercraft/movecraft/combat/features/directors/AADirectors.java b/src/main/java/net/countercraft/movecraft/combat/features/directors/AADirectors.java index 9418bc97..1ccbcb67 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/directors/AADirectors.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/directors/AADirectors.java @@ -12,7 +12,6 @@ import net.countercraft.movecraft.util.MathUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.block.Block; @@ -95,12 +94,13 @@ private void processFireball(@NotNull SmallFireball fireball) { fireball.setShooter(p); Vector fireballVector = fireball.getVelocity(); - double speed = fireballVector.length(); // store the speed to add it back in later, since all the values we will be using are "normalized", IE: have a speed of 1 + double speed = fireballVector.length() ; // store the speed to add it back in later, since all the values we will be using are "normalized", IE: have a speed of 1 fireballVector = fireballVector.normalize(); // you normalize it for comparison with the new direction to see if we are trying to steer too far Block targetBlock = DirectorUtils.getDirectorBlock(p, AADirectorRange); Vector targetVector; - if (targetBlock == null || targetBlock.getType().equals(Material.AIR)) // the player is looking at nothing, shoot in that general direction + + if (targetBlock == null || targetBlock.getType().isAir()) // the player is looking at nothing, shoot in that general direction targetVector = p.getLocation().getDirection(); else { // shoot directly at the block the player is looking at (IE: with convergence) targetVector = targetBlock.getLocation().toVector().subtract(fireball.getLocation().toVector()); @@ -129,6 +129,12 @@ else if (targetVector.getZ() - fireballVector.getZ() < -0.5) fireballVector.setZ(targetVector.getZ()); fireballVector = fireballVector.multiply(speed); // put the original speed back in, but now along a different trajectory + try { + fireballVector.checkFinite(); + } + catch (IllegalArgumentException ignored) { + return; + } fireball.setVelocity(fireballVector); fireball.setDirection(fireballVector); } diff --git a/src/main/java/net/countercraft/movecraft/combat/features/directors/ArrowDirectors.java b/src/main/java/net/countercraft/movecraft/combat/features/directors/ArrowDirectors.java index 632674e6..56d6bfad 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/directors/ArrowDirectors.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/directors/ArrowDirectors.java @@ -126,6 +126,12 @@ else if (targetVector.getZ() - arrowVector.getZ() < -0.5) arrowVector.setZ(targetVector.getZ()); arrowVector = arrowVector.multiply(speed); // put the original speed back in, but now along a different trajectory + try { + arrowVector.checkFinite(); + } + catch (IllegalArgumentException ignored) { + return; + } arrow.setVelocity(arrowVector); } diff --git a/src/main/java/net/countercraft/movecraft/combat/features/directors/CannonDirectors.java b/src/main/java/net/countercraft/movecraft/combat/features/directors/CannonDirectors.java index 7215fbae..98f66510 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/directors/CannonDirectors.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/directors/CannonDirectors.java @@ -141,6 +141,12 @@ private void processTNT(@NotNull TNTPrimed tnt) { tntVector = tntVector.multiply(horizontalSpeed); // put the original speed back in, but now along a different trajectory tntVector.setY(tnt.getVelocity().getY()); // you leave the original Y (or vertical axis) trajectory as it was + try { + tntVector.checkFinite(); + } + catch (IllegalArgumentException ignored) { + return; + } tnt.setVelocity(tntVector); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 83f721a9..474daec1 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -41,6 +41,7 @@ BleedfixExplosion: true # Fireball Lifespan FireballLifespan: 6 # Lifespan of fireballs in seconds +FireballSpeed: 1.0 # Speed multiplier for fireballs # TNT Tracers TracerRateTicks: 5.0 # Rate at which tracers are spawned on the path of flying TNT @@ -52,7 +53,6 @@ ExplosionBlock: GLOWSTONE # Block to use to indicate tracer explosions TracerParticles: FIREWORKS_SPARK # Particle to use for particle tracers See https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Particle.html for options. ExplosionParticles: VILLAGER_ANGRY # Particle to use for particle tracer explosions - ### Custom features # Damage Tracking