diff --git a/build.gradle b/build.gradle index a93cea1..cafa929 100644 --- a/build.gradle +++ b/build.gradle @@ -2,8 +2,8 @@ plugins { id 'java' } -group = 'me.improper' -version = '3.0' +group = project.group +version = project.mc_version repositories { mavenCentral() @@ -18,7 +18,7 @@ repositories { } dependencies { - compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT' + compileOnly "org.spigotmc:spigot-api:${project.mc_version}-R0.1-SNAPSHOT" } def targetJavaVersion = 16 diff --git a/build/libs/ExplosionsControl-3.0.jar b/build/libs/ExplosionsControl-3.0.jar deleted file mode 100644 index f3fc086..0000000 Binary files a/build/libs/ExplosionsControl-3.0.jar and /dev/null differ diff --git a/build/resources/main/plugin.yml b/build/resources/main/plugin.yml index 611fcc6..4a11314 100644 --- a/build/resources/main/plugin.yml +++ b/build/resources/main/plugin.yml @@ -1,7 +1,7 @@ name: ExplosionsControl -version: '3.0' +version: '1.19.4' main: io.github.itzispyder.explosionscontrol.ExplosionsControl -api-version: 1.17 +api-version: 1.19 authors: [ ImproperIssues ] description: Manager server explosions with just a few simple clicks! website: github.com/ItziSpyder diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index de428a1..c54f9b5 100644 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/gradle.properties b/gradle.properties index e69de29..adadd1b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -0,0 +1,6 @@ + +# Plugin +group= 'io.github.itzispyder' + +# Minecraft +mc_version= 1.19.4 \ No newline at end of file diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java b/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java index ec92010..787767e 100644 --- a/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java +++ b/src/main/java/io/github/itzispyder/explosionscontrol/ExplosionsControl.java @@ -4,6 +4,7 @@ import io.github.itzispyder.explosionscontrol.commands.BukkitCommand; import io.github.itzispyder.explosionscontrol.commands.commands.ConfigWorldCommand; import io.github.itzispyder.explosionscontrol.commands.commands.UpdateWorldsCommand; import io.github.itzispyder.explosionscontrol.data.ExplosionConfig; +import io.github.itzispyder.explosionscontrol.events.ExplosionListener; import io.github.itzispyder.explosionscontrol.events.InventoryListener; import io.github.itzispyder.explosionscontrol.utils.Text; import org.bukkit.Bukkit; @@ -34,6 +35,7 @@ public final class ExplosionsControl extends JavaPlugin { public void init() { // listeners pm.registerEvents(new InventoryListener(), this); + pm.registerEvents(new ExplosionListener(), this); // commands addCommand(new UpdateWorldsCommand()); diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java b/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java index 2a3099a..8fcd25a 100644 --- a/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java +++ b/src/main/java/io/github/itzispyder/explosionscontrol/data/Mode.java @@ -20,6 +20,18 @@ public enum Mode { this.id = id; } + public boolean shouldCancel() { + return this == NONE || this == DISABLED; + } + + public boolean isDynamic() { + return this == DYNAMIC; + } + + public boolean isNormal() { + return this == ENABLED; + } + public Mode next() { int i = id + 1; i = i >= values().length ? 0 : i; diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/events/ExplosionListener.java b/src/main/java/io/github/itzispyder/explosionscontrol/events/ExplosionListener.java new file mode 100644 index 0000000..eb1d228 --- /dev/null +++ b/src/main/java/io/github/itzispyder/explosionscontrol/events/ExplosionListener.java @@ -0,0 +1,92 @@ +package io.github.itzispyder.explosionscontrol.events; + +import io.github.itzispyder.explosionscontrol.data.ExplosionConfig; +import io.github.itzispyder.explosionscontrol.data.Mode; +import io.github.itzispyder.explosionscontrol.utils.SoundPlayer; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.entity.FallingBlock; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockExplodeEvent; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.util.Vector; + +import java.util.List; + +public class ExplosionListener implements Listener { + + @EventHandler + private void onExplodeEntity(EntityExplodeEvent e) { + try { + this.handleEntityExplosion(e); + } + catch (Exception ignore) {} + } + + @EventHandler + private void onExplodeBlock(BlockExplodeEvent e) { + try { + this.handleBlockExplosion(e); + } + catch (Exception ignore) {} + } + + private void handleEntityExplosion(EntityExplodeEvent e) { + Entity ent = e.getEntity(); + World world = ent.getWorld(); + ExplosionConfig config = ExplosionConfig.load(world); + + switch (ent.getType()) { + case CREEPER -> determineOutcome(config.getCreeperMode(), e); + case MINECART_TNT -> determineOutcome(config.getMinecartMode(), e); + case FIREBALL -> determineOutcome(config.getFireballMode(), e); + case WITHER_SKULL -> determineOutcome(config.getWitherMode(), e); + case PRIMED_TNT -> determineOutcome(config.getTntMode(), e); + case ENDER_CRYSTAL -> determineOutcome(config.getCrystalMode(), e); + } + } + + private void handleBlockExplosion(BlockExplodeEvent e) { + Block block = e.getBlock(); + World world = block.getWorld(); + ExplosionConfig config = ExplosionConfig.load(world); + + determineOutcome(config.getBlockMode(), e); + } + + private void determineOutcome(Mode mode, EntityExplodeEvent e) { + e.setCancelled(mode.shouldCancel()); + switch (mode) { + case DYNAMIC -> dynamicExplode(e.getLocation(), e.blockList()); + case DISABLED -> fakeExplode(e.getLocation()); + } + } + + private void determineOutcome(Mode mode, BlockExplodeEvent e) { + e.setCancelled(mode.shouldCancel()); + switch (mode) { + case DYNAMIC -> dynamicExplode(e.getBlock().getLocation(), e.blockList()); + case DISABLED -> fakeExplode(e.getBlock().getLocation()); + } + } + + private void dynamicExplode(Location center, List blocks) { + for (Block block : blocks) { + Location loc = block.getLocation(); + Vector dir = loc.toVector().subtract(center.toVector()).normalize().multiply(2).add(new Vector(0, 1, 0)); + FallingBlock fb = loc.getWorld().spawnFallingBlock(loc.add(0.5, 0.5, 0.5), block.getBlockData()); + fb.setVelocity(dir); + } + } + + private void fakeExplode(Location center) { + SoundPlayer sound = new SoundPlayer(center, Sound.ENTITY_GENERIC_EXPLODE, 10.0F, 0.7F); + sound.playWithin(100.0); + center.getWorld().spawnParticle(Particle.EXPLOSION_HUGE, center, 1, 0, 0, 0, 0); + } +} diff --git a/src/main/java/io/github/itzispyder/explosionscontrol/events/InventoryListener.java b/src/main/java/io/github/itzispyder/explosionscontrol/events/InventoryListener.java index 4f5bc1a..6b6aab0 100644 --- a/src/main/java/io/github/itzispyder/explosionscontrol/events/InventoryListener.java +++ b/src/main/java/io/github/itzispyder/explosionscontrol/events/InventoryListener.java @@ -20,9 +20,7 @@ public class InventoryListener implements Listener { try { this.handleConfigGui(e); } - catch (Exception ignore) { - ignore.printStackTrace(); - } + catch (Exception ignore) {} } private void handleConfigGui(InventoryClickEvent e) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a8a7b56..c48cd24 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: ExplosionsControl version: '${version}' main: io.github.itzispyder.explosionscontrol.ExplosionsControl -api-version: 1.17 +api-version: 1.19 authors: [ ImproperIssues ] description: Manager server explosions with just a few simple clicks! website: github.com/ItziSpyder