From 68fca66d8bb6b42208872a76dd2ff796efd3360d Mon Sep 17 00:00:00 2001 From: amy <144570677+amyavi@users.noreply.github.com> Date: Sun, 28 Sep 2025 12:47:34 -0300 Subject: [PATCH 1/3] chore: update paper-api to 1.21.10 --- pom.xml | 2 +- .../extras/commands/CommandUsername.java | 1 - .../modules/player/PlayerConnection.java | 36 +++++++++---------- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 1dc2f10e..11391344 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ io.papermc.paper paper-api - 1.21.7-R0.1-SNAPSHOT + 1.21.10-R0.1-SNAPSHOT provided diff --git a/src/main/java/pw/kaboom/extras/commands/CommandUsername.java b/src/main/java/pw/kaboom/extras/commands/CommandUsername.java index f0274b5d..696433b0 100644 --- a/src/main/java/pw/kaboom/extras/commands/CommandUsername.java +++ b/src/main/java/pw/kaboom/extras/commands/CommandUsername.java @@ -62,7 +62,6 @@ public boolean onCommand(final @Nonnull CommandSender sender, // Preserve UUIDs, as changing them breaks clients final PlayerProfile newProfile = Bukkit.createProfileExact(player.getUniqueId(), name); - newProfile.setProperties(player.getPlayerProfile().getProperties()); player.setPlayerProfile(newProfile); lastUsedMillis.put(player, System.currentTimeMillis()); diff --git a/src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java b/src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java index 41bb5feb..4dd8c802 100644 --- a/src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java +++ b/src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java @@ -1,8 +1,8 @@ package pw.kaboom.extras.modules.player; import com.destroystokyo.paper.event.profile.PreLookupProfileEvent; -import com.destroystokyo.paper.profile.ProfileProperty; import com.google.common.base.Charsets; +import io.papermc.paper.event.player.AsyncPlayerSpawnLocationEvent; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.title.Title; @@ -17,14 +17,12 @@ import org.bukkit.event.player.*; import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.plugin.java.JavaPlugin; -import org.spigotmc.event.player.PlayerSpawnLocationEvent; import pw.kaboom.extras.Main; import pw.kaboom.extras.modules.server.ServerTabComplete; import pw.kaboom.extras.modules.player.skin.SkinManager; import pw.kaboom.extras.util.Utility; import java.time.Duration; -import java.util.HashSet; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; @@ -133,21 +131,21 @@ void onPlayerLogin(final PlayerLoginEvent event) { } @EventHandler - void onPlayerSpawn(final PlayerSpawnLocationEvent event) { - if (RANDOMIZE_SPAWN - && event.getPlayer().getRespawnLocation() != event.getSpawnLocation()) { - final World world = event.getPlayer().getWorld(); - final ThreadLocalRandom random = ThreadLocalRandom.current(); - - final double teleportAmount = 500000D; - final Location location = new Location( - world, - random.nextDouble(-teleportAmount, teleportAmount), - 100, - random.nextDouble(-teleportAmount, teleportAmount) - ); - event.setSpawnLocation(location); - } + void onPlayerSpawn(final AsyncPlayerSpawnLocationEvent event) { + if (!RANDOMIZE_SPAWN || !event.isNewPlayer()) return; + + final World world = event.getSpawnLocation().getWorld(); + final ThreadLocalRandom random = ThreadLocalRandom.current(); + + final double teleportAmount = 500000D; + final Location location = new Location( + world, + random.nextDouble(-teleportAmount, teleportAmount), + 100, + random.nextDouble(-teleportAmount, teleportAmount) + ); + + event.setSpawnLocation(location); } @EventHandler @@ -163,7 +161,5 @@ void onPreLookupProfile(final PreLookupProfileEvent event) { UUID offlineUUID = UUID.nameUUIDFromBytes( ("OfflinePlayer:" + event.getName()).getBytes(Charsets.UTF_8)); event.setUUID(offlineUUID); - - event.setProfileProperties(new HashSet()); } } From 7cfb21cc34c95292ad216a06b5e8521368b49fa3 Mon Sep 17 00:00:00 2001 From: amy <144570677+amyavi@users.noreply.github.com> Date: Sun, 28 Sep 2025 14:08:31 -0300 Subject: [PATCH 2/3] feat: enforce command blocks enabled; disable spawners this also applies to trial spawners, unlike before :) --- .../extras/modules/server/ServerGameRule.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/pw/kaboom/extras/modules/server/ServerGameRule.java b/src/main/java/pw/kaboom/extras/modules/server/ServerGameRule.java index a239c9a0..ac5b81c5 100644 --- a/src/main/java/pw/kaboom/extras/modules/server/ServerGameRule.java +++ b/src/main/java/pw/kaboom/extras/modules/server/ServerGameRule.java @@ -13,6 +13,11 @@ import java.util.Map; public final class ServerGameRule implements Listener { + private static final Map, ?> FORCED_GAMERULES = Map.of( + GameRule.COMMAND_BLOCKS_ENABLED, true, + GameRule.SPAWNER_BLOCKS_ENABLED, false + ); + private static final Map, Integer> GAMERULE_LIMITS = Map.of( GameRule.RANDOM_TICK_SPEED, 6, GameRule.SPAWN_RADIUS, 100, @@ -20,10 +25,24 @@ public final class ServerGameRule implements Listener { GameRule.MAX_COMMAND_FORK_COUNT, EntitySpawn.MAX_ENTITIES_PER_WORLD ); + private static void setGameRule(final World world, final GameRule gameRule, + final Object value) { + assert value.getClass() == gameRule.getType(); + + //noinspection unchecked + world.setGameRule(gameRule, (T) value); + } + @EventHandler void onGameRuleChange(final WorldGameRuleChangeEvent event) { final GameRule gameRule = event.getGameRule(); + final Object forcedValue = FORCED_GAMERULES.get(gameRule); + if (forcedValue != null) { + event.setValue(forcedValue.toString()); + return; + } + final Integer limit = GAMERULE_LIMITS.get(gameRule); if (limit == null) { return; @@ -43,6 +62,13 @@ private static void enableAutoSave() { private static void fixGameRules() { for (final World world : Bukkit.getWorlds()) { + for (final var entry : FORCED_GAMERULES.entrySet()) { + final GameRule gameRule = entry.getKey(); + final Object value = entry.getValue(); + + setGameRule(world, gameRule, value); + } + for (final var entry : GAMERULE_LIMITS.entrySet()) { final GameRule gameRule = entry.getKey(); final int limit = entry.getValue(); From 70def560ab80c7caf579d4e4f99b4c97f9a8043e Mon Sep 17 00:00:00 2001 From: amy <144570677+amyavi@users.noreply.github.com> Date: Sun, 28 Sep 2025 16:40:35 -0300 Subject: [PATCH 3/3] fix: allow spawning in places other than default world --- .../kaboom/extras/commands/CommandSpawn.java | 25 +++---------------- .../extras/modules/player/PlayerDamage.java | 4 +-- .../java/pw/kaboom/extras/util/Utility.java | 15 +++++++++++ 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/main/java/pw/kaboom/extras/commands/CommandSpawn.java b/src/main/java/pw/kaboom/extras/commands/CommandSpawn.java index c0b5b0e4..69369779 100644 --- a/src/main/java/pw/kaboom/extras/commands/CommandSpawn.java +++ b/src/main/java/pw/kaboom/extras/commands/CommandSpawn.java @@ -1,15 +1,12 @@ package pw.kaboom.extras.commands; import net.kyori.adventure.text.Component; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent; +import pw.kaboom.extras.util.Utility; import javax.annotation.Nonnull; @@ -24,23 +21,7 @@ public boolean onCommand(final @Nonnull CommandSender sender, return true; } - final World defaultWorld = Bukkit.getWorld("world"); - final World world = (defaultWorld == null) ? Bukkit.getWorlds().get(0) : defaultWorld; - final Location spawnLocation = world.getSpawnLocation(); - final int maxWorldHeight = 256; - - for (double y = spawnLocation.getY(); y <= maxWorldHeight; y++) { - final Location yLocation = new Location(world, spawnLocation.getX(), y, - spawnLocation.getZ()); - final Block coordBlock = world.getBlockAt(yLocation); - - if (!coordBlock.getType().isSolid() - && !coordBlock.getRelative(BlockFace.UP).getType().isSolid()) { - player.teleportAsync(yLocation); - break; - } - } - + Utility.teleportToSpawn(player, PlayerTeleportEvent.TeleportCause.COMMAND); player.sendMessage(Component .text("Successfully moved to spawn")); return true; diff --git a/src/main/java/pw/kaboom/extras/modules/player/PlayerDamage.java b/src/main/java/pw/kaboom/extras/modules/player/PlayerDamage.java index b97eb4af..baaef0b3 100644 --- a/src/main/java/pw/kaboom/extras/modules/player/PlayerDamage.java +++ b/src/main/java/pw/kaboom/extras/modules/player/PlayerDamage.java @@ -19,6 +19,7 @@ import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import pw.kaboom.extras.util.Utility; @@ -103,8 +104,7 @@ void onPlayerDeath(final PlayerDeathEvent event) { if (player.getRespawnLocation() != null) { player.teleportAsync(player.getRespawnLocation()); } else { - final World world = Bukkit.getWorld("world"); - player.teleportAsync(world.getSpawnLocation()); + Utility.teleportToSpawn(player, PlayerTeleportEvent.TeleportCause.UNKNOWN); } } catch (Exception exception) { Utility.resetAttribute(player, Attribute.MAX_HEALTH); diff --git a/src/main/java/pw/kaboom/extras/util/Utility.java b/src/main/java/pw/kaboom/extras/util/Utility.java index 18f5dceb..5c3c1649 100644 --- a/src/main/java/pw/kaboom/extras/util/Utility.java +++ b/src/main/java/pw/kaboom/extras/util/Utility.java @@ -1,12 +1,15 @@ package pw.kaboom.extras.util; import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.attribute.Attributable; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; import org.bukkit.attribute.AttributeModifier; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -14,6 +17,18 @@ import java.util.function.Function; public final class Utility { + public static void teleportToSpawn(final Player player, + final PlayerTeleportEvent.TeleportCause cause) { + final World world = player.getServer().getRespawnWorld(); + final Location spawnLocation = world.getSpawnLocation(); + + final int y = world.getHighestBlockYAt(spawnLocation); + final Location location = new Location(world, + spawnLocation.x(), y + 1, spawnLocation.z(), + spawnLocation.getYaw(), spawnLocation.getPitch()); + player.teleportAsync(location, cause); + } + public static @Nullable Player getPlayerExactIgnoreCase(final String username) { return Bukkit.getOnlinePlayers() .stream()