4104545b11
"It was from a different time before books were as jank as they are now. As time has gone on they've only proven to be worse and worse."
61 Zeilen
3.6 KiB
Diff
61 Zeilen
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 f8554943783754618bc04cbbe7df61cebfc98b80..4e7644f875b8ed10cb402e5e1c8b71b4842e0e40 100644
|
|
--- a/src/main/java/net/minecraft/world/level/Level.java
|
|
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
|
@@ -140,7 +140,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;
|
|
@@ -358,7 +358,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);
|
|
@@ -378,7 +378,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;
|
|
}
|
|
@@ -644,7 +645,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();
|
|
}
|