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--;
+ }
+}