commands, show initial setup

This commit is contained in:
2023-08-13 00:40:16 +02:00
parent aa9aa0a534
commit bd08bf15de
7 changed files with 440 additions and 7 deletions

View File

@ -1,5 +0,0 @@
package org.aleabodo.fireworksmc;
public class Commands {
}

View File

@ -0,0 +1,101 @@
package org.aleabodo.fireworksmc.Commands;
import org.aleabodo.fireworksmc.Direction;
import org.aleabodo.fireworksmc.Fireworks_Mc;
import org.aleabodo.fireworksmc.Message;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
public class Fireworkshow implements CommandExecutor, TabCompleter {
@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();
switch (args[0]) {
case "setlocation":
//Set location
Fireworks_Mc.show.setLocation(player.getLocation());
Message.sendInfo(player, "Location successfully set to your position.");
break;
case "setdirection":
//Set direction
switch (args[1]) {
case "north":
Fireworks_Mc.show.setDirection(Direction.NORTH);
break;
case "east":
Fireworks_Mc.show.setDirection(Direction.EAST);
break;
case "south":
Fireworks_Mc.show.setDirection(Direction.SOUTH);
break;
case "west":
Fireworks_Mc.show.setDirection(Direction.WEST);
break;
default:
Message.sendWarning(player, "Please enter either 'north', 'east', 'south', or 'west'!");
}
break;
case "setduration":
//Set duration
try {
int duration = Integer.parseInt(args[1]);
Fireworks_Mc.show.setDuration(duration);
Message.sendInfo(player, "Duration successfully set to " + duration);
return true;
} catch (NumberFormatException e) {
Message.sendWarning(player, "Please enter an integer for the duration (in seconds)!");
}
case "setseed":
//Set seed
StringBuilder result = new StringBuilder(args[1]);
for (int i = 1; i<args.length; i++) {
result.append(" ").append(args[i]);
}
Fireworks_Mc.show.setSeed(String.valueOf(result));
Message.sendInfo(player, "Seed successfully changed to '" + result + "'");
return true;
case "start":
Fireworks_Mc.show.start();
default:
Message.sendWarning(player, "Invalid command!");
}
return false;
}
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
List<String> completions = new ArrayList<>();
if (args.length == 1) {
completions.add("setlocation");
completions.add("setdirection");
completions.add("setduration");
completions.add("setseed");
completions.add("start");
} else if (args.length == 2 && args[0].equals("setdirection")) {
completions.add("north");
completions.add("east");
completions.add("south");
completions.add("west");
}
return completions;
}
}

View File

@ -0,0 +1,8 @@
package org.aleabodo.fireworksmc;
public enum Direction {
NORTH,
EAST,
SOUTH,
WEST
}

View File

@ -1,21 +1,81 @@
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.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.Console;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Objects;
import java.util.Random;
import java.util.UUID;
import java.util.logging.Level;
public final class Fireworks_Mc extends JavaPlugin {
private static ParticleNativeAPI particlesAPI;
private static Fireworks_Mc plugin;
public static Show show;
@Override
public void onEnable() {
getLogger().log(Level.INFO, "awdawawdawawdawawdawawdawawdawawdawawdawawdaw");
Fireworks_Mc.plugin = this;
getLogger().info("Starting Fireworks-MC plugin ...");
/*
* Initialize Particles API
* Requires the ParticlesNativeAPI plugin
*/
if (!ParticleNativePlugin.isValid()) {
getLogger().log(Level.SEVERE, "Error occurred while loading Particles API dependency.");
this.setEnabled(false);
return;
}
particlesAPI = ParticleNativePlugin.getAPI();
//Initialize show with default values
Fireworks_Mc.show = new Show("Survival-Pi",
new Location(Fireworks_Mc.getWorld("world"), 0, 80, 0),
Direction.NORTH,
60);
/*
* Initialize command executors
*/
Objects.requireNonNull(getCommand("fireworkshow")).setExecutor(new Fireworkshow());
}
@Override
public void onDisable() {
}
/*
* ################### GETTER ###################
*/
public static World getWorld(UUID worldUUID) {
return Fireworks_Mc.plugin.getServer().getWorld(worldUUID);
}
public static World getWorld(String worldName) {
return Fireworks_Mc.plugin.getServer().getWorld(worldName);
}
public static Fireworks_Mc getPlugin() {
return plugin;
}
/*
* ################### SETTER ###################
*/
}

View File

