From 0f0c8b763e73d1ffce39f51fa35f60c4c8b88707 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 5 Nov 2025 17:09:53 +0100 Subject: [PATCH] Remove some strain on the Database --- .../world/BauLockStateScoreboard.java | 35 ++++++------ .../src/de/steamwar/data}/BauLockState.java | 2 +- .../packets/server/BaulockUpdatePacket.java | 29 ++++++++++ .../core/WorldEditRendererCUIEditor.java | 53 +++++++++++++------ .../velocitycore/commands/BauCommand.java | 3 +- .../steamwar/velocitycore/util/BauLock.java | 8 +++ 6 files changed, 95 insertions(+), 35 deletions(-) rename {VelocityCore/src/de/steamwar/velocitycore/util => CommonCore/Data/src/de/steamwar/data}/BauLockState.java (97%) create mode 100644 CommonCore/Network/src/de/steamwar/network/packets/server/BaulockUpdatePacket.java diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauLockStateScoreboard.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauLockStateScoreboard.java index abf90dc0..827a6143 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauLockStateScoreboard.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauLockStateScoreboard.java @@ -23,15 +23,32 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.utils.ScoreboardElement; +import de.steamwar.data.BauLockState; import de.steamwar.linkage.Linked; +import de.steamwar.network.packets.PacketHandler; +import de.steamwar.network.packets.server.BaulockUpdatePacket; import de.steamwar.sql.UserConfig; +import lombok.Getter; import org.bukkit.entity.Player; @Linked -public class BauLockStateScoreboard implements ScoreboardElement { +public class BauLockStateScoreboard extends PacketHandler implements ScoreboardElement { private static final String BAU_LOCK_CONFIG_NAME = "baulockstate"; + @Getter + private BauLockState lockState = loadLockState(); + + private BauLockState loadLockState() { + String state = UserConfig.getConfig(BauServer.getInstance().getOwner(), BAU_LOCK_CONFIG_NAME); + return state == null ? BauLockState.OPEN : BauLockState.valueOf(state); + } + + @Handler + public void handleBaulockUpdatePacket(BaulockUpdatePacket packet) { + lockState = loadLockState(); + } + @Override public ScoreboardGroup getGroup() { return ScoreboardGroup.FOOTER; @@ -47,23 +64,11 @@ public class BauLockStateScoreboard implements ScoreboardElement { if (!BauServer.getInstance().getOwner().equals(p.getUniqueId())) { return null; } - String state = UserConfig.getConfig(p.getUniqueId(), BAU_LOCK_CONFIG_NAME); - switch (state == null ? BauLockState.OPEN : BauLockState.valueOf(state)) { + switch (lockState) { case OPEN: return null; default: - return "§e" + BauSystem.MESSAGE.parse("SCOREBOARD_LOCK_" + state.toUpperCase(), p); + return "§e" + BauSystem.MESSAGE.parse("SCOREBOARD_LOCK_" + lockState.name(), p); } } - - public enum BauLockState { - - NOBODY, - SUPERVISOR, - SERVERTEAM, - TEAM_AND_SERVERTEAM, - TEAM, - OPEN - } - } diff --git a/VelocityCore/src/de/steamwar/velocitycore/util/BauLockState.java b/CommonCore/Data/src/de/steamwar/data/BauLockState.java similarity index 97% rename from VelocityCore/src/de/steamwar/velocitycore/util/BauLockState.java rename to CommonCore/Data/src/de/steamwar/data/BauLockState.java index 866c4de2..0c558190 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/util/BauLockState.java +++ b/CommonCore/Data/src/de/steamwar/data/BauLockState.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package de.steamwar.velocitycore.util; +package de.steamwar.data; public enum BauLockState { diff --git a/CommonCore/Network/src/de/steamwar/network/packets/server/BaulockUpdatePacket.java b/CommonCore/Network/src/de/steamwar/network/packets/server/BaulockUpdatePacket.java new file mode 100644 index 00000000..55b23b23 --- /dev/null +++ b/CommonCore/Network/src/de/steamwar/network/packets/server/BaulockUpdatePacket.java @@ -0,0 +1,29 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.network.packets.server; + +import de.steamwar.network.packets.NetworkPacket; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +public class BaulockUpdatePacket extends NetworkPacket { + private static final long serialVersionUID = 6863118892424244051L; + +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java index da9646a4..f2b11fde 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java @@ -24,18 +24,27 @@ import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; import de.steamwar.sql.UserConfig; import lombok.AllArgsConstructor; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.type.Light; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.meta.BlockDataMeta; import org.bukkit.inventory.meta.ItemMeta; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; -public class WorldEditRendererCUIEditor { +public class WorldEditRendererCUIEditor implements Listener { + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + for (Type type : Type.values()) { + type.materialCache.remove(event.getPlayer()); + type.widthCache.remove(event.getPlayer()); + } + } @AllArgsConstructor public enum Type { @@ -43,34 +52,43 @@ public class WorldEditRendererCUIEditor { CLIPBOARD("cui_clipboard_material", "cui_clipboard_width", Material.LIME_CONCRETE, Width.SLIM), ; + private final Map materialCache = new HashMap<>(); + private final Map widthCache = new HashMap<>(); + private final String configMaterial; private final String configWidth; private final Material defaultMaterial; private final Width defaultWidth; public Material getMaterial(Player player) { - String material = UserConfig.getConfig(player.getUniqueId(), configMaterial); - if (material == null) { - return defaultMaterial; - } else { - return Material.valueOf(material); - } + return materialCache.computeIfAbsent(player, p -> { + String material = UserConfig.getConfig(p.getUniqueId(), configMaterial); + if (material == null) { + return defaultMaterial; + } else { + return Material.valueOf(material); + } + }); } public void setMaterial(Player player, Material material) { + materialCache.put(player, material); UserConfig.updatePlayerConfig(player.getUniqueId(), configMaterial, material.name()); } public Width getWidth(Player player) { - String width = UserConfig.getConfig(player.getUniqueId(), configWidth); - if (width == null) { - return defaultWidth; - } else { - return Width.valueOf(width); - } + return widthCache.computeIfAbsent(player, p -> { + String width = UserConfig.getConfig(p.getUniqueId(), configWidth); + if (width == null) { + return defaultWidth; + } else { + return Width.valueOf(width); + } + }); } public void setWidth(Player player, Width width) { + widthCache.put(player, width); UserConfig.updatePlayerConfig(player.getUniqueId(), configWidth, width.name()); } } @@ -90,6 +108,7 @@ public class WorldEditRendererCUIEditor { public WorldEditRendererCUIEditor() { if (Core.getVersion() >= 20) { new Command(); + Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); } } diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/BauCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/BauCommand.java index 0d679ca9..cd23a910 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/BauCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/BauCommand.java @@ -33,14 +33,13 @@ import de.steamwar.messages.PlayerChatter; import de.steamwar.network.packets.server.BaumemberUpdatePacket; import de.steamwar.persistent.Bauserver; import de.steamwar.sql.BauweltMember; -import de.steamwar.sql.SchematicType; import de.steamwar.sql.SteamwarUser; import de.steamwar.velocitycore.*; import de.steamwar.velocitycore.inventory.SWInventory; import de.steamwar.velocitycore.inventory.SWItem; import de.steamwar.velocitycore.network.NetworkSender; import de.steamwar.velocitycore.util.BauLock; -import de.steamwar.velocitycore.util.BauLockState; +import de.steamwar.data.BauLockState; import java.util.Collection; import java.util.function.Consumer; diff --git a/VelocityCore/src/de/steamwar/velocitycore/util/BauLock.java b/VelocityCore/src/de/steamwar/velocitycore/util/BauLock.java index 41828c81..ee8d7e71 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/util/BauLock.java +++ b/VelocityCore/src/de/steamwar/velocitycore/util/BauLock.java @@ -19,11 +19,15 @@ package de.steamwar.velocitycore.util; +import de.steamwar.data.BauLockState; import de.steamwar.messages.Chatter; +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.UserConfig; import de.steamwar.sql.UserPerm; +import de.steamwar.velocitycore.network.NetworkSender; import lombok.experimental.UtilityClass; @UtilityClass @@ -33,6 +37,10 @@ public class BauLock { 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.get(owner.user().getUUID()); + if(bauserver != null) + bauserver.getRegisteredServer().getPlayersConnected().stream().findAny().ifPresent(player -> NetworkSender.send(player, new BaulockUpdatePacket())); } public static boolean isLocked(SteamwarUser owner, SteamwarUser target) {