Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e29e91fc51 | ||
|
|
54bf949763 | ||
|
|
99a326ce2e | ||
|
|
3cce4477cb | ||
|
|
9e74ab28fb | ||
|
|
3b7a1556d1 |
2
pom.xml
2
pom.xml
@@ -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>
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user