diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7b016a8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.compile.nullAnalysis.mode": "automatic" +} \ No newline at end of file diff --git a/src/main/java/org/aleabodo/fireworksmc/Commands/Fireworkshow.java b/src/main/java/org/aleabodo/fireworksmc/Commands/Fireworkshow.java index ea621d4..2ca3037 100644 --- a/src/main/java/org/aleabodo/fireworksmc/Commands/Fireworkshow.java +++ b/src/main/java/org/aleabodo/fireworksmc/Commands/Fireworkshow.java @@ -203,16 +203,11 @@ public class Fireworkshow implements CommandExecutor, TabCompleter { case "start": Fireworks_Mc.show.start(); return true; - case "generate": - Message.sendInfo(player, "Generating firework show..."); - Fireworks_Mc.show.generate(); - Message.sendInfo(player, "Firework show successfully generated!"); - return true; case "debug": Fireworks_Mc.config.print(); return true; case "reload": - Fireworks_Mc.config.reload(); + Fireworks_Mc.getPlugin().reload(); return true; default: Message.sendWarning(player, "Invalid command!"); @@ -232,7 +227,6 @@ public class Fireworkshow implements CommandExecutor, TabCompleter { completions.add("setduration"); completions.add("setseed"); completions.add("start"); - completions.add("generate"); completions.add("debug"); completions.add("reload"); completions.add("highlights"); diff --git a/src/main/java/org/aleabodo/fireworksmc/Commands/SpawnRocket.java b/src/main/java/org/aleabodo/fireworksmc/Commands/SpawnRocket.java new file mode 100644 index 0000000..5476ce5 --- /dev/null +++ b/src/main/java/org/aleabodo/fireworksmc/Commands/SpawnRocket.java @@ -0,0 +1,57 @@ +package org.aleabodo.fireworksmc.Commands; + +import org.aleabodo.fireworksmc.Fireworks_Mc; +import org.bukkit.Color; +import org.bukkit.FireworkEffect; +import org.bukkit.Location; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Firework; +import org.bukkit.entity.Player; +import org.bukkit.inventory.meta.FireworkMeta; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +public class SpawnRocket implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage("This command is reserved for players only!"); + return false; + } + + Player player = ((Player) sender).getPlayer(); + + this.spawnRocket(player.getLocation()); + + return true; + } + + private void spawnRocket(Location location) { + Firework firework = (Firework) location.getWorld().spawnEntity(location, EntityType.FIREWORK); + FireworkMeta fireworkMeta = firework.getFireworkMeta(); + + // Create a firework effect + FireworkEffect effect = FireworkEffect.builder() + .flicker(true) + .trail(true) + .withColor(Color.RED) + .withFade(Color.YELLOW) + .with(FireworkEffect.Type.BALL_LARGE) + .build(); + + fireworkMeta.addEffect(effect); + fireworkMeta.setPower(10); // Number of times the firework will explode + firework.setFireworkMeta(fireworkMeta); + + // Schedule the firework to be removed after a delay + new BukkitRunnable() { + @Override + public void run() { + firework.detonate(); + } + }.runTaskLater(Fireworks_Mc.getPlugin(), 60); // 20 ticks = 1 second + } +} diff --git a/src/main/java/org/aleabodo/fireworksmc/Config.java b/src/main/java/org/aleabodo/fireworksmc/Config.java index ea6c77c..ba6d386 100644 --- a/src/main/java/org/aleabodo/fireworksmc/Config.java +++ b/src/main/java/org/aleabodo/fireworksmc/Config.java @@ -12,7 +12,7 @@ import java.util.logging.Level; public class Config { public int bpm; public String seed; - public int duration; + public int duration; //In game-ticks public Location location; public Direction direction; public SortedSet highlights; diff --git a/src/main/java/org/aleabodo/fireworksmc/Fireworks_Mc.java b/src/main/java/org/aleabodo/fireworksmc/Fireworks_Mc.java index 6893c18..723b774 100644 --- a/src/main/java/org/aleabodo/fireworksmc/Fireworks_Mc.java +++ b/src/main/java/org/aleabodo/fireworksmc/Fireworks_Mc.java @@ -3,6 +3,7 @@ package org.aleabodo.fireworksmc; import com.github.fierioziy.particlenativeapi.api.ParticleNativeAPI; import com.github.fierioziy.particlenativeapi.plugin.ParticleNativePlugin; import org.aleabodo.fireworksmc.Commands.Fireworkshow; +import org.aleabodo.fireworksmc.Commands.SpawnRocket; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -57,6 +58,8 @@ public final class Fireworks_Mc extends JavaPlugin { */ Objects.requireNonNull(getCommand("fireworkshow")).setExecutor(new Fireworkshow()); Objects.requireNonNull(getCommand("fs")).setExecutor(new Fireworkshow()); //Command alias for fireworkshow + Objects.requireNonNull(getCommand("rocket")).setExecutor(new SpawnRocket()); + Objects.requireNonNull(getCommand("r")).setExecutor(new SpawnRocket()); } @Override @@ -64,6 +67,12 @@ public final class Fireworks_Mc extends JavaPlugin { } + public void reload() { + if (Fireworks_Mc.config != null) { + Fireworks_Mc.config.reload(); + } + } + /* * ################### GETTER ################### */ diff --git a/src/main/java/org/aleabodo/fireworksmc/Patterns/PRandom.java b/src/main/java/org/aleabodo/fireworksmc/Patterns/PRandom.java new file mode 100644 index 0000000..3731e12 --- /dev/null +++ b/src/main/java/org/aleabodo/fireworksmc/Patterns/PRandom.java @@ -0,0 +1,16 @@ +package org.aleabodo.fireworksmc.Patterns; + +import org.aleabodo.fireworksmc.Tempo; + +public class PRandom extends Pattern { + + PRandom(long seed, int duration, int bpm, Tempo tempo) { + super(seed, duration, bpm, tempo); + } + + @Override + protected void generate() { + + } + +} diff --git a/src/main/java/org/aleabodo/fireworksmc/Patterns/Pattern.java b/src/main/java/org/aleabodo/fireworksmc/Patterns/Pattern.java index 39d784f..41247e3 100644 --- a/src/main/java/org/aleabodo/fireworksmc/Patterns/Pattern.java +++ b/src/main/java/org/aleabodo/fireworksmc/Patterns/Pattern.java @@ -1,10 +1,81 @@ package org.aleabodo.fireworksmc.Patterns; -public class Pattern { - private int duration = 10; +import java.util.PriorityQueue; - public Pattern(int duration) { +import org.aleabodo.fireworksmc.Fireworks_Mc; +import org.aleabodo.fireworksmc.Tempo; +import org.bukkit.FireworkEffect; +import org.bukkit.Location; +import org.bukkit.scheduler.BukkitRunnable; +public abstract class Pattern { + protected int duration; // Delay of pattern in ticks + protected long seed; + protected int bpm; + protected Tempo tempo; + protected int startDelay; // Start delay in ticks until the first rocket detonates + private boolean cancel = false; + protected PriorityQueue scheduledThings = new PriorityQueue<>(); + + Pattern(long seed, int duration, int bpm, Tempo tempo) { + this.seed = seed; + this.duration = duration; + this.bpm = bpm; + this.tempo = tempo; + + this.generate(); + this.startDelay = scheduledThings.peek().getScheduleTime(); + } + + /** + * Start pattern + */ + public void start() { + if (scheduledThings.isEmpty()) { + return; + } + + new BukkitRunnable() { + int tick = scheduledThings.peek().getScheduleTime(); //Zecke + + @Override + public void run() { + if (cancel) { + this.cancel(); + return; + } + + while (scheduledThings.peek().getScheduleTime() == tick) { + scheduledThings.poll().schedule(); + if (scheduledThings.isEmpty()) { + this.cancel(); + return; + } + } + + tick++; + } + }.runTaskTimer(Fireworks_Mc.getPlugin(), 0, 1); + } + + /** + * Stop/cancel execution of pattern + */ + public void stop() { + this.cancel = true; + } + + /** + * Generate pattern + */ + protected abstract void generate(); + + /** + * Schedule rocket + */ + protected void scheduleRocket(int explosionTime, int flightDuration, Location location, FireworkEffect effect) { + //scheduledThings.add(); + //TODO } /* @@ -12,6 +83,28 @@ public class Pattern { */ public int getDuration() { - return duration; + return this.duration; } -} + + public int getStartDelay() { + return this.duration; + } + + /* + * ################### SETTER ################### + */ + + /** + * Pattern duration in ticks + */ + void setDuration(int duration) { + this.duration = duration; + } + + /** + * Pattern bpm in ticks + */ + void setBpm(int bpm) { + this.bpm = bpm; + } +} \ No newline at end of file diff --git a/src/main/java/org/aleabodo/fireworksmc/Patterns/ScheduledRocket.java b/src/main/java/org/aleabodo/fireworksmc/Patterns/ScheduledRocket.java new file mode 100644 index 0000000..e72a7f8 --- /dev/null +++ b/src/main/java/org/aleabodo/fireworksmc/Patterns/ScheduledRocket.java @@ -0,0 +1,14 @@ +package org.aleabodo.fireworksmc.Patterns; + +public class ScheduledRocket extends ScheduledThing { + + public ScheduledRocket() { + //TODO + } + + @Override + public void schedule() { + //TODO + } + +} \ No newline at end of file diff --git a/src/main/java/org/aleabodo/fireworksmc/Patterns/ScheduledThing.java b/src/main/java/org/aleabodo/fireworksmc/Patterns/ScheduledThing.java new file mode 100644 index 0000000..49cb411 --- /dev/null +++ b/src/main/java/org/aleabodo/fireworksmc/Patterns/ScheduledThing.java @@ -0,0 +1,20 @@ +package org.aleabodo.fireworksmc.Patterns; + +public abstract class ScheduledThing implements Comparable{ + protected int scheduleTime = 0; + + public abstract void schedule(); + + protected void setScheduleTime(int scheduleTime) { + this.scheduleTime = scheduleTime; + } + + public int getScheduleTime() { + return this.scheduleTime; + } + + @Override + public int compareTo(ScheduledThing other) { + return this.scheduleTime - other.scheduleTime; + } +} \ No newline at end of file diff --git a/src/main/java/org/aleabodo/fireworksmc/Show.java b/src/main/java/org/aleabodo/fireworksmc/Show.java index 3246d08..5c286fa 100644 --- a/src/main/java/org/aleabodo/fireworksmc/Show.java +++ b/src/main/java/org/aleabodo/fireworksmc/Show.java @@ -7,24 +7,26 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Firework; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.scheduler.BukkitRunnable; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Random; +import java.util.SortedMap; +import java.util.SortedSet; public class Show { private long seed; private Location location; private Direction direction; - private int duration; //in seconds + private int duration; //in game-ticks private int bpm; + private SortedSet highlights; + private SortedMap tempo; - public Show(long seed, Location location, Direction direction, int duration, int bpm) { + public Show(long seed, Location location, Direction direction, int duration, int bpm, SortedSet highlights, SortedMap tempo) { this.seed = seed; this.location = location; this.direction = direction; this.duration = duration; this.bpm = bpm; + this.highlights = highlights; + this.tempo = tempo; } /* @@ -38,33 +40,7 @@ public class Show { * Executes the firework show */ public void start() { - spawnRocket(this.location); - } - public void spawnRocket(Location location) { - Firework firework = (Firework) location.getWorld().spawnEntity(location, EntityType.FIREWORK); - FireworkMeta fireworkMeta = firework.getFireworkMeta(); - - // Create a firework effect - FireworkEffect effect = FireworkEffect.builder() - .flicker(true) - .trail(true) - .withColor(Color.RED) - .withFade(Color.YELLOW) - .with(FireworkEffect.Type.BALL_LARGE) - .build(); - - fireworkMeta.addEffect(effect); - fireworkMeta.setPower(1); // Number of times the firework will explode - firework.setFireworkMeta(fireworkMeta); - - // Schedule the firework to be removed after a delay - new BukkitRunnable() { - @Override - public void run() { - firework.detonate(); - } - }.runTaskLater(Fireworks_Mc.getPlugin(), 20); // 20 ticks = 1 second } /* diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 89766a6..d084395 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,6 +6,9 @@ commands: fireworkshow: description: All fireworks show related commands aliases: [fs] + rocket: + description: Spawn a rocket for testing purposes. + aliases: [ r ] depend: [ParticleNativeAPI] permissions: fireworksmc.setseed: