diff --git a/.gradle/8.8/fileHashes/resourceHashesCache.bin b/.gradle/8.8/fileHashes/resourceHashesCache.bin index a0c134a..97ed5bd 100644 Binary files a/.gradle/8.8/fileHashes/resourceHashesCache.bin and b/.gradle/8.8/fileHashes/resourceHashesCache.bin differ diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java index 464b798..baeaced 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java @@ -3,6 +3,7 @@ package me.freezy.plugins.papermc.blazesmp; import lombok.Getter; import me.freezy.plugins.papermc.blazesmp.command.ClaimCommand; import me.freezy.plugins.papermc.blazesmp.command.ClanCommand; +import me.freezy.plugins.papermc.blazesmp.command.HomeCommand; import me.freezy.plugins.papermc.blazesmp.command.ReportCommand; import me.freezy.plugins.papermc.blazesmp.listener.*; import me.freezy.plugins.papermc.blazesmp.module.manager.Clans; @@ -30,11 +31,6 @@ public final class BlazeSMP extends JavaPlugin { this.log.info("Loading BlazeSMP..."); - this.log.info("Loading Homes..."); - this.homes=new Homes(); - this.homes.load(); - this.log.info("Loaded Homes!"); - this.log.info("Loading ProtectedBlocks..."); this.protectedBlocks=new ProtectedBlocks(); this.protectedBlocks.load(); @@ -60,10 +56,16 @@ public final class BlazeSMP extends JavaPlugin { this.log.info("Enabling BlazeSMP..."); + this.log.info("Loading Homes..."); + this.homes=new Homes(); + this.homes.load(); + this.log.info("Loaded Homes!"); + this.log.info("Registering Commands..."); new ClanCommand().register(); new ReportCommand().register(); new ClaimCommand().register(); + new HomeCommand().register(); this.log.info("Registered Commands!"); this.log.info("Registering EventListeners..."); diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/HomeCommand.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/HomeCommand.java new file mode 100644 index 0000000..3f16af0 --- /dev/null +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/HomeCommand.java @@ -0,0 +1,52 @@ +package me.freezy.plugins.papermc.blazesmp.command; + +import me.freezy.plugins.papermc.blazesmp.BlazeSMP; +import me.freezy.plugins.papermc.blazesmp.command.util.SimpleCommand; +import me.freezy.plugins.papermc.blazesmp.module.manager.Homes; +import me.freezy.plugins.papermc.blazesmp.tasks.PlayerTeleportHomeTimer; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class HomeCommand extends SimpleCommand { + public HomeCommand() { + super("home", List.of("sethome", "delhome")); + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (!(sender instanceof Player player)) { + sender.sendMessage(MiniMessage.miniMessage().deserialize("You must be a player to use this command!")); + return true; + } + Homes homes = BlazeSMP.getInstance().getHomes(); + + if (label.equalsIgnoreCase("sethome")) { + homes.setHome(player); + player.sendMessage(MiniMessage.miniMessage().deserialize("Home set!")); + } else if (label.equalsIgnoreCase("delhome")) { + homes.removeHome(player); + player.sendMessage(MiniMessage.miniMessage().deserialize("Home removed!")); + } else { + if (homes.hasHome(player)) { + // Informiere den Spieler, dass der Teleport-Vorgang gestartet wird + player.sendMessage(MiniMessage.miniMessage().deserialize("Teleporting to home!")); + new PlayerTeleportHomeTimer(player).runTaskTimer(BlazeSMP.getInstance(), 0, 1); + } else { + homes.setHome(player); + player.sendMessage(MiniMessage.miniMessage().deserialize("Home set!")); + } + } + return true; + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + return List.of(); + } +} diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Homes.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Homes.java index 81d7b37..f79a0d9 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Homes.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Homes.java @@ -7,6 +7,7 @@ import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.entity.Player; import java.io.File; import java.io.FileReader; @@ -112,6 +113,24 @@ public class Homes { } } + public boolean hasHome(Player player) { + return homes.containsKey(player.getUniqueId()); + } + + public Location getHome(Player player) { + return homes.get(player.getUniqueId()); + } + + public void setHome(Player player) { + homes.put(player.getUniqueId(), player.getLocation()); + save(); + } + + public void removeHome(Player player) { + homes.remove(player.getUniqueId()); + save(); + } + /** * Inner class representing the JSON structure for a location. */ diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/tasks/PlayerTeleportHomeTimer.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/tasks/PlayerTeleportHomeTimer.java new file mode 100644 index 0000000..a552600 --- /dev/null +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/tasks/PlayerTeleportHomeTimer.java @@ -0,0 +1,70 @@ +package me.freezy.plugins.papermc.blazesmp.tasks; + +import me.freezy.plugins.papermc.blazesmp.BlazeSMP; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +public class PlayerTeleportHomeTimer extends BukkitRunnable { + private final Player player; + private final double origX; + private final double origY; + private final double origZ; + // Countdown in Ticks (5 Sekunden * 20 Ticks pro Sekunde) + private int ticksRemaining = 5 * 20; + + // Felder für den Spiraleneffekt + private double angle = 0; + + public PlayerTeleportHomeTimer(Player player) { + this.player = player; + // Speichere die ursprüngliche Position, um Bewegungen zu erkennen + origX = player.getLocation().getX(); + origY = player.getLocation().getY(); + origZ = player.getLocation().getZ(); + } + + @Override + public void run() { + // Abbruch, falls sich der Spieler bewegt hat + if (player.getLocation().getX() != origX || + player.getLocation().getY() != origY || + player.getLocation().getZ() != origZ) { + player.sendMessage(MiniMessage.miniMessage().deserialize("Teleporting cancelt you moved!")); + cancel(); + return; + } + + // Berechne, wie viele Ticks bereits vergangen sind + int ticksElapsed = (5 * 20) - ticksRemaining; + + // Erzeuge den Spiraleneffekt + Location baseLoc = player.getLocation(); + double radius = 1.5; + double offsetX = Math.cos(angle) * radius; + double offsetZ = Math.sin(angle) * radius; + // Inkrementiere den Y-Wert, sodass die Spirale nach oben steigt + double offsetY = 0.2 + ticksElapsed * 0.05; + Location particleLoc = baseLoc.clone().add(offsetX, offsetY, offsetZ); + player.getWorld().spawnParticle(Particle.FLAME, particleLoc, 1, 0, 0, 0, 0); + + // Erhöhe den Winkel schneller, sodass sich die Spirale schneller dreht + double angleIncrement = Math.PI / 4; + angle += angleIncrement; + + // Teleport-Countdown und Nachrichten + if (ticksRemaining <= 0) { + player.teleportAsync(BlazeSMP.getInstance().getHomes().getHome(player)); + player.sendMessage(MiniMessage.miniMessage().deserialize("Teleported!")); + cancel(); + } else if (ticksRemaining % 20 == 0) { + int secondsLeft = ticksRemaining / 20; + String message = String.format("Teleporting to home in %s seconds!", secondsLeft); + player.sendMessage(MiniMessage.miniMessage().deserialize(message)); + } + + ticksRemaining--; + } +}