6 Commits
1.0.3 ... main

Author SHA1 Message Date
Git Manager GUI
e29e91fc51 Upload folder via GUI - src 2026-06-01 21:19:04 +02:00
Git Manager GUI
54bf949763 Upload via Git Manager GUI 2026-06-01 21:18:57 +02:00
Git Manager GUI
99a326ce2e Upload folder via GUI - src 2026-05-31 12:52:00 +02:00
Git Manager GUI
3cce4477cb Upload via Git Manager GUI 2026-05-31 12:51:53 +02:00
Git Manager GUI
9e74ab28fb Upload folder via GUI - src 2026-05-24 01:16:54 +02:00
Git Manager GUI
3b7a1556d1 Upload via Git Manager GUI 2026-05-24 01:16:49 +02:00
12 changed files with 230 additions and 46 deletions

View File

@@ -7,7 +7,7 @@
<groupId>de.teleportsuite</groupId>
<artifactId>TeleportSuite</artifactId>
<version>1.0.2</version>
<version>1.0.5</version>
<packaging>jar</packaging>
<properties>

View File

@@ -19,6 +19,7 @@ public class TeleportSuite extends JavaPlugin {
private SavePointManager savePointManager;
private BungeeMessenger bungeeMessenger;
private ConfigManager configManager;
private TeleportSuiteTabCompleter tabCompleter;
@Override
public void onEnable() {
@@ -42,11 +43,22 @@ public class TeleportSuite extends JavaPlugin {
savePointManager = new SavePointManager(this);
if (configManager.isBungeeEnabled()) {
String serverName = configManager.getServerName();
if (serverName == null || serverName.isBlank() || serverName.equals("survival")) {
getLogger().warning("==================================================");
getLogger().warning("BUNGEE: bungee.server-name in config.yml ist noch");
getLogger().warning("auf dem Default-Wert 'survival'. Bitte auf den");
getLogger().warning("tatsaechlichen BungeeCord-Servernamen aendern!");
getLogger().warning("==================================================");
}
bungeeMessenger = new BungeeMessenger(this);
bungeeMessenger.register();
getLogger().info("BungeeCord-Unterstuetzung aktiviert.");
getLogger().info("BungeeCord-Unterstuetzung aktiviert. Server: " + serverName);
} else {
getLogger().warning("BungeeCord deaktiviert (bungee.enabled=false). Cross-Server-Teleport nicht verfuegbar.");
}
tabCompleter = new TeleportSuiteTabCompleter(this);
getServer().getPluginManager().registerEvents(new PlayerJoinListener(this), this);
getServer().getPluginManager().registerEvents(new PlayerDeathListener(this), this);
getServer().getPluginManager().registerEvents(new PlayerMoveListener(this), this);
@@ -64,33 +76,43 @@ public class TeleportSuite extends JavaPlugin {
}
private void registerCommands() {
getCommand("tp").setExecutor(new TpCommand(this));
getCommand("tphere").setExecutor(new TpHereCommand(this));
getCommand("tpa").setExecutor(new TpaCommand(this));
getCommand("tpaccept").setExecutor(new TpAcceptCommand(this));
getCommand("tpdeny").setExecutor(new TpDenyCommand(this));
getCommand("tppos").setExecutor(new TpPosCommand(this));
getCommand("tpall").setExecutor(new TpAllCommand(this));
getCommand("tpworld").setExecutor(new TpWorldCommand(this));
getCommand("back").setExecutor(new BackCommand(this));
getCommand("deathback").setExecutor(new DeathBackCommand(this));
getCommand("sethome").setExecutor(new SetHomeCommand(this));
getCommand("home").setExecutor(new HomeCommand(this));
getCommand("delhome").setExecutor(new DelHomeCommand(this));
getCommand("homes").setExecutor(new HomesCommand(this));
getCommand("setwarp").setExecutor(new SetWarpCommand(this));
getCommand("warp").setExecutor(new WarpCommand(this));
getCommand("delwarp").setExecutor(new DelWarpCommand(this));
getCommand("warps").setExecutor(new WarpsCommand(this));
getCommand("setportal").setExecutor(new SetPortalCommand(this));
getCommand("delportal").setExecutor(new DelPortalCommand(this));
getCommand("portals").setExecutor(new PortalsCommand(this));
getCommand("setspawn").setExecutor(new SetSpawnCommand(this));
getCommand("spawn").setExecutor(new SpawnCommand(this));
getCommand("setfirstspawn").setExecutor(new SetFirstSpawnCommand(this));
getCommand("setsavepoint").setExecutor(new SetSavePointCommand(this));
getCommand("savepoint").setExecutor(new SavePointCommand(this));
getCommand("entitytransport").setExecutor(new EntityTransportCommand(this));
registerCommand("tp", new TpCommand(this));
registerCommand("tphere", new TpHereCommand(this));
registerCommand("tpa", new TpaCommand(this));
registerCommand("tpaccept", new TpAcceptCommand(this));
registerCommand("tpdeny", new TpDenyCommand(this));
registerCommand("tppos", new TpPosCommand(this));
registerCommand("tpall", new TpAllCommand(this));
registerCommand("tpworld", new TpWorldCommand(this));
registerCommand("back", new BackCommand(this));
registerCommand("deathback", new DeathBackCommand(this));
registerCommand("sethome", new SetHomeCommand(this));
registerCommand("home", new HomeCommand(this));
registerCommand("delhome", new DelHomeCommand(this));
registerCommand("homes", new HomesCommand(this));
registerCommand("setwarp", new SetWarpCommand(this));
registerCommand("warp", new WarpCommand(this));
registerCommand("delwarp", new DelWarpCommand(this));
registerCommand("warps", new WarpsCommand(this));
registerCommand("setportal", new SetPortalCommand(this));
registerCommand("delportal", new DelPortalCommand(this));
registerCommand("portals", new PortalsCommand(this));
registerCommand("setspawn", new SetSpawnCommand(this));
registerCommand("spawn", new SpawnCommand(this));
registerCommand("setfirstspawn", new SetFirstSpawnCommand(this));
registerCommand("setsavepoint", new SetSavePointCommand(this));
registerCommand("savepoint", new SavePointCommand(this));
registerCommand("entitytransport", new EntityTransportCommand(this));
}
private void registerCommand(String name, org.bukkit.command.CommandExecutor executor) {
org.bukkit.command.PluginCommand command = getCommand(name);
if (command == null) {
getLogger().warning("Befehl '" + name + "' ist in plugin.yml nicht registriert.");
return;
}
command.setExecutor(executor);
command.setTabCompleter(tabCompleter);
}
public static TeleportSuite getInstance() { return instance; }
@@ -103,4 +125,5 @@ public class TeleportSuite extends JavaPlugin {
public SavePointManager getSavePointManager() { return savePointManager; }
public BungeeMessenger getBungeeMessenger() { return bungeeMessenger; }
public ConfigManager getConfigManager() { return configManager; }
public TeleportSuiteTabCompleter getTabCompleter() { return tabCompleter; }
}

View File

@@ -183,7 +183,7 @@ public class BungeeMessenger implements PluginMessageListener {
case "TP_PLAYERTOPLAYER": {
String senderName = in.readUTF();
String targetName = in.readUTF();
schedulePlayerToPlayerTeleport(senderName, targetName);
schedulePlayerToPlayerTeleportWithBack(senderName, targetName);
break;
}
@@ -198,10 +198,14 @@ public class BungeeMessenger implements PluginMessageListener {
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> {
org.bukkit.entity.Player p = plugin.getServer().getPlayerExact(playerName);
if (p == null || !p.isOnline()) return;
TeleportLocation loc = new TeleportLocation(
// Save back location BEFORE teleporting (teleport() with saveBack=false
// skips this, so we do it manually here for cross-server teleports)
plugin.getDatabaseManager().saveLastLocation(p.getUniqueId(),
new TeleportLocation(p.getLocation(), plugin.getConfigManager().getServerName()));
TeleportLocation dest = new TeleportLocation(
world, x, y, z, yaw, pitch,
plugin.getConfigManager().getServerName());
plugin.getTeleportManager().teleport(p, loc, false);
plugin.getTeleportManager().teleport(p, dest, false);
}, 10L);
break;
}
@@ -231,9 +235,9 @@ public class BungeeMessenger implements PluginMessageListener {
/**
* Wartet bis sender UND target lokal online sind (max. 100 × 10 Ticks = 50 s),
* dann führt player.teleport() aus identisch zum BTM-Ansatz.
* speichert Back-Location und führt dann player.teleport() aus.
*/
private void schedulePlayerToPlayerTeleport(String senderName, String targetName) {
private void schedulePlayerToPlayerTeleportWithBack(String senderName, String targetName) {
final int[] attempts = {0};
final int[] taskId = {-1};
@@ -243,6 +247,10 @@ public class BungeeMessenger implements PluginMessageListener {
org.bukkit.entity.Player target = plugin.getServer().getPlayerExact(targetName);
if (sender != null && sender.isOnline() && target != null && target.isOnline()) {
// Save back location before teleport so /back works cross-server
plugin.getDatabaseManager().saveLastLocation(sender.getUniqueId(),
new TeleportLocation(sender.getLocation(),
plugin.getConfigManager().getServerName()));
plugin.getTeleportManager().teleport(
sender,
new TeleportLocation(target.getLocation(),

View File

@@ -9,7 +9,7 @@ public class DelHomeCommand implements CommandExecutor {
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (!(sender instanceof Player)) { sender.sendMessage("§cNur für Spieler!"); return true; }
Player p = (Player) sender;
if (!p.hasPermission("teleportsuite.sethome")) { p.sendMessage(plugin.getConfigManager().getMessage("no-permission")); return true; }
if (!p.hasPermission("teleportsuite.delhome")) { p.sendMessage(plugin.getConfigManager().getMessage("no-permission")); return true; }
if (args.length < 1) { p.sendMessage("§cVerwendung: /delhome <name>"); return true; }
plugin.getHomeManager().deleteHome(p, args[0]);
return true;

View File

@@ -10,7 +10,10 @@ public class HomeCommand implements CommandExecutor {
if (!(sender instanceof Player)) { sender.sendMessage("§cNur für Spieler!"); return true; }
Player p = (Player) sender;
if (!p.hasPermission("teleportsuite.home")) { p.sendMessage(plugin.getConfigManager().getMessage("no-permission")); return true; }
String name = args.length > 0 ? args[0] : "home";
String name = args.length > 0 ? args[0] : p.getWorld().getName();
if (args.length == 0 && plugin.getDatabaseManager().getHome(p.getUniqueId(), name) == null) {
name = "home";
}
plugin.getHomeManager().teleportHome(p, name);
return true;
}

View File

@@ -10,7 +10,7 @@ public class SetHomeCommand implements CommandExecutor {
if (!(sender instanceof Player)) { sender.sendMessage("§cNur für Spieler!"); return true; }
Player p = (Player) sender;
if (!p.hasPermission("teleportsuite.sethome")) { p.sendMessage(plugin.getConfigManager().getMessage("no-permission")); return true; }
String name = args.length > 0 ? args[0] : "home";
String name = args.length > 0 ? args[0] : p.getWorld().getName();
plugin.getHomeManager().setHome(p, name);
return true;
}

View File

@@ -0,0 +1,122 @@
package de.teleportsuite.commands;
import de.teleportsuite.TeleportSuite;
import de.teleportsuite.models.Home;
import de.teleportsuite.models.Warp;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TeleportSuiteTabCompleter implements TabCompleter {
private final TeleportSuite plugin;
public TeleportSuiteTabCompleter(TeleportSuite plugin) {
this.plugin = plugin;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
String name = command.getName().toLowerCase();
List<String> suggestions = new ArrayList<>();
switch (name) {
case "tp":
case "tphere":
case "tpa":
case "tpall":
if (args.length == 1) {
suggestOnlinePlayers(args[0], suggestions);
} else if ("tp".equals(name) && args.length == 2 && sender.hasPermission("teleportsuite.admin")) {
suggestOnlinePlayers(args[1], suggestions);
}
break;
case "home":
case "delhome":
case "sethome":
if (sender instanceof Player) {
Player player = (Player) sender;
if (args.length == 1) {
suggestHomeNames(player, args[0], suggestions);
if ("sethome".equals(name)) {
String worldName = player.getWorld().getName();
StringUtil.copyPartialMatches(args[0], Collections.singletonList(worldName), suggestions);
}
}
}
break;
case "warp":
case "delwarp":
case "setwarp":
if (args.length == 1) {
suggestWarpNames(args[0], suggestions);
}
break;
case "delportal":
case "setportal":
if (args.length == 1) {
suggestPortalNames(args[0], suggestions);
}
break;
case "tpworld":
if (args.length == 1) {
suggestWorlds(args[0], suggestions);
}
break;
default:
break;
}
Collections.sort(suggestions, String.CASE_INSENSITIVE_ORDER);
return suggestions;
}
private void suggestOnlinePlayers(String token, List<String> suggestions) {
List<String> names = new ArrayList<>();
Bukkit.getOnlinePlayers().forEach(player -> names.add(player.getName()));
StringUtil.copyPartialMatches(token, names, suggestions);
}
private void suggestHomeNames(Player player, String token, List<String> suggestions) {
List<String> names = new ArrayList<>();
for (Home home : plugin.getHomeManager().getHomes(player.getUniqueId())) {
names.add(home.getName());
}
StringUtil.copyPartialMatches(token, names, suggestions);
}
private void suggestWarpNames(String token, List<String> suggestions) {
List<String> names = new ArrayList<>();
for (Warp warp : plugin.getWarpManager().getAllWarps()) {
names.add(warp.getName());
}
StringUtil.copyPartialMatches(token, names, suggestions);
}
private void suggestPortalNames(String token, List<String> suggestions) {
List<String> names = new ArrayList<>();
plugin.getPortalManager().getPortals().forEach(portal -> names.add(portal.getName()));
StringUtil.copyPartialMatches(token, names, suggestions);
}
private void suggestWorlds(String token, List<String> suggestions) {
List<String> names = new ArrayList<>();
for (World world : Bukkit.getWorlds()) {
names.add(world.getName());
}
StringUtil.copyPartialMatches(token, names, suggestions);
}
}

View File

@@ -2,7 +2,9 @@ package de.teleportsuite.listeners;
import de.teleportsuite.TeleportSuite;
import de.teleportsuite.models.TeleportLocation;
import org.bukkit.Location;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerRespawnEvent;
@@ -10,12 +12,33 @@ public class PlayerRespawnListener implements Listener {
private final TeleportSuite plugin;
public PlayerRespawnListener(TeleportSuite plugin) { this.plugin = plugin; }
@EventHandler
@EventHandler(priority = EventPriority.HIGH)
public void onRespawn(PlayerRespawnEvent event) {
if (!plugin.getConfigManager().deathRespawnToSpawn()) return;
TeleportLocation spawn = plugin.getDatabaseManager().getSpawn("spawn");
if (spawn == null) return;
var loc = spawn.toBukkitLocation();
if (loc != null) event.setRespawnLocation(loc);
if (spawn == null) {
plugin.getLogger().warning("death-respawn-to-spawn ist aktiv, aber kein Spawn gesetzt!");
return;
}
// Spawn ist auf einem anderen Server → nach dem Respawn teleportieren
String localServer = plugin.getConfigManager().getServerName();
if (!spawn.isLocalServer(localServer)) {
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> {
if (event.getPlayer().isOnline()) {
plugin.getTeleportManager().teleport(event.getPlayer(), spawn, false);
}
}, 5L);
return;
}
// Spawn ist lokal → direkt als Respawn-Location setzen
Location loc = spawn.toBukkitLocation();
if (loc == null || loc.getWorld() == null) {
plugin.getLogger().warning("Spawn-Welt \"" + spawn.getWorld() + "\" nicht gefunden!");
return;
}
event.setRespawnLocation(loc);
}
}

View File

@@ -99,7 +99,10 @@ public class TeleportManager {
Location loc = dest.toBukkitLocation();
if (loc == null || loc.getWorld() == null) {
player.sendMessage("§cZielwelt nicht gefunden!");
player.sendMessage("§cFehler: Zielwelt §6" + dest.getWorld() + "§c nicht gefunden!"
+ " Ist der Spawn auf diesem Server gesetzt?");
plugin.getLogger().warning("Teleport fehlgeschlagen: Welt '" + dest.getWorld()
+ "' fuer Spieler " + player.getName() + " nicht geladen.");
return;
}

View File

@@ -1,5 +1,5 @@
name: TeleportSuite-Bungee
main: de.teleportsuite.bungee.TeleportSuiteBungee
version: 1.0
version: 1.0.5
author: TeleportSuite
description: BungeeCord-Companion fuer TeleportSuite

View File

@@ -15,9 +15,10 @@ database:
file: teleportsuite.db
# BungeeCord Einstellungen
# WICHTIG: server-name muss dem Namen dieses Servers in der BungeeCord config.yml entsprechen!
bungee:
enabled: false
server-name: "survival" # Name dieses Servers im BungeeCord-Netz
enabled: true
server-name: "survival" # Name dieses Servers im BungeeCord-Netz (z.B. "lobby", "survival", "creative")
# Teleport Einstellungen
teleport:
@@ -70,6 +71,7 @@ messages:
death-no-location: "&cKein Todesort gespeichert."
no-permission: "&cDazu hast du keine Berechtigung."
player-not-found: "&cSpieler &6{player}&c nicht gefunden."
tpa-request-not-found: "&cKeine offene Teleportanfrage gefunden."
portal-created: "&aPortal &6{name}&a erstellt!"
portal-deleted: "&cPortal &6{name}&c gelöscht."
savepoint-set: "&aSavepoint &6{name}&a gesetzt!"

View File

@@ -1,5 +1,5 @@
name: TeleportSuite
version: 1.0.2
version: 1.0.5
main: de.teleportsuite.TeleportSuite
api-version: 1.20
description: BungeeCord-fähiges Teleport-Komplettpaket