geforkt von Mirrors/FastAsyncWorldEdit
[Forge] Fix //regen + improve performance.
Dieser Commit ist enthalten in:
Ursprung
d0cf497939
Commit
b3d6644972
@ -42,7 +42,6 @@ import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.annotation.Nullable;
|
||||
@ -54,15 +53,21 @@ import net.minecraft.block.BlockPlanks;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.EntityList;
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.network.play.server.SPacketChunkData;
|
||||
import net.minecraft.server.management.PlayerChunkMap;
|
||||
import net.minecraft.server.management.PlayerChunkMapEntry;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.ChunkPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.WorldServer;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.chunk.Chunk;
|
||||
import net.minecraft.world.chunk.IChunkGenerator;
|
||||
import net.minecraft.world.chunk.IChunkProvider;
|
||||
import net.minecraft.world.gen.ChunkProviderServer;
|
||||
import net.minecraft.world.gen.feature.WorldGenBigMushroom;
|
||||
@ -238,6 +243,11 @@ public class ForgeWorld extends AbstractWorld {
|
||||
|
||||
@Override
|
||||
public boolean regenerate(Region region, EditSession editSession) {
|
||||
// Don't even try to regen if it's going to fail.
|
||||
IChunkProvider provider = getWorld().getChunkProvider();
|
||||
if (!(provider instanceof ChunkProviderServer)) {
|
||||
return false;
|
||||
}
|
||||
BaseBlock[] history = new BaseBlock[256 * (getMaxY() + 1)];
|
||||
|
||||
for (Vector2D chunk : region.getChunks()) {
|
||||
@ -252,28 +262,29 @@ public class ForgeWorld extends AbstractWorld {
|
||||
}
|
||||
}
|
||||
}
|
||||
PlayerChunkMap playerManager = ((WorldServer) getWorld()).getPlayerChunkMap();
|
||||
List<EntityPlayerMP> oldWatchers = null;
|
||||
Chunk mcChunk = null;
|
||||
try {
|
||||
Set<Vector2D> chunks = region.getChunks();
|
||||
IChunkProvider provider = getWorld().getChunkProvider();
|
||||
if (!(provider instanceof ChunkProviderServer)) {
|
||||
return false;
|
||||
}
|
||||
ChunkProviderServer chunkServer = (ChunkProviderServer) provider;
|
||||
for (Vector2D coord : chunks) {
|
||||
long pos = ChunkPos.chunkXZ2Int(coord.getBlockX(), coord.getBlockZ());
|
||||
Chunk mcChunk;
|
||||
if (chunkServer.chunkExists(coord.getBlockX(), coord.getBlockZ())) {
|
||||
mcChunk = chunkServer.loadChunk(coord.getBlockX(), coord.getBlockZ());
|
||||
mcChunk.onChunkUnload();
|
||||
}
|
||||
chunkServer.droppedChunksSet.remove(pos);
|
||||
chunkServer.id2ChunkMap.remove(pos);
|
||||
mcChunk = chunkServer.provideChunk(coord.getBlockX(), coord.getBlockZ());
|
||||
chunkServer.id2ChunkMap.put(pos, mcChunk);
|
||||
if (mcChunk != null) {
|
||||
mcChunk.onChunkLoad();
|
||||
mcChunk.populateChunk(chunkServer, chunkServer.chunkGenerator);
|
||||
IChunkGenerator gen = chunkServer.chunkGenerator;
|
||||
long pos = ChunkPos.chunkXZ2Int(chunk.getBlockX(), chunk.getBlockZ());
|
||||
if (chunkServer.chunkExists(chunk.getBlockX(), chunk.getBlockZ())) {
|
||||
mcChunk = chunkServer.loadChunk(chunk.getBlockX(), chunk.getBlockZ());
|
||||
PlayerChunkMapEntry entry = playerManager.getEntry(chunk.getBlockX(), chunk.getBlockZ());
|
||||
if (entry != null) {
|
||||
oldWatchers = entry.players;
|
||||
playerManager.removeEntry(entry);
|
||||
}
|
||||
mcChunk.onChunkUnload();
|
||||
}
|
||||
chunkServer.droppedChunksSet.remove(pos);
|
||||
chunkServer.id2ChunkMap.remove(pos);
|
||||
mcChunk = gen.provideChunk(chunk.getBlockX(), chunk.getBlockZ());
|
||||
chunkServer.id2ChunkMap.put(pos, mcChunk);
|
||||
if (mcChunk != null) {
|
||||
mcChunk.onChunkLoad();
|
||||
mcChunk.populateChunk(chunkServer, chunkServer.chunkGenerator);
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
logger.log(Level.WARNING, "Failed to generate chunk", t);
|
||||
@ -294,6 +305,13 @@ public class ForgeWorld extends AbstractWorld {
|
||||
}
|
||||
}
|
||||
}
|
||||
// We don't need to recreate the ChunkMapEntry unless there are players
|
||||
// but addPlayer handles that for us
|
||||
if (oldWatchers != null) {
|
||||
for (EntityPlayerMP player : oldWatchers) {
|
||||
playerManager.addPlayer(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -1 +1,2 @@
|
||||
public net.minecraft.world.gen.ChunkProviderServer field_73248_b # droppedChunksSet
|
||||
public net.minecraft.server.management.PlayerChunkMapEntry field_187283_c # players
|
||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren