diff --git a/build.gradle.kts b/build.gradle.kts index 8ddcac6..ef6de15 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ plugins { java `maven-publish` id("com.github.johnrengelman.shadow") version "8.1.1" apply false - id("io.papermc.paperweight.patcher") version "1.5.15" + id("io.papermc.paperweight.patcher") version "1.6.3" } val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/" @@ -26,7 +26,7 @@ allprojects { java { toolchain { - languageVersion.set(JavaLanguageVersion.of(17)) + languageVersion.set(JavaLanguageVersion.of(21)) } } } @@ -34,7 +34,7 @@ allprojects { subprojects { tasks.withType { options.encoding = Charsets.UTF_8.name() - options.release.set(17) + options.release.set(21) } tasks.withType { options.encoding = Charsets.UTF_8.name() @@ -49,6 +49,7 @@ subprojects { repositories { mavenCentral() maven(paperMavenPublicUrl) + maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") // TODO - Adventure snapshot } } diff --git a/gradle.properties b/gradle.properties index ffe46a5..684e448 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,8 @@ group=me.totalfreedom.scissors -version=1.20.4-R0.1-SNAPSHOT +version=1.20.6-R0.1-SNAPSHOT -mcVersion=1.20.4 -paperRef=f4c7d373e4a1aff23539fe099745bf29a28559b9 +mcVersion=1.20.6 +paperRef=544ce20e01820151d1984aecf3d9a7199071fb06 org.gradle.caching=true org.gradle.parallel=true diff --git a/patches/api/0003-Add-Scissors-configuration-file.patch b/patches/api/0003-Add-Scissors-configuration-file.patch index f7d1ded..730c474 100644 --- a/patches/api/0003-Add-Scissors-configuration-file.patch +++ b/patches/api/0003-Add-Scissors-configuration-file.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add Scissors configuration file diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 4ff1b38eb65f97344257204cf018f176f247ed36..be766fc9c24bedcc58dac2cb1991345bf5ed17e0 100644 +index 27084402cf0e46dcd171074629b7c4156e48aa44..684e317c68e1be547bb4907222dbe47ead1c55e0 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2235,6 +2235,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2254,6 +2254,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi } // Paper end diff --git a/patches/server/0001-Build-changes.patch b/patches/server/0001-Build-changes.patch index 367ee2d..42bd869 100644 --- a/patches/server/0001-Build-changes.patch +++ b/patches/server/0001-Build-changes.patch @@ -1,14 +1,14 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Telesphoreo -Date: Sun, 10 Dec 2023 12:34:45 -0600 +Date: Wed, 1 May 2024 15:37:34 -0500 Subject: [PATCH] Build changes diff --git a/build.gradle.kts b/build.gradle.kts -index bcfe59b6efb628ee1e7f9d60667360d4d885fb6a..855784d7f9c2993c5d91f67c9b8cc46fe6e4147e 100644 +index 5d448d8a7cf6626a11791f30ad52baf41a099272..119e105ffbb3143008e5a1953b11db161ceab9e2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -13,8 +13,12 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) { +@@ -12,8 +12,12 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) { val alsoShade: Configuration by configurations.creating dependencies { @@ -16,14 +16,14 @@ index bcfe59b6efb628ee1e7f9d60667360d4d885fb6a..855784d7f9c2993c5d91f67c9b8cc46f - implementation(project(":paper-mojangapi")) + // Scissors start + implementation(project(":Scissors-API")) -+ implementation("io.papermc.paper:paper-mojangapi:1.20.4-R0.1-SNAPSHOT") { ++ implementation("io.papermc.paper:paper-mojangapi:1.20.6-R0.1-SNAPSHOT") { + exclude("io.papermc.paper", "paper-api") + } + // Scissors end // Paper start implementation("org.jline:jline-terminal-jansi:3.21.0") implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -67,11 +71,19 @@ tasks.jar { +@@ -75,11 +79,19 @@ tasks.jar { val gitHash = git("rev-parse", "--short=7", "HEAD").getText().trim() val implementationVersion = System.getenv("BUILD_NUMBER") ?: "\"$gitHash\"" val date = git("show", "-s", "--format=%ci", gitHash).getText().trim() // Paper @@ -45,7 +45,7 @@ index bcfe59b6efb628ee1e7f9d60667360d4d885fb6a..855784d7f9c2993c5d91f67c9b8cc46f "Implementation-Vendor" to date, // Paper "Specification-Title" to "Bukkit", "Specification-Version" to project.version, -@@ -150,7 +162,7 @@ fun TaskContainer.registerRunTask( +@@ -138,7 +150,7 @@ fun TaskContainer.registerRunTask( name: String, block: JavaExec.() -> Unit ): TaskProvider = register(name) { @@ -95,23 +95,23 @@ index c5d5648f4ca603ef2b1df723b58f9caf4dd3c722..21ded7c14c56a40feaa7741131be5166 .completer(new ConsoleCommandCompleter(this.server)) .option(LineReader.Option.COMPLETE_IN_WORD, true); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index c8772c773f9933ed1d1debfe707af4373c458152..05b0d82114aadbb713b7e5dad94ee0fe6221856a 100644 +index 8dc2f9df367c849ca333bf1a1fd92ff91617b548..d4dbab7af2862df9a6e08600dba3c9796e18d4f3 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1865,7 +1865,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Paper } public SystemReport fillSystemReport(SystemReport details) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index c490a29bcf7410bc54959ee71375605964379ed5..f192db9868129bd1ee45e2b29c0c7479af33ebe1 100644 +index 05e304f9fc8d0291fa779da589bd060ef4165b49..a82a43bf61ad93b9c8415d4df4bacc44ed9e08ee 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -266,7 +266,7 @@ import javax.annotation.Nullable; // Paper +@@ -268,7 +268,7 @@ import javax.annotation.Nullable; // Paper import javax.annotation.Nonnull; // Paper public final class CraftServer implements Server { diff --git a/patches/server/0002-UUID-validation.patch b/patches/server/0002-UUID-validation.patch deleted file mode 100644 index 9243786..0000000 --- a/patches/server/0002-UUID-validation.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Video -Date: Sun, 10 Dec 2023 13:11:22 -0600 -Subject: [PATCH] UUID validation - - -diff --git a/src/main/java/net/minecraft/network/chat/HoverEvent.java b/src/main/java/net/minecraft/network/chat/HoverEvent.java -index 9067bab8ec695417d479393f07d9bc6432427d73..433e586bed53a8c17adec74b3088899c748d4be3 100644 ---- a/src/main/java/net/minecraft/network/chat/HoverEvent.java -+++ b/src/main/java/net/minecraft/network/chat/HoverEvent.java -@@ -20,6 +20,7 @@ import net.minecraft.nbt.CompoundTag; - import net.minecraft.nbt.TagParser; - import net.minecraft.resources.ResourceLocation; - import net.minecraft.util.ExtraCodecs; -+import net.minecraft.util.GsonHelper; - import net.minecraft.util.StringRepresentable; - import net.minecraft.world.entity.EntityType; - import net.minecraft.world.item.Item; -@@ -148,7 +149,14 @@ public class HoverEvent { - CompoundTag compoundTag = TagParser.parseTag(text.getString()); - Component component = Component.Serializer.fromJson(compoundTag.getString("name")); - EntityType entityType = BuiltInRegistries.ENTITY_TYPE.get(new ResourceLocation(compoundTag.getString("type"))); -- UUID uUID = UUID.fromString(compoundTag.getString("id")); -+ // Scissors start -+ UUID uUID; -+ try { -+ uUID = UUID.fromString(compoundTag.getString("id")); -+ } catch (Exception ex) { -+ return null; -+ } -+ // Scissors end - return DataResult.success(new HoverEvent.EntityTooltipInfo(entityType, uUID, component)); - } catch (Exception var5) { - return DataResult.error(() -> "Failed to parse tooltip: " + var5.getMessage()); diff --git a/patches/server/0003-Fixes-log-spam-caused-by-invalid-entities-in-beehive.patch b/patches/server/0003-Fixes-log-spam-caused-by-invalid-entities-in-beehive.patch deleted file mode 100644 index 1c8fefd..0000000 --- a/patches/server/0003-Fixes-log-spam-caused-by-invalid-entities-in-beehive.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Video -Date: Sun, 10 Dec 2023 16:57:48 -0600 -Subject: [PATCH] Fixes log spam caused by invalid entities in beehives - - -diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -index d445ed0895293dd45c36226051f5809be8587ebe..b9c8b70fb0bf47ffe62cf0d082156479d07da331 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -@@ -11,6 +11,7 @@ import net.minecraft.nbt.CompoundTag; - import net.minecraft.nbt.ListTag; - import net.minecraft.nbt.NbtUtils; - import net.minecraft.network.protocol.game.DebugPackets; -+import net.minecraft.resources.ResourceLocation; - import net.minecraft.sounds.SoundEvents; - import net.minecraft.sounds.SoundSource; - import net.minecraft.tags.BlockTags; -@@ -380,6 +381,13 @@ public class BeehiveBlockEntity extends BlockEntity { - - for (int i = 0; i < nbttaglist.size(); ++i) { - CompoundTag nbttagcompound1 = nbttaglist.getCompound(i); -+ -+ // Scissors start - Do not allow invalid entities from being used for bees -+ if (!nbttagcompound1.contains("id") || !ResourceLocation.isValidResourceLocation(nbttagcompound1.getString("id")) || EntityType.byString(nbttagcompound1.getString("id")).isEmpty()) { -+ continue; -+ } -+ // Scissors end -+ - BeehiveBlockEntity.BeeData tileentitybeehive_hivebee = new BeehiveBlockEntity.BeeData(nbttagcompound1.getCompound("EntityData").copy(), nbttagcompound1.getInt("TicksInHive"), nbttagcompound1.getInt("MinOccupationTicks")); - - this.stored.add(tileentitybeehive_hivebee); diff --git a/patches/server/0004-ResourceLocation-validation.patch b/patches/server/0004-ResourceLocation-validation.patch deleted file mode 100644 index c0e3cc9..0000000 --- a/patches/server/0004-ResourceLocation-validation.patch +++ /dev/null @@ -1,123 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Video -Date: Wed, 24 Jan 2024 16:28:16 -0600 -Subject: [PATCH] ResourceLocation validation - - -diff --git a/src/main/java/com/destroystokyo/paper/loottable/PaperContainerEntityLootableInventory.java b/src/main/java/com/destroystokyo/paper/loottable/PaperContainerEntityLootableInventory.java -index 15173e715fa36546820d930a46e0f0c493d07cfc..356cc6f468975faa676db87db8fc0fa2df32f020 100644 ---- a/src/main/java/com/destroystokyo/paper/loottable/PaperContainerEntityLootableInventory.java -+++ b/src/main/java/com/destroystokyo/paper/loottable/PaperContainerEntityLootableInventory.java -@@ -17,7 +17,7 @@ public class PaperContainerEntityLootableInventory implements PaperLootableEntit - - @Override - public org.bukkit.loot.LootTable getLootTable() { -- return entity.getLootTable() != null && !entity.getLootTable().getPath().isEmpty() ? Bukkit.getLootTable(CraftNamespacedKey.fromMinecraft(entity.getLootTable())) : null; -+ return entity.getLootTable() != null && !entity.getLootTable().getPath().isEmpty() && entity.getLootTable().toString().length() < 256 ? Bukkit.getLootTable(CraftNamespacedKey.fromMinecraft(entity.getLootTable())) : null; // Scissors - Validate length of loot tables before even trying - } - - @Override -diff --git a/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java b/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java -index 2ee4ee14ab3345486dad6b24fd9a4fcc6c746b99..c5ac6cda91a81d3075f5c763e30dc009b6be7936 100644 ---- a/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java -+++ b/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java -@@ -15,7 +15,7 @@ public class PaperTileEntityLootableInventory implements PaperLootableBlockInven - - @Override - public org.bukkit.loot.LootTable getLootTable() { -- return tileEntityLootable.lootTable != null && !tileEntityLootable.lootTable.getPath().isEmpty() ? Bukkit.getLootTable(CraftNamespacedKey.fromMinecraft(tileEntityLootable.lootTable)) : null; -+ return tileEntityLootable.lootTable != null && !tileEntityLootable.lootTable.getPath().isEmpty() && tileEntityLootable.lootTable.toString().length() < 256 ? Bukkit.getLootTable(CraftNamespacedKey.fromMinecraft(tileEntityLootable.lootTable)) : null; // Scissors - Validate length of loot tables before even trying - } - - @Override -diff --git a/src/main/java/net/minecraft/world/entity/AreaEffectCloud.java b/src/main/java/net/minecraft/world/entity/AreaEffectCloud.java -index 094ab43e5a209ea848bf0994db9018281c64e08d..c6faba7da6809e24d734b7d6b0b787d20163b051 100644 ---- a/src/main/java/net/minecraft/world/entity/AreaEffectCloud.java -+++ b/src/main/java/net/minecraft/world/entity/AreaEffectCloud.java -@@ -410,7 +410,7 @@ public class AreaEffectCloud extends Entity implements TraceableEntity { - try { - this.setParticle(ParticleArgument.readParticle(new StringReader(nbt.getString("Particle")), (HolderLookup) BuiltInRegistries.PARTICLE_TYPE.asLookup())); - } catch (CommandSyntaxException commandsyntaxexception) { -- AreaEffectCloud.LOGGER.warn("Couldn't load custom particle {}", nbt.getString("Particle"), commandsyntaxexception); -+ // Scissors - Don't log custom particle errors - } - } - -diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 09e8445a3f8c6b3ebc852a75a9a25b41a51ba659..cfb2ce684da0ae97a844554b5ad3d41290058f32 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityType.java -+++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -595,7 +595,7 @@ public class EntityType implements FeatureElement, EntityTypeT - if (generation) entity.generation = true; // Paper - Don't fire sync event during generation - entity.load(nbt); - }, () -> { -- EntityType.LOGGER.warn("Skipping Entity with id {}", nbt.getString("id")); -+ // Scissors - Don't log invalid entities - }); - } - -diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java b/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java -index f6942cb3ef1f9ef03708d4bc932ea9aeb1c13894..8b32864bafb3c1948993688be8f639dd6492057e 100644 ---- a/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java -+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java -@@ -34,8 +34,14 @@ public abstract class CraftLootable - return null; - } - -- ResourceLocation key = this.getSnapshot().lootTable; -- return Bukkit.getLootTable(CraftNamespacedKey.fromMinecraft(key)); -+ // Scissors start - Return a null loot table if the specified loot table is not valid -+ try { -+ ResourceLocation key = this.getSnapshot().lootTable; -+ return Bukkit.getLootTable(CraftNamespacedKey.fromMinecraft(key)); -+ } catch (Exception ex) { -+ return null; -+ } -+ // Scissors end - } - - @Override -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartContainer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartContainer.java -index 313ee5c8737b2e57f9b5db6512c1871766b2ccd4..a115a13ec911884a804800fc13f0347be1a30932 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartContainer.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartContainer.java -@@ -33,8 +33,15 @@ public abstract class CraftMinecartContainer extends CraftMinecart implements Lo - return null; // return empty loot table? - } - -- NamespacedKey key = CraftNamespacedKey.fromMinecraft(nmsTable); -- return Bukkit.getLootTable(key); -+ // Scissors start - Return a null loot table if the specified loot table is not valid -+ try -+ { -+ NamespacedKey key = CraftNamespacedKey.fromMinecraft(nmsTable); -+ return Bukkit.getLootTable(key); -+ } catch (Exception exception) { -+ return null; -+ } -+ // Scissors end - } - - @Override -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java -index 31f62fbb54ec7b270fbd8afba7bd7c4bfafa09e3..684e69753be0398ebe57172454aba8cc45cf6502 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java -@@ -80,8 +80,15 @@ public abstract class CraftMob extends CraftLivingEntity implements Mob { - - @Override - public LootTable getLootTable() { -- NamespacedKey key = CraftNamespacedKey.fromMinecraft(this.getHandle().getLootTable()); -- return Bukkit.getLootTable(key); -+ // Scissors start - Return a null loot table if the specified loot table is not valid -+ try -+ { -+ NamespacedKey key = CraftNamespacedKey.fromMinecraft(this.getHandle().getLootTable()); -+ return Bukkit.getLootTable(key); -+ } catch (Exception ex) { -+ return null; -+ } -+ // Scissors end - } - - @Override diff --git a/patches/server/0005-Ignore-errors-thrown-when-trying-to-remove-minecart-.patch b/patches/server/0005-Ignore-errors-thrown-when-trying-to-remove-minecart-.patch deleted file mode 100644 index 3b4b4af..0000000 --- a/patches/server/0005-Ignore-errors-thrown-when-trying-to-remove-minecart-.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Video -Date: Sun, 13 Mar 2022 08:14:44 -0600 -Subject: [PATCH] Ignore errors thrown when trying to remove minecart entities - with content in them - - -diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java -index 756d0434472921992c9d84597d7c9c824e93614c..77e9e106c522712a484d01bf7e7434c380de3621 100644 ---- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java -+++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java -@@ -147,7 +147,11 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme - public void remove(Entity.RemovalReason entity_removalreason, EntityRemoveEvent.Cause cause) { - // CraftBukkit end - if (!this.level().isClientSide && entity_removalreason.shouldDestroy()) { -- Containers.dropContents(this.level(), (Entity) this, (Container) this); -+ // Scissors start - Ignore errors thrown when trying to remove minecart entities with content in them -+ try { -+ Containers.dropContents(this.level(), (Entity) this, (Container) this); -+ } catch (Exception ignored) {} -+ // Scissors end - } - - super.remove(entity_removalreason, cause); // CraftBukkit - add Bukkit remove cause diff --git a/patches/server/0006-ItemEntity-Check-if-items-are-air-before-calling-set.patch b/patches/server/0006-ItemEntity-Check-if-items-are-air-before-calling-set.patch deleted file mode 100644 index 7ca9c4e..0000000 --- a/patches/server/0006-ItemEntity-Check-if-items-are-air-before-calling-set.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Sun, 13 Mar 2022 14:38:38 -0300 -Subject: [PATCH] ItemEntity - Check if items are air before calling setItem - - -diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index c7f06c3cfb737bd17a706798bf9cf0e1af5f0cc0..4fd00227d035284688e641cb2c55a3214dcbaa38 100644 ---- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -@@ -445,11 +445,15 @@ public class ItemEntity extends Entity implements TraceableEntity { - - CompoundTag nbttagcompound1 = nbt.getCompound("Item"); - -- this.setItem(ItemStack.of(nbttagcompound1)); -- if (this.getItem().isEmpty()) { -- this.discard(null); // CraftBukkit - add Bukkit remove cause -+ // Scissors start -+ ItemStack item = ItemStack.of(nbttagcompound1); -+ if (item.isEmpty()) { -+ this.discard(null); -+ return; - } - -+ this.setItem(item); -+ // Scissors end - } - - @Override diff --git a/patches/server/0007-Fixes-Knowledge-Books-causing-log-spam-when-invalid-.patch b/patches/server/0007-Fixes-Knowledge-Books-causing-log-spam-when-invalid-.patch deleted file mode 100644 index 496fab5..0000000 --- a/patches/server/0007-Fixes-Knowledge-Books-causing-log-spam-when-invalid-.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Video -Date: Sun, 13 Mar 2022 18:42:07 -0600 -Subject: [PATCH] Fixes Knowledge Books causing log spam when invalid data is - provided - - -diff --git a/src/main/java/net/minecraft/world/item/KnowledgeBookItem.java b/src/main/java/net/minecraft/world/item/KnowledgeBookItem.java -index 5ebc309aed545a4c22970e617519fe916a29fa3c..14a35465e41c9ecb51bea5b084e2637ebd21d295 100644 ---- a/src/main/java/net/minecraft/world/item/KnowledgeBookItem.java -+++ b/src/main/java/net/minecraft/world/item/KnowledgeBookItem.java -@@ -40,9 +40,9 @@ public class KnowledgeBookItem extends Item { - - for (int i = 0; i < listTag.size(); i++) { - String string = listTag.getString(i); -- Optional> optional = recipeManager.byKey(new ResourceLocation(string)); -+ Optional> optional = recipeManager.byKey(ResourceLocation.tryParse(string)); // Scissors - Validate resource locations - if (!optional.isPresent()) { -- LOGGER.error("Invalid recipe: {}", string); -+ // Scissors - Don't log errors caused by invalid recipes being provided - return InteractionResultHolder.fail(itemStack); - } - -@@ -55,7 +55,7 @@ public class KnowledgeBookItem extends Item { - - return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide()); - } else { -- LOGGER.error("Tag not valid: {}", compoundTag); -+ // Scissors - Don't throw errors into the logs if an NBT compound isn't present or is missing the Recipes tag. - return InteractionResultHolder.fail(itemStack); - } - } -diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaKnowledgeBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaKnowledgeBook.java -index e904bf8b6a7d18a0e846c3b59e2d7f3d6e530e39..65b076b376bf6ab363a3eb62dfa2c96c45624957 100644 ---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaKnowledgeBook.java -+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaKnowledgeBook.java -@@ -41,7 +41,11 @@ public class CraftMetaKnowledgeBook extends CraftMetaItem implements KnowledgeBo - for (int i = 0; i < pages.size(); i++) { - String recipe = pages.getString(i); - -- this.addRecipe(CraftNamespacedKey.fromString(recipe)); -+ // Scissors start - Don't add recipes with invalid namespaces -+ try { -+ this.addRecipe(CraftNamespacedKey.fromString(recipe)); -+ } catch (Exception ignored) {} -+ // Scissors end - } - } - } diff --git a/patches/server/0008-Validate-BlockState-and-SoundEvent-values.patch b/patches/server/0008-Validate-BlockState-and-SoundEvent-values.patch deleted file mode 100644 index 974a75a..0000000 --- a/patches/server/0008-Validate-BlockState-and-SoundEvent-values.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Video -Date: Sun, 13 Mar 2022 21:56:29 -0600 -Subject: [PATCH] Validate BlockState and SoundEvent values - - -diff --git a/src/main/java/net/minecraft/nbt/NbtUtils.java b/src/main/java/net/minecraft/nbt/NbtUtils.java -index fe4bea6af0d8734f3a5b972dce5f1e3914d6690e..0ee64be4288f59240beec26c470b78cc1aeac424 100644 ---- a/src/main/java/net/minecraft/nbt/NbtUtils.java -+++ b/src/main/java/net/minecraft/nbt/NbtUtils.java -@@ -223,7 +223,7 @@ public final class NbtUtils { - return Blocks.AIR.defaultBlockState(); - } else { - // Paper start - Validate resource location -- ResourceLocation resourceLocation = ResourceLocation.tryParse(nbt.getString("Name")); -+ ResourceLocation resourceLocation = ResourceLocation.tryParse(nbt.getString("Name")); // Scissors - Validate BlockState - Optional> optional = resourceLocation != null ? blockLookup.get(ResourceKey.create(Registries.BLOCK, resourceLocation)) : Optional.empty(); - // Paper end - Validate resource location - if (optional.isEmpty()) { diff --git a/patches/server/0009-Do-not-log-invalid-items-in-HoverEvent-and-ItemFrame.patch b/patches/server/0009-Do-not-log-invalid-items-in-HoverEvent-and-ItemFrame.patch deleted file mode 100644 index b6063ad..0000000 --- a/patches/server/0009-Do-not-log-invalid-items-in-HoverEvent-and-ItemFrame.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Telesphoreo -Date: Mon, 15 Apr 2024 22:26:14 -0500 -Subject: [PATCH] Do not log invalid items in HoverEvent and ItemFrame - - -diff --git a/src/main/java/net/minecraft/network/chat/HoverEvent.java b/src/main/java/net/minecraft/network/chat/HoverEvent.java -index 433e586bed53a8c17adec74b3088899c748d4be3..a82b4e39c3160114aded3f33c85fad2e95065b72 100644 ---- a/src/main/java/net/minecraft/network/chat/HoverEvent.java -+++ b/src/main/java/net/minecraft/network/chat/HoverEvent.java -@@ -261,7 +261,7 @@ public class HoverEvent { - CompoundTag compoundTag = TagParser.parseTag(text.getString()); - return DataResult.success(new HoverEvent.ItemStackInfo(ItemStack.of(compoundTag))); - } catch (CommandSyntaxException var2) { -- return DataResult.error(() -> "Failed to parse item tag: " + var2.getMessage()); -+ return null; - } - } - } -diff --git a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -index c34701f95580e4cf45fe086115563127432a28c5..fc7547381a5dd7c0aae352c0cae72a980953b98f 100644 ---- a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -+++ b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -@@ -436,7 +436,7 @@ public class ItemFrame extends HangingEntity { - ItemStack itemstack = ItemStack.of(nbttagcompound1); - - if (itemstack.isEmpty()) { -- ItemFrame.LOGGER.warn("Unable to load item from: {}", nbttagcompound1); -+ // Scissors - ignore invalid items - } - - ItemStack itemstack1 = this.getItem(); diff --git a/patches/server/0010-Reject-oversized-components-from-updating.patch b/patches/server/0010-Reject-oversized-components-from-updating.patch deleted file mode 100644 index 0ca0230..0000000 --- a/patches/server/0010-Reject-oversized-components-from-updating.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Video -Date: Mon, 28 Mar 2022 16:49:17 -0600 -Subject: [PATCH] Reject oversized components from updating - - -diff --git a/src/main/java/net/minecraft/network/chat/ComponentUtils.java b/src/main/java/net/minecraft/network/chat/ComponentUtils.java -index 3365aed2b67ae0e4dd0410f5190ba474f146139b..43b62a07b040b1d7d76dc8f940f35b51d1d5f868 100644 ---- a/src/main/java/net/minecraft/network/chat/ComponentUtils.java -+++ b/src/main/java/net/minecraft/network/chat/ComponentUtils.java -@@ -38,8 +38,9 @@ public class ComponentUtils { - } - - public static MutableComponent updateForEntity(@Nullable CommandSourceStack source, Component text, @Nullable Entity sender, int depth) throws CommandSyntaxException { -+ MutableComponent result; // Scissors - if (depth > 100) { -- return text.copy(); -+ result = text.copy(); // Scissors - } else { - // Paper start - adventure; pass actual vanilla component - if (text instanceof io.papermc.paper.adventure.AdventureComponent adventureComponent) { -@@ -52,8 +53,9 @@ public class ComponentUtils { - mutableComponent.append(updateForEntity(source, component, sender, depth + 1)); - } - -- return mutableComponent.withStyle(resolveStyle(source, text.getStyle(), sender, depth)); -+ result = mutableComponent.withStyle(resolveStyle(source, text.getStyle(), sender, depth)); // Scissors - } -+ return Component.Serializer.toJson(result).length() > 65535 ? Component.empty() : result; // Scissors - } - - private static Style resolveStyle(@Nullable CommandSourceStack source, Style style, @Nullable Entity sender, int depth) throws CommandSyntaxException { diff --git a/patches/server/0011-Add-Scissors-configuration-file-command.patch b/patches/server/0011-Add-Scissors-configuration-file-command.patch deleted file mode 100644 index 0f7f6fe..0000000 --- a/patches/server/0011-Add-Scissors-configuration-file-command.patch +++ /dev/null @@ -1,508 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Sun, 10 Jul 2022 10:12:04 +0100 -Subject: [PATCH] Add Scissors configuration file & command - - -diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java -index 7620c72a4c243cbeea245203ce03a97cbfa7d922..a05a348c299a68a61fabcbdcc689a89a81d1301f 100644 ---- a/src/main/java/co/aikar/timings/TimingsExport.java -+++ b/src/main/java/co/aikar/timings/TimingsExport.java -@@ -25,6 +25,7 @@ package co.aikar.timings; - - import com.google.common.collect.Sets; - import io.papermc.paper.adventure.PaperAdventure; -+import me.totalfreedom.scissors.ScissorsConfig; - import net.kyori.adventure.text.event.ClickEvent; - import net.kyori.adventure.text.format.NamedTextColor; - import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; -@@ -240,7 +241,8 @@ public class TimingsExport extends Thread { - parent.put("config", createObject( - pair("spigot", mapAsJSON(Bukkit.spigot().getSpigotConfig(), null)), - pair("bukkit", mapAsJSON(Bukkit.spigot().getBukkitConfig(), null)), -- pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)) -+ pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)), -+ pair("scissors", mapAsJSON(ScissorsConfig.config, null)) // Scissors - )); - - new TimingsExport(listeners, parent, history).start(); -diff --git a/src/main/java/me/totalfreedom/scissors/ScissorsCommand.java b/src/main/java/me/totalfreedom/scissors/ScissorsCommand.java -new file mode 100644 -index 0000000000000000000000000000000000000000..797677d892d83cf54d9a60af1e277b67ed3d6e95 ---- /dev/null -+++ b/src/main/java/me/totalfreedom/scissors/ScissorsCommand.java -@@ -0,0 +1,150 @@ -+package me.totalfreedom.scissors; -+ -+import com.google.common.base.Functions; -+import com.google.common.base.Joiner; -+import com.google.common.collect.ImmutableSet; -+import com.google.common.collect.Iterables; -+import com.google.common.collect.Lists; -+import net.minecraft.resources.ResourceLocation; -+import net.minecraft.server.MinecraftServer; -+import org.bukkit.Bukkit; -+import org.bukkit.ChatColor; -+import org.bukkit.Location; -+import org.bukkit.command.Command; -+import org.bukkit.command.CommandSender; -+ -+import java.io.File; -+import java.util.*; -+import java.util.stream.Collectors; -+ -+public class ScissorsCommand extends Command -+{ -+ -+ private static final String BASE_PERM = "bukkit.command.scissors."; -+ private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("reload", "version").build(); -+ -+ public ScissorsCommand(String name) -+ { -+ super(name); -+ this.description = "Scissors related commands"; -+ this.usageMessage = "/scissors [" + Joiner.on(" | ").join(SUBCOMMANDS) + "]"; -+ this.setPermission("bukkit.command.scissors;" + Joiner.on(';').join(SUBCOMMANDS.stream().map(s -> BASE_PERM + s).collect(Collectors.toSet()))); -+ } -+ -+ private static boolean testPermission(CommandSender commandSender, String permission) -+ { -+ if (commandSender.hasPermission(BASE_PERM + permission) || commandSender.hasPermission("bukkit.command.scissors")) -+ return true; -+ commandSender.sendMessage(Bukkit.getPermissionMessage()); // Sorry, kashike -+ return false; -+ } -+ -+ // Code from Mojang - copyright them -+ public static List getListMatchingLast(CommandSender sender, String[] args, String... matches) -+ { -+ return getListMatchingLast(sender, args, Arrays.asList(matches)); -+ } -+ -+ public static boolean matches(String s, String s1) -+ { -+ return s1.regionMatches(true, 0, s, 0, s.length()); -+ } -+ -+ public static List getListMatchingLast(CommandSender sender, String[] strings, Collection collection) -+ { -+ String last = strings[strings.length - 1]; -+ ArrayList results = Lists.newArrayList(); -+ -+ if (!collection.isEmpty()) -+ { -+ Iterator iterator = Iterables.transform(collection, Functions.toStringFunction()).iterator(); -+ -+ while (iterator.hasNext()) -+ { -+ String s1 = (String) iterator.next(); -+ -+ if (matches(last, s1) && (sender.hasPermission(BASE_PERM + s1) || sender.hasPermission("bukkit.command.scissors"))) -+ { -+ results.add(s1); -+ } -+ } -+ -+ if (results.isEmpty()) -+ { -+ iterator = collection.iterator(); -+ -+ while (iterator.hasNext()) -+ { -+ Object object = iterator.next(); -+ -+ if (object instanceof ResourceLocation && matches(last, ((ResourceLocation) object).getPath())) -+ { -+ results.add(String.valueOf(object)); -+ } -+ } -+ } -+ } -+ -+ return results; -+ } -+ -+ @Override -+ public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException -+ { -+ if (args.length <= 1) -+ return getListMatchingLast(sender, args, SUBCOMMANDS); -+ -+ return Collections.emptyList(); -+ } -+ // end copy stuff -+ -+ @Override -+ public boolean execute(CommandSender sender, String commandLabel, String[] args) -+ { -+ if (!testPermission(sender)) return true; -+ -+ if (args.length == 0) -+ { -+ sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage); -+ return false; -+ } -+ if (SUBCOMMANDS.contains(args[0].toLowerCase(Locale.ENGLISH))) -+ { -+ if (!testPermission(sender, args[0].toLowerCase(Locale.ENGLISH))) return true; -+ } -+ switch (args[0].toLowerCase(Locale.ENGLISH)) -+ { -+ case "reload": -+ doReload(sender); -+ break; -+ case "ver": -+ if (!testPermission(sender, "version")) -+ break; // "ver" needs a special check because it's an alias. All other commands are checked up before the switch statement (because they are present in the SUBCOMMANDS set) -+ case "version": -+ Command ver = MinecraftServer.getServer().server.getCommandMap().getCommand("version"); -+ if (ver != null) -+ { -+ ver.execute(sender, commandLabel, new String[0]); -+ break; -+ } -+ // else - fall through to default -+ default: -+ sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage); -+ return false; -+ } -+ -+ return true; -+ } -+ -+ private void doReload(CommandSender sender) -+ { -+ Command.broadcastCommandMessage(sender, ChatColor.RED + "Please note that this command is not supported and may cause issues."); -+ Command.broadcastCommandMessage(sender, ChatColor.RED + "If you encounter any issues please use the /stop command to restart your server."); -+ -+ MinecraftServer console = MinecraftServer.getServer(); -+ ScissorsConfig.init((File) console.options.valueOf("scissors-settings")); -+ console.server.reloadCount++; -+ -+ Command.broadcastCommandMessage(sender, ChatColor.GREEN + "Scissors config reload complete."); -+ } -+} -diff --git a/src/main/java/me/totalfreedom/scissors/ScissorsConfig.java b/src/main/java/me/totalfreedom/scissors/ScissorsConfig.java -new file mode 100644 -index 0000000000000000000000000000000000000000..8cd2848aa6b06c5efbe797ed2d75ff4b025b3c52 ---- /dev/null -+++ b/src/main/java/me/totalfreedom/scissors/ScissorsConfig.java -@@ -0,0 +1,225 @@ -+package me.totalfreedom.scissors; -+ -+ -+import com.google.common.base.Throwables; -+import net.minecraft.server.MinecraftServer; -+import net.minecraft.server.dedicated.DedicatedServer; -+import org.bukkit.Bukkit; -+import org.bukkit.command.Command; -+import org.bukkit.configuration.InvalidConfigurationException; -+import org.bukkit.configuration.file.YamlConfiguration; -+ -+import java.io.File; -+import java.io.IOException; -+import java.lang.reflect.InvocationTargetException; -+import java.lang.reflect.Method; -+import java.lang.reflect.Modifier; -+import java.nio.file.Files; -+import java.nio.file.Path; -+import java.util.HashMap; -+import java.util.List; -+import java.util.Map; -+import java.util.logging.Level; -+import java.util.regex.Pattern; -+ -+// TODO - Migrate to new format -+public class ScissorsConfig -+{ -+ -+ private static final String HEADER = """ -+ This is the main configuration file for Scissors. -+ As you can see, there's tons to configure. Some options may impact gameplay, so use -+ with caution, and make sure you know what each option does before configuring. -+ -+ If you need help with the configuration or have any questions related to Scissors, -+ join us in our Discord. -+ -+ Discord: https://discord.com/invite/mtVQcHn58h -+ Website: https://scissors.gg/\s -+ Docs: https://javadoc.scissors.gg/1.20.1/\s -+ """; -+ private static final Pattern SPACE = Pattern.compile(" "); -+ private static final Pattern NOT_NUMERIC = Pattern.compile("[^-\\d.]"); -+ /*========================================================================*/ -+ public static YamlConfiguration config; -+ static int version; -+ /*========================================================================*/ -+ static Map commands; -+ private static File CONFIG_FILE; -+ -+ public static void init(File configFile) -+ { -+ final File configFolder = (File) DedicatedServer.getServer().options.valueOf("scissors-settings" + "-directory"); -+ final Path configFolderPath = configFolder.toPath(); -+ final Path oldConfigFilePath = configFile.toPath(); -+ final Path newConfigFilePath = configFolderPath.resolve(configFile.toPath()); -+ -+ if (configFile.exists()) -+ { -+ try -+ { -+ Files.move(oldConfigFilePath, newConfigFilePath); -+ } -+ catch (IOException e) -+ { -+ throw new RuntimeException("Error migrating configuration file to new directory!", e); -+ } -+ } -+ -+ CONFIG_FILE = newConfigFilePath.toFile(); -+ config = new YamlConfiguration(); -+ try -+ { -+ config.load(CONFIG_FILE); -+ } -+ catch (IOException ex) -+ { -+ } -+ catch (InvalidConfigurationException ex) -+ { -+ Bukkit.getLogger().log(Level.SEVERE, "Could not load scissors.yml, please correct your syntax errors", ex); -+ throw Throwables.propagate(ex); -+ } -+ -+ commands = new HashMap<>(); -+ commands.put("scissors", new ScissorsCommand("scissors")); -+ -+ config.options().header(HEADER); -+ config.options().copyDefaults(true); -+ -+ version = getInt("config-version", 5); -+ set("config-version", 5); -+ readConfig(ScissorsConfig.class, null); -+ } -+ -+ protected static void logError(String s) -+ { -+ Bukkit.getLogger().severe(s); -+ } -+ -+ protected static void fatal(String s) -+ { -+ throw new RuntimeException("Fatal scissors.yml config error: " + s); -+ } -+ -+ public static void registerCommands() -+ { -+ for (Map.Entry entry : commands.entrySet()) -+ { -+ MinecraftServer.getServer().server.getCommandMap().register(entry.getKey(), "Scissors", entry.getValue()); -+ } -+ } -+ -+ static void readConfig(Class clazz, Object instance) -+ { -+ for (Method method : clazz.getDeclaredMethods()) -+ { -+ if (Modifier.isPrivate(method.getModifiers())) -+ { -+ if (method.getParameterTypes().length == 0 && method.getReturnType() == Void.TYPE) -+ { -+ try -+ { -+ method.setAccessible(true); -+ method.invoke(instance); -+ } -+ catch (InvocationTargetException ex) -+ { -+ throw Throwables.propagate(ex.getCause()); -+ } -+ catch (Exception ex) -+ { -+ Bukkit.getLogger().log(Level.SEVERE, "Error invoking " + method, ex); -+ } -+ } -+ } -+ } -+ saveConfig(); -+ } -+ -+ static void saveConfig() -+ { -+ try -+ { -+ config.save(CONFIG_FILE); -+ } -+ catch (IOException ex) -+ { -+ Bukkit.getLogger().log(Level.SEVERE, "Could not save " + CONFIG_FILE, ex); -+ } -+ } -+ -+ public static boolean runCommandsInBooks = false; -+ -+ private static void runCommandsInBooks() -+ { -+ runCommandsInBooks = getBoolean("runCommandsInBooks", false); -+ } -+ -+ // people still may want them to bypass permissions for warps -+ public static boolean commandSignsBypassPermissions = false; -+ private static void commandSignsBypassPermissions() -+ { -+ commandSignsBypassPermissions = getBoolean("commandSignsBypassPermissions", false); -+ } -+ -+ public static boolean chatSignaturesEnabled = true; -+ private static void chatSignaturesEnabled() -+ { -+ chatSignaturesEnabled = getBoolean("chatSignaturesEnabled", true); -+ } -+ -+ public static boolean excludePlayersFromNbtComponents = false; -+ private static void excludePlayersFromNbtComponents() -+ { -+ excludePlayersFromNbtComponents = getBoolean("excludePlayersFromNbtComponents", false); -+ } -+ public static int componentDepthLimit = 128; -+ private static void componentDepthLimit() -+ { -+ componentDepthLimit = getInt("componentDepthLimit", 128); -+ } -+ -+ -+ private static void set(String path, Object val) -+ { -+ config.set(path, val); -+ } -+ -+ private static boolean getBoolean(String path, boolean def) -+ { -+ config.addDefault(path, def); -+ return config.getBoolean(path, config.getBoolean(path)); -+ } -+ -+ private static double getDouble(String path, double def) -+ { -+ config.addDefault(path, def); -+ return config.getDouble(path, config.getDouble(path)); -+ } -+ -+ private static float getFloat(String path, float def) -+ { -+ // TODO: Figure out why getFloat() always returns the default value. -+ return (float) getDouble(path, def); -+ } -+ -+ private static int getInt(String path, int def) -+ { -+ config.addDefault(path, def); -+ return config.getInt(path, config.getInt(path)); -+ } -+ -+ private static List getList(String path, T def) -+ { -+ config.addDefault(path, def); -+ return config.getList(path, config.getList(path)); -+ } -+ -+ private static String getString(String path, String def) -+ { -+ config.addDefault(path, def); -+ return config.getString(path, config.getString(path)); -+ } -+} -+ -diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java -index bc391d27399d8c22e78735ca39aa8ab45efb6413..ce5d500ff4642e646a84c09dcff07375b9d80176 100644 ---- a/src/main/java/net/minecraft/server/Main.java -+++ b/src/main/java/net/minecraft/server/Main.java -@@ -130,6 +130,7 @@ public class Main { - // Paper start - load config files early for access below if needed - org.bukkit.configuration.file.YamlConfiguration bukkitConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) optionset.valueOf("bukkit-settings")); - org.bukkit.configuration.file.YamlConfiguration spigotConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) optionset.valueOf("spigot-settings")); -+ org.bukkit.configuration.file.YamlConfiguration scissorsConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) optionset.valueOf("scissors-settings")); // Scissors - TODO Change this - // Paper end - load config files early for access below if needed - - if (optionset.has("initSettings")) { // CraftBukkit -diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 68d268b6fff126e8645b6deec3fb549ea2286b77..5cb58e351d38b7214e2002bf608512024744f0ee 100644 ---- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -@@ -222,6 +222,16 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now - io.papermc.paper.brigadier.PaperBrigadierProviderImpl.INSTANCE.getClass(); // Paper - init PaperBrigadierProvider - -+ // Scissors start -+ try { -+ me.totalfreedom.scissors.ScissorsConfig.init((java.io.File) options.valueOf("scissors-settings")); -+ } catch (Exception e) { -+ DedicatedServer.LOGGER.error("Unable to load server configuration", e); -+ return false; -+ } -+ me.totalfreedom.scissors.ScissorsConfig.registerCommands(); -+ // Scissors end -+ - this.setPvpAllowed(dedicatedserverproperties.pvp); - this.setFlightAllowed(dedicatedserverproperties.allowFlight); - this.setMotd(dedicatedserverproperties.motd); -diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index f192db9868129bd1ee45e2b29c0c7479af33ebe1..1233d9b15d86079b2710e167ada03a4d0898642f 100644 ---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java -+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1053,6 +1053,7 @@ public final class CraftServer implements Server { - } - - org.spigotmc.SpigotConfig.init((File) this.console.options.valueOf("spigot-settings")); // Spigot -+ me.totalfreedom.scissors.ScissorsConfig.init(((File) console.options.valueOf("scissors-settings"))); // Scissors - this.console.paperConfigurations.reloadConfigs(this.console); - for (ServerLevel world : this.console.getAllLevels()) { - // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty -@@ -1084,6 +1085,7 @@ public final class CraftServer implements Server { - this.reloadData(); - org.spigotmc.SpigotConfig.registerCommands(); // Spigot - io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper -+ me.totalfreedom.scissors.ScissorsConfig.registerCommands(); // Scissors - this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); - this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); - -@@ -3028,6 +3030,14 @@ public final class CraftServer implements Server { - return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console); - } - -+ // Scissors start -+ @Override -+ public YamlConfiguration getScissorsConfig() -+ { -+ return me.totalfreedom.scissors.ScissorsConfig.config; -+ } -+ // Scissors end -+ - @Override - public void restart() { - org.spigotmc.RestartCommand.restart(); -diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index 8d626fadcd4743b6472a2954d2b1b2ec89669814..c0538206a53f0e6d9b54bddde0259b89ac73d675 100644 ---- a/src/main/java/org/bukkit/craftbukkit/Main.java -+++ b/src/main/java/org/bukkit/craftbukkit/Main.java -@@ -181,6 +181,20 @@ public class Main { - .defaultsTo("Unknown Server") - .describedAs("Name"); - // Paper end -+ -+ // Scissors start -+ acceptsAll(asList("scissors-dir", "scissors-settings-directory"), "Directory for Scissors settings") -+ .withRequiredArg() -+ .ofType(File.class) -+ .defaultsTo(new File(io.papermc.paper.configuration.PaperConfigurations.CONFIG_DIR)) -+ .describedAs("Config directory"); -+ -+ acceptsAll(asList("scissors", "scissors-settings"), "File for Scissors settings") -+ .withRequiredArg() -+ .ofType(File.class) -+ .defaultsTo(new File("scissors.yml")) -+ .describedAs("YAML file"); -+ // Scissors end - } - }; - diff --git a/patches/server/0012-Better-handling-of-invalid-JSON-components.patch b/patches/server/0012-Better-handling-of-invalid-JSON-components.patch deleted file mode 100644 index 8886538..0000000 --- a/patches/server/0012-Better-handling-of-invalid-JSON-components.patch +++ /dev/null @@ -1,141 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Telesphoreo -Date: Mon, 15 Apr 2024 22:36:13 -0500 -Subject: [PATCH] Better handling of invalid JSON components - - -diff --git a/src/main/java/io/papermc/paper/util/MCUtil.java b/src/main/java/io/papermc/paper/util/MCUtil.java -index e028353e0261310afc42ca0454b723d9f1ffc131..ed8810319db2ce754245193a62ea7a9a32ac13ec 100644 ---- a/src/main/java/io/papermc/paper/util/MCUtil.java -+++ b/src/main/java/io/papermc/paper/util/MCUtil.java -@@ -675,12 +675,6 @@ public final class MCUtil { - return null; - } - String string = compound.getString(key); -- try { -- return net.minecraft.network.chat.Component.Serializer.fromJson(string); -- } catch (com.google.gson.JsonParseException e) { -- org.bukkit.Bukkit.getLogger().warning("Unable to parse " + key + " from " + compound +": " + e.getMessage()); -- } -- -- return null; -+ return net.minecraft.network.chat.Component.Serializer.fromJsonSafe(string); // Scissors - } - } -diff --git a/src/main/java/net/minecraft/network/chat/Component.java b/src/main/java/net/minecraft/network/chat/Component.java -index d3a80d0a23be762c05931ae8001d98e43cab2b4a..ae84d06564b2560e13404f6d89f88ad71dbc2cc6 100644 ---- a/src/main/java/net/minecraft/network/chat/Component.java -+++ b/src/main/java/net/minecraft/network/chat/Component.java -@@ -315,6 +315,26 @@ public interface Component extends Message, FormattedText, Iterable { - return json == null ? null : Serializer.deserialize(json); - } - -+ // Scissors start -+ @Nullable -+ public static MutableComponent fromJsonSafe(String json) { -+ try { -+ return fromJson(json); -+ } catch (Exception ex) { -+ return Component.empty().append("** Invalid JSON Component **").withStyle(ChatFormatting.RED); -+ } -+ } -+ -+ @Nullable -+ public static MutableComponent fromJsonSafe(JsonElement json) { -+ try { -+ return fromJson(json); -+ } catch (Exception ex) { -+ return Component.empty().append("** Invalid JSON Component **").withStyle(ChatFormatting.RED); -+ } -+ } -+ // Scissors end -+ - @Nullable - public static MutableComponent fromJsonLenient(String json) { - JsonReader jsonreader = new JsonReader(new StringReader(json)); -diff --git a/src/main/java/net/minecraft/network/chat/HoverEvent.java b/src/main/java/net/minecraft/network/chat/HoverEvent.java -index a82b4e39c3160114aded3f33c85fad2e95065b72..e1f15ac481ab598e420ad79bcf289251d9f1c99a 100644 ---- a/src/main/java/net/minecraft/network/chat/HoverEvent.java -+++ b/src/main/java/net/minecraft/network/chat/HoverEvent.java -@@ -147,7 +147,7 @@ public class HoverEvent { - public static DataResult legacyCreate(Component text) { - try { - CompoundTag compoundTag = TagParser.parseTag(text.getString()); -- Component component = Component.Serializer.fromJson(compoundTag.getString("name")); -+ Component component = Component.Serializer.fromJsonSafe(compoundTag.getString("name")); // Scissors - Use safer method for getting Components from JSON - EntityType entityType = BuiltInRegistries.ENTITY_TYPE.get(new ResourceLocation(compoundTag.getString("type"))); - // Scissors start - UUID uUID; -diff --git a/src/main/java/net/minecraft/network/chat/contents/NbtContents.java b/src/main/java/net/minecraft/network/chat/contents/NbtContents.java -index c5673657ca6332147a5cbd2f4107fee13b9b7f47..3fec6f3e0adef6e2094157ef9040c7c6dc41a6c2 100644 ---- a/src/main/java/net/minecraft/network/chat/contents/NbtContents.java -+++ b/src/main/java/net/minecraft/network/chat/contents/NbtContents.java -@@ -124,10 +124,10 @@ public class NbtContents implements ComponentContents { - ); - return stream.flatMap(text -> { - try { -- MutableComponent mutableComponent = Component.Serializer.fromJson(text); -+ MutableComponent mutableComponent = Component.Serializer.fromJsonSafe(text); // Scissors - return Stream.of(ComponentUtils.updateForEntity(source, mutableComponent, sender, depth)); - } catch (Exception var5x) { -- LOGGER.warn("Failed to parse component: {}", text, var5x); -+ // Scissors - don't log - return Stream.of(); - } - }).reduce((accumulator, current) -> accumulator.append(component).append(current)).orElseGet(Component::empty); -diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 637478fd8a284e6833cf8f5fa17ccf9d73d1dd3f..2ecf2d8ff546ed097cb3b547db22d28a31d29ec4 100644 ---- a/src/main/java/net/minecraft/world/entity/Entity.java -+++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2545,11 +2545,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S - if (nbt.contains("CustomName", 8)) { - String s = nbt.getString("CustomName"); - -- try { -- this.setCustomName(Component.Serializer.fromJson(s)); -- } catch (Exception exception) { -- Entity.LOGGER.warn("Failed to parse entity custom name {}", s, exception); -- } -+ this.setCustomName(Component.Serializer.fromJsonSafe(s)); // Scissors - Use safer method for getting Components from JSON - } - - this.setCustomNameVisible(nbt.getBoolean("CustomNameVisible")); -diff --git a/src/main/java/net/minecraft/world/scores/ScoreboardSaveData.java b/src/main/java/net/minecraft/world/scores/ScoreboardSaveData.java -index 7eb1c28886741bdfe7985d16b6824f3e85ffae50..a6b7ff2e50c9700589428cc7d61b5ef9f9082ea8 100644 ---- a/src/main/java/net/minecraft/world/scores/ScoreboardSaveData.java -+++ b/src/main/java/net/minecraft/world/scores/ScoreboardSaveData.java -@@ -41,7 +41,7 @@ public class ScoreboardSaveData extends SavedData { - CompoundTag compoundTag = nbt.getCompound(i); - String string = compoundTag.getString("Name"); - PlayerTeam playerTeam = this.scoreboard.addPlayerTeam(string); -- Component component = Component.Serializer.fromJson(compoundTag.getString("DisplayName")); -+ Component component = Component.Serializer.fromJsonSafe(compoundTag.getString("DisplayName")); // Scissors - Use safer method for getting Components from JSON - if (component != null) { - playerTeam.setDisplayName(component); - } -@@ -59,14 +59,14 @@ public class ScoreboardSaveData extends SavedData { - } - - if (compoundTag.contains("MemberNamePrefix", 8)) { -- Component component2 = Component.Serializer.fromJson(compoundTag.getString("MemberNamePrefix")); -+ Component component2 = Component.Serializer.fromJsonSafe(compoundTag.getString("MemberNamePrefix")); // Scissors - Use safer method for getting Components from JSON - if (component2 != null) { - playerTeam.setPlayerPrefix(component2); - } - } - - if (compoundTag.contains("MemberNameSuffix", 8)) { -- Component component3 = Component.Serializer.fromJson(compoundTag.getString("MemberNameSuffix")); -+ Component component3 = Component.Serializer.fromJsonSafe(compoundTag.getString("MemberNameSuffix")); // Scissors - Use safer method for getting Components from JSON - if (component3 != null) { - playerTeam.setPlayerSuffix(component3); - } -@@ -123,7 +123,7 @@ public class ScoreboardSaveData extends SavedData { - return ObjectiveCriteria.DUMMY; - }); - String string2 = compoundTag.getString("Name"); -- Component component = Component.Serializer.fromJson(compoundTag.getString("DisplayName")); -+ Component component = Component.Serializer.fromJsonSafe(compoundTag.getString("DisplayName")); // Scissors - Use safer method for getting Components from JSON - ObjectiveCriteria.RenderType renderType = ObjectiveCriteria.RenderType.byId(compoundTag.getString("RenderType")); - boolean bl = compoundTag.getBoolean("display_auto_update"); - NumberFormat numberFormat = NumberFormatTypes.CODEC.parse(NbtOps.INSTANCE, compoundTag.get("format")).result().orElse(null); diff --git a/patches/server/0013-Block-server-side-chunkbans.patch b/patches/server/0013-Block-server-side-chunkbans.patch deleted file mode 100644 index ae390a5..0000000 --- a/patches/server/0013-Block-server-side-chunkbans.patch +++ /dev/null @@ -1,180 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: ayunami2000 -Date: Thu, 25 Jan 2024 23:48:51 -0600 -Subject: [PATCH] Block server-side chunkbans - - -diff --git a/src/main/java/net/minecraft/network/PacketEncoder.java b/src/main/java/net/minecraft/network/PacketEncoder.java -index 96d5448019d53ac3575e209c1c5c223a62a2638d..d0cfc4fc00d45c91380d2d794ca816db74d40266 100644 ---- a/src/main/java/net/minecraft/network/PacketEncoder.java -+++ b/src/main/java/net/minecraft/network/PacketEncoder.java -@@ -7,8 +7,17 @@ import io.netty.handler.codec.MessageToByteEncoder; - import io.netty.util.Attribute; - import io.netty.util.AttributeKey; - import java.io.IOException; -+import java.util.Collections; -+ -+import net.minecraft.ChatFormatting; -+import net.minecraft.core.NonNullList; -+import net.minecraft.nbt.CompoundTag; -+import net.minecraft.network.chat.Component; -+import net.minecraft.network.chat.SignedMessageBody; - import net.minecraft.network.protocol.Packet; -+import net.minecraft.network.protocol.game.*; - import net.minecraft.util.profiling.jfr.JvmProfiler; -+import net.minecraft.world.item.ItemStack; - import org.slf4j.Logger; - - public class PacketEncoder extends MessageToByteEncoder> { -@@ -19,6 +28,23 @@ public class PacketEncoder extends MessageToByteEncoder> { - this.codecKey = protocolKey; - } - -+ // Scissors start -+ private int tryWrite(Packet packet, FriendlyByteBuf friendlyByteBuf, ChannelHandlerContext channelHandlerContext, int i) { -+ friendlyByteBuf.writeVarInt(i); -+ friendlyByteBuf.adventure$locale = channelHandlerContext.channel().attr(io.papermc.paper.adventure.PaperAdventure.LOCALE_ATTRIBUTE).get(); // Paper -+ -+ int j = friendlyByteBuf.writerIndex(); -+ packet.write(friendlyByteBuf); -+ int k = friendlyByteBuf.writerIndex() - j; -+ int packetLength = friendlyByteBuf.readableBytes(); -+ if (packetLength > MAX_PACKET_SIZE) { -+ throw new PacketTooLargeException(packet, this.codecKey, packetLength); -+ } -+ -+ return k; -+ } -+ // Scissors end -+ - protected void encode(ChannelHandlerContext channelHandlerContext, Packet packet, ByteBuf byteBuf) throws Exception { - Attribute> attribute = channelHandlerContext.channel().attr(this.codecKey); - ConnectionProtocol.CodecData codecData = attribute.get(); -@@ -34,45 +60,58 @@ public class PacketEncoder extends MessageToByteEncoder> { - throw new IOException("Can't serialize unregistered packet"); - } else { - FriendlyByteBuf friendlyByteBuf = new FriendlyByteBuf(byteBuf); -- friendlyByteBuf.writeVarInt(i); -- friendlyByteBuf.adventure$locale = channelHandlerContext.channel().attr(io.papermc.paper.adventure.PaperAdventure.LOCALE_ATTRIBUTE).get(); // Paper - adventure; set player's locale - -+ // Scissors start -+ int k; - try { -- int j = friendlyByteBuf.writerIndex(); -- packet.write(friendlyByteBuf); -- int k = friendlyByteBuf.writerIndex() - j; -- if (false && k > 8388608) { // Paper - Handle large packets disconnecting client; disable -- throw new IllegalArgumentException("Packet too big (is " + k + ", should be less than 8388608): " + packet); -- } -- -- JvmProfiler.INSTANCE.onPacketSent(codecData.protocol(), i, channelHandlerContext.channel().remoteAddress(), k); -+ k = this.tryWrite(packet, friendlyByteBuf, channelHandlerContext, i); - } catch (Throwable var13) { -- // Paper start - Give proper error message -- String packetName = io.papermc.paper.util.ObfHelper.INSTANCE.deobfClassName(packet.getClass().getName()); -- if (packetName.contains(".")) { -- packetName = packetName.substring(packetName.lastIndexOf(".") + 1); -+ packet = capPacket(packet, i); -+ if (packet == null) { -+ throw new SkipPacketException(new IllegalArgumentException("Packet too big: " + packet)); - } -- -- LOGGER.error("Packet encoding of packet {} (ID: {}) threw (skippable? {})", packetName, i, packet.isSkippable(), var13); -- // Paper end -- if (packet.isSkippable()) { -- throw new SkipPacketException(var13); -- } -- -- throw var13; -- } finally { -- // Paper start - Handle large packets disconnecting client -- int packetLength = friendlyByteBuf.readableBytes(); -- if (packetLength > MAX_PACKET_SIZE) { -- throw new PacketTooLargeException(packet, this.codecKey, packetLength); -- } -- // Paper end - Handle large packets disconnecting client -- ProtocolSwapHandler.swapProtocolIfNeeded(attribute, packet); -+ friendlyByteBuf.clear(); -+ k = this.tryWrite(packet, friendlyByteBuf, channelHandlerContext, i); - } -+ JvmProfiler.INSTANCE.onPacketSent(codecData.protocol(), i, channelHandlerContext.channel().remoteAddress(), k); -+ ProtocolSwapHandler.swapProtocolIfNeeded(attribute, packet); -+ // Scissors end - } - } - } - -+ // Scissors start -+ private static Packet capPacket(Packet packet, int i) { -+ if (packet instanceof ClientboundBlockEntityDataPacket blockEntityDataPacket) { -+ packet = new ClientboundBlockEntityDataPacket(blockEntityDataPacket.getPos(), blockEntityDataPacket.getType(), new CompoundTag()); -+ } else if (packet instanceof ClientboundLevelChunkPacketData chunkPacket) { -+ chunkPacket.clearNBT(); -+ } else if (packet instanceof ClientboundContainerSetContentPacket containerSetContentPacket) { -+ packet = new ClientboundContainerSetContentPacket(containerSetContentPacket.getContainerId(), containerSetContentPacket.getStateId(), NonNullList.create(), ItemStack.EMPTY); -+ } else if (packet instanceof ClientboundSetEquipmentPacket setEquipmentPacket) { -+ packet = new ClientboundSetEquipmentPacket(setEquipmentPacket.getEntity(), Collections.emptyList()); -+ } else if (packet instanceof ClientboundContainerSetSlotPacket containerSetSlotPacket) { -+ packet = new ClientboundContainerSetSlotPacket(containerSetSlotPacket.getContainerId(), containerSetSlotPacket.getStateId(), containerSetSlotPacket.getSlot(), ItemStack.EMPTY); -+ } else if (packet instanceof ClientboundMapItemDataPacket mapItemDataPacket) { -+ packet = new ClientboundMapItemDataPacket(mapItemDataPacket.getMapId(), mapItemDataPacket.getScale(), mapItemDataPacket.isLocked(), null, null); -+ } else if (packet instanceof ClientboundPlayerChatPacket playerChatPacket) { -+ final SignedMessageBody.Packed body = playerChatPacket.body(); -+ packet = new ClientboundPlayerChatPacket(playerChatPacket.sender(), // Not sending this packet results in a kick when someone says something. -+ playerChatPacket.index(), -+ playerChatPacket.signature(), -+ playerChatPacket.body(), -+ Component.empty().append("** Message too large **").withStyle(ChatFormatting.RED), -+ playerChatPacket.filterMask(), -+ playerChatPacket.chatType() -+ ); -+ } else { -+ return null; -+ } -+ -+ return packet; -+ } -+ // Scissors end -+ - // Paper start - private static int MAX_PACKET_SIZE = 8388608; - -diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundBlockEntityDataPacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundBlockEntityDataPacket.java -index 3944852921335c78a04a9dc301882ab5b152b1ed..96ee53c7cc862e059328c5cdf5e07f309df6a79e 100644 ---- a/src/main/java/net/minecraft/network/protocol/game/ClientboundBlockEntityDataPacket.java -+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundBlockEntityDataPacket.java -@@ -24,7 +24,7 @@ public class ClientboundBlockEntityDataPacket implements Packet blockEntityType, CompoundTag nbt) { -+ public ClientboundBlockEntityDataPacket(BlockPos pos, BlockEntityType blockEntityType, CompoundTag nbt) { // Scissors - private -> public - this.pos = pos; - this.type = blockEntityType; - this.tag = nbt.isEmpty() ? null : nbt; -diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacketData.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacketData.java -index 76bde683d193b37e563a67c1c7b9bdcf17d64524..185aa88ff28e6f3e3314abe19dff88609a47334e 100644 ---- a/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacketData.java -+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacketData.java -@@ -33,6 +33,13 @@ public class ClientboundLevelChunkPacketData { - } - // Paper end - Handle oversized block entities in chunks - -+ // Scissors start -+ public void clearNBT() { -+ this.blockEntitiesData.clear(); -+ this.extraPackets.clear(); -+ } -+ // Scissors end -+ - // Paper start - Anti-Xray - Add chunk packet info - @Deprecated @io.papermc.paper.annotation.DoNotUse public ClientboundLevelChunkPacketData(LevelChunk chunk) { this(chunk, null); } - public ClientboundLevelChunkPacketData(LevelChunk chunk, com.destroystokyo.paper.antixray.ChunkPacketInfo chunkPacketInfo) { -@@ -58,6 +65,7 @@ public class ClientboundLevelChunkPacketData { - int totalTileEntities = 0; // Paper - Handle oversized block entities in chunks - - for (Entry entry2 : chunk.getBlockEntities().entrySet()) { -+ if (this.extraPackets.size() > 50) break; // Scissors - Limit extraPackets size - // Paper start - Handle oversized block entities in chunks - if (++totalTileEntities > TE_LIMIT) { - var packet = entry2.getValue().getUpdatePacket(); diff --git a/patches/server/0014-Prevent-attributes-with-invalid-namespaces-from-bein.patch b/patches/server/0014-Prevent-attributes-with-invalid-namespaces-from-bein.patch deleted file mode 100644 index 10d048e..0000000 --- a/patches/server/0014-Prevent-attributes-with-invalid-namespaces-from-bein.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Video -Date: Wed, 30 Mar 2022 18:20:09 -0600 -Subject: [PATCH] Prevent attributes with invalid namespaces from being applied - to CraftMetaItems - - -diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java -index 5cd0fbac267f9c69c5de4c200a95860f5c56d42e..f2ccf2af05524be91eb0f4855cb8006dea2aede4 100644 ---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java -+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java -@@ -47,6 +47,7 @@ import net.minecraft.nbt.NbtIo; - import net.minecraft.nbt.StringTag; - import net.minecraft.nbt.Tag; - import net.minecraft.network.chat.Component; -+import net.minecraft.resources.ResourceLocation; // Scissors - import net.minecraft.world.item.BlockItem; - import net.minecraft.world.level.block.state.BlockState; - import org.apache.commons.lang3.EnumUtils; -@@ -488,7 +489,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta { - AttributeModifier attribMod = CraftAttributeInstance.convert(nmsModifier); - - String attributeName = org.bukkit.craftbukkit.attribute.CraftAttributeMap.convertIfNeeded(entry.getString(CraftMetaItem.ATTRIBUTES_IDENTIFIER.NBT)); // Paper -- if (attributeName == null || attributeName.isEmpty()) { -+ if (attributeName == null || attributeName.isEmpty() || attributeName.length() > 256 || !ResourceLocation.isValidResourceLocation(attributeName)) { // Scissors - continue; - } - diff --git a/patches/server/0015-Don-t-query-player-data-in-the-nbt-component.patch b/patches/server/0015-Don-t-query-player-data-in-the-nbt-component.patch deleted file mode 100644 index 7c28f4f..0000000 --- a/patches/server/0015-Don-t-query-player-data-in-the-nbt-component.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Video -Date: Sun, 10 Dec 2023 17:39:52 -0600 -Subject: [PATCH] Don't query player data in the `nbt` component - - -diff --git a/src/main/java/net/minecraft/network/chat/contents/EntityDataSource.java b/src/main/java/net/minecraft/network/chat/contents/EntityDataSource.java -index 2750702cff35762bc817ffbe5bf81631e86bc49b..8714c3be77490a87aa6df0ff36a87557c6b99e25 100644 ---- a/src/main/java/net/minecraft/network/chat/contents/EntityDataSource.java -+++ b/src/main/java/net/minecraft/network/chat/contents/EntityDataSource.java -@@ -8,12 +8,15 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; - import java.util.List; - import java.util.stream.Stream; - import javax.annotation.Nullable; -+ -+import me.totalfreedom.scissors.ScissorsConfig; - import net.minecraft.advancements.critereon.NbtPredicate; - import net.minecraft.commands.CommandSourceStack; - import net.minecraft.commands.arguments.selector.EntitySelector; - import net.minecraft.commands.arguments.selector.EntitySelectorParser; - import net.minecraft.nbt.CompoundTag; - import net.minecraft.world.entity.Entity; -+import net.minecraft.world.entity.player.Player; - - public record EntityDataSource(String selectorPattern, @Nullable EntitySelector compiledSelector) implements DataSource { - public static final MapCodec SUB_CODEC = RecordCodecBuilder.mapCodec( -@@ -39,7 +42,11 @@ public record EntityDataSource(String selectorPattern, @Nullable EntitySelector - public Stream getData(CommandSourceStack source) throws CommandSyntaxException { - if (this.compiledSelector != null) { - List list = this.compiledSelector.findEntities(source); -- return list.stream().map(NbtPredicate::getEntityTagToCompare); -+ // Scissors start -+ Stream stream = list.stream(); -+ if (ScissorsConfig.excludePlayersFromNbtComponents) stream = stream.filter((entity) -> !(entity instanceof Player)); -+ return stream.map(NbtPredicate::getEntityTagToCompare); -+ // Scissors end - } else { - return Stream.empty(); - } diff --git a/patches/server/0016-Limit-string-tag-visitors-to-1024-elements.patch b/patches/server/0016-Limit-string-tag-visitors-to-1024-elements.patch deleted file mode 100644 index 933cbd6..0000000 --- a/patches/server/0016-Limit-string-tag-visitors-to-1024-elements.patch +++ /dev/null @@ -1,142 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Fri, 8 Apr 2022 23:38:12 -0300 -Subject: [PATCH] Limit string tag visitors to 1024 elements - - -diff --git a/src/main/java/net/minecraft/nbt/SnbtPrinterTagVisitor.java b/src/main/java/net/minecraft/nbt/SnbtPrinterTagVisitor.java -index b45bb4ddf6b586ba1285db230e0bc3d1b5e447e8..4a46935cac263325a87a1b0bf32302839a75516e 100644 ---- a/src/main/java/net/minecraft/nbt/SnbtPrinterTagVisitor.java -+++ b/src/main/java/net/minecraft/nbt/SnbtPrinterTagVisitor.java -@@ -89,6 +89,7 @@ public class SnbtPrinterTagVisitor implements TagVisitor { - public void visitByteArray(ByteArrayTag element) { - StringBuilder stringBuilder = new StringBuilder("[").append("B").append(";"); - byte[] bs = element.getAsByteArray(); -+ if (bs.length > 1024) { this.result = stringBuilder.append("]").toString(); return; } // Scissors - - for (int i = 0; i < bs.length; i++) { - stringBuilder.append(" ").append(bs[i]).append("B"); -@@ -105,6 +106,7 @@ public class SnbtPrinterTagVisitor implements TagVisitor { - public void visitIntArray(IntArrayTag element) { - StringBuilder stringBuilder = new StringBuilder("[").append("I").append(";"); - int[] is = element.getAsIntArray(); -+ if (is.length > 1024) { this.result = stringBuilder.append("]").toString(); return; } // Scissors - - for (int i = 0; i < is.length; i++) { - stringBuilder.append(" ").append(is[i]); -@@ -122,6 +124,7 @@ public class SnbtPrinterTagVisitor implements TagVisitor { - String string = "L"; - StringBuilder stringBuilder = new StringBuilder("[").append("L").append(";"); - long[] ls = element.getAsLongArray(); -+ if (ls.length > 1024) { this.result = stringBuilder.append("]").toString(); return; } // Scissors - - for (int i = 0; i < ls.length; i++) { - stringBuilder.append(" ").append(ls[i]).append("L"); -@@ -136,7 +139,7 @@ public class SnbtPrinterTagVisitor implements TagVisitor { - - @Override - public void visitList(ListTag element) { -- if (element.isEmpty()) { -+ if (element.isEmpty() || element.size() > 1024) { // Scissors - this.result = "[]"; - } else { - StringBuilder stringBuilder = new StringBuilder("["); -@@ -166,7 +169,7 @@ public class SnbtPrinterTagVisitor implements TagVisitor { - - @Override - public void visitCompound(CompoundTag compound) { -- if (compound.isEmpty()) { -+ if (compound.isEmpty() || compound.size() > 1024) { // Scissors - this.result = "{}"; - } else { - StringBuilder stringBuilder = new StringBuilder("{"); -diff --git a/src/main/java/net/minecraft/nbt/StringTagVisitor.java b/src/main/java/net/minecraft/nbt/StringTagVisitor.java -index d8892641d5671fa100aeb43d42ebb6103a2d280c..d10242ecd6f8442e1af3f4cd13f769517b33058a 100644 ---- a/src/main/java/net/minecraft/nbt/StringTagVisitor.java -+++ b/src/main/java/net/minecraft/nbt/StringTagVisitor.java -@@ -53,6 +53,7 @@ public class StringTagVisitor implements TagVisitor { - public void visitByteArray(ByteArrayTag element) { - this.builder.append("[B;"); - byte[] bs = element.getAsByteArray(); -+ if (bs.length > 1024) { this.builder.append(']'); return; } // Scissors - - for (int i = 0; i < bs.length; i++) { - if (i != 0) { -@@ -69,6 +70,7 @@ public class StringTagVisitor implements TagVisitor { - public void visitIntArray(IntArrayTag element) { - this.builder.append("[I;"); - int[] is = element.getAsIntArray(); -+ if (is.length > 1024) { this.builder.append(']'); return; } // Scissors - - for (int i = 0; i < is.length; i++) { - if (i != 0) { -@@ -85,6 +87,7 @@ public class StringTagVisitor implements TagVisitor { - public void visitLongArray(LongArrayTag element) { - this.builder.append("[L;"); - long[] ls = element.getAsLongArray(); -+ if (ls.length > 1024) { this.builder.append(']'); return; } // Scissors - - for (int i = 0; i < ls.length; i++) { - if (i != 0) { -@@ -100,6 +103,7 @@ public class StringTagVisitor implements TagVisitor { - @Override - public void visitList(ListTag element) { - this.builder.append('['); -+ if (element.size() > 1024) { this.builder.append(']'); return; } // Scissors - - for (int i = 0; i < element.size(); i++) { - if (i != 0) { -@@ -116,6 +120,7 @@ public class StringTagVisitor implements TagVisitor { - public void visitCompound(CompoundTag compound) { - this.builder.append('{'); - List list = Lists.newArrayList(compound.getAllKeys()); -+ if (list.size() > 1024) { this.builder.append('}'); return; } // Scissors - Collections.sort(list); - - for (String string : list) { -diff --git a/src/main/java/net/minecraft/nbt/TextComponentTagVisitor.java b/src/main/java/net/minecraft/nbt/TextComponentTagVisitor.java -index 4e238ae29347c5e976ff0d506e94972df0aa7362..9776b9741a7ec46c603b2c2bccd5f006c15cee41 100644 ---- a/src/main/java/net/minecraft/nbt/TextComponentTagVisitor.java -+++ b/src/main/java/net/minecraft/nbt/TextComponentTagVisitor.java -@@ -97,6 +97,7 @@ public class TextComponentTagVisitor implements TagVisitor { - Component component = Component.literal("B").withStyle(SYNTAX_HIGHLIGHTING_NUMBER_TYPE); - MutableComponent mutableComponent = Component.literal("[").append(component).append(";"); - byte[] bs = element.getAsByteArray(); -+ if (bs.length > 1024) { this.result = mutableComponent.append("]"); return; } // Scissors - - for (int i = 0; i < bs.length; i++) { - MutableComponent mutableComponent2 = Component.literal(String.valueOf(bs[i])).withStyle(SYNTAX_HIGHLIGHTING_NUMBER); -@@ -115,6 +116,7 @@ public class TextComponentTagVisitor implements TagVisitor { - Component component = Component.literal("I").withStyle(SYNTAX_HIGHLIGHTING_NUMBER_TYPE); - MutableComponent mutableComponent = Component.literal("[").append(component).append(";"); - int[] is = element.getAsIntArray(); -+ if (is.length > 1024) { this.result = mutableComponent.append("]"); return; } // Scissors - - for (int i = 0; i < is.length; i++) { - mutableComponent.append(" ").append(Component.literal(String.valueOf(is[i])).withStyle(SYNTAX_HIGHLIGHTING_NUMBER)); -@@ -132,6 +134,7 @@ public class TextComponentTagVisitor implements TagVisitor { - Component component = Component.literal("L").withStyle(SYNTAX_HIGHLIGHTING_NUMBER_TYPE); - MutableComponent mutableComponent = Component.literal("[").append(component).append(";"); - long[] ls = element.getAsLongArray(); -+ if (ls.length > 1024) { this.result = mutableComponent.append("]"); return; } // Scissors - - for (int i = 0; i < ls.length; i++) { - Component component2 = Component.literal(String.valueOf(ls[i])).withStyle(SYNTAX_HIGHLIGHTING_NUMBER); -@@ -147,7 +150,7 @@ public class TextComponentTagVisitor implements TagVisitor { - - @Override - public void visitList(ListTag element) { -- if (element.isEmpty()) { -+ if (element.isEmpty() || element.size() > 1024) { // Scissors - this.result = Component.literal("[]"); - } else if (INLINE_ELEMENT_TYPES.contains(element.getElementType()) && element.size() <= 8) { - String string = ELEMENT_SEPARATOR + " "; -@@ -190,7 +193,7 @@ public class TextComponentTagVisitor implements TagVisitor { - - @Override - public void visitCompound(CompoundTag compound) { -- if (compound.isEmpty()) { -+ if (compound.isEmpty() || compound.size() > 1024) { // Scissors - this.result = Component.literal("{}"); - } else { - MutableComponent mutableComponent = Component.literal("{"); diff --git a/patches/server/0017-Fixes-creative-killing-potion-effects-and-certain-po.patch b/patches/server/0017-Fixes-creative-killing-potion-effects-and-certain-po.patch deleted file mode 100644 index 8e64224..0000000 --- a/patches/server/0017-Fixes-creative-killing-potion-effects-and-certain-po.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Video -Date: Mon, 11 Apr 2022 13:33:52 -0600 -Subject: [PATCH] Fixes creative-killing potion effects and certain potion - effect overflows - - -diff --git a/src/main/java/net/minecraft/world/effect/HealOrHarmMobEffect.java b/src/main/java/net/minecraft/world/effect/HealOrHarmMobEffect.java -index 1c7794de5f0a7238b944c9473e2cc9d011ef2306..9c594c504611b9da5fcd119284b2dcb4b59d3bf4 100644 ---- a/src/main/java/net/minecraft/world/effect/HealOrHarmMobEffect.java -+++ b/src/main/java/net/minecraft/world/effect/HealOrHarmMobEffect.java -@@ -16,6 +16,11 @@ class HealOrHarmMobEffect extends InstantenousMobEffect { - @Override - public void applyEffectTick(LivingEntity entity, int amplifier) { - super.applyEffectTick(entity, amplifier); -+ // Scissors start - Don't apply any healing/harming effects for Creative/Invulnerable players and cap the amplifier for those who aren't. -+ if (entity instanceof net.minecraft.world.entity.player.Player player && (player.isCreative() || player.isInvulnerable())) return; -+ amplifier = Math.min(Math.abs(amplifier), 124); -+ // Scissors end -+ - if (this.isHarm == entity.isInvertedHealAndHarm()) { - entity.heal((float) Math.max(4 << amplifier, 0), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.MAGIC); // CraftBukkit - } else { -@@ -27,6 +32,10 @@ class HealOrHarmMobEffect extends InstantenousMobEffect { - @Override - public void applyInstantenousEffect(@Nullable Entity source, @Nullable Entity attacker, LivingEntity target, int amplifier, double proximity) { - int j; -+ // Scissors start - Don't apply any healing/harming effects for Creative/Invulnerable players and cap the amplifier for those who aren't. -+ if (target instanceof net.minecraft.world.entity.player.Player player && (player.isCreative() || player.isInvulnerable())) return; -+ amplifier = Math.min(Math.abs(amplifier), 124); -+ // Scissors end - - if (this.isHarm == target.isInvertedHealAndHarm()) { - j = (int) (proximity * (double) (4 << amplifier) + 0.5D); diff --git a/patches/server/0018-Fix-negative-death-times.patch b/patches/server/0018-Fix-negative-death-times.patch deleted file mode 100644 index 3b883fd..0000000 --- a/patches/server/0018-Fix-negative-death-times.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Telesphoreo -Date: Sat, 24 Feb 2024 15:32:48 -0600 -Subject: [PATCH] Fix negative death times - - -diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index e9bb7feb591032904516d1b9374f486d8a7d066c..60961c54e870148b5c649045e7347ca1064b6bde 100644 ---- a/src/main/java/net/minecraft/world/entity/LivingEntity.java -+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -629,7 +629,7 @@ public abstract class LivingEntity extends Entity implements Attackable { - - protected void tickDeath() { - ++this.deathTime; -- if (this.deathTime >= 20 && !this.level().isClientSide() && !this.isRemoved()) { -+ if ((this.deathTime >= 20 || this.deathTime <= 0) && !this.level().isClientSide() && !this.isRemoved()) { // Scissors - this.level().broadcastEntityEvent(this, (byte) 60); - this.remove(Entity.RemovalReason.KILLED, EntityRemoveEvent.Cause.DEATH); // CraftBukkit - add Bukkit remove cause - } diff --git a/patches/server/0019-Limit-amount-of-vehicle-collision-checks-to-3-and-di.patch b/patches/server/0019-Limit-amount-of-vehicle-collision-checks-to-3-and-di.patch deleted file mode 100644 index e9b6e5b..0000000 --- a/patches/server/0019-Limit-amount-of-vehicle-collision-checks-to-3-and-di.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Thu, 21 Apr 2022 13:52:32 +0100 -Subject: [PATCH] Limit amount of vehicle collision checks to 3 and discard - vehicles if they collide with more than 15 other entities - - -diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -index d514ec1e4cbdc579c3a61533998437903afdc8b6..7ee1f3552b81bff834c6f414e611e8b05463fc6f 100644 ---- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -+++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -@@ -8,6 +8,7 @@ import com.mojang.datafixers.util.Pair; - import java.util.Iterator; - import java.util.List; - import java.util.Map; -+import java.util.concurrent.TimeUnit; // Scissors - import javax.annotation.Nullable; - import net.minecraft.BlockUtil; - import net.minecraft.Util; -@@ -104,6 +105,7 @@ public abstract class AbstractMinecart extends VehicleEntity { - private double flyingX = 0.95; - private double flyingY = 0.95; - private double flyingZ = 0.95; -+ private long lastLargeCollision = 0L; // Scissors - Add a collision debounce - public double maxSpeed = 0.4D; - // CraftBukkit end - -@@ -384,8 +386,8 @@ public abstract class AbstractMinecart extends VehicleEntity { - if (this.getMinecartType() == AbstractMinecart.Type.RIDEABLE && this.getDeltaMovement().horizontalDistanceSqr() > 0.01D) { - List list = this.level().getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D), EntitySelector.pushableBy(this)); - -- if (!list.isEmpty()) { -- Iterator iterator = list.iterator(); -+ if (!list.isEmpty() && (System.currentTimeMillis() - lastLargeCollision) >= TimeUnit.SECONDS.toMillis(5)) { // Scissors - add collision debounce, using TimeUnit for better code readability -+ Iterator iterator = list.size() <= 15 ? list.iterator() : list.subList(0, 15).iterator(); // Scissors - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); -@@ -414,6 +416,14 @@ public abstract class AbstractMinecart extends VehicleEntity { - entity.push(this); - } - } -+ -+ // Scissors start - Add a collision debounce -+ if (list.size() > 15) { -+ this.discard(null); -+ } else if (list.size() > 3) { -+ lastLargeCollision = System.currentTimeMillis(); -+ } -+ // Scissors end - } - } else { - Iterator iterator1 = this.level().getEntities(this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D)).iterator(); -diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -index db6aa75d642f4a7258f197933671907faf79c8f2..e4490494a865e129c69d7df3742f61860763a8d8 100644 ---- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -+++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -@@ -5,6 +5,7 @@ import com.google.common.collect.UnmodifiableIterator; - import java.util.Iterator; - import java.util.List; - import java.util.function.IntFunction; -+import java.util.concurrent.TimeUnit; // Scissors - import javax.annotation.Nullable; - import net.minecraft.BlockUtil; - import net.minecraft.core.BlockPos; -@@ -108,6 +109,7 @@ public class Boat extends VehicleEntity implements VariantHolder { - public double unoccupiedDeceleration = -1; - public boolean landBoats = false; - // CraftBukkit end -+ private long lastLargeCollision = 0L; // Scissors - Add a collision debounce - - public Boat(EntityType type, Level world) { - super(type, world); -@@ -408,9 +410,9 @@ public class Boat extends VehicleEntity implements VariantHolder { - this.checkInsideBlocks(); - List list = this.level().getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, -0.009999999776482582D, 0.20000000298023224D), EntitySelector.pushableBy(this)); - -- if (!list.isEmpty()) { -+ if (!list.isEmpty() && (System.currentTimeMillis() - lastLargeCollision) >= TimeUnit.SECONDS.toMillis(5)) { // Scissors - add collision debounce, using TimeUnit for better code readability - boolean flag = !this.level().isClientSide && !(this.getControllingPassenger() instanceof Player); -- Iterator iterator = list.iterator(); -+ Iterator iterator = list.size() <= 15 ? list.iterator() : list.subList(0, 15).iterator(); // Scissors - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); -@@ -423,6 +425,14 @@ public class Boat extends VehicleEntity implements VariantHolder { - } - } - } -+ -+ // Scissors start - Add collision debounce -+ if (list.size() > 15) { -+ this.discard(null); -+ } else if (list.size() > 3) { -+ lastLargeCollision = System.currentTimeMillis(); -+ } -+ // Scissors end - } - - } diff --git a/patches/server/0020-Add-custom-classes-used-by-Scissors.patch b/patches/server/0020-Add-custom-classes-used-by-Scissors.patch deleted file mode 100644 index 8c5f502..0000000 --- a/patches/server/0020-Add-custom-classes-used-by-Scissors.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Telesphoreo -Date: Sat, 11 Jun 2022 22:56:59 -0500 -Subject: [PATCH] Add custom classes used by Scissors - - -diff --git a/src/main/java/me/totalfreedom/scissors/MathUtility.java b/src/main/java/me/totalfreedom/scissors/MathUtility.java -new file mode 100644 -index 0000000000000000000000000000000000000000..754b578b575137a9c48cb20dee965a9388fedb3c ---- /dev/null -+++ b/src/main/java/me/totalfreedom/scissors/MathUtility.java -@@ -0,0 +1,29 @@ -+package me.totalfreedom.scissors; -+ -+public class MathUtility -+{ -+ public static int clampInt(int number, int minimum, int maximum) -+ { -+ return Math.min(Math.max(number, minimum), maximum); -+ } -+ -+ public static long clampLong(long number, long minimum, long maximum) -+ { -+ return Math.min(Math.max(number, minimum), maximum); -+ } -+ -+ public static double clampDouble(double number, double minimum, double maximum) -+ { -+ return Math.min(Math.max(number, minimum), maximum); -+ } -+ -+ public static int safeDoubleToInt(double number) -+ { -+ return (int) clampDouble(number, Integer.MIN_VALUE, Integer.MAX_VALUE); -+ } -+ -+ public static int safeLongToInt(long number) -+ { -+ return (int) clampLong(number, Integer.MIN_VALUE, Integer.MAX_VALUE); -+ } -+} -diff --git a/src/main/java/me/totalfreedom/scissors/NbtUtility.java b/src/main/java/me/totalfreedom/scissors/NbtUtility.java -new file mode 100644 -index 0000000000000000000000000000000000000000..b3efac47ee700d5a7ff26452d6bcbf2f687a32cf ---- /dev/null -+++ b/src/main/java/me/totalfreedom/scissors/NbtUtility.java -@@ -0,0 +1,75 @@ -+package me.totalfreedom.scissors; -+ -+import java.nio.charset.StandardCharsets; -+import javax.annotation.Nullable; -+import net.minecraft.nbt.CompoundTag; -+import net.minecraft.nbt.ListTag; -+import net.minecraft.nbt.Tag; -+ -+public class NbtUtility -+{ -+ public static final long MAXIMUM_SIZE = (256 * 1024); -+ -+ public static long getTagSize(@Nullable Tag tag, int depth) -+ { -+ if (depth > 512) -+ { -+ return 0; -+ } -+ if (tag == null) -+ { -+ return 0; -+ } -+ -+ long size = 0; -+ -+ if (tag.getType() == CompoundTag.TYPE) -+ { -+ CompoundTag compoundTag = (CompoundTag) tag; -+ for (String key : compoundTag.getAllKeys()) -+ { -+ size += key.getBytes(StandardCharsets.UTF_8).length; -+ size += getTagSize(compoundTag.get(key), depth + 1); -+ } -+ } -+ else if (tag.getType() == ListTag.TYPE) -+ { -+ ListTag listTag = (ListTag) tag; -+ for (Tag tag1 : listTag) -+ { -+ size += getTagSize(tag1, depth + 1); -+ } -+ } -+ else -+ { -+ size += tag.getAsString().getBytes(StandardCharsets.UTF_8).length; -+ } -+ -+ return size; -+ } -+ -+ public static long getTagSize(@Nullable CompoundTag tag) -+ { -+ return getTagSize(tag, 0); -+ } -+ -+ public static boolean isTooLarge(@Nullable CompoundTag tag) -+ { -+ if (tag == null) -+ { -+ return false; -+ } -+ return getTagSize(tag) > MAXIMUM_SIZE; -+ } -+ -+ public static class Item -+ { -+ public static CompoundTag removeItemData(CompoundTag tag) -+ { -+ CompoundTag cleaned = new CompoundTag(); -+ cleaned.putString("id", tag.getString("id")); -+ cleaned.putByte("Count", tag.getByte("Count")); -+ return cleaned; -+ } -+ } -+} -diff --git a/src/main/java/me/totalfreedom/scissors/PositionUtility.java b/src/main/java/me/totalfreedom/scissors/PositionUtility.java -new file mode 100644 -index 0000000000000000000000000000000000000000..c5dcc833d6f2c0daa1d0c2a7ab81430f25e0b2f3 ---- /dev/null -+++ b/src/main/java/me/totalfreedom/scissors/PositionUtility.java -@@ -0,0 +1,53 @@ -+package me.totalfreedom.scissors; -+ -+import net.minecraft.core.BlockPos; -+import net.minecraft.world.entity.Entity; -+import net.minecraft.world.level.Level; -+import net.minecraft.world.level.border.WorldBorder; -+import net.minecraft.world.phys.Vec3; -+ -+public class PositionUtility -+{ -+ -+ public static Vec3 getValidVec3FromBlockPos(BlockPos blockPos, Entity entity) -+ { -+ final BlockPos validBlockPos = getValidBlockPos(blockPos, entity); -+ -+ return new Vec3(validBlockPos.getX(), validBlockPos.getY(), validBlockPos.getZ()); -+ } -+ -+ public static BlockPos getValidBlockPos(BlockPos blockPos, Entity entity) -+ { -+ final Level level = entity.level(); -+ -+ try -+ { -+ if (level.isInWorldBounds(blockPos)) -+ { -+ return blockPos; -+ } -+ else -+ { -+ final int x = blockPos.getX(); -+ final int y = blockPos.getY(); -+ final int z = blockPos.getZ(); -+ -+ final WorldBorder worldBorder = level.getWorldBorder(); -+ -+ final int maxX = MathUtility.safeDoubleToInt(worldBorder.getMaxX()); -+ final int maxY = level.getMaxBuildHeight(); -+ final int maxZ = MathUtility.safeDoubleToInt(worldBorder.getMaxZ()); -+ -+ final int minX = MathUtility.safeDoubleToInt(worldBorder.getMinX()); -+ final int minY = level.getMinBuildHeight(); -+ final int minZ = MathUtility.safeDoubleToInt(worldBorder.getMinZ()); -+ -+ return new BlockPos(MathUtility.clampInt(x, minX, maxX), MathUtility.clampInt(y, minY, maxY), MathUtility.clampInt(z, minZ, maxZ)); -+ } -+ } -+ catch (Exception e) -+ { // If we throw some sort of exception due to the position being crazy, catch it -+ return new BlockPos(0, 0, 0); -+ } -+ } -+} diff --git a/patches/server/0021-Don-t-log-invalid-teams-to-console.patch b/patches/server/0021-Don-t-log-invalid-teams-to-console.patch deleted file mode 100644 index 1ac1fc8..0000000 --- a/patches/server/0021-Don-t-log-invalid-teams-to-console.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Tue, 17 May 2022 05:57:52 +0100 -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 60961c54e870148b5c649045e7347ca1064b6bde..0ce25857188029335d0afd0a9f0c22b79d4b0b69 100644 ---- a/src/main/java/net/minecraft/world/entity/LivingEntity.java -+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -869,7 +869,7 @@ public abstract class LivingEntity extends Entity implements Attackable { - boolean flag = scoreboardteam != null && this.level().getScoreboard().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/0022-Fixes-out-of-bounds-HangingEntity-crash-exploit.patch b/patches/server/0022-Fixes-out-of-bounds-HangingEntity-crash-exploit.patch deleted file mode 100644 index 969c192..0000000 --- a/patches/server/0022-Fixes-out-of-bounds-HangingEntity-crash-exploit.patch +++ /dev/null @@ -1,24 +0,0 @@ -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 eaad15a4d201356c34c1a09c7fbe5c35f76a2176..e166411e05287d97ea7c9d35b19d4ae3106401c3 100644 ---- a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java -+++ b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java -@@ -280,6 +280,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/0023-Add-MasterBlockFireEvent.patch b/patches/server/0023-Add-MasterBlockFireEvent.patch deleted file mode 100644 index 454e565..0000000 --- a/patches/server/0023-Add-MasterBlockFireEvent.patch +++ /dev/null @@ -1,159 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Sun, 10 Dec 2023 18:11:55 -0600 -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 7ef14e4441a329c680a5dfe4bfb5033ffcb8f9d5..eff5bdf00b0aa7a9925ff59a62ead72509dc67b8 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.server.level.ServerLevel; -@@ -28,6 +29,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 -@@ -130,6 +132,14 @@ 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 447b0359922011fe12b1bb9628d23a47c9d7dc89..0d6be671e1512074ae1265fe93a5d5437f3929dd 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.Registry; -@@ -17,6 +19,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"; -@@ -134,6 +137,16 @@ 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 29c59e4a1283ac211b18b953ed6c03834a2587bd..fb385cd66226200ed0b8439cb6659dbac6c2b229 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; -@@ -29,6 +31,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; -@@ -259,7 +262,7 @@ public class StructureBlockEntity extends BlockEntity { - return false; - } else { - BlockPos blockPos = this.getBlockPos(); -- int i = 80; -+ // Scissors - Obfuscation fixes - BlockPos blockPos2 = new BlockPos(blockPos.getX() - 80, this.level.getMinBuildHeight(), blockPos.getZ() - 80); - BlockPos blockPos3 = new BlockPos(blockPos.getX() + 80, this.level.getMaxBuildHeight() - 1, blockPos.getZ() + 80); - Stream stream = this.getRelatedCorners(blockPos2, blockPos3); -@@ -316,6 +319,16 @@ 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(); -@@ -367,6 +380,16 @@ 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; - } -@@ -407,6 +430,15 @@ 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/0024-Reset-large-tags.patch b/patches/server/0024-Reset-large-tags.patch deleted file mode 100644 index 063e14f..0000000 --- a/patches/server/0024-Reset-large-tags.patch +++ /dev/null @@ -1,319 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Telesphoreo -Date: Mon, 15 Apr 2024 22:49:31 -0500 -Subject: [PATCH] Reset large tags - - -diff --git a/src/main/java/net/minecraft/world/ContainerHelper.java b/src/main/java/net/minecraft/world/ContainerHelper.java -index 4105bb71b1f1614b3e91478b40b85add94a9257b..52d2a8fd6e16c8d85f2544ffdb9ed4d18b298e1c 100644 ---- a/src/main/java/net/minecraft/world/ContainerHelper.java -+++ b/src/main/java/net/minecraft/world/ContainerHelper.java -@@ -2,6 +2,8 @@ package net.minecraft.world; - - import java.util.List; - import java.util.function.Predicate; -+ -+import me.totalfreedom.scissors.NbtUtility; // Scissors - import net.minecraft.core.NonNullList; - import net.minecraft.nbt.CompoundTag; - import net.minecraft.nbt.ListTag; -@@ -22,10 +24,12 @@ public class ContainerHelper { - - public static CompoundTag saveAllItems(CompoundTag nbt, NonNullList stacks, boolean setIfEmpty) { - ListTag listTag = new ListTag(); -+ long total = 0; // Scissors - - for (int i = 0; i < stacks.size(); i++) { - ItemStack itemStack = stacks.get(i); - if (!itemStack.isEmpty()) { -+ total += NbtUtility.getTagSize(itemStack.getTag()); // Scissors - CompoundTag compoundTag = new CompoundTag(); - compoundTag.putByte("Slot", (byte)i); - itemStack.save(compoundTag); -@@ -33,7 +37,7 @@ public class ContainerHelper { - } - } - -- if (!listTag.isEmpty() || setIfEmpty) { -+ if ((!listTag.isEmpty() || setIfEmpty) && !(total > NbtUtility.MAXIMUM_SIZE)) { // Scissors - nbt.put("Items", listTag); - } - -@@ -42,11 +46,19 @@ public class ContainerHelper { - - public static void loadAllItems(CompoundTag nbt, NonNullList stacks) { - ListTag listTag = nbt.getList("Items", 10); -+ long total = 0; // Scissors - Account for items inside containers - - for (int i = 0; i < listTag.size(); i++) { - CompoundTag compoundTag = listTag.getCompound(i); - int j = compoundTag.getByte("Slot") & 255; - if (j >= 0 && j < stacks.size()) { -+ // Scissors start -+ total += NbtUtility.getTagSize(compoundTag); -+ if (total >= NbtUtility.MAXIMUM_SIZE) { -+ stacks.clear(); -+ break; -+ } -+ // Scissors end - stacks.set(j, ItemStack.of(compoundTag)); - } - } -diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 1ad126d992d95062a3db08374db7a927f23a0cac..6af963d383293a4a6f8d517e2dc179ab70744b31 100644 ---- a/src/main/java/net/minecraft/world/item/ItemStack.java -+++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -23,6 +23,8 @@ import java.util.function.Predicate; - import java.util.stream.Collectors; - import java.util.stream.Stream; - import javax.annotation.Nullable; -+ -+import me.totalfreedom.scissors.NbtUtility; - import net.minecraft.ChatFormatting; - import net.minecraft.Util; - import net.minecraft.advancements.CriteriaTriggers; -@@ -278,6 +280,12 @@ public final class ItemStack { - - // CraftBukkit - break into own method - private void load(CompoundTag nbttagcompound) { -+ // Scissors start - Reset large tags -+ if (NbtUtility.isTooLarge(nbttagcompound)) { -+ // Reset tag without destroying item -+ nbttagcompound = NbtUtility.Item.removeItemData(nbttagcompound); -+ } -+ // Scissors end - this.item = (Item) BuiltInRegistries.ITEM.get(new ResourceLocation(nbttagcompound.getString("id"))); - this.count = nbttagcompound.getByte("Count"); - if (nbttagcompound.contains("tag", 10)) { -@@ -585,7 +593,11 @@ public final class ItemStack { - nbt.putString("id", minecraftkey == null ? "minecraft:air" : minecraftkey.toString()); - nbt.putByte("Count", (byte) this.count); - if (this.tag != null) { -- nbt.put("tag", this.tag.copy()); -+ // Scissors start - Don't save large tags -+ if (!NbtUtility.isTooLarge(this.tag)) { -+ nbt.put("tag", this.tag.copy()); -+ } -+ // Scissors end - } - - return nbt; -@@ -919,6 +931,7 @@ public final class ItemStack { - // Paper end - - public void setTag(@Nullable CompoundTag nbt) { -+ if (NbtUtility.isTooLarge(nbt)) return; // Scissors - Ignore large tags - this.tag = nbt; - this.processEnchantOrder(this.tag); // Paper - if (this.getItem().canBeDepleted()) { -diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index 89d06253b00604114e543ebbe12a9993ae95dc41..d0af3a9b956b37126811080d65474eacd76bc083 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -@@ -9,6 +9,8 @@ import java.util.Iterator; - import java.util.List; - import java.util.Map; - import javax.annotation.Nullable; -+ -+import me.totalfreedom.scissors.NbtUtility; - import net.minecraft.SharedConstants; - import net.minecraft.Util; - import net.minecraft.core.BlockPos; -@@ -213,6 +215,17 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit - public List transaction = new java.util.ArrayList(); - - public List getContents() { -+ // Scissors start - Account for items inside containers -+ long total = 0; -+ -+ for (ItemStack item : this.items) { -+ total += NbtUtility.getTagSize(item.getOrCreateTag()); -+ } -+ -+ if (total > NbtUtility.MAXIMUM_SIZE) { -+ this.items.clear(); -+ } -+ // Scissors end - return this.items; - } - -diff --git a/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -index 416aa989ebb18a8741cc9d605a1180ab830f6643..af7ed06c083161212784f746290129a17523575a 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -@@ -1,5 +1,6 @@ - package net.minecraft.world.level.block.entity; - -+import me.totalfreedom.scissors.NbtUtility; - import net.minecraft.core.BlockPos; - import net.minecraft.core.Direction; - import net.minecraft.core.NonNullList; -@@ -34,6 +35,17 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { - - @Override - public List getContents() { -+ // Scissors start - Account for items inside containers -+ long total = 0; -+ -+ for (ItemStack item : this.items) { -+ total += NbtUtility.getTagSize(item.getOrCreateTag()); -+ } -+ -+ if (total > NbtUtility.MAXIMUM_SIZE) { -+ this.items.clear(); -+ } -+ // Scissors end - return this.items; - } - -diff --git a/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -index 9bb542ce3a8c52e1688bb1f66fc916dd23a5fd10..d8386aa10dc1616c4da87bc8078548d13bff5bdf 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -@@ -3,6 +3,8 @@ package net.minecraft.world.level.block.entity; - import java.util.Arrays; - import java.util.Iterator; - import javax.annotation.Nullable; -+ -+import me.totalfreedom.scissors.NbtUtility; - import net.minecraft.core.BlockPos; - import net.minecraft.core.Direction; - import net.minecraft.core.NonNullList; -@@ -73,6 +75,17 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements - } - - public List getContents() { -+ // Scissors start - Account for items inside containers -+ long total = 0; -+ -+ for (ItemStack item : this.items) { -+ total += NbtUtility.getTagSize(item.getOrCreateTag()); -+ } -+ -+ if (total > NbtUtility.MAXIMUM_SIZE) { -+ this.items.clear(); -+ } -+ // Scissors end - return this.items; - } - -diff --git a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java -index 9b1243d96e0694c62fc9e82e9be540bce0d2b3ad..2cf4a854a40aabbfff2f6ee4fb9e36e8d466afd5 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java -@@ -1,5 +1,6 @@ - package net.minecraft.world.level.block.entity; - -+import me.totalfreedom.scissors.NbtUtility; - import net.minecraft.core.BlockPos; - import net.minecraft.core.Direction; - import net.minecraft.core.NonNullList; -@@ -40,6 +41,17 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement - private int maxStack = MAX_STACK; - - public List getContents() { -+ // Scissors start - Account for items inside containers -+ long total = 0; -+ -+ for (ItemStack item : this.items) { -+ total += NbtUtility.getTagSize(item.getOrCreateTag()); -+ } -+ -+ if (total > NbtUtility.MAXIMUM_SIZE) { -+ this.items.clear(); -+ } -+ // Scissors end - return this.items; - } - -diff --git a/src/main/java/net/minecraft/world/level/block/entity/DispenserBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/DispenserBlockEntity.java -index 881379681c39230a00b3a1f11cd87498984396c7..8e1ef455c1b563844c416021c478b2a34b90c418 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/DispenserBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/DispenserBlockEntity.java -@@ -1,5 +1,6 @@ - package net.minecraft.world.level.block.entity; - -+import me.totalfreedom.scissors.NbtUtility; - import net.minecraft.core.BlockPos; - import net.minecraft.core.NonNullList; - import net.minecraft.nbt.CompoundTag; -@@ -28,6 +29,17 @@ public class DispenserBlockEntity extends RandomizableContainerBlockEntity { - private int maxStack = MAX_STACK; - - public List getContents() { -+ // Scissors start - Account for items inside containers -+ long total = 0; -+ -+ for (ItemStack item : this.items) { -+ total += NbtUtility.getTagSize(item.getOrCreateTag()); -+ } -+ -+ if (total > NbtUtility.MAXIMUM_SIZE) { -+ this.items.clear(); -+ } -+ // Scissors end - return this.items; - } - -diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index cdb739df2a285032d25d84f4464f202a7a3fa578..69845474c207220c0146891be90e3232ac8a3547 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -6,6 +6,8 @@ import java.util.function.BooleanSupplier; - import java.util.stream.Collectors; - import java.util.stream.IntStream; - import javax.annotation.Nullable; -+ -+import me.totalfreedom.scissors.NbtUtility; - import net.minecraft.core.BlockPos; - import net.minecraft.core.Direction; - import net.minecraft.core.NonNullList; -@@ -57,6 +59,17 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - private int maxStack = MAX_STACK; - - public List getContents() { -+ // Scissors start - Account for items inside containers -+ long total = 0; -+ -+ for (ItemStack item : this.items) { -+ total += NbtUtility.getTagSize(item.getOrCreateTag()); -+ } -+ -+ if (total > NbtUtility.MAXIMUM_SIZE) { -+ this.items.clear(); -+ } -+ // Scissors end - return this.items; - } - -diff --git a/src/main/java/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -index 1fa22445a4ecc8c08dbcf0cc6bd39dc5003604c4..c37f0f12283f528d16fd0450075eab1974ba5057 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -@@ -4,6 +4,8 @@ import java.util.Iterator; - import java.util.List; - import java.util.stream.IntStream; - import javax.annotation.Nullable; -+ -+import me.totalfreedom.scissors.NbtUtility; - import net.minecraft.core.BlockPos; - import net.minecraft.core.Direction; - import net.minecraft.core.NonNullList; -@@ -61,6 +63,17 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl - public boolean opened; - - public List getContents() { -+ // Scissors start - Account for items inside containers -+ long total = 0; -+ -+ for (ItemStack item : this.itemStacks) { -+ total += NbtUtility.getTagSize(item.getOrCreateTag()); -+ } -+ -+ if (total > NbtUtility.MAXIMUM_SIZE) { -+ this.itemStacks.clear(); -+ } -+ // Scissors end - return this.itemStacks; - } - diff --git a/patches/server/0025-Add-spectator-teleport-event.patch b/patches/server/0025-Add-spectator-teleport-event.patch deleted file mode 100644 index 2a60d61..0000000 --- a/patches/server/0025-Add-spectator-teleport-event.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Tue, 5 Jul 2022 04:12:31 +0100 -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 860d33ac56680babd87358b1d7d2216dac3f7865..a60f594b3d7c8c30344f5e888e4309b8f75fdeaf 100644 ---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1,5 +1,6 @@ - package net.minecraft.server.network; - -+import me.totalfreedom.scissors.event.player.SpectatorTeleportEvent; // Scissors - import com.google.common.collect.Lists; - import com.google.common.primitives.Floats; - import com.mojang.authlib.GameProfile; -@@ -2033,6 +2034,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/0026-Prevent-invalid-container-events.patch b/patches/server/0026-Prevent-invalid-container-events.patch deleted file mode 100644 index 04fbdd5..0000000 --- a/patches/server/0026-Prevent-invalid-container-events.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Sun, 10 Jul 2022 02:55:01 +0100 -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 a60f594b3d7c8c30344f5e888e4309b8f75fdeaf..cfe4f98458c1b1fd311535552b99937d1f319c0e 100644 ---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -29,6 +29,7 @@ import java.util.function.UnaryOperator; - import java.util.stream.Collectors; - import java.util.stream.Stream; - import javax.annotation.Nullable; -+import net.kyori.adventure.text.format.NamedTextColor; // Scissors - import net.minecraft.ChatFormatting; - import net.minecraft.SharedConstants; - import net.minecraft.Util; -@@ -2898,6 +2899,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/0027-Disable-running-commands-in-books-by-default.patch b/patches/server/0027-Disable-running-commands-in-books-by-default.patch deleted file mode 100644 index 206074d..0000000 --- a/patches/server/0027-Disable-running-commands-in-books-by-default.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Sun, 10 Jul 2022 10:29:03 +0100 -Subject: [PATCH] Disable running commands in books by default - - -diff --git a/src/main/java/net/minecraft/world/item/WrittenBookItem.java b/src/main/java/net/minecraft/world/item/WrittenBookItem.java -index 793ab8acd7445984cff2628e3f001661dc20c8e5..0e6e0d6a9c645db0121637262a6cf90172d3c385 100644 ---- a/src/main/java/net/minecraft/world/item/WrittenBookItem.java -+++ b/src/main/java/net/minecraft/world/item/WrittenBookItem.java -@@ -2,6 +2,7 @@ package net.minecraft.world.item; - - import java.util.List; - import javax.annotation.Nullable; -+import me.totalfreedom.scissors.ScissorsConfig; // Scissors - import net.minecraft.ChatFormatting; - import net.minecraft.commands.CommandSourceStack; - import net.minecraft.core.BlockPos; -@@ -9,8 +10,7 @@ import net.minecraft.nbt.CompoundTag; - import net.minecraft.nbt.ListTag; - import net.minecraft.nbt.StringTag; - import net.minecraft.nbt.Tag; --import net.minecraft.network.chat.Component; --import net.minecraft.network.chat.ComponentUtils; -+import net.minecraft.network.chat.*; // Scissors - import net.minecraft.stats.Stats; - import net.minecraft.util.StringUtil; - import net.minecraft.world.InteractionHand; -@@ -162,9 +162,43 @@ public class WrittenBookItem extends Item { - component2 = Component.literal(text); - } - -- return Component.Serializer.toJson(component2); -+ return Component.Serializer.toJson(!ScissorsConfig.runCommandsInBooks ? sanitize(component2, 0) : component2); // Scissors - Allow server owners to disable run command in books - } - -+ // Scissors start - Allow server owners to disable run command in books -+ public static Component sanitize(Component component, int depth) -+ { -+ if (depth > 128) -+ { -+ return Component.nullToEmpty("Sanitization function depth limit exceeded"); -+ } -+ -+ MutableComponent component2 = component.copy(); -+ -+ final Style style = component2.getStyle(); -+ final ClickEvent clickEvent = style.getClickEvent(); -+ -+ if (clickEvent != null && clickEvent.getAction().equals(ClickEvent.Action.RUN_COMMAND)) -+ { -+ final String clickEventValue = clickEvent.getValue(); -+ -+ component2 = component2.copy().setStyle(style -+ .withClickEvent(null) -+ .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.nullToEmpty("Would've " + (clickEventValue.startsWith("/") ? "ran" : "said") + ": " + clickEvent.getValue()))) -+ ); -+ } -+ -+ final List processedExtra = component2.getSiblings() -+ .stream() -+ .map(comp -> sanitize(comp, depth + 1)) -+ .toList(); -+ component2.getSiblings().clear(); -+ component2.getSiblings().addAll(processedExtra); -+ -+ return component2; -+ } -+ // Scissors end -+ - @Override - public boolean isFoil(ItemStack stack) { - return true; diff --git a/patches/server/0028-Validate-block-entity-entity-tag-query-positions.patch b/patches/server/0028-Validate-block-entity-entity-tag-query-positions.patch deleted file mode 100644 index 36a4372..0000000 --- a/patches/server/0028-Validate-block-entity-entity-tag-query-positions.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Mon, 11 Jul 2022 17:29:12 -0300 -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 cfe4f98458c1b1fd311535552b99937d1f319c0e..adbb1036913ba6299f2093c84480e4147a36b344 100644 ---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1278,7 +1278,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)); -@@ -1310,7 +1310,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - @Override - public void handleBlockEntityTagQuery(ServerboundBlockEntityTagQuery 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() : null; - diff --git a/patches/server/0029-Refuse-to-convert-legacy-messages-over-1k-characters.patch b/patches/server/0029-Refuse-to-convert-legacy-messages-over-1k-characters.patch deleted file mode 100644 index f61ebc2..0000000 --- a/patches/server/0029-Refuse-to-convert-legacy-messages-over-1k-characters.patch +++ /dev/null @@ -1,18 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Tue, 16 Aug 2022 17:13:02 +0100 -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 753200057e74b8e2d5274894b982e6ee946a559e..25df28c8a2061a754cb576634b63d5ca6e5011d1 100644 ---- a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java -@@ -198,6 +198,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/0030-Fix-ClickEvents-on-Signs-bypassing-permissions.patch b/patches/server/0030-Fix-ClickEvents-on-Signs-bypassing-permissions.patch deleted file mode 100644 index e528bd0..0000000 --- a/patches/server/0030-Fix-ClickEvents-on-Signs-bypassing-permissions.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Tue, 23 Jan 2024 19:04:22 -0600 -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 927c7ea03560be0c86884cec70ee8e408e66cb07..c4bb1739ddcfd473ef788f97afa1019e24da8561 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 -@@ -8,8 +8,10 @@ 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.nbt.CompoundTag; - import net.minecraft.nbt.NbtOps; -@@ -19,6 +21,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; -@@ -32,6 +35,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; -@@ -289,6 +294,21 @@ 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/0031-Prevent-velocity-freeze.patch b/patches/server/0031-Prevent-velocity-freeze.patch deleted file mode 100644 index 2310bd1..0000000 --- a/patches/server/0031-Prevent-velocity-freeze.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Sun, 10 Dec 2023 18:41:18 -0600 -Subject: [PATCH] Prevent velocity freeze - - -diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java -index 20ce474b72894a8bb3fc21018b9d79bbdc8bb14b..b5c87bb5f5d3526600520913f04cfc6614a62b81 100644 ---- a/src/main/java/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java -+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java -@@ -1,6 +1,8 @@ - package net.minecraft.world.entity.projectile; - - import javax.annotation.Nullable; -+ -+import me.totalfreedom.scissors.MathUtility; - import net.minecraft.core.particles.ParticleOptions; - import net.minecraft.core.particles.ParticleTypes; - import net.minecraft.nbt.CompoundTag; -@@ -50,12 +52,15 @@ public abstract class AbstractHurtingProjectile extends Projectile { - // CraftBukkit end - double d6 = Math.sqrt(d3 * d3 + d4 * d4 + d5 * d5); - -- if (d6 != 0.0D) { -- this.xPower = d3 / d6 * 0.1D; -- this.yPower = d4 / d6 * 0.1D; -- this.zPower = d5 / d6 * 0.1D; -+ if (d6 != 0.0D) -+ { -+ // Scissors start - Prevent projectile velocity freeze -+ //this.xPower = d3 / d6 * 0.1D; -+ //this.yPower = d4 / d6 * 0.1D; -+ //this.zPower = d5 / d6 * 0.1D; -+ setPower(d3 / d6 * .1d, d4 / d6 * .1d, d5 / d6 * .1d); - } -- -+ // Scissors end - } - - public AbstractHurtingProjectile(EntityType type, LivingEntity owner, double directionX, double directionY, double directionZ, Level world) { -@@ -167,6 +172,25 @@ public abstract class AbstractHurtingProjectile extends Projectile { - nbt.put("power", this.newDoubleList(new double[]{this.xPower, this.yPower, this.zPower})); - } - -+ // Scissors start - Prevent projectile velocity freeze -+ public void setPower(double xPower, double yPower, double zPower) -+ { -+ if (Double.isInfinite(xPower) || Double.isInfinite(yPower) || Double.isInfinite(zPower)) -+ { -+ return; -+ } -+ -+ if (Double.isNaN(xPower) || Double.isNaN(yPower) || Double.isNaN(zPower)) -+ { -+ return; -+ } -+ -+ this.xPower = MathUtility.clampDouble(xPower, -1024, 1024); -+ this.yPower = MathUtility.clampDouble(yPower, -1024, 1024); -+ this.zPower = MathUtility.clampDouble(zPower, -1024, 1024); -+ } -+ // Scissors end -+ - @Override - public void readAdditionalSaveData(CompoundTag nbt) { - super.readAdditionalSaveData(nbt); -@@ -174,9 +198,13 @@ public abstract class AbstractHurtingProjectile extends Projectile { - ListTag nbttaglist = nbt.getList("power", 6); - - if (nbttaglist.size() == 3) { -- this.xPower = nbttaglist.getDouble(0); -- this.yPower = nbttaglist.getDouble(1); -- this.zPower = nbttaglist.getDouble(2); -+ // Scissors start - Prevent projectile velocity freeze -+ //this.xPower = nbttaglist.getDouble(0); -+ //this.yPower = nbttaglist.getDouble(1); -+ //this.zPower = nbttaglist.getDouble(2); -+ -+ setPower(nbttaglist.getDouble(0), nbttaglist.getDouble(1), nbttaglist.getDouble(2)); -+ // Scissors end - } - } - -@@ -210,9 +238,13 @@ public abstract class AbstractHurtingProjectile extends Projectile { - Vec3 vec3d = entity.getLookAngle(); - - this.setDeltaMovement(vec3d); -- this.xPower = vec3d.x * 0.1D; -- this.yPower = vec3d.y * 0.1D; -- this.zPower = vec3d.z * 0.1D; -+ // Scissors start - Prevent projectile velocity freeze -+ //this.xPower = vec3d.x * 0.1D; -+ //this.yPower = vec3d.y * 0.1D; -+ //this.zPower = vec3d.z * 0.1D; -+ -+ setPower(vec3d.x * 0.1D, vec3d.y * 0.1D, vec3d.z * 0.1D); -+ // Scissors end - this.setOwner(entity); - } - diff --git a/patches/server/0032-Patch-large-selector-distance-crash.patch b/patches/server/0032-Patch-large-selector-distance-crash.patch deleted file mode 100644 index b3d0e0e..0000000 --- a/patches/server/0032-Patch-large-selector-distance-crash.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Sun, 10 Dec 2023 18:57:50 -0600 -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 f62640152027b874d4266d868574af062bd684d7..f94385837d5ed1ef52458b73410df5fd186d66e2 100644 ---- a/src/main/java/net/minecraft/advancements/critereon/MinMaxBounds.java -+++ b/src/main/java/net/minecraft/advancements/critereon/MinMaxBounds.java -@@ -123,11 +123,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()) { -@@ -179,7 +179,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; diff --git a/patches/server/0033-Patch-invalid-entity-rotation-log-spam.patch b/patches/server/0033-Patch-invalid-entity-rotation-log-spam.patch deleted file mode 100644 index baf30e0..0000000 --- a/patches/server/0033-Patch-invalid-entity-rotation-log-spam.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Mon, 20 Mar 2023 07:04:50 +0000 -Subject: [PATCH] Patch invalid entity rotation log spam - - -diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 2ecf2d8ff546ed097cb3b547db22d28a31d29ec4..36b1a1cc66b9852d3b10c09cbf39262f51996663 100644 ---- a/src/main/java/net/minecraft/world/entity/Entity.java -+++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4751,7 +4751,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S - - public void setXRot(float pitch) { - if (!Float.isFinite(pitch)) { -- Util.logAndPauseIfInIde("Invalid entity rotation: " + pitch + ", discarding."); -+ // Scissors - Patch invalid entity rotation log spam - } else { - this.xRot = pitch; - } diff --git a/patches/server/0034-Limit-sculk-catalyst-cursor-positions.patch b/patches/server/0034-Limit-sculk-catalyst-cursor-positions.patch deleted file mode 100644 index d70a960..0000000 --- a/patches/server/0034-Limit-sculk-catalyst-cursor-positions.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Mon, 10 Apr 2023 13:56:18 -0300 -Subject: [PATCH] Limit sculk catalyst cursor positions - - -diff --git a/src/main/java/net/minecraft/world/level/block/SculkSpreader.java b/src/main/java/net/minecraft/world/level/block/SculkSpreader.java -index 01e13e6d3ebd84cff0019f56efff16747420dc95..d4058bc31ca291cbc95eeef594fc35e1ff6a3dde 100644 ---- a/src/main/java/net/minecraft/world/level/block/SculkSpreader.java -+++ b/src/main/java/net/minecraft/world/level/block/SculkSpreader.java -@@ -181,7 +181,7 @@ public class SculkSpreader { - - while (iterator.hasNext()) { - SculkSpreader.ChargeCursor sculkspreader_a = (SculkSpreader.ChargeCursor) iterator.next(); -- -+ if (!world.getMinecraftWorld().isLoadedAndInBounds(sculkspreader_a.getPos())) continue; // Scissors - sculkspreader_a.update(world, pos, random, this, shouldConvertToBlock); - if (sculkspreader_a.charge <= 0) { - world.levelEvent(3006, sculkspreader_a.getPos(), 0); diff --git a/patches/server/0035-Add-configuration-option-to-disable-chat-signatures.patch b/patches/server/0035-Add-configuration-option-to-disable-chat-signatures.patch deleted file mode 100644 index 95d46ef..0000000 --- a/patches/server/0035-Add-configuration-option-to-disable-chat-signatures.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Telesphoreo -Date: Mon, 15 Apr 2024 23:01:26 -0500 -Subject: [PATCH] Add configuration option to disable chat signatures - - -diff --git a/src/main/java/net/minecraft/network/chat/OutgoingChatMessage.java b/src/main/java/net/minecraft/network/chat/OutgoingChatMessage.java -index c87b708c368713a23a10ad97704575ee4df27891..4a8ab800d4a974aaf14872d50dcf01c806a0fe3b 100644 ---- a/src/main/java/net/minecraft/network/chat/OutgoingChatMessage.java -+++ b/src/main/java/net/minecraft/network/chat/OutgoingChatMessage.java -@@ -1,5 +1,6 @@ - package net.minecraft.network.chat; - -+import me.totalfreedom.scissors.ScissorsConfig; - import net.minecraft.server.level.ServerPlayer; - - public interface OutgoingChatMessage { -@@ -46,9 +47,19 @@ public interface OutgoingChatMessage { - // Paper end - PlayerChatMessage playerChatMessage = this.message.filter(filterMaskEnabled); - playerChatMessage = unsigned != null ? playerChatMessage.withUnsignedContent(unsigned) : playerChatMessage; // Paper -- if (!playerChatMessage.isFullyFiltered()) { -+ // Sccissors start -+ if (!playerChatMessage.isFullyFiltered() && ScissorsConfig.chatSignaturesEnabled) { - sender.connection.sendPlayerChatMessage(playerChatMessage, params); -+ return; - } -+ sender.connection.sendPlayerChatMessage(new PlayerChatMessage( -+ SignedMessageLink.unsigned(playerChatMessage.sender()), -+ null, -+ SignedMessageBody.unsigned(playerChatMessage.signedContent()), -+ unsigned, -+ playerChatMessage.filterMask() -+ ), params); -+ // Scissors end - } - } - } -diff --git a/src/main/java/net/minecraft/network/chat/SignedMessageChain.java b/src/main/java/net/minecraft/network/chat/SignedMessageChain.java -index 0af9ed92824ccf30814eceb6a2c2e5c12661c991..c92374104b4aed2f952b250c5559ab9cc83532da 100644 ---- a/src/main/java/net/minecraft/network/chat/SignedMessageChain.java -+++ b/src/main/java/net/minecraft/network/chat/SignedMessageChain.java -@@ -5,6 +5,8 @@ import java.time.Instant; - import java.util.UUID; - import java.util.function.BooleanSupplier; - import javax.annotation.Nullable; -+ -+import me.totalfreedom.scissors.ScissorsConfig; - import net.minecraft.util.SignatureValidator; - import net.minecraft.util.Signer; - import net.minecraft.world.entity.player.ProfilePublicKey; -@@ -45,7 +47,7 @@ public class SignedMessageChain { - if (!playerChatMessage.verify(signatureValidator)) { - throw new SignedMessageChain.DecodeException(Component.translatable("multiplayer.disconnect.unsigned_chat"), true, org.bukkit.event.player.PlayerKickEvent.Cause.UNSIGNED_CHAT); // Paper - kick event causes - } else { -- if (playerChatMessage.hasExpiredServer(Instant.now())) { -+ if (playerChatMessage.hasExpiredServer(Instant.now()) && ScissorsConfig.chatSignaturesEnabled) { // Scissors - LOGGER.warn("Received expired chat: '{}'. Is the client/server system time unsynchronized?", body.content()); - } - -diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 80f0f88258770862f419e4faba4cfca4c0457b2c..c0aa9520d547d6d77169fd1dbb02844b90ef4a1d 100644 ---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1,5 +1,6 @@ - package net.minecraft.server.network; - -+import me.totalfreedom.scissors.ScissorsConfig; - import me.totalfreedom.scissors.event.player.SpectatorTeleportEvent; // Scissors - import com.google.common.collect.Lists; - import com.google.common.primitives.Floats; -@@ -2243,7 +2244,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - - private void handleMessageDecodeFailure(SignedMessageChain.DecodeException exception) { - ServerGamePacketListenerImpl.LOGGER.warn("Failed to update secure chat state for {}: '{}'", this.player.getGameProfile().getName(), exception.getComponent().getString()); -- if (exception.shouldDisconnect()) { -+ if (exception.shouldDisconnect() && ScissorsConfig.chatSignaturesEnabled) { // Scissors - Do not kick when chat signatures are disabled - this.disconnect(exception.getComponent(), exception.kickCause); // Paper - kick event causes - } else { - this.player.sendSystemMessage(exception.getComponent().copy().withStyle(ChatFormatting.RED)); -@@ -2291,6 +2292,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - Optional optional = this.lastSeenMessages.applyUpdate(acknowledgment); - - if (optional.isEmpty()) { -+ if (!ScissorsConfig.chatSignaturesEnabled) return optional; // Scissors - ServerGamePacketListenerImpl.LOGGER.warn("Failed to validate message acknowledgements from {}", this.player.getName().getString()); - this.disconnect(ServerGamePacketListenerImpl.CHAT_VALIDATION_FAILED, org.bukkit.event.player.PlayerKickEvent.Cause.CHAT_VALIDATION_FAILED); // Paper - kick event causes - } -@@ -2489,6 +2491,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - - synchronized (this.lastSeenMessages) { - if (!this.lastSeenMessages.applyOffset(packet.offset())) { -+ if (!ScissorsConfig.chatSignaturesEnabled) return; // Scissors - ServerGamePacketListenerImpl.LOGGER.warn("Failed to validate message acknowledgements from {}", this.player.getName().getString()); - this.disconnect(ServerGamePacketListenerImpl.CHAT_VALIDATION_FAILED, org.bukkit.event.player.PlayerKickEvent.Cause.CHAT_VALIDATION_FAILED); // Paper - kick event causes - } -@@ -3473,6 +3476,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - @Override - public void handleChatSessionUpdate(ServerboundChatSessionUpdatePacket packet) { - PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); -+ if (!ScissorsConfig.chatSignaturesEnabled) return; // Scissors - RemoteChatSession.Data remotechatsession_a = packet.chatSession(); - ProfilePublicKey.Data profilepublickey_a = this.chatSession != null ? this.chatSession.profilePublicKey().data() : null; - ProfilePublicKey.Data profilepublickey_a1 = remotechatsession_a.profilePublicKey(); diff --git a/patches/server/0036-Limit-map-decorations.patch b/patches/server/0036-Limit-map-decorations.patch deleted file mode 100644 index 5d0db53..0000000 --- a/patches/server/0036-Limit-map-decorations.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Fri, 28 Apr 2023 16:29:23 -0300 -Subject: [PATCH] Limit map decorations - - -diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundMapItemDataPacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundMapItemDataPacket.java -index 02e3d1c9c18952ba53507f7b6887fd3c81af33a9..61573844b236838fd219526ea35df8c7b0c94026 100644 ---- a/src/main/java/net/minecraft/network/protocol/game/ClientboundMapItemDataPacket.java -+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundMapItemDataPacket.java -@@ -63,7 +63,8 @@ public class ClientboundMapItemDataPacket implements Packet 32) { -+ return; -+ } -+ // Scissors end - int i = 1 << this.scale; - float f = (float) (x - (double) this.centerX) / (float) i; - float f1 = (float) (z - (double) this.centerZ) / (float) i; diff --git a/patches/server/0037-Prevent-player-banning-using-duplicate-UUIDs.patch b/patches/server/0037-Prevent-player-banning-using-duplicate-UUIDs.patch deleted file mode 100644 index 97a2cdd..0000000 --- a/patches/server/0037-Prevent-player-banning-using-duplicate-UUIDs.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Fri, 28 Apr 2023 16:44:50 -0300 -Subject: [PATCH] Prevent player banning using duplicate UUIDs - - -diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 502bdc726b7890b00ee36871d905dea44e8719e3..1fbc8b372271bb4cd4375ca6b6b1d7e7961094fb 100644 ---- a/src/main/java/net/minecraft/server/level/ServerLevel.java -+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -1667,7 +1667,13 @@ public class ServerLevel extends Level implements WorldGenLevel { - if (entity != null) { - ServerLevel.LOGGER.warn("Force-added player with duplicate UUID {}", player.getUUID()); - entity.unRide(); -- this.removePlayerImmediately((ServerPlayer) entity, Entity.RemovalReason.DISCARDED); -+ // Scissors start - Prevent player banning using duplicate UUIDs -+ if (entity instanceof ServerPlayer serverPlayer) { -+ this.removePlayerImmediately(serverPlayer, Entity.RemovalReason.DISCARDED); -+ } else { -+ entity.discard(null); -+ } -+ // Scissors end - } - - this.entityLookup.addNewEntity(player); // Paper - rewite chunk system diff --git a/patches/server/0038-Don-t-warn-on-duplicate-entity-UUIDs.patch b/patches/server/0038-Don-t-warn-on-duplicate-entity-UUIDs.patch deleted file mode 100644 index 6667b27..0000000 --- a/patches/server/0038-Don-t-warn-on-duplicate-entity-UUIDs.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Fri, 28 Apr 2023 16:46:00 -0300 -Subject: [PATCH] Don't warn on duplicate entity UUIDs - - -diff --git a/src/main/java/io/papermc/paper/chunk/system/entity/EntityLookup.java b/src/main/java/io/papermc/paper/chunk/system/entity/EntityLookup.java -index 15ee41452992714108efe53b708b5a4e1da7c1ff..5054dce35127cb0132431021578c345fcbb1f92a 100644 ---- a/src/main/java/io/papermc/paper/chunk/system/entity/EntityLookup.java -+++ b/src/main/java/io/papermc/paper/chunk/system/entity/EntityLookup.java -@@ -415,7 +415,7 @@ public final class EntityLookup implements LevelEntityGetter { - return false; - } - if (this.entityByUUID.containsKey(entity.getUUID())) { -- LOGGER.warn("Entity uuid already exists: " + entity.getUUID() + ", mapped to " + this.entityByUUID.get(entity.getUUID()) + ", can't add " + entity); -+ // Scissors - Don't warn on duplicate entity UUIDs - return false; - } - this.entityById.put(entity.getId(), entity); diff --git a/patches/server/0039-Limit-beacon-effectRange.patch b/patches/server/0039-Limit-beacon-effectRange.patch deleted file mode 100644 index 9d85c01..0000000 --- a/patches/server/0039-Limit-beacon-effectRange.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Wed, 7 Jun 2023 16:50:35 -0300 -Subject: [PATCH] Limit beacon effectRange - - -diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -index 4b81b0180dfc96fc6a88646838a886ca5b5d301b..63ea77b3e965ff18571492d511ef7c1082441f9d 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -@@ -87,7 +87,7 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name - private double effectRange = -1; - - public double getEffectRange() { -- if (this.effectRange < 0) { -+ if (this.effectRange < 0 || this.effectRange > 256) { // Scissors - return this.levels * 10 + 10; - } else { - return effectRange; -@@ -456,6 +456,7 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name - - this.lockKey = LockCode.fromTag(nbt); - this.effectRange = nbt.contains(PAPER_RANGE_TAG, 6) ? nbt.getDouble(PAPER_RANGE_TAG) : -1; // Paper - Custom beacon ranges -+ if (this.effectRange > 256) this.effectRange = 256; // Scissors - } - - @Override diff --git a/patches/server/0040-Improve-validation-of-ResourceLocations.patch b/patches/server/0040-Improve-validation-of-ResourceLocations.patch deleted file mode 100644 index 3f0f967..0000000 --- a/patches/server/0040-Improve-validation-of-ResourceLocations.patch +++ /dev/null @@ -1,18 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Tue, 13 Jun 2023 18:29:18 -0300 -Subject: [PATCH] Improve validation of ResourceLocations - - -diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftNamespacedKey.java b/src/main/java/org/bukkit/craftbukkit/util/CraftNamespacedKey.java -index 5014192edb9616ce725fc1592832034789527b6f..64da1b0afd51720803aba0d9e86d0b1743bdb0da 100644 ---- a/src/main/java/org/bukkit/craftbukkit/util/CraftNamespacedKey.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftNamespacedKey.java -@@ -21,6 +21,7 @@ public final class CraftNamespacedKey { - } - - public static NamespacedKey fromMinecraft(ResourceLocation minecraft) { -+ if (minecraft == null) throw new IllegalArgumentException("Null ResourceLocation provided"); // Scissors - return new NamespacedKey(minecraft.getNamespace(), minecraft.getPath()); - } - diff --git a/patches/server/0041-Don-t-log-on-too-many-chained-updates.patch b/patches/server/0041-Don-t-log-on-too-many-chained-updates.patch deleted file mode 100644 index 8a19c6f..0000000 --- a/patches/server/0041-Don-t-log-on-too-many-chained-updates.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Sat, 1 Jul 2023 21:22:29 -0300 -Subject: [PATCH] Don't log on too many chained updates - - -diff --git a/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java b/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java -index 106af2b2c7ff72c7549975aef75cdcff8d9a7d97..ecdcf4cf8650270ce7595905ce9d498eee520dcd 100644 ---- a/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java -+++ b/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java -@@ -58,7 +58,7 @@ public class CollectingNeighborUpdater implements NeighborUpdater { - this.stack.push(entry); - } - } else if (this.count - 1 == this.maxChainedNeighborUpdates) { -- LOGGER.error("Too many chained neighbor updates. Skipping the rest. First skipped position: " + pos.toShortString()); -+ // Scissors - don't log - } - - if (!bl) { diff --git a/patches/server/0042-Fix-packet-related-lag-exploits.patch b/patches/server/0042-Fix-packet-related-lag-exploits.patch deleted file mode 100644 index 5601516..0000000 --- a/patches/server/0042-Fix-packet-related-lag-exploits.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Luna -Date: Tue, 4 Jul 2023 18:49:34 -0300 -Subject: [PATCH] Fix packet-related lag exploits - - -diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 8d5f4f2a0589c9c34dcff0ca95b6222b90f7d09a..88c98ba7673808819b8f85876f22743bc3a4f471 100644 ---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -865,7 +865,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - this.player.sendSystemMessage(Component.translatable("advMode.notEnabled")); - } else if (!this.player.canUseGameMasterBlocks() && (!this.player.isCreative() || !this.player.getBukkitEntity().hasPermission("minecraft.commandblock"))) { // Paper - command block permission - this.player.sendSystemMessage(Component.translatable("advMode.notAllowed")); -- } else { -+ } else if (this.player.level().isLoadedAndInBounds(packet.getPos())) { // Scissors - BaseCommandBlock commandblocklistenerabstract = null; - CommandBlockEntity tileentitycommand = null; - BlockPos blockposition = packet.getPos(); -@@ -1013,7 +1013,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - @Override - public void handleSetStructureBlock(ServerboundSetStructureBlockPacket packet) { - PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); -- if (this.player.canUseGameMasterBlocks()) { -+ if (this.player.canUseGameMasterBlocks() && this.player.level().isLoadedAndInBounds(packet.getPos())) { // Scissors - BlockPos blockposition = packet.getPos(); - BlockState iblockdata = this.player.level().getBlockState(blockposition); - BlockEntity tileentity = this.player.level().getBlockEntity(blockposition); -@@ -1071,7 +1071,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - @Override - public void handleSetJigsawBlock(ServerboundSetJigsawBlockPacket packet) { - PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); -- if (this.player.canUseGameMasterBlocks()) { -+ if (this.player.canUseGameMasterBlocks() && this.player.level().isLoadedAndInBounds(packet.getPos())) { // Scissors - BlockPos blockposition = packet.getPos(); - BlockState iblockdata = this.player.level().getBlockState(blockposition); - BlockEntity tileentity = this.player.level().getBlockEntity(blockposition); -@@ -1096,7 +1096,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - @Override - public void handleJigsawGenerate(ServerboundJigsawGeneratePacket packet) { - PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); -- if (this.player.canUseGameMasterBlocks()) { -+ if (this.player.canUseGameMasterBlocks() && this.player.level().isLoadedAndInBounds(packet.getPos())) { // Scissors - BlockPos blockposition = packet.getPos(); - BlockEntity tileentity = this.player.level().getBlockEntity(blockposition); - diff --git a/patches/server/0043-Implement-command-block-events.patch b/patches/server/0043-Implement-command-block-events.patch deleted file mode 100644 index 1381ac3..0000000 --- a/patches/server/0043-Implement-command-block-events.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Telesphoreo -Date: Mon, 15 Apr 2024 23:27:16 -0500 -Subject: [PATCH] Implement command block events - - -diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundSetCommandMinecartPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundSetCommandMinecartPacket.java -index c99fc118013cb3d4043638e2001a8297e79ddf9c..cdaa81e1f2167b29ec01cc25e51a8400deb533d2 100644 ---- a/src/main/java/net/minecraft/network/protocol/game/ServerboundSetCommandMinecartPacket.java -+++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundSetCommandMinecartPacket.java -@@ -9,7 +9,7 @@ import net.minecraft.world.level.BaseCommandBlock; - import net.minecraft.world.level.Level; - - public class ServerboundSetCommandMinecartPacket implements Packet { -- private final int entity; -+ public final int entity; // Scissors - private -> public - private final String command; - private final boolean trackOutput; - -diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 88c98ba7673808819b8f85876f22743bc3a4f471..f96c0c5007d9e1d86bfe27518815dc798e431c6a 100644 ---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1,6 +1,8 @@ - package net.minecraft.server.network; - - import me.totalfreedom.scissors.ScissorsConfig; -+import me.totalfreedom.scissors.event.block.CommandBlockPlayerEditEvent; -+import me.totalfreedom.scissors.event.block.CommandMinecartPlayerEditEvent; - import me.totalfreedom.scissors.event.player.SpectatorTeleportEvent; // Scissors - import com.google.common.collect.Lists; - import com.google.common.primitives.Floats; -@@ -155,6 +157,7 @@ import net.minecraft.world.entity.player.Inventory; - import net.minecraft.world.entity.player.ProfilePublicKey; - import net.minecraft.world.entity.projectile.AbstractArrow; - import net.minecraft.world.entity.vehicle.Boat; -+import net.minecraft.world.entity.vehicle.MinecartCommandBlock; - import net.minecraft.world.inventory.AbstractContainerMenu; - import net.minecraft.world.inventory.AnvilMenu; - import net.minecraft.world.inventory.BeaconMenu; -@@ -189,6 +192,8 @@ import net.minecraft.world.phys.Vec3; - import net.minecraft.world.phys.shapes.BooleanOp; - import net.minecraft.world.phys.shapes.Shapes; - import net.minecraft.world.phys.shapes.VoxelShape; -+import org.bukkit.craftbukkit.block.CraftCommandBlock; -+import org.bukkit.craftbukkit.entity.CraftMinecartCommand; - import org.slf4j.Logger; - - // CraftBukkit start -@@ -905,6 +910,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - this.player.level().getChunkAt(blockposition).setBlockEntity(tileentity); - } - -+ // Scissors start -+ CommandBlockPlayerEditEvent event = new CommandBlockPlayerEditEvent(this.getCraftPlayer(), commandblocklistenerabstract.getCommand(), s, new CraftCommandBlock(this.player.level().getWorld(), tileentitycommand)); -+ -+ if (!event.callEvent()) { -+ return; -+ } -+ -+ s = event.getNewCommand(); -+ // Scissors end -+ - commandblocklistenerabstract.setCommand(s); - commandblocklistenerabstract.setTrackOutput(flag); - if (!flag) { -@@ -936,7 +951,17 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - BaseCommandBlock commandblocklistenerabstract = packet.getCommandBlock(this.player.level()); - - if (commandblocklistenerabstract != null) { -- commandblocklistenerabstract.setCommand(packet.getCommand()); -+ // Scissors start - Implement command block events -+ String command = packet.getCommand(); -+ CommandMinecartPlayerEditEvent event = new CommandMinecartPlayerEditEvent(this.getCraftPlayer(), commandblocklistenerabstract.getCommand(), command, new CraftMinecartCommand(this.cserver, (MinecartCommandBlock) this.player.level().getEntity(packet.entity))); -+ -+ if (!event.callEvent()) { -+ return; -+ } -+ -+ command = event.getNewCommand(); -+ commandblocklistenerabstract.setCommand(command); -+ // Scissors end - commandblocklistenerabstract.setTrackOutput(packet.isTrackOutput()); - if (!packet.isTrackOutput()) { - commandblocklistenerabstract.setLastOutput((Component) null); diff --git a/patches/server/0044-Limit-save-data-for-Bees-and-Vexes.patch b/patches/server/0044-Limit-save-data-for-Bees-and-Vexes.patch deleted file mode 100644 index 1058b79..0000000 --- a/patches/server/0044-Limit-save-data-for-Bees-and-Vexes.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Wed, 5 Jul 2023 22:58:24 +0100 -Subject: [PATCH] Limit save data for Bees and Vexes - - -diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index f9521a6e115f0c975a7885b024c99eae300b63bf..c1598d0caee40a7d73af549b31b61ee7aae77315 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/Bee.java -+++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -234,8 +234,12 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - @Override - public void readAdditionalSaveData(CompoundTag nbt) { - this.hivePos = null; -- if (nbt.contains("HivePos")) { -- this.hivePos = NbtUtils.readBlockPos(nbt.getCompound("HivePos")); -+ if (nbt.contains("HivePos")) -+ { -+ // Scissors start - Limit HivePos -+ final BlockPos savedHivePos = NbtUtils.readBlockPos(nbt.getCompound("HivePos")); -+ this.hivePos = this.level().isLoadedAndInBounds(savedHivePos) ? savedHivePos : null; -+ // Scissors end - Limit HivePos - } - - this.savedFlowerPos = null; -diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index f443006c1e32feee97b32312814e2447a50c45e2..ad418449f5ffd4bcceb5834b1385dc69259f3a21 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/Vex.java -+++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -118,8 +118,12 @@ public class Vex extends Monster implements TraceableEntity { - @Override - public void readAdditionalSaveData(CompoundTag nbt) { - super.readAdditionalSaveData(nbt); -- if (nbt.contains("BoundX")) { -- this.boundOrigin = new BlockPos(nbt.getInt("BoundX"), nbt.getInt("BoundY"), nbt.getInt("BoundZ")); -+ if (nbt.contains("BoundX")) -+ { -+ // Scissors start - Limit Vex bound origin -+ final BlockPos savedBoundOrigin = new BlockPos(nbt.getInt("BoundX"), nbt.getInt("BoundY"), nbt.getInt("BoundZ")); -+ this.boundOrigin = this.level().isLoadedAndInBounds(savedBoundOrigin) ? savedBoundOrigin : null; -+ // Scissors end - Limit Vex bound origin - } - - if (nbt.contains("LifeTicks")) { diff --git a/patches/server/0045-Add-depth-limit-to-SNBT.patch b/patches/server/0045-Add-depth-limit-to-SNBT.patch deleted file mode 100644 index a017a6f..0000000 --- a/patches/server/0045-Add-depth-limit-to-SNBT.patch +++ /dev/null @@ -1,101 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Telesphoreo -Date: Mon, 15 Apr 2024 23:40:27 -0500 -Subject: [PATCH] Add depth limit to SNBT - - -diff --git a/src/main/java/net/minecraft/nbt/TagParser.java b/src/main/java/net/minecraft/nbt/TagParser.java -index c77860a141064aea6a0b510bb44d35fea90aee42..3be3dd61b8a27b3a8ca3c72ae5ffa2ea8fa00231 100644 ---- a/src/main/java/net/minecraft/nbt/TagParser.java -+++ b/src/main/java/net/minecraft/nbt/TagParser.java -@@ -184,9 +184,47 @@ public class TagParser { - - this.expect('}'); - this.depth--; // Paper -- return compoundTag; -+ return exceedsDepthLimit(compoundTag) ? new CompoundTag() : compoundTag; // Scissors - Add depth limit to SNBT - } - -+ // Scissors start - Add depth limit to SNBT -+ private boolean exceedsDepthLimit(Tag tag) { -+ return this.exceedsDepthLimit(0, tag); -+ } -+ -+ private boolean exceedsDepthLimit(long depth, Tag tag) { -+ if (depth > 256) { -+ return true; -+ } -+ -+ if (tag instanceof ListTag listTag) { -+ for (Tag childTag : listTag) { -+ boolean returnValue = this.exceedsDepthLimit(depth + 1, childTag); -+ -+ if (returnValue) { -+ return true; -+ } -+ } -+ } else if (tag instanceof CompoundTag compoundTag) { -+ for (String key : compoundTag.getAllKeys()) { -+ Tag childTag = compoundTag.get(key); -+ -+ if (childTag == null) { -+ continue; -+ } -+ -+ boolean returnValue = this.exceedsDepthLimit(depth + 1, childTag); -+ -+ if (returnValue) { -+ return true; -+ } -+ } -+ } -+ -+ return false; -+ } -+ // Scissors end -+ - private Tag readListTag() throws CommandSyntaxException { - this.expect('['); - this.reader.skipWhitespace(); -@@ -220,7 +258,7 @@ public class TagParser { - - this.expect(']'); - this.depth--; // Paper -- return listTag; -+ return exceedsDepthLimit(listTag) ? new ListTag() : listTag; // Scissors - Add depth limit to SNBT - } - } - -@@ -245,7 +283,7 @@ public class TagParser { - } - - private List readArray(TagType arrayTypeReader, TagType typeReader) throws CommandSyntaxException { -- List list = Lists.newArrayList(); -+ List list = Lists.newArrayList(); // Scissors - List -> List - - while (this.reader.peek() != ']') { - int i = this.reader.getCursor(); -@@ -257,11 +295,11 @@ public class TagParser { - } - - if (typeReader == ByteTag.TYPE) { -- list.add((T)(Byte)((NumericTag)tag).getAsByte()); // Paper - decompile fix -+ list.add(((NumericTag)tag).getAsByte()); // Scissors - Remove (T) cast - } else if (typeReader == LongTag.TYPE) { -- list.add((T)(Long)((NumericTag)tag).getAsLong()); // Paper - decompile fix -+ list.add(((NumericTag)tag).getAsLong()); // Scissors - Remove (T) cast - } else { -- list.add((T)(Integer)((NumericTag)tag).getAsInt()); // Paper - decompile fix -+ list.add(((NumericTag)tag).getAsInt()); // Scissors - Remove (T) cast - } - - if (!this.hasElementSeparator()) { -@@ -274,7 +312,7 @@ public class TagParser { - } - - this.expect(']'); -- return list; -+ return (List) list; // Scissors - Cast to List - } - - private boolean hasElementSeparator() { diff --git a/patches/server/0046-Mute-invalid-attributes.patch b/patches/server/0046-Mute-invalid-attributes.patch deleted file mode 100644 index 4b49c30..0000000 --- a/patches/server/0046-Mute-invalid-attributes.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Thu, 6 Jul 2023 23:01:12 +0100 -Subject: [PATCH] Mute invalid attributes - - -diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -index b99a080ab27e24d8131fda931ca70d6d271bb01c..f88b31d9bfc8b332230fa318ba2c1de14d5cc9be 100644 ---- a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -+++ b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -@@ -135,7 +135,10 @@ public class AttributeMap { - if (attributeInstance != null) { - attributeInstance.load(compoundTag); - } -- }, () -> LOGGER.warn("Ignoring unknown attribute '{}'", string)); -+ -+ }, () -> { -+ // LOGGER.warn("Ignoring unknown attribute '{}'", (Object)string); // Scissors - Mute invalid attributes -+ }); - } - } - -diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeModifier.java b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeModifier.java -index a38e91552ead256bd8dd3b74794d742555681c2d..116af10e6e2467a3e3b0095c4968a79ebb4a19d6 100644 ---- a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeModifier.java -+++ b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeModifier.java -@@ -90,7 +90,7 @@ public class AttributeModifier { - AttributeModifier.Operation operation = AttributeModifier.Operation.fromValue(nbt.getInt("Operation")); - return new AttributeModifier(uUID, nbt.getString("Name"), nbt.getDouble("Amount"), operation); - } catch (Exception var3) { -- LOGGER.warn("Unable to create attribute: {}", var3.getMessage()); -+ // LOGGER.warn("Unable to create attribute: {}", var3.getMessage()); // Scissors - Mute invalid attributes - return null; - } - } diff --git a/patches/server/0047-Mute-invalid-Enderdragon-phases.patch b/patches/server/0047-Mute-invalid-Enderdragon-phases.patch deleted file mode 100644 index f407865..0000000 --- a/patches/server/0047-Mute-invalid-Enderdragon-phases.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Thu, 6 Jul 2023 23:34:46 +0100 -Subject: [PATCH] Mute invalid Enderdragon phases - - -diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonChargePlayerPhase.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonChargePlayerPhase.java -index 1b1a210a86121049e507a497649727a99452c0a2..a8bcadbf64d5034b172427e16b1468b4c91c4518 100644 ---- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonChargePlayerPhase.java -+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonChargePlayerPhase.java -@@ -20,7 +20,7 @@ public class DragonChargePlayerPhase extends AbstractDragonPhaseInstance { - @Override - public void doServerTick() { - if (this.targetLocation == null) { -- LOGGER.warn("Aborting charge player as no target was set."); -+ // LOGGER.warn("Aborting charge player as no target was set."); // Scissors - Mute invalid Enderdragon phases - this.dragon.getPhaseManager().setPhase(EnderDragonPhase.HOLDING_PATTERN); - } else if (this.timeSinceCharge > 0 && this.timeSinceCharge++ >= 10) { - this.dragon.getPhaseManager().setPhase(EnderDragonPhase.HOLDING_PATTERN); -diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonStrafePlayerPhase.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonStrafePlayerPhase.java -index 13f60a16f07c50a278b158d64180009020a4dca6..289361cbaad2ca6392ee66627becb8f973bb1e54 100644 ---- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonStrafePlayerPhase.java -+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonStrafePlayerPhase.java -@@ -31,7 +31,7 @@ public class DragonStrafePlayerPhase extends AbstractDragonPhaseInstance { - @Override - public void doServerTick() { - if (this.attackTarget == null) { -- LOGGER.warn("Skipping player strafe phase because no player was found"); -+ // LOGGER.warn("Skipping player strafe phase because no player was found"); // Scissors - Mute invalid Enderdragon phases - this.dragon.getPhaseManager().setPhase(EnderDragonPhase.HOLDING_PATTERN); - } else { - if (this.currentPath != null && this.currentPath.isDone()) { diff --git a/patches/server/0048-Add-length-limit-to-note-block-sound.patch b/patches/server/0048-Add-length-limit-to-note-block-sound.patch deleted file mode 100644 index faaf700..0000000 --- a/patches/server/0048-Add-length-limit-to-note-block-sound.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Allink -Date: Fri, 25 Aug 2023 11:51:47 +0100 -Subject: [PATCH] Add length limit to note block sound - - -diff --git a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java -index 6f52256bfb668aee7fd1628c1c0c7b3434b847a6..74f1227ecf664cf0d4f62d6f9c3e65ffc07b146e 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java -@@ -113,7 +113,7 @@ public class SkullBlockEntity extends BlockEntity { - } - - if (nbt.contains("note_block_sound", 8)) { -- this.noteBlockSound = ResourceLocation.tryParse(nbt.getString("note_block_sound")); -+ this.noteBlockSound = ResourceLocation.tryParse(StringUtil.truncateStringIfNecessary(nbt.getString("note_block_sound"), 32767, false)); // Scissors - Add length limit to note block sound - } - - } diff --git a/patches/server/0049-Change-version-fetcher-to-AMG.patch b/patches/server/0049-Change-version-fetcher-to-AMG.patch deleted file mode 100644 index ed9fe29..0000000 --- a/patches/server/0049-Change-version-fetcher-to-AMG.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Telesphoreo -Date: Tue, 23 Jan 2024 19:01:02 -0600 -Subject: [PATCH] Change version fetcher to AMG - - -diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -index 9d687da5bdf398bb3f6c84cdf1249a7213d09f2e..48dd50d0e443a59835e92616874c9856c7cbc401 100644 ---- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -+++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -@@ -4,6 +4,7 @@ import com.destroystokyo.paper.util.VersionFetcher; - import com.google.common.base.Charsets; - import com.google.common.io.Resources; - import com.google.gson.*; -+import io.papermc.paper.util.JarManifests; // Scissors - import net.kyori.adventure.text.Component; - import net.kyori.adventure.text.event.ClickEvent; - import net.kyori.adventure.text.format.NamedTextColor; -@@ -16,11 +17,12 @@ import java.io.*; - import java.net.HttpURLConnection; - import java.net.URL; - import java.util.stream.StreamSupport; -+import org.bukkit.Bukkit; // Scissors - - public class PaperVersionFetcher implements VersionFetcher { - private static final java.util.regex.Pattern VER_PATTERN = java.util.regex.Pattern.compile("^([0-9\\.]*)\\-.*R"); // R is an anchor, will always give '-R' at end -- private static final String GITHUB_BRANCH_NAME = "master"; -- private static final String DOWNLOAD_PAGE = "https://papermc.io/downloads/paper"; -+ private static final String GITHUB_BRANCH_NAME = getBranch(); // Scissors -+ private static final String DOWNLOAD_PAGE = "https://ci.scissors.gg/job/Scissors/job/" + GITHUB_BRANCH_NAME; // Scissors - private static @Nullable String mcVer; - - @Override -@@ -31,8 +33,8 @@ public class PaperVersionFetcher implements VersionFetcher { - @Nonnull - @Override - public Component getVersionMessage(@Nonnull String serverVersion) { -- String[] parts = serverVersion.substring("git-Paper-".length()).split("[-\\s]"); -- final Component updateMessage = getUpdateStatusMessage("PaperMC/Paper", GITHUB_BRANCH_NAME, parts[0]); -+ String[] parts = serverVersion.substring("git-Scissors-".length()).split("[-\\s]"); // Scissors -+ final Component updateMessage = getUpdateStatusMessage("AtlasMediaGroup/Scissors", GITHUB_BRANCH_NAME, parts[0]); // Scissors - final Component history = getHistory(); - - return history != null ? TextComponent.ofChildren(updateMessage, Component.newline(), history) : updateMessage; -@@ -54,15 +56,24 @@ public class PaperVersionFetcher implements VersionFetcher { - return mcVer; - } - -+ // Scissors start - Allow getting git information -+ public static String getCommit() { -+ final var manifest = JarManifests.manifest(Bukkit.getServer().getClass()); -+ return manifest == null ? null : manifest.getMainAttributes().getValue("Git-Commit"); -+ } -+ -+ public static String getBranch() { -+ final var manifest = JarManifests.manifest(Bukkit.getServer().getClass()); -+ return manifest == null ? null : manifest.getMainAttributes().getValue("Git-Branch"); -+ } -+ // Scissors end -+ - private static Component getUpdateStatusMessage(@Nonnull String repo, @Nonnull String branch, @Nonnull String versionInfo) { - int distance; -- try { -- int jenkinsBuild = Integer.parseInt(versionInfo); -- distance = fetchDistanceFromSiteApi(jenkinsBuild, getMinecraftVersion()); -- } catch (NumberFormatException ignored) { -- versionInfo = versionInfo.replace("\"", ""); -- distance = fetchDistanceFromGitHub(repo, branch, versionInfo); -- } -+ // Scissors start - always use Git for version checking -+ versionInfo = getCommit(); -+ distance = fetchDistanceFromGitHub(repo, branch, versionInfo); -+ // Scissors end - - switch (distance) { - case -1: -diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index c0538206a53f0e6d9b54bddde0259b89ac73d675..5ebb80ed81d9bbd4c69a14ccd0be6c67de2fcf0d 100644 ---- a/src/main/java/org/bukkit/craftbukkit/Main.java -+++ b/src/main/java/org/bukkit/craftbukkit/Main.java -@@ -315,7 +315,7 @@ public class Main { - if (buildDate.before(deadline.getTime())) { - // Paper start - This is some stupid bullshit - System.err.println("*** Warning, you've not updated in a while! ***"); -- System.err.println("*** Please download a new build as per instructions from https://papermc.io/downloads/paper ***"); // Paper -+ System.err.println("*** Please download a new build as per instructions from https://ci.scissors.gg/job/Scissors ***"); // Paper - //System.err.println("*** Server will start in 20 seconds ***"); - //Thread.sleep(TimeUnit.SECONDS.toMillis(20)); - // Paper end diff --git a/patches/server/0050-Add-depth-limit-to-Component-deserialization.patch b/patches/server/0050-Add-depth-limit-to-Component-deserialization.patch deleted file mode 100644 index 106f185..0000000 --- a/patches/server/0050-Add-depth-limit-to-Component-deserialization.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Focusvity -Date: Mon, 5 Feb 2024 19:39:23 +1100 -Subject: [PATCH] Add depth limit to Component deserialization - - -diff --git a/src/main/java/net/minecraft/network/chat/Component.java b/src/main/java/net/minecraft/network/chat/Component.java -index ae84d06564b2560e13404f6d89f88ad71dbc2cc6..df3c03aeaee5c12c5d57584535c9c7aa01be7dd3 100644 ---- a/src/main/java/net/minecraft/network/chat/Component.java -+++ b/src/main/java/net/minecraft/network/chat/Component.java -@@ -3,9 +3,11 @@ package net.minecraft.network.chat; - import com.google.common.collect.Lists; - import com.google.gson.Gson; - import com.google.gson.GsonBuilder; -+import com.google.gson.JsonArray; - import com.google.gson.JsonDeserializationContext; - import com.google.gson.JsonDeserializer; - import com.google.gson.JsonElement; -+import com.google.gson.JsonObject; - import com.google.gson.JsonParseException; - import com.google.gson.JsonParser; - import com.google.gson.JsonSerializationContext; -@@ -13,6 +15,7 @@ import com.google.gson.JsonSerializer; - import com.google.gson.stream.JsonReader; - import com.mojang.brigadier.Message; - import com.mojang.serialization.JsonOps; -+ - import java.io.StringReader; - import java.lang.reflect.Type; - import java.util.ArrayList; -@@ -23,6 +26,9 @@ import java.util.List; - import java.util.Optional; - import java.util.UUID; - import javax.annotation.Nullable; -+ -+import me.totalfreedom.scissors.ScissorsConfig; // Scissors -+import net.minecraft.ChatFormatting; - import net.minecraft.Util; - import net.minecraft.network.chat.contents.DataSource; - import net.minecraft.network.chat.contents.KeybindContents; -@@ -33,8 +39,10 @@ import net.minecraft.network.chat.contents.SelectorContents; - import net.minecraft.network.chat.contents.TranslatableContents; - import net.minecraft.resources.ResourceLocation; - import net.minecraft.util.FormattedCharSequence; -+import net.minecraft.util.GsonHelper; - import net.minecraft.world.level.ChunkPos; - // CraftBukkit start -+import java.util.regex.Pattern; // Scissors - import java.util.stream.Stream; - // CraftBukkit end - -@@ -284,10 +292,65 @@ public interface Component extends Message, FormattedText, Iterable { - public static class Serializer { - - private static final Gson GSON = (new GsonBuilder()).disableHtmlEscaping().create(); -+ private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("%[0-9]+\\$s"); // Scissors - - private Serializer() {} - -+ // Scissors start -+ static int depthChecker(int depth) { -+ depth = depth + 1; -+ if (depth > ScissorsConfig.componentDepthLimit) { -+ throw new JsonParseException("Depth limit exceeded"); -+ } -+ return depth; -+ } -+ -+ static int getPenalty(String string) { -+ if (PLACEHOLDER_PATTERN.matcher(string).find()) { -+ long translate_placeholders = PLACEHOLDER_PATTERN.matcher(string).results().count(); -+ return (int) translate_placeholders * 12; -+ } -+ return 0; -+ } -+ - static MutableComponent deserialize(JsonElement json) { -+ int depth = 1; -+ if (!json.isJsonPrimitive()) { -+ if (!json.isJsonObject()) { -+ if (json.isJsonArray()) { -+ JsonArray jsonArray = json.getAsJsonArray(); -+ if (jsonArray.size() <= 0) throw new JsonParseException("Unexpected empty array of components"); -+ -+ for (JsonElement ignored : jsonArray) { -+ depth = depthChecker(depth); -+ } -+ } -+ } else { -+ JsonObject jsonObject = json.getAsJsonObject(); -+ if (jsonObject.has("translate")) { -+ String s = GsonHelper.getAsString(jsonObject, "translate"); -+ int penalty = getPenalty(s); -+ depth = depthChecker(depth + penalty); -+ -+ if (jsonObject.has("with")) { -+ String s1 = GsonHelper.getAsJsonArray(jsonObject, "with").toString(); -+ penalty = getPenalty(s1); -+ depth = depthChecker(depth + penalty); -+ } -+ } -+ -+ if (jsonObject.has("extra")) { -+ JsonArray jsonArray = GsonHelper.getAsJsonArray(jsonObject, "extra"); -+ if (jsonArray.size() <= 0) throw new JsonParseException("Unexpected empty array of components"); -+ -+ for (JsonElement ignored : jsonArray) { -+ depth = depthChecker(depth); -+ } -+ } -+ } -+ } -+ // Scissors end -+ - return (MutableComponent) Util.getOrThrow(ComponentSerialization.CODEC.parse(JsonOps.INSTANCE, json), JsonParseException::new); - } - diff --git a/patches/server/0051-Add-depth-limit-to-updateCustomBlockEntityTag.patch b/patches/server/0051-Add-depth-limit-to-updateCustomBlockEntityTag.patch deleted file mode 100644 index a8c588e..0000000 --- a/patches/server/0051-Add-depth-limit-to-updateCustomBlockEntityTag.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Focusvity -Date: Sun, 11 Feb 2024 19:44:20 +1100 -Subject: [PATCH] Add depth limit to updateCustomBlockEntityTag - - -diff --git a/src/main/java/net/minecraft/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java -index 8d2c0accadaf0c5d28e7db6e62a05f6c619cf02f..75d31897711cf5917bc6f8082edddbb502c46a95 100644 ---- a/src/main/java/net/minecraft/world/item/BlockItem.java -+++ b/src/main/java/net/minecraft/world/item/BlockItem.java -@@ -4,12 +4,19 @@ import java.util.Iterator; - import java.util.List; - import java.util.Map; - import java.util.Objects; -+// Scissors start -+import java.util.regex.Matcher; -+import java.util.regex.Pattern; -+// Scissors end - import java.util.stream.Stream; - import javax.annotation.Nullable; -+ -+import me.totalfreedom.scissors.ScissorsConfig; // Scissors - import net.minecraft.advancements.CriteriaTriggers; - import net.minecraft.core.BlockPos; - import net.minecraft.nbt.CompoundTag; - import net.minecraft.nbt.ListTag; -+import net.minecraft.nbt.Tag; // Scissors - import net.minecraft.network.chat.Component; - import net.minecraft.server.MinecraftServer; - import net.minecraft.server.level.ServerLevel; -@@ -240,6 +247,35 @@ public class BlockItem extends Item { - if (nbttagcompound != null) { - BlockEntity tileentity = world.getBlockEntity(pos); - -+ // Scissors start -+ if (nbttagcompound.contains("CustomName")) { -+ String customName = nbttagcompound.getString("CustomName"); -+ Pattern EXTRA_PATTERN = Pattern.compile("\"extra\":(\\[(.*?)\\{|\\[\\{)"); -+ Matcher matcher = EXTRA_PATTERN.matcher(customName); -+ if (matcher.find()) { -+ String matcherString = matcher.group(); -+ int penalty = (matcherString.startsWith("\"extra\":[{") ? (int) matcher.results().count() : matcher.group().replace("\"extra\":", "").replace("{", "").length()) * 12; -+ if (penalty > ScissorsConfig.componentDepthLimit) { -+ return false; -+ } -+ } -+ } -+ -+ for (Tag tag : nbttagcompound.tags.values()) { -+ if (tag instanceof CompoundTag compoundTag && compoundTag.contains("messages")) { -+ ListTag messagesList = compoundTag.getList("messages", 8); -+ Pattern TRANSLATE_PLACEHOLDER_PATTERN = Pattern.compile("%[0-9]+\\$s"); -+ Matcher matcher = TRANSLATE_PLACEHOLDER_PATTERN.matcher(messagesList.toString()); -+ if (matcher.find()) { -+ int penalty = (int) matcher.results().count() * 12; -+ if (penalty > ScissorsConfig.componentDepthLimit) { -+ return false; -+ } -+ } -+ } -+ } -+ // Scissors end -+ - if (tileentity != null) { - if (!world.isClientSide && tileentity.onlyOpCanSetNbt() && (player == null || !(player.canUseGameMasterBlocks() || (player.getAbilities().instabuild && player.getBukkitEntity().hasPermission("minecraft.nbt.place"))))) { // Spigot - add permission - return false;