From dccb435bce5ba78fa20a58e096408c9452c706fb Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 30 Mar 2025 17:39:47 +0200 Subject: [PATCH 01/17] Update WorldEdit CUI to RBlockDisplay --- SpigotCore/SpigotCore_20/build.gradle.kts | 1 + .../de/steamwar/core/WorldEditRenderer20.java | 217 ++++++++++++++++++ .../core/renderers/CuboidRegionRenderer.java | 159 +++++++++++++ .../core/renderers/RegionRenderer.java | 47 ++++ .../de/steamwar/core/WorldEditRenderer8.java | 23 ++ SpigotCore/SpigotCore_9/build.gradle.kts | 1 + .../de/steamwar/core/WorldEditRenderer9.java | 125 ++++++++++ .../src/de/steamwar/core/Core.java | 4 +- .../de/steamwar/core/WorldEditRenderer.java | 129 ++--------- 9 files changed, 590 insertions(+), 116 deletions(-) create mode 100644 SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRenderer20.java create mode 100644 SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/CuboidRegionRenderer.java create mode 100644 SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/RegionRenderer.java create mode 100644 SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRenderer8.java create mode 100644 SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRenderer9.java diff --git a/SpigotCore/SpigotCore_20/build.gradle.kts b/SpigotCore/SpigotCore_20/build.gradle.kts index 3e894ccc..25808631 100644 --- a/SpigotCore/SpigotCore_20/build.gradle.kts +++ b/SpigotCore/SpigotCore_20/build.gradle.kts @@ -26,5 +26,6 @@ dependencies { compileOnly(libs.spigotapi) + compileOnly(libs.worldedit15) compileOnly(libs.nms20) } diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRenderer20.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRenderer20.java new file mode 100644 index 00000000..d84f4abb --- /dev/null +++ b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRenderer20.java @@ -0,0 +1,217 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.WorldEdit; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; +import com.sk89q.worldedit.regions.CuboidRegion; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.regions.RegionSelector; +import com.sk89q.worldedit.world.World; +import de.steamwar.core.renderers.CuboidRegionRenderer; +import de.steamwar.core.renderers.RegionRenderer; +import de.steamwar.entity.REntityServer; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.player.*; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +public class WorldEditRenderer20 implements WorldEditRenderer, Listener { + + private static final Map servers = new HashMap<>(); + private static final Map clipboards = new HashMap<>(); + private static final Map regionSelections = new HashMap<>(); + + private static final Material WAND = FlatteningWrapper.impl.getMaterial("WOOD_AXE"); + + private final WorldEditPlugin we; + + private static final Map, Supplier>> rendererMap = new HashMap<>(); + + static { + rendererMap.put(CuboidRegion.class, CuboidRegionRenderer::new); + } + + public WorldEditRenderer20() { + we = WorldEditWrapper.getWorldEditPlugin(); + Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); + Bukkit.getScheduler().runTaskTimer(Core.getInstance(), () -> { + for (Player player : Bukkit.getOnlinePlayers()) { + render(player); + } + }, 10, 10); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerJoin(PlayerJoinEvent event) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + render(event.getPlayer()); + }, 0); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + render(event.getPlayer()); + }, 0); + } + + @EventHandler + public void onPlayerDropItem(PlayerDropItemEvent event) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + render(event.getPlayer()); + }, 0); + } + + @EventHandler + public void onPlayerItemHeld(PlayerItemHeldEvent event) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + render(event.getPlayer()); + }, 0); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onBlockBreak(BlockBreakEvent event) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + render(event.getPlayer()); + }, 0); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerInteract(PlayerInteractEvent event) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + render(event.getPlayer()); + }, 0); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerMove(PlayerMoveEvent event) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + render(event.getPlayer(), true, false); + }, 0); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerQuit(PlayerQuitEvent event) { + REntityServer server = servers.remove(event.getPlayer()); + clipboards.remove(event.getPlayer()); + regionSelections.remove(event.getPlayer()); + if (server == null) return; + server.close(); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { + String command = event.getMessage().split(" ")[0]; + command = command.replaceFirst("/", ""); + command = command.toLowerCase(); + if (WorldEdit.getInstance().getPlatformManager().getPlatformCommandManager().getCommandManager().containsCommand(command)) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + render(event.getPlayer()); + }, 10); + } + } + + private void render(Player player) { + render(player, true, true); + } + + private void render(Player player, boolean renderClipboard, boolean renderRegionSelection) { + if (player.getInventory().getItemInMainHand().getType() != WAND) { + REntityServer entityServer = servers.remove(player); + clipboards.remove(player); + regionSelections.remove(player); + if (entityServer != null) entityServer.close(); + return; + } + + REntityServer server = servers.computeIfAbsent(player, __ -> { + REntityServer _server = new REntityServer(); + _server.addPlayer(player); + return _server; + }); + + LocalSession session = we.getSession(player); + if (renderClipboard) { + renderClipboard(server, session, player); + } + if (renderRegionSelection) { + renderSelection(server, session, player); + } + } + + @SuppressWarnings("unchecked") + private void renderClipboard(REntityServer server, LocalSession session, Player player) { + try { + Region region = session.getClipboard().getClipboard().getRegion(); + clipboards.compute(player, (__, regionRenderer) -> { + if (regionRenderer != null && !regionRenderer.canDisplay(region)) { + regionRenderer.clear(); + regionRenderer = null; + } + if (regionRenderer == null) { + return rendererMap.getOrDefault(region.getClass(), RegionRenderer.NOOPImpl::new).get(); + } else { + return regionRenderer; + } + }).update(server, region, session.getClipboard(), Material.LIME_CONCRETE.createBlockData()); + } catch (EmptyClipboardException e) { + RegionRenderer regionRenderer = clipboards.remove(player); + if (regionRenderer != null) regionRenderer.clear(); + } + } + + @SuppressWarnings("unchecked") + private void renderSelection(REntityServer server, LocalSession session, Player player) { + World world = session.getSelectionWorld(); + if (world == null) { + return; + } + RegionSelector regionSelector = session.getRegionSelector(world); + try { + Region region = regionSelector.getRegion(); + regionSelections.compute(player, (__, regionRenderer) -> { + if (regionRenderer != null && !regionRenderer.canDisplay(region)) { + regionRenderer.clear(); + regionRenderer = null; + } + if (regionRenderer == null) { + return rendererMap.getOrDefault(region.getClass(), RegionRenderer.NOOPImpl::new).get(); + } else { + return regionRenderer; + } + }).update(server, region, null, Material.PURPLE_CONCRETE.createBlockData()); + } catch (IncompleteRegionException e) { + RegionRenderer regionRenderer = regionSelections.remove(player); + if (regionRenderer != null) regionRenderer.clear(); + } + } +} diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/CuboidRegionRenderer.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/CuboidRegionRenderer.java new file mode 100644 index 00000000..70391d3d --- /dev/null +++ b/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/CuboidRegionRenderer.java @@ -0,0 +1,159 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.renderers; + +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; +import de.steamwar.core.WorldEditWrapper; +import de.steamwar.entity.RBlockDisplay; +import de.steamwar.entity.REntityServer; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Display; +import org.bukkit.entity.Player; +import org.bukkit.util.Transformation; +import org.bukkit.util.Vector; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +public class CuboidRegionRenderer implements RegionRenderer { + + private static final World WORLD = Bukkit.getWorlds().get(0); + private static final float offset = 1 / 1024f; + private static final float width = 1 / 16f; + + private Vector lastA = null; + private Vector lastB = null; + + private RBlockDisplay bd01; + private RBlockDisplay bd02; + private RBlockDisplay bd03; + private RBlockDisplay bd04; + private RBlockDisplay bd05; + private RBlockDisplay bd06; + private RBlockDisplay bd07; + private RBlockDisplay bd08; + private RBlockDisplay bd09; + private RBlockDisplay bd10; + private RBlockDisplay bd11; + private RBlockDisplay bd12; + + @Override + public boolean canDisplay(Region region) { + return region instanceof CuboidRegion; + } + + public void update(REntityServer server, CuboidRegion region, ClipboardHolder holder, BlockData block) { + Vector a; + Vector b; + if (holder != null) { + Player player = server.getPlayers().stream().findFirst().orElse(null); + if (player == null) return; + Vector pos = player.getLocation().toVector(); + Transform transform = holder.getTransform(); + a = WorldEditWrapper.impl.applyTransform(WorldEditWrapper.impl.getMinimum(region).subtract(WorldEditWrapper.impl.getOrigin(holder.getClipboard())), transform).add(pos); + b = WorldEditWrapper.impl.applyTransform(WorldEditWrapper.impl.getMaximum(region).subtract(WorldEditWrapper.impl.getOrigin(holder.getClipboard())), transform).add(pos); + } else { + a = WorldEditWrapper.impl.getMinimum(region); + b = WorldEditWrapper.impl.getMaximum(region); + } + + if (a.equals(lastA) && b.equals(lastB)) { + return; + } + + drawCuboid(server, toBlockVector(a), toBlockVector(b), block); + } + + @Override + public void clear() { + if (bd01 != null) bd01.die(); + if (bd02 != null) bd02.die(); + if (bd03 != null) bd03.die(); + if (bd04 != null) bd04.die(); + if (bd05 != null) bd05.die(); + if (bd06 != null) bd06.die(); + if (bd07 != null) bd07.die(); + if (bd08 != null) bd08.die(); + if (bd09 != null) bd09.die(); + if (bd10 != null) bd10.die(); + if (bd11 != null) bd11.die(); + if (bd12 != null) bd12.die(); + } + + private void drawCuboid(REntityServer server, Vector min, Vector max, BlockData block) { + max.add(new Vector(1 - width, 1 - width, 1 - width)); + + bd01 = drawLine(bd01, server, new Vector(min.getX() - offset, min.getY(), min.getZ()), new Vector(max.getX() + width, min.getY(), min.getZ()), block); + bd02 = drawLine(bd02, server, new Vector(min.getX() - offset, max.getY(), min.getZ()), new Vector(max.getX() + width, max.getY(), min.getZ()), block); + bd03 = drawLine(bd03, server, new Vector(min.getX() - offset, min.getY(), max.getZ()), new Vector(max.getX() + width, min.getY(), max.getZ()), block); + bd04 = drawLine(bd04, server, new Vector(min.getX() - offset, max.getY(), max.getZ()), new Vector(max.getX() + width, max.getY(), max.getZ()), block); + + bd05 = drawLine(bd05, server, new Vector(min.getX(), min.getY() - offset, min.getZ()), new Vector(min.getX(), max.getY() + width, min.getZ()), block); + bd06 = drawLine(bd06, server, new Vector(max.getX(), min.getY() - offset, min.getZ()), new Vector(max.getX(), max.getY() + width, min.getZ()), block); + bd07 = drawLine(bd07, server, new Vector(min.getX(), min.getY() - offset, max.getZ()), new Vector(min.getX(), max.getY() + width, max.getZ()), block); + bd08 = drawLine(bd08, server, new Vector(max.getX(), min.getY() - offset, max.getZ()), new Vector(max.getX(), max.getY() + width, max.getZ()), block); + + bd09 = drawLine(bd09, server, new Vector(min.getX(), min.getY(), min.getZ() - offset), new Vector(min.getX(), min.getY(), max.getZ() + width), block); + bd10 = drawLine(bd10, server, new Vector(max.getX(), min.getY(), min.getZ() - offset), new Vector(max.getX(), min.getY(), max.getZ() + width), block); + bd11 = drawLine(bd11, server, new Vector(min.getX(), max.getY(), min.getZ() - offset), new Vector(min.getX(), max.getY(), max.getZ() + width), block); + bd12 = drawLine(bd12, server, new Vector(max.getX(), max.getY(), min.getZ() - offset), new Vector(max.getX(), max.getY(), max.getZ() + width), block); + } + + private RBlockDisplay drawLine(RBlockDisplay display, REntityServer server, Vector from, Vector to, BlockData block) { + Location spawnLocation = from.clone().add(to).divide(new Vector(2, 2, 2)).toLocation(WORLD); + if (display == null) { + display = new RBlockDisplay(server, spawnLocation); + } + + Vector vector = to.clone().subtract(from); + if (vector.getX() == 0) { + vector.setX(vector.getX() + width + offset * 2); + } + if (vector.getY() == 0) { + vector.setY(vector.getY() + width + offset * 2); + } + if (vector.getZ() == 0) { + vector.setZ(vector.getZ() + width + offset * 2); + } + + Vector transformVec = from.subtract(spawnLocation.toVector()); + transformVec.subtract(new Vector(offset, offset, offset)); + + display.setTransform(new Transformation(toVec3f(transformVec), new Quaternionf(0, 0, 0, 1), toVec3f(vector), new Quaternionf(0, 0, 0, 1))); + display.setBrightness(new Display.Brightness(15, 15)); + display.setBlock(block); + display.move(spawnLocation); + + return display; + } + + private Vector toBlockVector(Vector vector) { + return new Vector(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); + } + + private Vector3f toVec3f(Vector vector) { + return new Vector3f((float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); + } +} diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/RegionRenderer.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/RegionRenderer.java new file mode 100644 index 00000000..53121deb --- /dev/null +++ b/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/RegionRenderer.java @@ -0,0 +1,47 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.renderers; + +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.session.ClipboardHolder; +import de.steamwar.entity.REntityServer; +import org.bukkit.block.data.BlockData; + +public interface RegionRenderer { + + boolean canDisplay(Region region); + void update(REntityServer server, R region, ClipboardHolder holder, BlockData block); + void clear(); + + final class NOOPImpl implements RegionRenderer { + @Override + public boolean canDisplay(Region region) { + return false; + } + + @Override + public void update(REntityServer server, Region region, ClipboardHolder holder, BlockData block) { + } + + @Override + public void clear() { + } + } +} diff --git a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRenderer8.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRenderer8.java new file mode 100644 index 00000000..df3a6633 --- /dev/null +++ b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRenderer8.java @@ -0,0 +1,23 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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; + +public class WorldEditRenderer8 implements WorldEditRenderer { +} diff --git a/SpigotCore/SpigotCore_9/build.gradle.kts b/SpigotCore/SpigotCore_9/build.gradle.kts index a888faf1..c149a3fd 100644 --- a/SpigotCore/SpigotCore_9/build.gradle.kts +++ b/SpigotCore/SpigotCore_9/build.gradle.kts @@ -26,4 +26,5 @@ dependencies { compileOnly(project(":SpigotCore:SpigotCore_8", "default")) compileOnly(libs.nms9) + compileOnly(libs.worldedit12) } diff --git a/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRenderer9.java b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRenderer9.java new file mode 100644 index 00000000..971a759c --- /dev/null +++ b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRenderer9.java @@ -0,0 +1,125 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.math.transform.Transform; +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; +import org.bukkit.Particle; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +public class WorldEditRenderer9 implements 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 static final Vector ONES = new Vector(1, 1, 1); + + private static final Material WAND = FlatteningWrapper.impl.getMaterial("WOOD_AXE"); + + private final WorldEditPlugin we; + + public WorldEditRenderer9() { + we = WorldEditWrapper.getWorldEditPlugin(); + + Bukkit.getScheduler().runTaskTimer(Core.getInstance(), this::render, 20, 20); + } + + private void render() { + for(Player player : Bukkit.getOnlinePlayers()) { + if(player.getInventory().getItemInMainHand().getType() != WAND) + continue; + + LocalSession session = we.getSession(player); + try { + Clipboard clipboard = session.getClipboard().getClipboard(); + Vector pos = player.getLocation().toVector(); + Region region = clipboard.getRegion(); + 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), TrickyParticleWrapper.impl.getVillagerHappy(), player); + } catch (EmptyClipboardException 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); + 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 : org.bukkit.Particle.TOWN_AURA, x, y, z, 1, 0.0, 0.0, 0.0, 0.0); + } + } +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java index 4e7b7576..24b207e8 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -102,8 +102,8 @@ public class Core extends JavaPlugin{ if(Core.getVersion() >= 19) new ServerDataHandler(); - if(Core.getVersion() > 8 && Bukkit.getPluginManager().getPlugin("WorldEdit") != null) - new WorldEditRenderer(); + if(Bukkit.getPluginManager().getPlugin("WorldEdit") != null) + WorldEditRenderer.impl.init(); Bukkit.getScheduler().runTaskTimer(this, TabCompletionCache::invalidateOldEntries, 20, 20); Bukkit.getScheduler().runTaskTimer(Core.getInstance(), SteamwarUser::clear, 72000, 72000); diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java index 377efe13..6b90f1d2 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java @@ -1,126 +1,27 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2024 SteamWar.de-Serverteam + * Copyright (C) 2020 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 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. + * 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 . + * 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.math.transform.Transform; -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; -import org.bukkit.Particle; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; +public interface WorldEditRenderer { + WorldEditRenderer impl = VersionDependent.getVersionImpl(Core.getInstance()); -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 static final Vector ONES = new Vector(1, 1, 1); - - private static final Material WAND = FlatteningWrapper.impl.getMaterial("WOOD_AXE"); - - 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() != WAND) - continue; - - LocalSession session = we.getSession(player); - try { - Clipboard clipboard = session.getClipboard().getClipboard(); - Vector pos = player.getLocation().toVector(); - Region region = clipboard.getRegion(); - 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), TrickyParticleWrapper.impl.getVillagerHappy(), player); - } catch (EmptyClipboardException 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); - 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, 0.0, 0.0, 0.0, 0.0); - } + default void init() { } } From f6dc1e1059a0f5e665add244b39a5020263130a3 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 31 Mar 2025 19:24:30 +0200 Subject: [PATCH 02/17] Update WE version of 1.20 to FAWE 1.18 --- SpigotCore/SpigotCore_20/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpigotCore/SpigotCore_20/build.gradle.kts b/SpigotCore/SpigotCore_20/build.gradle.kts index 25808631..79f667e0 100644 --- a/SpigotCore/SpigotCore_20/build.gradle.kts +++ b/SpigotCore/SpigotCore_20/build.gradle.kts @@ -26,6 +26,6 @@ dependencies { compileOnly(libs.spigotapi) - compileOnly(libs.worldedit15) + compileOnly(libs.fawe18) compileOnly(libs.nms20) } From b10897c204c73663ec354615e48dd57b77ac2c07 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Tue, 15 Apr 2025 14:59:38 +0200 Subject: [PATCH 03/17] Update WorldEditRenderer --- .../de/steamwar/core/WorldEditRenderer20.java | 217 --------------- .../core/WorldEditRendererWrapper20.java | 145 +++++++++++ .../core/renderers/CuboidRegionRenderer.java | 159 ----------- .../core/WorldEditRendererWrapper8.java} | 29 +-- .../de/steamwar/core/WorldEditRenderer9.java | 125 --------- .../core/WorldEditRendererWrapper9.java | 80 ++++++ .../src/de/steamwar/core/Core.java | 50 +++- .../de/steamwar/core/VersionDependent.java | 10 +- .../de/steamwar/core/WorldEditRenderer.java | 169 ++++++++++-- .../core/WorldEditRendererWrapper.java | 47 ++++ .../src/de/steamwar/entity/CAABox.java | 103 ++++++++ .../src/de/steamwar/entity/CAALine.java | 246 ++++++++++++++++++ 12 files changed, 837 insertions(+), 543 deletions(-) delete mode 100644 SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRenderer20.java create mode 100644 SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java delete mode 100644 SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/CuboidRegionRenderer.java rename SpigotCore/{SpigotCore_20/src/de/steamwar/core/renderers/RegionRenderer.java => SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java} (50%) delete mode 100644 SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRenderer9.java create mode 100644 SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java create mode 100644 SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java create mode 100644 SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAABox.java create mode 100644 SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAALine.java diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRenderer20.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRenderer20.java deleted file mode 100644 index d84f4abb..00000000 --- a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRenderer20.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 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.WorldEdit; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.regions.RegionSelector; -import com.sk89q.worldedit.world.World; -import de.steamwar.core.renderers.CuboidRegionRenderer; -import de.steamwar.core.renderers.RegionRenderer; -import de.steamwar.entity.REntityServer; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.player.*; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Supplier; - -public class WorldEditRenderer20 implements WorldEditRenderer, Listener { - - private static final Map servers = new HashMap<>(); - private static final Map clipboards = new HashMap<>(); - private static final Map regionSelections = new HashMap<>(); - - private static final Material WAND = FlatteningWrapper.impl.getMaterial("WOOD_AXE"); - - private final WorldEditPlugin we; - - private static final Map, Supplier>> rendererMap = new HashMap<>(); - - static { - rendererMap.put(CuboidRegion.class, CuboidRegionRenderer::new); - } - - public WorldEditRenderer20() { - we = WorldEditWrapper.getWorldEditPlugin(); - Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); - Bukkit.getScheduler().runTaskTimer(Core.getInstance(), () -> { - for (Player player : Bukkit.getOnlinePlayers()) { - render(player); - } - }, 10, 10); - } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onPlayerJoin(PlayerJoinEvent event) { - Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - render(event.getPlayer()); - }, 0); - } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { - Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - render(event.getPlayer()); - }, 0); - } - - @EventHandler - public void onPlayerDropItem(PlayerDropItemEvent event) { - Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - render(event.getPlayer()); - }, 0); - } - - @EventHandler - public void onPlayerItemHeld(PlayerItemHeldEvent event) { - Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - render(event.getPlayer()); - }, 0); - } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onBlockBreak(BlockBreakEvent event) { - Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - render(event.getPlayer()); - }, 0); - } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onPlayerInteract(PlayerInteractEvent event) { - Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - render(event.getPlayer()); - }, 0); - } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onPlayerMove(PlayerMoveEvent event) { - Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - render(event.getPlayer(), true, false); - }, 0); - } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onPlayerQuit(PlayerQuitEvent event) { - REntityServer server = servers.remove(event.getPlayer()); - clipboards.remove(event.getPlayer()); - regionSelections.remove(event.getPlayer()); - if (server == null) return; - server.close(); - } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { - String command = event.getMessage().split(" ")[0]; - command = command.replaceFirst("/", ""); - command = command.toLowerCase(); - if (WorldEdit.getInstance().getPlatformManager().getPlatformCommandManager().getCommandManager().containsCommand(command)) { - Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - render(event.getPlayer()); - }, 10); - } - } - - private void render(Player player) { - render(player, true, true); - } - - private void render(Player player, boolean renderClipboard, boolean renderRegionSelection) { - if (player.getInventory().getItemInMainHand().getType() != WAND) { - REntityServer entityServer = servers.remove(player); - clipboards.remove(player); - regionSelections.remove(player); - if (entityServer != null) entityServer.close(); - return; - } - - REntityServer server = servers.computeIfAbsent(player, __ -> { - REntityServer _server = new REntityServer(); - _server.addPlayer(player); - return _server; - }); - - LocalSession session = we.getSession(player); - if (renderClipboard) { - renderClipboard(server, session, player); - } - if (renderRegionSelection) { - renderSelection(server, session, player); - } - } - - @SuppressWarnings("unchecked") - private void renderClipboard(REntityServer server, LocalSession session, Player player) { - try { - Region region = session.getClipboard().getClipboard().getRegion(); - clipboards.compute(player, (__, regionRenderer) -> { - if (regionRenderer != null && !regionRenderer.canDisplay(region)) { - regionRenderer.clear(); - regionRenderer = null; - } - if (regionRenderer == null) { - return rendererMap.getOrDefault(region.getClass(), RegionRenderer.NOOPImpl::new).get(); - } else { - return regionRenderer; - } - }).update(server, region, session.getClipboard(), Material.LIME_CONCRETE.createBlockData()); - } catch (EmptyClipboardException e) { - RegionRenderer regionRenderer = clipboards.remove(player); - if (regionRenderer != null) regionRenderer.clear(); - } - } - - @SuppressWarnings("unchecked") - private void renderSelection(REntityServer server, LocalSession session, Player player) { - World world = session.getSelectionWorld(); - if (world == null) { - return; - } - RegionSelector regionSelector = session.getRegionSelector(world); - try { - Region region = regionSelector.getRegion(); - regionSelections.compute(player, (__, regionRenderer) -> { - if (regionRenderer != null && !regionRenderer.canDisplay(region)) { - regionRenderer.clear(); - regionRenderer = null; - } - if (regionRenderer == null) { - return rendererMap.getOrDefault(region.getClass(), RegionRenderer.NOOPImpl::new).get(); - } else { - return regionRenderer; - } - }).update(server, region, null, Material.PURPLE_CONCRETE.createBlockData()); - } catch (IncompleteRegionException e) { - RegionRenderer regionRenderer = regionSelections.remove(player); - if (regionRenderer != null) regionRenderer.clear(); - } - } -} diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java new file mode 100644 index 00000000..5bffe84f --- /dev/null +++ b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java @@ -0,0 +1,145 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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 de.steamwar.entity.CAABox; +import de.steamwar.entity.CAALine; +import de.steamwar.entity.REntityServer; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class WorldEditRendererWrapper20 implements WorldEditRendererWrapper { + + private static final class BoxPair { + private CAABox regionBox; + private CAABox clipboardBox; + + public CAABox get(boolean clipboard) { + if (clipboard) { + return clipboardBox; + } else { + return regionBox; + } + } + + public void set(boolean clipboard, CAABox box) { + if (clipboard) { + this.clipboardBox = box; + } else { + this.regionBox = box; + } + } + + public void die() { + if (clipboardBox != null) { + clipboardBox.die(); + } + if (regionBox != null) { + regionBox.die(); + } + } + } + + private static final Map servers = new HashMap<>(); + private static final Map> boxes = new HashMap<>(); + + @Override + public void draw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2) { + REntityServer server = servers.computeIfAbsent(player, __ -> { + REntityServer entityServer = new REntityServer(); + entityServer.addPlayer(player); + return entityServer; + }); + + float width = CAALine.DEFAULT_WIDTH; + if (player != owner) { + width = 1 / 64f; + } + + BlockData block; + if (player == owner) { + if (clipboard) { + block = Material.LIME_CONCRETE.createBlockData(); + } else { + block = Material.PURPLE_CONCRETE.createBlockData(); + } + } else { + block = Material.GRAY_CONCRETE.createBlockData(); + } + + BoxPair boxPair = boxes.computeIfAbsent(player, __ -> new HashMap<>()).computeIfAbsent(owner, __ -> new BoxPair()); + CAABox box = boxPair.get(clipboard); + if (box == null) { + box = new CAABox(server); + boxPair.set(clipboard, box); + } + box.setPos1(null).setPos2(null); + box.setPos1(pos1.toLocation(player.getWorld())); + box.setPos2(pos2.toLocation(player.getWorld())); + box.setWidth(width); + box.setBlock(block); + } + + @Override + public void tick(Player player) { + REntityServer server = servers.get(player); + if (server != null) server.tick(); + } + + @Override + public void hide(Player player, Player owner, boolean clipboard, boolean hide) { + Map pairs = boxes.getOrDefault(player, Collections.emptyMap()); + if (owner != null) { + BoxPair boxPair = pairs.get(owner); + if (boxPair == null) return; + CAABox box = boxPair.get(clipboard); + if (box != null) box.hide(hide); + } else { + pairs.values().forEach(boxPair -> { + CAABox box = boxPair.get(clipboard); + if (box != null) box.hide(hide); + }); + } + } + + @Override + public void remove(Player player) { + Map removed = boxes.remove(player); + if (removed != null) { + removed.values().forEach(boxPair -> { + boxPair.die(); + }); + } + boxes.values().forEach(map -> { + BoxPair boxPair = map.remove(player); + if (boxPair == null) return; + boxPair.die(); + }); + + REntityServer server = servers.remove(player); + if (server != null) server.close(); + } +} diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/CuboidRegionRenderer.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/CuboidRegionRenderer.java deleted file mode 100644 index 70391d3d..00000000 --- a/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/CuboidRegionRenderer.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 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.renderers; - -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; -import de.steamwar.core.WorldEditWrapper; -import de.steamwar.entity.RBlockDisplay; -import de.steamwar.entity.REntityServer; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.block.data.BlockData; -import org.bukkit.entity.Display; -import org.bukkit.entity.Player; -import org.bukkit.util.Transformation; -import org.bukkit.util.Vector; -import org.joml.Quaternionf; -import org.joml.Vector3f; - -public class CuboidRegionRenderer implements RegionRenderer { - - private static final World WORLD = Bukkit.getWorlds().get(0); - private static final float offset = 1 / 1024f; - private static final float width = 1 / 16f; - - private Vector lastA = null; - private Vector lastB = null; - - private RBlockDisplay bd01; - private RBlockDisplay bd02; - private RBlockDisplay bd03; - private RBlockDisplay bd04; - private RBlockDisplay bd05; - private RBlockDisplay bd06; - private RBlockDisplay bd07; - private RBlockDisplay bd08; - private RBlockDisplay bd09; - private RBlockDisplay bd10; - private RBlockDisplay bd11; - private RBlockDisplay bd12; - - @Override - public boolean canDisplay(Region region) { - return region instanceof CuboidRegion; - } - - public void update(REntityServer server, CuboidRegion region, ClipboardHolder holder, BlockData block) { - Vector a; - Vector b; - if (holder != null) { - Player player = server.getPlayers().stream().findFirst().orElse(null); - if (player == null) return; - Vector pos = player.getLocation().toVector(); - Transform transform = holder.getTransform(); - a = WorldEditWrapper.impl.applyTransform(WorldEditWrapper.impl.getMinimum(region).subtract(WorldEditWrapper.impl.getOrigin(holder.getClipboard())), transform).add(pos); - b = WorldEditWrapper.impl.applyTransform(WorldEditWrapper.impl.getMaximum(region).subtract(WorldEditWrapper.impl.getOrigin(holder.getClipboard())), transform).add(pos); - } else { - a = WorldEditWrapper.impl.getMinimum(region); - b = WorldEditWrapper.impl.getMaximum(region); - } - - if (a.equals(lastA) && b.equals(lastB)) { - return; - } - - drawCuboid(server, toBlockVector(a), toBlockVector(b), block); - } - - @Override - public void clear() { - if (bd01 != null) bd01.die(); - if (bd02 != null) bd02.die(); - if (bd03 != null) bd03.die(); - if (bd04 != null) bd04.die(); - if (bd05 != null) bd05.die(); - if (bd06 != null) bd06.die(); - if (bd07 != null) bd07.die(); - if (bd08 != null) bd08.die(); - if (bd09 != null) bd09.die(); - if (bd10 != null) bd10.die(); - if (bd11 != null) bd11.die(); - if (bd12 != null) bd12.die(); - } - - private void drawCuboid(REntityServer server, Vector min, Vector max, BlockData block) { - max.add(new Vector(1 - width, 1 - width, 1 - width)); - - bd01 = drawLine(bd01, server, new Vector(min.getX() - offset, min.getY(), min.getZ()), new Vector(max.getX() + width, min.getY(), min.getZ()), block); - bd02 = drawLine(bd02, server, new Vector(min.getX() - offset, max.getY(), min.getZ()), new Vector(max.getX() + width, max.getY(), min.getZ()), block); - bd03 = drawLine(bd03, server, new Vector(min.getX() - offset, min.getY(), max.getZ()), new Vector(max.getX() + width, min.getY(), max.getZ()), block); - bd04 = drawLine(bd04, server, new Vector(min.getX() - offset, max.getY(), max.getZ()), new Vector(max.getX() + width, max.getY(), max.getZ()), block); - - bd05 = drawLine(bd05, server, new Vector(min.getX(), min.getY() - offset, min.getZ()), new Vector(min.getX(), max.getY() + width, min.getZ()), block); - bd06 = drawLine(bd06, server, new Vector(max.getX(), min.getY() - offset, min.getZ()), new Vector(max.getX(), max.getY() + width, min.getZ()), block); - bd07 = drawLine(bd07, server, new Vector(min.getX(), min.getY() - offset, max.getZ()), new Vector(min.getX(), max.getY() + width, max.getZ()), block); - bd08 = drawLine(bd08, server, new Vector(max.getX(), min.getY() - offset, max.getZ()), new Vector(max.getX(), max.getY() + width, max.getZ()), block); - - bd09 = drawLine(bd09, server, new Vector(min.getX(), min.getY(), min.getZ() - offset), new Vector(min.getX(), min.getY(), max.getZ() + width), block); - bd10 = drawLine(bd10, server, new Vector(max.getX(), min.getY(), min.getZ() - offset), new Vector(max.getX(), min.getY(), max.getZ() + width), block); - bd11 = drawLine(bd11, server, new Vector(min.getX(), max.getY(), min.getZ() - offset), new Vector(min.getX(), max.getY(), max.getZ() + width), block); - bd12 = drawLine(bd12, server, new Vector(max.getX(), max.getY(), min.getZ() - offset), new Vector(max.getX(), max.getY(), max.getZ() + width), block); - } - - private RBlockDisplay drawLine(RBlockDisplay display, REntityServer server, Vector from, Vector to, BlockData block) { - Location spawnLocation = from.clone().add(to).divide(new Vector(2, 2, 2)).toLocation(WORLD); - if (display == null) { - display = new RBlockDisplay(server, spawnLocation); - } - - Vector vector = to.clone().subtract(from); - if (vector.getX() == 0) { - vector.setX(vector.getX() + width + offset * 2); - } - if (vector.getY() == 0) { - vector.setY(vector.getY() + width + offset * 2); - } - if (vector.getZ() == 0) { - vector.setZ(vector.getZ() + width + offset * 2); - } - - Vector transformVec = from.subtract(spawnLocation.toVector()); - transformVec.subtract(new Vector(offset, offset, offset)); - - display.setTransform(new Transformation(toVec3f(transformVec), new Quaternionf(0, 0, 0, 1), toVec3f(vector), new Quaternionf(0, 0, 0, 1))); - display.setBrightness(new Display.Brightness(15, 15)); - display.setBlock(block); - display.move(spawnLocation); - - return display; - } - - private Vector toBlockVector(Vector vector) { - return new Vector(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); - } - - private Vector3f toVec3f(Vector vector) { - return new Vector3f((float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); - } -} diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/RegionRenderer.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java similarity index 50% rename from SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/RegionRenderer.java rename to SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java index 53121deb..1ca68b2d 100644 --- a/SpigotCore/SpigotCore_20/src/de/steamwar/core/renderers/RegionRenderer.java +++ b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java @@ -17,31 +17,14 @@ * along with this program. If not, see . */ -package de.steamwar.core.renderers; +package de.steamwar.core; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.session.ClipboardHolder; -import de.steamwar.entity.REntityServer; -import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; -public interface RegionRenderer { +public class WorldEditRendererWrapper8 implements WorldEditRendererWrapper { - boolean canDisplay(Region region); - void update(REntityServer server, R region, ClipboardHolder holder, BlockData block); - void clear(); - - final class NOOPImpl implements RegionRenderer { - @Override - public boolean canDisplay(Region region) { - return false; - } - - @Override - public void update(REntityServer server, Region region, ClipboardHolder holder, BlockData block) { - } - - @Override - public void clear() { - } + @Override + public void draw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2) { } } diff --git a/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRenderer9.java b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRenderer9.java deleted file mode 100644 index 971a759c..00000000 --- a/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRenderer9.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 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.math.transform.Transform; -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; -import org.bukkit.Particle; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; - -public class WorldEditRenderer9 implements 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 static final Vector ONES = new Vector(1, 1, 1); - - private static final Material WAND = FlatteningWrapper.impl.getMaterial("WOOD_AXE"); - - private final WorldEditPlugin we; - - public WorldEditRenderer9() { - we = WorldEditWrapper.getWorldEditPlugin(); - - Bukkit.getScheduler().runTaskTimer(Core.getInstance(), this::render, 20, 20); - } - - private void render() { - for(Player player : Bukkit.getOnlinePlayers()) { - if(player.getInventory().getItemInMainHand().getType() != WAND) - continue; - - LocalSession session = we.getSession(player); - try { - Clipboard clipboard = session.getClipboard().getClipboard(); - Vector pos = player.getLocation().toVector(); - Region region = clipboard.getRegion(); - 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), TrickyParticleWrapper.impl.getVillagerHappy(), player); - } catch (EmptyClipboardException 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); - 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 : org.bukkit.Particle.TOWN_AURA, x, y, z, 1, 0.0, 0.0, 0.0, 0.0); - } - } -} diff --git a/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java new file mode 100644 index 00000000..6a06be45 --- /dev/null +++ b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java @@ -0,0 +1,80 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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 org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +public class WorldEditRendererWrapper9 implements WorldEditRendererWrapper { + + 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 static final Vector ONES = new Vector(1, 1, 1); + private static final Vector STEPS = new Vector(STEP_SIZE, STEP_SIZE, STEP_SIZE); + + @Override + public void draw(Player player, Player owner, boolean clipboard, Vector min, Vector max) { + max = max.clone().add(ONES); + drawLine(player, owner, clipboard, new Vector(min.getX(), min.getY(), min.getZ()), new Vector(max.getX(), min.getY(), min.getZ())); + drawLine(player, owner, clipboard, new Vector(min.getX(), max.getY(), min.getZ()), new Vector(max.getX(), max.getY(), min.getZ())); + drawLine(player, owner, clipboard, new Vector(min.getX(), min.getY(), max.getZ()), new Vector(max.getX(), min.getY(), max.getZ())); + drawLine(player, owner, clipboard, new Vector(min.getX(), max.getY(), max.getZ()), new Vector(max.getX(), max.getY(), max.getZ())); + + drawLine(player, owner, clipboard, new Vector(min.getX(), min.getY(), min.getZ()), new Vector(min.getX(), max.getY(), min.getZ())); + drawLine(player, owner, clipboard, new Vector(max.getX(), min.getY(), min.getZ()), new Vector(max.getX(), max.getY(), min.getZ())); + drawLine(player, owner, clipboard, new Vector(min.getX(), min.getY(), max.getZ()), new Vector(min.getX(), max.getY(), max.getZ())); + drawLine(player, owner, clipboard, new Vector(max.getX(), min.getY(), max.getZ()), new Vector(max.getX(), max.getY(), max.getZ())); + + drawLine(player, owner, clipboard, new Vector(min.getX(), min.getY(), min.getZ()), new Vector(min.getX(), min.getY(), max.getZ())); + drawLine(player, owner, clipboard, new Vector(max.getX(), min.getY(), min.getZ()), new Vector(max.getX(), min.getY(), max.getZ())); + drawLine(player, owner, clipboard, new Vector(min.getX(), max.getY(), min.getZ()), new Vector(min.getX(), max.getY(), max.getZ())); + drawLine(player, owner, clipboard, new Vector(max.getX(), max.getY(), min.getZ()), new Vector(max.getX(), max.getY(), max.getZ())); + } + + public void drawLine(Player player, Player owner, boolean clipboard, Vector min, Vector max) { + Particle particle; + if (player == owner) { + if (clipboard) { + particle = TrickyParticleWrapper.impl.getVillagerHappy(); + } else { + particle = Particle.DRAGON_BREATH; + } + } else { + particle = Particle.TOWN_AURA; + } + + Vector stepSize = max.clone().subtract(min).normalize().multiply(STEPS); + while (min.getX() <= max.getX() && min.getY() <= max.getY() && min.getZ() <= max.getZ()) { + Location location = player.getLocation(); + double dx = min.getX() - location.getX(); + double dy = min.getY() - location.getY(); + double dz = min.getZ() - location.getZ(); + if (dx * dx + dy * dy + dz * dz > SQ_VIEW_DISTANCE) + continue; + + player.spawnParticle(particle, min.getX(), min.getY(), min.getZ(), 1, 0.0, 0.0, 0.0, 0.0); + min.add(stepSize); + } + } +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java index 24b207e8..ca2467b3 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -20,10 +20,15 @@ package de.steamwar.core; import com.comphenix.tinyprotocol.TinyProtocol; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import de.steamwar.Reflection; import de.steamwar.command.*; import de.steamwar.core.authlib.AuthlibInjector; -import de.steamwar.core.events.*; +import de.steamwar.core.events.AntiNocom; +import de.steamwar.core.events.ChattingEvent; +import de.steamwar.core.events.PlayerJoinedEvent; +import de.steamwar.core.events.WorldLoadEvent; import de.steamwar.message.Message; import de.steamwar.network.NetworkReceiver; import de.steamwar.network.handlers.ServerDataHandler; @@ -32,23 +37,42 @@ import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.internal.Statement; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.messaging.PluginMessageListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import java.util.logging.Level; -public class Core extends JavaPlugin{ +public class Core extends JavaPlugin implements PluginMessageListener, Listener { public static final Message MESSAGE = new Message("SpigotCore", Core.class.getClassLoader()); + private static final String CHANNEL = "vv:proxy_details"; + private static final Gson GSON = new Gson(); + private static final Map playerVersions = new HashMap<>(); + public static int getVersion(){ return Reflection.MAJOR_VERSION; } + public static int getPlayerVersion(Player player) { + return playerVersions.getOrDefault(player, -1); + } + + public static boolean isBedrockPlayer(Player player) { + return player.getName().startsWith("."); + } + private static JavaPlugin instance; public static JavaPlugin getInstance() { return instance; @@ -67,6 +91,9 @@ public class Core extends JavaPlugin{ @Override public void onEnable() { + this.getServer().getMessenger().registerIncomingPluginChannel(this, CHANNEL, this); + Bukkit.getPluginManager().registerEvents(this, this); + errorHandler = new ErrorHandler(); crashDetector = new CrashDetector(); @@ -103,7 +130,7 @@ public class Core extends JavaPlugin{ new ServerDataHandler(); if(Bukkit.getPluginManager().getPlugin("WorldEdit") != null) - WorldEditRenderer.impl.init(); + new WorldEditRenderer(); Bukkit.getScheduler().runTaskTimer(this, TabCompletionCache::invalidateOldEntries, 20, 20); Bukkit.getScheduler().runTaskTimer(Core.getInstance(), SteamwarUser::clear, 72000, 72000); @@ -122,5 +149,22 @@ public class Core extends JavaPlugin{ errorHandler.unregister(); if(crashDetector.onMainThread()) Statement.closeAll(); + this.getServer().getMessenger().unregisterIncomingPluginChannel(this); + } + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { + if (!channel.equals(CHANNEL)) { + return; + } + + final JsonObject payload = GSON.fromJson(new String(bytes), JsonObject.class); + final String version = payload.get("versionName").getAsString(); + playerVersions.put(player, Integer.parseInt(version.split("-")[0].split("\\.")[1])); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerQuit(PlayerQuitEvent event) { + playerVersions.remove(event.getPlayer()); } } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/VersionDependent.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/VersionDependent.java index 5e8ec241..2fe94ce5 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/VersionDependent.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/VersionDependent.java @@ -31,8 +31,16 @@ public class VersionDependent { } public static T getVersionImpl(Plugin plugin, String className){ + return getVersionImpl(plugin, Core.getVersion(), className); + } + + public static T getVersionImpl(Plugin plugin, int fromVersion){ + return getVersionImpl(plugin, fromVersion, (new Exception()).getStackTrace()[1].getClassName()); + } + + public static T getVersionImpl(Plugin plugin, int fromVersion, String className){ ClassLoader loader = plugin.getClass().getClassLoader(); - for(int version = Core.getVersion(); version >= 8; version--) { + for(int version = fromVersion; version >= 8; version--) { try { return ((Class) Class.forName(className + version, true, loader)).getDeclaredConstructor().newInstance(); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java index 6b90f1d2..7bf68c99 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java @@ -1,27 +1,166 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2020 SteamWar.de-Serverteam + * 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 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. + * 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 . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package de.steamwar.core; -public interface WorldEditRenderer { - WorldEditRenderer impl = VersionDependent.getVersionImpl(Core.getInstance()); +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.math.transform.Transform; +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.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.player.*; +import org.bukkit.util.Vector; - default void init() { +public class WorldEditRenderer implements Listener { + + private static final Material WAND = FlatteningWrapper.impl.getMaterial("WOOD_AXE"); + + private final WorldEditPlugin we; + + public WorldEditRenderer() { + we = WorldEditWrapper.getWorldEditPlugin(); + Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); + + Bukkit.getScheduler().runTaskTimer(Core.getInstance(), this::render, 20, 20); + } + + private void render() { + for(Player player : Bukkit.getOnlinePlayers()) { + renderPlayer(player); + } + } + + private void renderPlayer(Player player) { + LocalSession session = we.getSession(player); + renderClipboard(player, session); + renderRegion(player, session); + } + + private void renderClipboard(Player player, LocalSession session) { + try { + Clipboard clipboard = session.getClipboard().getClipboard(); + Vector pos = player.getLocation().toVector(); + Region region = clipboard.getRegion(); + 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); + a = new Vector(a.getBlockX(), a.getBlockY(), a.getBlockZ()); + b = new Vector(b.getBlockX(), b.getBlockY(), b.getBlockZ()); + WorldEditRendererWrapper.impl.hide(player, player, true, false); + drawCuboid(Vector.getMinimum(a, b), Vector.getMaximum(a, b), true, player); + } catch (EmptyClipboardException e) { + WorldEditRendererWrapper.impl.hide(player, player, true, true); + } + } + + private void renderRegion(Player player, LocalSession session) { + World world = session.getSelectionWorld(); + if(world != null) { + RegionSelector regionSelector = session.getRegionSelector(world); + try { + Region region = regionSelector.getRegion(); + WorldEditRendererWrapper.impl.hide(player, player, false, false); + drawCuboid(WorldEditWrapper.impl.getMinimum(region), WorldEditWrapper.impl.getMaximum(region), false, player); + } catch (IncompleteRegionException e) { + WorldEditRendererWrapper.impl.hide(player, player, false, true); + } + } + } + + private void drawCuboid(Vector min, Vector max, boolean clipboard, Player owner) { + for (Player player : Bukkit.getOnlinePlayers()) { + //noinspection deprecation + if(player.getItemInHand().getType() != WAND) { + WorldEditRendererWrapper.impl.hide(player, owner, true, true); + WorldEditRendererWrapper.impl.hide(player, owner, false, true); + } else { + WorldEditRendererWrapper.impl.hide(player, owner, true, false); + WorldEditRendererWrapper.impl.hide(player, owner, false, false); + WorldEditRendererWrapper.safeDraw(player, owner, clipboard, min, max); + } + } + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + renderPlayer(event.getPlayer()); + } + + @EventHandler + public void onPlayerMove(PlayerMoveEvent event) { + WorldEditRendererWrapper.impl.tick(event.getPlayer()); + + renderClipboard(event.getPlayer(), we.getSession(event.getPlayer())); + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + renderRegion(event.getPlayer(), we.getSession(event.getPlayer())); + } + + @EventHandler + public void onBlockBreak(BlockBreakEvent event) { + renderRegion(event.getPlayer(), we.getSession(event.getPlayer())); + } + + @EventHandler + public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) { + if (event.getMessage().startsWith("//")) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + LocalSession session = we.getSession(event.getPlayer()); + renderRegion(event.getPlayer(), session); + renderClipboard(event.getPlayer(), session); + }, 5); + } + } + + @EventHandler + public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + renderPlayer(event.getPlayer()); + }, 1); + } + + @EventHandler + public void onPlayerDropItem(PlayerDropItemEvent event) { + renderPlayer(event.getPlayer()); + } + + @EventHandler + public void onPlayerItemHeld(PlayerItemHeldEvent event) { + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + renderPlayer(event.getPlayer()); + }, 1); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + WorldEditRendererWrapper.impl.remove(event.getPlayer()); } } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java new file mode 100644 index 00000000..63380fdc --- /dev/null +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java @@ -0,0 +1,47 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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 org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +public interface WorldEditRendererWrapper { + WorldEditRendererWrapper fallback = VersionDependent.getVersionImpl(Core.getInstance(), 9); + WorldEditRendererWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); + + static void safeDraw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2) { + if (Core.isBedrockPlayer(player) || Core.getPlayerVersion(player) < 20) { + fallback.draw(player, owner, clipboard, pos1, pos2); + } else { + impl.draw(player, owner, clipboard, pos1, pos2); + } + } + + void draw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2); + + default void tick(Player player) { + } + + default void hide(Player player, Player owner, boolean clipboard, boolean hide) { + } + + default void remove(Player player) { + } +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAABox.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAABox.java new file mode 100644 index 00000000..80d94c88 --- /dev/null +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAABox.java @@ -0,0 +1,103 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.entity; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.data.BlockData; +import org.bukkit.util.Vector; + +import java.util.List; + +/** + * Compound Axis Aligned Box (12 CAALine) + */ +public class CAABox extends CEntity { + + public static final float DEFAULT_WIDTH = 1 / 16f; + private float width = DEFAULT_WIDTH; + + private Location pos1; + private Location pos2; + + public CAABox(REntityServer server) { + super(server); + } + + public CAABox setPos1(Location pos1) { + this.pos1 = pos1; + updateAndSpawnLines(); + return this; + } + + public CAABox setPos2(Location pos2) { + this.pos2 = pos2; + updateAndSpawnLines(); + return this; + } + + public CAABox setWidth(float width) { + this.width = width; + updateAndSpawnLines(); + getEntitiesByType(CAALine.class).forEach(haaLine -> { + haaLine.setWidth(width); + }); + return this; + } + + public CAABox setBlock(BlockData blockData) { + getEntitiesByType(CAALine.class).forEach(haaLine -> { + haaLine.setBlock(blockData); + }); + return this; + } + + private void updateAndSpawnLines() { + if (pos1 == null || pos2 == null) return; + if (entities.isEmpty()) { + for (int i = 0; i < 12; i++) { + entities.add(new CAALine(server)); + } + } + + World world = pos1.getWorld(); + Vector min = Vector.getMinimum(pos1.toVector(), pos2.toVector()); + Vector max = Vector.getMaximum(pos1.toVector(), pos2.toVector()) + .add(new Vector(1 - width, 1 - width, 1 - width)); + + List lines = getEntitiesByType(CAALine.class); + lines.forEach(line -> line.setFrom(null).setTo(null)); + + lines.get(0).setFrom(new Vector(min.getX(), min.getY(), min.getZ()).toLocation(world)).setTo(new Vector(max.getX() + width, min.getY(), min.getZ()).toLocation(world)); + lines.get(1).setFrom(new Vector(min.getX(), max.getY(), min.getZ()).toLocation(world)).setTo(new Vector(max.getX() + width, max.getY(), min.getZ()).toLocation(world)); + lines.get(2).setFrom(new Vector(min.getX(), min.getY(), max.getZ()).toLocation(world)).setTo(new Vector(max.getX() + width, min.getY(), max.getZ()).toLocation(world)); + lines.get(3).setFrom(new Vector(min.getX(), max.getY(), max.getZ()).toLocation(world)).setTo(new Vector(max.getX() + width, max.getY(), max.getZ()).toLocation(world)); + + lines.get(4).setFrom(new Vector(min.getX(), min.getY(), min.getZ()).toLocation(world)).setTo(new Vector(min.getX(), max.getY() + width, min.getZ()).toLocation(world)); + lines.get(5).setFrom(new Vector(max.getX(), min.getY(), min.getZ()).toLocation(world)).setTo(new Vector(max.getX(), max.getY() + width, min.getZ()).toLocation(world)); + lines.get(6).setFrom(new Vector(min.getX(), min.getY(), max.getZ()).toLocation(world)).setTo(new Vector(min.getX(), max.getY() + width, max.getZ()).toLocation(world)); + lines.get(7).setFrom(new Vector(max.getX(), min.getY(), max.getZ()).toLocation(world)).setTo(new Vector(max.getX(), max.getY() + width, max.getZ()).toLocation(world)); + + lines.get(8).setFrom(new Vector(min.getX(), min.getY(), min.getZ()).toLocation(world)).setTo(new Vector(min.getX(), min.getY(), max.getZ() + width).toLocation(world)); + lines.get(9).setFrom(new Vector(max.getX(), min.getY(), min.getZ()).toLocation(world)).setTo(new Vector(max.getX(), min.getY(), max.getZ() + width).toLocation(world)); + lines.get(10).setFrom(new Vector(min.getX(), max.getY(), min.getZ()).toLocation(world)).setTo(new Vector(min.getX(), max.getY(), max.getZ() + width).toLocation(world)); + lines.get(11).setFrom(new Vector(max.getX(), max.getY(), min.getZ()).toLocation(world)).setTo(new Vector(max.getX(), max.getY(), max.getZ() + width).toLocation(world)); + } +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAALine.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAALine.java new file mode 100644 index 00000000..19a6ef9f --- /dev/null +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAALine.java @@ -0,0 +1,246 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.entity; + +import org.bukkit.Location; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Display; +import org.bukkit.entity.Player; +import org.bukkit.util.Transformation; +import org.bukkit.util.Vector; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +import java.util.Objects; + +public class CAALine extends CEntity { + + public static final float DEFAULT_WIDTH = 1 / 16f; + private static final float offset = 1 / 1024f; + private static final Vector offsetVec = new Vector(offset, offset, offset); + + private Location from; + private Location to; + private float width = DEFAULT_WIDTH; + private BlockData blockData = RBlockDisplay.DEFAULT_BLOCK; + + public CAALine(REntityServer server) { + super(server); + tick(); + } + + public CAALine setFrom(Location from) { + if (Objects.equals(from, this.from)) return this; + this.from = from; + tick(); + return this; + } + + public CAALine setTo(Location to) { + if (Objects.equals(to, this.to)) return this; + this.to = to; + tick(); + return this; + } + + public CAALine setWidth(float width) { + if (this.width == width) return this; + this.width = width; + tick(); + return this; + } + + public CAALine setBlock(BlockData blockData) { + if (this.blockData.equals(blockData)) return this; + if (blockData == null) { + this.blockData = RBlockDisplay.DEFAULT_BLOCK; + } else { + this.blockData = blockData; + } + getEntitiesByType(RBlockDisplay.class).forEach(display -> { + display.setBlock(blockData); + }); + return this; + } + + private boolean hide = false; + + @Override + public void hide(boolean hide) { + if (hide == this.hide) return; + this.hide = hide; + if (hide) { + if (startLine != null) startLine.hide(true); + if (middleLine != null) middleLine.hide(true); + if (endLine != null) endLine.hide(true); + } else { + tick(); + } + } + + @Override + void tick() { + if (from == null || to == null) return; + if (hide) return; + updateStart(); + updateMiddle(); + updateEnd(); + } + + private RBlockDisplay startLine; + private void updateStart() { + Vector vec = to.clone().subtract(from).toVector(); + if (vec.length() > 35) vec.normalize().multiply(35); + + if (startLine == null) { + startLine = new RBlockDisplay(server, new Location(null, 0, 0, 0)); + startLine.setBrightness(new Display.Brightness(15, 15)); + startLine.setViewRange(560); + startLine.setBlock(blockData); + entities.add(startLine); + } else { + startLine.hide(false); + } + + startLine.move(from.clone().subtract(offsetVec)); + startLine.setTransform(new Transformation(new Vector3f(0, 0, 0), new Quaternionf(0, 0, 0, 1), addWidth(vec).toVector3f(), new Quaternionf(0, 0, 0, 1))); + } + + private RBlockDisplay middleLine; + private void updateMiddle() { + Vector vec = to.clone().subtract(from).toVector(); + if (vec.length() <= 70) { + if (middleLine != null) middleLine.hide(true); + return; + } + if (vec.length() > 280) vec.normalize().multiply(280); + else vec = vec.clone().normalize().multiply(vec.length() - 60); + + if (middleLine == null) { + middleLine = new RBlockDisplay(server, new Location(null, 0, 0, 0)); + middleLine.setBrightness(new Display.Brightness(15, 15)); + middleLine.setViewRange(560); + middleLine.setBlock(blockData); + entities.add(middleLine); + } else { + middleLine.hide(false); + } + + Player player = server.getPlayers().stream().findFirst().orElse(null); + if (player == null) return; + + Vector tempVector = vec.clone().normalize().multiply(30); + Location from = this.from.clone().add(tempVector); + Location to = this.to.clone().subtract(tempVector); + + Vector lineVec = to.clone().subtract(from).toVector(); + Vector playerVec = player.getLocation().toVector().subtract(from.toVector()); + double lineVecDotItself = lineVec.dot(lineVec); + Vector projectionVec = lineVec.clone().multiply(lineVec.dot(playerVec)).divide(new Vector(lineVecDotItself, lineVecDotItself, lineVecDotItself)); + + Vector moveVec = from.toVector().add(projectionVec); + if (moveVec.getX() < from.getX()) { + moveVec.setX(from.getX()); + } + if (moveVec.getX() > to.getX()) { + moveVec.setX(to.getX()); + } + if (moveVec.getY() < from.getY()) { + moveVec.setY(from.getY()); + } + if (moveVec.getY() > to.getY()) { + moveVec.setY(to.getY()); + } + if (moveVec.getZ() < from.getZ()) { + moveVec.setZ(from.getZ()); + } + if (moveVec.getZ() > to.getZ()) { + moveVec.setZ(to.getZ()); + } + + Vector translation = vec.clone().divide(new Vector(2, 2, 2)); + translation.setX(-translation.getX()); + translation.setY(-translation.getY()); + translation.setZ(-translation.getZ()); + + Vector first = moveVec.clone().add(translation).subtract(from.toVector()); + if (first.getX() < 0) { + translation.setX(translation.getX() - first.getX()); + } + if (first.getY() < 0) { + translation.setY(translation.getY() - first.getY()); + } + if (first.getZ() < 0) { + translation.setZ(translation.getZ() - first.getZ()); + } + + Vector second = to.toVector().subtract(moveVec.clone().subtract(translation)); + if (second.getX() < 0) { + translation.setX(translation.getX() + second.getX()); + } + if (second.getY() < 0) { + translation.setY(translation.getY() + second.getY()); + } + if (second.getZ() < 0) { + translation.setZ(translation.getZ() + second.getZ()); + } + + middleLine.move(moveVec.toLocation(player.getWorld()).subtract(offsetVec)); + middleLine.setTransform(new Transformation(translation.toVector3f(), new Quaternionf(0, 0, 0, 1), addWidth(vec).toVector3f(), new Quaternionf(0, 0, 0, 1))); + } + + private RBlockDisplay endLine; + private void updateEnd() { + Vector vec = to.clone().subtract(from).toVector(); + if (vec.length() <= 35) { + if (endLine != null) endLine.hide(true); + return; + } + if (vec.length() > 35) vec.normalize().multiply(35); + + if (endLine == null) { + endLine = new RBlockDisplay(server, new Location(null, 0, 0, 0)); + endLine.setBrightness(new Display.Brightness(15, 15)); + endLine.setViewRange(560); + endLine.setBlock(blockData); + entities.add(endLine); + } else { + endLine.hide(false); + } + + endLine.move(to.clone().subtract(offsetVec)); + endLine.setTransform(new Transformation(vec.toVector3f().negate(), new Quaternionf(0, 0, 0, 1), addWidth(vec).toVector3f(), new Quaternionf(0, 0, 0, 1))); + } + + private Vector addWidth(Vector vector) { + vector = vector.clone(); + if (vector.getX() == 0) { + vector.setX(vector.getX() + width); + } + if (vector.getY() == 0) { + vector.setY(vector.getY() + width); + } + if (vector.getZ() == 0) { + vector.setZ(vector.getZ() + width); + } + vector.add(offsetVec).add(offsetVec); + return vector; + } +} From dd5f46069f45c023ea198e8fe3cd08f017a49c12 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Tue, 15 Apr 2025 15:05:06 +0200 Subject: [PATCH 04/17] Delete WorldEditRenderer8 --- .../de/steamwar/core/WorldEditRenderer8.java | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRenderer8.java diff --git a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRenderer8.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRenderer8.java deleted file mode 100644 index df3a6633..00000000 --- a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRenderer8.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 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; - -public class WorldEditRenderer8 implements WorldEditRenderer { -} From dfc7bbbe1332da6e053614a28093a4c1d48df0a4 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 16 Apr 2025 10:03:30 +0200 Subject: [PATCH 05/17] Fix WorldEditRendererWrapper9 --- .../src/de/steamwar/core/WorldEditRendererWrapper9.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java index 6a06be45..159a89ec 100644 --- a/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java +++ b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java @@ -70,8 +70,10 @@ public class WorldEditRendererWrapper9 implements WorldEditRendererWrapper { double dx = min.getX() - location.getX(); double dy = min.getY() - location.getY(); double dz = min.getZ() - location.getZ(); - if (dx * dx + dy * dy + dz * dz > SQ_VIEW_DISTANCE) + if (dx * dx + dy * dy + dz * dz > SQ_VIEW_DISTANCE) { + min.add(stepSize); continue; + } player.spawnParticle(particle, min.getX(), min.getY(), min.getZ(), 1, 0.0, 0.0, 0.0, 0.0); min.add(stepSize); From 80a156754d6d947676e5377e7fa3dc4ff59aab41 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 16 Apr 2025 12:54:07 +0200 Subject: [PATCH 06/17] Finalize WorldEditCUI --- .../src/de/steamwar/bausystem/BauSystem.java | 3 + .../de/steamwar/fightsystem/ArenaMode.java | 1 + .../de/steamwar/fightsystem/FightSystem.java | 4 +- .../core/WorldEditRendererWrapper20.java | 20 +-- .../SpigotCore_Main/src/SpigotCore.properties | 19 +++ .../src/SpigotCore_de.properties | 13 +- .../steamwar/WorldEditRendererCUIEditor.java | 157 ++++++++++++++++++ .../de/steamwar/core/WorldEditRenderer.java | 7 +- 8 files changed, 204 insertions(+), 20 deletions(-) create mode 100644 SpigotCore/SpigotCore_Main/src/de/steamwar/WorldEditRendererCUIEditor.java diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index 0d5fa43c..8256a83d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -19,6 +19,7 @@ package de.steamwar.bausystem; +import de.steamwar.WorldEditRendererCUIEditor; import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.configplayer.ConfigConverter; @@ -206,6 +207,8 @@ public class BauSystem extends JavaPlugin { TraceManager.instance.init(); TraceRecorder.instance.init(); + + new WorldEditRendererCUIEditor(); } @Override diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java index e96e0204..eb0a637a 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java @@ -53,4 +53,5 @@ public enum ArenaMode { public static final Set SoloLeader = Collections.unmodifiableSet(EnumSet.of(TEST, CHECK, PREPARE)); public static final Set NotOnBau = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(TEST, CHECK, PREPARE, REPLAY))); public static final Set SeriousFight = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(TEST, CHECK, REPLAY))); + public static final Set CheckOrTest = Collections.unmodifiableSet(EnumSet.of(TEST, CHECK)); } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index ce47ee34..9a99789c 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -20,6 +20,7 @@ package de.steamwar.fightsystem; import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.WorldEditRendererCUIEditor; import de.steamwar.core.Core; import de.steamwar.fightsystem.commands.*; import de.steamwar.fightsystem.countdown.*; @@ -28,8 +29,8 @@ import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.fight.FightWorld; import de.steamwar.fightsystem.fight.HotbarKit; -import de.steamwar.fightsystem.listener.Shutdown; import de.steamwar.fightsystem.listener.*; +import de.steamwar.fightsystem.listener.Shutdown; import de.steamwar.fightsystem.record.FileRecorder; import de.steamwar.fightsystem.record.FileSource; import de.steamwar.fightsystem.record.GlobalRecorder; @@ -106,6 +107,7 @@ public class FightSystem extends JavaPlugin { new HotbarKit.HotbarKitListener(); new JoinRequestListener(); new OneShotStateDependent(ArenaMode.All, FightState.PreSchemSetup, () -> Fight.playSound(SWSound.BLOCK_NOTE_PLING.getSound(), 100.0f, 2.0f)); + new OneShotStateDependent(ArenaMode.CheckOrTest, FightState.All, WorldEditRendererCUIEditor::new); new EnterHandler(); techHider = new TechHiderWrapper(); diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java index 5bffe84f..9e2dd784 100644 --- a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java +++ b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java @@ -19,10 +19,9 @@ package de.steamwar.core; +import de.steamwar.WorldEditRendererCUIEditor; import de.steamwar.entity.CAABox; -import de.steamwar.entity.CAALine; import de.steamwar.entity.REntityServer; -import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.util.Vector; @@ -74,21 +73,14 @@ public class WorldEditRendererWrapper20 implements WorldEditRendererWrapper { return entityServer; }); - float width = CAALine.DEFAULT_WIDTH; - if (player != owner) { - width = 1 / 64f; - } - - BlockData block; + WorldEditRendererCUIEditor.Type type; if (player == owner) { - if (clipboard) { - block = Material.LIME_CONCRETE.createBlockData(); - } else { - block = Material.PURPLE_CONCRETE.createBlockData(); - } + type = clipboard ? WorldEditRendererCUIEditor.Type.CLIPBOARD : WorldEditRendererCUIEditor.Type.SELECTION; } else { - block = Material.GRAY_CONCRETE.createBlockData(); + type = clipboard ? WorldEditRendererCUIEditor.Type.CLIPBOARD_OTHER : WorldEditRendererCUIEditor.Type.SELECTION_OTHER; } + float width = type.getWidth(player).value; + BlockData block = type.getMaterial(player).createBlockData(); BoxPair boxPair = boxes.computeIfAbsent(player, __ -> new HashMap<>()).computeIfAbsent(owner, __ -> new BoxPair()); CAABox box = boxPair.get(clipboard); diff --git a/SpigotCore/SpigotCore_Main/src/SpigotCore.properties b/SpigotCore/SpigotCore_Main/src/SpigotCore.properties index 10c64603..b4cae687 100644 --- a/SpigotCore/SpigotCore_Main/src/SpigotCore.properties +++ b/SpigotCore/SpigotCore_Main/src/SpigotCore.properties @@ -105,3 +105,22 @@ NOSCHEMSUBMITTING_PERMA=§7You are §epermanently§7 excluded from submitting § NOSCHEMSUBMITTING_UNTIL=§7You are excluded from submitting §e§lschematics §euntil {0}§8: §e{1} UNNOSCHEMSUBMITTING_ERROR=§cThe player is not excluded from submitting schematics. UNNOSCHEMSUBMITTING=§e{0} §7may now submit §e§lschematics§7 again§8. + +WORLDEDIT_CUI_TITLE = WorldEdit CUI +WORLDEDIT_CUI_TITLE_SUBMENU = WorldEdit CUI - {0} +WORLDEDIT_CUI_SELECTION = Selection +WORLDEDIT_CUI_CLIPBOARD = Clipboard +WORLDEDIT_CUI_SELECTION_OTHER = Selection Other +WORLDEDIT_CUI_CLIPBOARD_OTHER = Clipboard Other + +WORLDEDIT_CUI_MATERIAL_NAME = §eWorldEdit {0} +WORLDEDIT_CUI_MATERIAL_CLICK = §7Click to edit + +WORLDEDIT_CUI_WIDTH_NAME = §eWidth {0} +WORLDEDIT_CUI_WIDTH_LORE = §8> §7{0} +WORLDEDIT_CUI_WIDTH_LORE_SELECTED = §8> §e{0} +WORLDEDIT_CUI_WIDTH_CLICK = §7Click to change +WORLDEDIT_CUI_WIDTH_HUGE = 2/16 Block +WORLDEDIT_CUI_WIDTH_LARGE = 1/16 Block +WORLDEDIT_CUI_WIDTH_MEDIUM = 1/32 Block +WORLDEDIT_CUI_WIDTH_SLIM = 1/64 Block \ No newline at end of file diff --git a/SpigotCore/SpigotCore_Main/src/SpigotCore_de.properties b/SpigotCore/SpigotCore_Main/src/SpigotCore_de.properties index 83fa39f5..cc5158ea 100644 --- a/SpigotCore/SpigotCore_Main/src/SpigotCore_de.properties +++ b/SpigotCore/SpigotCore_Main/src/SpigotCore_de.properties @@ -99,4 +99,15 @@ NOSCHEMSUBMITTING_TEAM={0} §e{1} §7wurde von §e{2} {3} §7vom §e§lSchematic NOSCHEMSUBMITTING_PERMA=§7Du bist §epermanent §7vom §e§lEinsenden von Schematics§7 ausgeschlossen§8: §e{0} NOSCHEMSUBMITTING_UNTIL=§7Du bist §ebis zum {0} §7vom §e§lEinsenden von Schematics§7 ausgeschlossen§8: §e{1} UNNOSCHEMSUBMITTING_ERROR=§cDer Spieler ist nicht vom Einsenden von Schematics ausgeschlossen. -UNNOSCHEMSUBMITTING=§e{0} §7darf nun wieder §e§lSchematis§7 einsenden§8. \ No newline at end of file +UNNOSCHEMSUBMITTING=§e{0} §7darf nun wieder §e§lSchematis§7 einsenden§8. + +WORLDEDIT_CUI_SELECTION = Auswahl +WORLDEDIT_CUI_CLIPBOARD = Kopie +WORLDEDIT_CUI_SELECTION_OTHER = Auswahl Anderer +WORLDEDIT_CUI_CLIPBOARD_OTHER = Kopie Anderer + +WORLDEDIT_CUI_MATERIAL_NAME = §eWorldEdit {0} +WORLDEDIT_CUI_MATERIAL_CLICK = §7Klicke zum Editieren + +WORLDEDIT_CUI_WIDTH_NAME = §eDicke - {0} +WORLDEDIT_CUI_WIDTH_CLICK = §7Klicke zum ändern \ No newline at end of file diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/WorldEditRendererCUIEditor.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/WorldEditRendererCUIEditor.java new file mode 100644 index 00000000..6bd0f60a --- /dev/null +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/WorldEditRendererCUIEditor.java @@ -0,0 +1,157 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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; + +import de.steamwar.command.SWCommand; +import de.steamwar.core.Core; +import de.steamwar.inventory.SWInventory; +import de.steamwar.inventory.SWItem; +import de.steamwar.sql.UserConfig; +import lombok.AllArgsConstructor; +import org.bukkit.Material; +import org.bukkit.block.data.type.Light; +import org.bukkit.entity.Player; +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; + +public class WorldEditRendererCUIEditor { + + @AllArgsConstructor + public enum Type { + SELECTION("cui_selection_material", "cui_selection_width", Material.PURPLE_CONCRETE, Width.LARGE), + CLIPBOARD("cui_clipboard_material", "cui_clipboard_width", Material.LIME_CONCRETE, Width.LARGE), + SELECTION_OTHER("cui_selection_other_material", "cui_selection_other_width", Material.GRAY_CONCRETE, Width.SLIM), + CLIPBOARD_OTHER("cui_clipboard_other_material", "cui_clipboard_other_width", Material.GRAY_CONCRETE, Width.SLIM); + + 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); + } + } + + public void setMaterial(Player player, Material 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); + } + } + + public void setWidth(Player player, Width width) { + UserConfig.updatePlayerConfig(player.getUniqueId(), configWidth, width.name()); + } + } + + @AllArgsConstructor + public enum Width { + HUGE(15, "WORLDEDIT_CUI_WIDTH_HUGE", 2/16f), + LARGE(8, "WORLDEDIT_CUI_WIDTH_LARGE", 1/16f), + MEDIUM(4, "WORLDEDIT_CUI_WIDTH_MEDIUM", 1/32f), + SLIM(0, "WORLDEDIT_CUI_WIDTH_SLIM", 1/64f); + + public final int lightLevel; + public final String name; + public final float value; + } + + public WorldEditRendererCUIEditor() { + new Command(); + } + + private static class Command extends SWCommand { + + public Command() { + super("cui"); + } + + @Register + public void cuiEditor(Player player) { + SWInventory inv = new SWInventory(player, 9 * 2, Core.MESSAGE.parse("WORLDEDIT_CUI_TITLE", player)); + setElement(inv, player, 1, "WORLDEDIT_CUI_SELECTION", Type.SELECTION); + setElement(inv, player, 3, "WORLDEDIT_CUI_CLIPBOARD", Type.CLIPBOARD); + setElement(inv, player, 5, "WORLDEDIT_CUI_SELECTION_OTHER", Type.SELECTION_OTHER); + setElement(inv, player, 7, "WORLDEDIT_CUI_CLIPBOARD_OTHER", Type.CLIPBOARD_OTHER); + inv.open(); + } + + private void setElement(SWInventory inv, Player player, int index, String uiName, Type type) { + Material material = type.getMaterial(player); + Width width = type.getWidth(player); + + inv.setItem(index, new SWItem(material, Core.MESSAGE.parse("WORLDEDIT_CUI_MATERIAL_NAME", player, Core.MESSAGE.parse(uiName, player)), Arrays.asList(Core.MESSAGE.parse("WORLDEDIT_CUI_MATERIAL_CLICK", player)), false, click -> { + cuiMaterial(player, uiName, type, material); + })); + + List lore = new ArrayList<>(); + lore.add(Core.MESSAGE.parse("WORLDEDIT_CUI_WIDTH_CLICK", player)); + lore.add(""); + for (Width value : Width.values()) { + if (value == width) { + lore.add(Core.MESSAGE.parse("WORLDEDIT_CUI_WIDTH_LORE_SELECTED", player, Core.MESSAGE.parse(value.name, player))); + } else { + lore.add(Core.MESSAGE.parse("WORLDEDIT_CUI_WIDTH_LORE", player, Core.MESSAGE.parse(value.name, player))); + } + } + SWItem lightItem = new SWItem(Material.LIGHT, Core.MESSAGE.parse("WORLDEDIT_CUI_WIDTH_NAME", player, Core.MESSAGE.parse(uiName, player)), lore, false, click -> { + type.setWidth(player, Width.values()[(width.ordinal() + 1) % Width.values().length]); + setElement(inv, player, index, uiName, type); + }); + ItemMeta itemMeta = lightItem.getItemMeta(); + Light light = (Light) Material.LIGHT.createBlockData(); + light.setLevel(width.lightLevel); + ((BlockDataMeta) itemMeta).setBlockData(light); + lightItem.setItemMeta(itemMeta); + inv.setItem(index + 9, lightItem); + } + + private final Material[] materials = {Material.WHITE_CONCRETE, Material.LIGHT_GRAY_CONCRETE, Material.GRAY_CONCRETE, Material.BLACK_CONCRETE, Material.BROWN_CONCRETE, Material.RED_CONCRETE, Material.ORANGE_CONCRETE, Material.YELLOW_CONCRETE, Material.LIME_CONCRETE, Material.GREEN_CONCRETE, Material.CYAN_CONCRETE, Material.LIGHT_BLUE_CONCRETE, Material.BLUE_CONCRETE, Material.PURPLE_CONCRETE, Material.MAGENTA_CONCRETE, Material.PINK_CONCRETE, null, Material.BARRIER}; + + private void cuiMaterial(Player player, String subMenu, Type type, Material currentSelection) { + SWInventory inv = new SWInventory(player, 9 * 2, Core.MESSAGE.parse("WORLDEDIT_CUI_TITLE_SUBMENU", player, Core.MESSAGE.parse(subMenu, player))); + for (int i = 0; i < materials.length; i++) { + Material material = materials[i]; + if (material == null) continue; + inv.setItem(i, new SWItem(material, "", Collections.emptyList(), material == currentSelection, click -> { + type.setMaterial(player, material); + cuiEditor(player); + })); + } + inv.open(); + } + } +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java index 7bf68c99..faed64e3 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java @@ -72,7 +72,6 @@ public class WorldEditRenderer implements Listener { Vector b = WorldEditWrapper.impl.applyTransform(WorldEditWrapper.impl.getMaximum(region).subtract(WorldEditWrapper.impl.getOrigin(clipboard)), transform).add(pos); a = new Vector(a.getBlockX(), a.getBlockY(), a.getBlockZ()); b = new Vector(b.getBlockX(), b.getBlockY(), b.getBlockZ()); - WorldEditRendererWrapper.impl.hide(player, player, true, false); drawCuboid(Vector.getMinimum(a, b), Vector.getMaximum(a, b), true, player); } catch (EmptyClipboardException e) { WorldEditRendererWrapper.impl.hide(player, player, true, true); @@ -85,7 +84,6 @@ public class WorldEditRenderer implements Listener { RegionSelector regionSelector = session.getRegionSelector(world); try { Region region = regionSelector.getRegion(); - WorldEditRendererWrapper.impl.hide(player, player, false, false); drawCuboid(WorldEditWrapper.impl.getMinimum(region), WorldEditWrapper.impl.getMaximum(region), false, player); } catch (IncompleteRegionException e) { WorldEditRendererWrapper.impl.hide(player, player, false, true); @@ -114,8 +112,9 @@ public class WorldEditRenderer implements Listener { @EventHandler public void onPlayerMove(PlayerMoveEvent event) { - WorldEditRendererWrapper.impl.tick(event.getPlayer()); - + if(event.getPlayer().getItemInHand().getType() == WAND) { + WorldEditRendererWrapper.impl.tick(event.getPlayer()); + } renderClipboard(event.getPlayer(), we.getSession(event.getPlayer())); } From 40437afb7321451e375ecbf138a624dae6cb9c9f Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 16 Apr 2025 13:57:01 +0200 Subject: [PATCH 07/17] Final fixes --- .../src/de/steamwar/bausystem/BauSystem.java | 2 +- .../src/de/steamwar/fightsystem/FightSystem.java | 2 +- .../de/steamwar/core/WorldEditRendererWrapper20.java | 8 ++++++-- SpigotCore/SpigotCore_Main/src/SpigotCore.properties | 10 +++++----- .../SpigotCore_Main/src/SpigotCore_de.properties | 4 ++-- .../src/de/steamwar/core/WorldEditRenderer.java | 8 ++++++-- .../{ => core}/WorldEditRendererCUIEditor.java | 7 ++++--- 7 files changed, 25 insertions(+), 16 deletions(-) rename SpigotCore/SpigotCore_Main/src/de/steamwar/{ => core}/WorldEditRendererCUIEditor.java (98%) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index 8256a83d..8376f0f1 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -19,7 +19,7 @@ package de.steamwar.bausystem; -import de.steamwar.WorldEditRendererCUIEditor; +import de.steamwar.core.WorldEditRendererCUIEditor; import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.configplayer.ConfigConverter; diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index 9a99789c..949d7691 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -20,7 +20,7 @@ package de.steamwar.fightsystem; import com.comphenix.tinyprotocol.TinyProtocol; -import de.steamwar.WorldEditRendererCUIEditor; +import de.steamwar.core.WorldEditRendererCUIEditor; import de.steamwar.core.Core; import de.steamwar.fightsystem.commands.*; import de.steamwar.fightsystem.countdown.*; diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java index 9e2dd784..fd6e20eb 100644 --- a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java +++ b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java @@ -19,9 +19,9 @@ package de.steamwar.core; -import de.steamwar.WorldEditRendererCUIEditor; import de.steamwar.entity.CAABox; import de.steamwar.entity.REntityServer; +import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.util.Vector; @@ -80,7 +80,11 @@ public class WorldEditRendererWrapper20 implements WorldEditRendererWrapper { type = clipboard ? WorldEditRendererCUIEditor.Type.CLIPBOARD_OTHER : WorldEditRendererCUIEditor.Type.SELECTION_OTHER; } float width = type.getWidth(player).value; - BlockData block = type.getMaterial(player).createBlockData(); + Material material = type.getMaterial(player); + if (material == Material.BARRIER) { + hide(player, null, clipboard, true); + } + BlockData block = material.createBlockData(); BoxPair boxPair = boxes.computeIfAbsent(player, __ -> new HashMap<>()).computeIfAbsent(owner, __ -> new BoxPair()); CAABox box = boxPair.get(clipboard); diff --git a/SpigotCore/SpigotCore_Main/src/SpigotCore.properties b/SpigotCore/SpigotCore_Main/src/SpigotCore.properties index b4cae687..94e57d6c 100644 --- a/SpigotCore/SpigotCore_Main/src/SpigotCore.properties +++ b/SpigotCore/SpigotCore_Main/src/SpigotCore.properties @@ -108,10 +108,10 @@ UNNOSCHEMSUBMITTING=§e{0} §7may now submit §e§lschematics§7 again§8. WORLDEDIT_CUI_TITLE = WorldEdit CUI WORLDEDIT_CUI_TITLE_SUBMENU = WorldEdit CUI - {0} -WORLDEDIT_CUI_SELECTION = Selection -WORLDEDIT_CUI_CLIPBOARD = Clipboard -WORLDEDIT_CUI_SELECTION_OTHER = Selection Other -WORLDEDIT_CUI_CLIPBOARD_OTHER = Clipboard Other +WORLDEDIT_CUI_SELECTION = Own Selection +WORLDEDIT_CUI_CLIPBOARD = Own Clipboard +WORLDEDIT_CUI_SELECTION_OTHER = Other Selection +WORLDEDIT_CUI_CLIPBOARD_OTHER = Other Clipboard WORLDEDIT_CUI_MATERIAL_NAME = §eWorldEdit {0} WORLDEDIT_CUI_MATERIAL_CLICK = §7Click to edit @@ -120,7 +120,7 @@ WORLDEDIT_CUI_WIDTH_NAME = §eWidth {0} WORLDEDIT_CUI_WIDTH_LORE = §8> §7{0} WORLDEDIT_CUI_WIDTH_LORE_SELECTED = §8> §e{0} WORLDEDIT_CUI_WIDTH_CLICK = §7Click to change -WORLDEDIT_CUI_WIDTH_HUGE = 2/16 Block +WORLDEDIT_CUI_WIDTH_HUGE = 1/ 8 Block WORLDEDIT_CUI_WIDTH_LARGE = 1/16 Block WORLDEDIT_CUI_WIDTH_MEDIUM = 1/32 Block WORLDEDIT_CUI_WIDTH_SLIM = 1/64 Block \ No newline at end of file diff --git a/SpigotCore/SpigotCore_Main/src/SpigotCore_de.properties b/SpigotCore/SpigotCore_Main/src/SpigotCore_de.properties index cc5158ea..1f573eff 100644 --- a/SpigotCore/SpigotCore_Main/src/SpigotCore_de.properties +++ b/SpigotCore/SpigotCore_Main/src/SpigotCore_de.properties @@ -101,8 +101,8 @@ NOSCHEMSUBMITTING_UNTIL=§7Du bist §ebis zum {0} §7vom §e§lEinsenden von Sch UNNOSCHEMSUBMITTING_ERROR=§cDer Spieler ist nicht vom Einsenden von Schematics ausgeschlossen. UNNOSCHEMSUBMITTING=§e{0} §7darf nun wieder §e§lSchematis§7 einsenden§8. -WORLDEDIT_CUI_SELECTION = Auswahl -WORLDEDIT_CUI_CLIPBOARD = Kopie +WORLDEDIT_CUI_SELECTION = Eigene Auswahl +WORLDEDIT_CUI_CLIPBOARD = Eigene Kopie WORLDEDIT_CUI_SELECTION_OTHER = Auswahl Anderer WORLDEDIT_CUI_CLIPBOARD_OTHER = Kopie Anderer diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java index faed64e3..6d84963c 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java @@ -120,12 +120,16 @@ public class WorldEditRenderer implements Listener { @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { - renderRegion(event.getPlayer(), we.getSession(event.getPlayer())); + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + renderRegion(event.getPlayer(), we.getSession(event.getPlayer())); + }, 0); } @EventHandler public void onBlockBreak(BlockBreakEvent event) { - renderRegion(event.getPlayer(), we.getSession(event.getPlayer())); + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + renderRegion(event.getPlayer(), we.getSession(event.getPlayer())); + }, 0); } @EventHandler diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/WorldEditRendererCUIEditor.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java similarity index 98% rename from SpigotCore/SpigotCore_Main/src/de/steamwar/WorldEditRendererCUIEditor.java rename to SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java index 6bd0f60a..ed048de8 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/WorldEditRendererCUIEditor.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java @@ -17,10 +17,9 @@ * along with this program. If not, see . */ -package de.steamwar; +package de.steamwar.core; import de.steamwar.command.SWCommand; -import de.steamwar.core.Core; import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; import de.steamwar.sql.UserConfig; @@ -90,7 +89,9 @@ public class WorldEditRendererCUIEditor { } public WorldEditRendererCUIEditor() { - new Command(); + if (Core.getVersion() >= 21) { + new Command(); + } } private static class Command extends SWCommand { From f6852a55232f85ca1833b11aef8cf27c677f8dd3 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 16 Apr 2025 18:57:03 +0200 Subject: [PATCH 08/17] Add WorldEditRendererCUIEditor to Builder server --- Teamserver/src/de/steamwar/teamserver/Builder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Teamserver/src/de/steamwar/teamserver/Builder.java b/Teamserver/src/de/steamwar/teamserver/Builder.java index 137906ad..55aeed2d 100644 --- a/Teamserver/src/de/steamwar/teamserver/Builder.java +++ b/Teamserver/src/de/steamwar/teamserver/Builder.java @@ -19,6 +19,7 @@ package de.steamwar.teamserver; +import de.steamwar.core.WorldEditRendererCUIEditor; import de.steamwar.message.Message; import de.steamwar.teamserver.command.*; import de.steamwar.teamserver.listener.AxiomHandshakeListener; @@ -58,6 +59,7 @@ public final class Builder extends JavaPlugin { Bukkit.getPluginManager().registerEvents(materialCommand, this); Bukkit.getWorlds().get(0).setGameRule(GameRule.REDUCED_DEBUG_INFO, false); + new WorldEditRendererCUIEditor(); } @Override From d975110470907c1b0b792d56a03b73eaa00bcc0b Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 16 Apr 2025 19:03:01 +0200 Subject: [PATCH 09/17] Final fixes --- .../src/de/steamwar/core/WorldEditRendererWrapper20.java | 3 ++- .../src/de/steamwar/core/WorldEditRendererCUIEditor.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java index fd6e20eb..55dd9e48 100644 --- a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java +++ b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java @@ -82,7 +82,8 @@ public class WorldEditRendererWrapper20 implements WorldEditRendererWrapper { float width = type.getWidth(player).value; Material material = type.getMaterial(player); if (material == Material.BARRIER) { - hide(player, null, clipboard, true); + hide(player, owner, clipboard, true); + return; } BlockData block = material.createBlockData(); diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java index ed048de8..46fe53de 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java @@ -89,7 +89,7 @@ public class WorldEditRendererCUIEditor { } public WorldEditRendererCUIEditor() { - if (Core.getVersion() >= 21) { + if (Core.getVersion() >= 20) { new Command(); } } From 3e448e7597a810872df40ef30ca794e08cb7cd05 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 16 Apr 2025 20:11:55 +0200 Subject: [PATCH 10/17] Remove default methods of WorldEditRendererWrapper --- .../steamwar/core/WorldEditRendererWrapper8.java | 12 ++++++++++++ .../steamwar/core/WorldEditRendererWrapper9.java | 14 +++++++++++++- .../de/steamwar/core/WorldEditRendererWrapper.java | 9 +++------ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java index 1ca68b2d..3a9042ed 100644 --- a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java +++ b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java @@ -27,4 +27,16 @@ public class WorldEditRendererWrapper8 implements WorldEditRendererWrapper { @Override public void draw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2) { } + + @Override + public void tick(Player player) { + } + + @Override + public void hide(Player player, Player owner, boolean clipboard, boolean hide) { + } + + @Override + public void remove(Player player) { + } } diff --git a/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java index 159a89ec..579b5f14 100644 --- a/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java +++ b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java @@ -52,7 +52,7 @@ public class WorldEditRendererWrapper9 implements WorldEditRendererWrapper { drawLine(player, owner, clipboard, new Vector(max.getX(), max.getY(), min.getZ()), new Vector(max.getX(), max.getY(), max.getZ())); } - public void drawLine(Player player, Player owner, boolean clipboard, Vector min, Vector max) { + private void drawLine(Player player, Player owner, boolean clipboard, Vector min, Vector max) { Particle particle; if (player == owner) { if (clipboard) { @@ -79,4 +79,16 @@ public class WorldEditRendererWrapper9 implements WorldEditRendererWrapper { min.add(stepSize); } } + + @Override + public void tick(Player player) { + } + + @Override + public void hide(Player player, Player owner, boolean clipboard, boolean hide) { + } + + @Override + public void remove(Player player) { + } } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java index 63380fdc..fd6c0ea1 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java @@ -36,12 +36,9 @@ public interface WorldEditRendererWrapper { void draw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2); - default void tick(Player player) { - } + void tick(Player player); - default void hide(Player player, Player owner, boolean clipboard, boolean hide) { - } + void hide(Player player, Player owner, boolean clipboard, boolean hide); - default void remove(Player player) { - } + void remove(Player player); } From cc4532ab90254ec17949e73ef5282f99190b0e2d Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 12 Jun 2025 18:50:13 +0200 Subject: [PATCH 11/17] Update CAALine to CLine Update CAABox to CWireframe --- .../core/WorldEditRendererWrapper20.java | 18 +- .../src/de/steamwar/entity/CAABox.java | 103 -------- .../src/de/steamwar/entity/CAALine.java | 246 ------------------ 3 files changed, 9 insertions(+), 358 deletions(-) delete mode 100644 SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAABox.java delete mode 100644 SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAALine.java diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java index 55dd9e48..58d8c4e9 100644 --- a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java +++ b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java @@ -19,7 +19,7 @@ package de.steamwar.core; -import de.steamwar.entity.CAABox; +import de.steamwar.entity.CWireframe; import de.steamwar.entity.REntityServer; import org.bukkit.Material; import org.bukkit.block.data.BlockData; @@ -33,10 +33,10 @@ import java.util.Map; public class WorldEditRendererWrapper20 implements WorldEditRendererWrapper { private static final class BoxPair { - private CAABox regionBox; - private CAABox clipboardBox; + private CWireframe regionBox; + private CWireframe clipboardBox; - public CAABox get(boolean clipboard) { + public CWireframe get(boolean clipboard) { if (clipboard) { return clipboardBox; } else { @@ -44,7 +44,7 @@ public class WorldEditRendererWrapper20 implements WorldEditRendererWrapper { } } - public void set(boolean clipboard, CAABox box) { + public void set(boolean clipboard, CWireframe box) { if (clipboard) { this.clipboardBox = box; } else { @@ -88,9 +88,9 @@ public class WorldEditRendererWrapper20 implements WorldEditRendererWrapper { BlockData block = material.createBlockData(); BoxPair boxPair = boxes.computeIfAbsent(player, __ -> new HashMap<>()).computeIfAbsent(owner, __ -> new BoxPair()); - CAABox box = boxPair.get(clipboard); + CWireframe box = boxPair.get(clipboard); if (box == null) { - box = new CAABox(server); + box = new CWireframe(server); boxPair.set(clipboard, box); } box.setPos1(null).setPos2(null); @@ -112,11 +112,11 @@ public class WorldEditRendererWrapper20 implements WorldEditRendererWrapper { if (owner != null) { BoxPair boxPair = pairs.get(owner); if (boxPair == null) return; - CAABox box = boxPair.get(clipboard); + CWireframe box = boxPair.get(clipboard); if (box != null) box.hide(hide); } else { pairs.values().forEach(boxPair -> { - CAABox box = boxPair.get(clipboard); + CWireframe box = boxPair.get(clipboard); if (box != null) box.hide(hide); }); } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAABox.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAABox.java deleted file mode 100644 index 80d94c88..00000000 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAABox.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 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.entity; - -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.block.data.BlockData; -import org.bukkit.util.Vector; - -import java.util.List; - -/** - * Compound Axis Aligned Box (12 CAALine) - */ -public class CAABox extends CEntity { - - public static final float DEFAULT_WIDTH = 1 / 16f; - private float width = DEFAULT_WIDTH; - - private Location pos1; - private Location pos2; - - public CAABox(REntityServer server) { - super(server); - } - - public CAABox setPos1(Location pos1) { - this.pos1 = pos1; - updateAndSpawnLines(); - return this; - } - - public CAABox setPos2(Location pos2) { - this.pos2 = pos2; - updateAndSpawnLines(); - return this; - } - - public CAABox setWidth(float width) { - this.width = width; - updateAndSpawnLines(); - getEntitiesByType(CAALine.class).forEach(haaLine -> { - haaLine.setWidth(width); - }); - return this; - } - - public CAABox setBlock(BlockData blockData) { - getEntitiesByType(CAALine.class).forEach(haaLine -> { - haaLine.setBlock(blockData); - }); - return this; - } - - private void updateAndSpawnLines() { - if (pos1 == null || pos2 == null) return; - if (entities.isEmpty()) { - for (int i = 0; i < 12; i++) { - entities.add(new CAALine(server)); - } - } - - World world = pos1.getWorld(); - Vector min = Vector.getMinimum(pos1.toVector(), pos2.toVector()); - Vector max = Vector.getMaximum(pos1.toVector(), pos2.toVector()) - .add(new Vector(1 - width, 1 - width, 1 - width)); - - List lines = getEntitiesByType(CAALine.class); - lines.forEach(line -> line.setFrom(null).setTo(null)); - - lines.get(0).setFrom(new Vector(min.getX(), min.getY(), min.getZ()).toLocation(world)).setTo(new Vector(max.getX() + width, min.getY(), min.getZ()).toLocation(world)); - lines.get(1).setFrom(new Vector(min.getX(), max.getY(), min.getZ()).toLocation(world)).setTo(new Vector(max.getX() + width, max.getY(), min.getZ()).toLocation(world)); - lines.get(2).setFrom(new Vector(min.getX(), min.getY(), max.getZ()).toLocation(world)).setTo(new Vector(max.getX() + width, min.getY(), max.getZ()).toLocation(world)); - lines.get(3).setFrom(new Vector(min.getX(), max.getY(), max.getZ()).toLocation(world)).setTo(new Vector(max.getX() + width, max.getY(), max.getZ()).toLocation(world)); - - lines.get(4).setFrom(new Vector(min.getX(), min.getY(), min.getZ()).toLocation(world)).setTo(new Vector(min.getX(), max.getY() + width, min.getZ()).toLocation(world)); - lines.get(5).setFrom(new Vector(max.getX(), min.getY(), min.getZ()).toLocation(world)).setTo(new Vector(max.getX(), max.getY() + width, min.getZ()).toLocation(world)); - lines.get(6).setFrom(new Vector(min.getX(), min.getY(), max.getZ()).toLocation(world)).setTo(new Vector(min.getX(), max.getY() + width, max.getZ()).toLocation(world)); - lines.get(7).setFrom(new Vector(max.getX(), min.getY(), max.getZ()).toLocation(world)).setTo(new Vector(max.getX(), max.getY() + width, max.getZ()).toLocation(world)); - - lines.get(8).setFrom(new Vector(min.getX(), min.getY(), min.getZ()).toLocation(world)).setTo(new Vector(min.getX(), min.getY(), max.getZ() + width).toLocation(world)); - lines.get(9).setFrom(new Vector(max.getX(), min.getY(), min.getZ()).toLocation(world)).setTo(new Vector(max.getX(), min.getY(), max.getZ() + width).toLocation(world)); - lines.get(10).setFrom(new Vector(min.getX(), max.getY(), min.getZ()).toLocation(world)).setTo(new Vector(min.getX(), max.getY(), max.getZ() + width).toLocation(world)); - lines.get(11).setFrom(new Vector(max.getX(), max.getY(), min.getZ()).toLocation(world)).setTo(new Vector(max.getX(), max.getY(), max.getZ() + width).toLocation(world)); - } -} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAALine.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAALine.java deleted file mode 100644 index 19a6ef9f..00000000 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/CAALine.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 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.entity; - -import org.bukkit.Location; -import org.bukkit.block.data.BlockData; -import org.bukkit.entity.Display; -import org.bukkit.entity.Player; -import org.bukkit.util.Transformation; -import org.bukkit.util.Vector; -import org.joml.Quaternionf; -import org.joml.Vector3f; - -import java.util.Objects; - -public class CAALine extends CEntity { - - public static final float DEFAULT_WIDTH = 1 / 16f; - private static final float offset = 1 / 1024f; - private static final Vector offsetVec = new Vector(offset, offset, offset); - - private Location from; - private Location to; - private float width = DEFAULT_WIDTH; - private BlockData blockData = RBlockDisplay.DEFAULT_BLOCK; - - public CAALine(REntityServer server) { - super(server); - tick(); - } - - public CAALine setFrom(Location from) { - if (Objects.equals(from, this.from)) return this; - this.from = from; - tick(); - return this; - } - - public CAALine setTo(Location to) { - if (Objects.equals(to, this.to)) return this; - this.to = to; - tick(); - return this; - } - - public CAALine setWidth(float width) { - if (this.width == width) return this; - this.width = width; - tick(); - return this; - } - - public CAALine setBlock(BlockData blockData) { - if (this.blockData.equals(blockData)) return this; - if (blockData == null) { - this.blockData = RBlockDisplay.DEFAULT_BLOCK; - } else { - this.blockData = blockData; - } - getEntitiesByType(RBlockDisplay.class).forEach(display -> { - display.setBlock(blockData); - }); - return this; - } - - private boolean hide = false; - - @Override - public void hide(boolean hide) { - if (hide == this.hide) return; - this.hide = hide; - if (hide) { - if (startLine != null) startLine.hide(true); - if (middleLine != null) middleLine.hide(true); - if (endLine != null) endLine.hide(true); - } else { - tick(); - } - } - - @Override - void tick() { - if (from == null || to == null) return; - if (hide) return; - updateStart(); - updateMiddle(); - updateEnd(); - } - - private RBlockDisplay startLine; - private void updateStart() { - Vector vec = to.clone().subtract(from).toVector(); - if (vec.length() > 35) vec.normalize().multiply(35); - - if (startLine == null) { - startLine = new RBlockDisplay(server, new Location(null, 0, 0, 0)); - startLine.setBrightness(new Display.Brightness(15, 15)); - startLine.setViewRange(560); - startLine.setBlock(blockData); - entities.add(startLine); - } else { - startLine.hide(false); - } - - startLine.move(from.clone().subtract(offsetVec)); - startLine.setTransform(new Transformation(new Vector3f(0, 0, 0), new Quaternionf(0, 0, 0, 1), addWidth(vec).toVector3f(), new Quaternionf(0, 0, 0, 1))); - } - - private RBlockDisplay middleLine; - private void updateMiddle() { - Vector vec = to.clone().subtract(from).toVector(); - if (vec.length() <= 70) { - if (middleLine != null) middleLine.hide(true); - return; - } - if (vec.length() > 280) vec.normalize().multiply(280); - else vec = vec.clone().normalize().multiply(vec.length() - 60); - - if (middleLine == null) { - middleLine = new RBlockDisplay(server, new Location(null, 0, 0, 0)); - middleLine.setBrightness(new Display.Brightness(15, 15)); - middleLine.setViewRange(560); - middleLine.setBlock(blockData); - entities.add(middleLine); - } else { - middleLine.hide(false); - } - - Player player = server.getPlayers().stream().findFirst().orElse(null); - if (player == null) return; - - Vector tempVector = vec.clone().normalize().multiply(30); - Location from = this.from.clone().add(tempVector); - Location to = this.to.clone().subtract(tempVector); - - Vector lineVec = to.clone().subtract(from).toVector(); - Vector playerVec = player.getLocation().toVector().subtract(from.toVector()); - double lineVecDotItself = lineVec.dot(lineVec); - Vector projectionVec = lineVec.clone().multiply(lineVec.dot(playerVec)).divide(new Vector(lineVecDotItself, lineVecDotItself, lineVecDotItself)); - - Vector moveVec = from.toVector().add(projectionVec); - if (moveVec.getX() < from.getX()) { - moveVec.setX(from.getX()); - } - if (moveVec.getX() > to.getX()) { - moveVec.setX(to.getX()); - } - if (moveVec.getY() < from.getY()) { - moveVec.setY(from.getY()); - } - if (moveVec.getY() > to.getY()) { - moveVec.setY(to.getY()); - } - if (moveVec.getZ() < from.getZ()) { - moveVec.setZ(from.getZ()); - } - if (moveVec.getZ() > to.getZ()) { - moveVec.setZ(to.getZ()); - } - - Vector translation = vec.clone().divide(new Vector(2, 2, 2)); - translation.setX(-translation.getX()); - translation.setY(-translation.getY()); - translation.setZ(-translation.getZ()); - - Vector first = moveVec.clone().add(translation).subtract(from.toVector()); - if (first.getX() < 0) { - translation.setX(translation.getX() - first.getX()); - } - if (first.getY() < 0) { - translation.setY(translation.getY() - first.getY()); - } - if (first.getZ() < 0) { - translation.setZ(translation.getZ() - first.getZ()); - } - - Vector second = to.toVector().subtract(moveVec.clone().subtract(translation)); - if (second.getX() < 0) { - translation.setX(translation.getX() + second.getX()); - } - if (second.getY() < 0) { - translation.setY(translation.getY() + second.getY()); - } - if (second.getZ() < 0) { - translation.setZ(translation.getZ() + second.getZ()); - } - - middleLine.move(moveVec.toLocation(player.getWorld()).subtract(offsetVec)); - middleLine.setTransform(new Transformation(translation.toVector3f(), new Quaternionf(0, 0, 0, 1), addWidth(vec).toVector3f(), new Quaternionf(0, 0, 0, 1))); - } - - private RBlockDisplay endLine; - private void updateEnd() { - Vector vec = to.clone().subtract(from).toVector(); - if (vec.length() <= 35) { - if (endLine != null) endLine.hide(true); - return; - } - if (vec.length() > 35) vec.normalize().multiply(35); - - if (endLine == null) { - endLine = new RBlockDisplay(server, new Location(null, 0, 0, 0)); - endLine.setBrightness(new Display.Brightness(15, 15)); - endLine.setViewRange(560); - endLine.setBlock(blockData); - entities.add(endLine); - } else { - endLine.hide(false); - } - - endLine.move(to.clone().subtract(offsetVec)); - endLine.setTransform(new Transformation(vec.toVector3f().negate(), new Quaternionf(0, 0, 0, 1), addWidth(vec).toVector3f(), new Quaternionf(0, 0, 0, 1))); - } - - private Vector addWidth(Vector vector) { - vector = vector.clone(); - if (vector.getX() == 0) { - vector.setX(vector.getX() + width); - } - if (vector.getY() == 0) { - vector.setY(vector.getY() + width); - } - if (vector.getZ() == 0) { - vector.setZ(vector.getZ() + width); - } - vector.add(offsetVec).add(offsetVec); - return vector; - } -} From 4383e541d8bbb50f7c4b578ee79a63da4ffaca7d Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 26 Jun 2025 20:46:01 +0200 Subject: [PATCH 12/17] Fix some stuff --- .../de/steamwar/fightsystem/ArenaMode.java | 1 - .../de/steamwar/fightsystem/FightSystem.java | 2 +- .../src/de/steamwar/core/Core.java | 37 +---------- .../src/de/steamwar/core/PlayerVersion.java | 65 +++++++++++++++++++ .../de/steamwar/core/WorldEditRenderer.java | 5 -- .../core/WorldEditRendererWrapper.java | 2 +- 6 files changed, 69 insertions(+), 43 deletions(-) create mode 100644 SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java index eb0a637a..e96e0204 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java @@ -53,5 +53,4 @@ public enum ArenaMode { public static final Set SoloLeader = Collections.unmodifiableSet(EnumSet.of(TEST, CHECK, PREPARE)); public static final Set NotOnBau = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(TEST, CHECK, PREPARE, REPLAY))); public static final Set SeriousFight = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(TEST, CHECK, REPLAY))); - public static final Set CheckOrTest = Collections.unmodifiableSet(EnumSet.of(TEST, CHECK)); } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index 949d7691..9ebc4f0c 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -107,7 +107,7 @@ public class FightSystem extends JavaPlugin { new HotbarKit.HotbarKitListener(); new JoinRequestListener(); new OneShotStateDependent(ArenaMode.All, FightState.PreSchemSetup, () -> Fight.playSound(SWSound.BLOCK_NOTE_PLING.getSound(), 100.0f, 2.0f)); - new OneShotStateDependent(ArenaMode.CheckOrTest, FightState.All, WorldEditRendererCUIEditor::new); + new OneShotStateDependent(ArenaMode.Test, FightState.All, WorldEditRendererCUIEditor::new); new EnterHandler(); techHider = new TechHiderWrapper(); diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java index ca2467b3..bffe5025 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -20,8 +20,6 @@ package de.steamwar.core; import com.comphenix.tinyprotocol.TinyProtocol; -import com.google.gson.Gson; -import com.google.gson.JsonObject; import de.steamwar.Reflection; import de.steamwar.command.*; import de.steamwar.core.authlib.AuthlibInjector; @@ -38,37 +36,23 @@ import de.steamwar.sql.internal.Statement; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.plugin.messaging.PluginMessageListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; import java.util.logging.Level; -public class Core extends JavaPlugin implements PluginMessageListener, Listener { +public class Core extends JavaPlugin { public static final Message MESSAGE = new Message("SpigotCore", Core.class.getClassLoader()); - private static final String CHANNEL = "vv:proxy_details"; - private static final Gson GSON = new Gson(); - private static final Map playerVersions = new HashMap<>(); - public static int getVersion(){ return Reflection.MAJOR_VERSION; } - public static int getPlayerVersion(Player player) { - return playerVersions.getOrDefault(player, -1); - } - public static boolean isBedrockPlayer(Player player) { return player.getName().startsWith("."); } @@ -91,8 +75,7 @@ public class Core extends JavaPlugin implements PluginMessageListener, Listener @Override public void onEnable() { - this.getServer().getMessenger().registerIncomingPluginChannel(this, CHANNEL, this); - Bukkit.getPluginManager().registerEvents(this, this); + new PlayerVersion(); errorHandler = new ErrorHandler(); crashDetector = new CrashDetector(); @@ -151,20 +134,4 @@ public class Core extends JavaPlugin implements PluginMessageListener, Listener Statement.closeAll(); this.getServer().getMessenger().unregisterIncomingPluginChannel(this); } - - @Override - public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { - if (!channel.equals(CHANNEL)) { - return; - } - - final JsonObject payload = GSON.fromJson(new String(bytes), JsonObject.class); - final String version = payload.get("versionName").getAsString(); - playerVersions.put(player, Integer.parseInt(version.split("-")[0].split("\\.")[1])); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onPlayerQuit(PlayerQuitEvent event) { - playerVersions.remove(event.getPlayer()); - } } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java new file mode 100644 index 00000000..8b73e9b4 --- /dev/null +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java @@ -0,0 +1,65 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.google.gson.Gson; +import com.google.gson.JsonObject; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.plugin.messaging.PluginMessageListener; + +import java.util.HashMap; +import java.util.Map; + +public class PlayerVersion implements PluginMessageListener, Listener { + + private static final String PLAYER_VERSION_CHANNEL = "vv:proxy_details"; + private static final Gson GSON = new Gson(); + private static final Map playerVersions = new HashMap<>(); + + public static int getVersion(Player player) { + return playerVersions.getOrDefault(player, -1); + } + + public PlayerVersion() { + Core.getInstance().getServer().getMessenger().registerIncomingPluginChannel(Core.getInstance(), PLAYER_VERSION_CHANNEL, this); + Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); + } + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { + if (!channel.equals(PLAYER_VERSION_CHANNEL)) { + return; + } + + final JsonObject payload = GSON.fromJson(new String(bytes), JsonObject.class); + final String version = payload.get("versionName").getAsString(); + playerVersions.put(player, Integer.parseInt(version.split("-")[0].split("\\.")[1])); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerQuit(PlayerQuitEvent event) { + playerVersions.remove(event.getPlayer()); + } +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java index 6d84963c..0a6c128c 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java @@ -105,11 +105,6 @@ public class WorldEditRenderer implements Listener { } } - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - renderPlayer(event.getPlayer()); - } - @EventHandler public void onPlayerMove(PlayerMoveEvent event) { if(event.getPlayer().getItemInHand().getType() == WAND) { diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java index fd6c0ea1..c303ed19 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java @@ -27,7 +27,7 @@ public interface WorldEditRendererWrapper { WorldEditRendererWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); static void safeDraw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2) { - if (Core.isBedrockPlayer(player) || Core.getPlayerVersion(player) < 20) { + if (Core.isBedrockPlayer(player) || PlayerVersion.getVersion(player) < 20) { fallback.draw(player, owner, clipboard, pos1, pos2); } else { impl.draw(player, owner, clipboard, pos1, pos2); From c6ecab5aa8298bdcda7ef7b0c6d519bf6b54aa62 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 26 Jun 2025 21:01:00 +0200 Subject: [PATCH 13/17] Fix some stuff --- .../core/WorldEditRendererWrapper20.java | 49 ++++---------- .../core/WorldEditRendererWrapper8.java | 4 +- .../core/WorldEditRendererWrapper9.java | 42 ++++++------ .../de/steamwar/core/WorldEditRenderer.java | 66 +++++++++---------- .../core/WorldEditRendererCUIEditor.java | 9 +-- .../core/WorldEditRendererWrapper.java | 10 +-- 6 files changed, 74 insertions(+), 106 deletions(-) diff --git a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java index 58d8c4e9..36ded8ef 100644 --- a/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java +++ b/SpigotCore/SpigotCore_20/src/de/steamwar/core/WorldEditRendererWrapper20.java @@ -26,7 +26,6 @@ import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -63,31 +62,26 @@ public class WorldEditRendererWrapper20 implements WorldEditRendererWrapper { } private static final Map servers = new HashMap<>(); - private static final Map> boxes = new HashMap<>(); + private static final Map boxes = new HashMap<>(); @Override - public void draw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2) { + public void draw(Player player, boolean scheduled, boolean clipboard, Vector pos1, Vector pos2) { REntityServer server = servers.computeIfAbsent(player, __ -> { REntityServer entityServer = new REntityServer(); entityServer.addPlayer(player); return entityServer; }); - WorldEditRendererCUIEditor.Type type; - if (player == owner) { - type = clipboard ? WorldEditRendererCUIEditor.Type.CLIPBOARD : WorldEditRendererCUIEditor.Type.SELECTION; - } else { - type = clipboard ? WorldEditRendererCUIEditor.Type.CLIPBOARD_OTHER : WorldEditRendererCUIEditor.Type.SELECTION_OTHER; - } + WorldEditRendererCUIEditor.Type type = clipboard ? WorldEditRendererCUIEditor.Type.CLIPBOARD : WorldEditRendererCUIEditor.Type.SELECTION; float width = type.getWidth(player).value; Material material = type.getMaterial(player); if (material == Material.BARRIER) { - hide(player, owner, clipboard, true); + hide(player, clipboard, true); return; } BlockData block = material.createBlockData(); - BoxPair boxPair = boxes.computeIfAbsent(player, __ -> new HashMap<>()).computeIfAbsent(owner, __ -> new BoxPair()); + BoxPair boxPair = boxes.computeIfAbsent(player, __ -> new BoxPair()); CWireframe box = boxPair.get(clipboard); if (box == null) { box = new CWireframe(server); @@ -107,35 +101,18 @@ public class WorldEditRendererWrapper20 implements WorldEditRendererWrapper { } @Override - public void hide(Player player, Player owner, boolean clipboard, boolean hide) { - Map pairs = boxes.getOrDefault(player, Collections.emptyMap()); - if (owner != null) { - BoxPair boxPair = pairs.get(owner); - if (boxPair == null) return; - CWireframe box = boxPair.get(clipboard); - if (box != null) box.hide(hide); - } else { - pairs.values().forEach(boxPair -> { - CWireframe box = boxPair.get(clipboard); - if (box != null) box.hide(hide); - }); - } + public void hide(Player player, boolean clipboard, boolean hide) { + BoxPair boxPair = boxes.get(player); + if (boxPair == null) return; + CWireframe box = boxPair.get(clipboard); + if (box == null) return; + box.hide(hide); } @Override public void remove(Player player) { - Map removed = boxes.remove(player); - if (removed != null) { - removed.values().forEach(boxPair -> { - boxPair.die(); - }); - } - boxes.values().forEach(map -> { - BoxPair boxPair = map.remove(player); - if (boxPair == null) return; - boxPair.die(); - }); - + BoxPair boxPair = boxes.remove(player); + if (boxPair != null) boxPair.die(); REntityServer server = servers.remove(player); if (server != null) server.close(); } diff --git a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java index 3a9042ed..68f64c46 100644 --- a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java +++ b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditRendererWrapper8.java @@ -25,7 +25,7 @@ import org.bukkit.util.Vector; public class WorldEditRendererWrapper8 implements WorldEditRendererWrapper { @Override - public void draw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2) { + public void draw(Player player, boolean scheduled, boolean clipboard, Vector pos1, Vector pos2) { } @Override @@ -33,7 +33,7 @@ public class WorldEditRendererWrapper8 implements WorldEditRendererWrapper { } @Override - public void hide(Player player, Player owner, boolean clipboard, boolean hide) { + public void hide(Player player, boolean clipboard, boolean hide) { } @Override diff --git a/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java index 579b5f14..5da6104a 100644 --- a/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java +++ b/SpigotCore/SpigotCore_9/src/de/steamwar/core/WorldEditRendererWrapper9.java @@ -34,34 +34,32 @@ public class WorldEditRendererWrapper9 implements WorldEditRendererWrapper { private static final Vector STEPS = new Vector(STEP_SIZE, STEP_SIZE, STEP_SIZE); @Override - public void draw(Player player, Player owner, boolean clipboard, Vector min, Vector max) { + public void draw(Player player, boolean scheduled, boolean clipboard, Vector min, Vector max) { + if (!scheduled) return; + max = max.clone().add(ONES); - drawLine(player, owner, clipboard, new Vector(min.getX(), min.getY(), min.getZ()), new Vector(max.getX(), min.getY(), min.getZ())); - drawLine(player, owner, clipboard, new Vector(min.getX(), max.getY(), min.getZ()), new Vector(max.getX(), max.getY(), min.getZ())); - drawLine(player, owner, clipboard, new Vector(min.getX(), min.getY(), max.getZ()), new Vector(max.getX(), min.getY(), max.getZ())); - drawLine(player, owner, clipboard, new Vector(min.getX(), max.getY(), max.getZ()), new Vector(max.getX(), max.getY(), max.getZ())); + drawLine(player, clipboard, new Vector(min.getX(), min.getY(), min.getZ()), new Vector(max.getX(), min.getY(), min.getZ())); + drawLine(player, clipboard, new Vector(min.getX(), max.getY(), min.getZ()), new Vector(max.getX(), max.getY(), min.getZ())); + drawLine(player, clipboard, new Vector(min.getX(), min.getY(), max.getZ()), new Vector(max.getX(), min.getY(), max.getZ())); + drawLine(player, clipboard, new Vector(min.getX(), max.getY(), max.getZ()), new Vector(max.getX(), max.getY(), max.getZ())); - drawLine(player, owner, clipboard, new Vector(min.getX(), min.getY(), min.getZ()), new Vector(min.getX(), max.getY(), min.getZ())); - drawLine(player, owner, clipboard, new Vector(max.getX(), min.getY(), min.getZ()), new Vector(max.getX(), max.getY(), min.getZ())); - drawLine(player, owner, clipboard, new Vector(min.getX(), min.getY(), max.getZ()), new Vector(min.getX(), max.getY(), max.getZ())); - drawLine(player, owner, clipboard, new Vector(max.getX(), min.getY(), max.getZ()), new Vector(max.getX(), max.getY(), max.getZ())); + drawLine(player, clipboard, new Vector(min.getX(), min.getY(), min.getZ()), new Vector(min.getX(), max.getY(), min.getZ())); + drawLine(player, clipboard, new Vector(max.getX(), min.getY(), min.getZ()), new Vector(max.getX(), max.getY(), min.getZ())); + drawLine(player, clipboard, new Vector(min.getX(), min.getY(), max.getZ()), new Vector(min.getX(), max.getY(), max.getZ())); + drawLine(player, clipboard, new Vector(max.getX(), min.getY(), max.getZ()), new Vector(max.getX(), max.getY(), max.getZ())); - drawLine(player, owner, clipboard, new Vector(min.getX(), min.getY(), min.getZ()), new Vector(min.getX(), min.getY(), max.getZ())); - drawLine(player, owner, clipboard, new Vector(max.getX(), min.getY(), min.getZ()), new Vector(max.getX(), min.getY(), max.getZ())); - drawLine(player, owner, clipboard, new Vector(min.getX(), max.getY(), min.getZ()), new Vector(min.getX(), max.getY(), max.getZ())); - drawLine(player, owner, clipboard, new Vector(max.getX(), max.getY(), min.getZ()), new Vector(max.getX(), max.getY(), max.getZ())); + drawLine(player, clipboard, new Vector(min.getX(), min.getY(), min.getZ()), new Vector(min.getX(), min.getY(), max.getZ())); + drawLine(player, clipboard, new Vector(max.getX(), min.getY(), min.getZ()), new Vector(max.getX(), min.getY(), max.getZ())); + drawLine(player, clipboard, new Vector(min.getX(), max.getY(), min.getZ()), new Vector(min.getX(), max.getY(), max.getZ())); + drawLine(player, clipboard, new Vector(max.getX(), max.getY(), min.getZ()), new Vector(max.getX(), max.getY(), max.getZ())); } - private void drawLine(Player player, Player owner, boolean clipboard, Vector min, Vector max) { + private void drawLine(Player player, boolean clipboard, Vector min, Vector max) { Particle particle; - if (player == owner) { - if (clipboard) { - particle = TrickyParticleWrapper.impl.getVillagerHappy(); - } else { - particle = Particle.DRAGON_BREATH; - } + if (clipboard) { + particle = TrickyParticleWrapper.impl.getVillagerHappy(); } else { - particle = Particle.TOWN_AURA; + particle = Particle.DRAGON_BREATH; } Vector stepSize = max.clone().subtract(min).normalize().multiply(STEPS); @@ -85,7 +83,7 @@ public class WorldEditRendererWrapper9 implements WorldEditRendererWrapper { } @Override - public void hide(Player player, Player owner, boolean clipboard, boolean hide) { + public void hide(Player player, boolean clipboard, boolean hide) { } @Override diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java index 0a6c128c..5e359512 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRenderer.java @@ -47,22 +47,20 @@ public class WorldEditRenderer implements Listener { we = WorldEditWrapper.getWorldEditPlugin(); Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); - Bukkit.getScheduler().runTaskTimer(Core.getInstance(), this::render, 20, 20); + Bukkit.getScheduler().runTaskTimer(Core.getInstance(), () -> { + for (Player player : Bukkit.getOnlinePlayers()) { + renderPlayer(player, true); + } + }, 20, 20); } - private void render() { - for(Player player : Bukkit.getOnlinePlayers()) { - renderPlayer(player); - } - } - - private void renderPlayer(Player player) { + private void renderPlayer(Player player, boolean scheduled) { LocalSession session = we.getSession(player); - renderClipboard(player, session); - renderRegion(player, session); + renderClipboard(player, session, scheduled); + renderRegion(player, session, scheduled); } - private void renderClipboard(Player player, LocalSession session) { + private void renderClipboard(Player player, LocalSession session, boolean scheduled) { try { Clipboard clipboard = session.getClipboard().getClipboard(); Vector pos = player.getLocation().toVector(); @@ -72,36 +70,34 @@ public class WorldEditRenderer implements Listener { Vector b = WorldEditWrapper.impl.applyTransform(WorldEditWrapper.impl.getMaximum(region).subtract(WorldEditWrapper.impl.getOrigin(clipboard)), transform).add(pos); a = new Vector(a.getBlockX(), a.getBlockY(), a.getBlockZ()); b = new Vector(b.getBlockX(), b.getBlockY(), b.getBlockZ()); - drawCuboid(Vector.getMinimum(a, b), Vector.getMaximum(a, b), true, player); + drawCuboid(Vector.getMinimum(a, b), Vector.getMaximum(a, b), scheduled, true, player); } catch (EmptyClipboardException e) { - WorldEditRendererWrapper.impl.hide(player, player, true, true); + WorldEditRendererWrapper.impl.hide(player, true, true); } } - private void renderRegion(Player player, LocalSession session) { + private void renderRegion(Player player, LocalSession session, boolean scheduled) { 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), false, player); + drawCuboid(WorldEditWrapper.impl.getMinimum(region), WorldEditWrapper.impl.getMaximum(region), scheduled, false, player); } catch (IncompleteRegionException e) { - WorldEditRendererWrapper.impl.hide(player, player, false, true); + WorldEditRendererWrapper.impl.hide(player, false, true); } } } - private void drawCuboid(Vector min, Vector max, boolean clipboard, Player owner) { - for (Player player : Bukkit.getOnlinePlayers()) { - //noinspection deprecation - if(player.getItemInHand().getType() != WAND) { - WorldEditRendererWrapper.impl.hide(player, owner, true, true); - WorldEditRendererWrapper.impl.hide(player, owner, false, true); - } else { - WorldEditRendererWrapper.impl.hide(player, owner, true, false); - WorldEditRendererWrapper.impl.hide(player, owner, false, false); - WorldEditRendererWrapper.safeDraw(player, owner, clipboard, min, max); - } + private void drawCuboid(Vector min, Vector max, boolean scheduled, boolean clipboard, Player owner) { + //noinspection deprecation + if(owner.getItemInHand().getType() != WAND) { + WorldEditRendererWrapper.impl.hide(owner, true, true); + WorldEditRendererWrapper.impl.hide(owner, false, true); + } else { + WorldEditRendererWrapper.impl.hide(owner, true, false); + WorldEditRendererWrapper.impl.hide(owner, false, false); + WorldEditRendererWrapper.safeDraw(owner, scheduled, clipboard, min, max); } } @@ -110,20 +106,20 @@ public class WorldEditRenderer implements Listener { if(event.getPlayer().getItemInHand().getType() == WAND) { WorldEditRendererWrapper.impl.tick(event.getPlayer()); } - renderClipboard(event.getPlayer(), we.getSession(event.getPlayer())); + renderClipboard(event.getPlayer(), we.getSession(event.getPlayer()), false); } @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - renderRegion(event.getPlayer(), we.getSession(event.getPlayer())); + renderRegion(event.getPlayer(), we.getSession(event.getPlayer()), false); }, 0); } @EventHandler public void onBlockBreak(BlockBreakEvent event) { Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - renderRegion(event.getPlayer(), we.getSession(event.getPlayer())); + renderRegion(event.getPlayer(), we.getSession(event.getPlayer()), false); }, 0); } @@ -132,8 +128,8 @@ public class WorldEditRenderer implements Listener { if (event.getMessage().startsWith("//")) { Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { LocalSession session = we.getSession(event.getPlayer()); - renderRegion(event.getPlayer(), session); - renderClipboard(event.getPlayer(), session); + renderRegion(event.getPlayer(), session, false); + renderClipboard(event.getPlayer(), session, false); }, 5); } } @@ -141,19 +137,19 @@ public class WorldEditRenderer implements Listener { @EventHandler public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - renderPlayer(event.getPlayer()); + renderPlayer(event.getPlayer(), false); }, 1); } @EventHandler public void onPlayerDropItem(PlayerDropItemEvent event) { - renderPlayer(event.getPlayer()); + renderPlayer(event.getPlayer(), false); } @EventHandler public void onPlayerItemHeld(PlayerItemHeldEvent event) { Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { - renderPlayer(event.getPlayer()); + renderPlayer(event.getPlayer(), false); }, 1); } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java index 46fe53de..d03fcf41 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java @@ -41,8 +41,7 @@ public class WorldEditRendererCUIEditor { public enum Type { SELECTION("cui_selection_material", "cui_selection_width", Material.PURPLE_CONCRETE, Width.LARGE), CLIPBOARD("cui_clipboard_material", "cui_clipboard_width", Material.LIME_CONCRETE, Width.LARGE), - SELECTION_OTHER("cui_selection_other_material", "cui_selection_other_width", Material.GRAY_CONCRETE, Width.SLIM), - CLIPBOARD_OTHER("cui_clipboard_other_material", "cui_clipboard_other_width", Material.GRAY_CONCRETE, Width.SLIM); + ; private final String configMaterial; private final String configWidth; @@ -103,10 +102,8 @@ public class WorldEditRendererCUIEditor { @Register public void cuiEditor(Player player) { SWInventory inv = new SWInventory(player, 9 * 2, Core.MESSAGE.parse("WORLDEDIT_CUI_TITLE", player)); - setElement(inv, player, 1, "WORLDEDIT_CUI_SELECTION", Type.SELECTION); - setElement(inv, player, 3, "WORLDEDIT_CUI_CLIPBOARD", Type.CLIPBOARD); - setElement(inv, player, 5, "WORLDEDIT_CUI_SELECTION_OTHER", Type.SELECTION_OTHER); - setElement(inv, player, 7, "WORLDEDIT_CUI_CLIPBOARD_OTHER", Type.CLIPBOARD_OTHER); + setElement(inv, player, 3, "WORLDEDIT_CUI_SELECTION", Type.SELECTION); + setElement(inv, player, 5, "WORLDEDIT_CUI_CLIPBOARD", Type.CLIPBOARD); inv.open(); } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java index c303ed19..79ed288b 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java @@ -26,19 +26,19 @@ public interface WorldEditRendererWrapper { WorldEditRendererWrapper fallback = VersionDependent.getVersionImpl(Core.getInstance(), 9); WorldEditRendererWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); - static void safeDraw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2) { + static void safeDraw(Player player, boolean scheduled, boolean clipboard, Vector pos1, Vector pos2) { if (Core.isBedrockPlayer(player) || PlayerVersion.getVersion(player) < 20) { - fallback.draw(player, owner, clipboard, pos1, pos2); + fallback.draw(player, scheduled, clipboard, pos1, pos2); } else { - impl.draw(player, owner, clipboard, pos1, pos2); + impl.draw(player, scheduled, clipboard, pos1, pos2); } } - void draw(Player player, Player owner, boolean clipboard, Vector pos1, Vector pos2); + void draw(Player player, boolean scheduled, boolean clipboard, Vector pos1, Vector pos2); void tick(Player player); - void hide(Player player, Player owner, boolean clipboard, boolean hide); + void hide(Player player, boolean clipboard, boolean hide); void remove(Player player); } From 1fd8b3c4cb7ee65fa804c4418a042cded5945755 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 26 Jun 2025 21:52:07 +0200 Subject: [PATCH 14/17] Add ClientVersionPacket --- .../packets/server/ClientVersionPacket.java | 39 +++++++++++++++++++ .../src/de/steamwar/core/Core.java | 5 --- .../src/de/steamwar/core/PlayerVersion.java | 34 +++++++--------- .../core/WorldEditRendererWrapper.java | 2 +- .../listeners/VersionAnnouncer.java | 16 ++++++-- 5 files changed, 67 insertions(+), 29 deletions(-) create mode 100644 CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java diff --git a/CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java b/CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java new file mode 100644 index 00000000..af0ba4ed --- /dev/null +++ b/CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java @@ -0,0 +1,39 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@EqualsAndHashCode(callSuper = true) +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class ClientVersionPacket extends NetworkPacket { + private static final long serialVersionUID = 3686482311704273200L; + + private UUID player; + private int version; +} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java index bffe5025..568c3e48 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -35,7 +35,6 @@ import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.internal.Statement; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; @@ -53,10 +52,6 @@ public class Core extends JavaPlugin { return Reflection.MAJOR_VERSION; } - public static boolean isBedrockPlayer(Player player) { - return player.getName().startsWith("."); - } - private static JavaPlugin instance; public static JavaPlugin getInstance() { return instance; diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java index 8b73e9b4..512df0d3 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/PlayerVersion.java @@ -19,47 +19,43 @@ package de.steamwar.core; -import com.google.gson.Gson; -import com.google.gson.JsonObject; +import de.steamwar.network.packets.PacketHandler; +import de.steamwar.network.packets.server.ClientVersionPacket; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.plugin.messaging.PluginMessageListener; import java.util.HashMap; import java.util.Map; +import java.util.UUID; -public class PlayerVersion implements PluginMessageListener, Listener { +public class PlayerVersion extends PacketHandler implements Listener { - private static final String PLAYER_VERSION_CHANNEL = "vv:proxy_details"; - private static final Gson GSON = new Gson(); - private static final Map playerVersions = new HashMap<>(); + private static final Map playerVersions = new HashMap<>(); public static int getVersion(Player player) { - return playerVersions.getOrDefault(player, -1); + return playerVersions.getOrDefault(player.getUniqueId(), -1); + } + + public static boolean isBedrock(Player player) { + return player.getName().startsWith("."); } public PlayerVersion() { - Core.getInstance().getServer().getMessenger().registerIncomingPluginChannel(Core.getInstance(), PLAYER_VERSION_CHANNEL, this); Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); + register(); } - @Override - public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { - if (!channel.equals(PLAYER_VERSION_CHANNEL)) { - return; - } - - final JsonObject payload = GSON.fromJson(new String(bytes), JsonObject.class); - final String version = payload.get("versionName").getAsString(); - playerVersions.put(player, Integer.parseInt(version.split("-")[0].split("\\.")[1])); + @Handler + public void handlePacket(ClientVersionPacket clientVersionPacket) { + playerVersions.put(clientVersionPacket.getPlayer(), clientVersionPacket.getVersion()); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerQuit(PlayerQuitEvent event) { - playerVersions.remove(event.getPlayer()); + playerVersions.remove(event.getPlayer().getUniqueId()); } } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java index 79ed288b..2439d40d 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererWrapper.java @@ -27,7 +27,7 @@ public interface WorldEditRendererWrapper { WorldEditRendererWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); static void safeDraw(Player player, boolean scheduled, boolean clipboard, Vector pos1, Vector pos2) { - if (Core.isBedrockPlayer(player) || PlayerVersion.getVersion(player) < 20) { + if (PlayerVersion.isBedrock(player) || PlayerVersion.getVersion(player) < 20) { fallback.draw(player, scheduled, clipboard, pos1, pos2); } else { impl.draw(player, scheduled, clipboard, pos1, pos2); diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java index c28a8fee..4976213f 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java @@ -27,19 +27,27 @@ import com.velocitypowered.api.proxy.server.ServerInfo; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.velocity.platform.VelocityViaConfig; import de.steamwar.messages.Chatter; +import de.steamwar.network.packets.server.ClientVersionPacket; import de.steamwar.persistent.Subserver; +import de.steamwar.velocitycore.network.NetworkSender; public class VersionAnnouncer extends BasicListener { @Subscribe public void postConnect(ServerConnectedEvent e) { ServerInfo server = e.getServer().getServerInfo(); - if(!Subserver.isBuild(Subserver.getSubserver(server))) - return; - Player player = e.getPlayer(); int serverVersion = ((VelocityViaConfig) Via.getConfig()).getVelocityServerProtocols().get(server.getName()); - if(Via.getAPI().getPlayerVersion(player) == serverVersion) + + int playerVersion = Via.getAPI().getPlayerVersion(player); + String version = ProtocolVersion.getProtocolVersion(playerVersion).getVersionIntroducedIn(); + // PluginChannel 'vv:proxy_details' from ViaVersion apparently does not work any longer! + NetworkSender.send(player, new ClientVersionPacket(player.getUniqueId(), Integer.parseInt(version.split("-")[0].split("\\.")[1]))); + + if(playerVersion == serverVersion) + return; + + if(!Subserver.isBuild(Subserver.getSubserver(server))) return; player.sendActionBar(Chatter.of(player).parse("SERVER_VERSION", ProtocolVersion.getProtocolVersion(serverVersion).getMostRecentSupportedVersion())); From c6826788279dc1b1bee39fd1c7a6f2cfd572cfad Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 26 Jun 2025 21:57:44 +0200 Subject: [PATCH 15/17] Add ClientVersionPacket Update VersionAnnouncer --- .../network/packets/server/ClientVersionPacket.java | 6 ++---- .../steamwar/velocitycore/listeners/VersionAnnouncer.java | 8 +++++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java b/CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java index af0ba4ed..c8f43446 100644 --- a/CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java +++ b/CommonCore/Network/src/de/steamwar/network/packets/server/ClientVersionPacket.java @@ -20,10 +20,7 @@ package de.steamwar.network.packets.server; import de.steamwar.network.packets.NetworkPacket; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.util.UUID; @@ -31,6 +28,7 @@ import java.util.UUID; @Getter @AllArgsConstructor @NoArgsConstructor +@ToString public class ClientVersionPacket extends NetworkPacket { private static final long serialVersionUID = 3686482311704273200L; diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java index 4976213f..cf39f843 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/VersionAnnouncer.java @@ -29,8 +29,12 @@ import com.viaversion.viaversion.velocity.platform.VelocityViaConfig; import de.steamwar.messages.Chatter; import de.steamwar.network.packets.server.ClientVersionPacket; import de.steamwar.persistent.Subserver; +import de.steamwar.velocitycore.VelocityCore; import de.steamwar.velocitycore.network.NetworkSender; +import java.time.Duration; +import java.time.temporal.ChronoUnit; + public class VersionAnnouncer extends BasicListener { @Subscribe @@ -42,7 +46,9 @@ public class VersionAnnouncer extends BasicListener { int playerVersion = Via.getAPI().getPlayerVersion(player); String version = ProtocolVersion.getProtocolVersion(playerVersion).getVersionIntroducedIn(); // PluginChannel 'vv:proxy_details' from ViaVersion apparently does not work any longer! - NetworkSender.send(player, new ClientVersionPacket(player.getUniqueId(), Integer.parseInt(version.split("-")[0].split("\\.")[1]))); + VelocityCore.schedule(() -> { + NetworkSender.send(player, new ClientVersionPacket(player.getUniqueId(), Integer.parseInt(version.split("-")[0].split("\\.")[1]))); + }).delay(Duration.of(100, ChronoUnit.MILLIS)).schedule(); if(playerVersion == serverVersion) return; From 3f7cd48f27640a4c11c1b02a32d7f59351883a19 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 26 Jun 2025 22:01:56 +0200 Subject: [PATCH 16/17] Update sensible defaults for WorldEditRendererCUIEditor --- .../src/de/steamwar/core/WorldEditRendererCUIEditor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java index d03fcf41..e50eac9d 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditRendererCUIEditor.java @@ -39,8 +39,8 @@ public class WorldEditRendererCUIEditor { @AllArgsConstructor public enum Type { - SELECTION("cui_selection_material", "cui_selection_width", Material.PURPLE_CONCRETE, Width.LARGE), - CLIPBOARD("cui_clipboard_material", "cui_clipboard_width", Material.LIME_CONCRETE, Width.LARGE), + SELECTION("cui_selection_material", "cui_selection_width", Material.PURPLE_CONCRETE, Width.MEDIUM), + CLIPBOARD("cui_clipboard_material", "cui_clipboard_width", Material.LIME_CONCRETE, Width.SLIM), ; private final String configMaterial; From b6279fd7fa5918c10ac81251d6e1e975abc43d04 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 26 Jun 2025 22:06:38 +0200 Subject: [PATCH 17/17] Remove useless line of code --- SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java | 1 - 1 file changed, 1 deletion(-) diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java index 568c3e48..c2086b0b 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -127,6 +127,5 @@ public class Core extends JavaPlugin { errorHandler.unregister(); if(crashDetector.onMainThread()) Statement.closeAll(); - this.getServer().getMessenger().unregisterIncomingPluginChannel(this); } }