Fix remapping from pmmp

This commit is contained in:
Jesse Boyd 2017-09-22 13:27:03 +10:00
parent 9a45b364f6
commit a61e1fa96a
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
4 changed files with 32 additions and 11 deletions

View File

@ -491,7 +491,7 @@ public class MCAQueue extends NMSMappedFaweQueue<FaweQueue, FaweChunk, FaweChunk
public void run(Path path, BasicFileAttributes attr) { public void run(Path path, BasicFileAttributes attr) {
try { try {
String name = path.getFileName().toString(); String name = path.getFileName().toString();
if (!name.endsWith(".mca")) { if (!name.endsWith(".mca") && !name.endsWith(".mcapm")) {
return; return;
} }
if (!filter.appliesFile(path, attr)) { if (!filter.appliesFile(path, attr)) {

View File

@ -2,6 +2,7 @@ package com.boydti.fawe.jnbt.anvil.filters;
import com.boydti.fawe.FaweCache; import com.boydti.fawe.FaweCache;
import com.boydti.fawe.jnbt.anvil.MCAChunk; import com.boydti.fawe.jnbt.anvil.MCAChunk;
import com.boydti.fawe.jnbt.anvil.MCAFile;
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter; import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
import com.boydti.fawe.jnbt.anvil.MutableMCABackedBaseBlock; import com.boydti.fawe.jnbt.anvil.MutableMCABackedBaseBlock;
import com.boydti.fawe.object.clipboard.ClipboardRemapper; import com.boydti.fawe.object.clipboard.ClipboardRemapper;
@ -11,6 +12,7 @@ import com.sk89q.jnbt.ByteTag;
import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.Tag; import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BaseBlock;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -18,6 +20,7 @@ import java.util.Map;
public class RemapFilter extends MCAFilterCounter { public class RemapFilter extends MCAFilterCounter {
private final ClipboardRemapper remapper; private final ClipboardRemapper remapper;
private final ClipboardRemapper.RemapPlatform from; private final ClipboardRemapper.RemapPlatform from;
private boolean skipRemap;
public RemapFilter(ClipboardRemapper remapper) { public RemapFilter(ClipboardRemapper remapper) {
this.remapper = remapper; this.remapper = remapper;
@ -29,8 +32,16 @@ public class RemapFilter extends MCAFilterCounter {
this.from = from; this.from = from;
} }
@Override
public MCAFile applyFile(MCAFile mca) {
File file = mca.getFile();
this.skipRemap = file.getName().endsWith(".mcapm");
return super.applyFile(mca);
}
@Override @Override
public MCAChunk applyChunk(MCAChunk chunk, MutableLong cache) { public MCAChunk applyChunk(MCAChunk chunk, MutableLong cache) {
if (skipRemap) return null;
return super.applyChunk(chunk, cache); return super.applyChunk(chunk, cache);
} }

View File

@ -29,13 +29,14 @@ public class ConvertCommands extends MethodCommands {
@Command( @Command(
aliases = {"anvil2leveldb"}, aliases = {"anvil2leveldb"},
usage = "<folder>", usage = "<folder>",
help = "Convert the world between MCPE/PC values\n", desc = "Convert the world between MCPE/PC values",
desc = "Convert the world between MCPE/PC values\n", help = "Convert the world between MCPE/PC values\n" +
"The -r filter will skip block remapping",
min = 1, min = 1,
max = 1 max = 1
) )
@CommandPermissions("worldedit.anvil.anvil2leveldb") @CommandPermissions("worldedit.anvil.anvil2leveldb")
public void anvil2leveldb(Player player, String folder, @Switch('f') boolean force) throws WorldEditException { public void anvil2leveldb(Player player, String folder, @Switch('f') boolean force, @Switch('r') boolean skipRemap) throws WorldEditException {
ClipboardRemapper mapper; ClipboardRemapper mapper;
RemapFilter filter = new RemapFilter(ClipboardRemapper.RemapPlatform.PC, ClipboardRemapper.RemapPlatform.PE); RemapFilter filter = new RemapFilter(ClipboardRemapper.RemapPlatform.PC, ClipboardRemapper.RemapPlatform.PE);
@ -49,7 +50,7 @@ public class ConvertCommands extends MethodCommands {
@Override @Override
public void run(MCAChunk value) { public void run(MCAChunk value) {
try { try {
converter.write(value); converter.write(value, !skipRemap);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -67,6 +67,8 @@ public class MCAFile2LevelDB implements Closeable {
private boolean closed; private boolean closed;
private LongAdder submitted = new LongAdder(); private LongAdder submitted = new LongAdder();
private boolean remap;
public MCAFile2LevelDB(File folder) { public MCAFile2LevelDB(File folder) {
try { try {
this.folder = folder; this.folder = folder;
@ -102,7 +104,7 @@ public class MCAFile2LevelDB implements Closeable {
@Override @Override
public void run(MCAChunk value) { public void run(MCAChunk value) {
try { try {
write(value); write(value, !file.getFile().getName().endsWith(".mcapm"));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -204,7 +206,7 @@ public class MCAFile2LevelDB implements Closeable {
} }
} }
public void write(MCAChunk chunk) throws IOException { public void write(MCAChunk chunk, boolean remap) throws IOException {
submitted.add(1); submitted.add(1);
if ((submitted.longValue() & 127) == 0) { if ((submitted.longValue() & 127) == 0) {
pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS); pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
@ -271,10 +273,17 @@ public class MCAFile2LevelDB implements Closeable {
byte[] skyLight = chunk.skyLight[layer]; byte[] skyLight = chunk.skyLight[layer];
byte[] blockLight = chunk.blockLight[layer]; byte[] blockLight = chunk.blockLight[layer];
copySection(ids, value, 1); if (remap) {
copySection(data, value, 1 + 4096); copySection(ids, value, 1);
copySection(skyLight, value, 1 + 4096 + 2048); copySection(data, value, 1 + 4096);
copySection(blockLight, value, 1 + 4096 + 2048 + 2048); copySection(skyLight, value, 1 + 4096 + 2048);
copySection(blockLight, value, 1 + 4096 + 2048 + 2048);
} else {
System.arraycopy(ids, 0, value, 1, ids.length);
System.arraycopy(data, 0, value, 1 + 4096, data.length);
System.arraycopy(skyLight, 0, value, 1 + 4096 + 2048, skyLight.length);
System.arraycopy(blockLight, 0, value, 1 + 4096 + 2048 + 2048, blockLight.length);
}
} }
update(key, value); update(key, value);
} }