forked from xjboss/KCauldronX
7114a28fc6
close #320
264 lines
13 KiB
Diff
264 lines
13 KiB
Diff
--- ../src-base/minecraft/net/minecraft/world/chunk/storage/AnvilChunkLoader.java
|
|
+++ ../src-work/minecraft/net/minecraft/world/chunk/storage/AnvilChunkLoader.java
|
|
@@ -33,6 +33,13 @@
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
import cpw.mods.fml.common.FMLLog;
|
|
+// Cauldron start
|
|
+import java.util.Map;
|
|
+import net.minecraft.server.MinecraftServer;
|
|
+import net.minecraftforge.cauldron.CauldronUtils;
|
|
+import net.minecraftforge.common.util.EnumHelper;
|
|
+import cpw.mods.fml.common.asm.transformers.SideTransformer;
|
|
+// Cauldron end
|
|
|
|
public class AnvilChunkLoader implements IChunkLoader, IThreadedFileIO
|
|
{
|
|
@@ -41,6 +48,7 @@
|
|
private Set pendingAnvilChunksCoordinates = new HashSet();
|
|
private Object syncLockObject = new Object();
|
|
public final File chunkSaveLocation;
|
|
+ private List checkedTileEntities = new ArrayList(); // Cauldron
|
|
private static final String __OBFID = "CL_00000384";
|
|
|
|
public AnvilChunkLoader(File p_i2003_1_)
|
|
@@ -73,13 +81,16 @@
|
|
|
|
public Chunk loadChunk(World p_75815_1_, int p_75815_2_, int p_75815_3_) throws IOException
|
|
{
|
|
+ p_75815_1_.timings.syncChunkLoadDataTimer.startTiming(); // Spigot
|
|
Object[] data = this.loadChunk__Async(p_75815_1_, p_75815_2_, p_75815_3_);
|
|
+ p_75815_1_.timings.syncChunkLoadDataTimer.stopTiming(); // Spigot
|
|
|
|
if (data != null)
|
|
{
|
|
Chunk chunk = (Chunk) data[0];
|
|
NBTTagCompound nbttagcompound = (NBTTagCompound) data[1];
|
|
this.loadEntities(p_75815_1_, nbttagcompound.getCompoundTag("Level"), chunk);
|
|
+ MinecraftForge.EVENT_BUS.post(new ChunkDataEvent.Load(chunk, nbttagcompound)); // Cauldron - Don't call ChunkDataEvent.Load async
|
|
return chunk;
|
|
}
|
|
|
|
@@ -156,8 +167,8 @@
|
|
if (!chunk.isAtLocation(p_75822_2_, p_75822_3_))
|
|
{
|
|
logger.error("Chunk file at " + p_75822_2_ + "," + p_75822_3_ + " is in the wrong location; relocating. (Expected " + p_75822_2_ + ", " + p_75822_3_ + ", got " + chunk.xPosition + ", " + chunk.zPosition + ")");
|
|
- p_75822_4_.setInteger("xPos", p_75822_2_);
|
|
- p_75822_4_.setInteger("zPos", p_75822_3_);
|
|
+ p_75822_4_.getCompoundTag("Level").setInteger("xPos", p_75822_2_); // CraftBukkit - .getCompound("Level")
|
|
+ p_75822_4_.getCompoundTag("Level").setInteger("zPos", p_75822_3_); // CraftBukkit - .getCompound("Level")
|
|
// Have to move tile entities since we don't load them at this stage
|
|
NBTTagList tileEntities = p_75822_4_.getCompoundTag("Level").getTagList("TileEntities", 10);
|
|
|
|
@@ -187,8 +198,18 @@
|
|
|
|
public void saveChunk(World p_75816_1_, Chunk p_75816_2_) throws MinecraftException, IOException
|
|
{
|
|
- p_75816_1_.checkSessionLock();
|
|
+ // CraftBukkit start - "handle" exception
|
|
+ try
|
|
+ {
|
|
+ p_75816_1_.checkSessionLock();
|
|
+ }
|
|
+ catch (MinecraftException ex)
|
|
+ {
|
|
+ ex.printStackTrace();
|
|
+ }
|
|
|
|
+ // CraftBukkit end
|
|
+
|
|
try
|
|
{
|
|
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
|
@@ -230,7 +251,7 @@
|
|
|
|
public boolean writeNextIO()
|
|
{
|
|
- AnvilChunkLoader.PendingChunk pendingchunk = null;
|
|
+ PendingChunk pendingchunktosave = null;
|
|
Object object = this.syncLockObject;
|
|
|
|
synchronized (this.syncLockObject)
|
|
@@ -240,15 +261,15 @@
|
|
return false;
|
|
}
|
|
|
|
- pendingchunk = (AnvilChunkLoader.PendingChunk)this.chunksToRemove.remove(0);
|
|
- this.pendingAnvilChunksCoordinates.remove(pendingchunk.chunkCoordinate);
|
|
+ pendingchunktosave = (PendingChunk) this.chunksToRemove.remove(0);
|
|
+ this.pendingAnvilChunksCoordinates.remove(pendingchunktosave.chunkCoordinate);
|
|
}
|
|
|
|
- if (pendingchunk != null)
|
|
+ if (pendingchunktosave != null)
|
|
{
|
|
try
|
|
{
|
|
- this.writeChunkNBTTags(pendingchunk);
|
|
+ this.writeChunkNBTTags(pendingchunktosave);
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
@@ -259,7 +280,7 @@
|
|
return true;
|
|
}
|
|
|
|
- private void writeChunkNBTTags(AnvilChunkLoader.PendingChunk p_75821_1_) throws IOException
|
|
+ public void writeChunkNBTTags(AnvilChunkLoader.PendingChunk p_75821_1_) throws java.io.IOException // CraftBukkit - public -> private, added throws
|
|
{
|
|
DataOutputStream dataoutputstream = RegionFileCache.getChunkOutputStream(this.chunkSaveLocation, p_75821_1_.chunkCoordinate.chunkXPos, p_75821_1_.chunkCoordinate.chunkZPos);
|
|
CompressedStreamTools.write(p_75821_1_.nbtTags, dataoutputstream);
|
|
@@ -307,19 +328,19 @@
|
|
|
|
if (extendedblockstorage.getBlockMSBArray() != null)
|
|
{
|
|
- nbttagcompound1.setByteArray("Add", extendedblockstorage.getBlockMSBArray().data);
|
|
+ nbttagcompound1.setByteArray("Add", extendedblockstorage.getBlockMSBArray().getValueArray()); // Spigot
|
|
}
|
|
|
|
- nbttagcompound1.setByteArray("Data", extendedblockstorage.getMetadataArray().data);
|
|
- nbttagcompound1.setByteArray("BlockLight", extendedblockstorage.getBlocklightArray().data);
|
|
+ nbttagcompound1.setByteArray("Data", extendedblockstorage.getMetadataArray().getValueArray()); // Spigot
|
|
+ nbttagcompound1.setByteArray("BlockLight", extendedblockstorage.getBlocklightArray().getValueArray()); // Spigot
|
|
|
|
if (flag)
|
|
{
|
|
- nbttagcompound1.setByteArray("SkyLight", extendedblockstorage.getSkylightArray().data);
|
|
+ nbttagcompound1.setByteArray("SkyLight", extendedblockstorage.getSkylightArray().getValueArray()); // Spigot
|
|
}
|
|
else
|
|
{
|
|
- nbttagcompound1.setByteArray("SkyLight", new byte[extendedblockstorage.getBlocklightArray().data.length]);
|
|
+ nbttagcompound1.setByteArray("SkyLight", new byte[extendedblockstorage.getBlocklightArray().getValueArray().length]); // Spigot
|
|
}
|
|
|
|
nbttaglist.appendTag(nbttagcompound1);
|
|
@@ -379,7 +400,7 @@
|
|
}
|
|
|
|
p_75820_3_.setTag("TileEntities", nbttaglist3);
|
|
- List list = p_75820_2_.getPendingBlockUpdates(p_75820_1_, false);
|
|
+ Set list = p_75820_1_.blockUpdates;
|
|
|
|
if (list != null)
|
|
{
|
|
@@ -389,13 +410,13 @@
|
|
|
|
while (iterator.hasNext())
|
|
{
|
|
- NextTickListEntry nextticklistentry = (NextTickListEntry)iterator.next();
|
|
+ kcauldron.BlockUpdateEntry nextticklistentry = (kcauldron.BlockUpdateEntry)iterator.next();
|
|
NBTTagCompound nbttagcompound2 = new NBTTagCompound();
|
|
- nbttagcompound2.setInteger("i", Block.getIdFromBlock(nextticklistentry.func_151351_a()));
|
|
- nbttagcompound2.setInteger("x", nextticklistentry.xCoord);
|
|
- nbttagcompound2.setInteger("y", nextticklistentry.yCoord);
|
|
- nbttagcompound2.setInteger("z", nextticklistentry.zCoord);
|
|
- nbttagcompound2.setInteger("t", (int)(nextticklistentry.scheduledTime - k));
|
|
+ nbttagcompound2.setInteger("i", Block.getIdFromBlock(nextticklistentry.block));
|
|
+ nbttagcompound2.setInteger("x", nextticklistentry.x);
|
|
+ nbttagcompound2.setInteger("y", nextticklistentry.y);
|
|
+ nbttagcompound2.setInteger("z", nextticklistentry.z);
|
|
+ nbttagcompound2.setInteger("t", (int)(nextticklistentry.time - k));
|
|
nbttagcompound2.setInteger("p", nextticklistentry.priority);
|
|
nbttaglist1.appendTag(nbttagcompound2);
|
|
}
|
|
@@ -455,6 +476,7 @@
|
|
|
|
public void loadEntities(World p_75823_1_, NBTTagCompound p_75823_2_, Chunk chunk)
|
|
{
|
|
+ p_75823_1_.timings.syncChunkLoadEntitiesTimer.startTiming(); // Spigot
|
|
NBTTagList nbttaglist1 = p_75823_2_.getTagList("Entities", 10);
|
|
|
|
if (nbttaglist1 != null)
|
|
@@ -468,24 +490,31 @@
|
|
if (entity2 != null)
|
|
{
|
|
chunk.addEntity(entity2);
|
|
- Entity entity = entity2;
|
|
-
|
|
- for (NBTTagCompound nbttagcompound2 = nbttagcompound3; nbttagcompound2.hasKey("Riding", 10); nbttagcompound2 = nbttagcompound2.getCompoundTag("Riding"))
|
|
+ // Cauldron start - check to see if we killed entity due to invalid location
|
|
+ if (!entity2.isDead)
|
|
{
|
|
- Entity entity1 = EntityList.createEntityFromNBT(nbttagcompound2.getCompoundTag("Riding"), p_75823_1_);
|
|
+ Entity entity = entity2;
|
|
|
|
- if (entity1 != null)
|
|
+ for (NBTTagCompound nbttagcompound2 = nbttagcompound3; nbttagcompound2.hasKey("Riding", 10); nbttagcompound2 = nbttagcompound2.getCompoundTag("Riding"))
|
|
{
|
|
- chunk.addEntity(entity1);
|
|
- entity.mountEntity(entity1);
|
|
- }
|
|
+ Entity entity1 = EntityList.createEntityFromNBT(nbttagcompound2.getCompoundTag("Riding"), p_75823_1_);
|
|
|
|
- entity = entity1;
|
|
+ if (entity1 != null)
|
|
+ {
|
|
+ chunk.addEntity(entity1);
|
|
+ entity.mountEntity(entity1);
|
|
+ }
|
|
+
|
|
+ entity = entity1;
|
|
+ }
|
|
}
|
|
+ // Cauldron end
|
|
}
|
|
}
|
|
}
|
|
|
|
+ p_75823_1_.timings.syncChunkLoadEntitiesTimer.stopTiming(); // Spigot
|
|
+ p_75823_1_.timings.syncChunkLoadTileEntitiesTimer.startTiming(); // Spigot
|
|
NBTTagList nbttaglist2 = p_75823_2_.getTagList("TileEntities", 10);
|
|
|
|
if (nbttaglist2 != null)
|
|
@@ -497,11 +526,35 @@
|
|
|
|
if (tileentity != null)
|
|
{
|
|
+ // Cauldron start - check if TE should tick and inject into Bukkit's InventoryType
|
|
+ if (!this.checkedTileEntities.contains(tileentity.getClass()))
|
|
+ {
|
|
+ // verify if TE should tick
|
|
+ if (MinecraftServer.getServer().tileEntityConfig.preventInvalidTileEntityUpdates.getValue())
|
|
+ {
|
|
+ SideTransformer.allowInvalidSide = true;
|
|
+ if (!CauldronUtils.isOverridingUpdateEntity(tileentity.getClass()) && CauldronUtils.canTileEntityUpdate(tileentity.getClass()))
|
|
+ {
|
|
+ if (MinecraftServer.getServer().tileEntityConfig.enableTECanUpdateWarning.getValue())
|
|
+ {
|
|
+ MinecraftServer.getServer().logInfo("Detected TE " + tileentity.getClass().getName() + " with canUpdate set to true and no updateEntity override!. Please report to mod author as this can hurt performance.");
|
|
+ }
|
|
+ MinecraftServer.getServer().bannedTileEntityUpdates.add(tileentity.getClass());
|
|
+ }
|
|
+ SideTransformer.allowInvalidSide = false;
|
|
+ }
|
|
+ // inject TE into InventoryType to support inventory events
|
|
+ EnumHelper.addInventoryType(tileentity);
|
|
+ this.checkedTileEntities.add(tileentity.getClass());
|
|
+ }
|
|
+ // Cauldron end
|
|
chunk.addTileEntity(tileentity);
|
|
}
|
|
}
|
|
}
|
|
|
|
+ p_75823_1_.timings.syncChunkLoadTileEntitiesTimer.stopTiming(); // Spigot
|
|
+ p_75823_1_.timings.syncChunkLoadTileTicksTimer.startTiming(); // Spigot
|
|
if (p_75823_2_.hasKey("TileTicks", 9))
|
|
{
|
|
NBTTagList nbttaglist3 = p_75823_2_.getTagList("TileTicks", 10);
|
|
@@ -511,10 +564,12 @@
|
|
for (int j1 = 0; j1 < nbttaglist3.tagCount(); ++j1)
|
|
{
|
|
NBTTagCompound nbttagcompound5 = nbttaglist3.getCompoundTagAt(j1);
|
|
- p_75823_1_.func_147446_b(nbttagcompound5.getInteger("x"), nbttagcompound5.getInteger("y"), nbttagcompound5.getInteger("z"), Block.getBlockById(nbttagcompound5.getInteger("i")), nbttagcompound5.getInteger("t"), nbttagcompound5.getInteger("p"));
|
|
+ kcauldron.BlockUpdateEntry entry = ((net.minecraft.world.WorldServer) p_75823_1_).blockUpdatesTracker.allocateEntry(nbttagcompound5.getInteger("x"), nbttagcompound5.getInteger("y"), nbttagcompound5.getInteger("z"), nbttagcompound5.getInteger("p"), nbttagcompound5.getInteger("t"), Block.getBlockById(nbttagcompound5.getInteger("i")));
|
|
+ chunk.blockUpdates.add(entry);
|
|
}
|
|
}
|
|
}
|
|
+ p_75823_1_.timings.syncChunkLoadTileTicksTimer.stopTiming(); // Spigot
|
|
|
|
// return chunk;
|
|
}
|