Skip to content

Commit 0ab613f

Browse files
Implement new gamerule menu (#6304)
* Start on implementing new gamerule packets and proper ViaVersion-based Java server version detection * More work on gamerules et al * Also add 26.1 * Yeet the JavaVersion stuff for now, that needs wayyyyyyyyy more testing * Load deprecated language key file * Cherry-pick language deprecation handling, add gamerule category based sorting * <3 * Fix min/max swap, yeet unused permission * Address review * Fix tests and Javadocs --------- Co-authored-by: Eclipse <eclipse@eclipseisoffline.xyz>
1 parent b91737f commit 0ab613f

18 files changed

Lines changed: 634 additions & 303 deletions

File tree

bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/world/manager/GeyserSpigotWorldManager.java

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,12 @@
3434
import org.cloudburstmc.math.vector.Vector3i;
3535
import org.geysermc.erosion.bukkit.BukkitUtils;
3636
import org.geysermc.erosion.bukkit.SchedulerUtils;
37-
import org.geysermc.geyser.GeyserImpl;
38-
import org.geysermc.geyser.level.GameRule;
3937
import org.geysermc.geyser.level.WorldManager;
4038
import org.geysermc.geyser.registry.BlockRegistries;
4139
import org.geysermc.geyser.session.GeyserSession;
4240
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
4341

4442
import java.util.List;
45-
import java.util.Objects;
4643
import java.util.concurrent.CompletableFuture;
4744
import java.util.function.Consumer;
4845

@@ -86,38 +83,6 @@ public boolean hasOwnChunkCache() {
8683
return true;
8784
}
8885

89-
public boolean getGameRuleBool(GeyserSession session, GameRule gameRule) {
90-
org.bukkit.GameRule<?> bukkitGameRule = org.bukkit.GameRule.getByName(gameRule.getJavaID());
91-
if (bukkitGameRule == null) {
92-
GeyserImpl.getInstance().getLogger().debug("Unknown game rule " + gameRule.getJavaID());
93-
return gameRule.getDefaultBooleanValue();
94-
}
95-
96-
Player bukkitPlayer = Objects.requireNonNull(Bukkit.getPlayer(session.getPlayerEntity().uuid()));
97-
Object value = bukkitPlayer.getWorld().getGameRuleValue(bukkitGameRule);
98-
if (value instanceof Boolean booleanValue) {
99-
return booleanValue;
100-
}
101-
GeyserImpl.getInstance().getLogger().debug("Expected a bool for " + gameRule + " but got " + value);
102-
return gameRule.getDefaultBooleanValue();
103-
}
104-
105-
@Override
106-
public int getGameRuleInt(GeyserSession session, GameRule gameRule) {
107-
org.bukkit.GameRule<?> bukkitGameRule = org.bukkit.GameRule.getByName(gameRule.getJavaID());
108-
if (bukkitGameRule == null) {
109-
GeyserImpl.getInstance().getLogger().debug("Unknown game rule " + gameRule.getJavaID());
110-
return gameRule.getDefaultIntValue();
111-
}
112-
Player bukkitPlayer = Objects.requireNonNull(Bukkit.getPlayer(session.getPlayerEntity().uuid()));
113-
Object value = bukkitPlayer.getWorld().getGameRuleValue(bukkitGameRule);
114-
if (value instanceof Integer intValue) {
115-
return intValue;
116-
}
117-
GeyserImpl.getInstance().getLogger().debug("Expected an int for " + gameRule + " but got " + value);
118-
return gameRule.getDefaultIntValue();
119-
}
120-
12186
@Override
12287
public GameMode getDefaultGameMode(GeyserSession session) {
12388
return GameMode.byId(Bukkit.getDefaultGameMode().ordinal());

core/src/main/java/org/geysermc/geyser/GeyserImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ public void initialize() {
262262
return;
263263
}
264264

265+
MinecraftLocale.downloadDeprecations();
265266
MinecraftLocale.ensureEN_US();
266267
String locale = GeyserLocale.getDefaultLocale();
267268
if (!"en_us".equals(locale)) {

core/src/main/java/org/geysermc/geyser/Permissions.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public final class Permissions {
3939

4040
public static final String CHECK_UPDATE = register("geyser.update");
4141
public static final String SERVER_SETTINGS = register("geyser.settings.server");
42-
public static final String SETTINGS_GAMERULES = register("geyser.settings.gamerules");
4342

4443
private Permissions() {
4544
//no

core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.geysermc.geyser.command.defaults.CustomOptionsCommand;
4949
import org.geysermc.geyser.command.defaults.DumpCommand;
5050
import org.geysermc.geyser.command.defaults.ExtensionsCommand;
51+
import org.geysermc.geyser.command.defaults.GameruleCommand;
5152
import org.geysermc.geyser.command.defaults.HelpCommand;
5253
import org.geysermc.geyser.command.defaults.ListCommand;
5354
import org.geysermc.geyser.command.defaults.OffhandCommand;
@@ -170,6 +171,7 @@ public CommandRegistry(GeyserImpl geyser, CommandManager<GeyserCommandSource> cl
170171
registerBuiltInCommand(new PingCommand("ping", "geyser.commands.ping.desc", "geyser.command.ping"));
171172
registerBuiltInCommand(new CustomOptionsCommand("options", "geyser.commands.options.desc", "geyser.command.options"));
172173
registerBuiltInCommand(new QuickActionsCommand("quickactions", "geyser.commands.quickactions.desc", "geyser.command.quickactions"));
174+
registerBuiltInCommand(new GameruleCommand("gamerules", "geyser.commands.gamerules.desc", "geyser.command.gamerules"));
173175

174176
if (this.geyser.platformType() == PlatformType.STANDALONE) {
175177
registerBuiltInCommand(new StopCommand(geyser, "stop", "geyser.commands.stop.desc", "geyser.command.stop"));
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright (c) 2026 GeyserMC. http://geysermc.org
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining a copy
5+
* of this software and associated documentation files (the "Software"), to deal
6+
* in the Software without restriction, including without limitation the rights
7+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
* copies of the Software, and to permit persons to whom the Software is
9+
* furnished to do so, subject to the following conditions:
10+
*
11+
* The above copyright notice and this permission notice shall be included in
12+
* all copies or substantial portions of the Software.
13+
*
14+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+
* THE SOFTWARE.
21+
*
22+
* @author GeyserMC
23+
* @link https://github.com/GeyserMC/Geyser
24+
*/
25+
26+
package org.geysermc.geyser.command.defaults;
27+
28+
import org.checkerframework.checker.nullness.qual.NonNull;
29+
import org.geysermc.geyser.api.util.TriState;
30+
import org.geysermc.geyser.command.GeyserCommand;
31+
import org.geysermc.geyser.command.GeyserCommandSource;
32+
import org.geysermc.geyser.session.GeyserSession;
33+
import org.incendo.cloud.context.CommandContext;
34+
35+
public class GameruleCommand extends GeyserCommand {
36+
37+
public GameruleCommand(@NonNull String name, @NonNull String description, @NonNull String permission) {
38+
super(name, description, permission, TriState.NOT_SET, true, true);
39+
}
40+
41+
@Override
42+
public void execute(CommandContext<GeyserCommandSource> context) {
43+
GeyserSession session = context.sender().connection();
44+
if (session != null) {
45+
session.getGameRuleHandler().requestGamerules();
46+
}
47+
}
48+
}

core/src/main/java/org/geysermc/geyser/level/GameRule.java

Lines changed: 0 additions & 130 deletions
This file was deleted.

core/src/main/java/org/geysermc/geyser/level/GeyserWorldManager.java

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525

2626
package org.geysermc.geyser.level;
2727

28-
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
29-
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
3028
import org.cloudburstmc.math.vector.Vector3i;
3129
import org.geysermc.erosion.packet.backendbound.BackendboundBatchBlockRequestPacket;
3230
import org.geysermc.erosion.packet.backendbound.BackendboundBlockRequestPacket;
@@ -38,7 +36,6 @@
3836
import java.util.concurrent.CompletableFuture;
3937

4038
public class GeyserWorldManager extends WorldManager {
41-
private final Object2ObjectMap<String, String> gameruleCache = new Object2ObjectOpenHashMap<>();
4239

4340
@Override
4441
public int getBlockAt(GeyserSession session, int x, int y, int z) {
@@ -89,32 +86,6 @@ public boolean hasOwnChunkCache() {
8986
return false;
9087
}
9188

92-
@Override
93-
public void setGameRule(GeyserSession session, String name, Object value) {
94-
super.setGameRule(session, name, value);
95-
gameruleCache.put(name, String.valueOf(value));
96-
}
97-
98-
@Override
99-
public boolean getGameRuleBool(GeyserSession session, GameRule gameRule) {
100-
String value = gameruleCache.get(gameRule.getJavaID());
101-
if (value != null) {
102-
return Boolean.parseBoolean(value);
103-
}
104-
105-
return gameRule.getDefaultBooleanValue();
106-
}
107-
108-
@Override
109-
public int getGameRuleInt(GeyserSession session, GameRule gameRule) {
110-
String value = gameruleCache.get(gameRule.getJavaID());
111-
if (value != null) {
112-
return Integer.parseInt(value);
113-
}
114-
115-
return gameRule.getDefaultIntValue();
116-
}
117-
11889
@Override
11990
public GameMode getDefaultGameMode(GeyserSession session) {
12091
return GameMode.SURVIVAL;

0 commit comments

Comments
 (0)