From 88c18b6968673acc504f73f42b2d46ecb1af2101 Mon Sep 17 00:00:00 2001
From: amyavi <144570677+amyavi@users.noreply.github.com>
Date: Sat, 5 Jul 2025 23:07:54 -0300
Subject: [PATCH 1/6] chore: update paper-api to 1.21.7
---
pom.xml | 8 ++++----
.../pw/kaboom/extras/commands/CommandJumpscare.java | 2 +-
.../extras/modules/entity/EntityKnockback.java | 13 ++++++++++---
.../kaboom/extras/modules/entity/EntitySpawn.java | 8 ++++----
.../kaboom/extras/modules/player/PlayerDamage.java | 6 +++---
.../extras/modules/player/PlayerTeleport.java | 2 +-
6 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/pom.xml b/pom.xml
index 7e5a728d..1dc2f10e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,8 +5,8 @@
master
- 17
- 17
+ 21
+ 21
true
UTF-8
@@ -15,14 +15,14 @@
io.papermc.paper
paper-api
- 1.20.4-R0.1-SNAPSHOT
+ 1.21.7-R0.1-SNAPSHOT
provided
com.github.oshi
oshi-core
- 6.4.5
+ 6.6.5
provided
diff --git a/src/main/java/pw/kaboom/extras/commands/CommandJumpscare.java b/src/main/java/pw/kaboom/extras/commands/CommandJumpscare.java
index 049c84dd..ff1f6254 100644
--- a/src/main/java/pw/kaboom/extras/commands/CommandJumpscare.java
+++ b/src/main/java/pw/kaboom/extras/commands/CommandJumpscare.java
@@ -15,7 +15,7 @@
public final class CommandJumpscare implements CommandExecutor {
private void createJumpscare(final Player player) {
final int count = 4;
- player.spawnParticle(Particle.MOB_APPEARANCE, player.getLocation(), count);
+ player.spawnParticle(Particle.ELDER_GUARDIAN, player.getLocation(), count);
final int maxIterator = 10;
for (int i = 0; i <= maxIterator; i++) {
diff --git a/src/main/java/pw/kaboom/extras/modules/entity/EntityKnockback.java b/src/main/java/pw/kaboom/extras/modules/entity/EntityKnockback.java
index 67dd9eda..27c38a09 100644
--- a/src/main/java/pw/kaboom/extras/modules/entity/EntityKnockback.java
+++ b/src/main/java/pw/kaboom/extras/modules/entity/EntityKnockback.java
@@ -1,5 +1,6 @@
package pw.kaboom.extras.modules.entity;
+import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.EntityType;
import org.bukkit.event.EventHandler;
@@ -7,6 +8,7 @@
import org.bukkit.event.entity.ProjectileHitEvent;
import com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent;
+import org.bukkit.inventory.ItemStack;
public final class EntityKnockback implements Listener {
@EventHandler
@@ -14,7 +16,7 @@ void onEntityKnockbackByEntity(final EntityKnockbackByEntityEvent event) {
final int knockbackLimit = 60;
if (event.getKnockbackStrength() > knockbackLimit) {
- event.getAcceleration().multiply(
+ event.getKnockback().multiply(
knockbackLimit / event.getKnockbackStrength()
);
}
@@ -27,8 +29,13 @@ void onProjectileHit(final ProjectileHitEvent event) {
final Arrow arrow = (Arrow) event.getEntity();
final int knockbackLimit = 60;
- if (arrow.getKnockbackStrength() > knockbackLimit) {
- arrow.setKnockbackStrength(knockbackLimit);
+ final ItemStack weapon = arrow.getWeapon();
+ if (weapon == null) return;
+
+ if (weapon.getEnchantmentLevel(Enchantment.KNOCKBACK) > knockbackLimit) {
+ // replaces if already present
+ weapon.addUnsafeEnchantment(Enchantment.KNOCKBACK, knockbackLimit);
+ arrow.setWeapon(weapon);
}
}
}
diff --git a/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java b/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java
index 8d94ace8..bad8f5ce 100644
--- a/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java
+++ b/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java
@@ -87,7 +87,7 @@ private boolean isEntityLimitReached(final EntityType entityType, final Chunk ch
return true;
}
break;
- case PRIMED_TNT:
+ case TNT:
final int worldTntCount = world.getEntitiesByClass(TNTPrimed.class).size();
if (worldTntCount >= MAX_TNTS_PER_WORLD) {
@@ -131,7 +131,7 @@ private void limitSlimeSize(final Slime slime) {
}
private void limitSpawner(final CreatureSpawner spawner) {
- if (EntityType.MINECART_MOB_SPAWNER.equals(spawner.getSpawnedType())) {
+ if (EntityType.SPAWNER_MINECART.equals(spawner.getSpawnedType())) {
spawner.setSpawnedType(EntityType.MINECART);
}
@@ -159,7 +159,7 @@ void onAreaEffectCloudApply(final AreaEffectCloudApplyEvent event) {
@EventHandler
void onExplosionPrime(final ExplosionPrimeEvent event) {
- if (EntityType.MINECART_TNT.equals(event.getEntityType())
+ if (EntityType.TNT_MINECART.equals(event.getEntityType())
&& event.getEntity().getWorld()
.getEntitiesByClass(ExplosiveMinecart.class).size() > 80) {
event.setCancelled(true);
@@ -197,7 +197,7 @@ void onItemSpawn(final ItemSpawnEvent event) {
@EventHandler
void onLightningStrike(final LightningStrikeEvent event) {
final LightningStrike lightning = event.getLightning();
- final EntityType entityType = EntityType.LIGHTNING;
+ final EntityType entityType = EntityType.LIGHTNING_BOLT;
final Chunk chunk = lightning.getChunk();
final World world = event.getWorld();
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 534a9bb8..0e599600 100644
--- a/src/main/java/pw/kaboom/extras/modules/player/PlayerDamage.java
+++ b/src/main/java/pw/kaboom/extras/modules/player/PlayerDamage.java
@@ -50,7 +50,7 @@ void onEntityRegainHealth(final EntityRegainHealthEvent event) {
@EventHandler
void onFoodLevelChange(final FoodLevelChangeEvent event) {
final HumanEntity player = event.getEntity();
- final AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);
+ final AttributeInstance attribute = player.getAttribute(Attribute.MAX_HEALTH);
if (attribute == null) return;
if (attribute.getValue() <= 0) {
Utility.resetAttribute(attribute);
@@ -97,7 +97,7 @@ void onPlayerDeath(final PlayerDeathEvent event) {
xp.setExperience(event.getDroppedExp());
}
- final AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);
+ final AttributeInstance attribute = player.getAttribute(Attribute.MAX_HEALTH);
if (attribute != null) {
Utility.resetAttribute(attribute);
}
@@ -111,7 +111,7 @@ void onPlayerDeath(final PlayerDeathEvent event) {
player.teleportAsync(world.getSpawnLocation());
}
} catch (Exception exception) {
- final AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);
+ final AttributeInstance attribute = player.getAttribute(Attribute.MAX_HEALTH);
if (attribute != null) {
Utility.resetAttribute(attribute);
}
diff --git a/src/main/java/pw/kaboom/extras/modules/player/PlayerTeleport.java b/src/main/java/pw/kaboom/extras/modules/player/PlayerTeleport.java
index bc58b079..0c94ff2e 100644
--- a/src/main/java/pw/kaboom/extras/modules/player/PlayerTeleport.java
+++ b/src/main/java/pw/kaboom/extras/modules/player/PlayerTeleport.java
@@ -13,7 +13,7 @@ public final class PlayerTeleport implements Listener {
void onPlayerChangedWorld(final PlayerChangedWorldEvent event) {
final Player player = event.getPlayer();
- final AttributeInstance attribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);
+ final AttributeInstance attribute = player.getAttribute(Attribute.MAX_HEALTH);
if (attribute == null) return;
if (attribute.getValue() <= 0) {
Utility.resetAttribute(attribute);
From 99469ed02838ec75d954d9476ebdce146a20c552 Mon Sep 17 00:00:00 2001
From: amyavi <144570677+amyavi@users.noreply.github.com>
Date: Sun, 6 Jul 2025 00:13:56 -0300
Subject: [PATCH 2/6] refactor: cleanup knockback limits
---
.../modules/entity/EntityKnockback.java | 40 +++++--------------
1 file changed, 10 insertions(+), 30 deletions(-)
diff --git a/src/main/java/pw/kaboom/extras/modules/entity/EntityKnockback.java b/src/main/java/pw/kaboom/extras/modules/entity/EntityKnockback.java
index 27c38a09..b98fbf1b 100644
--- a/src/main/java/pw/kaboom/extras/modules/entity/EntityKnockback.java
+++ b/src/main/java/pw/kaboom/extras/modules/entity/EntityKnockback.java
@@ -1,42 +1,22 @@
package pw.kaboom.extras.modules.entity;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.entity.Arrow;
-import org.bukkit.entity.EntityType;
+import io.papermc.paper.event.entity.EntityKnockbackEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
-import org.bukkit.event.entity.ProjectileHitEvent;
-import com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent;
-import org.bukkit.inventory.ItemStack;
+import org.bukkit.util.Vector;
public final class EntityKnockback implements Listener {
- @EventHandler
- void onEntityKnockbackByEntity(final EntityKnockbackByEntityEvent event) {
- final int knockbackLimit = 60;
-
- if (event.getKnockbackStrength() > knockbackLimit) {
- event.getKnockback().multiply(
- knockbackLimit / event.getKnockbackStrength()
- );
- }
- }
+ private static final double KNOCKBACK_LIMIT = 20; // translates to enchantment level 40
+ private static final double KNOCKBACK_LIMIT_SQUARED = KNOCKBACK_LIMIT * KNOCKBACK_LIMIT;
@EventHandler
- void onProjectileHit(final ProjectileHitEvent event) {
- if (event.getHitEntity() != null
- && EntityType.ARROW.equals(event.getEntityType())) {
- final Arrow arrow = (Arrow) event.getEntity();
- final int knockbackLimit = 60;
-
- final ItemStack weapon = arrow.getWeapon();
- if (weapon == null) return;
-
- if (weapon.getEnchantmentLevel(Enchantment.KNOCKBACK) > knockbackLimit) {
- // replaces if already present
- weapon.addUnsafeEnchantment(Enchantment.KNOCKBACK, knockbackLimit);
- arrow.setWeapon(weapon);
- }
+ void onEntityKnockbackByEntity(final EntityKnockbackEvent event) {
+ final Vector knockback = event.getKnockback();
+ final double length = knockback.lengthSquared();
+ if (length > KNOCKBACK_LIMIT_SQUARED) {
+ event.setKnockback(knockback.normalize()
+ .multiply(KNOCKBACK_LIMIT));
}
}
}
From c7b7563f5d06d6767ef8fdbb4445236695d1656f Mon Sep 17 00:00:00 2001
From: amyavi <144570677+amyavi@users.noreply.github.com>
Date: Sun, 6 Jul 2025 00:15:43 -0300
Subject: [PATCH 3/6] refactor: remove BlockPhysicsEvent check
I don't think this ever worked, and the thing it was trying to solve was patched in papermixins already.
---
.../extras/modules/block/BlockPhysics.java | 19 -------------------
1 file changed, 19 deletions(-)
diff --git a/src/main/java/pw/kaboom/extras/modules/block/BlockPhysics.java b/src/main/java/pw/kaboom/extras/modules/block/BlockPhysics.java
index f6f5405e..37314aa3 100644
--- a/src/main/java/pw/kaboom/extras/modules/block/BlockPhysics.java
+++ b/src/main/java/pw/kaboom/extras/modules/block/BlockPhysics.java
@@ -6,7 +6,6 @@
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockFormEvent;
-import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.BlockRedstoneEvent;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.scheduler.BukkitScheduler;
@@ -18,24 +17,6 @@ public final class BlockPhysics implements Listener {
// from crashing the server
private static double tps = 20;
- @EventHandler
- void onBlockPhysics(final BlockPhysicsEvent event) {
- try {
- switch (event.getChangedType()) {
- case COMMAND_BLOCK:
- case CHAIN_COMMAND_BLOCK:
- case REPEATING_COMMAND_BLOCK:
- if (Material.STRUCTURE_BLOCK.equals(event.getSourceBlock().getType())) {
- event.setCancelled(true);
- }
- default:
- break;
- }
- } catch (Exception | StackOverflowError e) {
- event.setCancelled(true);
- }
- }
-
@EventHandler
void onBlockRedstone(final BlockRedstoneEvent event) {
if (tps < MINIMUM_TPS) {
From f217f7c722a71d323e5c311fd7cbf91480522f0c Mon Sep 17 00:00:00 2001
From: amyavi <144570677+amyavi@users.noreply.github.com>
Date: Sun, 6 Jul 2025 00:33:33 -0300
Subject: [PATCH 4/6] fix: properly apply spawner limits
Makes it check if the delay is _above_ 1000 and removes the unnecessary blockstate clone.
---
.../kaboom/extras/modules/entity/EntitySpawn.java | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java b/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java
index bad8f5ce..0a176b60 100644
--- a/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java
+++ b/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java
@@ -135,20 +135,20 @@ private void limitSpawner(final CreatureSpawner spawner) {
spawner.setSpawnedType(EntityType.MINECART);
}
- if (spawner.getDelay() > 100) {
- spawner.setMaxSpawnDelay(100);
- spawner.setDelay(100);
- spawner.update();
+ if (spawner.getMinSpawnDelay() < 1000) {
+ spawner.setMinSpawnDelay(1000);
+ }
+
+ if (spawner.getMaxSpawnDelay() < 1000) {
+ spawner.setMaxSpawnDelay(1000);
}
if (spawner.getSpawnCount() > 200) {
spawner.setSpawnCount(200);
- spawner.update();
}
if (spawner.getSpawnRange() > 50) {
spawner.setSpawnRange(50);
- spawner.update();
}
}
@@ -220,7 +220,7 @@ void onPreCreatureSpawn(final PreCreatureSpawnEvent event) {
@EventHandler
void onPreSpawnerSpawn(final PreSpawnerSpawnEvent event) {
try {
- limitSpawner((CreatureSpawner) event.getSpawnerLocation().getBlock().getState());
+ limitSpawner((CreatureSpawner) event.getSpawnerLocation().getBlock().getState(false));
} catch (Exception exception) {
event.setCancelled(true);
}
From 1e706a44eb0175d90239436c756525041a089b99 Mon Sep 17 00:00:00 2001
From: amyavi <144570677+amyavi@users.noreply.github.com>
Date: Sun, 6 Jul 2025 01:27:56 -0300
Subject: [PATCH 5/6] fix: don't try changing the blockstate of spawner
minecarts
---
.../java/pw/kaboom/extras/modules/entity/EntitySpawn.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java b/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java
index 0a176b60..99a418d7 100644
--- a/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java
+++ b/src/main/java/pw/kaboom/extras/modules/entity/EntitySpawn.java
@@ -231,8 +231,10 @@ void onSpawnerSpawn(final SpawnerSpawnEvent event) {
if (EntityType.FALLING_BLOCK.equals(event.getEntityType())) {
final FallingBlock block = (FallingBlock) event.getEntity();
- if (block.getBlockData().getMaterial().equals(Material.SPAWNER)) {
- event.setCancelled(true);
+ if (!block.getBlockData().getMaterial().equals(Material.SPAWNER)) return;
+ event.setCancelled(true);
+
+ if (event.getSpawner() != null) {
event.getSpawner().setSpawnedType(EntityType.FALLING_BLOCK);
}
}
From c915594d7e66fef381df4262edcf4de9ee32a967 Mon Sep 17 00:00:00 2001
From: amyavi <144570677+amyavi@users.noreply.github.com>
Date: Sun, 6 Jul 2025 01:33:21 -0300
Subject: [PATCH 6/6] refactor: fix most deprecation warnings
---
.../kaboom/extras/commands/CommandBroadcastVanilla.java | 6 +++---
.../java/pw/kaboom/extras/commands/CommandEnchantAll.java | 8 +++++++-
src/main/java/pw/kaboom/extras/commands/CommandPing.java | 2 +-
.../pw/kaboom/extras/modules/player/PlayerConnection.java | 2 +-
.../pw/kaboom/extras/modules/player/PlayerDamage.java | 4 ++--
src/main/resources/plugin.yml | 2 +-
6 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/src/main/java/pw/kaboom/extras/commands/CommandBroadcastVanilla.java b/src/main/java/pw/kaboom/extras/commands/CommandBroadcastVanilla.java
index 78ea956b..c7782f33 100644
--- a/src/main/java/pw/kaboom/extras/commands/CommandBroadcastVanilla.java
+++ b/src/main/java/pw/kaboom/extras/commands/CommandBroadcastVanilla.java
@@ -33,10 +33,10 @@ public boolean onCommand(final @Nonnull CommandSender sender,
final Component senderName = sender.name();
final String input = String.join(" ", args);
final Component component = LEGACY_COMPONENT_SERIALIZER.deserialize(input);
- final Component broadcastComponent = Component.translatable("chat.type.admin")
+ final Component broadcastComponent =
+ Component.translatable("chat.type.admin", senderName, component)
.decorate(TextDecoration.ITALIC)
- .color(NamedTextColor.GRAY)
- .args(senderName, component);
+ .color(NamedTextColor.GRAY);
sender.sendMessage(component);
diff --git a/src/main/java/pw/kaboom/extras/commands/CommandEnchantAll.java b/src/main/java/pw/kaboom/extras/commands/CommandEnchantAll.java
index 70e64e2a..bd479164 100644
--- a/src/main/java/pw/kaboom/extras/commands/CommandEnchantAll.java
+++ b/src/main/java/pw/kaboom/extras/commands/CommandEnchantAll.java
@@ -1,13 +1,17 @@
package pw.kaboom.extras.commands;
+import io.papermc.paper.registry.RegistryAccess;
+import io.papermc.paper.registry.RegistryKey;
import net.kyori.adventure.text.Component;
import org.bukkit.Material;
+import org.bukkit.Registry;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
import javax.annotation.Nonnull;
@@ -30,7 +34,9 @@ public boolean onCommand(final @Nonnull CommandSender sender,
return true;
}
- for (Enchantment enchantment : Enchantment.values()) {
+ final Registry<@NotNull Enchantment> registry = RegistryAccess.registryAccess()
+ .getRegistry(RegistryKey.ENCHANTMENT);
+ for (Enchantment enchantment : registry) {
item.addUnsafeEnchantment(enchantment, Short.MAX_VALUE);
}
player.sendMessage(Component
diff --git a/src/main/java/pw/kaboom/extras/commands/CommandPing.java b/src/main/java/pw/kaboom/extras/commands/CommandPing.java
index 7ef81183..bd4ba14f 100644
--- a/src/main/java/pw/kaboom/extras/commands/CommandPing.java
+++ b/src/main/java/pw/kaboom/extras/commands/CommandPing.java
@@ -30,7 +30,7 @@ public boolean onCommand(final @Nonnull CommandSender sender,
return true;
}
- final int ping = target.spigot().getPing();
+ final int ping = target.getPing();
final int d = (int) Math.floor((float) ping / 100);
NamedTextColor highlighting = NamedTextColor.WHITE;
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 186ef211..41bb5feb 100644
--- a/src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java
+++ b/src/main/java/pw/kaboom/extras/modules/player/PlayerConnection.java
@@ -135,7 +135,7 @@ void onPlayerLogin(final PlayerLoginEvent event) {
@EventHandler
void onPlayerSpawn(final PlayerSpawnLocationEvent event) {
if (RANDOMIZE_SPAWN
- && event.getPlayer().getBedSpawnLocation() != event.getSpawnLocation()) {
+ && event.getPlayer().getRespawnLocation() != event.getSpawnLocation()) {
final World world = event.getPlayer().getWorld();
final ThreadLocalRandom random = ThreadLocalRandom.current();
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 0e599600..f3c04bdf 100644
--- a/src/main/java/pw/kaboom/extras/modules/player/PlayerDamage.java
+++ b/src/main/java/pw/kaboom/extras/modules/player/PlayerDamage.java
@@ -104,8 +104,8 @@ void onPlayerDeath(final PlayerDeathEvent event) {
player.setHealth(20);
- if (player.getBedSpawnLocation() != null) {
- player.teleportAsync(player.getBedSpawnLocation());
+ if (player.getRespawnLocation() != null) {
+ player.teleportAsync(player.getRespawnLocation());
} else {
final World world = Bukkit.getWorld("world");
player.teleportAsync(world.getSpawnLocation());
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index af498ea9..2db20c4c 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,7 +1,7 @@
name: Extras
main: pw.kaboom.extras.Main
description: Plugin that adds extra functionality to the server.
-api-version: '1.19'
+api-version: '1.21'
version: master
commands: