mirror of
https://github.com/PaperMC/Paper.git
synced 2024-10-29 23:09:33 +01:00
61 lines
3.8 KiB
Diff
61 lines
3.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Shane Freeder <theboyetronic@gmail.com>
|
|
Date: Thu, 16 Nov 2017 12:12:41 +0000
|
|
Subject: [PATCH] use CB BlockState implementations for captured blocks
|
|
|
|
When modifying the world, CB will store a copy of the affected
|
|
blocks in order to restore their state in the case that the event
|
|
is cancelled. This change only modifies the collection of blocks
|
|
in the world by normal means, e.g. not during tree population,
|
|
as the potentially marginal overheads would serve no advantage.
|
|
|
|
CB was using a CraftBlockState for all blocks, which causes issues
|
|
should any block that uses information beyond a data ID would suffer
|
|
from missing information, e.g. Skulls.
|
|
|
|
By using CBs CraftBlock#getState(), we will maintain a proper copy of
|
|
the blockstate that will be valid for restoration, as opposed to dropping
|
|
information on restoration when the event is cancelled.
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
|
|
index f39d927df5997cb0dd3d8c677a10099afa84da09..995278298b7feb61255cd8c1fea396ed0850099e 100644
|
|
--- a/src/main/java/net/minecraft/world/level/Level.java
|
|
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
|
@@ -151,7 +151,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
|
public boolean preventPoiUpdated = false; // CraftBukkit - SPIGOT-5710
|
|
public boolean captureBlockStates = false;
|
|
public boolean captureTreeGeneration = false;
|
|
- public Map<BlockPos, CapturedBlockState> capturedBlockStates = new java.util.LinkedHashMap<>();
|
|
+ public Map<BlockPos, org.bukkit.craftbukkit.block.CraftBlockState> capturedBlockStates = new java.util.LinkedHashMap<>(); // Paper
|
|
public Map<BlockPos, BlockEntity> capturedTileEntities = new HashMap<>();
|
|
public List<ItemEntity> captureDrops;
|
|
public final it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap<SpawnCategory> ticksPerSpawnCategory = new it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap<>();
|
|
@@ -379,7 +379,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
|
public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) {
|
|
// CraftBukkit start - tree generation
|
|
if (this.captureTreeGeneration) {
|
|
- CapturedBlockState blockstate = this.capturedBlockStates.get(pos);
|
|
+ CraftBlockState blockstate = this.capturedBlockStates.get(pos);
|
|
if (blockstate == null) {
|
|
blockstate = CapturedBlockState.getTreeBlockState(this, pos, flags);
|
|
this.capturedBlockStates.put(pos.immutable(), blockstate);
|
|
@@ -399,7 +399,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
|
// CraftBukkit start - capture blockstates
|
|
boolean captured = false;
|
|
if (this.captureBlockStates && !this.capturedBlockStates.containsKey(pos)) {
|
|
- CapturedBlockState blockstate = CapturedBlockState.getBlockState(this, pos, flags);
|
|
+ CraftBlockState blockstate = (CraftBlockState) world.getBlockAt(pos.getX(), pos.getY(), pos.getZ()).getState(); // Paper - use CB getState to get a suitable snapshot
|
|
+ blockstate.setFlag(flags); // Paper - set flag
|
|
this.capturedBlockStates.put(pos.immutable(), blockstate);
|
|
captured = true;
|
|
}
|
|
@@ -611,7 +612,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
|
public BlockState getBlockState(BlockPos pos) {
|
|
// CraftBukkit start - tree generation
|
|
if (this.captureTreeGeneration) {
|
|
- CapturedBlockState previous = this.capturedBlockStates.get(pos);
|
|
+ CraftBlockState previous = this.capturedBlockStates.get(pos); // Paper
|
|
if (previous != null) {
|
|
return previous.getHandle();
|
|
}
|