SPIGOT-5123: Snapshot tile entities can end up with a non-null world

This commit is contained in:
md_5 2019-07-03 10:22:42 +10:00
parent 491c848210
commit 5815136865
3 changed files with 8 additions and 31 deletions

View file

@ -34,7 +34,7 @@
} }
public NBTTagCompound save(NBTTagCompound nbttagcompound) { public NBTTagCompound save(NBTTagCompound nbttagcompound) {
@@ -53,12 +70,24 @@ @@ -53,6 +70,11 @@
nbttagcompound.setInt("x", this.position.getX()); nbttagcompound.setInt("x", this.position.getX());
nbttagcompound.setInt("y", this.position.getY()); nbttagcompound.setInt("y", this.position.getY());
nbttagcompound.setInt("z", this.position.getZ()); nbttagcompound.setInt("z", this.position.getZ());
@ -46,28 +46,7 @@
return nbttagcompound; return nbttagcompound;
} }
} }
@@ -168,4 +190,13 @@
+ // CraftBukkit start
@Nullable
public static TileEntity create(NBTTagCompound nbttagcompound) {
+ return create(nbttagcompound, null);
+ }
+
+ @Nullable
+ public static TileEntity create(NBTTagCompound nbttagcompound, @Nullable World world) {
+ // CraftBukkit end
String s = nbttagcompound.getString("id");
return (TileEntity) IRegistry.BLOCK_ENTITY_TYPE.getOptional(new MinecraftKey(s)).map((tileentitytypes) -> {
@@ -70,6 +99,7 @@
}
}).map((tileentity) -> {
try {
+ tileentity.setWorld(world); // CraftBukkit
tileentity.load(nbttagcompound);
return tileentity;
} catch (Throwable throwable) {
@@ -168,4 +198,13 @@
}, this::getPosition}); }, this::getPosition});
} }
} }

View file

@ -3,6 +3,7 @@ package org.bukkit.craftbukkit.block;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import net.minecraft.server.BlockBannerAbstract;
import net.minecraft.server.EnumColor; import net.minecraft.server.EnumColor;
import net.minecraft.server.NBTTagCompound; import net.minecraft.server.NBTTagCompound;
import net.minecraft.server.NBTTagList; import net.minecraft.server.NBTTagList;
@ -31,9 +32,7 @@ public class CraftBanner extends CraftBlockEntityState<TileEntityBanner> impleme
public void load(TileEntityBanner banner) { public void load(TileEntityBanner banner) {
super.load(banner); super.load(banner);
if (banner.color != null) { base = DyeColor.getByWoolData((byte) ((BlockBannerAbstract) this.data.getBlock()).b().getColorIndex()); // PAIL
base = DyeColor.getByWoolData((byte) banner.color.getColorIndex());
}
patterns = new ArrayList<Pattern>(); patterns = new ArrayList<Pattern>();
if (banner.patterns != null) { if (banner.patterns != null) {

View file

@ -4,7 +4,6 @@ import com.google.common.base.Preconditions;
import net.minecraft.server.BlockPosition; import net.minecraft.server.BlockPosition;
import net.minecraft.server.NBTTagCompound; import net.minecraft.server.NBTTagCompound;
import net.minecraft.server.TileEntity; import net.minecraft.server.TileEntity;
import net.minecraft.server.World;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.TileState; import org.bukkit.block.TileState;
@ -28,7 +27,7 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState
Preconditions.checkState(this.tileEntity != null, "Tile is null, asynchronous access? " + block); Preconditions.checkState(this.tileEntity != null, "Tile is null, asynchronous access? " + block);
// copy tile entity data: // copy tile entity data:
this.snapshot = this.createSnapshot(tileEntity, world.getHandle()); this.snapshot = this.createSnapshot(tileEntity);
this.load(snapshot); this.load(snapshot);
} }
@ -39,17 +38,17 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState
this.tileEntity = tileEntity; this.tileEntity = tileEntity;
// copy tile entity data: // copy tile entity data:
this.snapshot = this.createSnapshot(tileEntity, null); this.snapshot = this.createSnapshot(tileEntity);
this.load(snapshot); this.load(snapshot);
} }
private T createSnapshot(T tileEntity, World world) { private T createSnapshot(T tileEntity) {
if (tileEntity == null) { if (tileEntity == null) {
return null; return null;
} }
NBTTagCompound nbtTagCompound = tileEntity.save(new NBTTagCompound()); NBTTagCompound nbtTagCompound = tileEntity.save(new NBTTagCompound());
T snapshot = (T) TileEntity.create(nbtTagCompound, world); T snapshot = (T) TileEntity.create(nbtTagCompound);
return snapshot; return snapshot;
} }