diff --git a/patches/server/Add-ignore-discounts-API.patch b/patches/server/Add-ignore-discounts-API.patch index 42d04a2958..24654d6051 100644 --- a/patches/server/Add-ignore-discounts-API.patch +++ b/patches/server/Add-ignore-discounts-API.patch @@ -48,11 +48,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 private CraftMerchantRecipe bukkitHandle; @@ -0,0 +0,0 @@ public class MerchantOffer { + return (this.bukkitHandle == null) ? this.bukkitHandle = new CraftMerchantRecipe(this) : this.bukkitHandle; + } + +- public MerchantOffer(ItemCost baseCostA, Optional costB, ItemStack result, int uses, int maxUses, int experience, float priceMultiplier, int demand, CraftMerchantRecipe bukkit) { ++ public MerchantOffer(ItemCost baseCostA, Optional costB, ItemStack result, int uses, int maxUses, int experience, float priceMultiplier, int demand, final boolean ignoreDiscounts, CraftMerchantRecipe bukkit) { // Paper + this(baseCostA, costB, result, uses, maxUses, experience, priceMultiplier, demand); ++ this.ignoreDiscounts = ignoreDiscounts; // Paper + this.bukkitHandle = bukkit; } // CraftBukkit end - private MerchantOffer(ItemCost firstBuyItem, Optional secondBuyItem, ItemStack sellItem, int uses, int maxUses, boolean rewardingPlayerExperience, int specialPrice, int demandBonus, float priceMultiplier, int merchantExperience) { -+ private MerchantOffer(ItemCost firstBuyItem, Optional secondBuyItem, ItemStack sellItem, int uses, int maxUses, boolean rewardingPlayerExperience, int specialPrice, int demandBonus, float priceMultiplier, int merchantExperience, boolean ignoreDiscounts) { // Paper ++ private MerchantOffer(ItemCost firstBuyItem, Optional secondBuyItem, ItemStack sellItem, int uses, int maxUses, boolean rewardingPlayerExperience, int specialPrice, int demandBonus, float priceMultiplier, int merchantExperience, final boolean ignoreDiscounts) { // Paper this.baseCostA = firstBuyItem; this.costB = secondBuyItem; this.result = sellItem; @@ -60,7 +68,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 this.demand = demandBonus; this.priceMultiplier = priceMultiplier; this.xp = merchantExperience; -+ this.ignoreDiscounts = ignoreDiscounts; ++ this.ignoreDiscounts = ignoreDiscounts; // Paper } public MerchantOffer(ItemCost buyItem, ItemStack sellItem, int maxUses, int merchantExperience, float priceMultiplier) { diff --git a/patches/server/Adventure.patch b/patches/server/Adventure.patch index 475ecc5959..e56ccde62e 100644 --- a/patches/server/Adventure.patch +++ b/patches/server/Adventure.patch @@ -5260,7 +5260,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + public Inventory createInventory(InventoryHolder owner, InventoryType type, net.kyori.adventure.text.Component title) { + Container te = getTileEntity(); + if (te instanceof RandomizableContainerBlockEntity) { -+ ((RandomizableContainerBlockEntity) te).setCustomName(io.papermc.paper.adventure.PaperAdventure.asVanilla(title)); ++ ((RandomizableContainerBlockEntity) te).name = io.papermc.paper.adventure.PaperAdventure.asVanilla(title); + } + + return getInventory(te); @@ -5296,7 +5296,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + // BrewingStand does not extend TileEntityLootable + Container tileEntity = getTileEntity(); + if (tileEntity instanceof BrewingStandBlockEntity) { -+ ((BrewingStandBlockEntity) tileEntity).setCustomName(io.papermc.paper.adventure.PaperAdventure.asVanilla(title)); ++ ((BrewingStandBlockEntity) tileEntity).name = io.papermc.paper.adventure.PaperAdventure.asVanilla(title); + } + return getInventory(tileEntity); + } diff --git a/patches/server/Eigencraft-redstone-implementation.patch b/patches/server/Eigencraft-redstone-implementation.patch index 201f70ba2f..c70360deb8 100644 --- a/patches/server/Eigencraft-redstone-implementation.patch +++ b/patches/server/Eigencraft-redstone-implementation.patch @@ -19,6 +19,7 @@ Just added Bukkit's event system and took a few liberties with dead code and com == AT == public net.minecraft.world.level.block.RedStoneWireBlock shouldSignal +public net.minecraft.world.level.block.RedStoneWireBlock canSurvive(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;)Z Co-authored-by: egg82 diff --git a/patches/server/Get-entity-default-attributes.patch b/patches/server/Get-entity-default-attributes.patch index da530ff662..c676628f05 100644 --- a/patches/server/Get-entity-default-attributes.patch +++ b/patches/server/Get-entity-default-attributes.patch @@ -4,7 +4,7 @@ Date: Fri, 20 Aug 2021 13:03:21 -0700 Subject: [PATCH] Get entity default attributes == AT == -public net.minecraft.world.entity.ai.attributes.AttributeSupplier getAttributeInstance(Lnet/minecraft/world/entity/ai/attributes/Attribute;)Lnet/minecraft/world/entity/ai/attributes/AttributeInstance; +public net.minecraft.world.entity.ai.attributes.AttributeSupplier getAttributeInstance(Lnet/minecraft/core/Holder;)Lnet/minecraft/world/entity/ai/attributes/AttributeInstance; diff --git a/src/main/java/io/papermc/paper/attribute/UnmodifiableAttributeInstance.java b/src/main/java/io/papermc/paper/attribute/UnmodifiableAttributeInstance.java new file mode 100644 @@ -68,7 +68,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + + @Override + public @Nullable AttributeInstance getAttribute(@NotNull Attribute attribute) { -+ net.minecraft.world.entity.ai.attributes.Attribute nmsAttribute = CraftAttribute.bukkitToMinecraft(attribute); ++ net.minecraft.core.Holder nmsAttribute = CraftAttribute.bukkitToMinecraftHolder(attribute); + if (!this.handle.hasAttribute(nmsAttribute)) { + return null; + } diff --git a/patches/server/Improve-performance-of-mass-crafts.patch b/patches/server/Improve-performance-of-mass-crafts.patch index c6c34dcf3f..396d7fd70f 100644 --- a/patches/server/Improve-performance-of-mass-crafts.patch +++ b/patches/server/Improve-performance-of-mass-crafts.patch @@ -29,7 +29,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 ItemStack itemstack = ItemStack.EMPTY; - Optional> optional = world.getServer().getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingInventory, world); + final RecipeHolder currentRecipe = craftingInventory.getCurrentRecipe(); // Paper - Perf: Improve mass crafting; check last recipe used first -+ Optional> optional = currentRecipe == null ? world.getServer().getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingInventory, world) : world.getServer().getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingInventory, world, currentRecipe.id()).map(com.mojang.datafixers.util.Pair::getSecond); // Paper - Perf: Improve mass crafting; check last recipe used first ++ Optional> optional = currentRecipe == null ? world.getServer().getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingInventory, world) : world.getServer().getRecipeManager().getRecipeFor(RecipeType.CRAFTING, craftingInventory, world, currentRecipe.id()); // Paper - Perf: Improve mass crafting; check last recipe used first if (optional.isPresent()) { RecipeHolder recipeholder = (RecipeHolder) optional.get(); diff --git a/patches/server/More-PotionEffectType-API.patch b/patches/server/More-PotionEffectType-API.patch index 332522a3d9..e654a46d8e 100644 --- a/patches/server/More-PotionEffectType-API.patch +++ b/patches/server/More-PotionEffectType-API.patch @@ -3,6 +3,9 @@ From: Jake Potrebic Date: Thu, 27 May 2021 21:58:24 -0700 Subject: [PATCH] More PotionEffectType API +== AT == +public net.minecraft.world.effect.MobEffect attributeModifiers +public net.minecraft.world.effect.MobEffect$AttributeTemplate diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 @@ -32,7 +35,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + com.google.common.base.Preconditions.checkArgument(effectAmplifier >= 0, "effectAmplifier must be greater than or equal to 0"); + Holder nmsAttribute = org.bukkit.craftbukkit.attribute.CraftAttribute.bukkitToMinecraftHolder(attribute); + com.google.common.base.Preconditions.checkArgument(this.handle.attributeModifiers.containsKey(nmsAttribute), attribute + " is not present on " + this.getKey()); -+ return this.handle.attributeModifiers.get(nmsAttribute).create(effectAmplifier).getAmount(); ++ return this.handle.attributeModifiers.get(nmsAttribute).create(this.handle.getDescriptionId(), effectAmplifier).amount(); + } + + @Override diff --git a/patches/server/Nameable-Banner-API.patch b/patches/server/Nameable-Banner-API.patch index f0c7ce41d3..3cd68c4bbc 100644 --- a/patches/server/Nameable-Banner-API.patch +++ b/patches/server/Nameable-Banner-API.patch @@ -4,6 +4,19 @@ Date: Thu, 7 Apr 2022 17:49:25 -0400 Subject: [PATCH] Nameable Banner API +diff --git a/src/main/java/net/minecraft/world/level/block/entity/BannerBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BannerBlockEntity.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/BannerBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/BannerBlockEntity.java +@@ -0,0 +0,0 @@ public class BannerBlockEntity extends BlockEntity implements Nameable { + public static final int MAX_PATTERNS = 6; + private static final String TAG_PATTERNS = "patterns"; + @Nullable +- private Component name; ++ public Component name; // Paper - public + public DyeColor baseColor; + private BannerPatternLayers patterns; + diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java @@ -21,7 +34,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + + @Override + public void customName(net.kyori.adventure.text.Component customName) { -+ this.getSnapshot().setCustomName(io.papermc.paper.adventure.PaperAdventure.asVanilla(customName)); ++ this.getSnapshot().name = io.papermc.paper.adventure.PaperAdventure.asVanilla(customName); + } + + @Override diff --git a/patches/server/Restore-custom-InventoryHolder-support.patch b/patches/server/Restore-custom-InventoryHolder-support.patch index 9537116016..662f545089 100644 --- a/patches/server/Restore-custom-InventoryHolder-support.patch +++ b/patches/server/Restore-custom-InventoryHolder-support.patch @@ -266,7 +266,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 // Paper start @@ -0,0 +0,0 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat - ((RandomizableContainerBlockEntity) te).setCustomName(io.papermc.paper.adventure.PaperAdventure.asVanilla(title)); + ((RandomizableContainerBlockEntity) te).name = io.papermc.paper.adventure.PaperAdventure.asVanilla(title); } - return getInventory(te); @@ -295,10 +295,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 } @@ -0,0 +0,0 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat + @Override public Inventory createInventory(InventoryHolder owner, InventoryType type, net.kyori.adventure.text.Component title) { Container tileEntity = getTileEntity(); - ((AbstractFurnaceBlockEntity) tileEntity).setCustomName(io.papermc.paper.adventure.PaperAdventure.asVanilla(title)); +- ((AbstractFurnaceBlockEntity) tileEntity).setCustomName(io.papermc.paper.adventure.PaperAdventure.asVanilla(title)); - return getInventory(tileEntity); ++ ((AbstractFurnaceBlockEntity) tileEntity).name = io.papermc.paper.adventure.PaperAdventure.asVanilla(title); + return this.getInventory(owner, type, tileEntity); // Paper } // Paper end @@ -326,7 +328,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 } @@ -0,0 +0,0 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat if (tileEntity instanceof BrewingStandBlockEntity) { - ((BrewingStandBlockEntity) tileEntity).setCustomName(io.papermc.paper.adventure.PaperAdventure.asVanilla(title)); + ((BrewingStandBlockEntity) tileEntity).name = io.papermc.paper.adventure.PaperAdventure.asVanilla(title); } - return getInventory(tileEntity); + return this.getInventory(owner, type, tileEntity); // Paper diff --git a/patches/server/Rewrite-chunk-system.patch b/patches/server/Rewrite-chunk-system.patch index 0cae52d77b..537570bdad 100644 --- a/patches/server/Rewrite-chunk-system.patch +++ b/patches/server/Rewrite-chunk-system.patch @@ -20278,6 +20278,60 @@ diff --git a/src/main/java/net/minecraft/world/level/chunk/status/ChunkStatus.ja index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/net/minecraft/world/level/chunk/status/ChunkStatus.java +++ b/src/main/java/net/minecraft/world/level/chunk/status/ChunkStatus.java +@@ -0,0 +0,0 @@ import net.minecraft.world.level.chunk.ProtoChunk; + import net.minecraft.world.level.levelgen.Heightmap; + + public class ChunkStatus { ++ static final ChunkStatus.LoadingTask PASSTHROUGH_LOAD_TASK = (WorldGenContext context, ChunkStatus status, ToFullChunk fullChunkConverter, ChunkAccess chunk) -> CompletableFuture.completedFuture(chunk); // Paper - rewrite chunk system + public static final int MAX_STRUCTURE_DISTANCE = 8; + private static final EnumSet PRE_FEATURES = EnumSet.of(Heightmap.Types.OCEAN_FLOOR_WG, Heightmap.Types.WORLD_SURFACE_WG); + public static final EnumSet POST_FEATURES = EnumSet.of( + Heightmap.Types.OCEAN_FLOOR, Heightmap.Types.WORLD_SURFACE, Heightmap.Types.MOTION_BLOCKING, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES + ); + public static final ChunkStatus EMPTY = register( +- "empty", null, -1, false, PRE_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateEmpty, ChunkStatusTasks::loadPassThrough ++ "empty", null, -1, false, PRE_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateEmpty, PASSTHROUGH_LOAD_TASK // Paper - rewrite chunk system + ); + public static final ChunkStatus STRUCTURE_STARTS = register( + "structure_starts", +@@ -0,0 +0,0 @@ public class ChunkStatus { + PRE_FEATURES, + ChunkType.PROTOCHUNK, + ChunkStatusTasks::generateStructureReferences, +- ChunkStatusTasks::loadPassThrough ++ PASSTHROUGH_LOAD_TASK // Paper - rewrite chunk system + ); + public static final ChunkStatus BIOMES = register( +- "biomes", STRUCTURE_REFERENCES, 8, false, PRE_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateBiomes, ChunkStatusTasks::loadPassThrough ++ "biomes", STRUCTURE_REFERENCES, 8, false, PRE_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateBiomes, PASSTHROUGH_LOAD_TASK // Paper - rewrite chunk system + ); + public static final ChunkStatus NOISE = register( +- "noise", BIOMES, 8, false, PRE_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateNoise, ChunkStatusTasks::loadPassThrough ++ "noise", BIOMES, 8, false, PRE_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateNoise, PASSTHROUGH_LOAD_TASK // Paper - rewrite chunk system + ); + public static final ChunkStatus SURFACE = register( +- "surface", NOISE, 8, false, PRE_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateSurface, ChunkStatusTasks::loadPassThrough ++ "surface", NOISE, 8, false, PRE_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateSurface, PASSTHROUGH_LOAD_TASK // Paper - rewrite chunk system + ); + public static final ChunkStatus CARVERS = register( +- "carvers", SURFACE, 8, false, POST_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateCarvers, ChunkStatusTasks::loadPassThrough ++ "carvers", SURFACE, 8, false, POST_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateCarvers, PASSTHROUGH_LOAD_TASK // Paper - rewrite chunk system + ); + public static final ChunkStatus FEATURES = register( +- "features", CARVERS, 8, false, POST_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateFeatures, ChunkStatusTasks::loadPassThrough ++ "features", CARVERS, 8, false, POST_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateFeatures, PASSTHROUGH_LOAD_TASK // Paper - rewrite chunk system + ); + public static final ChunkStatus INITIALIZE_LIGHT = register( + "initialize_light", +@@ -0,0 +0,0 @@ public class ChunkStatus { + "light", INITIALIZE_LIGHT, 1, true, POST_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateLight, ChunkStatusTasks::loadLight + ); + public static final ChunkStatus SPAWN = register( +- "spawn", LIGHT, 1, false, POST_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateSpawn, ChunkStatusTasks::loadPassThrough ++ "spawn", LIGHT, 1, false, POST_FEATURES, ChunkType.PROTOCHUNK, ChunkStatusTasks::generateSpawn, PASSTHROUGH_LOAD_TASK // Paper - rewrite chunk system + ); + public static final ChunkStatus FULL = register( + "full", SPAWN, 0, false, POST_FEATURES, ChunkType.LEVELCHUNK, ChunkStatusTasks::generateFull, ChunkStatusTasks::loadFull @@ -0,0 +0,0 @@ public class ChunkStatus { } } @@ -20296,7 +20350,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + } + + public final boolean isEmptyLoadStatus() { -+ return this.loadingTask == PASSTHROUGH_LOAD_TASK; // TODO fix this ++ return this.loadingTask == PASSTHROUGH_LOAD_TASK; + } + + public final boolean isEmptyGenStatus() { @@ -20326,6 +20380,18 @@ diff --git a/src/main/java/net/minecraft/world/level/chunk/status/ChunkStatusTas index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java +++ b/src/main/java/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java +@@ -0,0 +0,0 @@ public class ChunkStatusTasks { + return CompletableFuture.completedFuture(chunk); + } + +- static CompletableFuture loadPassThrough(WorldGenContext context, ChunkStatus status, ToFullChunk fullChunkConverter, ChunkAccess chunk) { +- return CompletableFuture.completedFuture(chunk); ++ @io.papermc.paper.annotation.DoNotUse @Deprecated(forRemoval = true) // Paper - rewrite chunk system - use ChunkStatus.PASSTHROUGH_LOAD_TASK instead ++ static CompletableFuture loadPassThrough(WorldGenContext context, ChunkStatus status, ToFullChunk fullChunkConverter, ChunkAccess chunk) { // Paper - rewrite chunk system - diff on change ++ return CompletableFuture.completedFuture(chunk); // Paper - rewrite chunk system - diff on change + } + + static CompletableFuture generateStructureStarts(WorldGenContext context, ChunkStatus status, Executor executor, ToFullChunk fullChunkConverter, List chunks, ChunkAccess chunk) { @@ -0,0 +0,0 @@ public class ChunkStatusTasks { } diff --git a/patches/server/living-entity-allow-attribute-registration.patch b/patches/server/living-entity-allow-attribute-registration.patch index 6e8fcdbce2..0c29375ee7 100644 --- a/patches/server/living-entity-allow-attribute-registration.patch +++ b/patches/server/living-entity-allow-attribute-registration.patch @@ -14,7 +14,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 } + + // Paper - start - living entity allow attribute registration -+ public void registerAttribute(Attribute attributeBase) { ++ public void registerAttribute(Holder attributeBase) { + AttributeInstance attributeModifiable = new AttributeInstance(attributeBase, AttributeInstance::getAttribute); + attributes.put(attributeBase, attributeModifiable); + } @@ -33,7 +33,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + @Override + public void registerAttribute(Attribute attribute) { + Preconditions.checkArgument(attribute != null, "attribute"); -+ handle.registerAttribute(CraftAttribute.bukkitToMinecraft(attribute)); ++ handle.registerAttribute(CraftAttribute.bukkitToMinecraftHolder(attribute)); + } + // Paper end - living entity allow attribute registration } diff --git a/patches/server/prevent-unintended-light-block-manipulation.patch b/patches/server/prevent-unintended-light-block-manipulation.patch index 9fd10b6249..b4f79ca15d 100644 --- a/patches/server/prevent-unintended-light-block-manipulation.patch +++ b/patches/server/prevent-unintended-light-block-manipulation.patch @@ -9,10 +9,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/net/minecraft/world/level/block/LightBlock.java +++ b/src/main/java/net/minecraft/world/level/block/LightBlock.java @@ -0,0 +0,0 @@ public class LightBlock extends Block implements SimpleWaterloggedBlock { + builder.add(LEVEL, WATERLOGGED); + } + ++ // Paper start - prevent unintended light block manipulation ++ @Override ++ protected net.minecraft.world.ItemInteractionResult useItemOn(final ItemStack stack, final BlockState state, final Level world, final BlockPos pos, final Player player, final net.minecraft.world.InteractionHand hand, final BlockHitResult hit) { ++ if (player.getItemInHand(hand).getItem() != Items.LIGHT || !player.mayInteract(world, pos) || !player.mayUseItemAt(pos, hit.getDirection(), player.getItemInHand(hand))) { return net.minecraft.world.ItemInteractionResult.SKIP_DEFAULT_BLOCK_INTERACTION; } // Paper - Prevent unintended light block manipulation ++ return super.useItemOn(stack, state, world, pos, player, hand, hit); ++ } ++ // Paper end - prevent unintended light block manipulation ++ @Override protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) { if (!world.isClientSide && player.canUseGameMasterBlocks()) { -+ if (player.getItemInHand(hand).getItem() != Items.LIGHT || !player.mayInteract(world, pos) || !player.mayUseItemAt(pos, hit.getDirection(), player.getItemInHand(hand))) { return InteractionResult.FAIL; } // Paper - Prevent unintended light block manipulation - world.setBlock(pos, state.cycle(LEVEL), 2); - return InteractionResult.SUCCESS; - } else {