61 lines
3.6 KiB
Diff
61 lines
3.6 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 81713c97f35263f4ab8d14f8b707aac3d6afea11..b4248d46ccb1a95e21601bca1198512287edcabf 100644
|
|
--- a/src/main/java/net/minecraft/world/level/Level.java
|
|
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
|
@@ -124,7 +124,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
|
|
|
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 long ticksPerAnimalSpawns;
|
|
@@ -346,7 +346,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 = capturedBlockStates.get(pos);
|
|
+ CraftBlockState blockstate = capturedBlockStates.get(pos);
|
|
if (blockstate == null) {
|
|
blockstate = CapturedBlockState.getTreeBlockState(this, pos, flags);
|
|
this.capturedBlockStates.put(pos.immutable(), blockstate);
|
|
@@ -366,7 +366,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;
|
|
}
|
|
@@ -624,7 +625,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
|
public BlockState getBlockState(BlockPos pos) {
|
|
// CraftBukkit start - tree generation
|
|
if (captureTreeGeneration) {
|
|
- CapturedBlockState previous = capturedBlockStates.get(pos);
|
|
+ CraftBlockState previous = capturedBlockStates.get(pos); // Paper
|
|
if (previous != null) {
|
|
return previous.getHandle();
|
|
}
|