Skip to content

Commit d957fb4

Browse files
Doc94Lulu13022002
andauthored
Call WorldGameRuleChangeEvent for World Options Menu (#13720)
Co-authored-by: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com>
1 parent d6b3a3f commit d957fb4

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

paper-api/src/main/java/io/papermc/paper/event/world/WorldGameRuleChangeEvent.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
import org.jspecify.annotations.Nullable;
1212

1313
/**
14-
* Called when a world's gamerule is changed, either by command or by api.
14+
* Called when a world's gamerule is changed, either by command, world options menu, or by api.
15+
* @see <a href="https://minecraft.wiki/w/Game_rule#Modifying_game_rules">Modifying game rules - Minecraft wiki</a>
1516
*/
1617
@NullMarked
1718
public class WorldGameRuleChangeEvent extends WorldEvent implements Cancellable {

paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,12 +584,21 @@
584584
}
585585
}
586586

587+
@@ -790,7 +_,7 @@
588+
@Override
589+
public void handleSetGameRule(final ServerboundSetGameRulePacket packet) {
590+
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
591+
- if (!this.player.permissions().hasPermission(Permissions.COMMANDS_GAMEMASTER)) {
592+
+ if (!this.player.permissions().hasPermission(Permissions.COMMANDS_GAMEMASTER) && !this.player.getBukkitEntity().hasPermission("minecraft.command.gamerule")) { // Paper - add permission check
593+
LOGGER.warn("Player {} tried to set game rule values without required permissions", this.player.getGameProfile().name());
594+
} else {
595+
GameRules gameRules = this.player.level().getGameRules();
587596
@@ -808,7 +_,7 @@
588597

589598
private <T> void setGameRuleValue(final GameRules gameRules, final GameRule<T> rule, final String value) {
590599
rule.deserialize(value).result().ifPresent(parsedValue -> {
591600
- gameRules.set(rule, (T)parsedValue, this.server);
592-
+ gameRules.set(rule, (T)parsedValue, this.player.level()); // Paper - per-world game rules
601+
+ parsedValue = org.bukkit.craftbukkit.event.CraftEventFactory.handleGameRuleSet(rule, parsedValue, this.player.level(), this.player.getBukkitEntity()).value(); // Paper - per-world game rules and event
593602
this.broadcastGameRuleChangeToOperators(rule, (T)parsedValue);
594603
});
595604
}
@@ -1953,6 +1962,15 @@
19531962
}
19541963
}
19551964
break;
1965+
@@ -1904,7 +_,7 @@
1966+
}
1967+
1968+
private void sendGameRuleValues() {
1969+
- if (!this.player.permissions().hasPermission(Permissions.COMMANDS_GAMEMASTER)) {
1970+
+ if (!this.player.permissions().hasPermission(Permissions.COMMANDS_GAMEMASTER) && !this.player.getBukkitEntity().hasPermission("minecraft.command.gamerule")) { // Paper - add permission check
1971+
LOGGER.warn("Player {} tried to request game rule values without required permissions", this.player.getGameProfile().name());
1972+
} else {
1973+
GameRules gameRules = this.player.level().getGameRules();
19561974
@@ -1920,16 +_,27 @@
19571975

19581976
@Override

paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@
7373
import net.minecraft.world.level.chunk.LevelChunk;
7474
import net.minecraft.world.level.chunk.status.ChunkStatus;
7575
import net.minecraft.world.level.gamerules.GameRule;
76-
import net.minecraft.world.level.gamerules.GameRules;
7776
import net.minecraft.world.level.levelgen.structure.StructureStart;
7877
import net.minecraft.world.level.storage.LevelData;
7978
import net.minecraft.world.level.storage.LevelResource;
@@ -88,6 +87,7 @@
8887
import org.bukkit.Difficulty;
8988
import org.bukkit.Effect;
9089
import org.bukkit.FluidCollisionMode;
90+
import org.bukkit.GameRules;
9191
import org.bukkit.Location;
9292
import org.bukkit.NamespacedKey;
9393
import org.bukkit.Particle;
@@ -1245,7 +1245,7 @@ public boolean getPVP() {
12451245

12461246
@Override
12471247
public void setPVP(boolean pvp) {
1248-
this.world.getGameRules().set(GameRules.PVP, pvp, this.world);
1248+
this.setGameRule(GameRules.PVP, pvp);
12491249
}
12501250

12511251
@Override

0 commit comments

Comments
 (0)