aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0425-Add-methods-to-get-translation-keys.patch
diff options
context:
space:
mode:
authorOwen <[email protected]>2024-03-03 17:05:34 -0500
committerGitHub <[email protected]>2024-03-03 17:05:34 -0500
commit89d51d5f298cd25d6f44388970596c6780b5664b (patch)
tree07f41f4ce7bc466ea5e35faa2575d0ec6f6c4a76 /patches/server/0425-Add-methods-to-get-translation-keys.patch
parentb21eb4d9a4d0d0bea857675e2186657592df548e (diff)
downloadPaper-89d51d5f298cd25d6f44388970596c6780b5664b.tar.gz
Paper-89d51d5f298cd25d6f44388970596c6780b5664b.zip
Allow enabling sand duping (#10191)
Because this exploit has been widely known for years and has not been fixed by Mojang, we decided that it was worth allowing people to toggle it on/off due to how easy it is to make it configurable. It should be noted that this decision does not promise all future exploits will be configurable.
Diffstat (limited to 'patches/server/0425-Add-methods-to-get-translation-keys.patch')
-rw-r--r--patches/server/0425-Add-methods-to-get-translation-keys.patch143
1 files changed, 143 insertions, 0 deletions
diff --git a/patches/server/0425-Add-methods-to-get-translation-keys.patch b/patches/server/0425-Add-methods-to-get-translation-keys.patch
new file mode 100644
index 0000000000..d602369647
--- /dev/null
+++ b/patches/server/0425-Add-methods-to-get-translation-keys.patch
@@ -0,0 +1,143 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+Date: Tue, 11 Aug 2020 19:16:09 +0200
+Subject: [PATCH] Add methods to get translation keys
+
+== AT ==
+public org.bukkit.craftbukkit.inventory.CraftMetaFirework
+public org.bukkit.craftbukkit.inventory.CraftMetaFirework getNBT(Lorg/bukkit/FireworkEffect$Type;)I
+
+Co-authored-by: MeFisto94 <[email protected]>
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
+index f041b5d80bff9c022b007e04ef1558e9116acc6b..a586442422a2b2c06b785af0d261d3e19eb1d59b 100644
+--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
+@@ -669,5 +669,10 @@ public class CraftBlock implements Block {
+ public org.bukkit.SoundGroup getBlockSoundGroup() {
+ return org.bukkit.craftbukkit.CraftSoundGroup.getSoundGroup(this.getNMS().getSoundType());
+ }
++
++ @Override
++ public String translationKey() {
++ return this.getNMS().getBlock().getDescriptionId();
++ }
+ // Paper end
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
+index f0f7fb977edb7e7009716429f007e44fa36bfcda..7aa4035a4df1ddcc71065034eafd569ca59be810 100644
+--- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
++++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
+@@ -152,6 +152,11 @@ public class CraftEnchantment extends Enchantment implements Handleable<net.mine
+ public net.kyori.adventure.text.Component displayName(int level) {
+ return io.papermc.paper.adventure.PaperAdventure.asAdventure(getHandle().getFullname(level));
+ }
++
++ @Override
++ public String translationKey() {
++ return this.handle.getDescriptionId();
++ }
+ // Paper end
+
+ @Override
+diff --git a/src/test/java/io/papermc/paper/world/TranslationKeyTest.java b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java
+index 7f8b6462d2a1bbd39a870d2543bebc135f7eb45b..dbd1dc4453bd26fb6116b62f6ccbf69e92e09fc4 100644
+--- a/src/test/java/io/papermc/paper/world/TranslationKeyTest.java
++++ b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java
+@@ -1,12 +1,27 @@
+ package io.papermc.paper.world;
+
+ import com.destroystokyo.paper.ClientOption;
++import java.util.Map;
++import net.minecraft.core.registries.BuiltInRegistries;
++import net.minecraft.network.chat.contents.TranslatableContents;
++import net.minecraft.resources.ResourceKey;
++import net.minecraft.resources.ResourceLocation;
+ import net.minecraft.world.entity.player.ChatVisiblity;
++import net.minecraft.world.level.GameType;
++import net.minecraft.world.level.biome.Biome;
+ import org.bukkit.Difficulty;
++import org.bukkit.FireworkEffect;
++import org.bukkit.GameMode;
++import org.bukkit.GameRule;
++import org.bukkit.MusicInstrument;
++import org.bukkit.attribute.Attribute;
++import org.bukkit.craftbukkit.util.CraftNamespacedKey;
++import org.bukkit.support.AbstractTestingBase;
+ import org.junit.jupiter.api.Assertions;
++import org.junit.jupiter.api.Disabled;
+ import org.junit.jupiter.api.Test;
+
+-public class TranslationKeyTest {
++public class TranslationKeyTest extends AbstractTestingBase {
+
+ @Test
+ public void testChatVisibilityKeys() {
+@@ -15,4 +30,67 @@ public class TranslationKeyTest {
+ Assertions.assertEquals(ChatVisiblity.valueOf(chatVisibility.name()).getKey(), chatVisibility.translationKey(), chatVisibility + "'s translation key doesn't match");
+ }
+ }
++
++ @Test
++ public void testDifficultyKeys() {
++ for (Difficulty bukkitDifficulty : Difficulty.values()) {
++ Assertions.assertEquals(((TranslatableContents) net.minecraft.world.Difficulty.byId(bukkitDifficulty.ordinal()).getDisplayName().getContents()).getKey(), bukkitDifficulty.translationKey(), bukkitDifficulty + "'s translation key doesn't match");
++ }
++ }
++
++ @Test
++ public void testGameruleKeys() {
++ for (GameRule<?> rule : GameRule.values()) {
++ Assertions.assertEquals(org.bukkit.craftbukkit.CraftWorld.getGameRulesNMS().get(rule.getName()).getDescriptionId(), rule.translationKey(), rule.getName() + "'s translation doesn't match");
++ }
++ }
++
++ @Test
++ public void testAttributeKeys() {
++ for (Attribute attribute : Attribute.values()) {
++ Assertions.assertEquals(org.bukkit.craftbukkit.attribute.CraftAttribute.bukkitToMinecraft(attribute).getDescriptionId(), attribute.translationKey(), "translation key mismatch for " + attribute);
++ }
++ }
++
++ @Test
++ public void testFireworkEffectType() {
++ for (FireworkEffect.Type type : FireworkEffect.Type.values()) {
++ Assertions.assertEquals(net.minecraft.world.item.FireworkRocketItem.Shape.byId(org.bukkit.craftbukkit.inventory.CraftMetaFirework.getNBT(type)).getName(), org.bukkit.FireworkEffect.Type.NAMES.key(type), "translation key mismatch for " + type);
++ }
++ }
++
++ @Test
++ @Disabled // TODO fix
++ public void testCreativeCategory() {
++ // for (CreativeModeTab tab : CreativeModeTabs.tabs()) {
++ // CreativeCategory category = Objects.requireNonNull(CraftCreativeCategory.fromNMS(tab));
++ // Assertions.assertEquals("translation key mismatch for " + category, ((TranslatableContents) tab.getDisplayName().getContents()).getKey(), category.translationKey());
++ // }
++ }
++
++ @Test
++ public void testGameMode() {
++ for (GameType nms : GameType.values()) {
++ GameMode bukkit = GameMode.getByValue(nms.getId());
++ Assertions.assertNotNull(bukkit);
++ Assertions.assertEquals(((TranslatableContents) nms.getLongDisplayName().getContents()).getKey(), bukkit.translationKey(), "translation key mismatch for " + bukkit);
++ }
++ }
++
++ @Test
++ public void testBiome() {
++ for (Map.Entry<ResourceKey<Biome>, Biome> nms : AbstractTestingBase.BIOMES.entrySet()) {
++ org.bukkit.block.Biome bukkit = org.bukkit.block.Biome.valueOf(nms.getKey().location().getPath().toUpperCase());
++ Assertions.assertEquals(nms.getKey().location().toLanguageKey("biome"), bukkit.translationKey(), "translation key mismatch for " + bukkit);
++ }
++ }
++
++ @Test
++ public void testMusicInstrument() {
++ for (final ResourceLocation nms : BuiltInRegistries.INSTRUMENT.keySet()) {
++ final MusicInstrument bukkit = MusicInstrument.getByKey(CraftNamespacedKey.fromMinecraft(nms));
++ Assertions.assertNotNull(bukkit, "Missing bukkit instrument for " + nms);
++ Assertions.assertEquals(nms.toLanguageKey("instrument"), bukkit.translationKey(), "translation key mismatch for " + bukkit);
++ }
++ }
+ }