@ -0,0 +1,125 @@
package org.aleabodo.fireworksmc;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
public class Message {
public static void sendInfo(@NotNull Player player, Component ... content) {
Component textComponent = Component.text().color(NamedTextColor.GRAY).build()
.append(Component.text("[Fireworks] ")
.color(TextColor.color(0,213,255))
.decoration(TextDecoration.BOLD, true));
for (Component comp : content) {
textComponent = textComponent.append(comp);
}
player.sendMessage(textComponent);
}
public static void sendInfo(@NotNull Player player, String content) {
sendInfo(player, Component.text(content));
}
public static void sendInfo(Collection<Player> players, Component ... content) {
for (Player p : players) {
sendInfo(p, content);
}
}
public static void sendInfo(Collection<Player> players, String content) {
for (Player p : players) {
sendInfo(p, content);
}
}
/*
* #############################################################################
* Warning
*/
public static void sendWarning(@NotNull Player player, Component ... content) {
Component textComponent = Component.text().color(NamedTextColor.GRAY).build()
.append(Component.text("[Fireworks] ")
.color(TextColor.color(255, 3, 4))
.decoration(TextDecoration.BOLD, true));
for (Component comp : content) {
textComponent = textComponent.append(comp);
}
player.sendMessage(textComponent);
}
public static void sendWarning(@NotNull Player player, String content) {
sendWarning(player, Component.text(content));
}
public static void sendWarning(Collection<Player> players, Component ... content) {
for (Player p : players) {
sendWarning(p, content);
}
}
public static void sendWarning(Collection<Player> players, String content) {
for (Player p : players) {
sendWarning(p, content);
}
}
/*
* #############################################################################
* Broadcast
*/
public static void sendBroadcast(Component ... content) {
Component textComponent = Component.text().color(NamedTextColor.GRAY).build()
.append(Component.text("[Fireworks] ")
.color(TextColor.color(255, 153, 0))
.decoration(TextDecoration.BOLD, true));
for (Component comp : content) {
textComponent = textComponent.append(comp);
}
for (Player p : Bukkit.getOnlinePlayers()) {
p.sendMessage(textComponent);
}
}
public static void sendBroadcast(String content) {
sendBroadcast(Component.text(content));
}
/*
* #############################################################################
* Debug
*/
public static void sendDebug(Component ... content) {
Component textComponent = Component.text().color(NamedTextColor.GRAY).build()
.append(Component.text("[Fireworks] ")
.color(TextColor.color(255, 0, 245))
.decoration(TextDecoration.BOLD, true));
for (Component comp : content) {
textComponent = textComponent.append(comp);
}
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.hasPermission("beacon.debug"))
p.sendMessage(textComponent);
}
}
public static void sendDebug(String content) {
sendDebug(Component.text(content));
}
}

View File

@ -0,0 +1,127 @@
package org.aleabodo.fireworksmc;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.Location;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Firework;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
public class Show {
private String seed;
private Location location;
private Direction direction;
private int duration; //in seconds
public Show(String seed, Location location, Direction direction, int duration) {
this.seed = seed;
this.location = location;
this.direction = direction;
this.duration = duration;
}
/**
* 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
}
/**
*
* @param seedString Random seed as string
* @return Random number between 0 and based on the seed
*/
private double generateRandomValueFromSeed(String seedString) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = md.digest(seedString.getBytes());
// Convert the first 8 bytes of the hash to a long value
long hashValue = 0;
for (int i = 0; i < 8; i++) {
hashValue = (hashValue << 8) | (hashBytes[i]);
}
//Convert long (hastValue) into random number between 0 and 1.
return new Random(hashValue).nextDouble();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Hashing algorithm not available. (Have to check or Intellij complains.", e);
}
}
/*
* ################### GETTER ###################
*/
public String getSeed() {
return seed;
}
public Location getLocation() {
return location;
}
public Direction getDirection() {
return direction;
}
public int getDuration() {
return duration;
}
/*
* ################### SETTER ###################
*/
public void setSeed(String seed) {
this.seed = seed;
}
public void setLocation(Location location) {
this.location = location;
}
public void setDirection(Direction direction) {
this.direction = direction;
}
public void setDuration(int duration) {
this.duration = duration;
}
}

View File

@ -2,3 +2,20 @@ name: Fireworks-Mc
version: '${project.version}'
main: org.aleabodo.fireworksmc.Fireworks_Mc
api-version: '1.20'
commands:
fireworkshow:
description: All fireworks show related commands
depend: [ParticleNativeAPI]
permissions:
fireworksmc.setseed:
description: Set the random seed for generating the fireworks show.
default: op
fireworksmc.setlocation:
description: Set the location of the fireworks show.
default: op
fireworksmc.setdirection:
description: Set the direction/rotation of the firework (north,east).
default: op
fireworksmc.debug:
description: Get debug messages
default: op