Remove deprecated world management commands and associated SQL logic

Signed-off-by: Chaoscaot <max@maxsp.de>
This commit is contained in:
2026-05-20 16:44:32 +02:00
parent 9aa363de6f
commit a7adfe378f
33 changed files with 257 additions and 1607 deletions
@@ -29,7 +29,6 @@ import java.util.function.Consumer;
@Getter
public class Bauserver extends Subserver {
private static final Map<UUID, Bauserver> servers = new HashMap<>();
private static final Map<UUID, Bauserver> serversByWorld = new HashMap<>();
public static Bauserver get(UUID owner) {
synchronized (servers) {
@@ -37,43 +36,25 @@ public class Bauserver extends Subserver {
}
}
public static Bauserver getByWorld(UUID world) {
synchronized (serversByWorld) {
return serversByWorld.get(world);
}
}
private final UUID owner;
private final UUID world;
public Bauserver(String serverName, UUID owner, int port, ProcessBuilder processBuilder, Runnable shutdownCallback) {
this(serverName, owner, owner, port, processBuilder, shutdownCallback, null);
this(serverName, owner, port, processBuilder, shutdownCallback, null);
}
public Bauserver(String serverName, UUID owner, int port, ProcessBuilder processBuilder, Runnable shutdownCallback, Consumer<Exception> failureCallback) {
this(serverName, owner, owner, port, processBuilder, shutdownCallback, failureCallback);
}
public Bauserver(String serverName, UUID owner, UUID world, int port, ProcessBuilder processBuilder, Runnable shutdownCallback, Consumer<Exception> failureCallback) {
super(serverName, port, processBuilder, shutdownCallback, failureCallback);
this.owner = owner;
this.world = world;
synchronized (servers) {
servers.putIfAbsent(owner, this);
}
synchronized (serversByWorld) {
serversByWorld.put(world, this);
servers.put(owner, this);
}
}
@Override
protected void unregister() {
synchronized (servers) {
servers.remove(owner, this);
}
synchronized (serversByWorld) {
serversByWorld.remove(world);
servers.remove(owner);
}
super.unregister();
}
+3 -3
View File
@@ -37,8 +37,8 @@ if __name__ == "__main__":
with open(configfile, 'r') as file:
gamemode = yaml.load(file)
builderworld = sys.argv[4] if len(sys.argv) > 4 else path.expanduser(f'/worlds/builder{version}/{worldname}')
arenaworld = sys.argv[5] if len(sys.argv) > 5 else f'/servers/{gamemode["Server"]["Folder"]}/arenas/{worldname}'
builderworld = path.expanduser(f'/worlds/builder{version}/{worldname}')
arenaworld = f'/servers/{gamemode["Server"]["Folder"]}/arenas/{worldname}'
if path.exists(arenaworld):
backupworld = path.expanduser(f'/mnt/storage/backup/arenas/{datetime.datetime.now()}-{worldname}-{version}.tar.xz')
@@ -91,7 +91,7 @@ if __name__ == "__main__":
if path.exists(arenaworld):
shutil.rmtree(arenaworld)
os.makedirs(f'{arenaworld}/backup', exist_ok=True)
os.makedirs(f'{arenaworld}/backup')
shutil.copy2(f'{builderworld}/level.dat', f'{arenaworld}/backup/level.dat')
shutil.copytree(f'{builderworld}/region', f'{arenaworld}/backup/region')
@@ -219,22 +219,22 @@ IGNORE_ALREADY = §cYou are already ignoring this player.
IGNORE_MESSAGE = §7You are now ignoring §e{0}§8.
#BauCommand
BAU_ADDMEMBER_USAGE = §8/§7build addmember §8[§eworld/all§8] §8[§eplayer§8]
BAU_ADDMEMBER_USAGE = §8/§7build addmember §8[§eplayer§8]
BAU_ADDMEMBER_SELFADD = §cYou don't have to add yourself!
BAU_ADDMEMBER_ISADDED = §cThis player is already a member of your world.
BAU_ADDMEMBER_ADDED = §aThe player was added to your world.
BAU_ADDMEMBER_ADDED_TARGET = §aYou have been added to the world of §e{0}§a.
BAU_TP_USAGE = §8/§7build tp §8[§eplayer§8] §8<§eworld§8>
BAU_TP_USAGE = §8/§7build tp §8[§eplayer§8]
BAU_TP_NOALLOWED = §cYou are not allowed to teleport to this player's world.
BAU_LOCKED_NOALLOWED = §cThe build server is currently locked.
BAU_LOCK_BLOCKED = §cYour build lock has prevented §e{0} §cfrom joining.
BAU_LOCKED_OPTIONS = §8/§7build lock §8[§eworld§8] §8[§eoption§8] §7Options§8: §cnobody§8, §eserverteam§8, §eteam_and_serverteam§8, §eteam§8, §aopen
BAU_LOCKED_OPTIONS = §7Build server lock options§8: §cnobody§8, §eserverteam§8, §eteam_and_serverteam§8, §eteam§8, §aopen
BAU_LOCKED_NOBODY = §7You have locked your build server for all players.
BAU_LOCKED_SERVERTEAM = §7You have locked your build server for all players except added server team members.
BAU_LOCKED_TEAM_AND_SERVERTEAM = §7You have locked your build server for all players except added team members and server team members.
BAU_LOCKED_TEAM = §7You have locked your build server for all players except added team members.
BAU_LOCKED_OPEN = §7You have opened your build server for all added players.
BAU_DELMEMBER_USAGE = §8/§7build delmember §8[§eworld/all§8] §8[§eplayer§8]
BAU_DELMEMBER_USAGE = §8/§7build delmember §8[§eplayer§8]
BAU_DELMEMBER_SELFDEL = §cYou cannot remove yourself!
BAU_DELMEMBER_DELETED = §cPlayer was removed.
BAU_DELMEMBER_DELETED_TARGET = §cYou were removed from the world of §e{0}.
@@ -244,23 +244,9 @@ BAU_DELETE_DELETED = §aYour world is being reset.
BAU_DELETE_GUI_NAME = §eDo you really want to delete the world?
BAU_DELETE_GUI_CANCEL = §cCancel
BAU_DELETE_GUI_DELETE = §aDelete
BAU_WORLD_GUI_TITLE = §eYour worlds
BAU_WORLD_CREATE_USAGE = §8/§7build world create §8[§ename§8] §8[§eversion§8] §8[§etemplate§8]
BAU_WORLD_START_USAGE = §8/§7build world start §8[§eworld§8]
BAU_WORLD_RENAME_USAGE = §8/§7build world rename §8[§eworld§8] §8[§enew name§8]
BAU_WORLD_DELETE_USAGE = §8/§7build world delete §8[§eworld§8]
BAU_WORLD_UPGRADE_USAGE = §8/§7build world upgrade §8[§eworld§8] §8[§eversion§8]
BAU_WORLD_VERSION = §cUnknown version.
BAU_WORLD_UNKNOWN = §cUnknown world.
BAU_WORLD_EXISTS = §cA world with this name already exists for this version.
BAU_WORLD_LIMIT = §cYou have reached your build world limit of §e{0}§c. Delete one first.
BAU_WORLD_OVER_LIMIT_DELETE = §cYou currently have more than your allowed §e{0}§c build worlds. Delete one before creating, renaming, or upgrading worlds.
BAU_WORLD_CREATED = §aWorld created.
BAU_WORLD_RENAMED = §aWorld renamed.
BAU_WORLD_UPGRADED = §aWorld version updated.
BAU_START_ALREADY = §cThis server is already starting.
BAU_MEMBER_NOMEMBER = §cThis player is no member of your world!
BAU_MEMBER_SET_USAGE = §8/§7build {0} §8[§eworld/all§8] §8[§eplayer§8]
BAU_MEMBER_SET_USAGE = §8/§7build {0} §8[§eplayer§8]
BAU_MEMBER_SET_TARGET = §7You are now a §e{1}§7 on the world of §e{0}§7.
BAU_MEMBER_SET = §7The player is now a §e{0}§7.
BAU_MEMBER_SET_SPECTATOR = spectator
@@ -528,20 +514,6 @@ TEAM_EVENT_LEFT = §7Your team no longer takes part in this event
TEAM_EVENT_JOINED = §7Your team now takes part in the event §e{0}§7!
TEAM_EVENT_HOW_TO_LEAVE = §7To cancel the participation repeat the command.
#Team Worlds
TEAM_WORLD_GUI_TITLE = §eTeam worlds
TEAM_WORLD_CREATE_USAGE = §8/§7team world create §8[§ename§8] §8[§eversion§8] §8[§etemplate§8]
TEAM_WORLD_RENAME_USAGE = §8/§7team world rename §8[§eworld§8] §8[§enew name§8]
TEAM_WORLD_UPGRADE_USAGE = §8/§7team world upgrade §8[§eworld§8] §8[§eversion§8]
TEAM_WORLD_DELETE_USAGE = §8/§7team world delete §8[§eworld§8]
TEAM_WORLD_EXISTS = §cA team world with this name already exists for this version.
TEAM_WORLD_LIMIT = §cYour team already has the maximum of §e{0}§c worlds. Delete one first.
TEAM_WORLD_OVER_LIMIT_DELETE = §cYour team currently has more than the allowed §e{0}§c worlds. Delete one before creating, renaming, or upgrading worlds.
TEAM_WORLD_CREATED = §aTeam world created.
TEAM_WORLD_RENAMED = §aTeam world renamed.
TEAM_WORLD_UPGRADED = §aTeam world version updated.
TEAM_WORLD_DELETED = §aTeam world deleted.
#Team Color
TEAM_COLOR_TITLE = Choose color
@@ -700,7 +672,7 @@ LOCK_LOCALE_CHANGED = §aLanguage saved
#Builder Cloud
BUILDERCLOUD_USAGE = §8/§7buildercloud §8[§eversion§8] §8[§emap§8]
BUILDERCLOUD_CREATE_USAGE = §8/§7buildercloud create §8[§eversion§8] §8[§emap§8] §8[§etemplate§8]
BUILDERCLOUD_CREATE_USAGE = §8/§7buildercloud create §8[§eversion§8] §8[§emap§8] §8<§7generator§8>
BUILDERCLOUD_RENAME_USAGE = §8/§7buildercloud rename §8[§eversion§8] §8[§emap§8] §8[§enew name§8]
BUILDERCLOUD_DEPLOY_USAGE = §8/§7deployarena §8[§egamemode§8] §8[§eversion§8] §8[§emap§8]
BUILDERCLOUD_DEPLOY_FINISHED = §7Map deployment finished.
@@ -201,22 +201,22 @@ IGNORE_ALREADY = §cDu ignorierst diesen Spieler bereits.
IGNORE_MESSAGE = §7Du ignorierst nun §e{0}§8.
#BauCommand
BAU_ADDMEMBER_USAGE = §8/§7bau addmember §8[§eWelt/all§8] §8[§eSpieler§8]
BAU_ADDMEMBER_USAGE = §8/§7bau addmember §8[§eSpieler§8]
BAU_ADDMEMBER_SELFADD = §cDu brauchst dich nicht selbst hinzufügen!
BAU_ADDMEMBER_ISADDED = §cDieser Spieler ist bereits Mitglied auf deiner Welt.
BAU_ADDMEMBER_ADDED = §aDer Spieler wurde zu deiner Welt hinzugefügt.
BAU_ADDMEMBER_ADDED_TARGET = §aDu wurdest zu der Welt von §e{0} §ahinzugefügt.
BAU_TP_USAGE = §8/§7bau tp §8[§eSpieler§8] §8<§eWelt§8>
BAU_TP_USAGE = §8/§7bau tp §8[§eSpieler§8]
BAU_TP_NOALLOWED = §cDu darfst dich nicht auf diese Welt teleportieren.
BAU_LOCKED_NOALLOWED = §cDer Bauserver ist momentan gesperrt.
BAU_LOCK_BLOCKED = §cDeine Bausperre hat den Beitritt von §e{0} §cverhindert.
BAU_LOCKED_OPTIONS = §8/§7bau lock §8[§eWelt§8] §8[§eOption§8] §7Optionen§8: §cnobody§8, §eserverteam§8, §eteam_and_serverteam§8, §eteam§8, §aopen
BAU_LOCKED_OPTIONS = §7Bauserver-Sperroptionen§8: §cnobody§8, §eserverteam§8, §eteam_and_serverteam§8, §eteam§8, §aopen
BAU_LOCKED_NOBODY = §7Du hast deinen Bau für alle Spieler geschlossen.
BAU_LOCKED_SERVERTEAM = §7Du hast deinen Bau für alle außer hinzugefügte Serverteammitglieder gesperrt.
BAU_LOCKED_TEAM_AND_SERVERTEAM = §7Du hast deinen Bau für alle außer hinzugefügte Teammitglieder und Serverteammitglieder gesperrt.
BAU_LOCKED_TEAM = §7Du hast deinen Bau für alle außer hinzugefügte Teammitglieder gesperrt.
BAU_LOCKED_OPEN = §7Du hast deinen Bau für alle hinzugefügten Spieler geöffnet.
BAU_DELMEMBER_USAGE = §8/§7bau delmember §8[§eWelt/all§8] §8[§eSpieler§8]
BAU_DELMEMBER_USAGE = §8/§7bau delmember §8[§eSpieler§8]
BAU_DELMEMBER_SELFDEL = §cDu kannst dich nicht selbst entfernen!
BAU_DELMEMBER_DELETED = §cDer Spieler wurde entfernt.
BAU_DELMEMBER_DELETED_TARGET = §cDu wurdest von der Welt von §e{0} §centfernt.
@@ -226,23 +226,9 @@ BAU_DELETE_DELETED = §aDeine Welt wird zurückgesetzt.
BAU_DELETE_GUI_NAME = §eWirklich Welt löschen?
BAU_DELETE_GUI_CANCEL = §cAbbrechen
BAU_DELETE_GUI_DELETE = §aLöschen
BAU_WORLD_GUI_TITLE = §eDeine Welten
BAU_WORLD_CREATE_USAGE = §8/§7bau world create §8[§eName§8] §8[§eVersion§8] §8[§eTemplate§8]
BAU_WORLD_START_USAGE = §8/§7bau world start §8[§eWelt§8]
BAU_WORLD_RENAME_USAGE = §8/§7bau world rename §8[§eWelt§8] §8[§eNeuer Name§8]
BAU_WORLD_DELETE_USAGE = §8/§7bau world delete §8[§eWelt§8]
BAU_WORLD_UPGRADE_USAGE = §8/§7bau world upgrade §8[§eWelt§8] §8[§eVersion§8]
BAU_WORLD_VERSION = §cUnbekannte Version.
BAU_WORLD_UNKNOWN = §cUnbekannte Welt.
BAU_WORLD_EXISTS = §cEine Welt mit diesem Namen existiert bereits in dieser Version.
BAU_WORLD_LIMIT = §cDu hast dein Bauwelt-Limit von §e{0}§c erreicht. Lösche zuerst eine Welt.
BAU_WORLD_OVER_LIMIT_DELETE = §cDu hast aktuell mehr als die erlaubten §e{0}§c Bauwelten. Lösche eine Welt, bevor du Welten erstellst, umbenennst oder upgradest.
BAU_WORLD_CREATED = §aWelt erstellt.
BAU_WORLD_RENAMED = §aWelt umbenannt.
BAU_WORLD_UPGRADED = §aWelt-Version aktualisiert.
BAU_START_ALREADY = §cDer Server startet bereits.
BAU_MEMBER_NOMEMBER = §cDer Spieler ist kein Mitglied deiner Welt!
BAU_MEMBER_SET_USAGE = §8/§7bau {0} §8[§eWelt/all§8] §8[§eSpieler§8]
BAU_MEMBER_SET_USAGE = §8/§7bau {0} §8[§eSpieler§8]
BAU_MEMBER_SET_TARGET = §7Du bist nun ein §e{1}§7 auf der Welt von §e{0}§7.
BAU_MEMBER_SET = §7Der Spieler ist nun §e{0}§7.
BAU_MEMBER_SET_SPECTATOR = Zuschauer
@@ -500,20 +486,6 @@ TEAM_EVENT_LEFT = §7Dein Team nimmt nicht mehr am Event teil
TEAM_EVENT_JOINED = §7Dein Team nimmt nun am Event §e{0} §7 teil!
TEAM_EVENT_HOW_TO_LEAVE = §7Um die Teilnahme abzusagen, wiederhole den Befehl.
#Team Worlds
TEAM_WORLD_GUI_TITLE = §eTeamwelten
TEAM_WORLD_CREATE_USAGE = §8/§7team world create §8[§eName§8] §8[§eVersion§8] §8[§eTemplate§8]
TEAM_WORLD_RENAME_USAGE = §8/§7team world rename §8[§eWelt§8] §8[§eNeuer Name§8]
TEAM_WORLD_UPGRADE_USAGE = §8/§7team world upgrade §8[§eWelt§8] §8[§eVersion§8]
TEAM_WORLD_DELETE_USAGE = §8/§7team world delete §8[§eWelt§8]
TEAM_WORLD_EXISTS = §cEine Teamwelt mit diesem Namen existiert bereits in dieser Version.
TEAM_WORLD_LIMIT = §cDein Team hat bereits das Maximum von §e{0}§c Welten. Lösche zuerst eine Welt.
TEAM_WORLD_OVER_LIMIT_DELETE = §cDein Team hat aktuell mehr als die erlaubten §e{0}§c Welten. Lösche eine Welt, bevor du Welten erstellst, umbenennst oder upgradest.
TEAM_WORLD_CREATED = §aTeamwelt erstellt.
TEAM_WORLD_RENAMED = §aTeamwelt umbenannt.
TEAM_WORLD_UPGRADED = §aTeamwelt-Version aktualisiert.
TEAM_WORLD_DELETED = §aTeamwelt gelöscht.
#Team Color
TEAM_COLOR_TITLE = Farbe wählen
@@ -667,7 +639,7 @@ LOCK_LOCALE_CHANGED = §aSprache gespeichert
#Builder Cloud
BUILDERCLOUD_USAGE = §8/§7buildercloud §8[§eVersion§8] §8[§eWelt§8]
BUILDERCLOUD_CREATE_USAGE = §8/§7buildercloud create §8[§eVersion§8] §8[§eWelt§8] §8[§eTemplate§8]
BUILDERCLOUD_CREATE_USAGE = §8/§7buildercloud create §8[§eVersion§8] §8[§eWelt§8] §8<§7Generator§8>
BUILDERCLOUD_RENAME_USAGE = §8/§7buildercloud rename §8[§eVersion§8] §8[§eWElt§8] §8[§eNeuer Name§8]
BUILDERCLOUD_VERSION = §cUnbekannte Version.
BUILDERCLOUD_EXISTING_MAP = §cWelt existiert bereits.
@@ -51,9 +51,11 @@ public class ServerStarter {
private static final String EVENT_PATH = TMP_DATA + "event/";
public static final String TEMP_WORLD_PATH = TMP_DATA + "arenaserver/";
public static final String WORLDS_BASE_PATH = SteamwarWorld.WORLD_STORAGE + "/";
public static final String LEGACY_WORLDS_BASE_PATH = "/worlds/userworlds";
public static final String LEGACY_BUILDER_BASE_PATH = "/worlds/builder";
private static final String WORLDS_FOLDER = "/worlds";
public static final String WORLDS_BASE_PATH = WORLDS_FOLDER + "/userworlds";
public static final String BUILDER_BASE_PATH = WORLDS_FOLDER + "/builder";
private static final String WORLDS_STORAGE_BASE_PATH = "/mnt/storage/worlds/userworlds";
private File directory = null;
private String worldDir = null;
@@ -89,8 +91,7 @@ public class ServerStarter {
gameMode = mode.configFile.getName().replace(".yml", "");
directory = new File(SERVER_PATH, mode.Server.Folder);
arguments.put("config", mode.configFile.getName());
SteamwarWorld arenaWorld = SteamwarWorld.getOrCreateArenaWorld(gameMode, map, version.getVersionSuffix());
tempWorld(arenaWorld.setupAndGetStoragePath());
tempWorld(SERVER_PATH + mode.Server.Folder + "/arenas/" + map);
startCondition = () -> {
if (playersToSend.stream().anyMatch(player -> Subserver.isArena(Subserver.getSubserver(player)))) {
playersToSend.forEach(player -> Chatter.of(player).system("FIGHT_IN_ARENA"));
@@ -152,36 +153,30 @@ public class ServerStarter {
}
public ServerStarter build(ServerVersion version, UUID owner) {
this.version = version;
SteamwarUser user = SteamwarUser.get(owner);
return build(version, SteamwarWorld.getOrCreateBauWorld(user, version.getVersionSuffix()));
}
public ServerStarter build(ServerVersion version, SteamwarWorld world) {
this.version = version;
directory = version.getServerDirectory("Bau");
SteamwarUser user = world.getOwner() == null ? null : SteamwarUser.byId(world.getOwner().getValue());
worldDir = WORLDS_BASE_PATH;
worldName = world.getUuid().toString();
worldDir = version.getWorldFolder(WORLDS_BASE_PATH);
worldName = String.valueOf(SteamwarUser.get(owner).getId());
checkpoint = true;
if (world.getType() == WorldType.TEAM) {
build(world.getUuid());
Team team = Team.byId(world.getTeam().getValue());
serverNameProvider = port -> team.getTeamKuerzel() + "s Bau";
arguments.put("bauTeam", String.valueOf(world.getTeam().getValue()));
} else {
build(user.getUUID(), world.getUuid());
arguments.put("bauOwner", String.valueOf(user.getId()));
}
arguments.put("bauWorld", world.getUuid().toString());
arguments.put("bauType", world.getType().name());
build(owner);
worldSetup = () -> world.setupAndGetStoragePath(new File(directory, "Bauwelt"));
worldSetup = () -> {
File world = new File(worldDir, worldName);
if (!world.exists()) {
File storage = new File(version.getWorldFolder(WORLDS_STORAGE_BASE_PATH), worldName);
if (storage.exists()) {
node.execute("mv", storage.getPath(), world.getPath());
} else {
copyWorld(node, new File(directory, "Bauwelt").getPath(), world.getPath());
}
}
};
// Send players to existing server
startCondition = () -> {
Bauserver subserver = Bauserver.getByWorld(world.getUuid());
Bauserver subserver = Bauserver.get(owner);
if (subserver != null) {
for (Player p : playersToSend) {
SubserverSystem.sendPlayer(subserver, p);
@@ -189,13 +184,9 @@ public class ServerStarter {
return false;
}
boolean atLeastOneSupervisor = playersToSend.stream().anyMatch(player -> {
SteamwarUser playerUser = SteamwarUser.get(player.getUniqueId());
if (world.getType() == WorldType.TEAM) {
return playerUser.getTeam() == world.getTeam().getValue();
}
if (user != null && playerUser.getId() == user.getId()) return true;
BauweltMember bauweltMember = BauweltMember.getBauMember(world.getUuid(), playerUser.getId());
return bauweltMember != null && bauweltMember.isSupervisor();
if (player.getUniqueId().equals(owner)) return true;
BauweltMember bauweltMember = BauweltMember.getBauMember(owner, player.getUniqueId());
return bauweltMember.isSupervisor();
});
if (!atLeastOneSupervisor) {
for (Player p : playersToSend) {
@@ -229,20 +220,15 @@ public class ServerStarter {
}
private void build(UUID owner) {
build(owner, owner);
}
private void build(UUID owner, UUID world) {
constructor = (serverName, port, builder, shutdownCallback, failureCallback) -> new Bauserver(serverName, owner, world, port, builder, shutdownCallback, failureCallback);
constructor = (serverName, port, builder, shutdownCallback, failureCallback) -> new Bauserver(serverName, owner, port, builder, shutdownCallback, failureCallback);
serverNameProvider = port -> bauServerName(SteamwarUser.get(owner));
}
public ServerStarter builder(ServerVersion version, String map, File prototype) {
public ServerStarter builder(ServerVersion version, String map, File generator) {
this.version = version;
directory = version.getServerDirectory("Builder");
SteamwarWorld world = SteamwarWorld.getOrCreateBuilderWorld(map, version.getVersionSuffix());
worldDir = WORLDS_BASE_PATH;
worldName = world.getUuid().toString();
worldDir = version.getWorldFolder(BUILDER_BASE_PATH);
worldName = map;
serverNameProvider = port -> "*" + map;
checkpoint = true;
constructor = (serverName, port, builder, shutdownCallback, failureCallback) -> new Builderserver(serverName, worldName, port, builder, shutdownCallback, failureCallback);
@@ -259,7 +245,16 @@ public class ServerStarter {
return true;
};
worldSetup = () -> world.setupAndGetStoragePath(prototype != null ? prototype : legacyBuilderWorld(version, map));
if (generator != null) {
worldSetup = () -> {
File leveldat = new File(new File(worldDir, worldName), "level.dat");
try {
Files.copy(generator.toPath(), leveldat.toPath());
} catch (IOException e) {
throw new SecurityException(e);
}
};
}
return this;
}
@@ -363,22 +358,6 @@ public class ServerStarter {
node.execute("cp", "-r", template, target);
}
private static File legacyBauWorld(ServerVersion version, SteamwarUser user) {
File legacyIdWorld = new File(version.getWorldFolder(LEGACY_WORLDS_BASE_PATH), String.valueOf(user.getId()));
if(legacyIdWorld.exists())
return legacyIdWorld;
File legacyUuidWorld = new File(version.getWorldFolder(LEGACY_WORLDS_BASE_PATH), user.getUUID().toString());
if(legacyUuidWorld.exists())
return legacyUuidWorld;
return new File(version.getServerDirectory("Bau"), "Bauwelt");
}
public static File legacyBuilderWorld(ServerVersion version, String map) {
return new File(version.getWorldFolder(LEGACY_BUILDER_BASE_PATH), map);
}
private interface ServerConstructor {
Subserver construct(String serverName, int port, ProcessBuilder builder, Runnable shutdownCallback, Consumer<Exception> failureCallback);
}
@@ -417,4 +396,4 @@ public class ServerStarter {
}
}
}
}
@@ -35,19 +35,16 @@ import de.steamwar.persistent.Bauserver;
import de.steamwar.sql.BauweltMember;
import de.steamwar.sql.GameModeConfig;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.SteamwarWorld;
import de.steamwar.sql.UserPerm;
import de.steamwar.velocitycore.*;
import de.steamwar.velocitycore.ServerStarter;
import de.steamwar.velocitycore.ServerVersion;
import de.steamwar.velocitycore.SubserverSystem;
import de.steamwar.velocitycore.VelocityCore;
import de.steamwar.velocitycore.inventory.SWInventory;
import de.steamwar.velocitycore.inventory.SWItem;
import de.steamwar.velocitycore.inventory.SWListInv;
import de.steamwar.velocitycore.network.NetworkSender;
import de.steamwar.velocitycore.util.BauLock;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.function.Consumer;
@Linked
@@ -67,13 +64,13 @@ public class BauCommand extends SWCommand {
}
@Register
public void toBau(PlayerChatter sender, @Mapper("ownBauWorld") @OptionalValue(value = "", onlyUINIG = true) @AllowNull SteamwarWorld world) {
startPersonalWorld(sender, world);
public void toBau(PlayerChatter sender, @OptionalValue(value = "", onlyUINIG = true) ServerVersion version) {
new ServerStarter().build(version, sender.user().getUUID()).send(sender.getPlayer()).start();
}
@Register(value = "addmember", description = "BAU_ADDMEMBER_USAGE")
public void addmember(Chatter sender, @Mapper("bauWorldSelector") String world, @Validator("addMemberTarget") SteamwarUser target) {
if (!forEachSelectedWorld(sender, world, bauworld -> BauweltMember.addMember(bauworld.getUuid(), target.getId()))) return;
public void addmember(Chatter sender, @Validator("addMemberTarget") SteamwarUser target) {
BauweltMember.addMember(sender.user().getUUID(), target.getUUID());
sender.system("BAU_ADDMEMBER_ADDED");
Chatter.of(target.getUUID()).system("BAU_ADDMEMBER_ADDED_TARGET", sender);
}
@@ -89,31 +86,18 @@ public class BauCommand extends SWCommand {
messageSender.send("BAU_ADDMEMBER_SELFADD");
return false;
}
if (BauweltMember.getBauMember(sender.user().getId(), value.getId()) != null) {
messageSender.send("BAU_ADDMEMBER_ISADDED");
return false;
}
return true;
};
}
@Register(value = "tp", description = "BAU_TP_USAGE")
@Register("teleport")
public void teleport(PlayerChatter sender, @Validator("teleportTarget") SteamwarUser worldOwner, @Mapper("targetBauWorld") @OptionalValue(value = "", onlyUINIG = true) @AllowNull SteamwarWorld world) {
if (world == null) {
world = defaultPersonalWorld(worldOwner);
}
if (world == null) {
sender.system("BAU_WORLD_UNKNOWN");
return;
}
if (sender.user().getId() != worldOwner.getId() && BauLock.isLocked(world, sender.user())) {
sender.system("BAU_LOCKED_NOALLOWED");
Chatter.of(worldOwner.getUUID()).system("BAU_LOCK_BLOCKED", sender);
return;
}
if (sender.user().getId() != worldOwner.getId() && BauweltMember.getBauMember(world.getUuid(), sender.user().getId()) == null) {
SubserverSystem.sendDeniedMessage(sender, worldOwner.getUUID());
sender.system("BAU_TP_NOALLOWED");
return;
}
new ServerStarter().build(ServerVersion.get(world.getVersion()), world).send(sender.getPlayer()).start();
public void teleport(PlayerChatter sender, @Validator("teleportTarget") SteamwarUser worldOwner, @OptionalValue(value = "", onlyUINIG = true) ServerVersion version) {
new ServerStarter().build(version, worldOwner.getUUID()).send(sender.getPlayer()).start();
}
@Validator(value = "teleportTarget", local = true)
@@ -123,6 +107,17 @@ public class BauCommand extends SWCommand {
messageSender.send("UNKNOWN_PLAYER");
return false;
}
if (sender.user().getId() != owner.getId() && BauweltMember.getBauMember(owner.getId(), sender.user().getId()) == null) {
SubserverSystem.sendDeniedMessage(sender, owner.getUUID());
messageSender.send("BAU_TP_NOALLOWED");
return false;
}
if (BauLock.isLocked(owner, sender.user())) {
messageSender.send("BAU_LOCKED_NOALLOWED");
Chatter.of(owner.getUUID()).system("BAU_LOCK_BLOCKED", sender);
return false;
}
return true;
};
}
@@ -133,39 +128,39 @@ public class BauCommand extends SWCommand {
}
@Register("setspectator")
public void setSpectator(Chatter sender, @Mapper("bauWorldSelector") String world, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
setPerms(sender, world, user, "setspectator", "BAU_MEMBER_SET_SPECTATOR", member -> {
public void setSpectator(Chatter sender, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
setPerms(sender, user, "setspectator", "BAU_MEMBER_SET_SPECTATOR", member -> {
member.setBuild(false);
member.setSupervisor(false);
});
}
@Register("setbuilder")
public void setBuilder(Chatter sender, @Mapper("bauWorldSelector") String world, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
setPerms(sender, world, user, "setbuild", "BAU_MEMBER_SET_BUILDER", member -> {
public void setBuilder(Chatter sender, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
setPerms(sender, user, "setbuild", "BAU_MEMBER_SET_BUILDER", member -> {
member.setBuild(true);
member.setSupervisor(false);
});
}
@Register("setsupervisor")
public void setSupervisor(Chatter sender, @Mapper("bauWorldSelector") String world, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
setPerms(sender, world, user, "setsupervisor", "BAU_MEMBER_SET_SUPERVISOR", member -> {
public void setSupervisor(Chatter sender, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
setPerms(sender, user, "setsupervisor", "BAU_MEMBER_SET_SUPERVISOR", member -> {
member.setBuild(true);
member.setSupervisor(true);
});
}
private void setPerms(Chatter owner, String world, SteamwarUser user, String name, String permName, Consumer<BauweltMember> setter) {
private void setPerms(Chatter owner, SteamwarUser user, String name, String permName, Consumer<BauweltMember> setter) {
if (user == null) {
owner.system("BAU_MEMBER_SET_USAGE", name);
return;
}
withMembers(owner, world, user, target -> {
withMember(owner, user, target -> {
setter.accept(target);
Bauserver bauserver = Bauserver.getByWorld(target.getWorldID());
Bauserver bauserver = Bauserver.get(owner.user().getUUID());
if (bauserver != null) {
bauserver.getRegisteredServer().getPlayersConnected().stream().findAny().ifPresent(player -> NetworkSender.send(player, new BaumemberUpdatePacket()));
}
@@ -176,11 +171,11 @@ public class BauCommand extends SWCommand {
}
@Register(value = "delmember", description = "BAU_DELMEMBER_USAGE")
public void delmember(Chatter owner, @Mapper("bauWorldSelector") String world, @Mapper("addedUsers") SteamwarUser user) {
withMembers(owner, world, user, target -> {
public void delmember(Chatter owner, @Mapper("addedUsers") SteamwarUser user) {
withMember(owner, user, target -> {
target.remove();
Bauserver bauserver = Bauserver.getByWorld(target.getWorldID());
Bauserver bauserver = Bauserver.get(owner.user().getUUID());
Chatter member = Chatter.of(user.getUUID());
member.withPlayer(player -> {
if (bauserver != null && bauserver.getRegisteredServer().getPlayersConnected().contains(player)) {
@@ -197,29 +192,6 @@ public class BauCommand extends SWCommand {
});
}
@Mapper(value = "bauWorldSelector", local = true)
public TypeMapper<String> bauWorldSelector() {
return new TypeMapper<>() {
@Override
public String map(Chatter sender, PreviousArguments previousArguments, String s) {
if ("all".equalsIgnoreCase(s)) return "all";
return SteamwarWorld.getBauWorlds(sender.user()).stream()
.map(SteamwarWorld::getName)
.filter(name -> name.equalsIgnoreCase(s))
.findFirst()
.orElse(null);
}
@Override
public Collection<String> tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) {
List<String> worlds = new ArrayList<>();
worlds.add("all");
SteamwarWorld.getBauWorlds(sender.user()).stream().map(SteamwarWorld::getName).forEach(worlds::add);
return worlds;
}
};
}
@Mapper(value = "addedUsers", local = true)
public TypeMapper<SteamwarUser> addedUsers() {
return new TypeMapper<SteamwarUser>() {
@@ -230,10 +202,8 @@ public class BauCommand extends SWCommand {
@Override
public Collection<String> tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) {
return selectedWorlds(sender, previousArguments.userArgs.length == 0 ? "all" : previousArguments.userArgs[previousArguments.userArgs.length - 1]).stream()
.flatMap(world -> BauweltMember.getWorldMembers(world.getUuid()).stream())
return BauweltMember.getMembers(sender.user().getId()).stream()
.map(bauweltMember -> SteamwarUser.byId(bauweltMember.getMemberID()).getUserName())
.distinct()
.toList();
}
};
@@ -243,11 +213,9 @@ public class BauCommand extends SWCommand {
public void stop(PlayerChatter sender) {
VelocityCore.schedule(() -> {
sender.system("BAU_STOPPING");
for (SteamwarWorld world : SteamwarWorld.getBauWorlds(sender.user())) {
Bauserver subserver = Bauserver.getByWorld(world.getUuid());
if (subserver != null) {
subserver.stop();
}
Bauserver subserver = Bauserver.get(sender.user().getUUID());
if (subserver != null) {
subserver.stop();
}
sender.system("BAU_STOPPED");
@@ -256,50 +224,25 @@ public class BauCommand extends SWCommand {
@Register("resetall")
@Register("delete")
public void delete(PlayerChatter sender, @Mapper("ownBauWorld") SteamwarWorld world) {
openDeleteWorld(sender, world);
}
public void delete(PlayerChatter sender, ServerVersion version) {
SWInventory inventory = new SWInventory(sender, 9, new Message("BAU_DELETE_GUI_NAME"));
inventory.addItem(0, new SWItem("LIME_DYE", new Message("BAU_DELETE_GUI_DELETE")), click -> {
String world = version.getWorldFolder(ServerStarter.WORLDS_BASE_PATH) + sender.user().getId();
@Register("worlds")
@Register("world")
public void worlds(PlayerChatter sender) {
openWorldList(sender);
}
VelocityCore.schedule(() -> {
Bauserver subserver = Bauserver.get(sender.user().getUUID());
if (subserver != null) {
subserver.stop();
}
@Register(value = "world create", description = "BAU_WORLD_CREATE_USAGE")
public void createWorld(PlayerChatter sender, String name, @ErrorMessage("BAU_WORLD_VERSION") ServerVersion version, @Mapper("templateWorld") SteamwarWorld template) {
SteamwarWorld world = createPersonalWorld(sender, name, version, template);
if (world != null) {
sender.system("BAU_WORLD_CREATED");
}
}
SubserverSystem.deleteFolder(VelocityCore.local, world);
sender.system("BAU_DELETE_DELETED");
}).schedule();
@Register(value = "world start", description = "BAU_WORLD_START_USAGE")
public void startWorld(PlayerChatter sender, @Mapper("ownBauWorld") SteamwarWorld world) {
new ServerStarter().build(ServerVersion.get(world.getVersion()), world).send(sender.getPlayer()).start();
}
@Register(value = "world rename", description = "BAU_WORLD_RENAME_USAGE")
public void renameWorld(Chatter sender, @Mapper("ownBauWorld") SteamwarWorld world, String newName) {
if (hasTooManyPersonalWorlds(sender)) return;
if (SteamwarWorld.getBauWorld(sender.user(), newName, world.getVersion()) != null) {
sender.system("BAU_WORLD_EXISTS");
return;
}
world.rename(newName);
sender.system("BAU_WORLD_RENAMED");
}
@Register(value = "world delete", description = "BAU_WORLD_DELETE_USAGE")
public void deleteWorld(PlayerChatter sender, @Mapper("ownBauWorld") SteamwarWorld world) {
openDeleteWorld(sender, world);
}
@Register(value = "world upgrade", description = "BAU_WORLD_UPGRADE_USAGE")
public void upgradeWorld(Chatter sender, @Mapper("ownBauWorld") SteamwarWorld world, @ErrorMessage("BAU_WORLD_VERSION") ServerVersion version) {
if (hasTooManyPersonalWorlds(sender)) return;
world.changeVersion(version.getVersionSuffix());
sender.system("BAU_WORLD_UPGRADED");
inventory.close();
});
inventory.addItem(8, new SWItem("RED_DYE", new Message("BAU_DELETE_GUI_CANCEL")), click -> inventory.close());
inventory.open();
}
@Register("test")
@@ -311,244 +254,27 @@ public class BauCommand extends SWCommand {
}
@Register(value = "lock", description = "BAU_LOCKED_OPTIONS")
public void lock(Chatter sender, @Mapper("ownBauWorld") SteamwarWorld world, BauLockState bauLockState) {
BauLock.setLocked(sender, world, bauLockState);
public void lock(Chatter sender, BauLockState bauLockState) {
BauLock.setLocked(sender, bauLockState);
}
@Register("unlock")
public void unlock(Chatter sender, @Mapper("ownBauWorld") SteamwarWorld world) {
BauLock.setLocked(sender, world, BauLockState.OPEN);
public void unlock(Chatter sender) {
BauLock.setLocked(sender, BauLockState.OPEN);
}
private static void withMembers(Chatter owner, String worldSelector, SteamwarUser member, Consumer<BauweltMember> function) {
private static void withMember(Chatter owner, SteamwarUser member, Consumer<BauweltMember> function) {
if (member == null) {
owner.system("UNKNOWN_PLAYER");
return;
}
List<SteamwarWorld> worlds = selectedWorlds(owner, worldSelector);
if (worlds.isEmpty()) {
owner.system("BAU_WORLD_UNKNOWN");
return;
}
boolean found = false;
for (SteamwarWorld world : worlds) {
BauweltMember target = BauweltMember.getBauMember(world.getUuid(), member.getId());
if (target == null) continue;
found = true;
function.accept(target);
}
if (!found) {
BauweltMember target = BauweltMember.getBauMember(owner.user().getId(), member.getId());
if (target == null) {
owner.system("BAU_MEMBER_NOMEMBER");
}
}
@Mapper(value = "ownBauWorld", local = true)
private TypeMapper<SteamwarWorld> ownBauWorldMapper() {
return new TypeMapper<SteamwarWorld>() {
@Override
public SteamwarWorld map(Chatter sender, PreviousArguments previousArguments, String s) {
if (s == null || s.isEmpty()) return defaultPersonalWorld(sender);
return SteamwarWorld.getBauWorlds(sender.user()).stream()
.filter(world -> world.getName().equalsIgnoreCase(s) || world.getUuid().toString().equalsIgnoreCase(s))
.findFirst()
.orElse(null);
}
@Override
public Collection<String> tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) {
return SteamwarWorld.getBauWorlds(sender.user()).stream().map(SteamwarWorld::getName).toList();
}
};
}
@Mapper(value = "targetBauWorld", local = true)
private TypeMapper<SteamwarWorld> targetBauWorldMapper() {
return new TypeMapper<>() {
@Override
public SteamwarWorld map(Chatter sender, PreviousArguments previousArguments, String s) {
SteamwarUser owner = previousArguments.getAll(SteamwarUser.class).stream().findFirst().orElse(null);
if (owner == null) return null;
if (s == null || s.isEmpty()) return defaultPersonalWorld(owner);
return SteamwarWorld.getBauWorlds(owner).stream()
.filter(world -> world.getName().equalsIgnoreCase(s) || world.getUuid().toString().equalsIgnoreCase(s))
.findFirst()
.orElse(null);
}
@Override
public Collection<String> tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) {
SteamwarUser owner = previousArguments.getAll(SteamwarUser.class).stream().findFirst().orElse(null);
if (owner == null) return List.of();
return SteamwarWorld.getBauWorlds(owner).stream().map(SteamwarWorld::getName).toList();
}
};
}
@Mapper(value = "templateWorld", local = true)
private TypeMapper<SteamwarWorld> templateWorldMapper() {
return new TypeMapper<>() {
@Override
public SteamwarWorld map(Chatter sender, PreviousArguments previousArguments, String s) {
ServerVersion version = previousArguments.getAll(ServerVersion.class).stream().findFirst().orElse(null);
if (version == null) return null;
return SteamwarWorld.getTemplateWorld(s, version.getVersionSuffix());
}
@Override
public Collection<String> tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) {
ServerVersion version = previousArguments.getAll(ServerVersion.class).stream().findFirst().orElse(null);
if (version == null) return List.of();
return SteamwarWorld.getTemplateWorlds(version.getVersionSuffix()).stream().map(SteamwarWorld::getName).toList();
}
};
}
private void openWorldList(PlayerChatter sender) {
List<SWListInv.SWListEntry<SteamwarWorld>> entries = new ArrayList<>();
for (SteamwarWorld world : SteamwarWorld.getBauWorlds(sender.user())) {
SWItem item = new SWItem("GRASS_BLOCK", new Message("PLAIN_STRING", "§e" + world.getName()))
.addLore(new Message("PLAIN_STRING", "§7Version: §e" + world.getVersion()))
.addLore(new Message("PLAIN_STRING", "§7Left: start, right: manage"));
entries.add(new SWListInv.SWListEntry<>(item, world));
}
SWListInv<SteamwarWorld> inventory = new SWListInv<>(sender, new Message("BAU_WORLD_GUI_TITLE"), entries, (click, world) -> {
if (click.isRightClick()) {
openWorldManagement(sender, world);
} else {
new ServerStarter().build(ServerVersion.get(world.getVersion()), world).send(sender.getPlayer()).start();
}
});
inventory.open();
}
private void openWorldManagement(PlayerChatter sender, SteamwarWorld world) {
SWInventory inventory = new SWInventory(sender, 9, new Message("PLAIN_STRING", "§e" + world.getName()));
inventory.addItem(0, new SWItem("ENDER_PEARL", new Message("PLAIN_STRING", "§aStart")), click -> {
inventory.close();
new ServerStarter().build(ServerVersion.get(world.getVersion()), world).send(sender.getPlayer()).start();
});
inventory.addItem(3, new SWItem("EXPERIENCE_BOTTLE", new Message("PLAIN_STRING", "§eUpgrade to latest")), click -> {
if (hasTooManyPersonalWorlds(sender)) {
inventory.close();
return;
}
world.changeVersion(ServerVersion.PAPER_21.getVersionSuffix());
sender.system("BAU_WORLD_UPGRADED");
inventory.close();
});
inventory.addItem(8, new SWItem("BARRIER", new Message("PLAIN_STRING", "§cDelete")), click -> openDeleteWorld(sender, world));
inventory.open();
}
private void openDeleteWorld(PlayerChatter sender, SteamwarWorld world) {
SWInventory inventory = new SWInventory(sender, 9, new Message("BAU_DELETE_GUI_NAME"));
inventory.addItem(0, new SWItem("LIME_DYE", new Message("BAU_DELETE_GUI_DELETE")), click -> {
VelocityCore.schedule(() -> {
Bauserver subserver = Bauserver.getByWorld(world.getUuid());
if (subserver != null) {
subserver.stop();
}
world.markDeleted();
SubserverSystem.deleteFolder(VelocityCore.local, world.getStorageDirectory().getPath());
sender.system("BAU_DELETE_DELETED");
}).schedule();
inventory.close();
});
inventory.addItem(8, new SWItem("RED_DYE", new Message("BAU_DELETE_GUI_CANCEL")), click -> inventory.close());
inventory.open();
}
private void startPersonalWorld(PlayerChatter sender, SteamwarWorld world) {
if (world == null) {
world = defaultPersonalWorld(sender);
}
if (world == null) {
sender.system("BAU_WORLD_UNKNOWN");
return;
}
new ServerStarter().build(ServerVersion.get(world.getVersion()), world).send(sender.getPlayer()).start();
}
private static SteamwarWorld defaultPersonalWorld(Chatter sender) {
return defaultPersonalWorld(sender.user());
}
private static SteamwarWorld defaultPersonalWorld(SteamwarUser user) {
return SteamwarWorld.getBauWorlds(user).stream().findFirst().orElse(null);
}
private static List<SteamwarWorld> selectedWorlds(Chatter sender, String selector) {
List<SteamwarWorld> worlds = SteamwarWorld.getBauWorlds(sender.user());
if ("all".equalsIgnoreCase(selector)) {
return worlds;
}
String normalized = selector.toLowerCase(Locale.ROOT);
return worlds.stream()
.filter(world -> world.getName().toLowerCase(Locale.ROOT).equals(normalized))
.toList();
}
private static boolean forEachSelectedWorld(Chatter sender, String selector, Consumer<SteamwarWorld> consumer) {
List<SteamwarWorld> worlds = selectedWorlds(sender, selector);
if (worlds.isEmpty()) {
sender.system("BAU_WORLD_UNKNOWN");
return false;
}
worlds.forEach(consumer);
return true;
}
private SteamwarWorld createPersonalWorld(Chatter sender, String name, ServerVersion version, SteamwarWorld template) {
if (template == null || template.getVersion() != version.getVersionSuffix()) {
sender.system("BAU_WORLD_UNKNOWN");
return null;
}
if (sender.user().hasPerm(UserPerm.BUILD_UNLIMITED_WORLDS)) {
if (SteamwarWorld.getBauWorld(sender.user(), name, version.getVersionSuffix()) != null) {
sender.system("BAU_WORLD_EXISTS");
return null;
}
return SteamwarWorld.getOrCreateBauWorld(sender.user(), name, version.getVersionSuffix(), template.getStorageDirectory());
}
long limit = personalWorldLimit(sender);
long count = SteamwarWorld.countBauWorlds(sender.user());
if (count > limit) {
sender.system("BAU_WORLD_OVER_LIMIT_DELETE", limit);
return null;
}
if (count >= limit) {
sender.system("BAU_WORLD_LIMIT", limit);
return null;
}
if (SteamwarWorld.getBauWorld(sender.user(), name, version.getVersionSuffix()) != null) {
sender.system("BAU_WORLD_EXISTS");
return null;
}
return SteamwarWorld.getOrCreateBauWorld(sender.user(), name, version.getVersionSuffix(), template.getStorageDirectory());
}
private boolean hasTooManyPersonalWorlds(Chatter sender) {
if (sender.user().hasPerm(UserPerm.BUILD_UNLIMITED_WORLDS)) {
return false;
}
long limit = personalWorldLimit(sender);
if (SteamwarWorld.countBauWorlds(sender.user()) <= limit) {
return false;
}
sender.system("BAU_WORLD_OVER_LIMIT_DELETE", limit);
return true;
}
private long personalWorldLimit(Chatter sender) {
return sender.user().hasPerm(UserPerm.BUILD_EXTRA_WORLDS) ? SteamwarWorld.EXTRA_BAU_WORLD_LIMIT : SteamwarWorld.DEFAULT_BAU_WORLD_LIMIT;
function.accept(target);
}
}
@@ -26,7 +26,6 @@ import de.steamwar.linkage.Linked;
import de.steamwar.messages.Chatter;
import de.steamwar.messages.PlayerChatter;
import de.steamwar.sql.GameModeConfig;
import de.steamwar.sql.SteamwarWorld;
import de.steamwar.sql.UserPerm;
import de.steamwar.velocitycore.ArenaMode;
import de.steamwar.velocitycore.ServerStarter;
@@ -34,11 +33,11 @@ import de.steamwar.velocitycore.ServerVersion;
import de.steamwar.velocitycore.VelocityCore;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
@Linked
public class BuilderCloudCommand extends SWCommand {
@@ -48,23 +47,14 @@ public class BuilderCloudCommand extends SWCommand {
}
@Register(value = "create", description = "BUILDERCLOUD_CREATE_USAGE")
public void create(Chatter sender, @ErrorMessage("BUILDERCLOUD_VERSION") ServerVersion version, @Mapper("map") String map, @Mapper("templateWorld") SteamwarWorld template) {
if(mapExists(version, map)) {
sender.system("BUILDERCLOUD_EXISTING_MAP");
return;
}
if (template == null || template.getVersion() != version.getVersionSuffix()) {
sender.system("BAU_WORLD_UNKNOWN");
return;
}
SteamwarWorld.getOrCreateBuilderWorld(map, version.getVersionSuffix(), template.getStorageDirectory());
sender.withPlayer(p -> new ServerStarter().builder(version, map, template.getStorageDirectory()).send(p).start());
public void create(Chatter sender, @ErrorMessage("BUILDERCLOUD_VERSION") ServerVersion version, @Mapper("map") String map, @OptionalValue("") @Mapper("generator") @AllowNull File generator) {
mapFile(version, map).mkdir();
sender.withPlayer(p -> new ServerStarter().builder(version, map, generator).send(p).start());
}
@Register(description = "BUILDERCLOUD_USAGE")
public void start(PlayerChatter sender, @ErrorMessage("BUILDERCLOUD_VERSION") ServerVersion version, @Mapper("map") String map) {
if (!mapExists(version, map)) {
if (!mapFile(version, map).exists()) {
sender.system("BUILDERCLOUD_UNKNOWN_MAP");
return;
}
@@ -74,34 +64,36 @@ public class BuilderCloudCommand extends SWCommand {
@Register(value = "rename", description = "BUILDERCLOUD_RENAME_USAGE")
public void rename(Chatter sender, @ErrorMessage("BUILDERCLOUD_VERSION") ServerVersion version, @Mapper("map") String oldName, String newName) {
SteamwarWorld oldMap = builderWorld(version, oldName);
if (oldMap == null) {
File oldMap = mapFile(version, oldName);
if (!oldMap.exists()) {
sender.system("BUILDERCLOUD_UNKNOWN_MAP");
return;
}
if (mapExists(version, newName)) {
File newMap = mapFile(version, newName);
if (newMap.exists()) {
sender.system("BUILDERCLOUD_EXISTING_MAP");
return;
}
oldMap.rename(newName);
try {
Files.move(oldMap.toPath(), newMap.toPath());
} catch (IOException e) {
throw new SecurityException(e);
}
sender.system("BUILDERCLOUD_RENAMED");
}
@Register(value = "deploy", description = "BUILDERCLOUD_DEPLOY_USAGE")
public void deploy(Chatter sender, @Mapper("nonHistoricArenaMode") GameModeConfig<String, String> arenaMode, @ErrorMessage("BUILDERCLOUD_VERSION") ServerVersion version, @Mapper("map") String map) {
SteamwarWorld builderWorld = builderWorld(version, map);
if (builderWorld == null) {
if (!mapFile(version, map).exists()) {
sender.system("BUILDERCLOUD_UNKNOWN_MAP");
return;
}
VelocityCore.schedule(() -> {
String modeName = arenaMode.configFile.getName().replace(".yml", "");
SteamwarWorld arenaWorld = SteamwarWorld.getOrCreateArenaWorld(modeName, map, version.getVersionSuffix());
VelocityCore.local.execute("deployarena.py", arenaMode.configFile.getName(), Integer.toString(version.getVersionSuffix()), map, builderWorld.setupAndGetStoragePath(), arenaWorld.setupAndGetStoragePath());
VelocityCore.local.execute("deployarena.py", arenaMode.configFile.getName(), Integer.toString(version.getVersionSuffix()), map);
ArenaMode.init();
sender.system("BUILDERCLOUD_DEPLOY_FINISHED");
}).schedule();
@@ -119,78 +111,60 @@ public class BuilderCloudCommand extends SWCommand {
@Override
public Collection<String> tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) {
ServerVersion version = getVersion(previousArguments, 1);
if (version == null) {
File folder = getWorldFolder(previousArguments, 1);
String[] files;
if (folder == null || (files = folder.list()) == null) {
return Collections.emptyList();
}
Set<String> maps = new LinkedHashSet<>();
SteamwarWorld.getBuilderWorlds(version.getVersionSuffix()).stream()
.map(SteamwarWorld::getName)
.forEach(maps::add);
File legacyFolder = new File(version.getWorldFolder(ServerStarter.LEGACY_BUILDER_BASE_PATH));
String[] files = legacyFolder.list();
if(files != null)
Arrays.stream(files).filter(file -> new File(legacyFolder, file).isDirectory()).forEach(maps::add);
return maps.stream()
.filter(file -> s.startsWith(".") || !file.startsWith("."))
.toList();
return Arrays.stream(files).filter(file -> new File(folder, file).isDirectory()).filter(file -> s.startsWith(".") || !file.startsWith(".")).toList();
}
};
}
@Cached(global = true)
@Mapper(value = "templateWorld", local = true)
private TypeMapper<SteamwarWorld> templateWorldMapper() {
@Mapper(value = "generator", local = true)
private TypeMapper<File> generatorTypeMapper() {
return new TypeMapper<>() {
return new TypeMapper<File>() {
@Override
public SteamwarWorld map(Chatter sender, PreviousArguments previousArguments, String s) {
ServerVersion version = previousArguments.getAll(ServerVersion.class).stream().findFirst().orElse(null);
if (version == null) return null;
return SteamwarWorld.getTemplateWorld(s, version.getVersionSuffix());
public File map(Chatter sender, PreviousArguments previousArguments, String s) {
if (s.isEmpty()) return null;
File folder = getWorldFolder(previousArguments, 2);
if (folder == null) throw new SecurityException();
File generator = new File(folder, s + ".dat");
if (!generator.exists() || !generator.isFile()) {
throw new SecurityException();
}
return generator;
}
@Override
public Collection<String> tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) {
ServerVersion version = previousArguments.getAll(ServerVersion.class).stream().findFirst().orElse(null);
if (version == null) {
File folder = getWorldFolder(previousArguments, 2);
String[] files;
if (folder == null || (files = folder.list()) == null) {
return Collections.emptyList();
}
return SteamwarWorld.getTemplateWorlds(version.getVersionSuffix()).stream()
.map(SteamwarWorld::getName)
.toList();
return Arrays.stream(files).filter(file -> new File(folder, file).isFile()).filter(file -> file.endsWith(".dat")).map(file -> file.substring(0, file.length() - 4)).toList();
}
};
}
private SteamwarWorld builderWorld(ServerVersion version, String map) {
SteamwarWorld world = SteamwarWorld.getBuilderWorld(map, version.getVersionSuffix());
if(world != null)
return world;
File legacyWorld = mapFile(version, map);
if(!legacyWorld.exists())
return null;
return SteamwarWorld.getOrCreateBuilderWorld(map, version.getVersionSuffix(), legacyWorld);
}
private boolean mapExists(ServerVersion version, String map) {
return SteamwarWorld.getBuilderWorld(map, version.getVersionSuffix()) != null || mapFile(version, map).exists();
}
private File mapFile(ServerVersion version, String map) {
return new File(version.getWorldFolder(ServerStarter.LEGACY_BUILDER_BASE_PATH), map);
return new File(version.getWorldFolder(ServerStarter.BUILDER_BASE_PATH), map);
}
private ServerVersion getVersion(PreviousArguments previousArguments, int offset) {
if (previousArguments.userArgs.length < offset) {
return null;
}
return ServerVersion.get(previousArguments.userArgs[previousArguments.userArgs.length - offset]);
private File getWorldFolder(PreviousArguments previousArguments, int offset) {
ServerVersion v = ServerVersion.get(previousArguments.userArgs[previousArguments.userArgs.length - offset]);
if (v == null) return null;
return new File(v.getWorldFolder(ServerStarter.BUILDER_BASE_PATH));
}
}
@@ -24,16 +24,11 @@ import de.steamwar.linkage.Linked;
import de.steamwar.messages.Chatter;
import de.steamwar.messages.PlayerChatter;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.SteamwarWorld;
import de.steamwar.sql.UserPerm;
import de.steamwar.sql.internal.Statement;
import de.steamwar.velocitycore.ServerStarter;
import de.steamwar.velocitycore.ServerVersion;
import de.steamwar.velocitycore.VelocityCore;
import java.io.*;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@@ -69,21 +64,12 @@ public class GDPRQuery extends SWCommand {
copy(getClass().getClassLoader().getResourceAsStream("GDPRQueryREADME.md"), out, "README.txt");
sender.system("GDPR_STATUS_WORLD");
Set<Integer> exportedVersions = new LinkedHashSet<>();
for(ServerVersion version : ServerVersion.values()) {
int versionSuffix = version.getVersionSuffix();
if(!exportedVersions.add(versionSuffix))
continue;
SteamwarWorld world = SteamwarWorld.getBauWorld(user, versionSuffix);
if(world != null)
copyBauwelt(user, out, world.setupAndGetStoragePath(), "BuildWorld" + versionSuffix);
else
copyLegacyBauwelt(user, out, version);
}
copyBauwelt(user, out, "/home/minecraft/userworlds/" + user.getUUID().toString(), "BuildWorld12");
copyBauwelt(user, out, "/home/minecraft/userworlds15/" + user.getId(), "BuildWorld15");
sender.system("GDPR_STATUS_INVENTORIES");
copyPlayerdata(user, out, SteamwarWorld.WORLD_STORAGE, "BuildInventories");
copyPlayerdata(user, out, "/home/minecraft/userworlds", "BuildInventories12");
copyPlayerdata(user, out, "/home/minecraft/userworlds15", "BuildInventories15");
sender.system("GDPR_STATUS_DATABASE");
sqlCSV(user, out, bannedIPs, "BannedIPs.csv");
@@ -113,8 +99,8 @@ public class GDPRQuery extends SWCommand {
}
private static final Statement bannedIPs = new Statement("SELECT Timestamp, IP FROM BannedUserIPs WHERE UserID = ?");
private static final Statement bauweltMember = new Statement("SELECT WorldID AS Bauwelt, WorldEdit, World FROM BauweltMember WHERE MemberID = ?");
private static final Statement bauweltMembers = new Statement("SELECT w.Name AS World, u.UserName AS 'User', m.WorldEdit AS WorldEdit, m.World AS World FROM BauweltMember m INNER JOIN UserData u ON m.MemberID = u.id INNER JOIN world w ON m.WorldID = w.id WHERE w.Owner = ?");
private static final Statement bauweltMember = new Statement("SELECT BauweltID AS Bauwelt, WorldEdit, World FROM BauweltMember WHERE MemberID = ?");
private static final Statement bauweltMembers = new Statement("SELECT u.UserName AS 'User', m.WorldEdit AS WorldEdit, m.World AS World FROM BauweltMember m INNER JOIN UserData u ON m.MemberID = u.id WHERE m.BauweltID = ?");
private static final Statement checkedSchems = new Statement("SELECT NodeName AS Schematic, StartTime, EndTime, DeclineReason AS Result FROM CheckedSchematic WHERE NodeOwner = ? ORDER BY StartTime ASC");
private static final Statement fights = new Statement("SELECT p.Team AS Team, p.Kit AS Kit, p.Kills AS Kills, p.IsOut AS Died, f.GameMode AS GameMode, f.Server AS Server, f.StartTime AS StartTime, f.Duration AS Duration, (f.BlueLeader = p.UserID) AS IsBlueLeader, (f.RedLeader = p.UserID) AS IsRedLeader, f.Win AS Winner, f.WinCondition AS WinCondition FROM Fight f INNER JOIN FightPlayer p ON f.FightID = p.FightID WHERE p.UserID = ? ORDER BY StartTime ASC");
private static final Statement ignoredPlayers = new Statement("SELECT u.UserName AS IgnoredPlayer FROM IgnoredPlayers i INNER JOIN UserData u ON i.Ignored = u.id WHERE Ignorer = ?");
@@ -244,18 +230,6 @@ public class GDPRQuery extends SWCommand {
}
}
private void copyLegacyBauwelt(SteamwarUser user, ZipOutputStream out, ServerVersion version) throws IOException {
File legacyIdWorld = new File(version.getWorldFolder(ServerStarter.LEGACY_WORLDS_BASE_PATH), String.valueOf(user.getId()));
if(legacyIdWorld.exists()) {
copyBauwelt(user, out, legacyIdWorld.getPath(), "BuildWorld" + version.getVersionSuffix());
return;
}
File legacyUuidWorld = new File(version.getWorldFolder(ServerStarter.LEGACY_WORLDS_BASE_PATH), user.getUUID().toString());
if(legacyUuidWorld.exists())
copyBauwelt(user, out, legacyUuidWorld.getPath(), "BuildWorld" + version.getVersionSuffix());
}
private void copyPlayerdata(SteamwarUser user, ZipOutputStream out, String inDir, String outDir) throws IOException {
File worlds = new File(inDir);
String path = "playerdata/" + user.getUUID().toString() + ".dat";
@@ -27,18 +27,12 @@ import de.steamwar.linkage.Linked;
import de.steamwar.messages.Chatter;
import de.steamwar.messages.Message;
import de.steamwar.messages.PlayerChatter;
import de.steamwar.persistent.Bauserver;
import de.steamwar.sql.Event;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.SteamwarWorld;
import de.steamwar.sql.Team;
import de.steamwar.sql.TeamTeilnahme;
import de.steamwar.velocitycore.ServerStarter;
import de.steamwar.velocitycore.ServerVersion;
import de.steamwar.velocitycore.SubserverSystem;
import de.steamwar.velocitycore.VelocityCore;
import de.steamwar.velocitycore.discord.DiscordBot;
import de.steamwar.velocitycore.inventory.SWInventory;
import de.steamwar.velocitycore.inventory.SWItem;
import de.steamwar.velocitycore.inventory.SWListInv;
import net.kyori.adventure.text.Component;
@@ -405,117 +399,6 @@ public class TeamCommand extends SWCommand {
}
}
@Register("worlds")
@Register("world")
public void worlds(@Validator("isInTeam") PlayerChatter sender) {
List<SWListInv.SWListEntry<SteamwarWorld>> entries = SteamwarWorld.getTeamWorlds(Team.byId(sender.user().getTeam())).stream()
.map(world -> new SWListInv.SWListEntry<>(
new SWItem("GRASS_BLOCK", new Message("PLAIN_STRING", "§e" + world.getName()))
.addLore(new Message("PLAIN_STRING", "§7Version: §e" + world.getVersion()))
.addLore(new Message("PLAIN_STRING", "§7Left: start, right: manage")),
world
))
.toList();
SWListInv<SteamwarWorld> inv = new SWListInv<>(sender, new Message("TEAM_WORLD_GUI_TITLE"), entries, (click, world) -> {
if (click.isRightClick() && sender.user().isLeader()) {
openTeamWorldManagement(sender, world);
} else {
startTeamWorld(sender, world);
}
});
inv.open();
}
@Register("world")
public void world(@Validator("isInTeam") PlayerChatter sender, @Mapper("teamWorld") SteamwarWorld world) {
startTeamWorld(sender, world);
}
@Register(value = "world create", description = "TEAM_WORLD_CREATE_USAGE")
public void createWorld(@Validator("isLeader") Chatter sender, String name, @ErrorMessage("BAU_WORLD_VERSION") ServerVersion version, @Mapper("templateWorld") SteamwarWorld template) {
Team team = Team.byId(sender.user().getTeam());
if (template == null || template.getVersion() != version.getVersionSuffix()) {
sender.system("BAU_WORLD_UNKNOWN");
return;
}
if (SteamwarWorld.getTeamWorld(team, name, version.getVersionSuffix()) != null) {
sender.system("TEAM_WORLD_EXISTS");
return;
}
long count = SteamwarWorld.countTeamWorlds(team);
if (count > SteamwarWorld.TEAM_WORLD_LIMIT) {
sender.system("TEAM_WORLD_OVER_LIMIT_DELETE", SteamwarWorld.TEAM_WORLD_LIMIT);
return;
}
if (count >= SteamwarWorld.TEAM_WORLD_LIMIT) {
sender.system("TEAM_WORLD_LIMIT", SteamwarWorld.TEAM_WORLD_LIMIT);
return;
}
SteamwarWorld.getOrCreateTeamWorld(team, name, version.getVersionSuffix(), template.getStorageDirectory());
sender.system("TEAM_WORLD_CREATED");
}
@Register(value = "world rename", description = "TEAM_WORLD_RENAME_USAGE")
public void renameWorld(@Validator("isLeader") Chatter sender, @Mapper("teamWorld") SteamwarWorld world, String newName) {
Team team = Team.byId(sender.user().getTeam());
if (hasTooManyTeamWorlds(sender, team)) return;
if (SteamwarWorld.getTeamWorld(team, newName, world.getVersion()) != null) {
sender.system("TEAM_WORLD_EXISTS");
return;
}
world.rename(newName);
sender.system("TEAM_WORLD_RENAMED");
}
@Register(value = "world upgrade", description = "TEAM_WORLD_UPGRADE_USAGE")
public void upgradeWorld(@Validator("isLeader") Chatter sender, @Mapper("teamWorld") SteamwarWorld world, @ErrorMessage("BAU_WORLD_VERSION") ServerVersion version) {
if (hasTooManyTeamWorlds(sender, Team.byId(sender.user().getTeam()))) return;
world.changeVersion(version.getVersionSuffix());
sender.system("TEAM_WORLD_UPGRADED");
}
@Register(value = "world delete", description = "TEAM_WORLD_DELETE_USAGE")
public void deleteWorld(@Validator("isLeader") PlayerChatter sender, @Mapper("teamWorld") SteamwarWorld world) {
SWInventory inventory = new SWInventory(sender, 9, new Message("BAU_DELETE_GUI_NAME"));
inventory.addItem(0, new SWItem("LIME_DYE", new Message("BAU_DELETE_GUI_DELETE")), click -> {
VelocityCore.schedule(() -> {
Bauserver subserver = Bauserver.getByWorld(world.getUuid());
if (subserver != null) {
subserver.stop();
}
world.markDeleted();
SubserverSystem.deleteFolder(VelocityCore.local, world.getStorageDirectory().getPath());
sender.system("TEAM_WORLD_DELETED");
}).schedule();
inventory.close();
});
inventory.addItem(8, new SWItem("RED_DYE", new Message("BAU_DELETE_GUI_CANCEL")), click -> inventory.close());
inventory.open();
}
private void startTeamWorld(PlayerChatter sender, SteamwarWorld world) {
new ServerStarter().build(ServerVersion.get(world.getVersion()), world).send(sender.getPlayer()).start();
}
private void openTeamWorldManagement(PlayerChatter sender, SteamwarWorld world) {
SWInventory inventory = new SWInventory(sender, 9, new Message("PLAIN_STRING", "§e" + world.getName()));
inventory.addItem(0, new SWItem("ENDER_PEARL", new Message("PLAIN_STRING", "§aStart")), click -> {
inventory.close();
startTeamWorld(sender, world);
});
inventory.addItem(3, new SWItem("EXPERIENCE_BOTTLE", new Message("PLAIN_STRING", "§eUpgrade to latest")), click -> {
if (hasTooManyTeamWorlds(sender, Team.byId(sender.user().getTeam()))) {
inventory.close();
return;
}
world.changeVersion(ServerVersion.PAPER_21.getVersionSuffix());
sender.system("TEAM_WORLD_UPGRADED");
inventory.close();
});
inventory.addItem(8, new SWItem("BARRIER", new Message("PLAIN_STRING", "§cDelete")), click -> deleteWorld(sender, world));
inventory.open();
}
@Register("event")
public void event(@Validator("isLeader") Chatter sender, Event event) {
Team team = Team.byId(sender.user().getTeam());
@@ -661,56 +544,6 @@ public class TeamCommand extends SWCommand {
};
}
@Mapper(value = "teamWorld", local = true)
public TypeMapper<SteamwarWorld> teamWorldMapper() {
return new TypeMapper<>() {
@Override
public SteamwarWorld map(Chatter sender, PreviousArguments previousArguments, String s) {
Team team = Team.byId(sender.user().getTeam());
return SteamwarWorld.getTeamWorlds(team).stream()
.filter(world -> world.getName().equalsIgnoreCase(s) || world.getUuid().toString().equalsIgnoreCase(s))
.findFirst()
.orElse(null);
}
@Override
public Collection<String> tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) {
if (sender.user().getTeam() == 0) return List.of();
return SteamwarWorld.getTeamWorlds(Team.byId(sender.user().getTeam())).stream()
.map(SteamwarWorld::getName)
.toList();
}
};
}
@Mapper(value = "templateWorld", local = true)
public TypeMapper<SteamwarWorld> templateWorldMapper() {
return new TypeMapper<>() {
@Override
public SteamwarWorld map(Chatter sender, PreviousArguments previousArguments, String s) {
ServerVersion version = previousArguments.getAll(ServerVersion.class).stream().findFirst().orElse(null);
if (version == null) return null;
return SteamwarWorld.getTemplateWorld(s, version.getVersionSuffix());
}
@Override
public Collection<String> tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) {
ServerVersion version = previousArguments.getAll(ServerVersion.class).stream().findFirst().orElse(null);
if (version == null) return List.of();
return SteamwarWorld.getTemplateWorlds(version.getVersionSuffix()).stream().map(SteamwarWorld::getName).toList();
}
};
}
private boolean hasTooManyTeamWorlds(Chatter sender, Team team) {
if (SteamwarWorld.countTeamWorlds(team) <= SteamwarWorld.TEAM_WORLD_LIMIT) {
return false;
}
sender.system("TEAM_WORLD_OVER_LIMIT_DELETE", SteamwarWorld.TEAM_WORLD_LIMIT);
return true;
}
private boolean checkTeamName(Chatter sender, Team team, String arg) {
Team t = Team.get(arg);
if (t != null && t.getTeamId() != team.getTeamId()) {
@@ -120,26 +120,17 @@ public class TpCommand extends SWCommand {
}
} else if (Subserver.isBuild(subserver)) {
Bauserver bauserver = (Bauserver) subserver;
SteamwarWorld world = SteamwarWorld.getWorld(bauserver.getWorld());
if (world != null && world.getType() == WorldType.TEAM) {
if (sender.user().getTeam() != world.getTeam().getValue()) {
sender.system("JOIN_PLAYER_BLOCK");
return;
}
SubserverSystem.sendPlayer(subserver, sender.getPlayer());
return;
}
Player checker = VelocityCore.getProxy().getPlayer(bauserver.getOwner()).orElse(null);
if (checker != null && CheckCommand.isChecking(checker)) {
if (!sender.user().hasPerm(UserPerm.CHECK) && CheckCommand.getCheckingSchem(checker).getOwner() != sender.user().getId()) {
sender.system("JOIN_PLAYER_BLOCK");
return;
}
} else if (world != null && BauLock.isLocked(world, sender.user())) {
} else if (BauLock.isLocked(SteamwarUser.get(bauserver.getOwner()), sender.user())) {
sender.system("BAU_LOCKED_NOALLOWED");
Chatter.of(bauserver.getOwner()).system("BAU_LOCK_BLOCKED", sender);
return;
} else if (!bauserver.getOwner().equals(sender.user().getUUID()) && BauweltMember.getBauMember(bauserver.getWorld(), sender.user().getUUID()) == null) {
} else if (!bauserver.getOwner().equals(sender.user().getUUID()) && BauweltMember.getBauMember(bauserver.getOwner(), sender.user().getUUID()) == null) {
SubserverSystem.sendDeniedMessage(sender, bauserver.getOwner());
sender.system("JOIN_PLAYER_BLOCK");
return;
@@ -25,39 +25,37 @@ import de.steamwar.network.packets.server.BaulockUpdatePacket;
import de.steamwar.persistent.Bauserver;
import de.steamwar.sql.BauweltMember;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.SteamwarWorld;
import de.steamwar.sql.UserConfig;
import de.steamwar.sql.UserPerm;
import de.steamwar.sql.WorldType;
import de.steamwar.velocitycore.network.NetworkSender;
import lombok.experimental.UtilityClass;
@UtilityClass
public class BauLock {
public static void setLocked(Chatter owner, SteamwarWorld world, BauLockState state) {
world.changeLockState(state == BauLockState.OPEN ? null : state.name());
private static final String BAU_LOCK_CONFIG_NAME = "baulockstate";
public static void setLocked(Chatter owner, BauLockState state) {
UserConfig.updatePlayerConfig(owner.user().getId(), BAU_LOCK_CONFIG_NAME, state == BauLockState.OPEN ? null : state.name());
owner.system("BAU_LOCKED_" + state.name());
Bauserver bauserver = Bauserver.getByWorld(world.getUuid());
Bauserver bauserver = Bauserver.get(owner.user().getUUID());
if (bauserver != null) {
bauserver.getRegisteredServer().getPlayersConnected().stream().findAny().ifPresent(player -> NetworkSender.send(player, new BaulockUpdatePacket()));
}
}
public static boolean isLocked(SteamwarWorld world, SteamwarUser target) {
if (world.getType() != WorldType.BAU || world.getOwner() == null) return false;
SteamwarUser owner = SteamwarUser.byId(world.getOwner().getValue());
if (owner == null || owner.getId() == target.getId()) return false;
public static boolean isLocked(SteamwarUser owner, SteamwarUser target) {
if (owner.getId() == target.getId()) return false;
boolean locked;
String state = world.getLockState();
String state = UserConfig.getConfig(owner.getId(), BAU_LOCK_CONFIG_NAME);
switch (state == null ? BauLockState.OPEN : BauLockState.valueOf(state)) {
case NOBODY:
locked = true;
break;
case SUPERVISOR:
BauweltMember member = BauweltMember.getBauMember(world.getUuid(), target.getId());
BauweltMember member = BauweltMember.getBauMember(owner.getId(), target.getId());
locked = member == null || !member.isSupervisor();
break;
case SERVERTEAM: