2 Commits
1.0.5 ... 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
10 changed files with 198 additions and 79 deletions

View File

@@ -7,7 +7,7 @@
<groupId>de.teleportsuite</groupId>
<artifactId>TeleportSuite</artifactId>
<version>1.0.4</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() {
@@ -57,6 +58,7 @@ public class TeleportSuite extends JavaPlugin {
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);
@@ -74,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; }
@@ -113,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

@@ -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

@@ -131,25 +131,20 @@ public class DatabaseManager {
// ===== WARPS =====
public void saveWarp(String name, TeleportLocation loc, UUID creator, String permission) {
try (Connection c = getConnection()) {
boolean exists;
try (PreparedStatement check = c.prepareStatement("SELECT 1 FROM ts_warps WHERE name=?")) {
check.setString(1, name);
exists = check.executeQuery().next();
String sql = isMySQL
? "INSERT INTO ts_warps (name,world,x,y,z,yaw,pitch,server,creator,permission) VALUES(?,?,?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE world=?,x=?,y=?,z=?,yaw=?,pitch=?,server=?"
: "INSERT OR REPLACE INTO ts_warps (name,world,x,y,z,yaw,pitch,server,creator,permission) VALUES(?,?,?,?,?,?,?,?,?,?)";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, name); ps.setString(2, loc.getWorld());
ps.setDouble(3, loc.getX()); ps.setDouble(4, loc.getY()); ps.setDouble(5, loc.getZ());
ps.setFloat(6, loc.getYaw()); ps.setFloat(7, loc.getPitch()); ps.setString(8, loc.getServer());
ps.setString(9, creator != null ? creator.toString() : null); ps.setString(10, permission);
if (isMySQL) {
ps.setString(11, loc.getWorld()); ps.setDouble(12, loc.getX()); ps.setDouble(13, loc.getY());
ps.setDouble(14, loc.getZ()); ps.setFloat(15, loc.getYaw()); ps.setFloat(16, loc.getPitch());
ps.setString(17, loc.getServer());
}
String sql = exists
? "UPDATE ts_warps SET world=?,x=?,y=?,z=?,yaw=?,pitch=?,server=?,creator=?,permission=? WHERE name=?"
: "INSERT INTO ts_warps (world,x,y,z,yaw,pitch,server,creator,permission,name) VALUES(?,?,?,?,?,?,?,?,?,?)";
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, loc.getWorld());
ps.setDouble(2, loc.getX()); ps.setDouble(3, loc.getY()); ps.setDouble(4, loc.getZ());
ps.setFloat(5, loc.getYaw()); ps.setFloat(6, loc.getPitch());
ps.setString(7, loc.getServer());
ps.setString(8, creator != null ? creator.toString() : null);
ps.setString(9, permission);
ps.setString(10, name);
ps.executeUpdate();
}
} catch (SQLException e) { plugin.getLogger().warning("saveWarp: " + e.getMessage()); }
}
@@ -255,23 +250,19 @@ public class DatabaseManager {
// ===== PLAYER DATA =====
public void saveLastLocation(UUID uuid, TeleportLocation loc) {
try (Connection c = getConnection()) {
// Check if row exists
boolean exists;
try (PreparedStatement check = c.prepareStatement("SELECT 1 FROM ts_player_data WHERE uuid=?")) {
check.setString(1, uuid.toString());
exists = check.executeQuery().next();
String sql = isMySQL
? "INSERT INTO ts_player_data (uuid,last_world,last_x,last_y,last_z,last_yaw,last_pitch,last_server) VALUES(?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE last_world=?,last_x=?,last_y=?,last_z=?,last_yaw=?,last_pitch=?,last_server=?"
: "INSERT OR REPLACE INTO ts_player_data (uuid,last_world,last_x,last_y,last_z,last_yaw,last_pitch,last_server) VALUES(?,?,?,?,?,?,?,?)";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, uuid.toString()); ps.setString(2, loc.getWorld());
ps.setDouble(3, loc.getX()); ps.setDouble(4, loc.getY()); ps.setDouble(5, loc.getZ());
ps.setFloat(6, loc.getYaw()); ps.setFloat(7, loc.getPitch()); ps.setString(8, loc.getServer());
if (isMySQL) {
ps.setString(9, loc.getWorld()); ps.setDouble(10, loc.getX()); ps.setDouble(11, loc.getY());
ps.setDouble(12, loc.getZ()); ps.setFloat(13, loc.getYaw()); ps.setFloat(14, loc.getPitch());
ps.setString(15, loc.getServer());
}
String sql = exists
? "UPDATE ts_player_data SET last_world=?,last_x=?,last_y=?,last_z=?,last_yaw=?,last_pitch=?,last_server=? WHERE uuid=?"
: "INSERT INTO ts_player_data (last_world,last_x,last_y,last_z,last_yaw,last_pitch,last_server,uuid) VALUES(?,?,?,?,?,?,?,?)";
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, loc.getWorld());
ps.setDouble(2, loc.getX()); ps.setDouble(3, loc.getY()); ps.setDouble(4, loc.getZ());
ps.setFloat(5, loc.getYaw()); ps.setFloat(6, loc.getPitch());
ps.setString(7, loc.getServer()); ps.setString(8, uuid.toString());
ps.executeUpdate();
}
} catch (SQLException e) { plugin.getLogger().warning("saveLastLocation: " + e.getMessage()); }
}

View File

@@ -11,14 +11,8 @@ public class WarpManager {
public WarpManager(TeleportSuite plugin) { this.plugin = plugin; }
public void setWarp(Player player, String name, String permission) {
// Snapshot the location at the exact moment /setwarp is called
TeleportLocation loc = new TeleportLocation(
player.getLocation().clone(),
plugin.getConfigManager().getServerName());
TeleportLocation loc = new TeleportLocation(player.getLocation(), plugin.getConfigManager().getServerName());
plugin.getDatabaseManager().saveWarp(name, loc, player.getUniqueId(), permission);
plugin.getLogger().info("Warp '" + name + "' gesetzt: "
+ loc.getWorld() + " " + loc.getX() + "/" + loc.getY() + "/" + loc.getZ()
+ " von " + player.getName());
player.sendMessage(plugin.getConfigManager().getMessage("warp-set", "name", name));
}
@@ -32,11 +26,7 @@ public class WarpManager {
player.sendMessage(plugin.getConfigManager().getMessage("no-permission"));
return;
}
TeleportLocation dest = warp.getLocation();
plugin.getLogger().info("Warp '" + name + "' geladen: "
+ dest.getWorld() + " " + dest.getX() + "/" + dest.getY() + "/" + dest.getZ()
+ " -> Spieler " + player.getName());
plugin.getTeleportManager().teleport(player, dest);
plugin.getTeleportManager().teleport(player, warp.getLocation());
}
public boolean deleteWarp(String name) {

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

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