From 0ca3ede280d82bb0fd270552ba583fb22618bb2c Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sun, 24 Nov 2024 23:26:18 +0100 Subject: [PATCH 01/12] Replace WorldEditSUI --- .../de/steamwar/core/WorldEditWrapper14.java | 17 ++- .../de/steamwar/core/WorldEditWrapper8.java | 29 ++++- .../src/de/steamwar/core/Core.java | 3 + .../de/steamwar/core/WorldEditRenderer.java | 116 ++++++++++++++++++ .../de/steamwar/core/WorldEditWrapper.java | 20 +-- 5 files changed, 171 insertions(+), 14 deletions(-) create mode 100644 SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java diff --git a/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java b/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java index 1b48b638..38ae351a 100644 --- a/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java +++ b/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java @@ -52,7 +52,7 @@ import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkNotNull; -public class WorldEditWrapper14 implements WorldEditWrapper.IWorldEditWrapper { +public class WorldEditWrapper14 implements WorldEditWrapper { private static final ClipboardFormat SCHEMATIC = ClipboardFormats.findByAlias("schematic"); private static final ClipboardFormat SCHEM = ClipboardFormats.findByAlias("schem"); @@ -131,6 +131,21 @@ public class WorldEditWrapper14 implements WorldEditWrapper.IWorldEditWrapper { } } + @Override + public org.bukkit.util.Vector getOrigin(Clipboard clipboard) { + return new org.bukkit.util.Vector(clipboard.getOrigin().getX(), clipboard.getOrigin().getY(), clipboard.getOrigin().getZ()); + } + + @Override + public org.bukkit.util.Vector getMinimum(Region region) { + return new org.bukkit.util.Vector(region.getMinimumPoint().getX(), region.getMinimumPoint().getY(), region.getMinimumPoint().getZ()); + } + + @Override + public org.bukkit.util.Vector getMaximum(Region region) { + return new org.bukkit.util.Vector(region.getMaximumPoint().getX(), region.getMaximumPoint().getY(), region.getMaximumPoint().getZ()); + } + private static class MCEditSchematicReader extends NBTSchematicReader { private final NBTInputStream inputStream; diff --git a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java index 32f3faf7..e021ceed 100644 --- a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java +++ b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java @@ -23,7 +23,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.sk89q.jnbt.*; import com.sk89q.worldedit.*; -import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.extension.input.ParserContext; @@ -34,17 +33,24 @@ import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader; import com.sk89q.worldedit.extent.clipboard.io.SchematicReader; import com.sk89q.worldedit.regions.CuboidRegion; +import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.world.registry.WorldData; import de.steamwar.sql.NoClipboardException; import org.bukkit.entity.Player; -import java.io.*; -import java.util.*; +import java.io.IOException; +import java.io.InputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.logging.Level; import java.util.stream.Collectors; -public class WorldEditWrapper8 implements WorldEditWrapper.IWorldEditWrapper { +public class WorldEditWrapper8 implements WorldEditWrapper { @Override public InputStream getPlayerClipboard(Player player, boolean schemFormat) { @@ -105,6 +111,21 @@ public class WorldEditWrapper8 implements WorldEditWrapper.IWorldEditWrapper { return new SchematicReader(new NBTInputStream(is)).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData()); } + @Override + public org.bukkit.util.Vector getOrigin(Clipboard clipboard) { + return new org.bukkit.util.Vector(clipboard.getOrigin().getX(), clipboard.getOrigin().getY(), clipboard.getOrigin().getZ()); + } + + @Override + public org.bukkit.util.Vector getMinimum(Region region) { + return new org.bukkit.util.Vector(region.getMinimumPoint().getX(), region.getMinimumPoint().getY(), region.getMinimumPoint().getZ()); + } + + @Override + public org.bukkit.util.Vector getMaximum(Region region) { + return new org.bukkit.util.Vector(region.getMaximumPoint().getX(), region.getMaximumPoint().getY(), region.getMaximumPoint().getZ()); + } + private static class SpongeSchematicReader implements ClipboardReader { private final NBTInputStream inputStream; diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java index 7e0b3719..9c1e51ef 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -106,6 +106,9 @@ public class Core extends JavaPlugin{ if(Core.getVersion() >= 19) new ServerDataHandler(); + if(Core.getVersion() > 8 && Bukkit.getPluginManager().getPlugin("WorldEdit") != null) + new WorldEditRenderer(); + Bukkit.getScheduler().runTaskTimer(this, TabCompletionCache::invalidateOldEntries, 20, 20); Bukkit.getScheduler().runTaskTimer(Core.getInstance(), SteamwarUser::clear, 72000, 72000); Bukkit.getScheduler().runTaskTimer(Core.getInstance(), SchematicNode::clear, 20L * 30, 20L * 30); diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java new file mode 100644 index 00000000..3b5e7aff --- /dev/null +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java @@ -0,0 +1,116 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 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.core; + +import com.sk89q.worldedit.EmptyClipboardException; +import com.sk89q.worldedit.IncompleteRegionException; +import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.regions.RegionSelector; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +public class WorldEditRenderer { + + private static final int VIEW_DISTANCE = 64; + private static final int SQ_VIEW_DISTANCE = VIEW_DISTANCE * VIEW_DISTANCE; + + private static final double STEP_SIZE = 0.5; + + private final WorldEditPlugin we; + + public WorldEditRenderer() { + we = WorldEditWrapper.getWorldEditPlugin(); + + Bukkit.getScheduler().runTaskTimer(Core.getInstance(), this::render, 20, 20); + } + + private void render() { + for(Player player : Bukkit.getOnlinePlayers()) { + //noinspection deprecation + if(player.getItemInHand().getType() != Material.WOODEN_AXE) + continue; + + LocalSession session = we.getSession(player); + try { + Clipboard clipboard = session.getClipboard().getClipboard(); + Region region = clipboard.getRegion(); + Vector offset = player.getLocation().toVector().subtract(WorldEditWrapper.impl.getOrigin(clipboard)); + drawCuboid( + WorldEditWrapper.impl.getMinimum(region).add(offset), + WorldEditWrapper.impl.getMaximum(region).add(offset), + Particle.VILLAGER_HAPPY, player + ); + } catch (EmptyClipboardException e) { + //ignore + } + + RegionSelector regionSelector = session.getRegionSelector(session.getSelectionWorld()); + try { + Region region = regionSelector.getRegion(); + drawCuboid(WorldEditWrapper.impl.getMinimum(region), WorldEditWrapper.impl.getMaximum(region), Particle.DRAGON_BREATH, player); + } catch (IncompleteRegionException e) { + //ignore + } + } + } + + private void drawCuboid(Vector min, Vector max, Particle particle, Player owner) { + for(double x = min.getBlockX(); x <= max.getBlockX(); x += STEP_SIZE) { + draw(x, min.getBlockY(), min.getBlockZ(), particle, owner); + draw(x, min.getBlockY(), max.getBlockZ(), particle, owner); + draw(x, max.getBlockY(), min.getBlockZ(), particle, owner); + draw(x, max.getBlockY(), max.getBlockZ(), particle, owner); + } + + for(double y = min.getBlockY() + STEP_SIZE; y <= max.getBlockY() - STEP_SIZE; y += STEP_SIZE) { + draw(min.getBlockX(), y, min.getBlockZ(), particle, owner); + draw(min.getBlockX(), y, max.getBlockZ(), particle, owner); + draw(max.getBlockX(), y, min.getBlockZ(), particle, owner); + draw(max.getBlockX(), y, max.getBlockZ(), particle, owner); + } + + for(double z = min.getBlockZ() + STEP_SIZE; z <= max.getBlockZ() - STEP_SIZE; z += STEP_SIZE) { + draw(min.getBlockX(), min.getBlockY(), z, particle, owner); + draw(min.getBlockX(), max.getBlockY(), z, particle, owner); + draw(max.getBlockX(), min.getBlockY(), z, particle, owner); + draw(max.getBlockX(), max.getBlockY(), z, particle, owner); + } + } + + private void draw(double x, double y, double z, Particle particle, Player owner) { + for(Player player : Bukkit.getOnlinePlayers()) { + Location location = player.getLocation(); + double dx = x - location.getX(); + double dy = y - location.getY(); + double dz = z - location.getZ(); + if(dx*dx + dy*dy + dz*dz > SQ_VIEW_DISTANCE) + continue; + + player.spawnParticle(player == owner ? particle : Particle.TOWN_AURA, x, y, z, 1); + } + } +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java index 14f85e16..c034723c 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java @@ -21,24 +21,26 @@ package de.steamwar.core; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.regions.Region; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; import java.io.IOException; import java.io.InputStream; -public class WorldEditWrapper { - private WorldEditWrapper() {} +public interface WorldEditWrapper { + WorldEditWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); - public static final IWorldEditWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); + InputStream getPlayerClipboard(Player player, boolean schemFormat); + void setPlayerClipboard(Player player, InputStream is, boolean schemFormat); + Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException; - public interface IWorldEditWrapper { - InputStream getPlayerClipboard(Player player, boolean schemFormat); - void setPlayerClipboard(Player player, InputStream is, boolean schemFormat); - Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException; - } + Vector getOrigin(Clipboard clipboard); + Vector getMinimum(Region region); + Vector getMaximum(Region region); - public static WorldEditPlugin getWorldEditPlugin() { + static WorldEditPlugin getWorldEditPlugin() { return (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"); } } From d5c06688f0e366b7af67e2077dd9600d08df5dd9 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Tue, 26 Nov 2024 16:34:24 +0100 Subject: [PATCH 02/12] Backend Fixes... --- WebsiteBackend/src/de/steamwar/plugins/Auth.kt | 5 +++-- WebsiteBackend/src/de/steamwar/plugins/Plugins.kt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/WebsiteBackend/src/de/steamwar/plugins/Auth.kt b/WebsiteBackend/src/de/steamwar/plugins/Auth.kt index 6d90339a..cc5c0822 100644 --- a/WebsiteBackend/src/de/steamwar/plugins/Auth.kt +++ b/WebsiteBackend/src/de/steamwar/plugins/Auth.kt @@ -29,6 +29,7 @@ import io.ktor.server.application.hooks.* import io.ktor.server.auth.* import io.ktor.server.request.* import io.ktor.server.response.* +import io.ktor.util.* data class SWAuthPrincipal(val token: Token, val user: SteamwarUser) : Principal @@ -104,7 +105,7 @@ Message: ${cause.message} } onCallRespond { call -> - if (call.response.status()?.isSuccess() == true) { + if ((call.response.status() ?: HttpStatusCode.OK).isSuccess()) { return@onCallRespond } @@ -120,7 +121,7 @@ Message: ${cause.message} Headers: ${call.request.headers.entries().joinToString("\n ") { "${it.key}: ${it.value}" }} Body: - ${call.request.receiveChannel()} + ${call.request.receiveChannel().toByteArray().decodeToString()} """.trimIndent() SWException.log(msg, stack) diff --git a/WebsiteBackend/src/de/steamwar/plugins/Plugins.kt b/WebsiteBackend/src/de/steamwar/plugins/Plugins.kt index b8780f64..fc8dde36 100644 --- a/WebsiteBackend/src/de/steamwar/plugins/Plugins.kt +++ b/WebsiteBackend/src/de/steamwar/plugins/Plugins.kt @@ -50,7 +50,7 @@ fun Application.configurePlugins() { it.request.headers["X-Forwarded-For"] ?: it.request.local.remoteHost } requestWeight { applicationCall, _ -> - if(applicationCall.request.headers["X-Forwarded-For"] != null) { + if(!applicationCall.request.headers.contains("X-Forwarded-For")) { 0 } else { 1 From 9911a52da96e668650bbadebf5373b702dc8a503 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 26 Nov 2024 21:59:52 +0100 Subject: [PATCH 03/12] Bugfixes, tested. --- .../de/steamwar/core/WorldEditRenderer.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java index 3b5e7aff..9c1f69b4 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.RegionSelector; +import com.sk89q.worldedit.world.World; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -40,6 +41,8 @@ public class WorldEditRenderer { private static final double STEP_SIZE = 0.5; + private static final Vector ONES = new Vector(1, 1, 1); + private final WorldEditPlugin we; public WorldEditRenderer() { @@ -68,17 +71,22 @@ public class WorldEditRenderer { //ignore } - RegionSelector regionSelector = session.getRegionSelector(session.getSelectionWorld()); - try { - Region region = regionSelector.getRegion(); - drawCuboid(WorldEditWrapper.impl.getMinimum(region), WorldEditWrapper.impl.getMaximum(region), Particle.DRAGON_BREATH, player); - } catch (IncompleteRegionException e) { - //ignore + World world = session.getSelectionWorld(); + if(world != null) { + RegionSelector regionSelector = session.getRegionSelector(world); + try { + Region region = regionSelector.getRegion(); + drawCuboid(WorldEditWrapper.impl.getMinimum(region), WorldEditWrapper.impl.getMaximum(region), Particle.DRAGON_BREATH, player); + } catch (IncompleteRegionException e) { + //ignore + } } } } private void drawCuboid(Vector min, Vector max, Particle particle, Player owner) { + max.add(ONES); + for(double x = min.getBlockX(); x <= max.getBlockX(); x += STEP_SIZE) { draw(x, min.getBlockY(), min.getBlockZ(), particle, owner); draw(x, min.getBlockY(), max.getBlockZ(), particle, owner); @@ -110,7 +118,7 @@ public class WorldEditRenderer { if(dx*dx + dy*dy + dz*dz > SQ_VIEW_DISTANCE) continue; - player.spawnParticle(player == owner ? particle : Particle.TOWN_AURA, x, y, z, 1); + player.spawnParticle(player == owner ? particle : Particle.TOWN_AURA, x, y, z, 1, 0.0, 0.0, 0.0, 0.0); } } } From 8b007721fb953a9444d1bc74806e9f1353214296 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Wed, 27 Nov 2024 12:38:50 +0100 Subject: [PATCH 04/12] Fix NPC Chat messages --- LobbySystem/src/de/steamwar/lobby/team/TeamPlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LobbySystem/src/de/steamwar/lobby/team/TeamPlayer.java b/LobbySystem/src/de/steamwar/lobby/team/TeamPlayer.java index 5f2e55b9..2829ec2f 100644 --- a/LobbySystem/src/de/steamwar/lobby/team/TeamPlayer.java +++ b/LobbySystem/src/de/steamwar/lobby/team/TeamPlayer.java @@ -145,7 +145,7 @@ public class TeamPlayer extends BasicListener { return; } - String message = "NPC_Chat_" + random.nextInt(6); + String message = "NPC_CHAT_" + random.nextInt(6); SteamwarUser user = SteamwarUser.get(event.getRightClicked().getName()); UserPerm.Prefix prefix = user.prefix(); LobbySystem.getMessage().send(message, event.getPlayer(), event.getRightClicked().getName(), prefix.getColorCode() + prefix.getChatPrefix()); From e71a704d25055cdc9de7903d4c320739a6a46a31 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 28 Nov 2024 16:57:49 +0100 Subject: [PATCH 05/12] Fix 1.9-1.12 WorldEditRenderer --- .../src/de/steamwar/core/WorldEditRenderer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java index 9c1f69b4..7850754e 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java @@ -43,6 +43,8 @@ public class WorldEditRenderer { private static final Vector ONES = new Vector(1, 1, 1); + private static final Material WAND = Material.valueOf(Core.getVersion() > 12 ? "WOODEN_AXE" : "WOOD_AXE"); + private final WorldEditPlugin we; public WorldEditRenderer() { @@ -54,7 +56,7 @@ public class WorldEditRenderer { private void render() { for(Player player : Bukkit.getOnlinePlayers()) { //noinspection deprecation - if(player.getItemInHand().getType() != Material.WOODEN_AXE) + if(player.getItemInHand().getType() != WAND) continue; LocalSession session = we.getSession(player); From 891f4b0e9cf9ecf370d62f19fe33a136ed054afd Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 28 Nov 2024 17:03:34 +0100 Subject: [PATCH 06/12] Fix Schematic submission in 1.12 --- .../autocheck/AutoCheckerResult.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java b/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java index 6a708bdf..a7d13f17 100644 --- a/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java +++ b/SchematicSystem/SchematicSystem_Core/src/de/steamwar/schematicsystem/autocheck/AutoCheckerResult.java @@ -19,6 +19,7 @@ package de.steamwar.schematicsystem.autocheck; +import de.steamwar.core.Core; import de.steamwar.schematicsystem.CheckSchemType; import de.steamwar.schematicsystem.SchematicSystem; import lombok.Builder; @@ -143,13 +144,15 @@ public class AutoCheckerResult { blockScanResult.getDefunctNbt().forEach(blockVector3 -> { SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_DEFUNCT_NBT", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockVector3), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ()); }); - blockScanResult.getDesignBlocks().forEach((material, poss) -> { - if(material.getBlastResistance() > type.getMaxBlastResistance()) { - poss.forEach(pos -> { - SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_DESIGN_BLOCK", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(pos), material.name(), pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()); - }); - } - }); + if(Core.getVersion() > 12) { + blockScanResult.getDesignBlocks().forEach((material, poss) -> { + if(material.getBlastResistance() > type.getMaxBlastResistance()) { + poss.forEach(pos -> { + SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_DESIGN_BLOCK", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(pos), material.name(), pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()); + }); + } + }); + } entities.forEach(blockPos -> { SchematicSystem.MESSAGE.sendPrefixless("AUTO_CHECKER_RESULT_ENTITY", p, SchematicSystem.MESSAGE.parse("AUTO_CHECKER_RESULT_TELEPORT_HERE", p), tpCommandTo(blockPos), blockPos.getX(), blockPos.getY(), blockPos.getZ()); }); From 46c2de43a4b8290b411de5751c826200184d9535 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Fri, 29 Nov 2024 13:02:35 +0100 Subject: [PATCH 07/12] Fix clipboard WorldEditRenderer with transform --- .../de/steamwar/core/WorldEditWrapper14.java | 18 ++++++++++++++---- .../de/steamwar/core/WorldEditWrapper8.java | 8 ++++++++ .../de/steamwar/core/WorldEditRenderer.java | 14 +++++++------- .../src/de/steamwar/core/WorldEditWrapper.java | 2 ++ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java b/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java index 38ae351a..eae1c53e 100644 --- a/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java +++ b/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java @@ -35,6 +35,8 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.*; import com.sk89q.worldedit.extent.clipboard.io.legacycompat.*; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.session.ClipboardHolder; @@ -44,6 +46,7 @@ import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.registry.LegacyMapper; import de.steamwar.sql.NoClipboardException; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; import java.io.*; import java.util.*; @@ -137,13 +140,20 @@ public class WorldEditWrapper14 implements WorldEditWrapper { } @Override - public org.bukkit.util.Vector getMinimum(Region region) { - return new org.bukkit.util.Vector(region.getMinimumPoint().getX(), region.getMinimumPoint().getY(), region.getMinimumPoint().getZ()); + public Vector getMinimum(Region region) { + return new Vector(region.getMinimumPoint().getX(), region.getMinimumPoint().getY(), region.getMinimumPoint().getZ()); } @Override - public org.bukkit.util.Vector getMaximum(Region region) { - return new org.bukkit.util.Vector(region.getMaximumPoint().getX(), region.getMaximumPoint().getY(), region.getMaximumPoint().getZ()); + public Vector getMaximum(Region region) { + return new Vector(region.getMaximumPoint().getX(), region.getMaximumPoint().getY(), region.getMaximumPoint().getZ()); + } + + @Override + public Vector applyTransform(Vector vector, Transform transform) { + Vector3 v = Vector3.at(vector.getX(), vector.getY(), vector.getZ()); + v = transform.apply(v); + return new org.bukkit.util.Vector(v.getX(), v.getY(), v.getZ()); } private static class MCEditSchematicReader extends NBTSchematicReader { diff --git a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java index e021ceed..69ebb544 100644 --- a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java +++ b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java @@ -32,6 +32,7 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader; import com.sk89q.worldedit.extent.clipboard.io.SchematicReader; +import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.session.ClipboardHolder; @@ -126,6 +127,13 @@ public class WorldEditWrapper8 implements WorldEditWrapper { return new org.bukkit.util.Vector(region.getMaximumPoint().getX(), region.getMaximumPoint().getY(), region.getMaximumPoint().getZ()); } + @Override + public org.bukkit.util.Vector applyTransform(org.bukkit.util.Vector vector, Transform transform) { + Vector v = new Vector(vector.getX(), vector.getY(), vector.getZ()); + v = transform.apply(v); + return new org.bukkit.util.Vector(v.getX(), v.getY(), v.getZ()); + } + private static class SpongeSchematicReader implements ClipboardReader { private final NBTInputStream inputStream; diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java index 7850754e..cd9a0d4e 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java @@ -24,6 +24,7 @@ import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.world.World; @@ -43,7 +44,7 @@ public class WorldEditRenderer { private static final Vector ONES = new Vector(1, 1, 1); - private static final Material WAND = Material.valueOf(Core.getVersion() > 12 ? "WOODEN_AXE" : "WOOD_AXE"); + private static final Material WAND = FlatteningWrapper.impl.getMaterial("WOOD_AXE"); private final WorldEditPlugin we; @@ -62,13 +63,12 @@ public class WorldEditRenderer { LocalSession session = we.getSession(player); try { Clipboard clipboard = session.getClipboard().getClipboard(); + Vector pos = player.getLocation().toVector(); Region region = clipboard.getRegion(); - Vector offset = player.getLocation().toVector().subtract(WorldEditWrapper.impl.getOrigin(clipboard)); - drawCuboid( - WorldEditWrapper.impl.getMinimum(region).add(offset), - WorldEditWrapper.impl.getMaximum(region).add(offset), - Particle.VILLAGER_HAPPY, player - ); + Transform transform = session.getClipboard().getTransform(); + Vector a = WorldEditWrapper.impl.applyTransform(WorldEditWrapper.impl.getMinimum(region).subtract(WorldEditWrapper.impl.getOrigin(clipboard)), transform).add(pos); + Vector b = WorldEditWrapper.impl.applyTransform(WorldEditWrapper.impl.getMaximum(region).subtract(WorldEditWrapper.impl.getOrigin(clipboard)), transform).add(pos); + drawCuboid(Vector.getMinimum(a, b), Vector.getMaximum(a, b), Particle.VILLAGER_HAPPY, player); } catch (EmptyClipboardException e) { //ignore } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java index c034723c..1d9ef6cd 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java @@ -21,6 +21,7 @@ package de.steamwar.core; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -39,6 +40,7 @@ public interface WorldEditWrapper { Vector getOrigin(Clipboard clipboard); Vector getMinimum(Region region); Vector getMaximum(Region region); + Vector applyTransform(Vector vector, Transform transform); static WorldEditPlugin getWorldEditPlugin() { return (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"); From f51de58921ecce5576cd82fdd42f5bd291bf4277 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Fri, 29 Nov 2024 13:17:52 +0100 Subject: [PATCH 08/12] Fix checking deleted schematic limbo --- .../velocitycore/commands/CheckCommand.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java index af6328b2..7fb5118a 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java @@ -272,12 +272,13 @@ public class CheckCommand extends SWCommand { } private boolean concludeCheckSession(String reason, SchematicType type) { - if(SchematicNode.getSchematicNode(schematic.getId()) == null) // Schematic was deleted - return false; + boolean exists = SchematicNode.getSchematicNode(schematic.getId()) != null; - CheckedSchematic.create(schematic, checker.user().getId(), startTime, Timestamp.from(Instant.now()), reason); - if(type != null) - schematic.setSchemtype(type); + if(exists) { + CheckedSchematic.create(schematic, checker.user().getId(), startTime, Timestamp.from(Instant.now()), reason); + if(type != null) + schematic.setSchemtype(type); + } remove(); VelocityCore.schedule(() -> { @@ -285,7 +286,7 @@ public class CheckCommand extends SWCommand { if(subserver != null) subserver.stop(); }).schedule(); - return true; + return exists; } private void remove() { From 28f96e313aeb7a5f10de269e551f263e242260fa Mon Sep 17 00:00:00 2001 From: Lixfel Date: Fri, 29 Nov 2024 14:09:32 +0100 Subject: [PATCH 09/12] Fix bau addmember hover message --- VelocityCore/src/de/steamwar/velocitycore/SubserverSystem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/SubserverSystem.java b/VelocityCore/src/de/steamwar/velocitycore/SubserverSystem.java index bd2c7f73..68bee31d 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/SubserverSystem.java +++ b/VelocityCore/src/de/steamwar/velocitycore/SubserverSystem.java @@ -47,7 +47,7 @@ public class SubserverSystem { Chatter o = Chatter.of(owner); o.system("SERVER_ADD_MEMBER", p); - o.prefixless("SERVER_ADD_MESSAGE", new Message("SERVER_ADD_MESSAGE_HOVER"), ClickEvent.runCommand("/bau addmember " + p.user().getUserName())); + o.prefixless("SERVER_ADD_MESSAGE", new Message("SERVER_ADD_MESSAGE_HOVER", p.user().getUserName()), ClickEvent.runCommand("/bau addmember " + p.user().getUserName())); } public static void sendPlayer(Subserver subserver, Player player) { From 4ee8456fd4631ca310a7165e5503487b596440cf Mon Sep 17 00:00:00 2001 From: Lixfel Date: Fri, 29 Nov 2024 15:23:17 +0100 Subject: [PATCH 10/12] Fix ConcurrentModificationException through death in loop --- .../src/de/steamwar/towerrun/listener/IngameListener.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java b/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java index 9e30cf07..befc7d47 100644 --- a/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java +++ b/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java @@ -29,6 +29,7 @@ import de.steamwar.towerrun.state.GameStates; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; @@ -83,14 +84,16 @@ public class IngameListener extends GameStateBukkitListener { .min(Comparator.comparing(Function.identity())) .orElse(0.0); + List toDamage = new ArrayList<>(); TowerRunGame.PLAYERS_ALIVE.forEach(towerRunPlayer -> { if (towerRunPlayer.player().getLocation().getY() - minY > 20) { towerRunPlayer.player().sendTitle("§a", TowerRun.getMessage().parse("CATCH_UP_WARNING", towerRunPlayer.player()), 5, 30, 5); } if (towerRunPlayer.player().getLocation().getY() - minY > 30) { - towerRunPlayer.player().damage(1.0); + toDamage.add(towerRunPlayer.player()); } }); + toDamage.forEach(p -> p.damage(1.0)); } }; antiCampRunnable.runTaskTimer(TowerRun.getInstance(), 100, 100); From 996e4932d7f7f270c4017fa4d8a3c9d7554d5a02 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sat, 30 Nov 2024 09:35:29 +0100 Subject: [PATCH 11/12] Text 1.20 Tablist fix --- .../src/de/steamwar/velocitycore/tablist/Tablist.java | 6 ++++-- .../de/steamwar/velocitycore/tablist/TablistManager.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java index 315717a6..1d8a0738 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java @@ -142,8 +142,10 @@ public class Tablist extends ChannelInboundHandlerAdapter { } public void onServerPostSwitch() { - if(player.getProtocolVersion().greaterThan(ProtocolVersion.MINECRAFT_1_20)) { - current.clear(); + if(player.getProtocolVersion().noLessThan(ProtocolVersion.MINECRAFT_1_20)) { + if(player.getProtocolVersion().greaterThan(ProtocolVersion.MINECRAFT_1_20)) + current.clear(); + sendPacket(player, createTeamPacket); } } diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java index 29cebb38..c008d76c 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java @@ -65,7 +65,7 @@ public class TablistManager extends BasicListener { tablists.computeIfAbsent(event.getPlayer(), Tablist::new).onServerSwitch(); } - if(event.getPlayer().getProtocolVersion().noGreaterThan(ProtocolVersion.MINECRAFT_1_20)) + if(event.getPlayer().getProtocolVersion().lessThan(ProtocolVersion.MINECRAFT_1_20)) Tablist.sendPacket(event.getPlayer(), Tablist.createTeamPacket); } From 2032a0b6427a1233ab9271c0dbf4322ab6d0c604 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sat, 30 Nov 2024 10:31:49 +0100 Subject: [PATCH 12/12] Fix links in chat not clickable --- VelocityCore/src/de/steamwar/messages/Chatter.java | 7 ++++--- .../src/de/steamwar/velocitycore/mods/ModUtils.java | 9 ++++----- .../velocitycore/network/handlers/EloPlayerHandler.java | 6 +++--- .../de/steamwar/velocitycore/tablist/TablistPart.java | 7 +++---- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/VelocityCore/src/de/steamwar/messages/Chatter.java b/VelocityCore/src/de/steamwar/messages/Chatter.java index c6571303..224b502f 100644 --- a/VelocityCore/src/de/steamwar/messages/Chatter.java +++ b/VelocityCore/src/de/steamwar/messages/Chatter.java @@ -26,9 +26,9 @@ import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ServerConnection; import de.steamwar.persistent.Servertype; import de.steamwar.persistent.Subserver; -import de.steamwar.velocitycore.VelocityCore; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; +import de.steamwar.velocitycore.VelocityCore; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; @@ -47,6 +47,7 @@ import java.util.function.Supplier; import java.util.stream.Stream; public interface Chatter { + LegacyComponentSerializer SERIALIZER = LegacyComponentSerializer.builder().extractUrls().build(); static Stream allPlayers() { return VelocityCore.getProxy().getAllPlayers().stream(); @@ -138,7 +139,7 @@ public interface Chatter { } default String parseToLegacy(Message message) { - return LegacyComponentSerializer.legacySection().serialize(parse(message)); + return SERIALIZER.serialize(parse(message)); } default Component parse(String format, Object... params) { @@ -178,7 +179,7 @@ public interface Chatter { params[i] = func.apply(this); } } - return LegacyComponentSerializer.legacySection().deserialize(format.format(params)); + return SERIALIZER.deserialize(format.format(params)); } static PlayerChatter of(Player player) { diff --git a/VelocityCore/src/de/steamwar/velocitycore/mods/ModUtils.java b/VelocityCore/src/de/steamwar/velocitycore/mods/ModUtils.java index c1cf7bad..c23434ec 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/mods/ModUtils.java +++ b/VelocityCore/src/de/steamwar/velocitycore/mods/ModUtils.java @@ -20,18 +20,17 @@ package de.steamwar.velocitycore.mods; import com.velocitypowered.api.proxy.Player; -import de.steamwar.sql.Punishment; -import de.steamwar.velocitycore.VelocityCore; -import de.steamwar.velocitycore.commands.PunishmentCommand; import de.steamwar.messages.Chatter; import de.steamwar.sql.Mod; import de.steamwar.sql.Mod.ModType; +import de.steamwar.sql.Punishment; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; +import de.steamwar.velocitycore.VelocityCore; +import de.steamwar.velocitycore.commands.PunishmentCommand; import lombok.Getter; import lombok.experimental.UtilityClass; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import java.sql.Timestamp; import java.time.Instant; @@ -88,7 +87,7 @@ public class ModUtils { VelocityCore.getLogger().log(Level.SEVERE, "%s %s wurde automatisch wegen der Mods %s gebannt.".formatted(user.getUserName(), user.getId(), modList)); } - disconnect.accept(LegacyComponentSerializer.legacySection().deserialize(message)); + disconnect.accept(Chatter.SERIALIZER.deserialize(message)); return false; } } diff --git a/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloPlayerHandler.java b/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloPlayerHandler.java index 417a0e5e..3ef4eb8f 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloPlayerHandler.java +++ b/VelocityCore/src/de/steamwar/velocitycore/network/handlers/EloPlayerHandler.java @@ -20,6 +20,7 @@ package de.steamwar.velocitycore.network.handlers; import com.velocitypowered.api.proxy.Player; +import de.steamwar.messages.Chatter; import de.steamwar.network.packets.PacketHandler; import de.steamwar.network.packets.common.FightEndsPacket; import de.steamwar.sql.SchematicType; @@ -29,7 +30,6 @@ import de.steamwar.velocitycore.ArenaMode; import de.steamwar.velocitycore.VelocityCore; import lombok.RequiredArgsConstructor; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.title.Title; import java.time.Duration; @@ -186,10 +186,10 @@ public class EloPlayerHandler extends PacketHandler { double eloStep = eloGain / 40.0; for (int i = 0; i < 40; i++) { - Component eloGainComponent = LegacyComponentSerializer.legacySection().deserialize(color + (int) (eloStep * (i + 1))); + Component eloGainComponent = Chatter.SERIALIZER.deserialize(color + (int) (eloStep * (i + 1))); int finalI = i; VelocityCore.schedule(() -> player.showTitle(Title.title( - LegacyComponentSerializer.legacySection().deserialize(getRankup.apply(finalI)), + Chatter.SERIALIZER.deserialize(getRankup.apply(finalI)), eloGainComponent, Title.Times.times(Duration.ofMillis(finalI == 0 ? 250 : 0), Duration.ofSeconds(2), Duration.ofMillis(finalI == 39 ? 250 : 0)) ))).delay(i * 50L, TimeUnit.MILLISECONDS).schedule(); diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistPart.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistPart.java index 308c9820..f00f663e 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistPart.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistPart.java @@ -26,7 +26,6 @@ import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; import lombok.Getter; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import java.util.List; import java.util.UUID; @@ -43,7 +42,7 @@ public interface TablistPart { public Item(UUID uuid, String displayName, List properties) { this.uuid = uuid; - this.displayName = LegacyComponentSerializer.legacySection().deserialize(displayName); + this.displayName = Chatter.SERIALIZER.deserialize(displayName); this.properties = properties; } @@ -55,9 +54,9 @@ public interface TablistPart { this.uuid = player.getUniqueId(); UserPerm.Prefix prefix = SteamwarUser.get(player.getUniqueId()).prefix(); if (prefix == UserPerm.emptyPrefix && sameTeam) { - this.displayName = LegacyComponentSerializer.legacySection().deserialize("§f" + player.getUsername()); + this.displayName = Chatter.SERIALIZER.deserialize("§f" + player.getUsername()); } else { - this.displayName = LegacyComponentSerializer.legacySection().deserialize(prefix.getColorCode() + player.getUsername()); + this.displayName = Chatter.SERIALIZER.deserialize(prefix.getColorCode() + player.getUsername()); } this.properties = player.getGameProfileProperties(); }