From 8a5cd403f31a3d2d6acf78a56d88f77dc45ce378 Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Sat, 11 May 2024 13:29:15 -0500 Subject: [PATCH] add more patches --- build-data/dev-imports.txt | 5 +- gradle.properties | 2 +- ...7-Don-t-log-invalid-teams-to-console.patch | 19 +++ ...f-bounds-HangingEntity-crash-exploit.patch | 24 +++ .../0019-Add-MasterBlockFireEvent.patch | 141 ++++++++++++++++++ .../0020-Add-spectator-teleport-event.patch | 32 ++++ ...021-Prevent-invalid-container-events.patch | 37 +++++ ...ck-entity-entity-tag-query-positions.patch | 31 ++++ ...t-legacy-messages-over-1k-characters.patch | 18 +++ ...vents-on-Signs-bypassing-permissions.patch | 59 ++++++++ ...-Patch-large-selector-distance-crash.patch | 76 ++++++++++ 11 files changed, 442 insertions(+), 2 deletions(-) create mode 100644 patches/server/0017-Don-t-log-invalid-teams-to-console.patch create mode 100644 patches/server/0018-Fixes-out-of-bounds-HangingEntity-crash-exploit.patch create mode 100644 patches/server/0019-Add-MasterBlockFireEvent.patch create mode 100644 patches/server/0020-Add-spectator-teleport-event.patch create mode 100644 patches/server/0021-Prevent-invalid-container-events.patch create mode 100644 patches/server/0022-Validate-block-entity-entity-tag-query-positions.patch create mode 100644 patches/server/0023-Refuse-to-convert-legacy-messages-over-1k-characters.patch create mode 100644 patches/server/0024-Fix-ClickEvents-on-Signs-bypassing-permissions.patch create mode 100644 patches/server/0025-Patch-large-selector-distance-crash.patch diff --git a/build-data/dev-imports.txt b/build-data/dev-imports.txt index 6defb1a..885a6ff 100644 --- a/build-data/dev-imports.txt +++ b/build-data/dev-imports.txt @@ -17,4 +17,7 @@ minecraft net.minecraft.network.chat.contents.EntityDataSource minecraft net.minecraft.network.chat.contents.DataSource minecraft net.minecraft.nbt.SnbtPrinterTagVisitor minecraft net.minecraft.nbt.StringTagVisitor -minecraft net.minecraft.nbt.TextComponentTagVisitor \ No newline at end of file +minecraft net.minecraft.nbt.TextComponentTagVisitor +minecraft net.minecraft.world.level.block.entity.StructureBlockEntity +minecraft net.minecraft.world.ContainerHelper +minecraft net.minecraft.advancements.critereon.MinMaxBounds \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index e245595..633e905 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=me.totalfreedom.scissors version=1.20.6-R0.1-SNAPSHOT mcVersion=1.20.6 -paperRef=5729b294eef2ffde690f73c5b14a64a31f301084 +paperRef=6c02dbcfa137f40418fc56a0a85721b1fa0242ff org.gradle.caching=true org.gradle.parallel=true diff --git a/patches/server/0017-Don-t-log-invalid-teams-to-console.patch b/patches/server/0017-Don-t-log-invalid-teams-to-console.patch new file mode 100644 index 0000000..a0f3661 --- /dev/null +++ b/patches/server/0017-Don-t-log-invalid-teams-to-console.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Telesphoreo +Date: Sat, 11 May 2024 12:24:26 -0500 +Subject: [PATCH] Don't log invalid teams to console + + +diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java +index 8ff815b1bb77eab735c65fa9c6bf469dca8562c4..8768ab338836569d53e0a70cc5f097b5a6d721ec 100644 +--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +@@ -901,7 +901,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + boolean flag = scoreboardteam != null && scoreboard.addPlayerToTeam(this.getStringUUID(), scoreboardteam); + + if (!flag) { +- LivingEntity.LOGGER.warn("Unable to add mob to team \"{}\" (that team probably doesn't exist)", s); ++ // Scissors - Prevent log spam possible with this error message, easily provokable by players in creative. + } + } + diff --git a/patches/server/0018-Fixes-out-of-bounds-HangingEntity-crash-exploit.patch b/patches/server/0018-Fixes-out-of-bounds-HangingEntity-crash-exploit.patch new file mode 100644 index 0000000..3c341f8 --- /dev/null +++ b/patches/server/0018-Fixes-out-of-bounds-HangingEntity-crash-exploit.patch @@ -0,0 +1,24 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Video +Date: Fri, 19 Aug 2022 00:49:38 -0600 +Subject: [PATCH] Fixes out of bounds HangingEntity crash exploit + + +diff --git a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java +index bf2d91bbb4bf401696f5f5d14a67e3920a179084..e31102bb56fac4ffc1e114cc8ea2075af0f92e7f 100644 +--- a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java +@@ -279,6 +279,13 @@ public abstract class HangingEntity extends Entity { + public void readAdditionalSaveData(CompoundTag nbt) { + BlockPos blockposition = new BlockPos(nbt.getInt("TileX"), nbt.getInt("TileY"), nbt.getInt("TileZ")); + ++ // Scissors start - Fixes exploit where bad TileX, TileY, and TileZ coordinates can crash servers ++ if (level().isLoadedAndInBounds(blockposition)) ++ { ++ this.pos = blockposition; ++ } ++ // Scissors end ++ + if (!blockposition.closerThan(this.blockPosition(), 16.0D)) { + HangingEntity.LOGGER.error("Hanging entity at invalid position: {}", blockposition); + } else { diff --git a/patches/server/0019-Add-MasterBlockFireEvent.patch b/patches/server/0019-Add-MasterBlockFireEvent.patch new file mode 100644 index 0000000..028947e --- /dev/null +++ b/patches/server/0019-Add-MasterBlockFireEvent.patch @@ -0,0 +1,141 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Telesphoreo +Date: Sat, 11 May 2024 12:31:03 -0500 +Subject: [PATCH] Add MasterBlockFireEvent + + +diff --git a/src/main/java/net/minecraft/world/level/block/CommandBlock.java b/src/main/java/net/minecraft/world/level/block/CommandBlock.java +index ec1a8c60ccac50e5131f937c4262128fd2768331..385c73cc952caea21f6ebf5512fdf72bf121b953 100644 +--- a/src/main/java/net/minecraft/world/level/block/CommandBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/CommandBlock.java +@@ -4,6 +4,7 @@ import com.mojang.logging.LogUtils; + import com.mojang.serialization.Codec; + import com.mojang.serialization.MapCodec; + import com.mojang.serialization.codecs.RecordCodecBuilder; ++import me.totalfreedom.scissors.event.block.MasterBlockFireEvent; + import net.minecraft.core.BlockPos; + import net.minecraft.core.Direction; + import net.minecraft.core.component.DataComponents; +@@ -27,6 +28,7 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; + import net.minecraft.world.level.block.state.properties.BooleanProperty; + import net.minecraft.world.level.block.state.properties.DirectionProperty; + import net.minecraft.world.phys.BlockHitResult; ++import org.bukkit.Location; + import org.slf4j.Logger; + + import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit +@@ -128,6 +130,13 @@ public class CommandBlock extends BaseEntityBlock implements GameMasterBlock { + } + + private void execute(BlockState state, Level world, BlockPos pos, BaseCommandBlock executor, boolean hasCommand) { ++ // Scissors start - Add master block fire event ++ final MasterBlockFireEvent event = new MasterBlockFireEvent(new Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ())); ++ if (!event.callEvent()) { ++ return; ++ } ++ // Scissors end ++ + if (hasCommand) { + executor.performCommand(world); + } else { +diff --git a/src/main/java/net/minecraft/world/level/block/entity/JigsawBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/JigsawBlockEntity.java +index 922592f2073eaea8ca361a3a1efcda8b18bea21c..7fec97a00f271eca29beca0ec0862de4036dd546 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/JigsawBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/JigsawBlockEntity.java +@@ -2,6 +2,8 @@ package net.minecraft.world.level.block.entity; + + import java.util.Arrays; + import java.util.Optional; ++ ++import me.totalfreedom.scissors.event.block.MasterBlockFireEvent; + import net.minecraft.core.BlockPos; + import net.minecraft.core.Holder; + import net.minecraft.core.HolderLookup; +@@ -18,6 +20,7 @@ import net.minecraft.world.level.block.JigsawBlock; + import net.minecraft.world.level.block.state.BlockState; + import net.minecraft.world.level.levelgen.structure.pools.JigsawPlacement; + import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; ++import org.bukkit.Location; + + public class JigsawBlockEntity extends BlockEntity { + public static final String TARGET = "target"; +@@ -135,6 +138,14 @@ public class JigsawBlockEntity extends BlockEntity { + } + + public void generate(ServerLevel world, int maxDepth, boolean keepJigsaws) { ++ // Scissors start - Add master block fire event ++ final BlockPos pos = this.getBlockPos(); ++ final MasterBlockFireEvent event = new MasterBlockFireEvent(new Location(this.getLevel().getWorld(), pos.getX(), pos.getY(), pos.getZ())); ++ if (!event.callEvent()) { ++ return; ++ } ++ // Scissors end ++ + BlockPos blockPos = this.getBlockPos().relative(this.getBlockState().getValue(JigsawBlock.ORIENTATION).front()); + Registry registry = world.registryAccess().registryOrThrow(Registries.TEMPLATE_POOL); + // Paper start - Replace getHolderOrThrow with a null check +diff --git a/src/main/java/net/minecraft/world/level/block/entity/StructureBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/StructureBlockEntity.java +index ab3e35069a069040f72900a9581f41848e4c4653..d390b05486dcaa563269500b350aecd9dfa3bc28 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/StructureBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/StructureBlockEntity.java +@@ -5,6 +5,8 @@ import java.util.Objects; + import java.util.Optional; + import java.util.stream.Stream; + import javax.annotation.Nullable; ++ ++import me.totalfreedom.scissors.event.block.MasterBlockFireEvent; + import net.minecraft.ResourceLocationException; + import net.minecraft.Util; + import net.minecraft.core.BlockPos; +@@ -30,6 +32,7 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.BlockRotProce + import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; + import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; + import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; ++import org.bukkit.Location; + + public class StructureBlockEntity extends BlockEntity { + private static final int SCAN_CORNER_BLOCKS_RANGE = 5; +@@ -317,6 +320,14 @@ public class StructureBlockEntity extends BlockEntity { + if (this.structureName == null) { + return false; + } else { ++ // Scissors start - Add master block fire event ++ final BlockPos pos = this.getBlockPos(); ++ final MasterBlockFireEvent event = new MasterBlockFireEvent(new Location(this.getLevel().getWorld(), pos.getX(), pos.getY(), pos.getZ())); ++ if (!event.callEvent()) { ++ return false; ++ } ++ // Scissors end ++ + BlockPos blockPos = this.getBlockPos().offset(this.structurePos); + ServerLevel serverLevel = (ServerLevel)this.level; + StructureTemplateManager structureTemplateManager = serverLevel.getStructureManager(); +@@ -368,6 +379,13 @@ public class StructureBlockEntity extends BlockEntity { + if (structureTemplate == null) { + return false; + } else { ++ // Scissors start - Add master block fire event ++ final BlockPos blockPos = this.getBlockPos(); ++ final MasterBlockFireEvent event = new MasterBlockFireEvent(new Location(this.getLevel().getWorld(), blockPos.getX(), blockPos.getY(), blockPos.getZ())); ++ if (!event.callEvent()) { ++ return false; ++ } ++ // Scissors end + this.loadStructureInfo(structureTemplate); + return true; + } +@@ -408,6 +426,14 @@ public class StructureBlockEntity extends BlockEntity { + } + + public void unloadStructure() { ++ // Scissors start - Add master block fire event ++ final BlockPos blockPos = this.getBlockPos(); ++ final MasterBlockFireEvent event = new MasterBlockFireEvent(new Location(this.getLevel().getWorld(), blockPos.getX(), blockPos.getY(), blockPos.getZ())); ++ ++ if (!event.callEvent()) { ++ return; ++ } ++ // Scissors end + if (this.structureName != null) { + ServerLevel serverLevel = (ServerLevel)this.level; + StructureTemplateManager structureTemplateManager = serverLevel.getStructureManager(); diff --git a/patches/server/0020-Add-spectator-teleport-event.patch b/patches/server/0020-Add-spectator-teleport-event.patch new file mode 100644 index 0000000..1e07d1e --- /dev/null +++ b/patches/server/0020-Add-spectator-teleport-event.patch @@ -0,0 +1,32 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Telesphoreo +Date: Sat, 11 May 2024 13:02:20 -0500 +Subject: [PATCH] Add spectator teleport event + + +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 5e9202bc7fc649764568b55d66ba0d684118c00c..31a6be18075723eb53fd1cbb664429e49909cf66 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -29,6 +29,8 @@ import java.util.function.Consumer; + import java.util.stream.Collectors; + import java.util.stream.Stream; + import javax.annotation.Nullable; ++ ++import me.totalfreedom.scissors.event.player.SpectatorTeleportEvent; + import net.minecraft.ChatFormatting; + import net.minecraft.Util; + import net.minecraft.advancements.AdvancementHolder; +@@ -2033,6 +2035,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + Entity entity = packet.getEntity(worldserver); + + if (entity != null) { ++ // Scissors start - Add spectator teleport event ++ final SpectatorTeleportEvent event = new SpectatorTeleportEvent(this.player.getBukkitEntity(), entity.getBukkitEntity()); ++ if (!event.callEvent()) { ++ return; ++ } ++ // Scissors end + this.player.teleportTo(worldserver, entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot(), org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.SPECTATE); // CraftBukkit + return; + } diff --git a/patches/server/0021-Prevent-invalid-container-events.patch b/patches/server/0021-Prevent-invalid-container-events.patch new file mode 100644 index 0000000..3a4031b --- /dev/null +++ b/patches/server/0021-Prevent-invalid-container-events.patch @@ -0,0 +1,37 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Telesphoreo +Date: Sat, 11 May 2024 13:04:21 -0500 +Subject: [PATCH] Prevent invalid container events + + +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 31a6be18075723eb53fd1cbb664429e49909cf66..65284355b6fc97eb1967e5c6fd51bc5b018e3e29 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -31,6 +31,7 @@ import java.util.stream.Stream; + import javax.annotation.Nullable; + + import me.totalfreedom.scissors.event.player.SpectatorTeleportEvent; ++import net.kyori.adventure.text.format.NamedTextColor; + import net.minecraft.ChatFormatting; + import net.minecraft.Util; + import net.minecraft.advancements.AdvancementHolder; +@@ -2981,6 +2982,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + return; + } + ++ // Scissors start - Do not call events when the slot/button number is invalid ++ final int sentSlotNum = packet.getSlotNum(); ++ if((Mth.clamp(sentSlotNum, -1, this.player.containerMenu.slots.size() - 1) != sentSlotNum) && sentSlotNum != -999) ++ { ++ this.getCraftPlayer().kick( ++ net.kyori.adventure.text.Component.text("Invalid container click slot (Hacking?)") ++ .color(NamedTextColor.RED) ++ ); ++ return; ++ } ++ // Scissors end ++ + InventoryView inventory = this.player.containerMenu.getBukkitView(); + SlotType type = inventory.getSlotType(packet.getSlotNum()); + diff --git a/patches/server/0022-Validate-block-entity-entity-tag-query-positions.patch b/patches/server/0022-Validate-block-entity-entity-tag-query-positions.patch new file mode 100644 index 0000000..e48e33e --- /dev/null +++ b/patches/server/0022-Validate-block-entity-entity-tag-query-positions.patch @@ -0,0 +1,31 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Telesphoreo +Date: Sat, 11 May 2024 13:08:40 -0500 +Subject: [PATCH] Validate block entity/entity tag query positions + + +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 65284355b6fc97eb1967e5c6fd51bc5b018e3e29..26eb85c9be17fcac00a5f31c2ede3111319c4044 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -1266,7 +1266,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + if (this.player.hasPermissions(2)) { + Entity entity = this.player.level().getEntity(packet.getEntityId()); + +- if (entity != null) { ++ if (entity != null && this.player.distanceToSqr(entity.position().x, entity.position().y, entity.position().z) < 32 * 32) { // Scissors - Validate entity tag query positions + CompoundTag nbttagcompound = entity.saveWithoutId(new CompoundTag()); + + this.player.connection.send(new ClientboundTagQueryPacket(packet.getTransactionId(), nbttagcompound)); +@@ -1298,7 +1298,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + @Override + public void handleBlockEntityTagQuery(ServerboundBlockEntityTagQueryPacket packet) { + PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); +- if (this.player.hasPermissions(2)) { ++ // Scissors start - Validate block entity tag query positions ++ if (this.player.hasPermissions(2) && this.player.level().isLoadedAndInBounds(packet.getPos()) ++ && this.player.distanceToSqr(packet.getPos().getX(), packet.getPos().getY(), packet.getPos().getZ()) < 32 * 32) { ++ // Scissors end + BlockEntity tileentity = this.player.level().getBlockEntity(packet.getPos()); + CompoundTag nbttagcompound = tileentity != null ? tileentity.saveWithoutMetadata(this.player.registryAccess()) : null; + diff --git a/patches/server/0023-Refuse-to-convert-legacy-messages-over-1k-characters.patch b/patches/server/0023-Refuse-to-convert-legacy-messages-over-1k-characters.patch new file mode 100644 index 0000000..0b27961 --- /dev/null +++ b/patches/server/0023-Refuse-to-convert-legacy-messages-over-1k-characters.patch @@ -0,0 +1,18 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Telesphoreo +Date: Sat, 11 May 2024 13:09:44 -0500 +Subject: [PATCH] Refuse to convert legacy messages over 1k characters + + +diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java +index 42ab6e0ba77fb2f0350bee72488e905074989b4d..4785dc2467ade8cad5c92c3d734cf6b2877a2693 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java +@@ -207,6 +207,7 @@ public final class CraftChatMessage { + } + + public static Component[] fromString(String message, boolean keepNewlines, boolean plain) { ++ if (message.length() > 1_000) return new Component[]{Component.empty()}; // Scissors - Refuse to convert legacy messages over 1k characters + return new StringMessage(message, keepNewlines, plain).getOutput(); + } + diff --git a/patches/server/0024-Fix-ClickEvents-on-Signs-bypassing-permissions.patch b/patches/server/0024-Fix-ClickEvents-on-Signs-bypassing-permissions.patch new file mode 100644 index 0000000..0d0869c --- /dev/null +++ b/patches/server/0024-Fix-ClickEvents-on-Signs-bypassing-permissions.patch @@ -0,0 +1,59 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Telesphoreo +Date: Sat, 11 May 2024 13:11:20 -0500 +Subject: [PATCH] Fix ClickEvents on Signs bypassing permissions + + +diff --git a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java +index a28be7a332659be655f419d969e0c64e659b6c21..7867f88fdb7ed0b644ab7c4e3c971d1164feea7a 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java +@@ -9,8 +9,11 @@ import java.util.Objects; + import java.util.UUID; + import java.util.function.UnaryOperator; + import javax.annotation.Nullable; ++ ++import me.totalfreedom.scissors.ScissorsConfig; + import net.minecraft.commands.CommandSource; + import net.minecraft.commands.CommandSourceStack; ++import net.minecraft.commands.Commands; + import net.minecraft.core.BlockPos; + import net.minecraft.core.HolderLookup; + import net.minecraft.nbt.CompoundTag; +@@ -21,6 +24,7 @@ import net.minecraft.network.chat.Component; + import net.minecraft.network.chat.ComponentUtils; + import net.minecraft.network.chat.Style; + import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; ++import net.minecraft.server.MinecraftServer; + import net.minecraft.server.level.ServerLevel; + import net.minecraft.server.level.ServerPlayer; + import net.minecraft.server.network.FilteredText; +@@ -34,6 +38,8 @@ import net.minecraft.world.level.block.SignBlock; + import net.minecraft.world.level.block.state.BlockState; + import net.minecraft.world.phys.Vec2; + import net.minecraft.world.phys.Vec3; ++import org.bukkit.craftbukkit.CraftServer; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; + import org.slf4j.Logger; + import org.bukkit.block.sign.Side; + import org.bukkit.craftbukkit.block.CraftBlock; +@@ -290,6 +296,19 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C + } + player.getServer().getCommands().performPrefixedCommand(this.createCommandSourceStack(((org.bukkit.craftbukkit.entity.CraftPlayer) event.getPlayer()).getHandle(), world, pos), event.getMessage()); + // Paper end - Fix commands from signs not firing command events ++ // Scissors start - Add optional permissions to command signs ++ final MinecraftServer vanillaServer = player.getServer(); ++ final CraftServer craftServer = vanillaServer.server; ++ final CraftHumanEntity craftPlayer = player.getBukkitEntity(); ++ final Commands commands = vanillaServer.getCommands(); ++ ++ if (ScissorsConfig.commandSignsBypassPermissions) { ++ commands.performPrefixedCommand(this.createCommandSourceStack(((org.bukkit.craftbukkit.entity.CraftPlayer) event.getPlayer()).getHandle(), world, pos), event.getMessage()); ++ } ++ else { ++ craftServer.dispatchCommand(craftPlayer, command.substring(1)); ++ } ++ // Scissors end + flag1 = true; + } + } diff --git a/patches/server/0025-Patch-large-selector-distance-crash.patch b/patches/server/0025-Patch-large-selector-distance-crash.patch new file mode 100644 index 0000000..65a5785 --- /dev/null +++ b/patches/server/0025-Patch-large-selector-distance-crash.patch @@ -0,0 +1,76 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Telesphoreo +Date: Sat, 11 May 2024 13:18:03 -0500 +Subject: [PATCH] Patch large selector distance crash + + +diff --git a/src/main/java/net/minecraft/advancements/critereon/MinMaxBounds.java b/src/main/java/net/minecraft/advancements/critereon/MinMaxBounds.java +index 060c0ffe57a4648598870c6168be203bf3a8634d..5c697e5d85c5c65af0ec969dbd68c38e876fc02f 100644 +--- a/src/main/java/net/minecraft/advancements/critereon/MinMaxBounds.java ++++ b/src/main/java/net/minecraft/advancements/critereon/MinMaxBounds.java +@@ -121,11 +121,11 @@ public interface MinMaxBounds { + public static record Doubles(@Override Optional min, @Override Optional max, Optional minSq, Optional maxSq) + implements MinMaxBounds { + public static final MinMaxBounds.Doubles ANY = new MinMaxBounds.Doubles(Optional.empty(), Optional.empty()); +- public static final Codec CODEC = MinMaxBounds.createCodec(Codec.DOUBLE, MinMaxBounds.Doubles::new); ++ public static final Codec CODEC = MinMaxBounds.createCodec(Codec.DOUBLE, MinMaxBounds.Doubles::new); // Scissors - compile fixes + +- private Doubles(Optional min, Optional max) { ++ public Doubles(Optional min, Optional max) { + this(min, max, squareOpt(min), squareOpt(max)); +- } ++ } // Scissors - private -> public + + private static MinMaxBounds.Doubles create(StringReader reader, Optional min, Optional max) throws CommandSyntaxException { + if (min.isPresent() && max.isPresent() && min.get() > max.get()) { +@@ -177,7 +177,7 @@ public interface MinMaxBounds { + public static record Ints(@Override Optional min, @Override Optional max, Optional minSq, Optional maxSq) + implements MinMaxBounds { + public static final MinMaxBounds.Ints ANY = new MinMaxBounds.Ints(Optional.empty(), Optional.empty()); +- public static final Codec CODEC = MinMaxBounds.createCodec(Codec.INT, MinMaxBounds.Ints::new); ++ public static final Codec CODEC = MinMaxBounds.createCodec(Codec.INT, MinMaxBounds.Ints::new); // Scissors - compile fixes + + private Ints(Optional min, Optional max) { + this(min, max, min.map(i -> i.longValue() * i.longValue()), squareOpt(max)); +diff --git a/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java b/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java +index 676a1499747b071515479130875157263d3a8352..6a65850101b8ea348a4bfeaeca805a39987b06fc 100644 +--- a/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java ++++ b/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java +@@ -10,6 +10,8 @@ import java.util.function.BiConsumer; + import java.util.function.Function; + import java.util.function.Predicate; + import javax.annotation.Nullable; ++ ++import me.totalfreedom.scissors.MathUtility; + import net.minecraft.advancements.critereon.MinMaxBounds; + import net.minecraft.commands.CommandSourceStack; + import net.minecraft.commands.arguments.EntityArgument; +@@ -60,9 +62,26 @@ public class EntitySelector { + this.includesEntities = includesNonPlayers; + this.worldLimited = localWorldOnly; + this.predicate = basePredicate; +- this.range = distance; ++ // Scissors start - Patch large selector distance crash ++ this.range = new MinMaxBounds.Doubles( ++ distance.min().map(min -> Math.min(min, 1024)), ++ distance.max().map(max -> Math.min(max, 1024)) ++ ); + this.position = positionOffset; +- this.aabb = box; ++ if (box != null) { ++ this.aabb = new AABB( ++ MathUtility.clampDouble(box.minX, -1024, 1025), ++ MathUtility.clampDouble(box.minY, -1024, 1025), ++ MathUtility.clampDouble(box.minZ, -1024, 1025), ++ MathUtility.clampDouble(box.maxX, -1024, 1025), ++ MathUtility.clampDouble(box.maxY, -1024, 1025), ++ MathUtility.clampDouble(box.maxZ, -1024, 1025), ++ false ++ ); ++ } else { ++ this.aabb = null; ++ } ++ // Scissors end + this.order = sorter; + this.currentEntity = senderOnly; + this.playerName = playerName;