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()