From 121a7bf4ebd42beb9285a694039c2868b4148b07 Mon Sep 17 00:00:00 2001 From: DerEchtePilz <81232921+DerEchtePilz@users.noreply.github.com> Date: Mon, 14 Apr 2025 13:21:14 +0200 Subject: [PATCH] Make GameRule a FeatureDependant (#12429) --- build-data/paper.at | 1 + paper-api/src/main/java/org/bukkit/GameRule.java | 6 +++--- .../minecraft/world/level/GameRules.java.patch | 10 +++++++--- .../world/flag/PaperFeatureFlagProviderImpl.java | 16 ++++++++++++++-- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/build-data/paper.at b/build-data/paper.at index 78f05d794..494df2d8b 100644 --- a/build-data/paper.at +++ b/build-data/paper.at @@ -575,6 +575,7 @@ public net.minecraft.world.level.BaseSpawner spawnCount public net.minecraft.world.level.BaseSpawner spawnDelay public net.minecraft.world.level.BaseSpawner spawnPotentials public net.minecraft.world.level.BaseSpawner spawnRange +public net.minecraft.world.level.GameRules GAME_RULE_TYPES public net.minecraft.world.level.GameRules$Value deserialize(Ljava/lang/String;)V public net.minecraft.world.level.GameRules$Value onChanged(Lnet/minecraft/server/MinecraftServer;)V public net.minecraft.world.level.Level blockEntityTickers diff --git a/paper-api/src/main/java/org/bukkit/GameRule.java b/paper-api/src/main/java/org/bukkit/GameRule.java index cf81c86c6..d0d215a80 100644 --- a/paper-api/src/main/java/org/bukkit/GameRule.java +++ b/paper-api/src/main/java/org/bukkit/GameRule.java @@ -1,6 +1,7 @@ package org.bukkit; import com.google.common.base.Preconditions; +import io.papermc.paper.world.flag.FeatureDependant; import java.util.HashMap; import java.util.Map; import org.jetbrains.annotations.NotNull; @@ -15,7 +16,7 @@ import org.jetbrains.annotations.Nullable; * * @param type of rule (Boolean or Integer) */ -public final class GameRule implements net.kyori.adventure.translation.Translatable { // Paper - Adventure translations +public final class GameRule implements net.kyori.adventure.translation.Translatable, FeatureDependant { private static Map> gameRules = new HashMap<>(); // Boolean rules @@ -377,10 +378,9 @@ public final class GameRule implements net.kyori.adventure.translation.Transl return gameRules.values().toArray(new GameRule[gameRules.size()]); } - // Paper start @Override public @NotNull String translationKey() { return "gamerule." + this.name; } - // Paper end + } diff --git a/paper-server/patches/sources/net/minecraft/world/level/GameRules.java.patch b/paper-server/patches/sources/net/minecraft/world/level/GameRules.java.patch index b644ae815..5378975da 100644 --- a/paper-server/patches/sources/net/minecraft/world/level/GameRules.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/level/GameRules.java.patch @@ -14,7 +14,7 @@ + public static final int DEFAULT_RANDOM_TICK_SPEED = 3; static final Logger LOGGER = LogUtils.getLogger(); - private static final Map, GameRules.Type> GAME_RULE_TYPES = Maps.newTreeMap(Comparator.comparing(entry -> entry.id)); + public static final Map, GameRules.Type> GAME_RULE_TYPES = Maps.newTreeMap(Comparator.comparing(entry -> entry.id)); @@ -86,10 +_,10 @@ "sendCommandFeedback", GameRules.Category.CHAT, GameRules.BooleanValue.create(true) ); @@ -225,8 +225,12 @@ final String id; private final GameRules.Category category; -@@ -575,7 +_,7 @@ - public static class Type> { +@@ -572,10 +_,10 @@ + } + } + +- public static class Type> { ++ public static class Type> implements net.minecraft.world.flag.FeatureElement { // Paper - FeatureDependant for GameRule final Supplier> argument; private final Function, T> constructor; - final BiConsumer callback; diff --git a/paper-server/src/main/java/io/papermc/paper/world/flag/PaperFeatureFlagProviderImpl.java b/paper-server/src/main/java/io/papermc/paper/world/flag/PaperFeatureFlagProviderImpl.java index e5b67fe0d..207a67d99 100644 --- a/paper-server/src/main/java/io/papermc/paper/world/flag/PaperFeatureFlagProviderImpl.java +++ b/paper-server/src/main/java/io/papermc/paper/world/flag/PaperFeatureFlagProviderImpl.java @@ -4,15 +4,16 @@ import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import java.util.Collections; import java.util.HashSet; +import java.util.Map; import java.util.Set; import net.minecraft.world.flag.FeatureElement; import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.level.GameRules; import org.bukkit.FeatureFlag; +import org.bukkit.GameRule; import org.bukkit.craftbukkit.entity.CraftEntityType; -import org.bukkit.craftbukkit.entity.CraftEntityTypes; import org.bukkit.craftbukkit.potion.CraftPotionType; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.entity.EntityType; import org.bukkit.potion.PotionType; @@ -50,8 +51,19 @@ public class PaperFeatureFlagProviderImpl implements FeatureFlagProvider { return CraftEntityType.bukkitToMinecraft(entityType); } else if (dependant instanceof final PotionType potionType) { return CraftPotionType.bukkitToMinecraft(potionType); + } else if (dependant instanceof final GameRule gameRule) { + return getGameRuleType(gameRule.getName()); } else { throw new IllegalArgumentException(dependant + " is not a valid feature dependant"); } } + + private static GameRules.Type getGameRuleType(final String name) { + for (final Map.Entry, GameRules.Type> gameRules : GameRules.GAME_RULE_TYPES.entrySet()) { + if (gameRules.getKey().getId().equals(name)) { + return gameRules.getValue(); + } + } + return null; + } }