From 0a04c3fe228cdb2ab6c4cac2586cb798fe218eff Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Wed, 12 Feb 2025 23:15:37 +0100 Subject: [PATCH] Fix some NPEs (#12105) --- .../minecraft/world/level/GameRules.java.patch | 8 ++++---- .../org/bukkit/craftbukkit/CraftServer.java | 8 +++++++- .../org/bukkit/craftbukkit/CraftWorld.java | 18 +++++++++--------- 3 files changed, 20 insertions(+), 14 deletions(-) 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 0e251ca8c9..e4e1139861 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 @@ -129,9 +129,9 @@ - this.value = BoolArgumentType.getBool(context, paramName); + // Paper start - Add WorldGameRuleChangeEvent + protected void updateFromArgument(CommandContext<CommandSourceStack> context, String paramName, GameRules.Key<BooleanValue> gameRuleKey) { -+ io.papermc.paper.event.world.WorldGameRuleChangeEvent event = new io.papermc.paper.event.world.WorldGameRuleChangeEvent(context.getSource().getBukkitWorld(), context.getSource().getBukkitSender(), (org.bukkit.GameRule<Boolean>) org.bukkit.GameRule.getByName(gameRuleKey.toString()), String.valueOf(BoolArgumentType.getBool(context, paramName))); -+ if (!event.callEvent()) return; -+ this.value = Boolean.parseBoolean(event.getValue()); ++ io.papermc.paper.event.world.WorldGameRuleChangeEvent event = new io.papermc.paper.event.world.WorldGameRuleChangeEvent(context.getSource().getBukkitWorld(), context.getSource().getBukkitSender(), (org.bukkit.GameRule<Boolean>) org.bukkit.GameRule.getByName(gameRuleKey.toString()), String.valueOf(BoolArgumentType.getBool(context, paramName))); ++ if (!event.callEvent()) return; ++ this.value = Boolean.parseBoolean(event.getValue()); + // Paper end - Add WorldGameRuleChangeEvent } @@ -197,7 +197,7 @@ + io.papermc.paper.event.world.WorldGameRuleChangeEvent event = new io.papermc.paper.event.world.WorldGameRuleChangeEvent(context.getSource().getBukkitWorld(), context.getSource().getBukkitSender(), (org.bukkit.GameRule<Integer>) org.bukkit.GameRule.getByName(gameRuleKey.toString()), String.valueOf(IntegerArgumentType.getInteger(context, paramName))); + if (!event.callEvent()) return; + this.value = Integer.parseInt(event.getValue()); -+ // Paper end - Add WorldGameRuleChangeEvent ++ // Paper end - Add WorldGameRuleChangeEvent } public int get() { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java index d162c9c576..cf5bcb0ebc 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -131,6 +131,7 @@ import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.WorldBorder; import org.bukkit.WorldCreator; +import org.bukkit.block.BlockType; import org.bukkit.block.data.BlockData; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarFlag; @@ -2852,8 +2853,13 @@ public final class CraftServer implements Server { @Override public BlockData createBlockData(org.bukkit.Material material, String data) { Preconditions.checkArgument(material != null || data != null, "Must provide one of material or data"); + BlockType type = null; + if (material != null) { + type = material.asBlockType(); + Preconditions.checkArgument(type != null, "Provided material must be a block"); + } - return CraftBlockData.newData((material != null) ? material.asBlockType() : null, data); + return CraftBlockData.newData(type, data); } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 284b58ece6..600a0f423a 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -2,14 +2,11 @@ package org.bukkit.craftbukkit; import com.google.common.base.Preconditions; import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.mojang.datafixers.util.Pair; import io.papermc.paper.FeatureHooks; import io.papermc.paper.raytracing.RayTraceTarget; import io.papermc.paper.registry.RegistryAccess; import io.papermc.paper.registry.RegistryKey; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import io.papermc.paper.raytracing.PositionedRayTraceConfigurationBuilder; import io.papermc.paper.raytracing.PositionedRayTraceConfigurationBuilderImpl; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; @@ -45,13 +42,11 @@ import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.DistanceManager; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.level.Ticket; import net.minecraft.server.level.TicketType; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; -import net.minecraft.util.SortedArraySet; import net.minecraft.util.Unit; import net.minecraft.world.entity.EntitySpawnReason; import net.minecraft.world.entity.EntityType; @@ -87,7 +82,6 @@ import org.bukkit.NamespacedKey; import org.bukkit.Note; import org.bukkit.Particle; import org.bukkit.Raid; -import org.bukkit.Registry; import org.bukkit.Sound; import org.bukkit.TreeType; import org.bukkit.World; @@ -2078,13 +2072,19 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public <T> T getGameRuleValue(GameRule<T> rule) { Preconditions.checkArgument(rule != null, "GameRule cannot be null"); - return this.convert(rule, this.getHandle().getGameRules().getRule(this.getGameRulesNMS().get(rule.getName()))); + GameRules.Key<? extends GameRules.Value<?>> key = this.getGameRulesNMS().get(rule.getName()); + Preconditions.checkArgument(key != null, "GameRule '%s' is not available", rule.getName()); + + return this.getGameRuleResult(rule, this.getHandle().getGameRules().getRule(key)); } @Override public <T> T getGameRuleDefault(GameRule<T> rule) { Preconditions.checkArgument(rule != null, "GameRule cannot be null"); - return this.convert(rule, this.getGameRuleDefinitions().get(rule.getName()).createRule()); + GameRules.Type<?> type = this.getGameRuleDefinitions().get(rule.getName()); + Preconditions.checkArgument(type != null, "GameRule '%s' is not available", rule.getName()); + + return this.getGameRuleResult(rule, type.createRule()); } @Override @@ -2104,7 +2104,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { return true; } - private <T> T convert(GameRule<T> rule, GameRules.Value<?> value) { + private <T> T getGameRuleResult(GameRule<T> rule, GameRules.Value<?> value) { if (value == null) { return null; }