Mirror von
https://github.com/IntellectualSites/FastAsyncWorldEdit.git
synchronisiert 2024-11-07 20:10:06 +01:00
wip on FaweQueue
Dieser Commit ist enthalten in:
Ursprung
1dcb18ae20
Commit
e86e4c9c53
@ -2,7 +2,7 @@ package com.boydti.fawe.bukkit.listener;
|
||||
|
||||
import com.boydti.fawe.bukkit.util.image.BukkitImageViewer;
|
||||
import com.boydti.fawe.command.CFICommands;
|
||||
import com.boydti.fawe.jnbt.anvil.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.brush.BrushSettings;
|
||||
import com.boydti.fawe.object.extent.FastWorldEditExtent;
|
||||
|
@ -173,7 +173,7 @@ public class FaweAPI {
|
||||
* @param world The name of the world
|
||||
* @param autoqueue If it should start dispatching before you enqueue it.
|
||||
* @return
|
||||
* @see FaweQueue#enqueue()
|
||||
* @see IQueueExtent#enqueue()
|
||||
*/
|
||||
public static IQueueExtent createQueue(World world, boolean autoqueue) {
|
||||
IQueueExtent queue = Fawe.get().getQueueHandler().getQueue(world);
|
||||
|
@ -2,22 +2,37 @@ package com.boydti.fawe;
|
||||
|
||||
import com.boydti.fawe.beta.Trimable;
|
||||
import com.boydti.fawe.config.Settings;
|
||||
import com.boydti.fawe.jnbt.anvil.BitArray4096;
|
||||
import com.boydti.fawe.object.collection.BitArray4096;
|
||||
import com.boydti.fawe.object.collection.IterableThreadLocal;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.sk89q.jnbt.*;
|
||||
import com.sk89q.jnbt.ByteArrayTag;
|
||||
import com.sk89q.jnbt.ByteTag;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.jnbt.DoubleTag;
|
||||
import com.sk89q.jnbt.EndTag;
|
||||
import com.sk89q.jnbt.FloatTag;
|
||||
import com.sk89q.jnbt.IntArrayTag;
|
||||
import com.sk89q.jnbt.IntTag;
|
||||
import com.sk89q.jnbt.ListTag;
|
||||
import com.sk89q.jnbt.LongArrayTag;
|
||||
import com.sk89q.jnbt.LongTag;
|
||||
import com.sk89q.jnbt.ShortTag;
|
||||
import com.sk89q.jnbt.StringTag;
|
||||
import com.sk89q.jnbt.Tag;
|
||||
import com.sk89q.worldedit.math.MutableBlockVector3;
|
||||
import com.sk89q.worldedit.math.MutableVector3;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
|
@ -3,7 +3,6 @@ package com.boydti.fawe;
|
||||
import com.boydti.fawe.beta.implementation.QueueHandler;
|
||||
import com.boydti.fawe.object.FaweCommand;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.regions.FaweMaskManager;
|
||||
import com.boydti.fawe.util.TaskManager;
|
||||
import com.boydti.fawe.util.image.ImageViewer;
|
||||
@ -26,10 +25,6 @@ public interface IFawe {
|
||||
|
||||
TaskManager getTaskManager();
|
||||
|
||||
FaweQueue getNewQueue(World world, boolean fast);
|
||||
|
||||
FaweQueue getNewQueue(String world, boolean fast);
|
||||
|
||||
String getWorldName(World world);
|
||||
|
||||
Collection<FaweMaskManager> getMaskManagers();
|
||||
|
@ -1,54 +1,35 @@
|
||||
package com.boydti.fawe.command;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import com.boydti.fawe.FaweAPI;
|
||||
import com.boydti.fawe.config.BBC;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAClipboard;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFile;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAQueue;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.DebugFixP2Roads;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.DeleteBiomeFilterSimple;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.DeleteOldFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.DeleteUnclaimedFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.DeleteUninhabitedFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.PlotTrimFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.RemapFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.RemoveLayerFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.SetPatternFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.TrimAirFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.history.IAnvilHistory;
|
||||
import com.boydti.fawe.jnbt.anvil.history.NullAnvilHistory;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.RegionWrapper;
|
||||
import com.boydti.fawe.object.RunnableVal4;
|
||||
import com.boydti.fawe.object.changeset.AnvilHistory;
|
||||
import com.boydti.fawe.object.clipboard.remap.ClipboardRemapper;
|
||||
import com.boydti.fawe.object.mask.FaweBlockMatcher;
|
||||
import com.boydti.fawe.util.MainUtil;
|
||||
import com.boydti.fawe.util.SetQueue;
|
||||
import org.enginehub.piston.annotation.Command;
|
||||
import com.sk89q.worldedit.command.util.CommandPermissions;
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.LocalSession;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.command.util.CommandPermissions;
|
||||
import com.sk89q.worldedit.entity.Player;
|
||||
import com.sk89q.worldedit.function.pattern.Pattern;
|
||||
import com.sk89q.worldedit.internal.annotation.Selection;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
import com.sk89q.worldedit.regions.Region;
|
||||
import org.enginehub.piston.annotation.param.Arg;
|
||||
import org.enginehub.piston.annotation.param.Switch;
|
||||
import com.sk89q.worldedit.util.command.parametric.Optional;
|
||||
import com.sk89q.worldedit.world.World;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import org.enginehub.piston.annotation.Command;
|
||||
import org.enginehub.piston.annotation.param.Arg;
|
||||
import org.enginehub.piston.annotation.param.Switch;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
@Command(aliases = {"/anvil"}, desc = "Manipulate billions of blocks: [More Info](https://github.com/boy0001/FastAsyncWorldedit/wiki/Anvil-API)")
|
||||
public class AnvilCommands {
|
||||
@ -62,81 +43,81 @@ public class AnvilCommands {
|
||||
checkNotNull(worldEdit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run safely on an unloaded world (no selection)
|
||||
*
|
||||
* @param player
|
||||
* @param folder
|
||||
* @param filter
|
||||
* @param <G>
|
||||
* @param <T>
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
public static <G, T extends MCAFilter<G>> T runWithWorld(Player player, String folder, T filter, boolean force) {
|
||||
return runWithWorld(player, folder, filter, force, false);
|
||||
}
|
||||
|
||||
|
||||
@Deprecated
|
||||
public static <G, T extends MCAFilter<G>> T runWithWorld(Player player, String folder, T filter, boolean force, boolean unsafe) {
|
||||
boolean copy = false;
|
||||
if (FaweAPI.getWorld(folder) != null) {
|
||||
if (!force) {
|
||||
BBC.WORLD_IS_LOADED.send(player);
|
||||
return null;
|
||||
}
|
||||
copy = true;
|
||||
}
|
||||
FaweQueue defaultQueue = SetQueue.IMP.getNewQueue(folder, true, false);
|
||||
MCAQueue queue = new MCAQueue(defaultQueue);
|
||||
if (copy && !unsafe) {
|
||||
return queue.filterCopy(filter, RegionWrapper.GLOBAL());
|
||||
} else {
|
||||
return queue.filterWorld(filter);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run safely on an existing world within a selection
|
||||
*
|
||||
* @param player
|
||||
* @param editSession
|
||||
* @param selection
|
||||
* @param filter
|
||||
* @param <G>
|
||||
* @param <T>
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
public static <G, T extends MCAFilter<G>> T runWithSelection(Player player, EditSession editSession, Region selection, T filter) {
|
||||
if (!(selection instanceof CuboidRegion)) {
|
||||
BBC.NO_REGION.send(player);
|
||||
return null;
|
||||
}
|
||||
CuboidRegion cuboid = (CuboidRegion) selection;
|
||||
RegionWrapper wrappedRegion = new RegionWrapper(cuboid.getMinimumPoint(), cuboid.getMaximumPoint());
|
||||
String worldName = editSession.getWorld().getName();
|
||||
FaweQueue tmp = SetQueue.IMP.getNewQueue(worldName, true, false);
|
||||
MCAQueue queue = new MCAQueue(tmp);
|
||||
FawePlayer<Object> fp = FawePlayer.wrap(player);
|
||||
fp.checkAllowedRegion(selection);
|
||||
recordHistory(fp, editSession.getWorld(), iAnvilHistory -> {
|
||||
queue.filterCopy(filter, wrappedRegion, iAnvilHistory);
|
||||
});
|
||||
return filter;
|
||||
}
|
||||
|
||||
public static void recordHistory(FawePlayer fp, World world, Consumer<IAnvilHistory> run) {
|
||||
LocalSession session = fp.getSession();
|
||||
if (session == null || session.hasFastMode()) {
|
||||
run.accept(new NullAnvilHistory());
|
||||
} else {
|
||||
AnvilHistory history = new AnvilHistory(world.getName(), fp.getUUID());
|
||||
run.accept(history);
|
||||
session.remember(fp.getPlayer(), world, history, fp.getLimit());
|
||||
}
|
||||
}
|
||||
// /**
|
||||
// * Run safely on an unloaded world (no selection)
|
||||
// *
|
||||
// * @param player
|
||||
// * @param folder
|
||||
// * @param filter
|
||||
// * @param <G>
|
||||
// * @param <T>
|
||||
// * @return
|
||||
// */
|
||||
// @Deprecated
|
||||
// public static <G, T extends MCAFilter<G>> T runWithWorld(Player player, String folder, T filter, boolean force) {
|
||||
// return runWithWorld(player, folder, filter, force, false);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @Deprecated
|
||||
// public static <G, T extends MCAFilter<G>> T runWithWorld(Player player, String folder, T filter, boolean force, boolean unsafe) {
|
||||
// boolean copy = false;
|
||||
// if (FaweAPI.getWorld(folder) != null) {
|
||||
// if (!force) {
|
||||
// BBC.WORLD_IS_LOADED.send(player);
|
||||
// return null;
|
||||
// }
|
||||
// copy = true;
|
||||
// }
|
||||
// IQueueExtent defaultQueue = SetQueue.IMP.getNewQueue(folder, true, false);
|
||||
// MCAQueue queue = new MCAQueue(defaultQueue);
|
||||
// if (copy && !unsafe) {
|
||||
// return queue.filterCopy(filter, RegionWrapper.GLOBAL());
|
||||
// } else {
|
||||
// return queue.filterWorld(filter);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Run safely on an existing world within a selection
|
||||
// *
|
||||
// * @param player
|
||||
// * @param editSession
|
||||
// * @param selection
|
||||
// * @param filter
|
||||
// * @param <G>
|
||||
// * @param <T>
|
||||
// * @return
|
||||
// */
|
||||
// @Deprecated
|
||||
// public static <G, T extends MCAFilter<G>> T runWithSelection(Player player, EditSession editSession, Region selection, T filter) {
|
||||
// if (!(selection instanceof CuboidRegion)) {
|
||||
// BBC.NO_REGION.send(player);
|
||||
// return null;
|
||||
// }
|
||||
// CuboidRegion cuboid = (CuboidRegion) selection;
|
||||
// RegionWrapper wrappedRegion = new RegionWrapper(cuboid.getMinimumPoint(), cuboid.getMaximumPoint());
|
||||
// String worldName = editSession.getWorld().getName();
|
||||
// IQueueExtent tmp = SetQueue.IMP.getNewQueue(worldName, true, false);
|
||||
// MCAQueue queue = new MCAQueue(tmp);
|
||||
// FawePlayer<Object> fp = FawePlayer.wrap(player);
|
||||
// fp.checkAllowedRegion(selection);
|
||||
// recordHistory(fp, editSession.getWorld(), iAnvilHistory -> {
|
||||
// queue.filterCopy(filter, wrappedRegion, iAnvilHistory);
|
||||
// });
|
||||
// return filter;
|
||||
// }
|
||||
//
|
||||
// public static void recordHistory(FawePlayer fp, World world, Consumer<IAnvilHistory> run) {
|
||||
// LocalSession session = fp.getSession();
|
||||
// if (session == null || session.hasFastMode()) {
|
||||
// run.accept(new NullAnvilHistory());
|
||||
// } else {
|
||||
// AnvilHistory history = new AnvilHistory(world.getName(), fp.getUUID());
|
||||
// run.accept(history);
|
||||
// session.remember(fp.getPlayer(), world, history, fp.getLimit());
|
||||
// }
|
||||
// }
|
||||
|
||||
@Command(
|
||||
name = "replaceall",
|
||||
@ -146,7 +127,7 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.replaceall")
|
||||
public void replaceAll(Player player, String folder, @Arg(name = "from", desc = "String", def = "") String from, String to, @Switch(name='d', desc = "TODO") boolean useData) throws WorldEditException {
|
||||
// final FaweBlockMatcher matchFrom;
|
||||
// final FaweBlockMatcher matchFrom; TODO NOT IMPLEMENTED
|
||||
// if (from == null) {
|
||||
// matchFrom = FaweBlockMatcher.NOT_AIR;
|
||||
// } else {
|
||||
@ -168,15 +149,15 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.remapall")
|
||||
public void remapall(Player player, String folder) throws WorldEditException {
|
||||
ClipboardRemapper.RemapPlatform from;
|
||||
ClipboardRemapper.RemapPlatform to;
|
||||
from = ClipboardRemapper.RemapPlatform.PE;
|
||||
to = ClipboardRemapper.RemapPlatform.PC;
|
||||
RemapFilter filter = new RemapFilter(from, to);
|
||||
RemapFilter result = runWithWorld(player, folder, filter, true);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// ClipboardRemapper.RemapPlatform from; TODO NOT IMPLEMENTED
|
||||
// ClipboardRemapper.RemapPlatform to;
|
||||
// from = ClipboardRemapper.RemapPlatform.PE;
|
||||
// to = ClipboardRemapper.RemapPlatform.PC;
|
||||
// RemapFilter filter = new RemapFilter(from, to);
|
||||
// RemapFilter result = runWithWorld(player, folder, filter, true);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
@ -191,11 +172,11 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.deleteallunvisited")
|
||||
public void deleteAllUnvisited(Player player, String folder, int inhabitedTicks, @Arg(name = "filedurationmillis", desc = "int", def = "60000") int fileDurationMillis) throws WorldEditException {
|
||||
DeleteUninhabitedFilter filter = new DeleteUninhabitedFilter(fileDurationMillis, inhabitedTicks, fileDurationMillis);
|
||||
DeleteUninhabitedFilter result = runWithWorld(player, folder, filter, true);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// DeleteUninhabitedFilter filter = new DeleteUninhabitedFilter(fileDurationMillis, inhabitedTicks, fileDurationMillis); TODO NOT IMPLEMENTED
|
||||
// DeleteUninhabitedFilter result = runWithWorld(player, folder, filter, true);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -210,15 +191,15 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.deleteallunclaimed")
|
||||
public void deleteAllUnclaimed(Player player, int inhabitedTicks, @Arg(name = "filedurationmillis", desc = "int", def = "60000") int fileDurationMillis, @Switch(name='d', desc = "TODO") boolean debug) throws WorldEditException {
|
||||
String folder = player.getWorld().getName();
|
||||
DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, fileDurationMillis);
|
||||
if (debug) {
|
||||
filter.enableDebug();
|
||||
}
|
||||
DeleteUnclaimedFilter result = runWithWorld(player, folder, filter, true);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// String folder = player.getWorld().getName(); TODO NOT IMPLEMENTED
|
||||
// DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, fileDurationMillis);
|
||||
// if (debug) {
|
||||
// filter.enableDebug();
|
||||
// }
|
||||
// DeleteUnclaimedFilter result = runWithWorld(player, folder, filter, true);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -233,14 +214,14 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.deleteunclaimed")
|
||||
public void deleteUnclaimed(Player player, EditSession editSession, @Selection Region selection, int inhabitedTicks, @Arg(name = "filedurationmillis", desc = "int", def = "60000") int fileDurationMillis, @Switch(name='d', desc = "TODO") boolean debug) throws WorldEditException {
|
||||
DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, fileDurationMillis);
|
||||
if (debug) {
|
||||
filter.enableDebug();
|
||||
}
|
||||
DeleteUnclaimedFilter result = runWithSelection(player, editSession, selection, filter);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, fileDurationMillis); TODO NOT IMPLEMENTED
|
||||
// if (debug) {
|
||||
// filter.enableDebug();
|
||||
// }
|
||||
// DeleteUnclaimedFilter result = runWithSelection(player, editSession, selection, filter);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -253,12 +234,12 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.deletealloldregions")
|
||||
public void deleteAllOldRegions(Player player, String folder, String time) throws WorldEditException {
|
||||
long duration = MainUtil.timeToSec(time) * 1000L;
|
||||
DeleteOldFilter filter = new DeleteOldFilter(duration);
|
||||
DeleteOldFilter result = runWithWorld(player, folder, filter, true);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// long duration = MainUtil.timeToSec(time) * 1000L; TODO NOT IMPLEMENTED
|
||||
// DeleteOldFilter filter = new DeleteOldFilter(duration);
|
||||
// DeleteOldFilter result = runWithWorld(player, folder, filter, true);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -271,16 +252,16 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.trimallplots")
|
||||
public void trimAllPlots(Player player, @Switch(name='v', desc = "TODO") boolean deleteUnvisited) throws WorldEditException {
|
||||
String folder = player.getWorld().getName();
|
||||
int visitTime = deleteUnvisited ? 1 : -1;
|
||||
PlotTrimFilter filter = new PlotTrimFilter(player.getWorld(), 0, visitTime, 600000);
|
||||
// PlotTrimFilter result = runWithWorld(player, folder, filter, true);
|
||||
FaweQueue defaultQueue = SetQueue.IMP.getNewQueue(folder, true, false);
|
||||
MCAQueue queue = new MCAQueue(defaultQueue);
|
||||
PlotTrimFilter result = queue.filterWorld(filter);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// String folder = player.getWorld().getName(); TODO NOT IMPLEMENTED
|
||||
// int visitTime = deleteUnvisited ? 1 : -1;
|
||||
// PlotTrimFilter filter = new PlotTrimFilter(player.getWorld(), 0, visitTime, 600000);
|
||||
//// PlotTrimFilter result = runWithWorld(player, folder, filter, true);
|
||||
// IQueueExtent defaultQueue = SetQueue.IMP.getNewQueue(folder, true, false);
|
||||
// MCAQueue queue = new MCAQueue(defaultQueue);
|
||||
// PlotTrimFilter result = queue.filterWorld(filter);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -290,11 +271,11 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.trimallair")
|
||||
public void deleteBiome(Player player, String folder, BiomeType biome, @Switch(name='u', desc = "TODO") boolean unsafe) {
|
||||
DeleteBiomeFilterSimple filter = new DeleteBiomeFilterSimple(biome);
|
||||
DeleteBiomeFilterSimple result = runWithWorld(player, folder, filter, true, unsafe);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// DeleteBiomeFilterSimple filter = new DeleteBiomeFilterSimple(biome); TODO NOT IMPLEMENTED
|
||||
// DeleteBiomeFilterSimple result = runWithWorld(player, folder, filter, true, unsafe);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -304,11 +285,11 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.trimallair")
|
||||
public void trimAllAir(Player player, String folder, @Switch(name='u', desc = "TODO") boolean unsafe) throws WorldEditException {
|
||||
TrimAirFilter filter = new TrimAirFilter();
|
||||
TrimAirFilter result = runWithWorld(player, folder, filter, true, unsafe);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// TrimAirFilter filter = new TrimAirFilter(); TODO NOT IMPLEMENTED
|
||||
// TrimAirFilter result = runWithWorld(player, folder, filter, true, unsafe);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -318,11 +299,11 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.debugfixroads")
|
||||
public void debugfixroads(Player player, String folder) throws WorldEditException {
|
||||
DebugFixP2Roads filter = new DebugFixP2Roads();
|
||||
DebugFixP2Roads result = runWithWorld(player, folder, filter, true, true);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// DebugFixP2Roads filter = new DebugFixP2Roads(); TODO NOT IMPLEMENTED
|
||||
// DebugFixP2Roads result = runWithWorld(player, folder, filter, true, true);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -332,8 +313,7 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.replaceall")
|
||||
public void replaceAllPattern(Player player, String folder, @Arg(name = "from", desc = "String", def = "") String from, final Pattern to, @Switch(name='d', desc = "TODO") boolean useData, @Switch(name='m', desc = "TODO") boolean useMap) throws WorldEditException {
|
||||
|
||||
// MCAFilterCounter filter;
|
||||
// MCAFilterCounter filter; TODO NOT IMPLEMENTED
|
||||
// if (useMap) {
|
||||
// if (to instanceof RandomPattern) {
|
||||
// List<String> split = StringMan.split(from, ',');
|
||||
@ -384,50 +364,50 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.clear")
|
||||
public void unset(Player player, EditSession editSession, @Selection Region selection) throws WorldEditException {
|
||||
BlockVector3 bot = selection.getMinimumPoint();
|
||||
BlockVector3 top = selection.getMaximumPoint();
|
||||
RegionWrapper region = new RegionWrapper(bot, top);
|
||||
|
||||
MCAFilterCounter filter = new MCAFilterCounter() {
|
||||
@Override
|
||||
public MCAFile applyFile(MCAFile file) {
|
||||
int X = file.getX();
|
||||
int Z = file.getZ();
|
||||
int bcx = X << 5;
|
||||
int bcz = Z << 5;
|
||||
int bx = X << 9;
|
||||
int bz = Z << 9;
|
||||
if (region.isIn(bx, bz) && region.isIn(bx + 511, bz + 511)) {
|
||||
file.setDeleted(true);
|
||||
get().add(512 * 512 * 256);
|
||||
} else if (region.isInMCA(X, Z)) {
|
||||
file.init();
|
||||
final byte[] empty = new byte[4];
|
||||
RandomAccessFile raf = file.getRandomAccessFile();
|
||||
file.forEachChunk(new RunnableVal4<Integer, Integer, Integer, Integer>() {
|
||||
@Override
|
||||
public void run(Integer cx, Integer cz, Integer offset, Integer size) {
|
||||
if (region.isInChunk(bcx + cx, bcz + cz)) {
|
||||
int index = ((cx & 31) << 2) + ((cz & 31) << 7);
|
||||
try {
|
||||
raf.seek(index);
|
||||
raf.write(empty);
|
||||
get().add(16 * 16 * 256);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
file.clear();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
MCAFilterCounter result = runWithSelection(player, editSession, selection, filter);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// BlockVector3 bot = selection.getMinimumPoint(); TODO NOT IMPLEMENTED
|
||||
// BlockVector3 top = selection.getMaximumPoint();
|
||||
// RegionWrapper region = new RegionWrapper(bot, top);
|
||||
//
|
||||
// MCAFilterCounter filter = new MCAFilterCounter() {
|
||||
// @Override
|
||||
// public MCAFile applyFile(MCAFile file) {
|
||||
// int X = file.getX();
|
||||
// int Z = file.getZ();
|
||||
// int bcx = X << 5;
|
||||
// int bcz = Z << 5;
|
||||
// int bx = X << 9;
|
||||
// int bz = Z << 9;
|
||||
// if (region.isIn(bx, bz) && region.isIn(bx + 511, bz + 511)) {
|
||||
// file.setDeleted(true);
|
||||
// get().add(512 * 512 * 256);
|
||||
// } else if (region.isInMCA(X, Z)) {
|
||||
// file.init();
|
||||
// final byte[] empty = new byte[4];
|
||||
// RandomAccessFile raf = file.getRandomAccessFile();
|
||||
// file.forEachChunk(new RunnableVal4<Integer, Integer, Integer, Integer>() {
|
||||
// @Override
|
||||
// public void run(Integer cx, Integer cz, Integer offset, Integer size) {
|
||||
// if (region.isInChunk(bcx + cx, bcz + cz)) {
|
||||
// int index = ((cx & 31) << 2) + ((cz & 31) << 7);
|
||||
// try {
|
||||
// raf.seek(index);
|
||||
// raf.write(empty);
|
||||
// get().add(16 * 16 * 256);
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// file.clear();
|
||||
// }
|
||||
// return null;
|
||||
// }
|
||||
// };
|
||||
// MCAFilterCounter result = runWithSelection(player, editSession, selection, filter);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -436,7 +416,7 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.count")
|
||||
public void count(Player player, EditSession editSession, @Selection Region selection, String arg, @Switch(name='d', desc = "TODO") boolean useData) throws WorldEditException {
|
||||
// Set<BaseBlock> searchBlocks = worldEdit.getBlocks(player, arg, true);
|
||||
// Set<BaseBlock> searchBlocks = worldEdit.getBlocks(player, arg, true); TODO NOT IMPLEMENTED
|
||||
// MCAFilterCounter filter;
|
||||
// if (useData || arg.contains(":")) { // Optimize for both cases
|
||||
// CountFilter counter = new CountFilter();
|
||||
@ -458,7 +438,7 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.distr")
|
||||
public void distr(Player player, EditSession editSession, @Selection Region selection, @Switch(name='d', desc = "TODO") boolean useData) throws WorldEditException {
|
||||
// long total = 0;
|
||||
// long total = 0; TODO NOT IMPLEMENTED
|
||||
// long[] count;
|
||||
// MCAFilter<long[]> counts;
|
||||
// if (useData) {
|
||||
@ -537,8 +517,7 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.replace")
|
||||
public void replace(Player player, EditSession editSession, @Selection Region selection, @Arg(name = "from", desc = "String", def = "") String from, String to, @Switch(name='d', desc = "TODO") boolean useData) throws WorldEditException {
|
||||
|
||||
// final FaweBlockMatcher matchFrom;
|
||||
// final FaweBlockMatcher matchFrom; TODO NOT IMPLEMENTED
|
||||
// if (from == null) {
|
||||
// matchFrom = FaweBlockMatcher.NOT_AIR;
|
||||
// } else {
|
||||
@ -561,8 +540,7 @@ public class AnvilCommands {
|
||||
@CommandPermissions("worldedit.anvil.replace")
|
||||
// Player player, String folder, @Arg(name = "from", desc = "String", def = "") String from, final Pattern to, @Switch(name='d', desc = "TODO") boolean useData, @Switch(name='m', desc = "TODO") boolean useMap
|
||||
public void replacePattern(Player player, EditSession editSession, @Selection Region selection, @Arg(name = "from", desc = "String", def = "") String from, final Pattern to, @Switch(name='d', desc = "TODO") boolean useData, @Switch(name='m', desc = "TODO") boolean useMap) throws WorldEditException {
|
||||
|
||||
// MCAFilterCounter filter;
|
||||
// MCAFilterCounter filter; TODO NOT IMPLEMENTED
|
||||
// if (useMap) {
|
||||
// if (to instanceof RandomPattern) {
|
||||
// List<String> split = StringMan.split(from, ',');
|
||||
@ -593,11 +571,11 @@ public class AnvilCommands {
|
||||
@CommandPermissions("worldedit.anvil.set")
|
||||
// Player player, String folder, @Arg(name = "from", desc = "String", def = "") String from, final Pattern to, @Switch(name='d', desc = "TODO") boolean useData, @Switch(name='m', desc = "TODO") boolean useMap
|
||||
public void set(Player player, EditSession editSession, @Selection Region selection, final Pattern to) throws WorldEditException {
|
||||
MCAFilterCounter filter = new SetPatternFilter(to);
|
||||
MCAFilterCounter result = runWithSelection(player, editSession, selection, filter);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// MCAFilterCounter filter = new SetPatternFilter(to); TODO NOT IMPLEMENTED
|
||||
// MCAFilterCounter result = runWithSelection(player, editSession, selection, filter);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -607,15 +585,15 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.removelayer")
|
||||
public void removeLayers(Player player, EditSession editSession, @Selection Region selection, int id) throws WorldEditException {
|
||||
BlockVector3 min = selection.getMinimumPoint();
|
||||
BlockVector3 max = selection.getMaximumPoint();
|
||||
int minY = min.getBlockY();
|
||||
int maxY = max.getBlockY();
|
||||
RemoveLayerFilter filter = new RemoveLayerFilter(minY, maxY, id);
|
||||
MCAFilterCounter result = runWithSelection(player, editSession, selection, filter);
|
||||
if (result != null) {
|
||||
player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
}
|
||||
// BlockVector3 min = selection.getMinimumPoint(); TODO NOT IMPLEMENTED
|
||||
// BlockVector3 max = selection.getMaximumPoint();
|
||||
// int minY = min.getBlockY();
|
||||
// int maxY = max.getBlockY();
|
||||
// RemoveLayerFilter filter = new RemoveLayerFilter(minY, maxY, id);
|
||||
// MCAFilterCounter result = runWithSelection(player, editSession, selection, filter);
|
||||
// if (result != null) {
|
||||
// player.print(BBC.VISITOR_BLOCK.format(result.getTotal()));
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
@ -625,19 +603,19 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.copychunks")
|
||||
public void copy(Player player, LocalSession session, EditSession editSession, @Selection Region selection) throws WorldEditException {
|
||||
if (!(selection instanceof CuboidRegion)) {
|
||||
BBC.NO_REGION.send(player);
|
||||
return;
|
||||
}
|
||||
CuboidRegion cuboid = (CuboidRegion) selection;
|
||||
String worldName = editSession.getWorld().getName();
|
||||
FaweQueue tmp = SetQueue.IMP.getNewQueue(worldName, true, false);
|
||||
MCAQueue queue = new MCAQueue(tmp);
|
||||
BlockVector3 origin = session.getPlacementPosition(player);
|
||||
MCAClipboard clipboard = new MCAClipboard(queue, cuboid, origin);
|
||||
FawePlayer fp = FawePlayer.wrap(player);
|
||||
fp.setMeta(FawePlayer.METADATA_KEYS.ANVIL_CLIPBOARD, clipboard);
|
||||
BBC.COMMAND_COPY.send(player, selection.getArea());
|
||||
// if (!(selection instanceof CuboidRegion)) { TODO NOT IMPLEMENTED
|
||||
// BBC.NO_REGION.send(player);
|
||||
// return;
|
||||
// }
|
||||
// CuboidRegion cuboid = (CuboidRegion) selection;
|
||||
// String worldName = editSession.getWorld().getName();
|
||||
// IQueueExtent tmp = SetQueue.IMP.getNewQueue(worldName, true, false);
|
||||
// MCAQueue queue = new MCAQueue(tmp);
|
||||
// BlockVector3 origin = session.getPlacementPosition(player);
|
||||
// MCAClipboard clipboard = new MCAClipboard(queue, cuboid, origin);
|
||||
// FawePlayer fp = FawePlayer.wrap(player);
|
||||
// fp.setMeta(FawePlayer.METADATA_KEYS.ANVIL_CLIPBOARD, clipboard);
|
||||
// BBC.COMMAND_COPY.send(player, selection.getArea());
|
||||
}
|
||||
|
||||
@Command(
|
||||
@ -649,8 +627,7 @@ public class AnvilCommands {
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.pastechunks")
|
||||
public void paste(Player player, LocalSession session, EditSession editSession, @Switch(name='c', desc = "TODO") boolean alignChunk) throws WorldEditException, IOException {
|
||||
|
||||
// FawePlayer fp = FawePlayer.wrap(player);
|
||||
// FawePlayer fp = FawePlayer.wrap(player); TODO NOT IMPLEMENTED
|
||||
// MCAClipboard clipboard = fp.getMeta(FawePlayer.METADATA_KEYS.ANVIL_CLIPBOARD);
|
||||
// if (clipboard == null) {
|
||||
// fp.sendMessage("You must first use `//anvil copy`");
|
||||
@ -666,7 +643,7 @@ public class AnvilCommands {
|
||||
// int oZ = offset.getBlockZ();
|
||||
// RegionWrapper pasteRegion = new RegionWrapper(copyRegion.minX + oX, copyRegion.maxX + oX, copyRegion.minZ + oZ, copyRegion.maxZ + oZ);
|
||||
// String pasteWorldName = Fawe.imp().getWorldName(editSession.getWorld());
|
||||
// FaweQueue tmpTo = SetQueue.IMP.getNewQueue(pasteWorldName, true, false);
|
||||
// IQueueExtent tmpTo = SetQueue.IMP.getNewQueue(pasteWorldName, true, false);
|
||||
// MCAQueue copyQueue = clipboard.getQueue();
|
||||
// MCAQueue pasteQueue = new MCAQueue(tmpTo);
|
||||
//
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.boydti.fawe.command;
|
||||
|
||||
import com.boydti.fawe.config.Commands;
|
||||
import com.boydti.fawe.jnbt.anvil.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.changeset.CFIChangeSet;
|
||||
import org.enginehub.piston.annotation.Command;
|
||||
|
@ -5,16 +5,14 @@ import com.boydti.fawe.FaweAPI;
|
||||
import com.boydti.fawe.beta.SingleFilterBlock;
|
||||
import com.boydti.fawe.config.BBC;
|
||||
import com.boydti.fawe.config.Commands;
|
||||
import com.boydti.fawe.jnbt.anvil.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.RunnableVal;
|
||||
import com.boydti.fawe.object.clipboard.MultiClipboardHolder;
|
||||
import com.boydti.fawe.util.CleanTextureUtil;
|
||||
import com.boydti.fawe.util.FilteredTextureUtil;
|
||||
import com.boydti.fawe.util.ImgurUtility;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.boydti.fawe.util.SetQueue;
|
||||
import com.boydti.fawe.util.StringMan;
|
||||
import com.boydti.fawe.util.TaskManager;
|
||||
import com.boydti.fawe.util.TextureUtil;
|
||||
@ -46,10 +44,7 @@ import com.sk89q.worldedit.registry.state.PropertyKey;
|
||||
import com.sk89q.worldedit.session.ClipboardHolder;
|
||||
import com.sk89q.worldedit.session.request.Request;
|
||||
import com.sk89q.worldedit.util.Location;
|
||||
import com.sk89q.worldedit.util.command.Dispatcher;
|
||||
import org.enginehub.piston.annotation.param.Switch;
|
||||
import com.sk89q.worldedit.util.command.parametric.Optional;
|
||||
import com.sk89q.worldedit.util.command.parametric.ParameterException;
|
||||
import com.sk89q.worldedit.world.World;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
@ -95,7 +90,7 @@ public class CFICommands extends MethodCommands {
|
||||
public static File getFolder(String worldName) {
|
||||
Platform platform = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING);
|
||||
List<? extends World> worlds = platform.getWorlds();
|
||||
FaweQueue queue = SetQueue.IMP.getNewQueue(worlds.get(0), true, false);
|
||||
IQueueExtent queue = SetQueue.IMP.getNewQueue(worlds.get(0), true, false);
|
||||
return new File(queue.getSaveFolder().getParentFile().getParentFile(), worldName + File.separator + "region");
|
||||
}
|
||||
|
||||
@ -182,7 +177,7 @@ public class CFICommands extends MethodCommands {
|
||||
desc = "Create the world"
|
||||
)
|
||||
@CommandPermissions("worldedit.anvil.cfi")
|
||||
public void done(FawePlayer fp) throws ParameterException, IOException {
|
||||
public void done(FawePlayer fp) {
|
||||
CFISettings settings = assertSettings(fp);
|
||||
HeightMapMCAGenerator generator = settings.getGenerator();
|
||||
|
||||
|
@ -1,7 +1,5 @@
|
||||
package com.boydti.fawe.command;
|
||||
|
||||
import com.boydti.fawe.config.BBC;
|
||||
import com.boydti.fawe.jnbt.anvil.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.RunnableVal;
|
||||
import com.boydti.fawe.util.TaskManager;
|
||||
@ -17,12 +15,9 @@ import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer;
|
||||
import com.github.intellectualsites.plotsquared.plot.object.worlds.PlotAreaManager;
|
||||
import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotArea;
|
||||
import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotAreaManager;
|
||||
import com.sk89q.worldedit.function.pattern.FawePattern;
|
||||
import com.sk89q.worldedit.util.Location;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class PlotLoader {
|
||||
|
@ -1,19 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
public class ChunkSimplifier {
|
||||
private final HeightMapMCAGenerator gen;
|
||||
|
||||
public ChunkSimplifier(HeightMapMCAGenerator gen) {
|
||||
this.gen = gen;
|
||||
}
|
||||
|
||||
public void simplify(MCAChunk chunk) {
|
||||
// Copy biome
|
||||
// Calculate water level
|
||||
// Determine floor block
|
||||
// Determine overlay block
|
||||
// determine main block
|
||||
// Copy bedrock
|
||||
// copy anomalies to blocks
|
||||
}
|
||||
}
|
@ -1,145 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.boydti.fawe.util.TextureUtil;
|
||||
import com.sk89q.worldedit.world.block.BlockID;
|
||||
import com.sk89q.worldedit.world.block.BlockType;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.DataBufferInt;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public final class HeightMapMCADrawer {
|
||||
private final HeightMapMCAGenerator gen;
|
||||
private final TextureUtil tu;
|
||||
private final ForkJoinPool pool;
|
||||
|
||||
public HeightMapMCADrawer(HeightMapMCAGenerator generator, TextureUtil textureUtil) {
|
||||
this.gen = generator;
|
||||
this.tu = textureUtil;
|
||||
this.pool = new ForkJoinPool();
|
||||
}
|
||||
|
||||
public HeightMapMCADrawer(HeightMapMCAGenerator generator) {
|
||||
this(generator, Fawe.get().getCachedTextureUtil(false, 0, 100));
|
||||
}
|
||||
|
||||
public BufferedImage draw() {
|
||||
BufferedImage img = new BufferedImage(gen.getWidth(), gen.getLength(), BufferedImage.TYPE_INT_RGB);
|
||||
final int[] overlay = gen.overlay == null ? gen.floor.get() : gen.overlay.get();
|
||||
final int[] floor = gen.floor.get();
|
||||
final int[] main = gen.main.get();
|
||||
final byte[] heights = gen.heights.get();
|
||||
final byte[] biomes = gen.biomes.get();
|
||||
final int waterHeight = gen.primtives.waterHeight;
|
||||
final int width = gen.getWidth();
|
||||
final int length = gen.getLength();
|
||||
|
||||
int[] raw = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
|
||||
|
||||
int parallelism = pool.getParallelism();
|
||||
int size = (heights.length + parallelism - 1) / parallelism;
|
||||
for (int i = 0; i < parallelism; i++) {
|
||||
int start = i * size;
|
||||
int end = Math.min(heights.length, start + size);
|
||||
pool.submit((Runnable) () -> {
|
||||
for (int index = start; index < end; index ++) {
|
||||
int height = (heights[index] & 0xFF);
|
||||
int combined;
|
||||
if ((combined = overlay[index]) == 0) {
|
||||
height--;
|
||||
combined = floor[index];
|
||||
if (BlockTypes.getFromStateId(combined).getMaterial().isAir()) {
|
||||
height--;
|
||||
combined = main[index];
|
||||
}
|
||||
}
|
||||
// draw combined
|
||||
int color;
|
||||
switch (combined >> 4) {
|
||||
case 2:
|
||||
color = getAverageBiomeColor(biomes, width, index);
|
||||
break;
|
||||
case 78:
|
||||
color = (0xDD << 16) + (0xDD << 8) + (0xDD << 0);
|
||||
break;
|
||||
default:
|
||||
color = tu.getColor(BlockTypes.getFromStateId(combined));
|
||||
break;
|
||||
}
|
||||
int slope = getSlope(heights, width, index, height);
|
||||
if (slope != 0) {
|
||||
slope = (slope << 3) + (slope << 2);
|
||||
int r = MathMan.clamp(((color >> 16) & 0xFF) + slope, 0, 255);
|
||||
int g = MathMan.clamp(((color >> 8) & 0xFF) + slope, 0, 255);
|
||||
int b = MathMan.clamp(((color >> 0) & 0xFF) + slope, 0, 255);
|
||||
color = (r << 16) + (g << 8) + (b << 0);
|
||||
}
|
||||
if (height + 1 < waterHeight) {
|
||||
int waterId = gen.primtives.waterId;
|
||||
int waterColor = 0;
|
||||
BlockType waterType = BlockTypes.get(waterId);
|
||||
switch (waterType.getInternalId()) {
|
||||
case BlockID.WATER:
|
||||
color = tu.averageColor((0x11 << 16) + (0x66 << 8) + (0xCC), color);
|
||||
break;
|
||||
case BlockID.LAVA:
|
||||
color = (0xCC << 16) + (0x33 << 8) + (0);
|
||||
break;
|
||||
default:
|
||||
color = tu.getColor(waterType);
|
||||
break;
|
||||
}
|
||||
}
|
||||
raw[index] = color;
|
||||
}
|
||||
});
|
||||
}
|
||||
pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
pool.shutdownNow();
|
||||
return img;
|
||||
}
|
||||
|
||||
private final int getAverageBiomeColor(byte[] biomes, int width, int index) {
|
||||
int c0 = tu.getBiome(biomes[index] & 0xFF).grassCombined;
|
||||
int c2 = getBiome(biomes, index + 1 + width, index);
|
||||
int c1 = getBiome(biomes, index - 1 - width, index);
|
||||
// int c3 = getBiome(biomes, index + width, index);
|
||||
// int c4 = getBiome(biomes, index - width, index);
|
||||
int r = ((c0 >> 16) & 0xFF) + ((c1 >> 16) & 0xFF) + ((c2 >> 16) & 0xFF);// + ((c3 >> 16) & 0xFF) + ((c4 >> 16) & 0xFF);
|
||||
int g = ((c0 >> 8) & 0xFF) + ((c1 >> 8) & 0xFF) + ((c2 >> 8) & 0xFF);// + ((c3 >> 8) & 0xFF) + ((c4 >> 8) & 0xFF);
|
||||
int b = ((c0) & 0xFF) + ((c1) & 0xFF) + ((c2) & 0xFF);// + ((c3) & 0xFF) + ((c4) & 0xFF);
|
||||
r = r * 85 >> 8;
|
||||
g = g * 85 >> 8;
|
||||
b = b * 85 >> 8;
|
||||
return (r << 16) + (g << 8) + (b);
|
||||
}
|
||||
|
||||
private final int getBiome(byte[] biomes, int newIndex, int index) {
|
||||
if (newIndex < 0 || newIndex >= biomes.length) newIndex = index;
|
||||
int biome = biomes[newIndex] & 0xFF;
|
||||
return tu.getBiome(biome).grassCombined;
|
||||
}
|
||||
|
||||
private int getSlope(byte[] heights, int width, int index, int height) {
|
||||
return (
|
||||
+ getHeight(heights, index + 1, height)
|
||||
// + getHeight(heights, index + width, height)
|
||||
+ getHeight(heights, index + width + 1, height)
|
||||
- getHeight(heights, index - 1, height)
|
||||
// - getHeight(heights, index - width, height)
|
||||
- getHeight(heights, index - width - 1, height)
|
||||
);
|
||||
}
|
||||
|
||||
private int getHeight(byte[] heights, int index, int height) {
|
||||
if (index < 0 || index >= heights.length) return height;
|
||||
return heights[index] & 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,796 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.jnbt.NBTStreamer;
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.io.FastByteArrayOutputStream;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.boydti.fawe.util.MainUtil;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.boydti.fawe.util.ReflectionUtils;
|
||||
import com.sk89q.jnbt.*;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.biome.BiomeTypes;
|
||||
|
||||
import java.io.DataOutput;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
public class MCAChunk extends FaweChunk<Void> {
|
||||
|
||||
public int[][] ids;
|
||||
public byte[][] skyLight;
|
||||
public byte[][] blockLight;
|
||||
public byte[] biomes;
|
||||
public Map<Short, CompoundTag> tiles = new HashMap<>();
|
||||
public Map<UUID, CompoundTag> entities = new HashMap<>();
|
||||
private long inhabitedTime;
|
||||
private long lastUpdate;
|
||||
private int[] heightMap;
|
||||
|
||||
private int modified;
|
||||
private boolean deleted;
|
||||
|
||||
public MCAChunk(FaweQueue queue, int x, int z) {
|
||||
super(queue, x, z);
|
||||
this.ids = new int[16][];
|
||||
this.skyLight = new byte[16][];
|
||||
this.blockLight = new byte[16][];
|
||||
this.biomes = new byte[256];
|
||||
this.tiles = new HashMap<>();
|
||||
this.entities = new HashMap<>();
|
||||
this.lastUpdate = System.currentTimeMillis();
|
||||
this.heightMap = new int[256];
|
||||
this.setModified();
|
||||
}
|
||||
|
||||
public MCAChunk(MCAChunk parent, boolean shallow) {
|
||||
super(parent.getParent(), parent.getX(), parent.getZ());
|
||||
if (shallow) {
|
||||
this.ids = parent.ids;
|
||||
this.skyLight = parent.skyLight;
|
||||
this.blockLight = parent.blockLight;
|
||||
this.biomes = parent.biomes;
|
||||
this.tiles = parent.tiles;
|
||||
this.entities = parent.entities;
|
||||
this.inhabitedTime = parent.inhabitedTime;
|
||||
this.lastUpdate = parent.lastUpdate;
|
||||
this.heightMap = parent.heightMap;
|
||||
this.modified = parent.modified;
|
||||
this.deleted = parent.deleted;
|
||||
} else {
|
||||
this.ids = (int[][]) MainUtil.copyNd(parent.ids);
|
||||
this.skyLight = (byte[][]) MainUtil.copyNd(parent.skyLight);
|
||||
this.blockLight = (byte[][]) MainUtil.copyNd(parent.blockLight);
|
||||
this.biomes = parent.biomes.clone();
|
||||
this.tiles = new HashMap<>(parent.tiles);
|
||||
this.entities = new HashMap<>(parent.entities);
|
||||
this.inhabitedTime = parent.inhabitedTime;
|
||||
this.lastUpdate = parent.lastUpdate;
|
||||
this.heightMap = parent.heightMap.clone();
|
||||
this.modified = parent.modified;
|
||||
this.deleted = parent.deleted;
|
||||
}
|
||||
}
|
||||
|
||||
public void write(NBTOutputStream nbtOut) throws IOException {
|
||||
nbtOut.writeNamedTagName("", NBTConstants.TYPE_COMPOUND);
|
||||
nbtOut.writeLazyCompoundTag("Level", out -> {
|
||||
out.writeNamedTag("V", (byte) 1);
|
||||
out.writeNamedTag("xPos", getX());
|
||||
out.writeNamedTag("zPos", getZ());
|
||||
out.writeNamedTag("LightPopulated", (byte) 0);
|
||||
out.writeNamedTag("TerrainPopulated", (byte) 1);
|
||||
if (entities.isEmpty()) {
|
||||
out.writeNamedEmptyList("Entities");
|
||||
} else {
|
||||
out.writeNamedTag("Entities", new ListTag(CompoundTag.class, new ArrayList<>(entities.values())));
|
||||
}
|
||||
if (tiles.isEmpty()) {
|
||||
out.writeNamedEmptyList("TileEntities");
|
||||
} else {
|
||||
out.writeNamedTag("TileEntities", new ListTag(CompoundTag.class,
|
||||
new ArrayList<>(tiles.values())));
|
||||
}
|
||||
out.writeNamedTag("InhabitedTime", inhabitedTime);
|
||||
out.writeNamedTag("LastUpdate", lastUpdate);
|
||||
if (biomes != null) {
|
||||
out.writeNamedTag("Biomes", biomes);
|
||||
}
|
||||
out.writeNamedTag("HeightMap", heightMap);
|
||||
out.writeNamedTagName("Sections", NBTConstants.TYPE_LIST);
|
||||
nbtOut.getOutputStream().writeByte(NBTConstants.TYPE_COMPOUND);
|
||||
int len = 0;
|
||||
for (int[] id : ids) {
|
||||
if (id != null) len++;
|
||||
}
|
||||
nbtOut.getOutputStream().writeInt(len);
|
||||
for (int layer = 0; layer < ids.length; layer++) {
|
||||
int[] idLayer = ids[layer];
|
||||
if (idLayer == null) {
|
||||
continue;
|
||||
}
|
||||
out.writeNamedTag("Y", (byte) layer);
|
||||
out.writeNamedTag("BlockLight", blockLight[layer]);
|
||||
out.writeNamedTag("SkyLight", skyLight[layer]);
|
||||
out.writeNamedTag("Blocks", idLayer);
|
||||
out.writeEndTag();
|
||||
}
|
||||
});
|
||||
nbtOut.writeEndTag();
|
||||
}
|
||||
|
||||
public byte[] toBytes(byte[] buffer) throws IOException {
|
||||
if (buffer == null) {
|
||||
buffer = new byte[8192];
|
||||
}
|
||||
FastByteArrayOutputStream buffered = new FastByteArrayOutputStream(buffer);
|
||||
try (NBTOutputStream nbtOut = new NBTOutputStream(buffered)) {
|
||||
write(nbtOut);
|
||||
}
|
||||
return buffered.toByteArray();
|
||||
}
|
||||
|
||||
public long getInhabitedTime() {
|
||||
return inhabitedTime;
|
||||
}
|
||||
|
||||
public long getLastUpdate() {
|
||||
return lastUpdate;
|
||||
}
|
||||
|
||||
public void setInhabitedTime(long inhabitedTime) {
|
||||
this.inhabitedTime = inhabitedTime;
|
||||
}
|
||||
|
||||
public void setLastUpdate(long lastUpdate) {
|
||||
this.lastUpdate = lastUpdate;
|
||||
}
|
||||
|
||||
public void copyFrom(MCAChunk other, int minX, int maxX, int minY, int maxY, int minZ, int maxZ, int offsetX, int offsetY, int offsetZ) {
|
||||
minY = Math.max(-offsetY - minY, minY);
|
||||
maxY = Math.min(255 - offsetY, maxY);
|
||||
minZ = Math.max(-offsetZ - minZ, minZ);
|
||||
maxZ = Math.min(15 - offsetZ, maxZ);
|
||||
minX = Math.max(-offsetX - minX, minX);
|
||||
maxX = Math.min(15 - offsetX, maxX);
|
||||
if (minX > maxX || minZ > maxZ || minY > maxY) return;
|
||||
int startLayer = minY >> 4;
|
||||
int endLayer = maxY >> 4;
|
||||
for (int otherY = minY, thisY = minY + offsetY; otherY <= maxY; otherY++, thisY++) {
|
||||
int thisLayer = thisY >> 4;
|
||||
int otherLayer = otherY >> 4;
|
||||
int[] thisIds = ids[thisLayer];
|
||||
int[] otherIds = other.ids[otherLayer];
|
||||
if (otherIds == null) {
|
||||
if (thisIds != null) {
|
||||
int indexY = (thisY & 15) << 8;
|
||||
byte[] thisSkyLight = skyLight[thisLayer];
|
||||
byte[] thisBlockLight = blockLight[thisLayer];
|
||||
for (int otherZ = minZ, thisZ = minZ + offsetZ; otherZ <= maxZ; otherZ++, thisZ++) {
|
||||
int startIndex = indexY + (thisZ << 4) + minX + offsetX;
|
||||
int endIndex = startIndex + maxX - minX;
|
||||
Arrays.fill(thisIds, startIndex, endIndex + 1, 0);
|
||||
int startIndexShift = startIndex >> 1;
|
||||
int endIndexShift = endIndex >> 1;
|
||||
if ((startIndex & 1) != 0) {
|
||||
startIndexShift++;
|
||||
setNibble(startIndex, thisSkyLight, (byte) 0);
|
||||
setNibble(startIndex, thisBlockLight, (byte) 0);
|
||||
}
|
||||
if ((endIndex & 1) != 1) {
|
||||
endIndexShift--;
|
||||
setNibble(endIndex, thisSkyLight, (byte) 0);
|
||||
setNibble(endIndex, thisBlockLight, (byte) 0);
|
||||
}
|
||||
Arrays.fill(thisSkyLight, startIndexShift, endIndexShift + 1, (byte) 0);
|
||||
Arrays.fill(thisBlockLight, startIndexShift, endIndexShift + 1, (byte) 0);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
} else if (thisIds == null) {
|
||||
ids[thisLayer] = thisIds = new int[4096];
|
||||
skyLight[thisLayer] = new byte[2048];
|
||||
blockLight[thisLayer] = new byte[2048];
|
||||
}
|
||||
int indexY = (thisY & 15) << 8;
|
||||
int otherIndexY = (otherY & 15) << 8;
|
||||
byte[] thisSkyLight = skyLight[thisLayer];
|
||||
byte[] thisBlockLight = blockLight[thisLayer];
|
||||
byte[] otherSkyLight = other.skyLight[otherLayer];
|
||||
byte[] otherBlockLight = other.blockLight[otherLayer];
|
||||
for (int otherZ = minZ, thisZ = minZ + offsetZ; otherZ <= maxZ; otherZ++, thisZ++) {
|
||||
int startIndex = indexY + (thisZ << 4) + minX + offsetX;
|
||||
int endIndex = startIndex + maxX - minX;
|
||||
int otherStartIndex = otherIndexY + (otherZ << 4) + minX;
|
||||
int otherEndIndex = otherStartIndex + maxX - minX;
|
||||
System.arraycopy(otherIds, otherStartIndex, thisIds, startIndex, endIndex - startIndex + 1);
|
||||
if ((startIndex & 1) == (otherStartIndex & 1)) {
|
||||
int startIndexShift = startIndex >> 1;
|
||||
int endIndexShift = endIndex >> 1;
|
||||
int otherStartIndexShift = otherStartIndex >> 1;
|
||||
if ((startIndex & 1) != 0) {
|
||||
startIndexShift++;
|
||||
otherStartIndexShift++;
|
||||
setNibble(startIndex, thisSkyLight, getNibble(otherStartIndex, otherSkyLight));
|
||||
setNibble(startIndex, thisBlockLight, getNibble(otherStartIndex, otherBlockLight));
|
||||
}
|
||||
if ((endIndex & 1) != 1) {
|
||||
endIndexShift--;
|
||||
setNibble(endIndex, thisSkyLight, getNibble(otherEndIndex, otherSkyLight));
|
||||
setNibble(endIndex, thisBlockLight, getNibble(otherEndIndex, otherBlockLight));
|
||||
}
|
||||
System.arraycopy(otherSkyLight, otherStartIndexShift, thisSkyLight, startIndexShift, endIndexShift - startIndexShift + 1);
|
||||
System.arraycopy(otherBlockLight, otherStartIndexShift, thisBlockLight, startIndexShift, endIndexShift - startIndexShift + 1);
|
||||
} else {
|
||||
for (int thisIndex = startIndex, otherIndex = otherStartIndex; thisIndex <= endIndex; thisIndex++, otherIndex++) {
|
||||
setNibble(thisIndex, thisSkyLight, getNibble(otherIndex, otherSkyLight));
|
||||
setNibble(thisIndex, thisBlockLight, getNibble(otherIndex, otherBlockLight));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!other.tiles.isEmpty()) {
|
||||
for (Map.Entry<Short, CompoundTag> entry : other.tiles.entrySet()) {
|
||||
int key = entry.getKey();
|
||||
int x = MathMan.untripleBlockCoordX(key);
|
||||
int y = MathMan.untripleBlockCoordY(key);
|
||||
int z = MathMan.untripleBlockCoordZ(key);
|
||||
if (x < minX || x > maxX) continue;
|
||||
if (z < minZ || z > maxZ) continue;
|
||||
if (y < minY || y > maxY) continue;
|
||||
x += offsetX;
|
||||
y += offsetY;
|
||||
z += offsetZ;
|
||||
short pair = MathMan.tripleBlockCoord(x, y, z);
|
||||
CompoundTag tag = entry.getValue();
|
||||
Map<String, Tag> map = ReflectionUtils.getMap(tag.getValue());
|
||||
map.put("x", new IntTag((x & 15) + (getX() << 4)));
|
||||
map.put("y", new IntTag(y));
|
||||
map.put("z", new IntTag((z & 15) + (getZ() << 4)));
|
||||
tiles.put(pair, tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void copyFrom(MCAChunk other, int minY, int maxY, int offsetY) {
|
||||
minY = Math.max(-offsetY - minY, minY);
|
||||
maxY = Math.min(255 - offsetY, maxY);
|
||||
if (minY > maxY) return;
|
||||
if ((offsetY & 15) == 0) {
|
||||
int offsetLayer = offsetY >> 4;
|
||||
int startLayer = minY >> 4;
|
||||
int endLayer = maxY >> 4;
|
||||
for (int thisLayer = startLayer + offsetLayer, otherLayer = startLayer; thisLayer <= endLayer; thisLayer++, otherLayer++) {
|
||||
int[] otherIds = other.ids[otherLayer];
|
||||
int[] currentIds = ids[thisLayer];
|
||||
int by = otherLayer << 4;
|
||||
int ty = by + 15;
|
||||
if (by >= minY && ty <= maxY) {
|
||||
if (otherIds != null) {
|
||||
ids[thisLayer] = otherIds;
|
||||
skyLight[thisLayer] = other.skyLight[otherLayer];
|
||||
blockLight[thisLayer] = other.blockLight[otherLayer];
|
||||
} else {
|
||||
ids[thisLayer] = null;
|
||||
}
|
||||
} else {
|
||||
by = Math.max(by, minY) & 15;
|
||||
ty = Math.min(ty, maxY) & 15;
|
||||
int indexStart = by << 8;
|
||||
int indexEnd = 256 + (ty << 8);
|
||||
int indexStartShift = indexStart >> 1;
|
||||
int indexEndShift = indexEnd >> 1;
|
||||
if (otherIds == null) {
|
||||
if (currentIds != null) {
|
||||
Arrays.fill(currentIds, indexStart, indexEnd, 0);
|
||||
Arrays.fill(skyLight[thisLayer], indexStartShift, indexEndShift, (byte) 0);
|
||||
Arrays.fill(blockLight[thisLayer], indexStartShift, indexEndShift, (byte) 0);
|
||||
}
|
||||
} else {
|
||||
if (currentIds == null) {
|
||||
currentIds = this.ids[thisLayer] = new int[4096];
|
||||
this.skyLight[thisLayer] = new byte[2048];
|
||||
this.blockLight[thisLayer] = new byte[2048];
|
||||
}
|
||||
System.arraycopy(other.ids[otherLayer], indexStart, currentIds, indexStart, indexEnd - indexStart);
|
||||
System.arraycopy(other.skyLight[otherLayer], indexStartShift, skyLight[thisLayer], indexStartShift, indexEndShift - indexStartShift);
|
||||
System.arraycopy(other.blockLight[otherLayer], indexStartShift, blockLight[thisLayer], indexStartShift, indexEndShift - indexStartShift);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int otherY = minY, thisY = minY + offsetY; otherY <= maxY; otherY++, thisY++) {
|
||||
int otherLayer = otherY >> 4;
|
||||
int thisLayer = thisY >> 4;
|
||||
int[] thisIds = this.ids[thisLayer];
|
||||
int[] otherIds = other.ids[otherLayer];
|
||||
int thisStartIndex = (thisY & 15) << 8;
|
||||
int thisStartIndexShift = thisStartIndex >> 1;
|
||||
if (otherIds == null) {
|
||||
if (thisIds == null) {
|
||||
continue;
|
||||
}
|
||||
Arrays.fill(thisIds, thisStartIndex, thisStartIndex + 256, 0);
|
||||
Arrays.fill(this.skyLight[thisLayer], thisStartIndexShift, thisStartIndexShift + 128, (byte) 0);
|
||||
Arrays.fill(this.blockLight[thisLayer], thisStartIndexShift, thisStartIndexShift + 128, (byte) 0);
|
||||
continue;
|
||||
} else if (thisIds == null) {
|
||||
ids[thisLayer] = thisIds = new int[4096];
|
||||
skyLight[thisLayer] = new byte[2048];
|
||||
blockLight[thisLayer] = new byte[2048];
|
||||
}
|
||||
int otherStartIndex = (otherY & 15) << 8;
|
||||
int otherStartIndexShift = otherStartIndex >> 1;
|
||||
System.arraycopy(other.ids[otherLayer], otherStartIndex, thisIds, thisStartIndex, 256);
|
||||
System.arraycopy(other.skyLight[otherLayer], otherStartIndexShift, skyLight[thisLayer], thisStartIndexShift, 128);
|
||||
System.arraycopy(other.blockLight[otherLayer], otherStartIndexShift, blockLight[thisLayer], thisStartIndexShift, 128);
|
||||
}
|
||||
}
|
||||
// Copy nbt
|
||||
int thisMinY = minY + offsetY;
|
||||
int thisMaxY = maxY + offsetY;
|
||||
if (!tiles.isEmpty()) {
|
||||
Iterator<Map.Entry<Short, CompoundTag>> iter = tiles.entrySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
int y = MathMan.untripleBlockCoordY(iter.next().getKey());
|
||||
if (y >= thisMinY && y <= thisMaxY) iter.remove();
|
||||
}
|
||||
}
|
||||
if (!other.tiles.isEmpty()) {
|
||||
for (Map.Entry<Short, CompoundTag> entry : other.tiles.entrySet()) {
|
||||
int key = entry.getKey();
|
||||
int y = MathMan.untripleBlockCoordY(key);
|
||||
if (y >= minY && y <= maxY) {
|
||||
tiles.put((short) (key + offsetY), entry.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!other.entities.isEmpty()) {
|
||||
for (Map.Entry<UUID, CompoundTag> entry : other.entities.entrySet()) {
|
||||
// TODO FIXME
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int getMinLayer() {
|
||||
for (int layer = 0; layer < ids.length; layer++) {
|
||||
if (ids[layer] != null) {
|
||||
return layer;
|
||||
}
|
||||
}
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
public int getMaxLayer() {
|
||||
for (int layer = ids.length - 1; layer >= 0; layer--) {
|
||||
if (ids[layer] != null) {
|
||||
return layer;
|
||||
}
|
||||
}
|
||||
return Integer.MIN_VALUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deprecated, use the toBytes method
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
public CompoundTag toTag() {
|
||||
if (deleted) {
|
||||
return null;
|
||||
}
|
||||
// e.g. by precalculating the length
|
||||
HashMap<String, Object> level = new HashMap<>();
|
||||
level.put("Entities", new ListTag(CompoundTag.class, new ArrayList<>(entities.values())));
|
||||
level.put("TileEntities", new ListTag(CompoundTag.class, new ArrayList<>(tiles.values())));
|
||||
level.put("InhabitedTime", inhabitedTime);
|
||||
level.put("LastUpdate", lastUpdate);
|
||||
level.put("LightPopulated", (byte) 0);
|
||||
level.put("TerrainPopulated", (byte) 1);
|
||||
level.put("V", (byte) 1);
|
||||
level.put("xPos", getX());
|
||||
level.put("zPos", getZ());
|
||||
if (biomes != null) {
|
||||
level.put("Biomes", biomes);
|
||||
}
|
||||
level.put("HeightMap", heightMap);
|
||||
ArrayList<HashMap<String, Object>> sections = new ArrayList<>();
|
||||
for (int layer = 0; layer < ids.length; layer++) {
|
||||
int[] idLayer = ids[layer];
|
||||
if (idLayer == null) {
|
||||
continue;
|
||||
}
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
map.put("Y", (byte) layer);
|
||||
map.put("BlockLight", blockLight[layer]);
|
||||
map.put("SkyLight", skyLight[layer]);
|
||||
map.put("Blocks", idLayer);
|
||||
sections.add(map);
|
||||
}
|
||||
level.put("Sections", sections);
|
||||
HashMap<String, Object> root = new HashMap<>();
|
||||
root.put("Level", level);
|
||||
return FaweCache.asTag(root);
|
||||
}
|
||||
|
||||
public MCAChunk(NBTInputStream nis, FaweQueue parent, int x, int z, boolean readPos) throws IOException {
|
||||
super(parent, x, z);
|
||||
ids = new int[16][];
|
||||
skyLight = new byte[16][];
|
||||
blockLight = new byte[16][];
|
||||
NBTStreamer streamer = new NBTStreamer(nis);
|
||||
streamer.addReader(".Level.InhabitedTime",
|
||||
(BiConsumer<Integer, Long>) (index, value) -> inhabitedTime = value);
|
||||
streamer.addReader(".Level.LastUpdate",
|
||||
(BiConsumer<Integer, Long>) (index, value) -> lastUpdate = value);
|
||||
streamer.addReader(".Level.Sections.#", (BiConsumer<Integer, CompoundTag>) (index, tag) -> {
|
||||
int layer = tag.getByte("Y");
|
||||
ids[layer] = tag.getIntArray("Blocks");
|
||||
skyLight[layer] = tag.getByteArray("SkyLight");
|
||||
blockLight[layer] = tag.getByteArray("BlockLight");
|
||||
});
|
||||
streamer.addReader(".Level.TileEntities.#",
|
||||
(BiConsumer<Integer, CompoundTag>) (index, tile) -> {
|
||||
int x1 = tile.getInt("x") & 15;
|
||||
int y = tile.getInt("y");
|
||||
int z1 = tile.getInt("z") & 15;
|
||||
short pair = MathMan.tripleBlockCoord(x1, y, z1);
|
||||
tiles.put(pair, tile);
|
||||
});
|
||||
streamer.addReader(".Level.Entities.#",
|
||||
(BiConsumer<Integer, CompoundTag>) (index, entityTag) -> {
|
||||
if (entities == null) {
|
||||
entities = new HashMap<>();
|
||||
}
|
||||
long least = entityTag.getLong("UUIDLeast");
|
||||
long most = entityTag.getLong("UUIDMost");
|
||||
entities.put(new UUID(most, least), entityTag);
|
||||
});
|
||||
streamer.addReader(".Level.Biomes",
|
||||
(BiConsumer<Integer, byte[]>) (index, value) -> biomes = value);
|
||||
streamer.addReader(".Level.HeightMap",
|
||||
(BiConsumer<Integer, int[]>) (index, value) -> heightMap = value);
|
||||
if (readPos) {
|
||||
streamer.addReader(".Level.xPos",
|
||||
(BiConsumer<Integer, Integer>) (index, value) -> MCAChunk.this.setLoc(getParent(), value, getZ()));
|
||||
streamer.addReader(".Level.zPos",
|
||||
(BiConsumer<Integer, Integer>) (index, value) -> MCAChunk.this.setLoc(getParent(), getX(), value));
|
||||
}
|
||||
streamer.readFully();
|
||||
}
|
||||
|
||||
public long filterBlocks(MutableMCABackedBaseBlock mutableBlock, MCAFilter filter) {
|
||||
MutableLong result = new MutableLong();
|
||||
mutableBlock.setChunk(this);
|
||||
int bx = getX() << 4;
|
||||
int bz = getZ() << 4;
|
||||
int tx = bx + 15;
|
||||
int tz = bz + 15;
|
||||
for (int layer = 0; layer < ids.length; layer++) {
|
||||
if (doesSectionExist(layer)) {
|
||||
mutableBlock.setArrays(layer);
|
||||
int yStart = layer << 4;
|
||||
int yEnd = yStart + 15;
|
||||
for (int y = yStart, y0 = (yStart & 15); y <= yEnd; y++, y0++) {
|
||||
int yIndex = ((y0) << 8);
|
||||
mutableBlock.setY(y);
|
||||
for (int z = bz, z0 = bz & 15; z <= tz; z++, z0++) {
|
||||
int zIndex = yIndex + ((z0) << 4);
|
||||
mutableBlock.setZ(z);
|
||||
for (int x = bx, x0 = bx & 15; x <= tx; x++, x0++) {
|
||||
int xIndex = zIndex + x0;
|
||||
mutableBlock.setX(x);
|
||||
mutableBlock.setIndex(xIndex);
|
||||
filter.applyBlock(x, y, z, mutableBlock, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result.get();
|
||||
}
|
||||
|
||||
public int[] getHeightMapArray() {
|
||||
return heightMap;
|
||||
}
|
||||
|
||||
public void setDeleted(boolean deleted) {
|
||||
setModified();
|
||||
this.deleted = deleted;
|
||||
}
|
||||
|
||||
public boolean isDeleted() {
|
||||
return deleted;
|
||||
}
|
||||
|
||||
public boolean isModified() {
|
||||
return modified != 0;
|
||||
}
|
||||
|
||||
public int getModified() {
|
||||
return modified;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public final void setModified() {
|
||||
this.modified++;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBitMask() {
|
||||
int bitMask = 0;
|
||||
for (int section = 0; section < ids.length; section++) {
|
||||
if (ids[section] != null) {
|
||||
bitMask += 1 << section;
|
||||
}
|
||||
}
|
||||
return bitMask;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTile(int x, int y, int z, CompoundTag tile) {
|
||||
setModified();
|
||||
short pair = MathMan.tripleBlockCoord(x, y, z);
|
||||
if (tile != null) {
|
||||
tiles.put(pair, tile);
|
||||
} else {
|
||||
tiles.remove(pair);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntity(CompoundTag entityTag) {
|
||||
setModified();
|
||||
long least = entityTag.getLong("UUIDLeast");
|
||||
long most = entityTag.getLong("UUIDMost");
|
||||
entities.put(new UUID(most, least), entityTag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiome(int x, int z, BiomeType biome) {
|
||||
setModified();
|
||||
biomes[x + (z << 4)] = (byte) biome.getInternalId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<CompoundTag> getEntities() {
|
||||
return new HashSet<>(entities.values());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Short, CompoundTag> getTiles() {
|
||||
return tiles == null ? new HashMap<>() : tiles;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompoundTag getTile(int x, int y, int z) {
|
||||
if (tiles == null || tiles.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
short pair = MathMan.tripleBlockCoord(x, y, z);
|
||||
return tiles.get(pair);
|
||||
}
|
||||
|
||||
public boolean doesSectionExist(int cy) {
|
||||
return ids[cy] != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk<Void> copy(boolean shallow) {
|
||||
return new MCAChunk(this, shallow);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBlockCombinedId(int x, int y, int z) {
|
||||
int layer = y >> 4;
|
||||
int[] idLayer = ids[layer];
|
||||
if (idLayer == null) {
|
||||
return 0;
|
||||
}
|
||||
return idLayer[(((y & 15) << 8) | ((z & 15) << 4) | (x & 15))];
|
||||
}
|
||||
|
||||
@Override
|
||||
public BiomeType[] getBiomeArray() {
|
||||
BiomeType[] arr = new BiomeType[256];
|
||||
for (int i = 0; i < arr.length; i++) {
|
||||
arr[i] = BiomeTypes.get(biomes[i]);
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BiomeType getBiomeType(int x, int z) {
|
||||
return BiomeTypes.get(biomes[(x & 15) + ((z & 15) << 4)]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<UUID> getEntityRemoves() {
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
public void setSkyLight(int x, int y, int z, int value) {
|
||||
setModified();
|
||||
int layer = y >> 4;
|
||||
byte[] skyLayer = skyLight[layer];
|
||||
if (skyLayer == null) {
|
||||
return;
|
||||
}
|
||||
setNibble((((y & 15) << 8) | ((z & 15) << 4) | (x & 15)), skyLayer, value);
|
||||
}
|
||||
|
||||
public void setBlockLight(int x, int y, int z, int value) {
|
||||
setModified();
|
||||
int layer = y >> 4;
|
||||
byte[] blockLayer = blockLight[layer];
|
||||
if (blockLayer == null) {
|
||||
return;
|
||||
}
|
||||
setNibble((((y & 15) << 8) | ((z & 15) << 4) | (x & 15)), blockLayer, value);
|
||||
}
|
||||
|
||||
public int getSkyLight(int x, int y, int z) {
|
||||
int layer = y >> 4;
|
||||
byte[] skyLayer = skyLight[layer];
|
||||
if (skyLayer == null) {
|
||||
return 0;
|
||||
}
|
||||
return getNibble((((y & 15) << 8) | ((z & 15) << 4) | (x & 15)), skyLayer);
|
||||
}
|
||||
|
||||
public int getBlockLight(int x, int y, int z) {
|
||||
int layer = y >> 4;
|
||||
byte[] blockLayer = blockLight[layer];
|
||||
if (blockLayer == null) {
|
||||
return 0;
|
||||
}
|
||||
return getNibble((((y & 15) << 8) | ((z & 15) << 4) | (x & 15)), blockLayer);
|
||||
}
|
||||
|
||||
public void setFullbright() {
|
||||
setModified();
|
||||
for (byte[] array : skyLight) {
|
||||
if (array != null) {
|
||||
Arrays.fill(array, (byte) 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void removeLight() {
|
||||
for (int i = 0; i < skyLight.length; i++) {
|
||||
removeLight(i);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeLight(int i) {
|
||||
byte[] array1 = skyLight[i];
|
||||
if (array1 == null) {
|
||||
return;
|
||||
}
|
||||
byte[] array2 = blockLight[i];
|
||||
Arrays.fill(array1, (byte) 0);
|
||||
Arrays.fill(array2, (byte) 0);
|
||||
}
|
||||
|
||||
public int getNibble(int index, byte[] array) {
|
||||
int indexShift = index >> 1;
|
||||
if ((index & 1) == 0) {
|
||||
return array[indexShift] & 15;
|
||||
} else {
|
||||
return array[indexShift] >> 4 & 15;
|
||||
}
|
||||
}
|
||||
|
||||
public void setNibble(int index, byte[] array, int value) {
|
||||
int indexShift = index >> 1;
|
||||
byte existing = array[indexShift];
|
||||
int valueShift = value << 4;
|
||||
if (existing == value + valueShift) {
|
||||
return;
|
||||
}
|
||||
if ((index & 1) == 0) {
|
||||
array[indexShift] = (byte) (existing & 240 | value);
|
||||
} else {
|
||||
array[indexShift] = (byte) (existing & 15 | valueShift);
|
||||
}
|
||||
}
|
||||
|
||||
public void setIdUnsafe(byte[] idsLayer, int index, byte id) {
|
||||
idsLayer[index] = id;
|
||||
}
|
||||
|
||||
public void setBlockUnsafe(byte[] idsLayer, byte[] dataLayer, int index, byte id, int data) {
|
||||
idsLayer[index] = id;
|
||||
setNibble(index, dataLayer, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBlock(int x, int y, int z, int combinedId) {
|
||||
setModified();
|
||||
int layer = y >> 4;
|
||||
int[] idsLayer = ids[layer];
|
||||
if (idsLayer == null) {
|
||||
idsLayer = this.ids[layer] = new int[4096];
|
||||
this.skyLight[layer] = new byte[2048];
|
||||
this.blockLight[layer] = new byte[2048];
|
||||
}
|
||||
idsLayer[(((y & 15) << 8) | ((z & 15) << 4) | (x & 15))] = combinedId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiome(BiomeType biome) {
|
||||
Arrays.fill(biomes, (byte) biome.getInternalId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeEntity(UUID uuid) {
|
||||
setModified();
|
||||
entities.remove(uuid);
|
||||
}
|
||||
|
||||
private final boolean idsEqual(int[] a, int[] b) {
|
||||
// Assumes both are null, or none are (idsEqual - 2d array)
|
||||
// Assumes length is 4096
|
||||
if (a == b) return true;
|
||||
for (char i = 0; i < 4096; i++) {
|
||||
if (a[i] != b[i]) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private final boolean idsEqual(int[][] a, int[][] b, boolean matchNullToAir) {
|
||||
// Assumes length is 16
|
||||
for (byte i = 0; i < 16; i++) {
|
||||
if ((a[i] == null) != (b[i] == null)) {
|
||||
if (matchNullToAir) {
|
||||
if (b[i] != null) {
|
||||
for (int c : b[i]) {
|
||||
if (c != 0) return false;
|
||||
}
|
||||
} else if (a[i] != null) {
|
||||
for (int c : a[i]) {
|
||||
if (c != 0) return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Check the chunks close to the ground first
|
||||
for (byte i = 4; i < 8; i++) {
|
||||
if (!idsEqual(a[i], b[i])) return false;
|
||||
}
|
||||
for (byte i = 3; i >= 0; i--) {
|
||||
if (!idsEqual(a[i], b[i])) return false;
|
||||
}
|
||||
for (byte i = 8; i < 16; i++) {
|
||||
if (!idsEqual(a[i], b[i])) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the ids match the ids in the other chunk
|
||||
* @param other
|
||||
* @param matchNullToAir
|
||||
* @return
|
||||
*/
|
||||
public boolean idsEqual(MCAChunk other, boolean matchNullToAir) {
|
||||
return idsEqual(other.ids, this.ids, matchNullToAir);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void getChunk() {
|
||||
throw new UnsupportedOperationException("Not applicable for this");
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk call() {
|
||||
throw new UnsupportedOperationException("Not supported");
|
||||
}
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
|
||||
public class MCAClipboard {
|
||||
private final MCAQueue queue;
|
||||
private final CuboidRegion region;
|
||||
private final BlockVector3 origin;
|
||||
|
||||
public MCAClipboard(MCAQueue queue, CuboidRegion region, BlockVector3 origin) {
|
||||
this.queue = queue;
|
||||
this.region = region;
|
||||
this.origin = origin;
|
||||
}
|
||||
|
||||
public MCAQueue getQueue() {
|
||||
return queue;
|
||||
}
|
||||
|
||||
public CuboidRegion getRegion() {
|
||||
return region;
|
||||
}
|
||||
|
||||
public BlockVector3 getOrigin() {
|
||||
return origin;
|
||||
}
|
||||
}
|
@ -1,678 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.jnbt.NBTStreamer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.RunnableVal;
|
||||
import com.boydti.fawe.object.RunnableVal4;
|
||||
import com.boydti.fawe.object.collection.IterableThreadLocal;
|
||||
import com.boydti.fawe.object.exception.FaweException;
|
||||
import com.boydti.fawe.object.io.BufferedRandomAccessFile;
|
||||
import com.boydti.fawe.object.io.FastByteArrayInputStream;
|
||||
import com.boydti.fawe.util.MainUtil;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.sk89q.jnbt.NBTInputStream;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.zip.Inflater;
|
||||
import java.util.zip.InflaterInputStream;
|
||||
|
||||
/**
|
||||
* Chunk format: http://minecraft.gamepedia.com/Chunk_format#Entity_format
|
||||
* e.g.: `.Level.Entities.#` (Starts with a . as the root tag is unnamed)
|
||||
*/
|
||||
public class MCAFile {
|
||||
|
||||
private static Field fieldBuf2;
|
||||
private static Field fieldBuf3;
|
||||
|
||||
static {
|
||||
try {
|
||||
fieldBuf2 = InflaterInputStream.class.getDeclaredField("buf");
|
||||
fieldBuf2.setAccessible(true);
|
||||
fieldBuf3 = NBTInputStream.class.getDeclaredField("buf");
|
||||
fieldBuf3.setAccessible(true);
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private final FaweQueue queue;
|
||||
private final File file;
|
||||
private RandomAccessFile raf;
|
||||
private byte[] locations;
|
||||
private boolean deleted;
|
||||
private final int X, Z;
|
||||
private final Int2ObjectOpenHashMap<MCAChunk> chunks = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
final ThreadLocal<byte[]> byteStore1 = new ThreadLocal<byte[]>() {
|
||||
@Override
|
||||
protected byte[] initialValue() {
|
||||
return new byte[4096];
|
||||
}
|
||||
};
|
||||
final ThreadLocal<byte[]> byteStore2 = new ThreadLocal<byte[]>() {
|
||||
@Override
|
||||
protected byte[] initialValue() {
|
||||
return new byte[4096];
|
||||
}
|
||||
};
|
||||
final ThreadLocal<byte[]> byteStore3 = new ThreadLocal<byte[]>() {
|
||||
@Override
|
||||
protected byte[] initialValue() {
|
||||
return new byte[1024];
|
||||
}
|
||||
};
|
||||
|
||||
public MCAFile(FaweQueue parent, File file) {
|
||||
this.queue = parent;
|
||||
this.file = file;
|
||||
if (!file.exists()) {
|
||||
throw FaweException.CHUNK;
|
||||
}
|
||||
String[] split = file.getName().split("\\.");
|
||||
X = Integer.parseInt(split[1]);
|
||||
Z = Integer.parseInt(split[2]);
|
||||
}
|
||||
|
||||
public MCAFile(FaweQueue parent, int mcrX, int mcrZ) throws Exception {
|
||||
this(parent, mcrX, mcrZ, new File(parent.getSaveFolder(), "r." + mcrX + "." + mcrZ + ".mca"));
|
||||
}
|
||||
|
||||
public MCAFile(FaweQueue parent, int mcrX, int mcrZ, File file) {
|
||||
this.queue = parent;
|
||||
this.file = file;
|
||||
X = mcrX;
|
||||
Z = mcrZ;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
if (raf != null) {
|
||||
try {
|
||||
raf.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
synchronized (chunks) {
|
||||
chunks.clear();
|
||||
}
|
||||
locations = null;
|
||||
IterableThreadLocal.clean(byteStore1);
|
||||
IterableThreadLocal.clean(byteStore2);
|
||||
IterableThreadLocal.clean(byteStore3);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void finalize() throws Throwable {
|
||||
IterableThreadLocal.clean(byteStore1);
|
||||
IterableThreadLocal.clean(byteStore2);
|
||||
IterableThreadLocal.clean(byteStore3);
|
||||
super.finalize();
|
||||
}
|
||||
|
||||
public void setDeleted(boolean deleted) {
|
||||
this.deleted = deleted;
|
||||
}
|
||||
|
||||
public boolean isDeleted() {
|
||||
return deleted;
|
||||
}
|
||||
|
||||
public FaweQueue getParent() {
|
||||
return queue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the location header from disk
|
||||
*/
|
||||
public void init() {
|
||||
try {
|
||||
if (raf == null) {
|
||||
this.locations = new byte[4096];
|
||||
if (file != null) {
|
||||
this.raf = new RandomAccessFile(file, "rw");
|
||||
if (raf.length() < 8192) {
|
||||
raf.setLength(8192);
|
||||
} else {
|
||||
raf.seek(0);
|
||||
raf.readFully(locations);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public int getX() {
|
||||
return X;
|
||||
}
|
||||
|
||||
public int getZ() {
|
||||
return Z;
|
||||
}
|
||||
|
||||
public RandomAccessFile getRandomAccessFile() {
|
||||
return raf;
|
||||
}
|
||||
|
||||
public File getFile() {
|
||||
return file;
|
||||
}
|
||||
|
||||
public MCAChunk getCachedChunk(int cx, int cz) {
|
||||
int pair = MathMan.pair((short) (cx & 31), (short) (cz & 31));
|
||||
synchronized (chunks) {
|
||||
return chunks.get(pair);
|
||||
}
|
||||
}
|
||||
|
||||
public void setChunk(MCAChunk chunk) {
|
||||
int cx = chunk.getX();
|
||||
int cz = chunk.getZ();
|
||||
int pair = MathMan.pair((short) (cx & 31), (short) (cz & 31));
|
||||
synchronized (chunks) {
|
||||
chunks.put(pair, chunk);
|
||||
}
|
||||
}
|
||||
|
||||
public MCAChunk getChunk(int cx, int cz) throws IOException {
|
||||
MCAChunk cached = getCachedChunk(cx, cz);
|
||||
if (cached != null) {
|
||||
return cached;
|
||||
} else {
|
||||
return readChunk(cx, cz);
|
||||
}
|
||||
}
|
||||
|
||||
public MCAChunk readChunk(int cx, int cz) throws IOException {
|
||||
int i = ((cx & 31) << 2) + ((cz & 31) << 7);
|
||||
int offset = (((locations[i] & 0xFF) << 16) + ((locations[i + 1] & 0xFF) << 8) + ((locations[i + 2] & 0xFF))) << 12;
|
||||
int size = (locations[i + 3] & 0xFF) << 12;
|
||||
if (offset == 0) {
|
||||
return null;
|
||||
}
|
||||
NBTInputStream nis = getChunkIS(offset);
|
||||
MCAChunk chunk = new MCAChunk(nis, queue, cx, cz, false);
|
||||
nis.close();
|
||||
int pair = MathMan.pair((short) (cx & 31), (short) (cz & 31));
|
||||
synchronized (chunks) {
|
||||
chunks.put(pair, chunk);
|
||||
}
|
||||
return chunk;
|
||||
}
|
||||
|
||||
/**
|
||||
* CX, CZ, OFFSET, SIZE
|
||||
*
|
||||
* @param onEach
|
||||
* @throws IOException
|
||||
*/
|
||||
public void forEachSortedChunk(RunnableVal4<Integer, Integer, Integer, Integer> onEach) throws IOException {
|
||||
char[] offsets = new char[(int) (raf.length() / 4096) - 2];
|
||||
Arrays.fill(offsets, Character.MAX_VALUE);
|
||||
char i = 0;
|
||||
for (int z = 0; z < 32; z++) {
|
||||
for (int x = 0; x < 32; x++, i += 4) {
|
||||
int offset = (((locations[i] & 0xFF) << 16) + ((locations[i + 1] & 0xFF) << 8) + ((locations[i + 2] & 0xFF))) - 2;
|
||||
int size = locations[i + 3] & 0xFF;
|
||||
if (size != 0) {
|
||||
if (offset < offsets.length) {
|
||||
offsets[offset] = i;
|
||||
} else {
|
||||
Fawe.debug("Ignoring invalid offset " + offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i = 0; i < offsets.length; i++) {
|
||||
int index = offsets[i];
|
||||
if (index != Character.MAX_VALUE) {
|
||||
int offset = i + 2;
|
||||
int size = locations[index + 3] & 0xFF;
|
||||
int index2 = index >> 2;
|
||||
int x = (index2) & 31;
|
||||
int z = (index2) >> 5;
|
||||
onEach.run(x, z, offset << 12, size << 12);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param onEach cx, cz, offset, size
|
||||
*/
|
||||
public void forEachChunk(RunnableVal4<Integer, Integer, Integer, Integer> onEach) {
|
||||
int i = 0;
|
||||
for (int z = 0; z < 32; z++) {
|
||||
for (int x = 0; x < 32; x++, i += 4) {
|
||||
int offset = (((locations[i] & 0xFF) << 16) + ((locations[i + 1] & 0xFF) << 8) + ((locations[i + 2] & 0xFF)));
|
||||
int size = locations[i + 3] & 0xFF;
|
||||
if (size != 0) {
|
||||
onEach.run(x, z, offset << 12, size << 12);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void forEachChunk(RunnableVal<MCAChunk> onEach) {
|
||||
int i = 0;
|
||||
for (int z = 0; z < 32; z++) {
|
||||
for (int x = 0; x < 32; x++, i += 4) {
|
||||
int offset = (((locations[i] & 0xFF) << 16) + ((locations[i + 1] & 0xFF) << 8) + ((locations[i + 2] & 0xFF)));
|
||||
int size = locations[i + 3] & 0xFF;
|
||||
if (size != 0) {
|
||||
try {
|
||||
onEach.run(getChunk(x, z));
|
||||
} catch (Throwable ignore) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int getOffset(int cx, int cz) {
|
||||
int i = ((cx & 31) << 2) + ((cz & 31) << 7);
|
||||
int offset = (((locations[i] & 0xFF) << 16) + ((locations[i + 1] & 0xFF) << 8) + ((locations[i + 2] & 0xFF)));
|
||||
return offset << 12;
|
||||
}
|
||||
|
||||
public int getSize(int cx, int cz) {
|
||||
int i = ((cx & 31) << 2) + ((cz & 31) << 7);
|
||||
return (locations[i + 3] & 0xFF) << 12;
|
||||
}
|
||||
|
||||
public List<Integer> getChunks() {
|
||||
final List<Integer> values;
|
||||
synchronized (chunks) {
|
||||
values = new ArrayList<>(chunks.size());
|
||||
}
|
||||
for (int i = 0; i < locations.length; i += 4) {
|
||||
int offset = (((locations[i] & 0xFF) << 16) + ((locations[i + 1] & 0xFF) << 8) + ((locations[i + 2] & 0xFF)));
|
||||
values.add(offset);
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
public byte[] getChunkCompressedBytes(int offset) throws IOException {
|
||||
if (offset == 0) {
|
||||
return null;
|
||||
}
|
||||
synchronized (raf) {
|
||||
raf.seek(offset);
|
||||
int size = raf.readInt();
|
||||
int compression = raf.read();
|
||||
byte[] data = new byte[size];
|
||||
raf.readFully(data);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
private NBTInputStream getChunkIS(int offset) throws IOException {
|
||||
try {
|
||||
byte[] data = getChunkCompressedBytes(offset);
|
||||
FastByteArrayInputStream bais = new FastByteArrayInputStream(data);
|
||||
InflaterInputStream iis = new InflaterInputStream(bais, new Inflater(), 1);
|
||||
fieldBuf2.set(iis, byteStore2.get());
|
||||
BufferedInputStream bis = new BufferedInputStream(iis);
|
||||
NBTInputStream nis = new NBTInputStream(bis);
|
||||
fieldBuf3.set(nis, byteStore3.get());
|
||||
return nis;
|
||||
} catch (IllegalAccessException unlikely) {
|
||||
unlikely.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void streamChunk(int cx, int cz, RunnableVal<NBTStreamer> addReaders) throws IOException {
|
||||
streamChunk(getOffset(cx, cz), addReaders);
|
||||
}
|
||||
|
||||
public void streamChunk(int offset, RunnableVal<NBTStreamer> withStream) throws IOException {
|
||||
byte[] data = getChunkCompressedBytes(offset);
|
||||
streamChunk(data, withStream);
|
||||
}
|
||||
|
||||
public void streamChunk(byte[] data, RunnableVal<NBTStreamer> withStream) throws IOException {
|
||||
if (data != null) {
|
||||
try {
|
||||
FastByteArrayInputStream nbtIn = new FastByteArrayInputStream(data);
|
||||
FastByteArrayInputStream bais = new FastByteArrayInputStream(data);
|
||||
InflaterInputStream iis = new InflaterInputStream(bais, new Inflater(), 1);
|
||||
fieldBuf2.set(iis, byteStore2.get());
|
||||
BufferedInputStream bis = new BufferedInputStream(iis);
|
||||
NBTInputStream nis = new NBTInputStream(bis);
|
||||
fieldBuf3.set(nis, byteStore3.get());
|
||||
NBTStreamer streamer = new NBTStreamer(nis);
|
||||
withStream.run(streamer);
|
||||
streamer.readQuick();
|
||||
} catch (IllegalAccessException unlikely) {
|
||||
unlikely.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param onEach chunk
|
||||
*/
|
||||
public void forEachCachedChunk(RunnableVal<MCAChunk> onEach) {
|
||||
synchronized (chunks) {
|
||||
for (Map.Entry<Integer, MCAChunk> entry : chunks.entrySet()) {
|
||||
onEach.run(entry.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<MCAChunk> getCachedChunks() {
|
||||
synchronized (chunks) {
|
||||
return new ArrayList<>(chunks.values());
|
||||
}
|
||||
}
|
||||
|
||||
public void uncache(int cx, int cz) {
|
||||
int pair = MathMan.pair((short) (cx & 31), (short) (cz & 31));
|
||||
synchronized (chunks) {
|
||||
chunks.remove(pair);
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] toBytes(MCAChunk chunk) throws Exception {
|
||||
if (chunk.isDeleted()) {
|
||||
return null;
|
||||
}
|
||||
byte[] uncompressed = chunk.toBytes(byteStore3.get());
|
||||
byte[] compressed = MainUtil.compress(uncompressed, byteStore2.get(), null);
|
||||
return compressed;
|
||||
}
|
||||
|
||||
private byte[] getChunkBytes(int cx, int cz) throws Exception {
|
||||
MCAChunk mca = getCachedChunk(cx, cz);
|
||||
if (mca == null) {
|
||||
int offset = getOffset(cx, cz);
|
||||
if (offset == 0) {
|
||||
return null;
|
||||
}
|
||||
return getChunkCompressedBytes(offset);
|
||||
}
|
||||
return toBytes(mca);
|
||||
}
|
||||
|
||||
|
||||
private void writeSafe(RandomAccessFile raf, int offset, byte[] data) throws IOException {
|
||||
int len = data.length + 5;
|
||||
raf.seek(offset);
|
||||
if (raf.length() - offset < len) {
|
||||
raf.setLength(((offset + len + 4095) / 4096) * 4096);
|
||||
}
|
||||
// Length of remaining data
|
||||
raf.writeInt(data.length + 1);
|
||||
// Compression type
|
||||
raf.write(2);
|
||||
raf.write(data);
|
||||
}
|
||||
|
||||
private void writeHeader(RandomAccessFile raf, int cx, int cz, int offsetMedium, int sizeByte, boolean writeTime) throws IOException {
|
||||
int i = ((cx & 31) << 2) + ((cz & 31) << 7);
|
||||
locations[i] = (byte) (offsetMedium >> 16);
|
||||
locations[i + 1] = (byte) (offsetMedium >> 8);
|
||||
locations[i + 2] = (byte) (offsetMedium);
|
||||
locations[i + 3] = (byte) sizeByte;
|
||||
raf.seek(i);
|
||||
raf.write((offsetMedium >> 16));
|
||||
raf.write((offsetMedium >> 8));
|
||||
raf.write((offsetMedium >> 0));
|
||||
raf.write(sizeByte);
|
||||
raf.seek(i + 4096);
|
||||
if (offsetMedium == 0 && sizeByte == 0) {
|
||||
raf.writeInt(0);
|
||||
} else {
|
||||
raf.writeInt((int) (System.currentTimeMillis() / 1000L));
|
||||
}
|
||||
}
|
||||
|
||||
public void close(ForkJoinPool pool) {
|
||||
if (raf == null) return;
|
||||
synchronized (raf) {
|
||||
if (raf != null) {
|
||||
flush(pool);
|
||||
try {
|
||||
raf.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
raf = null;
|
||||
locations = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isModified() {
|
||||
if (isDeleted()) {
|
||||
return true;
|
||||
}
|
||||
synchronized (chunks) {
|
||||
for (Int2ObjectMap.Entry<MCAChunk> entry : chunks.int2ObjectEntrySet()) {
|
||||
MCAChunk chunk = entry.getValue();
|
||||
if (chunk.isModified() || chunk.isDeleted()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the chunk to the file
|
||||
* @param pool
|
||||
*/
|
||||
public void flush(ForkJoinPool pool) {
|
||||
synchronized (raf) {
|
||||
// If the file is marked as deleted, nothing is written
|
||||
if (isDeleted()) {
|
||||
clear();
|
||||
file.delete();
|
||||
return;
|
||||
}
|
||||
|
||||
boolean wait; // If the flush method needs to wait for the pool
|
||||
if (pool == null) {
|
||||
wait = true;
|
||||
pool = new ForkJoinPool();
|
||||
} else wait = false;
|
||||
|
||||
// Chunks that need to be relocated
|
||||
Int2ObjectOpenHashMap<byte[]> relocate = new Int2ObjectOpenHashMap<>();
|
||||
// The position of each chunk
|
||||
final Int2ObjectOpenHashMap<Integer> offsetMap = new Int2ObjectOpenHashMap<>(); // Offset -> <byte cx, byte cz, short size>
|
||||
// The data of each modified chunk
|
||||
final Int2ObjectOpenHashMap<byte[]> compressedMap = new Int2ObjectOpenHashMap<>();
|
||||
// The data of each chunk that needs to be moved
|
||||
final Int2ObjectOpenHashMap<byte[]> append = new Int2ObjectOpenHashMap<>();
|
||||
boolean modified = false;
|
||||
// Get the current time for the chunk timestamp
|
||||
long now = System.currentTimeMillis();
|
||||
|
||||
// Load the chunks into the append or compressed map
|
||||
for (MCAChunk chunk : getCachedChunks()) {
|
||||
if (chunk.isModified() || chunk.isDeleted()) {
|
||||
modified = true;
|
||||
chunk.setLastUpdate(now);
|
||||
if (!chunk.isDeleted()) {
|
||||
pool.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
byte[] compressed = toBytes(chunk);
|
||||
int pair = MathMan.pair((short) (chunk.getX() & 31), (short) (chunk.getZ() & 31));
|
||||
Int2ObjectOpenHashMap map;
|
||||
if (getOffset(chunk.getX(), chunk.getZ()) == 0) {
|
||||
map = append;
|
||||
} else {
|
||||
map = compressedMap;
|
||||
}
|
||||
synchronized (map) {
|
||||
map.put(pair, compressed);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If any changes were detected
|
||||
if (modified) {
|
||||
file.setLastModified(now);
|
||||
|
||||
// Load the offset data into the offset map
|
||||
forEachChunk(new RunnableVal4<Integer, Integer, Integer, Integer>() {
|
||||
@Override
|
||||
public void run(Integer cx, Integer cz, Integer offset, Integer size) {
|
||||
short pair1 = MathMan.pairByte((byte) (cx & 31), (byte) (cz & 31));
|
||||
short pair2 = (short) (size >> 12);
|
||||
offsetMap.put((int) offset, (Integer) MathMan.pair(pair1, pair2));
|
||||
}
|
||||
});
|
||||
// Wait for previous tasks
|
||||
pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
|
||||
|
||||
int start = 8192;
|
||||
int written = start;
|
||||
int end = 8192;
|
||||
int nextOffset = 8192;
|
||||
try {
|
||||
for (int count = 0; count < offsetMap.size(); count++) {
|
||||
// Get the previous position of the next chunk
|
||||
Integer loc = offsetMap.get(nextOffset);
|
||||
while (loc == null) {
|
||||
nextOffset += 4096;
|
||||
loc = offsetMap.get(nextOffset);
|
||||
}
|
||||
int offset = nextOffset;
|
||||
|
||||
// Get the x/z from the paired location
|
||||
short cxz = MathMan.unpairX(loc);
|
||||
int cx = MathMan.unpairShortX(cxz);
|
||||
int cz = MathMan.unpairShortY(cxz);
|
||||
|
||||
// Get the size from the pair
|
||||
int size = MathMan.unpairY(loc) << 12;
|
||||
|
||||
nextOffset += size;
|
||||
end = Math.min(start + size, end);
|
||||
int pair = MathMan.pair((short) (cx & 31), (short) (cz & 31));
|
||||
byte[] newBytes = relocate.get(pair);
|
||||
|
||||
// newBytes is null if the chunk isn't modified or marked for moving
|
||||
if (newBytes == null) {
|
||||
MCAChunk cached = getCachedChunk(cx, cz);
|
||||
// If the previous offset marks the current write position (start) then we only write the header
|
||||
if (offset == start) {
|
||||
if (cached == null || !cached.isModified()) {
|
||||
writeHeader(raf, cx, cz, start >> 12, size >> 12, true);
|
||||
start += size;
|
||||
written = start + size;
|
||||
continue;
|
||||
} else {
|
||||
newBytes = compressedMap.get(pair);
|
||||
}
|
||||
} else {
|
||||
// The chunk needs to be moved, fetch the data if necessary
|
||||
newBytes = compressedMap.get(pair);
|
||||
if (newBytes == null) {
|
||||
if (cached == null || !cached.isDeleted()) {
|
||||
newBytes = getChunkCompressedBytes(getOffset(cx, cz));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (newBytes == null) {
|
||||
writeHeader(raf, cx, cz, 0, 0, false);
|
||||
continue;
|
||||
}
|
||||
|
||||
// The length to be written (compressed data + 5 byte chunk header)
|
||||
int len = newBytes.length + 5;
|
||||
int oldSize = (size + 4095) >> 12;
|
||||
int newSize = (len + 4095) >> 12;
|
||||
int nextOffset2 = end;
|
||||
|
||||
// If the current write position (start) + length of data to write (len) are longer than the position of the next chunk, we need to move the next chunks
|
||||
while (start + len > end) {
|
||||
Integer nextLoc = offsetMap.get(nextOffset2);
|
||||
if (nextLoc != null) {
|
||||
short nextCXZ = MathMan.unpairX(nextLoc);
|
||||
int nextCX = MathMan.unpairShortX(nextCXZ);
|
||||
int nextCZ = MathMan.unpairShortY(nextCXZ);
|
||||
MCAChunk cached = getCachedChunk(nextCX, nextCZ);
|
||||
if (cached == null || !cached.isModified()) {
|
||||
byte[] nextBytes = getChunkCompressedBytes(nextOffset2);
|
||||
relocate.put(MathMan.pair((short) (nextCX & 31), (short) (nextCZ & 31)), nextBytes);
|
||||
}
|
||||
int nextSize = MathMan.unpairY(nextLoc) << 12;
|
||||
end += nextSize;
|
||||
nextOffset2 += nextSize;
|
||||
} else {
|
||||
end += 4096;
|
||||
nextOffset2 += 4096;
|
||||
}
|
||||
}
|
||||
// Write the chunk + chunk header
|
||||
writeSafe(raf, start, newBytes);
|
||||
// Write the location data (beginning of file)
|
||||
writeHeader(raf, cx, cz, start >> 12, newSize, true);
|
||||
|
||||
written = start + newBytes.length + 5;
|
||||
start += newSize << 12;
|
||||
}
|
||||
|
||||
// Write all the chunks which need to be appended
|
||||
if (!append.isEmpty()) {
|
||||
for (Int2ObjectMap.Entry<byte[]> entry : append.int2ObjectEntrySet()) {
|
||||
int pair = entry.getIntKey();
|
||||
short cx = MathMan.unpairX(pair);
|
||||
short cz = MathMan.unpairY(pair);
|
||||
byte[] bytes = entry.getValue();
|
||||
int len = bytes.length + 5;
|
||||
int newSize = (len + 4095) >> 12;
|
||||
writeSafe(raf, start, bytes);
|
||||
writeHeader(raf, cx, cz, start >> 12, newSize, true);
|
||||
written = start + bytes.length + 5;
|
||||
start += newSize << 12;
|
||||
}
|
||||
}
|
||||
// Round the file length, since the vanilla server doesn't like it for some reason
|
||||
raf.setLength(4096 * ((written + 4095) / 4096));
|
||||
if (raf instanceof BufferedRandomAccessFile) {
|
||||
((BufferedRandomAccessFile) raf).flush();
|
||||
}
|
||||
raf.close();
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (wait) {
|
||||
pool.shutdown();
|
||||
pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
}
|
||||
}
|
||||
IterableThreadLocal.clean(byteStore1);
|
||||
IterableThreadLocal.clean(byteStore2);
|
||||
IterableThreadLocal.clean(byteStore3);
|
||||
}
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
import com.boydti.fawe.object.collection.IterableThreadLocal;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
|
||||
/**
|
||||
* MCAQueue.filterWorld(MCAFilter)<br>
|
||||
* - Read and modify the world
|
||||
*/
|
||||
public class MCAFilter<T> extends IterableThreadLocal<T> {
|
||||
|
||||
public void withPool(ForkJoinPool pool, MCAQueue queue) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether this .mca file should be read
|
||||
* @param path
|
||||
* @param attr
|
||||
* @return
|
||||
*/
|
||||
public boolean appliesFile(Path path, BasicFileAttributes attr) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a .mca file should be read
|
||||
*
|
||||
* @param mcaX
|
||||
* @param mcaZ
|
||||
* @return
|
||||
*/
|
||||
public boolean appliesFile(int mcaX, int mcaZ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Do something with the MCAFile<br>
|
||||
* - Return null if you don't want to filter chunks<br>
|
||||
* - Return the same file if you do want to filter chunks<br>
|
||||
*
|
||||
* @param file
|
||||
* @return file or null
|
||||
*/
|
||||
public MCAFile applyFile(MCAFile file) {
|
||||
return file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a chunk should be read
|
||||
*
|
||||
* @param cx
|
||||
* @param cz
|
||||
* @return
|
||||
*/
|
||||
public boolean appliesChunk(int cx, int cz) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Do something with the MCAChunk<br>
|
||||
* - Return null if you don't want to filter blocks<br>
|
||||
* - Return the chunk if you do want to filter blocks<br>
|
||||
*
|
||||
* @param chunk
|
||||
* @return
|
||||
*/
|
||||
public MCAChunk applyChunk(MCAChunk chunk, T cache) {
|
||||
return chunk;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make changes to the block here<br>
|
||||
* - e.g. block.setId(...)<br>
|
||||
* - Note: Performance is critical here<br>
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @param z
|
||||
* @param block
|
||||
*/
|
||||
public void applyBlock(int x, int y, int z, BaseBlock block, T cache) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Do something with the MCAChunk after block filtering<br>
|
||||
*
|
||||
* @param chunk
|
||||
* @param cache
|
||||
* @return
|
||||
*/
|
||||
public void finishChunk(MCAChunk chunk, T cache) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Do something with the MCAFile after block filtering<br>
|
||||
*
|
||||
* @param file
|
||||
* @param cache
|
||||
* @return
|
||||
*/
|
||||
public void finishFile(MCAFile file, T cache) {
|
||||
}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
|
||||
public class MCAFilterCounter extends MCAFilter<MutableLong> {
|
||||
@Override
|
||||
public void finishChunk(MCAChunk chunk, MutableLong cache) {
|
||||
cache.add(chunk.getModified());
|
||||
}
|
||||
|
||||
@Override
|
||||
public MutableLong init() {
|
||||
return new MutableLong();
|
||||
}
|
||||
|
||||
public long getTotal() {
|
||||
long total = 0;
|
||||
for (MutableLong value : getAll()) {
|
||||
total += value.get();
|
||||
}
|
||||
return total;
|
||||
}
|
||||
}
|
@ -1,826 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.example.IntFaweChunk;
|
||||
import com.boydti.fawe.example.NMSMappedFaweQueue;
|
||||
import com.boydti.fawe.example.NullFaweChunk;
|
||||
import com.boydti.fawe.jnbt.anvil.filters.DelegateMCAFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.history.IAnvilHistory;
|
||||
import com.boydti.fawe.jnbt.anvil.history.NullAnvilHistory;
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.RegionWrapper;
|
||||
import com.boydti.fawe.object.RunnableVal2;
|
||||
import com.boydti.fawe.object.RunnableVal4;
|
||||
import com.boydti.fawe.object.collection.IterableThreadLocal;
|
||||
import com.boydti.fawe.util.MainUtil;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class MCAQueue extends NMSMappedFaweQueue<FaweQueue, FaweChunk, FaweChunk, FaweChunk> {
|
||||
|
||||
private FaweQueue parent;
|
||||
private NMSMappedFaweQueue parentNMS;
|
||||
private final boolean hasSky;
|
||||
private final File saveFolder;
|
||||
private final ThreadLocal<MutableMCABackedBaseBlock> blockStore = new ThreadLocal<MutableMCABackedBaseBlock>() {
|
||||
@Override
|
||||
protected MutableMCABackedBaseBlock initialValue() {
|
||||
return new MutableMCABackedBaseBlock();
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void finalize() throws Throwable {
|
||||
IterableThreadLocal.clean(blockStore);
|
||||
super.finalize();
|
||||
}
|
||||
|
||||
public MCAQueue(FaweQueue parent) {
|
||||
super(parent.getWorldName(), new MCAQueueMap());
|
||||
this.parent = parent;
|
||||
if (parent instanceof NMSMappedFaweQueue) {
|
||||
parentNMS = (NMSMappedFaweQueue) parent;
|
||||
}
|
||||
((MCAQueueMap) getFaweQueueMap()).setParentQueue(parent);
|
||||
hasSky = parent.hasSky();
|
||||
saveFolder = parent.getSaveFolder();
|
||||
}
|
||||
|
||||
public MCAQueue(String world, File saveFolder, boolean hasSky) {
|
||||
super(world, new MCAQueueMap());
|
||||
((MCAQueueMap) getFaweQueueMap()).setParentQueue(this);
|
||||
this.saveFolder = saveFolder;
|
||||
this.hasSky = hasSky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk loadChunk(FaweQueue faweQueue, int x, int z, boolean generate) {
|
||||
return getFaweChunk(x, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk getSections(FaweChunk faweChunk) {
|
||||
return faweChunk;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk getCachedChunk(FaweQueue faweQueue, int cx, int cz) {
|
||||
return getFaweChunk(cx, cz);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BiomeType getBiome(FaweChunk faweChunk, int x, int z) {
|
||||
if (faweChunk instanceof MCAChunk) {
|
||||
return ((MCAChunk) faweChunk).getBiomeType(x, z);
|
||||
} else if (parent != null) {
|
||||
return parent.getBiomeType(x, z);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param newChunk
|
||||
* @param bx
|
||||
* @param tx
|
||||
* @param bz
|
||||
* @param tz
|
||||
* @param oX
|
||||
* @param oZ
|
||||
* @return true if the newChunk has been changed
|
||||
*/
|
||||
public boolean copyTo(MCAChunk newChunk, int bx, int tx, int bz, int tz, int oX, int oZ) {
|
||||
int obx = bx - oX;
|
||||
int obz = bz - oZ;
|
||||
int otx = tx - oX;
|
||||
int otz = tz - oZ;
|
||||
int otherBCX = (obx) >> 4;
|
||||
int otherBCZ = (obz) >> 4;
|
||||
int otherTCX = (otx) >> 4;
|
||||
int otherTCZ = (otz) >> 4;
|
||||
int cx = newChunk.getX();
|
||||
int cz = newChunk.getZ();
|
||||
int cbx = (cx << 4) - oX;
|
||||
int cbz = (cz << 4) - oZ;
|
||||
|
||||
boolean changed = false;
|
||||
for (int otherCZ = otherBCZ; otherCZ <= otherTCZ; otherCZ++) {
|
||||
for (int otherCX = otherBCX; otherCX <= otherTCX; otherCX++) {
|
||||
FaweChunk chunk;
|
||||
synchronized (this) {
|
||||
chunk = this.getFaweChunk(otherCX, otherCZ);
|
||||
}
|
||||
if (!(chunk instanceof NullFaweChunk)) {
|
||||
changed = true;
|
||||
MCAChunk other = (MCAChunk) chunk;
|
||||
int ocbx = otherCX << 4;
|
||||
int ocbz = otherCZ << 4;
|
||||
int octx = ocbx + 15;
|
||||
int octz = ocbz + 15;
|
||||
int offsetY = 0;
|
||||
int minX = obx > ocbx ? (obx - ocbx) & 15 : 0;
|
||||
int maxX = otx < octx ? (otx - ocbx) : 15;
|
||||
int minZ = obz > ocbz ? (obz - ocbz) & 15 : 0;
|
||||
int maxZ = otz < octz ? (otz - ocbz) : 15;
|
||||
int offsetX = ocbx - cbx;
|
||||
int offsetZ = ocbz - cbz;
|
||||
newChunk.copyFrom(other, minX, maxX, 0, 255, minZ, maxZ, offsetX, offsetY, offsetZ);
|
||||
}
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setMCA(int mcaX, int mcaZ, RegionWrapper region, Runnable whileLocked, boolean save, boolean unload) {
|
||||
if (parent != null) return parent.setMCA(mcaX, mcaZ, region, whileLocked, save, unload);
|
||||
return super.setMCA(mcaX, mcaZ, region, whileLocked, save, unload);
|
||||
}
|
||||
|
||||
public void pasteRegion(MCAQueue from, final RegionWrapper regionFrom, BlockVector3 offset) throws IOException {
|
||||
pasteRegion(from, regionFrom, offset, new NullAnvilHistory());
|
||||
}
|
||||
|
||||
public void pasteRegion(MCAQueue from, final RegionWrapper regionFrom, BlockVector3 offset, IAnvilHistory history) throws IOException {
|
||||
int oX = offset.getBlockX();
|
||||
int oZ = offset.getBlockZ();
|
||||
int oY = offset.getBlockY();
|
||||
int oCX = oX >> 4;
|
||||
int oCZ = oZ >> 4;
|
||||
RegionWrapper regionTo = new RegionWrapper(regionFrom.minX + oX, regionFrom.maxX + oX, regionFrom.minZ + oZ, regionFrom.maxZ + oZ);
|
||||
|
||||
File folder = getSaveFolder();
|
||||
int bMcaX = (regionTo.minX >> 9);
|
||||
int bMcaZ = (regionTo.minZ >> 9);
|
||||
int tMcaX = (regionTo.maxX >> 9);
|
||||
int tMcaZ = (regionTo.maxZ >> 9);
|
||||
|
||||
filterCopy(new MCAFilter() {
|
||||
@Override
|
||||
public MCAFile applyFile(MCAFile mcaFile) {
|
||||
try {
|
||||
int mcaX = mcaFile.getX();
|
||||
int mcaZ = mcaFile.getZ();
|
||||
int bcx = Math.max(mcaX << 5, regionTo.minX >> 4);
|
||||
int bcz = Math.max(mcaZ << 5, regionTo.minZ >> 4);
|
||||
int tcx = Math.min((mcaX << 5) + 31, regionTo.maxX >> 4);
|
||||
int tcz = Math.min((mcaZ << 5) + 31, regionTo.maxZ >> 4);
|
||||
mcaFile.init();
|
||||
|
||||
final long heapSize = Runtime.getRuntime().totalMemory();
|
||||
final long heapMaxSize = Runtime.getRuntime().maxMemory();
|
||||
int free = (int) (((heapMaxSize - heapSize) + Runtime.getRuntime().freeMemory()) / (1024 * 1024));
|
||||
|
||||
// int obcx = bcx - oCX;
|
||||
// int obcz = bcz - oCX;
|
||||
// int otcx = tcx - oCX;
|
||||
// int otcz = tcz - oCX;
|
||||
|
||||
for (int cz = bcz; cz <= tcz; cz++) {
|
||||
for (int cx = bcx; cx <= tcx; cx++) {
|
||||
int bx = cx << 4;
|
||||
int bz = cz << 4;
|
||||
int tx = bx + 15;
|
||||
int tz = bz + 15;
|
||||
if (oX == 0 && oZ == 0) {
|
||||
if (bx >= regionTo.minX && tx <= regionTo.maxX && bz >= regionTo.minZ && tz <= regionTo.maxZ) {
|
||||
FaweChunk chunk = from.getFaweChunk(cx - oCX, cz - oCZ);
|
||||
if (!(chunk instanceof NullFaweChunk)) {
|
||||
// if (regionTo.minY == 0 && regionTo.maxY == 255) {
|
||||
// System.out.println("Vertical");
|
||||
// MCAChunk mcaChunk = (MCAChunk) chunk;
|
||||
// mcaChunk.setLoc(null, cx, cz);
|
||||
// mcaChunk.setModified();
|
||||
// mcaFile.setChunk(mcaChunk);
|
||||
// } else
|
||||
{
|
||||
MCAChunk newChunk = mcaFile.getChunk(cx, cz);
|
||||
if (newChunk == null) {
|
||||
newChunk = new MCAChunk(MCAQueue.this, cx, cz);
|
||||
mcaFile.setChunk(newChunk);
|
||||
} else {
|
||||
newChunk.setModified();
|
||||
}
|
||||
newChunk.copyFrom((MCAChunk) chunk, regionFrom.minY, regionFrom.maxY, oY);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
bx = Math.max(regionTo.minX, bx);
|
||||
bz = Math.max(regionTo.minZ, bz);
|
||||
tx = Math.min(regionTo.maxX, tx);
|
||||
tz = Math.min(regionTo.maxZ, tz);
|
||||
int obx = bx - oX;
|
||||
int obz = bz - oZ;
|
||||
int otx = tx - oX;
|
||||
int otz = tz - oZ;
|
||||
int otherBCX = (obx) >> 4;
|
||||
int otherBCZ = (obz) >> 4;
|
||||
int otherTCX = (otx) >> 4;
|
||||
int otherTCZ = (otz) >> 4;
|
||||
MCAChunk newChunk = mcaFile.getChunk(cx, cz);
|
||||
boolean created;
|
||||
if (newChunk == null) {
|
||||
newChunk = new MCAChunk(MCAQueue.this, cx, cz);
|
||||
created = true;
|
||||
} else {
|
||||
created = false;
|
||||
newChunk.setModified();
|
||||
}
|
||||
boolean modified = false;
|
||||
int cbx = (cx << 4) - oX;
|
||||
int cbz = (cz << 4) - oZ;
|
||||
for (int otherCZ = otherBCZ; otherCZ <= otherTCZ; otherCZ++) {
|
||||
for (int otherCX = otherBCX; otherCX <= otherTCX; otherCX++) {
|
||||
FaweChunk chunk = from.getFaweChunk(otherCX, otherCZ);
|
||||
if (!(chunk instanceof NullFaweChunk)) {
|
||||
MCAChunk other = (MCAChunk) chunk;
|
||||
int ocbx = otherCX << 4;
|
||||
int ocbz = otherCZ << 4;
|
||||
int octx = ocbx + 15;
|
||||
int octz = ocbz + 15;
|
||||
int minY = regionFrom.minY;
|
||||
int maxY = regionFrom.maxY;
|
||||
int offsetY = oY;
|
||||
int minX = obx > ocbx ? (obx - ocbx) & 15 : 0;
|
||||
int maxX = otx < octx ? (otx - ocbx) : 15;
|
||||
int minZ = obz > ocbz ? (obz - ocbz) & 15 : 0;
|
||||
int maxZ = otz < octz ? (otz - ocbz) : 15;
|
||||
int offsetX = ocbx - cbx;
|
||||
int offsetZ = ocbz - cbz;
|
||||
newChunk.copyFrom(other, minX, maxX, minY, maxY, minZ, maxZ, offsetX, offsetY, offsetZ);
|
||||
newChunk.setModified();
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (created && modified) {
|
||||
mcaFile.setChunk(newChunk);
|
||||
}
|
||||
}
|
||||
}
|
||||
from.clear();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}, regionTo, history);
|
||||
from.clear();
|
||||
}
|
||||
|
||||
private void performCopy(MCAFile original, MCAFile copy, RegionWrapper region, IAnvilHistory task, ForkJoinPool pool) {
|
||||
original.clear();
|
||||
File originalFile = original.getFile();
|
||||
File copyFile = copy.getFile();
|
||||
if (copy.isModified()) {
|
||||
if (copy.isDeleted()) {
|
||||
if (task.addFileChange(originalFile)) return;
|
||||
setMCA(original.getX(), original.getZ(), region, () -> task.addFileChange(originalFile), true, true);
|
||||
return;
|
||||
} else if (copyFile.exists()) {
|
||||
// If the task is the normal delete task, we can do a normal file move
|
||||
copy.close(pool);
|
||||
if (task.getClass() == NullAnvilHistory.class) {
|
||||
try {
|
||||
Files.move(copyFile.toPath(), originalFile.toPath(), StandardCopyOption.ATOMIC_MOVE);
|
||||
return;
|
||||
} catch (IOException ignore) {}
|
||||
}
|
||||
setMCA(original.getX(), original.getZ(), region, () -> {
|
||||
task.addFileChange(originalFile);
|
||||
if (!copyFile.renameTo(originalFile)) {
|
||||
Fawe.debug("Failed to copy (2)");
|
||||
}
|
||||
}, true, true);
|
||||
}
|
||||
}
|
||||
copy.clear();
|
||||
copyFile.delete();
|
||||
}
|
||||
|
||||
public <G, T extends MCAFilter<G>> T filterCopy(final T filter, RegionWrapper region) {
|
||||
return filterCopy(filter, region, new NullAnvilHistory());
|
||||
}
|
||||
|
||||
|
||||
public <G, T extends MCAFilter<G>> T filterCopy(final T filter, RegionWrapper region, IAnvilHistory task) {
|
||||
DelegateMCAFilter<G> delegate = new DelegateMCAFilter<G>(filter) {
|
||||
MCAFile original;
|
||||
MCAFile copy;
|
||||
ForkJoinPool pool;
|
||||
|
||||
@Override
|
||||
public void withPool(ForkJoinPool pool, MCAQueue queue) {
|
||||
this.pool = pool;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAFile applyFile(MCAFile original) {
|
||||
this.original = original;
|
||||
this.original.clear();
|
||||
File file = original.getFile();
|
||||
file.setWritable(true);
|
||||
File copyDest = new File(file.getParentFile(), file.getName() + "-copy");
|
||||
setMCA(original.getX(), original.getZ(), region, () -> {
|
||||
try {
|
||||
Files.copy(file.toPath(), copyDest.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}, true, false);
|
||||
this.copy = new MCAFile(original.getParent(), copyDest);
|
||||
MCAFile result = filter.applyFile(copy);
|
||||
if (result == null) {
|
||||
performCopy(original, copy, region, task, pool);
|
||||
}
|
||||
if (result == null || !copy.getFile().equals(result.getFile())) {
|
||||
copy.clear();
|
||||
if (copyDest.exists() && !copyDest.delete()) copyDest.deleteOnExit();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finishFile(MCAFile newRegion, G cache) {
|
||||
performCopy(original, newRegion, region, task, pool);
|
||||
}
|
||||
};
|
||||
if (region == RegionWrapper.GLOBAL()) {
|
||||
this.filterWorld(delegate);
|
||||
} else {
|
||||
this.filterRegion(delegate, region);
|
||||
}
|
||||
return filter;
|
||||
}
|
||||
|
||||
public <G, T extends MCAFilter<G>> T filterRegion(final T filter, final RegionWrapper region) {
|
||||
DelegateMCAFilter<G> delegate = new DelegateMCAFilter<G>(filter) {
|
||||
|
||||
@Override
|
||||
public boolean appliesFile(Path path, BasicFileAttributes attr) {
|
||||
String name = path.toString();
|
||||
int[] coords = MainUtil.regionNameToCoords(name);
|
||||
final int mcaX = coords[0];
|
||||
final int mcaZ = coords[1];
|
||||
return region.isInMCA(mcaX, mcaZ) && filter.appliesFile(path, attr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean appliesFile(int mcaX, int mcaZ) {
|
||||
return region.isInMCA(mcaX, mcaZ) && filter.appliesFile(mcaX, mcaZ);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean appliesChunk(int cx, int cz) {
|
||||
return region.isInChunk(cx, cz) && filter.appliesChunk(cx, cz);
|
||||
}
|
||||
|
||||
@Override
|
||||
public G get() {
|
||||
return filter.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAChunk applyChunk(MCAChunk chunk, G value) {
|
||||
chunk = filter.applyChunk(chunk, value);
|
||||
if (chunk != null) {
|
||||
final MutableMCABackedBaseBlock mutableBlock = blockStore.get();
|
||||
mutableBlock.setChunk(chunk);
|
||||
int bx = chunk.getX() << 4;
|
||||
int bz = chunk.getZ() << 4;
|
||||
int tx = bx + 15;
|
||||
int tz = bz + 15;
|
||||
bx = Math.max(bx, region.minX);
|
||||
bz = Math.max(bz, region.minZ);
|
||||
tx = Math.min(tx, region.maxX);
|
||||
tz = Math.min(tz, region.maxZ);
|
||||
int minLayer = region.minY >> 4;
|
||||
int maxLayer = region.maxY >> 4;
|
||||
for (int layer = minLayer; layer <= maxLayer; layer++) {
|
||||
if (chunk.doesSectionExist(layer)) {
|
||||
mutableBlock.setArrays(layer);
|
||||
int yStart = layer << 4;
|
||||
int yEnd = yStart + 15;
|
||||
yStart = Math.max(yStart, region.minY);
|
||||
yEnd = Math.min(yEnd, region.maxY);
|
||||
for (int y = yStart, y0 = (yStart & 15); y <= yEnd; y++, y0++) {
|
||||
int yIndex = ((y0) << 8);
|
||||
mutableBlock.setY(y);
|
||||
for (int z = bz, z0 = bz & 15; z <= tz; z++, z0++) {
|
||||
int zIndex = yIndex + ((z0) << 4);
|
||||
mutableBlock.setZ(z);
|
||||
for (int x = bx, x0 = bx & 15; x <= tx; x++, x0++) {
|
||||
int xIndex = zIndex + x0;
|
||||
mutableBlock.setX(x);
|
||||
mutableBlock.setIndex(xIndex);
|
||||
filter.applyBlock(x, y, z, mutableBlock, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
final int minMCAX = region.minX >> 9;
|
||||
final int minMCAZ = region.minZ >> 9;
|
||||
final int maxMCAX = region.maxX >> 9;
|
||||
final int maxMCAZ = region.maxZ >> 9;
|
||||
long mcaArea = (maxMCAX - minMCAX + 1l) * (maxMCAZ - minMCAZ + 1l);
|
||||
if (mcaArea < 128) {
|
||||
this.filterWorld(delegate, new RunnableVal2<Path, RunnableVal2<Path, BasicFileAttributes>>() {
|
||||
@Override
|
||||
public void run(Path root, RunnableVal2<Path, BasicFileAttributes> funx) {
|
||||
for (int x = minMCAX; x <= maxMCAX; x++) {
|
||||
for (int z = minMCAZ; z <= maxMCAZ; z++) {
|
||||
Path newPath = root.resolve(Paths.get("r." + x + "." + z + ".mca"));
|
||||
if (Files.exists(newPath)) {
|
||||
try {
|
||||
BasicFileAttributes attrs = Files.readAttributes(newPath, BasicFileAttributes.class);
|
||||
funx.run(newPath, attrs);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
this.filterWorld(delegate);
|
||||
}
|
||||
return filter;
|
||||
}
|
||||
|
||||
public <G, T extends MCAFilter<G>> T createRegion(final T filter, final RegionWrapper region) {
|
||||
int botMcaX = region.minX >> 9;
|
||||
int botMcaZ = region.minZ >> 9;
|
||||
int topMcaX = region.maxX >> 9;
|
||||
int topMcaZ = region.maxZ >> 9;
|
||||
for (int mcaX = botMcaX >> 9; mcaX <= topMcaX; mcaX++) {
|
||||
for (int mcaZ = botMcaZ >> 9; mcaZ <= topMcaZ; mcaZ++) {
|
||||
|
||||
}
|
||||
}
|
||||
return filter;
|
||||
}
|
||||
|
||||
private <G, T extends MCAFilter<G>> RunnableVal2<Path, BasicFileAttributes> filterFunction(final T filter, ForkJoinPool pool) {
|
||||
return new RunnableVal2<Path, BasicFileAttributes>() {
|
||||
@Override
|
||||
public void run(Path path, BasicFileAttributes attr) {
|
||||
try {
|
||||
String name = path.getFileName().toString();
|
||||
if (!name.endsWith(".mca") && !name.endsWith(".mcapm")) {
|
||||
return;
|
||||
}
|
||||
if (!filter.appliesFile(path, attr)) {
|
||||
return;
|
||||
}
|
||||
String[] split = name.split("\\.");
|
||||
final int mcaX = Integer.parseInt(split[1]);
|
||||
final int mcaZ = Integer.parseInt(split[2]);
|
||||
if (filter.appliesFile(mcaX, mcaZ)) {
|
||||
File file = path.toFile();
|
||||
final MCAFile original = new MCAFile(MCAQueue.this, file);
|
||||
final MCAFile finalFile = filter.applyFile(original);
|
||||
if (finalFile != null && !finalFile.isDeleted()) {
|
||||
finalFile.init();
|
||||
// May not do anything, but seems to lead to smaller lag spikes
|
||||
final int cbx = mcaX << 5;
|
||||
final int cbz = mcaZ << 5;
|
||||
|
||||
finalFile.forEachSortedChunk(new RunnableVal4<Integer, Integer, Integer, Integer>() {
|
||||
@Override
|
||||
public void run(final Integer rcx, final Integer rcz, Integer offset, Integer size) {
|
||||
pool.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
int cx = cbx + rcx;
|
||||
int cz = cbz + rcz;
|
||||
if (filter.appliesChunk(cx, cz)) {
|
||||
MCAChunk chunk = finalFile.getChunk(cx, cz);
|
||||
try {
|
||||
final G value = filter.get();
|
||||
chunk = filter.applyChunk(chunk, value);
|
||||
if (chunk != null) {
|
||||
final MutableMCABackedBaseBlock mutableBlock = blockStore.get();
|
||||
mutableBlock.setChunk(chunk);
|
||||
int bx = cx << 4;
|
||||
int bz = cz << 4;
|
||||
for (int layer = 0; layer < 16; layer++) {
|
||||
if (chunk.doesSectionExist(layer)) {
|
||||
mutableBlock.setArrays(layer);
|
||||
int yStart = layer << 4;
|
||||
int index = 0;
|
||||
for (int y = yStart; y < yStart + 16; y++) {
|
||||
mutableBlock.setY(y);
|
||||
for (int z = bz; z < bz + 16; z++) {
|
||||
mutableBlock.setZ(z);
|
||||
for (int x = bx; x < bx + 16; x++, index++) {
|
||||
mutableBlock.setX(x);
|
||||
mutableBlock.setIndex(index);
|
||||
filter.applyBlock(x, y, z, mutableBlock, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
filter.finishChunk(chunk, value);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
filter.finishFile(finalFile, filter.get());
|
||||
} else {
|
||||
if (original.isDeleted()) {
|
||||
try {
|
||||
original.close(pool);
|
||||
file.delete();
|
||||
} catch (Throwable ignore) {
|
||||
ignore.printStackTrace();
|
||||
}
|
||||
}
|
||||
pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
original.close(pool);
|
||||
if (original.isDeleted()) {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
} catch (Throwable ignore) {
|
||||
ignore.printStackTrace();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private <G, T extends MCAFilter<G>> T filterWorld(final T filter, RunnableVal2<Path, RunnableVal2<Path, BasicFileAttributes>> traverser) {
|
||||
File folder = getSaveFolder();
|
||||
final ForkJoinPool pool = new ForkJoinPool();
|
||||
filter.withPool(pool, this);
|
||||
RunnableVal2<Path, BasicFileAttributes> task = filterFunction(filter, pool);
|
||||
traverser.run(folder.toPath(), task);
|
||||
pool.shutdown();
|
||||
try {
|
||||
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return filter;
|
||||
}
|
||||
|
||||
public <G, T extends MCAFilter<G>> T filterWorld(final T filter) {
|
||||
return filterWorld(filter, new RunnableVal2<Path, RunnableVal2<Path, BasicFileAttributes>>() {
|
||||
@Override
|
||||
public void run(Path value1, RunnableVal2<Path, BasicFileAttributes> value2) {
|
||||
MainUtil.traverse(value1, value2);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public <G, T extends MCAFilter<G>> T filterWorld(final T filter, Comparator<File> comparator) {
|
||||
return filterWorld(filter, new RunnableVal2<Path, RunnableVal2<Path, BasicFileAttributes>>() {
|
||||
@Override
|
||||
public void run(Path value1, RunnableVal2<Path, BasicFileAttributes> value2) {
|
||||
MainUtil.forEachFile(value1, value2, comparator);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supports(Capability capability) {
|
||||
if (capability == Capability.CHANGE_TASKS) {
|
||||
return false;
|
||||
}
|
||||
return super.supports(capability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void relight(int x, int y, int z) {
|
||||
throw new UnsupportedOperationException("Not supported");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void relightBlock(int x, int y, int z) {
|
||||
throw new UnsupportedOperationException("Not supported");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void relightSky(int x, int y, int z) {
|
||||
throw new UnsupportedOperationException("Not supported");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean regenerateChunk(FaweQueue faweQueue, int x, int z, BiomeType biome, Long seed) {
|
||||
throw new UnsupportedOperationException("Not supported");
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweQueue getImpWorld() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFullbright(FaweChunk sections) {
|
||||
if (sections.getClass() == MCAChunk.class) {
|
||||
((MCAChunk) sections).setFullbright();
|
||||
} else if (parentNMS != null) {
|
||||
int cx = sections.getX();
|
||||
int cz = sections.getZ();
|
||||
parentNMS.ensureChunkLoaded(cx, cz);
|
||||
Object parentSections = parentNMS.getCachedSections(parentNMS.getWorld(), cx, cz);
|
||||
if (parentSections != null) {
|
||||
parentNMS.setFullbright(sections);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeSectionLighting(FaweChunk sections, int layer, boolean hasSky) {
|
||||
if (sections.getClass() == MCAChunk.class) {
|
||||
((MCAChunk) sections).removeLight(layer);
|
||||
} else if (parentNMS != null) {
|
||||
int cx = sections.getX();
|
||||
int cz = sections.getZ();
|
||||
parentNMS.ensureChunkLoaded(cx, cz);
|
||||
Object parentSections = parentNMS.getCachedSections(parentNMS.getWorld(), cx, cz);
|
||||
if (parentSections != null) {
|
||||
parentNMS.removeSectionLighting(sections, layer, hasSky);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeLighting(FaweChunk sections, RelightMode mode, boolean hasSky) {
|
||||
if (mode != RelightMode.NONE) {
|
||||
if (sections.getClass() == MCAChunk.class) {
|
||||
((MCAChunk) sections).removeLight();
|
||||
} else if (parentNMS != null) {
|
||||
int cx = sections.getX();
|
||||
int cz = sections.getZ();
|
||||
parentNMS.ensureChunkLoaded(cx, cz);
|
||||
Object parentSections = parentNMS.getCachedSections(parentNMS.getWorld(), cx, cz);
|
||||
if (parentSections != null) {
|
||||
parentNMS.removeLighting(sections, mode, hasSky);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSkyLight(FaweChunk sections, int x, int y, int z, int value) {
|
||||
if (sections.getClass() == MCAChunk.class) {
|
||||
((MCAChunk) sections).setSkyLight(x, y, z, value);
|
||||
} else if (parentNMS != null) {
|
||||
parentNMS.setSkyLight(x, y, z, value);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBlockLight(FaweChunk sections, int x, int y, int z, int value) {
|
||||
if (sections.getClass() == MCAChunk.class) {
|
||||
((MCAChunk) sections).setBlockLight(x, y, z, value);
|
||||
} else if (parentNMS != null) {
|
||||
parentNMS.setBlockLight(x, y, z, value);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void refreshChunk(FaweChunk fs) {
|
||||
if (fs.getClass() != MCAChunk.class) {
|
||||
parentNMS.sendChunk(fs);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendChunk(int x, int z, int bitMask) {
|
||||
if (parentNMS != null) {
|
||||
parentNMS.sendChunk(x, z, bitMask);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompoundTag getTileEntity(FaweChunk sections, int x, int y, int z) {
|
||||
if (sections.getClass() == MCAChunk.class) {
|
||||
return sections.getTile(x, y, z);
|
||||
} else {
|
||||
return parentNMS.getTileEntity(x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk getFaweChunk(int cx, int cz) {
|
||||
return getFaweQueueMap().getFaweChunk(cx, cz);
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getSaveFolder() {
|
||||
return saveFolder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSky() {
|
||||
return hasSky;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAChunk getCachedSections(FaweQueue faweQueue, int cx, int cz) {
|
||||
return (MCAChunk) getFaweQueueMap().getFaweChunk(cx, cz);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk getCachedSection(FaweChunk sections, int cy) {
|
||||
if (sections.getClass() == MCAChunk.class) {
|
||||
if (((MCAChunk) sections).doesSectionExist(cy)) {
|
||||
return sections;
|
||||
}
|
||||
return null;
|
||||
} else if (parentNMS != null) {
|
||||
return sections;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCombinedId4Data(FaweChunk sections, int x, int y, int z) {
|
||||
if (sections.getClass() == MCAChunk.class) {
|
||||
return sections.getBlockCombinedId(x, y, z);
|
||||
} else {
|
||||
return parentNMS.getCombinedId4Data(x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSkyLight(FaweChunk sections, int x, int y, int z) {
|
||||
if (sections.getClass() == MCAChunk.class) {
|
||||
return ((MCAChunk) sections).getSkyLight(x, y, z);
|
||||
} else {
|
||||
return parentNMS.getSkyLight(x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getEmmittedLight(FaweChunk sections, int x, int y, int z) {
|
||||
if (sections.getClass() == MCAChunk.class) {
|
||||
return ((MCAChunk) sections).getBlockLight(x, y, z);
|
||||
} else {
|
||||
return parentNMS.getEmmittedLight(x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startSet(boolean parallel) {
|
||||
if (parent != null) {
|
||||
parent.startSet(parallel);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endSet(boolean parallel) {
|
||||
if (parent != null) {
|
||||
parent.endSet(parallel);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendBlockUpdate(FaweChunk chunk, FawePlayer... players) {
|
||||
if (parent != null) {
|
||||
parentNMS.sendBlockUpdate(chunk, players);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,222 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
import com.boydti.fawe.example.IFaweQueueMap;
|
||||
import com.boydti.fawe.example.MappedFaweQueue;
|
||||
import com.boydti.fawe.example.NullFaweChunk;
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.RegionWrapper;
|
||||
import com.boydti.fawe.object.RunnableVal;
|
||||
import com.boydti.fawe.object.exception.FaweException;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.boydti.fawe.util.SetQueue;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class MCAQueueMap implements IFaweQueueMap {
|
||||
|
||||
|
||||
private FaweQueue queue;
|
||||
|
||||
private Map<Long, MCAFile> mcaFileMap = new ConcurrentHashMap<>(8, 0.9f, 1);
|
||||
private NullFaweChunk nullChunk;
|
||||
private boolean isHybridQueue;
|
||||
|
||||
public void setParentQueue(FaweQueue queue) {
|
||||
this.queue = queue;
|
||||
this.nullChunk = new NullFaweChunk(queue, 0, 0);
|
||||
this.isHybridQueue = queue != null && !(queue instanceof MCAQueue) && (!(queue instanceof MappedFaweQueue) || ((MappedFaweQueue) queue).getFaweQueueMap() != this);
|
||||
}
|
||||
|
||||
private MCAFile lastFile;
|
||||
private int lastFileX = Integer.MIN_VALUE;
|
||||
private int lastFileZ = Integer.MIN_VALUE;
|
||||
|
||||
private FaweChunk lastChunk;
|
||||
private int lastX = Integer.MIN_VALUE;
|
||||
private int lastZ = Integer.MIN_VALUE;
|
||||
|
||||
public synchronized MCAFile getMCAFile(int cx, int cz, boolean create) {
|
||||
int mcaX = cx >> 5;
|
||||
int mcaZ = cz >> 5;
|
||||
if (mcaX == lastFileX && mcaZ == lastFileZ) {
|
||||
return lastFile;
|
||||
}
|
||||
long pair = MathMan.pairInt(lastFileX = mcaX, lastFileZ = mcaZ);
|
||||
MCAFile tmp;
|
||||
lastFile = tmp = mcaFileMap.get(pair);
|
||||
if (lastFile == null) {
|
||||
try {
|
||||
queue.setMCA(lastFileX, lastFileZ, RegionWrapper.GLOBAL(), null, true, false);
|
||||
File save = queue.getSaveFolder();
|
||||
File file;
|
||||
if (save != null) {
|
||||
file = new File(queue.getSaveFolder(), "r." + lastFileX + "." + lastFileZ + ".mca");
|
||||
if (create) {
|
||||
File parent = file.getParentFile();
|
||||
if (!parent.exists()) parent.mkdirs();
|
||||
if (!file.exists()) file.createNewFile();
|
||||
}
|
||||
} else {
|
||||
file = null;
|
||||
}
|
||||
lastFile = tmp = new MCAFile(queue, mcaX, mcaZ, file);
|
||||
} catch (FaweException.FaweChunkLoadException ignore) {
|
||||
lastFile = null;
|
||||
return null;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
lastFile = null;
|
||||
return null;
|
||||
}
|
||||
mcaFileMap.put(pair, tmp);
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<FaweChunk> getFaweChunks() {
|
||||
final List<FaweChunk> chunks = new ArrayList<>();
|
||||
for (Map.Entry<Long, MCAFile> entry : mcaFileMap.entrySet()) {
|
||||
MCAFile file = entry.getValue();
|
||||
if (file != null) {
|
||||
chunks.addAll(file.getCachedChunks());
|
||||
}
|
||||
}
|
||||
return chunks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forEachChunk(RunnableVal<FaweChunk> onEach) {
|
||||
for (FaweChunk chunk : getFaweChunks()) {
|
||||
onEach.run(chunk);
|
||||
}
|
||||
}
|
||||
|
||||
public FaweChunk getFaweChunk(int cx, int cz, boolean create) {
|
||||
if (cx == lastX && cz == lastZ) {
|
||||
if (nullChunk == lastChunk) {
|
||||
nullChunk.setLoc(queue, lastX, lastZ);
|
||||
}
|
||||
return lastChunk;
|
||||
}
|
||||
lastX = cx;
|
||||
lastZ = cz;
|
||||
if (isHybridQueue) {
|
||||
MappedFaweQueue mfq = ((MappedFaweQueue) queue);
|
||||
lastChunk = mfq.getFaweQueueMap().getCachedFaweChunk(cx, cz);
|
||||
if (lastChunk != null) {
|
||||
return lastChunk;
|
||||
}
|
||||
}
|
||||
try {
|
||||
MCAFile mcaFile = getMCAFile(cx, cz, create);
|
||||
if (mcaFile != null) {
|
||||
mcaFile.init();
|
||||
lastChunk = mcaFile.getChunk(cx, cz);
|
||||
if (lastChunk != null) {
|
||||
return lastChunk;
|
||||
} else if (create) {
|
||||
MCAChunk chunk = new MCAChunk(queue, cx, cz);
|
||||
mcaFile.setChunk(chunk);
|
||||
lastChunk = chunk;
|
||||
return chunk;
|
||||
}
|
||||
}
|
||||
} catch (Throwable ignore) {
|
||||
ignore.printStackTrace();
|
||||
}
|
||||
if (isHybridQueue) { // Use parent queue for in use chunks
|
||||
lastChunk = ((MappedFaweQueue) queue).getFaweQueueMap().getFaweChunk(cx, cz);
|
||||
return lastChunk;
|
||||
}
|
||||
nullChunk.setLoc(queue, lastX, lastZ);
|
||||
return lastChunk = nullChunk;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk getFaweChunk(int cx, int cz) {
|
||||
return getFaweChunk(cx, cz, !isHybridQueue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk getCachedFaweChunk(int cx, int cz) {
|
||||
int mcaX = cx >> 5;
|
||||
int mcaZ = cz >> 5;
|
||||
long pair = MathMan.pairInt(mcaX, mcaZ);
|
||||
MCAFile file = mcaFileMap.get(pair);
|
||||
if (file != null) {
|
||||
return file.getCachedChunk(cx, cz);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(FaweChunk chunk) {
|
||||
throw new UnsupportedOperationException("Not supported");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
for (Map.Entry<Long, MCAFile> entry : mcaFileMap.entrySet()) {
|
||||
entry.getValue().clear();
|
||||
}
|
||||
mcaFileMap.clear();
|
||||
lastChunk = null;
|
||||
lastFile = null;
|
||||
lastFileX = Integer.MIN_VALUE;
|
||||
lastFileZ = Integer.MIN_VALUE;
|
||||
lastX = Integer.MIN_VALUE;
|
||||
lastZ = Integer.MIN_VALUE;
|
||||
if (isHybridQueue) {
|
||||
queue.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
int size = mcaFileMap.size();
|
||||
if (isHybridQueue) {
|
||||
size += queue.size();
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean next(int size, long time) {
|
||||
lastX = Integer.MIN_VALUE;
|
||||
lastZ = Integer.MIN_VALUE;
|
||||
lastFileX = Integer.MIN_VALUE;
|
||||
lastFileZ = Integer.MIN_VALUE;
|
||||
if (!mcaFileMap.isEmpty()) {
|
||||
Iterator<Map.Entry<Long, MCAFile>> iter = mcaFileMap.entrySet().iterator();
|
||||
boolean result;
|
||||
long start = System.currentTimeMillis();
|
||||
do {
|
||||
if (result = iter.hasNext()) {
|
||||
MCAFile file = iter.next().getValue();
|
||||
iter.remove();
|
||||
queue.setMCA(file.getX(), file.getZ(), RegionWrapper.GLOBAL(), new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
file.close(SetQueue.IMP.getForkJoinPool());
|
||||
}
|
||||
}, true, true);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} while (System.currentTimeMillis() - start < time);
|
||||
return result;
|
||||
}
|
||||
if (isHybridQueue) {
|
||||
boolean value = queue.next();
|
||||
return value;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -1,136 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
import com.boydti.fawe.object.extent.FastWorldEditExtent;
|
||||
import com.boydti.fawe.util.ReflectionUtils;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.jnbt.ListTag;
|
||||
import com.sk89q.jnbt.Tag;
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.blocks.BaseItemStack;
|
||||
import com.sk89q.worldedit.entity.BaseEntity;
|
||||
import com.sk89q.worldedit.entity.Entity;
|
||||
import com.sk89q.worldedit.math.BlockVector2;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.math.Vector2;
|
||||
import com.sk89q.worldedit.math.Vector3;
|
||||
import com.sk89q.worldedit.regions.Region;
|
||||
import com.sk89q.worldedit.util.Location;
|
||||
import com.sk89q.worldedit.world.SimpleWorld;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class MCAWorld implements SimpleWorld {
|
||||
|
||||
private final String name;
|
||||
private final MCAQueue queue;
|
||||
private final FastWorldEditExtent extent;
|
||||
|
||||
public MCAWorld(String name, File saveFolder, boolean hasSky) {
|
||||
this.name = name;
|
||||
this.queue = new MCAQueue(name, saveFolder, hasSky);
|
||||
this.extent = new FastWorldEditExtent(this, queue);
|
||||
}
|
||||
|
||||
public MCAQueue getQueue() {
|
||||
return queue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBlock(BlockVector3 position, BlockStateHolder block) throws WorldEditException {
|
||||
return extent.setBlock(position, block);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBlockLightLevel(BlockVector3 position) {
|
||||
return queue.getEmmittedLight(position.getBlockX(), position.getBlockY(), position.getBlockZ());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean clearContainerBlockContents(BlockVector3 position) {
|
||||
BaseBlock block = extent.getFullBlock(position);
|
||||
if (block.hasNbtData()) {
|
||||
Map<String, Tag> nbt = ReflectionUtils.getMap(block.getNbtData().getValue());
|
||||
if (nbt.containsKey("Items")) {
|
||||
nbt.put("Items", new ListTag(CompoundTag.class, new ArrayList<CompoundTag>()));
|
||||
try {
|
||||
extent.setBlock(position, block);
|
||||
} catch (WorldEditException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dropItem(Vector3 position, BaseItemStack item) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean regenerate(Region region, EditSession editSession) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends Entity> getEntities(Region region) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends Entity> getEntities() {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Entity createEntity(Location location, BaseEntity entity) {
|
||||
return extent.createEntity(location, entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getBlock(BlockVector3 position) {
|
||||
return extent.getBlock(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BiomeType getBiome(BlockVector2 position) {
|
||||
return extent.getBiome(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBiome(BlockVector2 position, BiomeType biome) {
|
||||
return extent.setBiome(position, biome);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean playEffect(Vector3 position, int type, int data) {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean notifyAndLightBlock(BlockVector3 position, BlockState previousType) throws WorldEditException {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockVector3 getSpawnPosition() {
|
||||
return queue.getWEWorld().getSpawnPosition();
|
||||
}
|
||||
}
|
@ -1,98 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* I'm aware this isn't OOP, but object creation is expensive
|
||||
*/
|
||||
public class MutableMCABackedBaseBlock extends BaseBlock {
|
||||
|
||||
private MCAChunk chunk;
|
||||
private int[] ids;
|
||||
private int index;
|
||||
private int x;
|
||||
private int y;
|
||||
private int z;
|
||||
|
||||
public MutableMCABackedBaseBlock() {
|
||||
super(0, null);
|
||||
}
|
||||
|
||||
public void setChunk(MCAChunk chunk) {
|
||||
this.chunk = chunk;
|
||||
}
|
||||
|
||||
public void setArrays(int layer) {
|
||||
ids = chunk.ids[layer];
|
||||
}
|
||||
|
||||
public MCAChunk getChunk() {
|
||||
return chunk;
|
||||
}
|
||||
|
||||
public void setX(int x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public void setY(int y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public void setZ(int z) {
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public void setIndex(int index) {
|
||||
this.index = index;
|
||||
}
|
||||
|
||||
// TODO FIXME update to latest
|
||||
|
||||
// @Override
|
||||
// public int getId() {
|
||||
// return Byte.toUnsignedInt(ids[index]);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public int getData() {
|
||||
// if (!FaweCache.hasData(ids[index] & 0xFF)) {
|
||||
// return 0;
|
||||
// } else {
|
||||
// int indexShift = index >> 1;
|
||||
// if ((index & 1) == 0) {
|
||||
// return data[indexShift] & 15;
|
||||
// } else {
|
||||
// return (data[indexShift] >> 4) & 15;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public CompoundTag getNbtData() {
|
||||
return chunk.getTile(x, y, z);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// @Override
|
||||
// public void setData(int value) {
|
||||
// int indexShift = index >> 1;
|
||||
// if ((index & 1) == 0) {
|
||||
// data[indexShift] = (byte) (data[indexShift] & 240 | value & 15);
|
||||
// } else {
|
||||
// data[indexShift] = (byte) (data[indexShift] & 15 | (value & 15) << 4);
|
||||
// }
|
||||
// chunk.setModified();
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void setNbtData(@Nullable CompoundTag nbtData) {
|
||||
chunk.setTile(x, y, z, nbtData);
|
||||
chunk.setModified();
|
||||
}
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAChunk;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
|
||||
// TODO FIXME
|
||||
public class CountFilter extends MCAFilterCounter {
|
||||
// private final boolean[] allowedId = new boolean[FaweCache.getId(Character.MAX_VALUE)];
|
||||
// private final boolean[] allowed = new boolean[Character.MAX_VALUE];
|
||||
|
||||
public CountFilter() {
|
||||
}
|
||||
|
||||
public CountFilter addBlock(BaseBlock block) {
|
||||
// addBlock(block.getId(), block.getData());
|
||||
return this;
|
||||
}
|
||||
|
||||
public CountFilter addBlock(int id, int data) {
|
||||
// allowedId[id] = true;
|
||||
// allowed[FaweCache.getCombined(id, data)] = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAChunk applyChunk(MCAChunk chunk, MutableLong count) {
|
||||
// for (int layer = 0; layer < chunk.ids.length; layer++) {
|
||||
// byte[] ids = chunk.ids[layer];
|
||||
// if (ids == null) {
|
||||
// continue;
|
||||
// }
|
||||
// byte[] datas = chunk.data[layer];
|
||||
// for (int i = 0; i < ids.length; i++) {
|
||||
// int id = ids[i] & 0xFF;
|
||||
// if (!allowedId[id]) {
|
||||
// continue;
|
||||
// }
|
||||
// int combined = (id) << 4;
|
||||
// if (FaweCache.hasData(id)) {
|
||||
// combined += chunk.getNibble(i, datas);
|
||||
// }
|
||||
// if (allowed[combined]) {
|
||||
// count.increment();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAChunk;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
import com.sk89q.worldedit.world.block.BlockType;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
|
||||
public class CountIdFilter extends MCAFilterCounter {
|
||||
private final boolean[] allowedId = new boolean[BlockTypes.size()];
|
||||
|
||||
public CountIdFilter() {
|
||||
}
|
||||
|
||||
public CountIdFilter addBlock(BlockType type) {
|
||||
allowedId[type.getInternalId()] = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CountIdFilter addBlock(BlockStateHolder block) {
|
||||
allowedId[block.getInternalBlockTypeId()] = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAChunk applyChunk(MCAChunk chunk, MutableLong count) {
|
||||
// TODO FIXME
|
||||
for (int layer = 0; layer < chunk.ids.length; layer++) {
|
||||
int[] ids = chunk.ids[layer];
|
||||
if (ids != null) {
|
||||
for (int i : ids) {
|
||||
if (allowedId[BlockTypes.getFromStateId(i).getInternalId()]) {
|
||||
count.increment();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFile;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
|
||||
public class DebugFixP2Roads extends MCAFilterCounter {
|
||||
@Override
|
||||
public MCAFile applyFile(MCAFile file) {
|
||||
return super.applyFile(file);
|
||||
}
|
||||
}
|
@ -1,105 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.jnbt.anvil.MCAChunk;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFile;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAQueue;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.Spliterator;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class DelegateMCAFilter<T> extends MCAFilter<T> {
|
||||
private final MCAFilter<T> filter;
|
||||
|
||||
@Override
|
||||
public void withPool(ForkJoinPool pool, MCAQueue queue) {
|
||||
filter.withPool(pool, queue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean appliesFile(Path path, BasicFileAttributes attr) {
|
||||
return filter.appliesFile(path, attr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean appliesFile(int mcaX, int mcaZ) {
|
||||
return filter.appliesFile(mcaX, mcaZ);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAFile applyFile(MCAFile file) {
|
||||
return filter.applyFile(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean appliesChunk(int cx, int cz) {
|
||||
return filter.appliesChunk(cx, cz);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAChunk applyChunk(MCAChunk chunk, T cache) {
|
||||
return filter.applyChunk(chunk, cache);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyBlock(int x, int y, int z, BaseBlock block, T cache) {
|
||||
filter.applyBlock(x, y, z, block, cache);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finishChunk(MCAChunk chunk, T cache) {
|
||||
filter.finishChunk(chunk, cache);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finishFile(MCAFile file, T cache) {
|
||||
filter.finishFile(file, cache);
|
||||
}
|
||||
|
||||
@Override
|
||||
public T init() {
|
||||
return filter.init();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clean() {
|
||||
filter.clean();
|
||||
}
|
||||
|
||||
@Override
|
||||
public T get() {
|
||||
return filter.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forEach(Consumer<? super T> action) {
|
||||
filter.forEach(action);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Spliterator<T> spliterator() {
|
||||
return filter.spliterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
filter.remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(T value) {
|
||||
filter.set(value);
|
||||
}
|
||||
|
||||
public DelegateMCAFilter(MCAFilter<T> filter) {
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
public MCAFilter<T> getFilter() {
|
||||
return filter;
|
||||
}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.jnbt.anvil.MCAChunk;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
|
||||
public class DeleteBiomeFilterSimple extends MCAFilterCounter {
|
||||
private final int id;
|
||||
|
||||
public DeleteBiomeFilterSimple(BiomeType biome) {
|
||||
this.id = biome.getInternalId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAChunk applyChunk(MCAChunk chunk, MutableLong cache) {
|
||||
if ((chunk.biomes[0] & 0xFF) == id) {
|
||||
chunk.setDeleted(true);
|
||||
cache.add(Character.MAX_VALUE);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
|
||||
public class DeleteOldFilter extends MCAFilterCounter {
|
||||
private final long time;
|
||||
|
||||
public DeleteOldFilter(long time) {
|
||||
this.time = time;
|
||||
if (time < 1) {
|
||||
throw new IllegalArgumentException("Time must be positive");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean appliesFile(Path path, BasicFileAttributes attr) {
|
||||
long modified = attr.lastModifiedTime().toMillis();
|
||||
// long access = attr.lastAccessTime().toMillis();
|
||||
long last = modified;//Math.max(modified, access);
|
||||
if (last != 0 && System.currentTimeMillis() - last > this.time) {
|
||||
path.toFile().delete();
|
||||
get().add(512 * 512 * 256);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.FaweAPI;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFile;
|
||||
import com.boydti.fawe.regions.FaweMaskManager;
|
||||
import com.boydti.fawe.regions.general.RegionFilter;
|
||||
import com.sk89q.worldedit.world.World;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class DeleteUnclaimedFilter extends DeleteUninhabitedFilter {
|
||||
private ArrayList<RegionFilter> filters = new ArrayList<>();
|
||||
public DeleteUnclaimedFilter(World world, long fileDuration, long inhabitedTicks, long chunkInactivity) {
|
||||
super(fileDuration, inhabitedTicks, chunkInactivity);
|
||||
for (FaweMaskManager m : FaweAPI.getMaskManagers()) {
|
||||
RegionFilter filter = m.getFilter(world.getName());
|
||||
if (filter != null) {
|
||||
filters.add(filter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldDelete(File file, BasicFileAttributes attr, int mcaX, int mcaZ) throws IOException {
|
||||
boolean contains = false;
|
||||
for (RegionFilter filter : filters) {
|
||||
if (contains = filter.containsRegion(mcaX, mcaZ)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return !contains && super.shouldDelete(file, attr, mcaX, mcaZ);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldDeleteChunk(MCAFile mca, int cx, int cz) {
|
||||
boolean contains = false;
|
||||
for (RegionFilter filter : filters) {
|
||||
if (contains = filter.containsChunk(cx, cz)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return !contains && super.shouldDeleteChunk(mca, cx, cz);
|
||||
}
|
||||
}
|
@ -1,162 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.jnbt.NBTStreamer;
|
||||
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.object.RunnableVal;
|
||||
import com.boydti.fawe.object.RunnableVal2;
|
||||
import com.boydti.fawe.object.RunnableVal4;
|
||||
import com.boydti.fawe.object.exception.FaweException;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
/**
|
||||
* Deletes unvisited MCA files and Chunks<br>
|
||||
* - This a global filter and cannot be used a selection<br>
|
||||
*/
|
||||
public class DeleteUninhabitedFilter extends MCAFilterCounter {
|
||||
private final long inhabitedTicks;
|
||||
private final long fileDurationMillis;
|
||||
private final long cutoffChunkAgeEpoch;
|
||||
private boolean debug = false;
|
||||
|
||||
public DeleteUninhabitedFilter(long fileDurationMillis, long inhabitedTicks, long chunkInactivityMillis) {
|
||||
this.fileDurationMillis = fileDurationMillis;
|
||||
this.inhabitedTicks = inhabitedTicks;
|
||||
this.cutoffChunkAgeEpoch = System.currentTimeMillis() - chunkInactivityMillis;
|
||||
}
|
||||
|
||||
public void enableDebug() {
|
||||
this.debug = true;
|
||||
}
|
||||
|
||||
public long getInhabitedTicks() {
|
||||
return inhabitedTicks;
|
||||
}
|
||||
|
||||
public long getFileDurationMillis() {
|
||||
return fileDurationMillis;
|
||||
}
|
||||
|
||||
public long getCutoffChunkAgeEpoch() {
|
||||
return cutoffChunkAgeEpoch;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean appliesFile(Path path, BasicFileAttributes attr) {
|
||||
String name = path.getFileName().toString();
|
||||
String[] split = name.split("\\.");
|
||||
final int mcaX = Integer.parseInt(split[1]);
|
||||
final int mcaZ = Integer.parseInt(split[2]);
|
||||
File file = path.toFile();
|
||||
long lastModified = attr.lastModifiedTime().toMillis();
|
||||
if (lastModified > cutoffChunkAgeEpoch) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
if (shouldDelete(file, attr, mcaX, mcaZ)) {
|
||||
if (debug) {
|
||||
Fawe.debug("Deleting " + file + " as it was modified at " + new Date(lastModified) + " and you provided a threshold of " + new Date(cutoffChunkAgeEpoch));
|
||||
}
|
||||
file.delete();
|
||||
get().add(512 * 512 * 256);
|
||||
return false;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAFile applyFile(MCAFile mca) {
|
||||
try {
|
||||
ForkJoinPool pool = new ForkJoinPool();
|
||||
mca.init();
|
||||
filter(mca, pool);
|
||||
pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
mca.close(pool);
|
||||
pool.shutdown();
|
||||
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean shouldDelete(File file, BasicFileAttributes attr, int mcaX, int mcaZ) throws IOException {
|
||||
long creation = attr.creationTime().toMillis();
|
||||
long modified = attr.lastModifiedTime().toMillis();
|
||||
if ((modified - creation < fileDurationMillis && modified > creation) || file.length() < 12288) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean shouldDeleteChunk(MCAFile mca, int cx, int cz) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void filter(MCAFile mca, ForkJoinPool pool) throws IOException {
|
||||
mca.forEachSortedChunk(new RunnableVal4<Integer, Integer, Integer, Integer>() {
|
||||
@Override
|
||||
public void run(Integer x, Integer z, Integer offset, Integer size) {
|
||||
int bx = mca.getX() << 5;
|
||||
int bz = mca.getZ() << 5;
|
||||
int cx = bx + x;
|
||||
int cz = bz + z;
|
||||
if (shouldDeleteChunk(mca, cx, cz)) {
|
||||
Runnable task = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
mca.streamChunk(offset, new RunnableVal<NBTStreamer>() {
|
||||
@Override
|
||||
public void run(NBTStreamer value) {
|
||||
addReaders(mca, x, z, value);
|
||||
}
|
||||
});
|
||||
} catch (FaweException ignore) {
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
};
|
||||
pool.submit(task);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void addReaders(MCAFile mca, int x, int z, NBTStreamer streamer) {
|
||||
streamer.addReader(".Level.InhabitedTime", new BiConsumer<Integer, Long>() {
|
||||
@Override
|
||||
public void accept(Integer index, Long value) {
|
||||
if (value <= inhabitedTicks) {
|
||||
MCAChunk chunk = new MCAChunk(null, x, z);
|
||||
if (debug) {
|
||||
int cx = (mca.getX() << 5) + (x & 31);
|
||||
int cz = (mca.getZ() << 5) + (z & 31);
|
||||
Fawe.debug("Deleting chunk " + cx + "," + cz + " as it was only inhabited for " + value + " and passed all other checks");
|
||||
}
|
||||
chunk.setDeleted(true);
|
||||
synchronized (mca) {
|
||||
mca.setChunk(chunk);
|
||||
}
|
||||
get().add(16 * 16 * 256);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -1,73 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.boydti.fawe.util.StringMan;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.extension.input.InputParseException;
|
||||
import com.sk89q.worldedit.function.pattern.Pattern;
|
||||
import com.sk89q.worldedit.function.pattern.RandomPattern;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
// TODO FIXME
|
||||
public class MappedReplacePatternFilter extends MCAFilterCounter {
|
||||
private Pattern[] map = new Pattern[Character.MAX_VALUE + 1];
|
||||
|
||||
public MappedReplacePatternFilter() {
|
||||
}
|
||||
|
||||
public MappedReplacePatternFilter(String from, RandomPattern to, boolean useData) throws InputParseException {
|
||||
// List<String> split = StringMan.split(from, ',');
|
||||
// Pattern[] patterns = ((RandomPattern) to).getPatterns().toArray(new Pattern[0]);
|
||||
// if (patterns.length == split.size()) {
|
||||
// for (int i = 0; i < split.size(); i++) {
|
||||
// Pattern pattern = patterns[i];
|
||||
// String arg = split.get(i);
|
||||
// ArrayList<BaseBlock> blocks = new ArrayList<BaseBlock>();
|
||||
// for (String arg2 : arg.split(",")) {
|
||||
// BaseBlock block = FaweCache.getBlock(arg, true, !useData);
|
||||
// blocks.add(block);
|
||||
// }
|
||||
// for (BaseBlock block : blocks) {
|
||||
// if (block.getData() != -1) {
|
||||
// int combined = FaweCache.getCombined(block);
|
||||
// map[combined] = pattern;
|
||||
// } else {
|
||||
// for (int data = 0; data < 16; data++) {
|
||||
// int combined = FaweCache.getCombined(block.getId(), data);
|
||||
// map[combined] = pattern;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// throw new InputParseException("Mask:Pattern must be a 1:1 match");
|
||||
// }
|
||||
}
|
||||
|
||||
public void addReplace(BaseBlock block, Pattern pattern) {
|
||||
// map[block.getCombined()] = pattern;
|
||||
}
|
||||
|
||||
// private final MutableBlockVector3 mutable = new MutableBlockVector3(0, 0, 0);
|
||||
|
||||
@Override
|
||||
public void applyBlock(int x, int y, int z, BaseBlock block, MutableLong ignore) {
|
||||
// int id = block.getId();
|
||||
// int data = FaweCache.hasData(id) ? block.getData() : 0;
|
||||
// int combined = FaweCache.getCombined(id, data);
|
||||
// Pattern p = map[combined];
|
||||
// if (p != null) {
|
||||
// BaseBlock newBlock = p.apply(x, y, z);
|
||||
// int currentId = block.getId();
|
||||
// if (FaweCache.hasNBT(currentId)) {
|
||||
// block.setNbtData(null);
|
||||
// }
|
||||
// block.setId(newBlock.getId());
|
||||
// block.setData(newBlock.getData());
|
||||
// }
|
||||
}
|
||||
}
|
@ -1,192 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAChunk;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFile;
|
||||
import com.boydti.fawe.object.RunnableVal4;
|
||||
import com.boydti.fawe.object.collection.LongHashSet;
|
||||
import com.github.intellectualsites.plotsquared.plot.PlotSquared;
|
||||
import com.github.intellectualsites.plotsquared.plot.generator.HybridGen;
|
||||
import com.github.intellectualsites.plotsquared.plot.generator.HybridPlotWorld;
|
||||
import com.github.intellectualsites.plotsquared.plot.generator.IndependentPlotGenerator;
|
||||
import com.github.intellectualsites.plotsquared.plot.object.Location;
|
||||
import com.github.intellectualsites.plotsquared.plot.object.Plot;
|
||||
import com.github.intellectualsites.plotsquared.plot.object.PlotArea;
|
||||
import com.github.intellectualsites.plotsquared.plot.util.expiry.ExpireManager;
|
||||
import com.sk89q.worldedit.world.World;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
import com.sk89q.worldedit.world.registry.LegacyMapper;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
|
||||
public class PlotTrimFilter extends DeleteUninhabitedFilter {
|
||||
private final HybridPlotWorld hpw;
|
||||
private final HybridGen hg;
|
||||
private final MCAChunk reference;
|
||||
private final LongHashSet occupiedRegions;
|
||||
private final LongHashSet unoccupiedChunks;
|
||||
private boolean referenceIsVoid;
|
||||
|
||||
public static boolean shouldSuggest(PlotArea area) {
|
||||
IndependentPlotGenerator gen = area.getGenerator();
|
||||
if (area instanceof HybridPlotWorld && gen instanceof HybridGen) {
|
||||
HybridPlotWorld hpw = (HybridPlotWorld) area;
|
||||
return hpw.PLOT_BEDROCK && !hpw.PLOT_SCHEMATIC && hpw.MAIN_BLOCK.getBlocks().size() == 1 && hpw.TOP_BLOCK.getBlocks().size() == 1;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public PlotTrimFilter(World world, long fileDuration, long inhabitedTicks, long chunkInactivity) {
|
||||
super(fileDuration, inhabitedTicks, chunkInactivity);
|
||||
Fawe.debug("Initializing Plot trim...");
|
||||
|
||||
String worldName = world.getName();
|
||||
PlotArea area = PlotSquared.get().getPlotAreaByString(worldName);
|
||||
IndependentPlotGenerator gen = area.getGenerator();
|
||||
if (!(area instanceof HybridPlotWorld) || !(gen instanceof HybridGen)) {
|
||||
throw new UnsupportedOperationException("Trim does not support non hybrid plot worlds");
|
||||
}
|
||||
this.hg = (HybridGen) gen;
|
||||
this.hpw = (HybridPlotWorld) area;
|
||||
if (hpw.PLOT_SCHEMATIC || hpw.MAIN_BLOCK.getBlocks().size() != 1 || hpw.TOP_BLOCK.getBlocks().size() != 1) {
|
||||
throw new UnsupportedOperationException("WIP - will implement later");
|
||||
}
|
||||
this.occupiedRegions = new LongHashSet();
|
||||
this.unoccupiedChunks = new LongHashSet();
|
||||
|
||||
this.reference = calculateReference();
|
||||
|
||||
Fawe.debug(" - calculating claims");
|
||||
this.calculateClaimedArea();
|
||||
}
|
||||
|
||||
private MCAChunk calculateReference() {
|
||||
MCAChunk reference = new MCAChunk(null, 0, 0);
|
||||
if (hpw.PLOT_BEDROCK) {
|
||||
reference.fillCuboid(0, 15, 0, 0, 0, 15, BlockTypes.BEDROCK.getInternalId());
|
||||
} else if (hpw.MAIN_BLOCK.hasSingleItem() && hpw.MAIN_BLOCK.getBlock().isAir() && hpw.TOP_BLOCK.hasSingleItem() && hpw.TOP_BLOCK.getBlock().isAir()) {
|
||||
referenceIsVoid = true;
|
||||
}
|
||||
reference.fillCuboid(0, 15, 1, hpw.PLOT_HEIGHT - 1, 0, 15, LegacyMapper.getInstance().getBaseBlockFromPlotBlock(hpw.MAIN_BLOCK.getBlock()).getInternalBlockTypeId());
|
||||
reference.fillCuboid(0, 15, hpw.PLOT_HEIGHT, hpw.PLOT_HEIGHT, 0, 15, LegacyMapper.getInstance().getBaseBlockFromPlotBlock(hpw.TOP_BLOCK.getBlock()).getInternalBlockTypeId());
|
||||
return reference;
|
||||
}
|
||||
|
||||
private void calculateClaimedArea() {
|
||||
ArrayList<Plot> plots = new ArrayList<>(hpw.getPlots());
|
||||
if (ExpireManager.IMP != null) {
|
||||
plots.removeAll(ExpireManager.IMP.getPendingExpired());
|
||||
}
|
||||
for (Plot plot : plots) {
|
||||
Location pos1 = plot.getBottom();
|
||||
Location pos2 = plot.getTop();
|
||||
int ccx1 = pos1.getX() >> 9;
|
||||
int ccz1 = pos1.getZ() >> 9;
|
||||
int ccx2 = pos2.getX() >> 9;
|
||||
int ccz2 = pos2.getZ() >> 9;
|
||||
for (int x = ccx1; x <= ccx2; x++) {
|
||||
for (int z = ccz1; z <= ccz2; z++) {
|
||||
if (!occupiedRegions.containsKey(x, z)) {
|
||||
occupiedRegions.add(x, z);
|
||||
int bcx = x << 5;
|
||||
int bcz = z << 5;
|
||||
int tcx = bcx + 32;
|
||||
int tcz = bcz + 32;
|
||||
for (int cz = bcz; cz < tcz; cz++) {
|
||||
for (int cx = bcx; cx < tcx; cx++) {
|
||||
unoccupiedChunks.add(cx, cz);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int cx1 = pos1.getX() >> 4;
|
||||
int cz1 = pos1.getZ() >> 4;
|
||||
int cx2 = pos2.getX() >> 4;
|
||||
int cz2 = pos2.getZ() >> 4;
|
||||
for (int cz = cz1; cz <= cz2; cz++) {
|
||||
for (int cx = cx1; cx <= cx2; cx++) {
|
||||
unoccupiedChunks.remove(cx, cz);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldDelete(File file, BasicFileAttributes attr, int mcaX, int mcaZ) throws IOException {
|
||||
Fawe.debug("Apply file: " + file);
|
||||
return !occupiedRegions.containsKey(mcaX, mcaZ) || super.shouldDelete(file, attr, mcaX, mcaZ);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldDeleteChunk(MCAFile mca, int cx, int cz) {
|
||||
return unoccupiedChunks.containsKey(cx, cz);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void filter(MCAFile mca, ForkJoinPool pool) throws IOException {
|
||||
if (reference == null) {
|
||||
super.filter(mca, pool);
|
||||
return;
|
||||
}
|
||||
Path file = mca.getFile().toPath();
|
||||
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);
|
||||
long creationDate = attr.creationTime().toMillis();
|
||||
|
||||
mca.forEachSortedChunk(new RunnableVal4<Integer, Integer, Integer, Integer>() {
|
||||
@Override
|
||||
public void run(Integer x, Integer z, Integer offset, Integer size) {
|
||||
int bx = mca.getX() << 5;
|
||||
int bz = mca.getZ() << 5;
|
||||
int cx = bx + x;
|
||||
int cz = bz + z;
|
||||
if (shouldDeleteChunk(mca, cx, cz)) {
|
||||
MCAChunk chunk = new MCAChunk(null, x, z);
|
||||
chunk.setDeleted(true);
|
||||
synchronized (mca) {
|
||||
mca.setChunk(chunk);
|
||||
}
|
||||
get().add(16 * 16 * 256);
|
||||
return;
|
||||
}
|
||||
Runnable task = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
MCAChunk chunk = mca.getChunk(x, z);
|
||||
if (chunk.getInhabitedTime() <= getInhabitedTicks()) {
|
||||
chunk.setDeleted(true);
|
||||
get().add(16 * 16 * 256);
|
||||
return;
|
||||
}
|
||||
if (referenceIsVoid) {
|
||||
for (int i = 0; i < chunk.ids.length; i++) {
|
||||
int[] arr = chunk.ids[i];
|
||||
if (arr != null) {
|
||||
for (int b : arr) {
|
||||
if (!BlockTypes.getFromStateId(b).getMaterial().isAir()) return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!reference.idsEqual(chunk, false)) {
|
||||
return;
|
||||
}
|
||||
chunk.setDeleted(true);
|
||||
get().add(16 * 16 * 256);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
};
|
||||
pool.submit(task);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
public class RegionFilter {
|
||||
}
|
@ -1,172 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
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.MutableMCABackedBaseBlock;
|
||||
import com.boydti.fawe.object.clipboard.remap.ClipboardRemapper;
|
||||
import com.boydti.fawe.object.collection.BlockVectorSet;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.boydti.fawe.util.ReflectionUtils;
|
||||
import com.sk89q.jnbt.ByteTag;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.jnbt.IntTag;
|
||||
import com.sk89q.jnbt.Tag;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
// TODO FIXME
|
||||
public class RemapFilter extends MCAFilterCounter {
|
||||
private final ClipboardRemapper remapper;
|
||||
private final ClipboardRemapper.RemapPlatform from;
|
||||
private boolean skipRemap;
|
||||
private List<CompoundTag> portals = Collections.synchronizedList(new ArrayList<>());
|
||||
private BlockVectorSet pLocs = new BlockVectorSet();
|
||||
private int dimension;
|
||||
|
||||
public RemapFilter(ClipboardRemapper remapper) {
|
||||
this.remapper = remapper;
|
||||
this.from = null;
|
||||
}
|
||||
|
||||
public RemapFilter(ClipboardRemapper.RemapPlatform from, ClipboardRemapper.RemapPlatform to) {
|
||||
this.remapper = new ClipboardRemapper(from, to);
|
||||
this.from = from;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAFile applyFile(MCAFile mca) {
|
||||
File file = mca.getFile();
|
||||
this.skipRemap = file.getName().endsWith(".mcapm");
|
||||
return super.applyFile(mca);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MCAChunk applyChunk(MCAChunk chunk, MutableLong cache) {
|
||||
if (skipRemap) return null;
|
||||
return super.applyChunk(chunk, cache);
|
||||
}
|
||||
|
||||
public List<CompoundTag> getPortals() {
|
||||
return portals;
|
||||
}
|
||||
|
||||
public void setDimension(int dimension) {
|
||||
this.dimension = dimension;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyBlock(int x, int y, int z, BaseBlock block, MutableLong cache) {
|
||||
// int id = block.getId();
|
||||
// if (remapper.hasRemap(id)) {
|
||||
// BaseBlock result = remapper.remap(block);
|
||||
// if (result != block) {
|
||||
// cache.add(1);
|
||||
// block.setId(id = result.getId());
|
||||
// if (id == 218) {
|
||||
// CompoundTag nbt = block.getNbtData();
|
||||
// if (nbt != null) {
|
||||
// Map<String, Tag> map = ReflectionUtils.getMap(nbt.getValue());
|
||||
// map.putIfAbsent("facing", new ByteTag((byte) block.getData()));
|
||||
// }
|
||||
// }
|
||||
// block.setData(result.getData());
|
||||
// }
|
||||
// }
|
||||
// if (from != null) {
|
||||
// outer:
|
||||
// switch (from) {
|
||||
// case PC: {
|
||||
// int newLight = 0;
|
||||
// switch (id) {
|
||||
// case 90: {
|
||||
// pLocs.add(x, y, z);
|
||||
// if (pLocs.contains(x, y - 1, z) || pLocs.contains(x - 1, y, z) || pLocs.contains(x, y, z - 1))
|
||||
// break;
|
||||
// Map<String, Tag> tag = new HashMap<>();
|
||||
// tag.put("Span", new ByteTag((byte) 1));
|
||||
// tag.put("TpX", new IntTag(x));
|
||||
// tag.put("TpY", new IntTag(y));
|
||||
// tag.put("TpZ", new IntTag(z));
|
||||
// tag.put("DimId", new IntTag(dimension));
|
||||
// int data = block.getData();
|
||||
// tag.put("Xa", new ByteTag((byte) ((data == 2) ? 0 : 1)));
|
||||
// tag.put("Za", new ByteTag((byte) ((data == 2) ? 1 : 0)));
|
||||
// portals.add(new CompoundTag(tag));
|
||||
// break;
|
||||
// }
|
||||
// case 29:
|
||||
// case 33: {
|
||||
// int data = block.getData();
|
||||
// Map<String, Object> map = new HashMap<>();
|
||||
// map.put("Progress", 1f);
|
||||
// map.put("State", (byte) 2);
|
||||
// map.put("LastProgress", 1f);
|
||||
// map.put("NewState", (byte) 2);
|
||||
// map.put("isMoveable", (byte) 0);
|
||||
// map.put("id", "PistonArm");
|
||||
// map.put("AttachedBlocks", new ArrayList<>());
|
||||
// map.put("Sticky", (byte) (id == 29 ? 1 : 0));
|
||||
// map.put("x", x);
|
||||
// map.put("y", y);
|
||||
// map.put("z", z);
|
||||
// block.setNbtData(FaweCache.asTag(map));
|
||||
// break;
|
||||
// }
|
||||
// case 44:
|
||||
// case 182:
|
||||
// case 158:
|
||||
// case 53:
|
||||
// case 67:
|
||||
// case 108:
|
||||
// case 109:
|
||||
// case 114:
|
||||
// case 128:
|
||||
// case 134:
|
||||
// case 135:
|
||||
// case 136:
|
||||
// case 156:
|
||||
// case 163:
|
||||
// case 164:
|
||||
// case 180:
|
||||
// case 203:
|
||||
// case 198:
|
||||
// MutableMCABackedBaseBlock mcaBlock = (MutableMCABackedBaseBlock) block;
|
||||
// MCAChunk chunk = mcaBlock.getChunk();
|
||||
// int currentLight = chunk.getSkyLight(x, y, z);
|
||||
// if (currentLight >= 14) {
|
||||
// break;
|
||||
// }
|
||||
// newLight = chunk.getSkyLight(x, (y + 1) & 0xFF, z);
|
||||
// if (newLight > currentLight) break;
|
||||
// if (x > 0) {
|
||||
// if ((newLight = chunk.getSkyLight(x - 1, y, z)) > currentLight) break;
|
||||
// }
|
||||
// if (x < 16) {
|
||||
// if ((newLight = chunk.getSkyLight(x + 1, y, z)) > currentLight) break;
|
||||
// }
|
||||
// if (z > 0) {
|
||||
// if ((newLight = chunk.getSkyLight(x, y, z - 1)) > currentLight) break;
|
||||
// }
|
||||
// if (z < 16) {
|
||||
// if ((newLight = chunk.getSkyLight(x, y, z + 1)) > currentLight) break;
|
||||
// }
|
||||
// default:
|
||||
// break outer;
|
||||
// }
|
||||
// if (newLight != 0) {
|
||||
// ((MutableMCABackedBaseBlock) block).getChunk().setSkyLight(x, y, z, newLight);
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.jnbt.anvil.MCAChunk;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class RemoveLayerFilter extends MCAFilterCounter {
|
||||
private final int startLayer;
|
||||
private final int endLayer;
|
||||
private final int minY, maxY;
|
||||
private final int id;
|
||||
|
||||
public RemoveLayerFilter(int minY, int maxY, int id) {
|
||||
this.minY = minY;
|
||||
this.maxY = maxY;
|
||||
this.startLayer = minY >> 4;
|
||||
this.endLayer = maxY >> 4;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public MCAChunk applyChunk(MCAChunk chunk, MutableLong cache) {
|
||||
for (int layer = startLayer; layer <= endLayer; layer++) {
|
||||
int[] ids = chunk.ids[layer];
|
||||
if (ids == null) {
|
||||
return null;
|
||||
}
|
||||
int startY = Math.max(minY, layer << 4) & 15;
|
||||
int endY = Math.min(maxY, 15 + (layer << 4)) & 15;
|
||||
for (int y = startY; y <= endY; y++) {
|
||||
int indexStart = y << 8;
|
||||
int indexEnd = indexStart + 255;
|
||||
for (int index = indexStart; index <= indexEnd; index++) {
|
||||
if (ids[index] != id) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int y = startY; y <= endY; y++) {
|
||||
int indexStart = y << 8;
|
||||
int indexEnd = indexStart + 255;
|
||||
Arrays.fill(ids, indexStart, indexEnd + 1, BlockTypes.AIR.getInternalId());
|
||||
}
|
||||
chunk.setModified();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
import com.boydti.fawe.object.mask.FaweBlockMatcher;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.function.pattern.Pattern;
|
||||
|
||||
// TODO FIXME
|
||||
public class ReplacePatternFilter extends MCAFilterCounter {
|
||||
private final FaweBlockMatcher matchFrom;
|
||||
private final Pattern to;
|
||||
|
||||
public ReplacePatternFilter(FaweBlockMatcher from, Pattern to) {
|
||||
this.matchFrom = from;
|
||||
this.to = to;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyBlock(int x, int y, int z, BaseBlock block, MutableLong ignore) {
|
||||
// if (matchFrom.apply(block)) {
|
||||
// BaseBlock newBlock = to.apply(x, y, z);
|
||||
// int currentId = block.getId();
|
||||
// if (FaweCache.hasNBT(currentId)) {
|
||||
// block.setNbtData(null);
|
||||
// }
|
||||
// block.setId(newBlock.getId());
|
||||
// block.setData(newBlock.getData());
|
||||
// }
|
||||
}
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
import com.boydti.fawe.object.mask.FaweBlockMatcher;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
|
||||
public class ReplaceSimpleFilter extends MCAFilterCounter {
|
||||
private final FaweBlockMatcher to;
|
||||
private final FaweBlockMatcher from;
|
||||
|
||||
public ReplaceSimpleFilter(FaweBlockMatcher from, FaweBlockMatcher to) {
|
||||
this.from = from;
|
||||
this.to = to;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyBlock(int x, int y, int z, BaseBlock block, MutableLong count) {
|
||||
if (from.apply(block)) {
|
||||
to.apply(block);
|
||||
count.increment();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilterCounter;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.function.pattern.Pattern;
|
||||
|
||||
// TODO FIXME
|
||||
public class SetPatternFilter extends MCAFilterCounter {
|
||||
private final Pattern to;
|
||||
|
||||
public SetPatternFilter(Pattern to) {
|
||||
this.to = to;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyBlock(int x, int y, int z, BaseBlock block, MutableLong count) {
|
||||
// BaseBlock newBlock = to.apply(x, y, z);
|
||||
// int currentId = block.getId();
|
||||
// if (FaweCache.hasNBT(currentId)) {
|
||||
// block.setNbtData(null);
|
||||
// }
|
||||
// block.setId(newBlock.getId());
|
||||
// block.setData(newBlock.getData());
|
||||
// count.increment();
|
||||
}
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.filters;
|
||||
|
||||
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.object.RunnableVal;
|
||||
import com.boydti.fawe.object.number.MutableLong;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
|
||||
public class TrimAirFilter extends MCAFilterCounter {
|
||||
@Override
|
||||
public MCAChunk applyChunk(MCAChunk chunk, MutableLong cache) {
|
||||
for (int layer = 0; layer < chunk.ids.length; layer++) {
|
||||
int[] idLayer = chunk.ids[layer];
|
||||
if (idLayer == null) continue;
|
||||
for (int i = 0; i < 4096; i++) {
|
||||
if (!BlockTypes.getFromStateId(idLayer[i]).getMaterial().isAir()) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
{ // Possibly dead code depending on the generator
|
||||
chunk.ids[layer] = null;
|
||||
chunk.setModified();
|
||||
}
|
||||
}
|
||||
cache.add(Character.MAX_VALUE);
|
||||
chunk.setDeleted(true);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finishFile(MCAFile file, MutableLong cache) {
|
||||
boolean[] deleteFile = { true };
|
||||
file.forEachCachedChunk(new RunnableVal<MCAChunk>() {
|
||||
@Override
|
||||
public void run(MCAChunk value) {
|
||||
if (!value.isDeleted()) {
|
||||
deleteFile[0] = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
if (deleteFile[0]) {
|
||||
file.setDeleted(true);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.history;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public interface IAnvilHistory {
|
||||
default boolean addFileChange(File originalMCAFile) {
|
||||
return originalMCAFile.delete();
|
||||
}
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
package com.boydti.fawe.jnbt.anvil.history;
|
||||
|
||||
public class NullAnvilHistory implements IAnvilHistory {
|
||||
}
|
@ -2,7 +2,7 @@ package com.boydti.fawe.object;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.object.changeset.FaweChangeSet;
|
||||
import com.boydti.fawe.object.queue.DelegateFaweQueue;
|
||||
import com.boydti.fawe.object.queue.DelegateIQueueExtent;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
@ -12,10 +12,10 @@ import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
import com.sk89q.worldedit.world.block.BlockType;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
|
||||
public class ChangeSetFaweQueue extends DelegateFaweQueue {
|
||||
public class ChangeSetIQueueExtent extends DelegateIQueueExtent {
|
||||
private FaweChangeSet set;
|
||||
|
||||
public ChangeSetFaweQueue(FaweChangeSet set, FaweQueue parent) {
|
||||
public ChangeSetIQueueExtent(FaweChangeSet set, IQueueExtent parent) {
|
||||
super(parent);
|
||||
this.set = set;
|
||||
}
|
||||
|
@ -119,10 +119,10 @@ public abstract class FawePlayer<T> extends Metadatable {
|
||||
}
|
||||
|
||||
public int cancel(boolean close) {
|
||||
// Collection<FaweQueue> queues = SetQueue.IMP.getAllQueues(); TODO NOT IMPLEMENTED
|
||||
// Collection<IQueueExtent> queues = SetQueue.IMP.getAllQueues(); TODO NOT IMPLEMENTED
|
||||
int cancelled = 0;
|
||||
// clearActions();
|
||||
// for (FaweQueue queue : queues) {
|
||||
// for (IQueueExtent queue : queues) {
|
||||
// Collection<EditSession> sessions = queue.getEditSessions();
|
||||
// for (EditSession session : sessions) {
|
||||
// FawePlayer currentPlayer = session.getPlayer();
|
||||
|
@ -4,7 +4,7 @@ import com.boydti.fawe.object.extent.FaweRegionExtent;
|
||||
import com.boydti.fawe.object.extent.HeightBoundExtent;
|
||||
import com.boydti.fawe.object.extent.MultiRegionExtent;
|
||||
import com.boydti.fawe.object.extent.SingleRegionExtent;
|
||||
import com.boydti.fawe.object.queue.DelegateFaweQueue;
|
||||
import com.boydti.fawe.object.queue.DelegateIQueueExtent;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.math.BlockVector2;
|
||||
@ -14,10 +14,10 @@ import com.sk89q.worldedit.regions.Region;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
|
||||
public class MaskedFaweQueue extends DelegateFaweQueue {
|
||||
public class MaskedIQueueExtent extends DelegateIQueueExtent {
|
||||
private FaweRegionExtent region;
|
||||
|
||||
public MaskedFaweQueue(FaweQueue parent, Region[] mask) {
|
||||
public MaskedIQueueExtent(IQueueExtent parent, Region[] mask) {
|
||||
super(parent);
|
||||
setMask(mask);
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.boydti.fawe.object.brush;
|
||||
|
||||
import com.boydti.fawe.config.BBC;
|
||||
import com.boydti.fawe.jnbt.anvil.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.brush.heightmap.HeightMap;
|
||||
import com.boydti.fawe.object.brush.heightmap.RotatableHeightMap;
|
||||
import com.boydti.fawe.object.brush.heightmap.ScalableHeightMap;
|
||||
@ -75,7 +75,7 @@ public class HeightBrush implements Brush {
|
||||
HeightMap map = getHeightMap();
|
||||
map.setSize(size);
|
||||
|
||||
FaweQueue queue = editSession.getQueue();
|
||||
IQueueExtent queue = editSession.getQueue();
|
||||
// Optimized application of height map
|
||||
if (queue instanceof HeightMapMCAGenerator) {
|
||||
HeightMapMCAGenerator hmmg = (HeightMapMCAGenerator) queue;
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.boydti.fawe.object.brush;
|
||||
|
||||
import com.boydti.fawe.beta.FilterBlock;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.collection.BlockVectorSet;
|
||||
import com.boydti.fawe.object.mask.AdjacentAnyMask;
|
||||
import com.boydti.fawe.object.mask.RadiusMask;
|
||||
@ -35,7 +35,7 @@ public class LayerBrush implements Brush {
|
||||
|
||||
@Override
|
||||
public void build(EditSession editSession, BlockVector3 position, Pattern ignore, double size) throws MaxChangedBlocksException {
|
||||
final FaweQueue queue = editSession.getQueue();
|
||||
final IQueueExtent queue = editSession.getQueue();
|
||||
final AdjacentAnyMask adjacent = new AdjacentAnyMask(new BlockMask(editSession).add(BlockTypes.AIR, BlockTypes.CAVE_AIR, BlockTypes.VOID_AIR));
|
||||
final SolidBlockMask solid = new SolidBlockMask(editSession);
|
||||
final RadiusMask radius = new RadiusMask(0, (int) size);
|
||||
|
@ -1,9 +1,7 @@
|
||||
package com.boydti.fawe.object.brush.visualization;
|
||||
|
||||
import com.boydti.fawe.example.IntFaweChunk;
|
||||
import com.boydti.fawe.example.NullQueueIntFaweChunk;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
@ -18,10 +16,10 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
||||
|
||||
public class VisualExtent extends AbstractDelegateExtent {
|
||||
|
||||
private final FaweQueue queue;
|
||||
private final IQueueExtent queue;
|
||||
private Long2ObjectMap<VisualChunk> chunks = new Long2ObjectOpenHashMap<>();
|
||||
|
||||
public VisualExtent(Extent parent, FaweQueue queue) {
|
||||
public VisualExtent(Extent parent, IQueueExtent queue) {
|
||||
super(parent);
|
||||
this.queue = queue;
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
package com.boydti.fawe.object.brush.visualization.cfi;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.FaweInputStream;
|
||||
import com.boydti.fawe.object.FaweOutputStream;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
@ -15,7 +16,6 @@ import com.boydti.fawe.object.collection.IterableThreadLocal;
|
||||
import com.boydti.fawe.object.collection.LocalBlockVector2DSet;
|
||||
import com.boydti.fawe.object.collection.SummedAreaTable;
|
||||
import com.boydti.fawe.object.exception.FaweException;
|
||||
import com.boydti.fawe.object.queue.LazyFaweChunk;
|
||||
import com.boydti.fawe.object.schematic.Schematic;
|
||||
import com.boydti.fawe.util.CachedTextureUtil;
|
||||
import com.boydti.fawe.util.RandomTextureUtil;
|
||||
@ -202,7 +202,7 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
blocks.clearChanges(); // blocks.redoChanges(in); Unsupported
|
||||
}
|
||||
|
||||
@Override
|
||||
// @Override TODO NOT IMPLEMENTED
|
||||
public void addEditSession(EditSession session) {
|
||||
session.setFastMode(true);
|
||||
this.editSession = session;
|
||||
@ -212,7 +212,7 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
private ImageViewer viewer;
|
||||
// Used for visualizing the world by sending chunk packets
|
||||
// These three variables should be set together
|
||||
// private FaweQueue packetQueue;
|
||||
// private IQueueExtent packetQueue;
|
||||
private FawePlayer player;
|
||||
private BlockVector2 chunkOffset = BlockVector2.ZERO;
|
||||
private EditSession editSession;
|
||||
@ -283,44 +283,44 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
if (viewer != null) {
|
||||
viewer.view(this);
|
||||
}
|
||||
if (chunkOffset != null && player != null) {
|
||||
FaweQueue packetQueue = SetQueue.IMP.getNewQueue(player.getWorld(), true, false);
|
||||
|
||||
if (!packetQueue.supports(Capability.CHUNK_PACKETS)) {
|
||||
return;
|
||||
}
|
||||
|
||||
int lenCX = (getWidth() + 15) >> 4;
|
||||
int lenCZ = (getLength() + 15) >> 4;
|
||||
|
||||
int OX = chunkOffset.getBlockX();
|
||||
int OZ = chunkOffset.getBlockZ();
|
||||
|
||||
Location position = player.getLocation();
|
||||
int pcx = (position.getBlockX() >> 4) - OX;
|
||||
int pcz = (position.getBlockZ() >> 4) - OZ;
|
||||
|
||||
int scx = Math.max(0, pcx - 15);
|
||||
int scz = Math.max(0, pcz - 15);
|
||||
int ecx = Math.min(lenCX - 1, pcx + 15);
|
||||
int ecz = Math.min(lenCZ - 1, pcz + 15);
|
||||
|
||||
for (int cz = scz; cz <= ecz; cz++) {
|
||||
for (int cx = scx; cx <= ecx; cx++) {
|
||||
final int finalCX = cx;
|
||||
final int finalCZ = cz;
|
||||
TaskManager.IMP.getPublicForkJoinPool().submit(() -> {
|
||||
try {
|
||||
FaweChunk toSend = getSnapshot(finalCX, finalCZ);
|
||||
toSend.setLoc(HeightMapMCAGenerator.this, finalCX + OX, finalCZ + OZ);
|
||||
packetQueue.sendChunkUpdate(toSend, player);
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
// if (chunkOffset != null && player != null) { TODO NOT IMPLEMENTED
|
||||
// IQueueExtent packetQueue = SetQueue.IMP.getNewQueue(player.getWorld(), true, false);
|
||||
//
|
||||
// if (!packetQueue.supports(Capability.CHUNK_PACKETS)) {
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// int lenCX = (getWidth() + 15) >> 4;
|
||||
// int lenCZ = (getLength() + 15) >> 4;
|
||||
//
|
||||
// int OX = chunkOffset.getBlockX();
|
||||
// int OZ = chunkOffset.getBlockZ();
|
||||
//
|
||||
// Location position = player.getLocation();
|
||||
// int pcx = (position.getBlockX() >> 4) - OX;
|
||||
// int pcz = (position.getBlockZ() >> 4) - OZ;
|
||||
//
|
||||
// int scx = Math.max(0, pcx - 15);
|
||||
// int scz = Math.max(0, pcz - 15);
|
||||
// int ecx = Math.min(lenCX - 1, pcx + 15);
|
||||
// int ecz = Math.min(lenCZ - 1, pcz + 15);
|
||||
//
|
||||
// for (int cz = scz; cz <= ecz; cz++) {
|
||||
// for (int cx = scx; cx <= ecx; cx++) {
|
||||
// final int finalCX = cx;
|
||||
// final int finalCZ = cz;
|
||||
// TaskManager.IMP.getPublicForkJoinPool().submit(() -> {
|
||||
// try {
|
||||
// FaweChunk toSend = getSnapshot(finalCX, finalCZ);
|
||||
// toSend.setLoc(HeightMapMCAGenerator.this, finalCX + OX, finalCZ + OZ);
|
||||
// packetQueue.sendChunkUpdate(toSend, player);
|
||||
// } catch (Throwable e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
public TextureUtil getRawTextureUtil() {
|
||||
@ -705,13 +705,7 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
return setBlock(position.getBlockX(), position.getBlockY(), position.getBlockZ(), block);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBiome(BlockVector2 position, BiomeType biome) {
|
||||
return this.setBiome(position.getBlockX(), position.getBlockZ(), biome);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBlock(int x, int y, int z, int combined) {
|
||||
private boolean setBlock(int x, int y, int z, int combined) {
|
||||
int index = z * getWidth() + x;
|
||||
if (index < 0 || index >= getArea()) return false;
|
||||
int height = heights.getByte(index) & 0xFF;
|
||||
@ -732,8 +726,6 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
combined = floorId;
|
||||
default:
|
||||
try {
|
||||
short chunkX = (short) (x >> 4);
|
||||
short chunkZ = (short) (z >> 4);
|
||||
blocks.set(x, y, z, combined);
|
||||
return true;
|
||||
} catch (IndexOutOfBoundsException ignore) {
|
||||
@ -750,79 +742,79 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk getFaweChunk(int chunkX, int chunkZ) {
|
||||
return new SimpleIntFaweChunk(this, chunkX, chunkZ);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk getSnapshot(int chunkX, int chunkZ) {
|
||||
return getSnapshot(null, chunkX, chunkZ);
|
||||
}
|
||||
|
||||
private FaweChunk getSnapshot(final WritableMCAChunk chunk, int chunkX, int chunkZ) {
|
||||
return new LazyFaweChunk<WritableMCAChunk>(this, chunkX, chunkZ) {
|
||||
@Override
|
||||
public WritableMCAChunk getChunk() {
|
||||
WritableMCAChunk tmp = chunk;
|
||||
if (tmp == null) {
|
||||
tmp = new WritableMCAChunk();
|
||||
}
|
||||
tmp.setLoc(HeightMapMCAGenerator.this, chunkX, chunkZ);
|
||||
int cbx = chunkX << 4;
|
||||
int cbz = chunkZ << 4;
|
||||
int csx = Math.max(0, cbx);
|
||||
int csz = Math.max(0, cbz);
|
||||
int cex = Math.min(getWidth(), cbx + 15);
|
||||
int cez = Math.min(getLength(), cbz + 15);
|
||||
write(tmp, csx, cex, csz, cez);
|
||||
tmp.setLoc(HeightMapMCAGenerator.this, getX(), getZ());
|
||||
return tmp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addToQueue() {
|
||||
WritableMCAChunk cached = getCachedChunk();
|
||||
if (cached != null) setChunk(cached);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<FaweChunk> getFaweChunks() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setChunk(FaweChunk chunk) {
|
||||
int[][] src = chunk.getCombinedIdArrays();
|
||||
for (int i = 0; i < src.length; i++) {
|
||||
if (src[i] != null) {
|
||||
int bx = chunk.getX() << 4;
|
||||
int bz = chunk.getZ() << 4;
|
||||
int by = i << 4;
|
||||
for (int layer = i; layer < src.length; layer++) {
|
||||
int[] srcLayer = src[layer];
|
||||
if (srcLayer != null) {
|
||||
int index = 0;
|
||||
for (int y = 0; y < 16; y++) {
|
||||
int yy = by + y;
|
||||
for (int z = 0; z < 16; z++) {
|
||||
int zz = bz + z;
|
||||
for (int x = 0; x < 16; x++, index++) {
|
||||
int combined = srcLayer[index];
|
||||
if (combined != 0) {
|
||||
setBlock(bx + x, yy, zz, combined);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// @Override TODO NOT IMPLEMENTED
|
||||
// public FaweChunk getFaweChunk(int chunkX, int chunkZ) {
|
||||
// return new SimpleIntFaweChunk(this, chunkX, chunkZ);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public FaweChunk getSnapshot(int chunkX, int chunkZ) {
|
||||
// return getSnapshot(null, chunkX, chunkZ);
|
||||
// }
|
||||
//
|
||||
// private FaweChunk getSnapshot(final WritableMCAChunk chunk, int chunkX, int chunkZ) {
|
||||
// return new LazyFaweChunk<WritableMCAChunk>(this, chunkX, chunkZ) {
|
||||
// @Override
|
||||
// public WritableMCAChunk getChunk() {
|
||||
// WritableMCAChunk tmp = chunk;
|
||||
// if (tmp == null) {
|
||||
// tmp = new WritableMCAChunk();
|
||||
// }
|
||||
// tmp.setLoc(HeightMapMCAGenerator.this, chunkX, chunkZ);
|
||||
// int cbx = chunkX << 4;
|
||||
// int cbz = chunkZ << 4;
|
||||
// int csx = Math.max(0, cbx);
|
||||
// int csz = Math.max(0, cbz);
|
||||
// int cex = Math.min(getWidth(), cbx + 15);
|
||||
// int cez = Math.min(getLength(), cbz + 15);
|
||||
// write(tmp, csx, cex, csz, cez);
|
||||
// tmp.setLoc(HeightMapMCAGenerator.this, getX(), getZ());
|
||||
// return tmp;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void addToQueue() {
|
||||
// WritableMCAChunk cached = getCachedChunk();
|
||||
// if (cached != null) setChunk(cached);
|
||||
// }
|
||||
// };
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Collection<FaweChunk> getFaweChunks() {
|
||||
// return Collections.emptyList();
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void setChunk(FaweChunk chunk) {
|
||||
// int[][] src = chunk.getCombinedIdArrays();
|
||||
// for (int i = 0; i < src.length; i++) {
|
||||
// if (src[i] != null) {
|
||||
// int bx = chunk.getX() << 4;
|
||||
// int bz = chunk.getZ() << 4;
|
||||
// int by = i << 4;
|
||||
// for (int layer = i; layer < src.length; layer++) {
|
||||
// int[] srcLayer = src[layer];
|
||||
// if (srcLayer != null) {
|
||||
// int index = 0;
|
||||
// for (int y = 0; y < 16; y++) {
|
||||
// int yy = by + y;
|
||||
// for (int z = 0; z < 16; z++) {
|
||||
// int zz = bz + z;
|
||||
// for (int x = 0; x < 16; x++, index++) {
|
||||
// int combined = srcLayer[index];
|
||||
// if (combined != 0) {
|
||||
// setBlock(bx + x, yy, zz, combined);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
@Override
|
||||
public File getSaveFolder() {
|
||||
@ -835,18 +827,9 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
return false;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public void sendBlockUpdate(FaweChunk chunk, FawePlayer... players) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flush(int time) {
|
||||
next(0, time);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean next(int amount, long time) {
|
||||
public Operation commit() {
|
||||
EditSession curES = editSession;
|
||||
if (curES != null && isModified()) {
|
||||
try {
|
||||
@ -863,15 +846,7 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
}
|
||||
}
|
||||
clear();
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendChunk(FaweChunk chunk) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendChunk(int x, int z, int bitMask) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -883,7 +858,7 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
public void close(boolean update) {
|
||||
clear();
|
||||
if (chunkOffset != null && player != null && update) {
|
||||
FaweQueue packetQueue = SetQueue.IMP.getNewQueue(player.getWorld(), true, false);
|
||||
IQueueExtent packetQueue = SetQueue.IMP.getNewQueue(player.getWorld(), true, false);
|
||||
|
||||
int lenCX = (getWidth() + 15) >> 4;
|
||||
int lenCZ = (getLength() + 15) >> 4;
|
||||
@ -965,41 +940,6 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCombinedId4Data(int x, int y, int z, int def) {
|
||||
return getCombinedId4Data(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCachedCombinedId4Data(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return getCombinedId4Data(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSky() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSkyLight(int x, int y, int z) {
|
||||
return getNearestSurfaceTerrainBlock(x, z, y, 0, 255) < y ? 15 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getEmmittedLight(int x, int y, int z) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompoundTag getTileEntity(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBlock(int x, int y, int z, BlockStateHolder block) throws WorldEditException {
|
||||
return this.setBlock(x, y, z, block.getInternalId());
|
||||
@ -1980,87 +1920,6 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
return 255;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWorld(String world) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public World getWEWorld() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getWorldName() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getModified() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setModified(long modified) {
|
||||
// Unsupported
|
||||
}
|
||||
|
||||
@Override
|
||||
public RunnableVal2<ProgressType, Integer> getProgressTask() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProgressTask(RunnableVal2<ProgressType, Integer> progressTask) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setChangeTask(RunnableVal2<FaweChunk, FaweChunk> changeTask) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public RunnableVal2<FaweChunk, FaweChunk> getChangeTask() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SetQueue.QueueStage getStage() {
|
||||
return SetQueue.QueueStage.NONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStage(SetQueue.QueueStage stage) {
|
||||
// Not supported
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addNotifyTask(Runnable runnable) {
|
||||
runnable.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runTasks() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTask(Runnable whenFree) {
|
||||
whenFree.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return !isModified();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Operation commit() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
File folder = getFolder();
|
||||
@ -2121,4 +1980,4 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
package com.boydti.fawe.object.brush.visualization.cfi;
|
||||
|
||||
import com.boydti.fawe.object.collection.IterableThreadLocal;
|
||||
import com.boydti.fawe.object.io.BufferedRandomAccessFile;
|
@ -1,7 +1,7 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
package com.boydti.fawe.object.brush.visualization.cfi;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.collection.BitArray4096;
|
||||
import com.boydti.fawe.object.io.FastByteArrayOutputStream;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
@ -23,7 +23,7 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class WritableMCAChunk extends FaweChunk<Void> {
|
||||
public class WritableMCAChunk {
|
||||
public final boolean[] hasSections = new boolean[16];
|
||||
public final byte[] skyLight = new byte[65536];
|
||||
public final byte[] blockLight = new byte[65536];
|
||||
@ -44,7 +44,6 @@ public class WritableMCAChunk extends FaweChunk<Void> {
|
||||
public int chunkX, chunkZ;
|
||||
|
||||
protected WritableMCAChunk() {
|
||||
super(null, 0, 0);
|
||||
}
|
||||
|
||||
public int getX() {
|
||||
@ -100,7 +99,7 @@ public class WritableMCAChunk extends FaweChunk<Void> {
|
||||
out.writeNamedEmptyList("TileEntities");
|
||||
} else {
|
||||
out.writeNamedTag("TileEntities", new ListTag(CompoundTag.class,
|
||||
new ArrayList<>(tiles.values())));
|
||||
new ArrayList<>(tiles.values())));
|
||||
}
|
||||
out.writeNamedTag("InhabitedTime", inhabitedTime);
|
||||
out.writeNamedTag("LastUpdate", lastUpdate);
|
||||
@ -405,20 +404,7 @@ public class WritableMCAChunk extends FaweChunk<Void> {
|
||||
Arrays.fill(biomes, (byte) biome.getInternalId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk<Void> copy(boolean shallow) {
|
||||
throw new UnsupportedOperationException("Unsupported");
|
||||
}
|
||||
|
||||
public void removeEntity(UUID uuid) {
|
||||
entities.remove(uuid);
|
||||
}
|
||||
|
||||
public Void getChunk() {
|
||||
throw new UnsupportedOperationException("Not applicable for this");
|
||||
}
|
||||
|
||||
public FaweChunk call() {
|
||||
throw new UnsupportedOperationException("Not supported");
|
||||
}
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package com.boydti.fawe.object.change;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.jnbt.anvil.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.util.ExtentTraverser;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.history.UndoContext;
|
||||
@ -23,9 +23,9 @@ public class CFIChange implements Change {
|
||||
}
|
||||
|
||||
private HeightMapMCAGenerator getQueue(UndoContext context) {
|
||||
ExtentTraverser found = new ExtentTraverser(context.getExtent()).find(HasFaweQueue.class);
|
||||
ExtentTraverser found = new ExtentTraverser(context.getExtent()).find(HasIQueueExtent.class);
|
||||
if (found != null) {
|
||||
FaweQueue queue = ((HasFaweQueue) found.get()).getQueue();
|
||||
IQueueExtent queue = ((HasIQueueExtent) found.get()).getQueue();
|
||||
if (queue instanceof HeightMapMCAGenerator) return (HeightMapMCAGenerator) queue;
|
||||
}
|
||||
Fawe.debug("FAWE does not support: " + context.getExtent() + " for " + getClass() + " (bug Empire92)");
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.boydti.fawe.object.change;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.util.ExtentTraverser;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.extent.Extent;
|
||||
@ -34,7 +34,7 @@ public class MutableBlockChange implements Change {
|
||||
create(context);
|
||||
}
|
||||
|
||||
private FaweQueue queue;
|
||||
private IQueueExtent queue;
|
||||
private boolean checkedQueue;
|
||||
|
||||
public void create(UndoContext context) {
|
||||
@ -44,9 +44,9 @@ public class MutableBlockChange implements Change {
|
||||
if (!checkedQueue) {
|
||||
checkedQueue = true;
|
||||
Extent extent = context.getExtent();
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class);
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasIQueueExtent.class);
|
||||
if (found != null) {
|
||||
(queue = ((HasFaweQueue) found.get()).getQueue()).setBlock(x, y, z, combinedId);
|
||||
(queue = ((HasIQueueExtent) found.get()).getQueue()).setBlock(x, y, z, combinedId);
|
||||
} else {
|
||||
Fawe.debug("FAWE does not support: " + extent + " for " + getClass() + " (bug Empire92)");
|
||||
}
|
||||
|
@ -2,8 +2,8 @@ package com.boydti.fawe.object.change;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.util.ExtentTraverser;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.extent.Extent;
|
||||
@ -33,7 +33,7 @@ public class MutableChunkChange implements Change {
|
||||
create(context, false);
|
||||
}
|
||||
|
||||
private FaweQueue queue;
|
||||
private IQueueExtent queue;
|
||||
private boolean checkedQueue;
|
||||
|
||||
public void create(UndoContext context, boolean undo) {
|
||||
@ -43,16 +43,16 @@ public class MutableChunkChange implements Change {
|
||||
if (!checkedQueue) {
|
||||
checkedQueue = true;
|
||||
Extent extent = context.getExtent();
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class);
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasIQueueExtent.class);
|
||||
if (found != null) {
|
||||
perform(queue = ((HasFaweQueue) found.get()).getQueue(), undo);
|
||||
perform(queue = ((HasIQueueExtent) found.get()).getQueue(), undo);
|
||||
} else {
|
||||
Fawe.debug("FAWE does not support: " + extent + " for " + getClass() + " (bug Empire92)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void perform(FaweQueue queue, boolean undo) {
|
||||
public void perform(IQueueExtent queue, boolean undo) {
|
||||
if (undo) {
|
||||
if (checkEmpty) {
|
||||
int[][] previousIds = from.getCombinedIdArrays();
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.boydti.fawe.object.change;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.object.extent.FastWorldEditExtent;
|
||||
import com.boydti.fawe.util.ExtentTraverser;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
@ -75,7 +75,7 @@ public class MutableEntityChange implements Change {
|
||||
}
|
||||
}
|
||||
|
||||
private FaweQueue queue;
|
||||
private IQueueExtent queue;
|
||||
private boolean checkedQueue;
|
||||
|
||||
public void create(UndoContext context) {
|
||||
@ -85,16 +85,16 @@ public class MutableEntityChange implements Change {
|
||||
if (!checkedQueue) {
|
||||
checkedQueue = true;
|
||||
Extent extent = context.getExtent();
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class);
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasIQueueExtent.class);
|
||||
if (found != null) {
|
||||
perform(queue = ((HasFaweQueue) found.get()).getQueue());
|
||||
perform(queue = ((HasIQueueExtent) found.get()).getQueue());
|
||||
} else {
|
||||
Fawe.debug("FAWE does not support: " + extent + " for " + getClass() + " (bug Empire92)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void perform(FaweQueue queue) {
|
||||
public void perform(IQueueExtent queue) {
|
||||
Map<String, Tag> map = tag.getValue();
|
||||
Tag posTag = map.get("Pos");
|
||||
if (posTag == null) {
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.boydti.fawe.object.change;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.util.ExtentTraverser;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.extent.Extent;
|
||||
@ -41,7 +41,7 @@ public class MutableFullBlockChange implements Change {
|
||||
create(context);
|
||||
}
|
||||
|
||||
private FaweQueue queue;
|
||||
private IQueueExtent queue;
|
||||
private boolean checkedQueue;
|
||||
|
||||
public void create(UndoContext context) {
|
||||
@ -51,16 +51,16 @@ public class MutableFullBlockChange implements Change {
|
||||
if (!checkedQueue) {
|
||||
checkedQueue = true;
|
||||
Extent extent = context.getExtent();
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class);
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasIQueueExtent.class);
|
||||
if (found != null) {
|
||||
perform(queue = ((HasFaweQueue) found.get()).getQueue());
|
||||
perform(queue = ((HasIQueueExtent) found.get()).getQueue());
|
||||
} else {
|
||||
Fawe.debug("FAWE does not support: " + extent + " for " + getClass() + " (bug Empire92)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void perform(FaweQueue queue) {
|
||||
public void perform(IQueueExtent queue) {
|
||||
BlockType idFrom = BlockTypes.getFromStateId(from);
|
||||
if (blockBag != null) {
|
||||
BlockType idTo = BlockTypes.getFromStateId(to);
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.boydti.fawe.object.change;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.util.ExtentTraverser;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.jnbt.IntTag;
|
||||
@ -37,7 +37,7 @@ public class MutableTileChange implements Change {
|
||||
}
|
||||
}
|
||||
|
||||
private FaweQueue queue;
|
||||
private IQueueExtent queue;
|
||||
private boolean checkedQueue;
|
||||
|
||||
public void create(UndoContext context) {
|
||||
@ -47,16 +47,16 @@ public class MutableTileChange implements Change {
|
||||
if (!checkedQueue) {
|
||||
checkedQueue = true;
|
||||
Extent extent = context.getExtent();
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class);
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasIQueueExtent.class);
|
||||
if (found != null) {
|
||||
perform(queue = ((HasFaweQueue) found.get()).getQueue());
|
||||
perform(queue = ((HasIQueueExtent) found.get()).getQueue());
|
||||
} else {
|
||||
Fawe.debug("FAWE does not support: " + extent + " for " + getClass() + " (bug Empire92)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void perform(FaweQueue queue) {
|
||||
public void perform(IQueueExtent queue) {
|
||||
Map<String, Tag> map = tag.getValue();
|
||||
int x = ((IntTag) map.get("x")).getValue();
|
||||
int y = ((IntTag) map.get("y")).getValue();
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.boydti.fawe.object.changeset;
|
||||
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
@ -29,7 +29,7 @@ public class AbstractDelegateChangeSet extends FaweChangeSet {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addChangeTask(FaweQueue queue) {
|
||||
public void addChangeTask(IQueueExtent queue) {
|
||||
super.addChangeTask(queue);
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@ package com.boydti.fawe.object.changeset;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.config.Settings;
|
||||
import com.boydti.fawe.jnbt.anvil.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
|
||||
import com.boydti.fawe.object.change.CFIChange;
|
||||
import com.boydti.fawe.util.MainUtil;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.boydti.fawe.object.changeset;
|
||||
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.RunnableVal2;
|
||||
import com.boydti.fawe.object.change.MutableChunkChange;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
@ -20,7 +20,7 @@ public class CPUOptimizedChangeSet extends FaweChangeSet {
|
||||
|
||||
private ArrayList<Change> changes = new ArrayList<>();
|
||||
|
||||
public void addChangeTask(FaweQueue queue) {
|
||||
public void addChangeTask(IQueueExtent queue) {
|
||||
queue.setChangeTask(new RunnableVal2<FaweChunk, FaweChunk>() {
|
||||
@Override
|
||||
public void run(final FaweChunk previous, final FaweChunk next) {
|
||||
|
@ -1,8 +1,8 @@
|
||||
package com.boydti.fawe.object.changeset;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.object.RegionWrapper;
|
||||
import com.boydti.fawe.util.ExtentTraverser;
|
||||
import com.boydti.fawe.util.MainUtil;
|
||||
@ -23,7 +23,7 @@ public class MutableAnvilChange implements Change {
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
private FaweQueue queue;
|
||||
private IQueueExtent queue;
|
||||
private boolean checkedQueue;
|
||||
|
||||
@Override
|
||||
@ -34,9 +34,9 @@ public class MutableAnvilChange implements Change {
|
||||
if (!checkedQueue) {
|
||||
checkedQueue = true;
|
||||
Extent extent = context.getExtent();
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasFaweQueue.class);
|
||||
ExtentTraverser found = new ExtentTraverser(extent).find(HasIQueueExtent.class);
|
||||
if (found != null) {
|
||||
queue = ((HasFaweQueue) found.get()).getQueue();
|
||||
queue = ((HasIQueueExtent) found.get()).getQueue();
|
||||
destDir = queue.getSaveFolder().toPath();
|
||||
perform(queue);
|
||||
} else {
|
||||
@ -45,7 +45,7 @@ public class MutableAnvilChange implements Change {
|
||||
}
|
||||
}
|
||||
|
||||
public void perform(FaweQueue queue) {
|
||||
public void perform(IQueueExtent queue) {
|
||||
Path dest = destDir.resolve(source.getFileName());
|
||||
try {
|
||||
Files.move(source, dest, StandardCopyOption.ATOMIC_MOVE);
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.boydti.fawe.jnbt.anvil;
|
||||
package com.boydti.fawe.object.collection;
|
||||
|
||||
public final class BitArray4096 {
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.boydti.fawe.object.extent;
|
||||
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.util.ReflectionUtils;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.jnbt.DoubleTag;
|
||||
@ -30,19 +30,19 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class FastWorldEditExtent extends AbstractDelegateExtent implements HasFaweQueue {
|
||||
public class FastWorldEditExtent extends AbstractDelegateExtent implements HasIQueueExtent {
|
||||
|
||||
private final World world;
|
||||
private FaweQueue queue;
|
||||
private IQueueExtent queue;
|
||||
|
||||
public FastWorldEditExtent(final World world, FaweQueue queue) {
|
||||
public FastWorldEditExtent(final World world, IQueueExtent queue) {
|
||||
super(queue);
|
||||
this.world = world;
|
||||
this.queue = queue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweQueue getQueue() {
|
||||
public IQueueExtent getQueue() {
|
||||
return queue;
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@ package com.boydti.fawe.object.progress;
|
||||
import com.boydti.fawe.config.BBC;
|
||||
import com.boydti.fawe.config.Settings;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.RunnableVal2;
|
||||
import com.boydti.fawe.util.StringMan;
|
||||
import com.boydti.fawe.util.TaskManager;
|
||||
@ -11,7 +11,7 @@ import com.boydti.fawe.util.TaskManager;
|
||||
/**
|
||||
* The default progress tracker uses titles
|
||||
*/
|
||||
public class DefaultProgressTracker extends RunnableVal2<FaweQueue.ProgressType, Integer> {
|
||||
public class DefaultProgressTracker extends RunnableVal2<IQueueExtent.ProgressType, Integer> {
|
||||
|
||||
private final FawePlayer player;
|
||||
private final long start;
|
||||
@ -55,7 +55,7 @@ public class DefaultProgressTracker extends RunnableVal2<FaweQueue.ProgressType,
|
||||
private boolean done = false;
|
||||
|
||||
@Override
|
||||
public void run(FaweQueue.ProgressType type, Integer amount) {
|
||||
public void run(IQueueExtent.ProgressType type, Integer amount) {
|
||||
switch (type) {
|
||||
case DISPATCH:
|
||||
amountDispatch++;
|
||||
|
@ -1,25 +0,0 @@
|
||||
package com.boydti.fawe.object.queue;
|
||||
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
|
||||
public class DelegateFaweQueue implements IDelegateFaweQueue {
|
||||
private FaweQueue parent;
|
||||
|
||||
public DelegateFaweQueue(FaweQueue parent) {
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
public FaweQueue getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
public void setParent(FaweQueue parent) {
|
||||
this.parent = parent;
|
||||
setWorld(getQueue().getWorldName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweQueue getQueue() {
|
||||
return parent;
|
||||
}
|
||||
}
|
@ -1,89 +0,0 @@
|
||||
package com.boydti.fawe.object.queue;
|
||||
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.exception.FaweException;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
|
||||
import com.sk89q.worldedit.extent.Extent;
|
||||
import com.sk89q.worldedit.math.BlockVector2;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.math.MutableBlockVector2;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
public class FaweQueueDelegateExtent extends DelegateFaweQueue {
|
||||
private final FaweQueue parentQueue;
|
||||
private final Extent parentExtent;
|
||||
// private final MutableBlockVector2 mutable2d = new MutableBlockVector2();
|
||||
|
||||
public FaweQueueDelegateExtent(FaweQueue parentQueue, Extent parentExtent) {
|
||||
super(parentQueue);
|
||||
checkNotNull(parentExtent);
|
||||
checkNotNull(parentQueue);
|
||||
this.parentQueue = parentQueue;
|
||||
this.parentExtent = parentExtent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBlock(int x, int y, int z, int combinedId) {
|
||||
return setBlock(x, y, z, BlockState.getFromInternalId(combinedId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBlock(int x, int y, int z, int combinedId, CompoundTag nbt) {
|
||||
if (nbt != null) {
|
||||
return setBlock(x, y, z, BaseBlock.getFromInternalId(combinedId, nbt));
|
||||
}
|
||||
return setBlock(x, y, z, BlockState.getFromInternalId(combinedId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCachedCombinedId4Data(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return getCombinedId4Data(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCombinedId4Data(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return getBlock(x, y, z).getInternalId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompoundTag getTileEntity(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return getFullBlock(BlockVector3.at(x, y, z)).getNbtData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BiomeType getBiomeType(int x, int z) throws FaweException.FaweChunkLoadException {
|
||||
return parentExtent.getBiome(BlockVector2.at(x, z));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBiome(BlockVector2 position, BiomeType biome) {
|
||||
return parentExtent.setBiome(position, biome);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getBlock(BlockVector3 position) {
|
||||
return parentExtent.getBlock(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BiomeType getBiome(BlockVector2 position) {
|
||||
return parentExtent.getBiome(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBlock(BlockVector3 position, BlockStateHolder block) throws WorldEditException {
|
||||
return parentExtent.setBlock(position, block);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBlock(int x, int y, int z, BlockStateHolder block) throws WorldEditException {
|
||||
return parentExtent.setBlock(x, y, z, block);
|
||||
}
|
||||
}
|
@ -1,507 +0,0 @@
|
||||
package com.boydti.fawe.object.queue;
|
||||
|
||||
import com.boydti.fawe.config.Settings;
|
||||
import com.boydti.fawe.example.Relighter;
|
||||
import com.boydti.fawe.jnbt.anvil.generator.GenBase;
|
||||
import com.boydti.fawe.jnbt.anvil.generator.Resource;
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.RegionWrapper;
|
||||
import com.boydti.fawe.object.RunnableVal2;
|
||||
import com.boydti.fawe.object.exception.FaweException;
|
||||
import com.boydti.fawe.util.SetQueue;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.entity.BaseEntity;
|
||||
import com.sk89q.worldedit.entity.Entity;
|
||||
import com.sk89q.worldedit.function.mask.Mask;
|
||||
import com.sk89q.worldedit.function.operation.Operation;
|
||||
import com.sk89q.worldedit.function.pattern.Pattern;
|
||||
import com.sk89q.worldedit.math.BlockVector2;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
import com.sk89q.worldedit.regions.Region;
|
||||
import com.sk89q.worldedit.session.ClipboardHolder;
|
||||
import com.sk89q.worldedit.util.Location;
|
||||
import com.sk89q.worldedit.world.World;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
import java.io.File;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public interface IDelegateFaweQueue extends FaweQueue {
|
||||
|
||||
@Override
|
||||
FaweQueue getQueue();
|
||||
|
||||
@Override
|
||||
default void dequeue() {
|
||||
getQueue().dequeue();
|
||||
}
|
||||
|
||||
@Override
|
||||
default Relighter getRelighter() {
|
||||
return getQueue().getRelighter();
|
||||
}
|
||||
|
||||
@Override
|
||||
default BlockVector3 getMinimumPoint() {
|
||||
return getQueue().getMinimumPoint();
|
||||
}
|
||||
|
||||
@Override
|
||||
default BlockVector3 getMaximumPoint() {
|
||||
return getQueue().getMaximumPoint();
|
||||
}
|
||||
|
||||
@Override
|
||||
default BlockState getBlock(int x, int y, int z) {
|
||||
return getQueue().getBlock(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default <B extends BlockStateHolder<B>> boolean setBlock(int x, int y, int z, B block) throws WorldEditException {
|
||||
return getQueue().setBlock(x, y, z, block);
|
||||
}
|
||||
|
||||
@Override
|
||||
default BlockState getBlock(BlockVector3 position) {
|
||||
return getQueue().getBlock(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
default BiomeType getBiome(BlockVector2 position) {
|
||||
return getQueue().getBiome(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
default <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B block) throws WorldEditException {
|
||||
return getQueue().setBlock(position, block);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean setBiome(BlockVector2 position, BiomeType biome) {
|
||||
return getQueue().setBiome(position, biome);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void addEditSession(EditSession session) {
|
||||
getQueue().addEditSession(session);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setProgressTracker(RunnableVal2<ProgressType, Integer> progressTask) {
|
||||
getQueue().setProgressTracker(progressTask);
|
||||
}
|
||||
|
||||
@Override
|
||||
default Collection<EditSession> getEditSessions() {
|
||||
return getQueue().getEditSessions();
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean supports(Capability capability) {
|
||||
return getQueue().supports(capability);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void optimize() {
|
||||
getQueue().optimize();
|
||||
}
|
||||
|
||||
@Override
|
||||
default int setBlocks(CuboidRegion cuboid, int combinedId) {
|
||||
return getQueue().setBlocks(cuboid, combinedId);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean setBlock(int x, int y, int z, int combinedId) {
|
||||
return getQueue().setBlock(x, y, z, combinedId);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean setBlock(int x, int y, int z, int combinedId, CompoundTag nbt) {
|
||||
return getQueue().setBlock(x, y, z, combinedId, nbt);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setTile(int x, int y, int z, CompoundTag tag) {
|
||||
getQueue().setTile(x, y, z, tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setEntity(int x, int y, int z, CompoundTag tag) {
|
||||
getQueue().setEntity(x, y, z, tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void removeEntity(int x, int y, int z, UUID uuid) {
|
||||
getQueue().removeEntity(x, y, z, uuid);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean setBiome(int x, int z, BiomeType biome) {
|
||||
return getQueue().setBiome(x, z, biome);
|
||||
}
|
||||
|
||||
@Override
|
||||
default FaweChunk getFaweChunk(int x, int z) {
|
||||
return getQueue().getFaweChunk(x, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default Collection<FaweChunk> getFaweChunks() {
|
||||
return getQueue().getFaweChunks();
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean setMCA(int mcaX, int mcaZ, RegionWrapper region, Runnable whileLocked, boolean save, boolean load) {
|
||||
return getQueue().setMCA(mcaX, mcaZ, region, whileLocked, save, load);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setChunk(FaweChunk chunk) {
|
||||
getQueue().setChunk(chunk);
|
||||
}
|
||||
|
||||
@Override
|
||||
default File getSaveFolder() {
|
||||
return getQueue().getSaveFolder();
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getMaxY() {
|
||||
return getQueue().getMaxY();
|
||||
}
|
||||
|
||||
@Override
|
||||
default Settings getSettings() {
|
||||
return getQueue().getSettings();
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setSettings(Settings settings) {
|
||||
getQueue().setSettings(settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setWorld(String world) {
|
||||
getQueue().setWorld(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
default World getWEWorld() {
|
||||
return getQueue().getWEWorld();
|
||||
}
|
||||
|
||||
@Override
|
||||
default String getWorldName() {
|
||||
return getQueue().getWorldName();
|
||||
}
|
||||
|
||||
@Override
|
||||
default long getModified() {
|
||||
return getQueue().getModified();
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setModified(long modified) {
|
||||
getQueue().setModified(modified);
|
||||
}
|
||||
|
||||
@Override
|
||||
default RunnableVal2<ProgressType, Integer> getProgressTask() {
|
||||
return getQueue().getProgressTask();
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setProgressTask(RunnableVal2<ProgressType, Integer> progressTask) {
|
||||
getQueue().setProgressTask(progressTask);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setChangeTask(RunnableVal2<FaweChunk, FaweChunk> changeTask) {
|
||||
getQueue().setChangeTask(changeTask);
|
||||
}
|
||||
|
||||
@Override
|
||||
default RunnableVal2<FaweChunk, FaweChunk> getChangeTask() {
|
||||
return getQueue().getChangeTask();
|
||||
}
|
||||
|
||||
@Override
|
||||
default SetQueue.QueueStage getStage() {
|
||||
return getQueue().getStage();
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setStage(SetQueue.QueueStage stage) {
|
||||
getQueue().setStage(stage);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void addNotifyTask(Runnable runnable) {
|
||||
getQueue().addNotifyTask(runnable);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void runTasks() {
|
||||
getQueue().runTasks();
|
||||
}
|
||||
|
||||
@Override
|
||||
default void addTask(Runnable whenFree) {
|
||||
getQueue().addTask(whenFree);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void forEachBlockInChunk(int cx, int cz, RunnableVal2<BlockVector3, BaseBlock> onEach) {
|
||||
getQueue().forEachBlockInChunk(cx, cz, onEach);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void forEachTileInChunk(int cx, int cz, RunnableVal2<BlockVector3, BaseBlock> onEach) {
|
||||
getQueue().forEachTileInChunk(cx, cz, onEach);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Deprecated
|
||||
default boolean regenerateChunk(int x, int z) {
|
||||
return getQueue().regenerateChunk(x, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean regenerateChunk(int x, int z, @Nullable BiomeType biome, @Nullable Long seed) {
|
||||
return getQueue().regenerateChunk(x, z, biome, seed);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void startSet(boolean parallel) {
|
||||
getQueue().startSet(parallel);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void endSet(boolean parallel) {
|
||||
getQueue().endSet(parallel);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int cancel() {
|
||||
return getQueue().cancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
default void sendBlockUpdate(FaweChunk chunk, FawePlayer... players) {
|
||||
getQueue().sendBlockUpdate(chunk, players);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Deprecated
|
||||
default boolean next() {
|
||||
return getQueue().next();
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean next(int amount, long time) {
|
||||
return getQueue().next(amount, time);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void saveMemory() {
|
||||
getQueue().saveMemory();
|
||||
}
|
||||
|
||||
@Override
|
||||
default void sendChunk(FaweChunk chunk) {
|
||||
getQueue().sendChunk(chunk);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void sendChunk(int x, int z, int bitMask) {
|
||||
getQueue().sendChunk(x, z, bitMask);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void clear() {
|
||||
getQueue().clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean hasBlock(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return getQueue().hasBlock(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default BiomeType getBiomeType(int x, int z) throws FaweException.FaweChunkLoadException {
|
||||
return getQueue().getBiomeType(x, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getCombinedId4Data(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return getQueue().getCombinedId4Data(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getCachedCombinedId4Data(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return getQueue().getCachedCombinedId4Data(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getAdjacentLight(int x, int y, int z) {
|
||||
return getQueue().getAdjacentLight(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean hasSky() {
|
||||
return getQueue().hasSky();
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getSkyLight(int x, int y, int z) {
|
||||
return getQueue().getSkyLight(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getLight(int x, int y, int z) {
|
||||
return getQueue().getLight(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getEmmittedLight(int x, int y, int z) {
|
||||
return getQueue().getEmmittedLight(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default CompoundTag getTileEntity(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return getQueue().getTileEntity(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getCombinedId4Data(int x, int y, int z, int def) {
|
||||
return getQueue().getCombinedId4Data(x, y, z, def);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getCachedCombinedId4Data(int x, int y, int z, int def) {
|
||||
return getQueue().getCachedCombinedId4Data(x, y, z, def);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getCombinedId4DataDebug(int x, int y, int z, int def, EditSession session) {
|
||||
return getQueue().getCombinedId4DataDebug(x, y, z, def, session);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getBrightness(int x, int y, int z) {
|
||||
return getQueue().getBrightness(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getOpacityBrightnessPair(int x, int y, int z) {
|
||||
return getQueue().getOpacityBrightnessPair(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getOpacity(int x, int y, int z) {
|
||||
return getQueue().getOpacity(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int size() {
|
||||
return getQueue().size();
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean isEmpty() {
|
||||
return getQueue().isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
default void flush() {
|
||||
getQueue().flush();
|
||||
}
|
||||
|
||||
@Override
|
||||
default void flush(int time) {
|
||||
getQueue().flush(time);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean enqueue() {
|
||||
return getQueue().enqueue();
|
||||
}
|
||||
|
||||
@Override
|
||||
default List<? extends Entity> getEntities(Region region) {
|
||||
return getQueue().getEntities(region);
|
||||
}
|
||||
|
||||
@Override
|
||||
default List<? extends Entity> getEntities() {
|
||||
return getQueue().getEntities();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
default Entity createEntity(Location location, BaseEntity entity) {
|
||||
return getQueue().createEntity(location, entity);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
default Operation commit() {
|
||||
return getQueue().commit();
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getNearestSurfaceLayer(int x, int z, int y, int minY, int maxY) {
|
||||
return getQueue().getNearestSurfaceLayer(x, z, y, minY, maxY);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY) {
|
||||
return getQueue().getNearestSurfaceTerrainBlock(x, z, y, minY, maxY);
|
||||
}
|
||||
|
||||
@Override
|
||||
default int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, int failedMin, int failedMax) {
|
||||
return getQueue().getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, failedMin, failedMax);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void addCaves(Region region) throws WorldEditException {
|
||||
getQueue().addCaves(region);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void generate(Region region, GenBase gen) throws WorldEditException {
|
||||
getQueue().generate(region, gen);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void addSchems(Region region, Mask mask, List<ClipboardHolder> clipboards, int rarity, boolean rotate) throws WorldEditException {
|
||||
getQueue().addSchems(region, mask, clipboards, rarity, rotate);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void spawnResource(Region region, Resource gen, int rarity, int frequency) throws WorldEditException {
|
||||
getQueue().spawnResource(region, gen, rarity, frequency);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void addOre(Region region, Mask mask, Pattern material, int size, int frequency, int rarity, int minY, int maxY) throws WorldEditException {
|
||||
getQueue().addOre(region, mask, material, size, frequency, rarity, minY, maxY);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void addOres(Region region, Mask mask) throws WorldEditException {
|
||||
getQueue().addOres(region, mask);
|
||||
}
|
||||
}
|
@ -1,197 +0,0 @@
|
||||
package com.boydti.fawe.object.queue;
|
||||
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.visitor.FaweChunkVisitor;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public abstract class LazyFaweChunk<T extends FaweChunk> extends FaweChunk {
|
||||
|
||||
private T parent;
|
||||
|
||||
public LazyFaweChunk(FaweQueue queue, int chunkX, int chunkZ) {
|
||||
super(queue, chunkX, chunkZ);
|
||||
}
|
||||
|
||||
private T internalGetOrCacheChunk() {
|
||||
T tmp = parent;
|
||||
if (tmp == null) parent = tmp = getChunk();
|
||||
return tmp;
|
||||
}
|
||||
|
||||
protected T getCachedChunk() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
public abstract T getChunk();
|
||||
|
||||
@Override
|
||||
public FaweQueue getParent() {
|
||||
return internalGetOrCacheChunk().getParent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long longHash() {
|
||||
return internalGetOrCacheChunk().longHash();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return internalGetOrCacheChunk().hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addToQueue() {
|
||||
internalGetOrCacheChunk().addToQueue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBitMask() {
|
||||
return internalGetOrCacheChunk().getBitMask();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBlockCombinedId(int x, int y, int z) {
|
||||
return internalGetOrCacheChunk().getBlockCombinedId(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBlock(int x, int y, int z, BlockStateHolder block) {
|
||||
internalGetOrCacheChunk().setBlock(x, y, z, block);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getBlock(int x, int y, int z) {
|
||||
return internalGetOrCacheChunk().getBlock(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public int[] getIdArray(int layer) {
|
||||
return internalGetOrCacheChunk().getIdArray(layer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[][] getBlockLightArray() {
|
||||
return internalGetOrCacheChunk().getBlockLightArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[][] getSkyLightArray() {
|
||||
return internalGetOrCacheChunk().getSkyLightArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BiomeType[] getBiomeArray() {
|
||||
return internalGetOrCacheChunk().getBiomeArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void forEachQueuedBlock(FaweChunkVisitor onEach) {
|
||||
internalGetOrCacheChunk().forEachQueuedBlock(onEach);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[][] getCombinedIdArrays() {
|
||||
return internalGetOrCacheChunk().getCombinedIdArrays();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fill(int combinedId) {
|
||||
internalGetOrCacheChunk().fill(combinedId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fillCuboid(int x1, int x2, int y1, int y2, int z1, int z2, int combinedId) {
|
||||
internalGetOrCacheChunk().fillCuboid(x1, x2, y1, y2, z1, z2, combinedId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTile(int x, int y, int z, CompoundTag tile) {
|
||||
internalGetOrCacheChunk().setTile(x, y, z, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntity(CompoundTag entity) {
|
||||
internalGetOrCacheChunk().setEntity(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeEntity(UUID uuid) {
|
||||
internalGetOrCacheChunk().removeEntity(uuid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBlock(int x, int y, int z, int combinedId) {
|
||||
internalGetOrCacheChunk().setBlock(x, y, z, combinedId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<CompoundTag> getEntities() {
|
||||
return internalGetOrCacheChunk().getEntities();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<UUID> getEntityRemoves() {
|
||||
return internalGetOrCacheChunk().getEntityRemoves();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Short, CompoundTag> getTiles() {
|
||||
return internalGetOrCacheChunk().getTiles();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompoundTag getTile(int x, int y, int z) {
|
||||
return internalGetOrCacheChunk().getTile(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiome(int x, int z, BiomeType biome) {
|
||||
internalGetOrCacheChunk().setBiome(x, z, biome);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBiome(BiomeType biome) {
|
||||
internalGetOrCacheChunk().setBiome(biome);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void optimize() {
|
||||
internalGetOrCacheChunk().optimize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
return internalGetOrCacheChunk().equals(obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk copy(boolean shallow) {
|
||||
return internalGetOrCacheChunk().copy(shallow);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
internalGetOrCacheChunk().start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void end() {
|
||||
internalGetOrCacheChunk().end();
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk call() {
|
||||
return internalGetOrCacheChunk().call();
|
||||
}
|
||||
}
|
@ -1,224 +0,0 @@
|
||||
package com.boydti.fawe.object.queue;
|
||||
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.RunnableVal2;
|
||||
import com.boydti.fawe.object.exception.FaweException;
|
||||
import com.boydti.fawe.util.SetQueue;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.world.World;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.UUID;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class NullFaweQueue implements FaweQueue {
|
||||
private final String worldName;
|
||||
private final BlockState state;
|
||||
|
||||
public NullFaweQueue(String worldName) {
|
||||
this(worldName, BlockTypes.AIR.getDefaultState());
|
||||
}
|
||||
|
||||
public NullFaweQueue(String worldName, BlockState state) {
|
||||
this.worldName = worldName;
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBlock(int x, int y, int z, int combinedId) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTile(int x, int y, int z, CompoundTag tag) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntity(int x, int y, int z, CompoundTag tag) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeEntity(int x, int y, int z, UUID uuid) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBiome(int x, int z, BiomeType biome) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FaweChunk getFaweChunk(int x, int z) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<FaweChunk> getFaweChunks() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setChunk(FaweChunk chunk) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getSaveFolder() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWorld(String world) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public World getWEWorld() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getWorldName() {
|
||||
return worldName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getModified() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setModified(long modified) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public RunnableVal2<ProgressType, Integer> getProgressTask() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProgressTask(RunnableVal2<ProgressType, Integer> progressTask) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setChangeTask(RunnableVal2<FaweChunk, FaweChunk> changeTask) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public RunnableVal2<FaweChunk, FaweChunk> getChangeTask() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SetQueue.QueueStage getStage() {
|
||||
return SetQueue.QueueStage.NONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStage(SetQueue.QueueStage stage) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addNotifyTask(Runnable runnable) {
|
||||
runnable.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runTasks() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTask(Runnable whenFree) {
|
||||
whenFree.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean regenerateChunk(int x, int z, @Nullable BiomeType biome, @Nullable Long seed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendBlockUpdate(FaweChunk chunk, FawePlayer... players) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean next(int amount, long time) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendChunk(FaweChunk chunk) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendChunk(int x, int z, int bitMask) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public BiomeType getBiomeType(int x, int z) throws FaweException.FaweChunkLoadException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getBlock(BlockVector3 position) {
|
||||
return state;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCombinedId4Data(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return state.getInternalId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCachedCombinedId4Data(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return state.getInternalId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSky() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSkyLight(int x, int y, int z) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getEmmittedLight(int x, int y, int z) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompoundTag getTileEntity(int x, int y, int z) throws FaweException.FaweChunkLoadException {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
package com.boydti.fawe.object.schematic;
|
||||
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.object.clipboard.FaweClipboard;
|
||||
import com.boydti.fawe.object.clipboard.ReadOnlyClipboard;
|
||||
import com.boydti.fawe.util.EditSessionBuilder;
|
||||
@ -266,7 +266,7 @@ public class Schematic {
|
||||
extent.setBlock(xx, mutable.getBlockY() + rely, zz, block);
|
||||
return false;
|
||||
}
|
||||
}, (HasFaweQueue) (null));
|
||||
}, (HasIQueueExtent) (null));
|
||||
Operations.completeBlindly(visitor);
|
||||
}
|
||||
// Entity offset is the paste location subtract the clipboard origin (entity's location is already relative to the world origin)
|
||||
|
@ -168,7 +168,7 @@
|
||||
// }
|
||||
// }
|
||||
// // Resend relevant chunks
|
||||
// FaweQueue packetQueue = SetQueue.IMP.getNewQueue(this.player.getWorld(), true, false);
|
||||
// IQueueExtent packetQueue = SetQueue.IMP.getNewQueue(this.player.getWorld(), true, false);
|
||||
// if (packetQueue.supports(Capability.CHUNK_PACKETS)) {
|
||||
// ArrayDeque<Long> toSend = new ArrayDeque<>();
|
||||
// ObjectIterator<Long2ObjectMap.Entry<MCAChunk>> iter = chunks.long2ObjectEntrySet().fastIterator();
|
||||
@ -232,7 +232,7 @@
|
||||
// * @param chunkX
|
||||
// * @param chunkZ
|
||||
// */
|
||||
// private void send(FaweQueue packetQueue, int chunkX, int chunkZ) {
|
||||
// private void send(IQueueExtent packetQueue, int chunkX, int chunkZ) {
|
||||
// TaskManager.IMP.getPublicForkJoinPool().submit(() -> {
|
||||
// try {
|
||||
// int OX = chunkOffset.getBlockX();
|
||||
@ -519,7 +519,7 @@
|
||||
// */
|
||||
// @Override
|
||||
// public void update() {
|
||||
// FaweQueue packetQueue = SetQueue.IMP.getNewQueue(player.getWorld(), true, false);
|
||||
// IQueueExtent packetQueue = SetQueue.IMP.getNewQueue(player.getWorld(), true, false);
|
||||
//
|
||||
// if (!packetQueue.supports(Capability.CHUNK_PACKETS)) {
|
||||
// return;
|
||||
@ -574,7 +574,7 @@
|
||||
// files.clear();
|
||||
// player.getPlayer().setPosition(origin, origin.getPitch(), origin.getYaw());
|
||||
// if (update) {
|
||||
// FaweQueue packetQueue = SetQueue.IMP.getNewQueue(player.getWorld(), true, false);
|
||||
// IQueueExtent packetQueue = SetQueue.IMP.getNewQueue(player.getWorld(), true, false);
|
||||
//
|
||||
// int OX = chunkOffset.getBlockX();
|
||||
// int OZ = chunkOffset.getBlockZ();
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.boydti.fawe.object.visitor;
|
||||
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.sk89q.worldedit.function.RegionFunction;
|
||||
import com.sk89q.worldedit.function.mask.Mask;
|
||||
import com.sk89q.worldedit.function.visitor.RecursiveVisitor;
|
||||
@ -34,8 +34,8 @@ public class AboveVisitor extends RecursiveVisitor {
|
||||
this(mask, function, baseY, Integer.MAX_VALUE, null);
|
||||
}
|
||||
|
||||
public AboveVisitor(Mask mask, RegionFunction function, int baseY, int depth, HasFaweQueue hasFaweQueue) {
|
||||
super(mask, function, depth, hasFaweQueue);
|
||||
public AboveVisitor(Mask mask, RegionFunction function, int baseY, int depth, HasIQueueExtent hasIQueueExtent) {
|
||||
super(mask, function, depth, hasIQueueExtent);
|
||||
checkNotNull(mask);
|
||||
|
||||
this.baseY = baseY;
|
||||
|
@ -1,9 +1,9 @@
|
||||
package com.boydti.fawe.object.visitor;
|
||||
|
||||
import com.boydti.fawe.config.Settings;
|
||||
import com.boydti.fawe.example.MappedFaweQueue;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.example.MappedIQueueExtent;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.util.ExtentTraverser;
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.extent.Extent;
|
||||
@ -16,23 +16,23 @@ import javax.annotation.Nullable;
|
||||
public class Fast2DIterator implements Iterable<BlockVector2> {
|
||||
|
||||
private final Iterable<? extends BlockVector2> iterable;
|
||||
private final MappedFaweQueue queue;
|
||||
private final MappedIQueueExtent queue;
|
||||
|
||||
public Fast2DIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable EditSession extent) {
|
||||
this(iter, (HasFaweQueue) extent);
|
||||
this(iter, (HasIQueueExtent) extent);
|
||||
}
|
||||
|
||||
public Fast2DIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable Extent extent) {
|
||||
this(iter, (HasFaweQueue) (extent != null ? (extent instanceof HasFaweQueue ? extent : new ExtentTraverser(extent).findAndGet(HasFaweQueue.class)) : null));
|
||||
this(iter, (HasIQueueExtent) (extent != null ? (extent instanceof HasIQueueExtent ? extent : new ExtentTraverser(extent).findAndGet(HasIQueueExtent.class)) : null));
|
||||
}
|
||||
|
||||
public Fast2DIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable HasFaweQueue editSession) {
|
||||
public Fast2DIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable HasIQueueExtent editSession) {
|
||||
this(iter, editSession != null ? editSession.getQueue() : null);
|
||||
}
|
||||
|
||||
public Fast2DIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable FaweQueue faweQueue) {
|
||||
public Fast2DIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable IQueueExtent IQueueExtent) {
|
||||
this.iterable = iter;
|
||||
this.queue = faweQueue instanceof MappedFaweQueue ? (MappedFaweQueue) faweQueue : null;
|
||||
this.queue = IQueueExtent instanceof MappedIQueueExtent ? (MappedIQueueExtent) IQueueExtent : null;
|
||||
}
|
||||
|
||||
public Iterable<? extends BlockVector2> getIterable() {
|
||||
|
@ -1,9 +1,9 @@
|
||||
package com.boydti.fawe.object.visitor;
|
||||
|
||||
import com.boydti.fawe.config.Settings;
|
||||
import com.boydti.fawe.example.MappedFaweQueue;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.example.MappedIQueueExtent;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.util.ExtentTraverser;
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.extent.Extent;
|
||||
@ -17,23 +17,23 @@ import javax.annotation.Nullable;
|
||||
public class FastChunkIterator implements Iterable<BlockVector2> {
|
||||
|
||||
private final Iterable<? extends BlockVector2> iterable;
|
||||
private final MappedFaweQueue queue;
|
||||
private final MappedIQueueExtent queue;
|
||||
|
||||
public FastChunkIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable EditSession extent) {
|
||||
this(iter, (HasFaweQueue) extent);
|
||||
this(iter, (HasIQueueExtent) extent);
|
||||
}
|
||||
|
||||
public FastChunkIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable Extent extent) {
|
||||
this(iter, (HasFaweQueue) (extent != null ? (extent instanceof HasFaweQueue ? extent : new ExtentTraverser(extent).findAndGet(HasFaweQueue.class)) : null));
|
||||
this(iter, (HasIQueueExtent) (extent != null ? (extent instanceof HasIQueueExtent ? extent : new ExtentTraverser(extent).findAndGet(HasIQueueExtent.class)) : null));
|
||||
}
|
||||
|
||||
public FastChunkIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable HasFaweQueue editSession) {
|
||||
public FastChunkIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable HasIQueueExtent editSession) {
|
||||
this(iter, editSession != null ? editSession.getQueue() : null);
|
||||
}
|
||||
|
||||
public FastChunkIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable FaweQueue faweQueue) {
|
||||
public FastChunkIterator(@Nonnull Iterable<? extends BlockVector2> iter, @Nullable IQueueExtent IQueueExtent) {
|
||||
this.iterable = iter;
|
||||
this.queue = faweQueue instanceof MappedFaweQueue ? (MappedFaweQueue) faweQueue : null;
|
||||
this.queue = IQueueExtent instanceof MappedIQueueExtent ? (MappedIQueueExtent) IQueueExtent : null;
|
||||
}
|
||||
|
||||
public Iterable<? extends BlockVector2> getIterable() {
|
||||
|
@ -1,9 +1,9 @@
|
||||
package com.boydti.fawe.object.visitor;
|
||||
|
||||
import com.boydti.fawe.config.Settings;
|
||||
import com.boydti.fawe.example.MappedFaweQueue;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.example.MappedIQueueExtent;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.util.ExtentTraverser;
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.extent.Extent;
|
||||
@ -16,23 +16,23 @@ import javax.annotation.Nullable;
|
||||
public class FastIterator implements Iterable<BlockVector3> {
|
||||
|
||||
private final Iterable<? extends BlockVector3> iterable;
|
||||
private final MappedFaweQueue queue;
|
||||
private final MappedIQueueExtent queue;
|
||||
|
||||
public FastIterator(@Nonnull Iterable<? extends BlockVector3> iter, @Nullable EditSession extent) {
|
||||
this(iter, (HasFaweQueue) extent);
|
||||
this(iter, (HasIQueueExtent) extent);
|
||||
}
|
||||
|
||||
public FastIterator(@Nonnull Iterable<? extends BlockVector3> iter, @Nullable Extent extent) {
|
||||
this(iter, (HasFaweQueue) (extent != null ? (extent instanceof HasFaweQueue ? extent : new ExtentTraverser(extent).findAndGet(HasFaweQueue.class)) : null));
|
||||
this(iter, (HasIQueueExtent) (extent != null ? (extent instanceof HasIQueueExtent ? extent : new ExtentTraverser(extent).findAndGet(HasIQueueExtent.class)) : null));
|
||||
}
|
||||
|
||||
public FastIterator(@Nonnull Iterable<? extends BlockVector3> iter, @Nullable HasFaweQueue editSession) {
|
||||
this(iter, (FaweQueue) (editSession != null ? editSession.getQueue() : null));
|
||||
public FastIterator(@Nonnull Iterable<? extends BlockVector3> iter, @Nullable HasIQueueExtent editSession) {
|
||||
this(iter, (IQueueExtent) (editSession != null ? editSession.getQueue() : null));
|
||||
}
|
||||
|
||||
public FastIterator(@Nonnull Iterable<? extends BlockVector3> iter, @Nullable FaweQueue faweQueue) {
|
||||
public FastIterator(@Nonnull Iterable<? extends BlockVector3> iter, @Nullable IQueueExtent IQueueExtent) {
|
||||
this.iterable = iter;
|
||||
this.queue = faweQueue != null && faweQueue instanceof MappedFaweQueue ? (MappedFaweQueue) faweQueue : null;
|
||||
this.queue = IQueueExtent != null && IQueueExtent instanceof MappedIQueueExtent ? (MappedIQueueExtent) IQueueExtent : null;
|
||||
}
|
||||
|
||||
public Iterable<? extends BlockVector3> getIterable() {
|
||||
|
@ -2,7 +2,7 @@ package com.boydti.fawe.regions.general.plot;
|
||||
|
||||
import com.boydti.fawe.FaweAPI;
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.util.SetQueue;
|
||||
import com.github.intellectualsites.plotsquared.plot.object.PlotBlock;
|
||||
import com.github.intellectualsites.plotsquared.plot.util.StringMan;
|
||||
@ -25,7 +25,7 @@ import java.util.List;
|
||||
// TODO FIXME
|
||||
public class FaweLocalBlockQueue extends LocalBlockQueue {
|
||||
|
||||
public final FaweQueue IMP;
|
||||
public final IQueueExtent IMP;
|
||||
private final LegacyMapper legacyMapper;
|
||||
|
||||
public FaweLocalBlockQueue(String world) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.boydti.fawe.regions.general.plot;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.clipboard.ReadOnlyClipboard;
|
||||
import com.boydti.fawe.object.io.PGZIPOutputStream;
|
||||
import com.boydti.fawe.util.EditSessionBuilder;
|
||||
@ -47,9 +47,9 @@ public class FaweSchematicHandler extends SchematicHandler {
|
||||
queue.setTile(x, y, z, compoundTag);
|
||||
return true;
|
||||
}
|
||||
FaweQueue faweQueue = SetQueue.IMP.getNewQueue(((FaweLocalBlockQueue) queue).IMP.getWEWorld(), true, false);
|
||||
faweQueue.setTile(x, y, z, (CompoundTag) FaweCache.asTag(compoundTag));
|
||||
faweQueue.flush();
|
||||
IQueueExtent IQueueExtent = SetQueue.IMP.getNewQueue(((FaweLocalBlockQueue) queue).IMP.getWEWorld(), true, false);
|
||||
IQueueExtent.setTile(x, y, z, (CompoundTag) FaweCache.asTag(compoundTag));
|
||||
IQueueExtent.flush();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,7 @@ import com.boydti.fawe.jnbt.anvil.MCAChunk;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAQueue;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAWriter;
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.util.SetQueue;
|
||||
import com.github.intellectualsites.plotsquared.commands.Command;
|
||||
import com.github.intellectualsites.plotsquared.commands.CommandDeclaration;
|
||||
@ -162,7 +162,7 @@ public class MoveTo512 /*extends Command*/ {
|
||||
//
|
||||
// WorldUtil.IMP.saveWorld(area.worldname);
|
||||
//
|
||||
// FaweQueue defaultQueue = SetQueue.IMP.getNewQueue(area.worldname, true, false);
|
||||
// IQueueExtent defaultQueue = SetQueue.IMP.getNewQueue(area.worldname, true, false);
|
||||
// MCAQueue queueFrom = new MCAQueue(area.worldname, defaultQueue.getSaveFolder(), defaultQueue.hasSky());
|
||||
//
|
||||
// String world = args[0];
|
||||
|
@ -4,7 +4,7 @@ import com.boydti.fawe.jnbt.anvil.MCAChunk;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFile;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAFilter;
|
||||
import com.boydti.fawe.jnbt.anvil.MCAQueue;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.util.MainUtil;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.boydti.fawe.util.SetQueue;
|
||||
@ -38,7 +38,7 @@ public class PlotTrim {
|
||||
private boolean deleteUnowned;
|
||||
|
||||
public PlotTrim(PlotPlayer player, PlotArea area, String worldName, boolean deleteUnowned) {
|
||||
FaweQueue tmpQueue = SetQueue.IMP.getNewQueue(worldName, true, false);
|
||||
IQueueExtent tmpQueue = SetQueue.IMP.getNewQueue(worldName, true, false);
|
||||
File saveFolder = tmpQueue.getSaveFolder();
|
||||
this.root = new File(saveFolder.getParentFile().getParentFile(), worldName + "-Copy" + File.separator + "region");
|
||||
this.originalQueue = new MCAQueue(worldName, saveFolder, true);
|
||||
|
@ -307,12 +307,12 @@ public class EditSessionBuilder {
|
||||
// if (queue == null) {
|
||||
// boolean placeChunks = this.fastmode || this.limit.FAST_PLACEMENT;
|
||||
// World unwrapped = WorldWrapper.unwrap(world);
|
||||
// if (unwrapped instanceof FaweQueue) {
|
||||
// queue = (FaweQueue) unwrapped;
|
||||
// if (unwrapped instanceof IQueueExtent) {
|
||||
// queue = (IQueueExtent) unwrapped;
|
||||
// } else if (unwrapped instanceof MCAWorld) {
|
||||
// queue = ((MCAWorld) unwrapped).getQueue();
|
||||
// } else if (player != null && world.equals(player.getWorld())) {
|
||||
// queue = player.getFaweQueue(placeChunks, autoQueue);
|
||||
// queue = player.getIQueueExtent(placeChunks, autoQueue);
|
||||
// } else {
|
||||
// queue = SetQueue.IMP.getNewQueue(world, placeChunks, autoQueue);
|
||||
// }
|
||||
@ -324,7 +324,7 @@ public class EditSessionBuilder {
|
||||
// // If fast placement is disabled, it's slower to perform a copy on each chunk
|
||||
// && this.limit.FAST_PLACEMENT
|
||||
// // If the specific queue doesn't support it
|
||||
// && queue.supports(FaweQueue.Capability.CHANGE_TASKS)
|
||||
// && queue.supports(IQueueExtent.Capability.CHANGE_TASKS)
|
||||
// // If the edit uses items from the inventory we can't use a delayed task
|
||||
// && this.blockBag == null;
|
||||
// }
|
||||
|
@ -2,7 +2,7 @@ package com.boydti.fawe.util;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.config.Settings;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.RunnableVal;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@ -138,7 +138,7 @@ public abstract class TaskManager {
|
||||
* @param queue
|
||||
* @param run
|
||||
*/
|
||||
public void runUnsafe(FaweQueue queue, Runnable run) {
|
||||
public void runUnsafe(IQueueExtent queue, Runnable run) {
|
||||
queue.startSet(true);
|
||||
try {
|
||||
run.run();
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.boydti.fawe.util.task;
|
||||
|
||||
import com.boydti.fawe.Fawe;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.Metadatable;
|
||||
import com.boydti.fawe.object.RunnableVal;
|
||||
import com.boydti.fawe.util.SetQueue;
|
||||
@ -322,7 +322,7 @@ public class TaskBuilder extends Metadatable {
|
||||
}
|
||||
}
|
||||
|
||||
private FaweQueue queue;
|
||||
private IQueueExtent queue;
|
||||
private long last;
|
||||
private long start;
|
||||
private Object asyncWaitLock = new Object();
|
||||
@ -430,7 +430,7 @@ public class TaskBuilder extends Metadatable {
|
||||
public static abstract class SplitTask extends RunnableTask {
|
||||
|
||||
private final long allocation;
|
||||
private final FaweQueue queue;
|
||||
private final IQueueExtent queue;
|
||||
private long last;
|
||||
private long start;
|
||||
private Object asyncWaitLock = new Object();
|
||||
|
@ -183,7 +183,7 @@ public class HistoryCommands extends MethodCommands {
|
||||
// TODO mask the regions bot / top to the bottom and top coord in the allowedRegions
|
||||
// TODO: then mask the edit to the bot / top
|
||||
// if (allowedRegions.length != 1 || !allowedRegions[0].isGlobal()) {
|
||||
// finalQueue = new MaskedFaweQueue(SetQueue.IMP.getNewQueue(fp.getWorld(), true, false), allowedRegions);
|
||||
// finalQueue = new MaskedIQueueExtent(SetQueue.IMP.getNewQueue(fp.getWorld(), true, false), allowedRegions);
|
||||
// } else {
|
||||
// finalQueue = SetQueue.IMP.getNewQueue(fp.getWorld(), true, false);
|
||||
// }
|
||||
|
@ -35,10 +35,10 @@ import com.boydti.fawe.beta.filters.SetFilter;
|
||||
import com.boydti.fawe.beta.implementation.QueueHandler;
|
||||
import com.boydti.fawe.beta.filters.DistrFilter;
|
||||
import com.boydti.fawe.config.BBC;
|
||||
import com.boydti.fawe.example.NMSMappedFaweQueue;
|
||||
import com.boydti.fawe.example.NMSMappedIQueueExtent;
|
||||
import com.boydti.fawe.object.FaweLimit;
|
||||
import com.boydti.fawe.object.FawePlayer;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.exception.FaweException;
|
||||
import com.boydti.fawe.object.visitor.Fast2DIterator;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
@ -166,7 +166,7 @@ public class RegionCommands {
|
||||
final int cz = loc.getBlockZ() >> 4;
|
||||
selection = new CuboidRegion(BlockVector3.at(cx - 8, 0, cz - 8).multiply(16), BlockVector3.at(cx + 8, 0, cz + 8).multiply(16));
|
||||
}
|
||||
int count = FaweAPI.fixLighting(player.getWorld(), selection,null, FaweQueue.RelightMode.ALL);
|
||||
int count = FaweAPI.fixLighting(player.getWorld(), selection,null, IQueueExtent.RelightMode.ALL);
|
||||
BBC.LIGHTING_PROPOGATE_SELECTION.send(fp, count);
|
||||
}
|
||||
|
||||
@ -178,7 +178,7 @@ public class RegionCommands {
|
||||
public void getlighting(Player player) throws WorldEditException {
|
||||
FawePlayer fp = FawePlayer.wrap(player);
|
||||
final Location loc = player.getLocation();
|
||||
FaweQueue queue = fp.getFaweQueue(false);
|
||||
IQueueExtent queue = fp.getIQueueExtent(false);
|
||||
fp.sendMessage("Light: " + queue.getEmmittedLight(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()) + " | " + queue.getSkyLight(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
|
||||
}
|
||||
|
||||
@ -195,7 +195,7 @@ public class RegionCommands {
|
||||
final int cz = player.getLocation().getBlockZ() >> 4;
|
||||
selection = new CuboidRegion(BlockVector3.at(cx - 8, 0, cz - 8).multiply(16), BlockVector3.at(cx + 8, 0, cz + 8).multiply(16));
|
||||
}
|
||||
int count = FaweAPI.fixLighting(player.getWorld(), selection, null, FaweQueue.RelightMode.NONE);
|
||||
int count = FaweAPI.fixLighting(player.getWorld(), selection, null, IQueueExtent.RelightMode.NONE);
|
||||
BBC.UPDATED_LIGHTING_SELECTION.send(fp, count);
|
||||
}
|
||||
|
||||
@ -225,7 +225,7 @@ public class RegionCommands {
|
||||
@CommandPermissions("worldedit.light.set")
|
||||
public void setlighting(Player player, @Selection Region region, @Range(min = 0, max = 15) int value) {
|
||||
FawePlayer fp = FawePlayer.wrap(player);
|
||||
final NMSMappedFaweQueue queue = (NMSMappedFaweQueue) fp.getFaweQueue(false);
|
||||
final NMSMappedIQueueExtent queue = (NMSMappedIQueueExtent) fp.getIQueueExtent(false);
|
||||
for (BlockVector3 pt : region) {
|
||||
queue.setBlockLight(pt.getX(), pt.getY(), pt.getZ(), value);
|
||||
}
|
||||
@ -244,7 +244,7 @@ public class RegionCommands {
|
||||
@CommandPermissions("worldedit.light.set")
|
||||
public void setskylighting(Player player, @Selection Region region, @Range(min = 0, max = 15) int value) {
|
||||
FawePlayer fp = FawePlayer.wrap(player);
|
||||
final NMSMappedFaweQueue queue = (NMSMappedFaweQueue) fp.getFaweQueue(false);
|
||||
final NMSMappedIQueueExtent queue = (NMSMappedIQueueExtent) fp.getIQueueExtent(false);
|
||||
for (BlockVector3 pt : region) {
|
||||
queue.setSkyLight(pt.getX(), pt.getY(), pt.getZ(), value);
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ package com.sk89q.worldedit.command.composition;
|
||||
|
||||
import com.boydti.fawe.config.BBC;
|
||||
import com.boydti.fawe.object.FaweChunk;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.RegionWrapper;
|
||||
import com.boydti.fawe.object.RunnableVal;
|
||||
import com.boydti.fawe.object.extent.FaweRegionExtent;
|
||||
@ -111,7 +111,7 @@ public class SelectionCommand extends SimpleCommand<Operation> {
|
||||
Pattern pattern = (Pattern) field.get(replace);
|
||||
if (pattern instanceof BlockStateHolder) {
|
||||
BlockStateHolder block = ((BlockStateHolder) pattern);
|
||||
final FaweQueue queue = editSession.getQueue();
|
||||
final IQueueExtent queue = editSession.getQueue();
|
||||
final int minY = cuboid.getMinimumY();
|
||||
final int maxY = cuboid.getMaximumY();
|
||||
|
||||
|
@ -19,11 +19,6 @@
|
||||
|
||||
package com.sk89q.worldedit.extent;
|
||||
|
||||
import com.boydti.fawe.jnbt.anvil.generator.CavesGen;
|
||||
import com.boydti.fawe.jnbt.anvil.generator.GenBase;
|
||||
import com.boydti.fawe.jnbt.anvil.generator.OreGen;
|
||||
import com.boydti.fawe.jnbt.anvil.generator.Resource;
|
||||
import com.boydti.fawe.jnbt.anvil.generator.SchemGen;
|
||||
import com.boydti.fawe.object.clipboard.WorldCopyClipboard;
|
||||
import com.boydti.fawe.object.exception.FaweException;
|
||||
import com.sk89q.worldedit.MaxChangedBlocksException;
|
||||
@ -33,6 +28,11 @@ import com.sk89q.worldedit.entity.Entity;
|
||||
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
|
||||
import com.sk89q.worldedit.function.RegionMaskingFilter;
|
||||
import com.sk89q.worldedit.function.block.BlockReplace;
|
||||
import com.sk89q.worldedit.function.generator.CavesGen;
|
||||
import com.sk89q.worldedit.function.generator.GenBase;
|
||||
import com.sk89q.worldedit.function.generator.OreGen;
|
||||
import com.sk89q.worldedit.function.generator.Resource;
|
||||
import com.sk89q.worldedit.function.generator.SchemGen;
|
||||
import com.sk89q.worldedit.function.mask.BlockMask;
|
||||
import com.sk89q.worldedit.function.mask.ExistingBlockMask;
|
||||
import com.sk89q.worldedit.function.mask.Mask;
|
||||
@ -535,7 +535,7 @@ public interface Extent extends InputExtent, OutputExtent {
|
||||
return setBlocks(region, (BlockStateHolder) pattern);
|
||||
}
|
||||
BlockReplace replace = new BlockReplace(this, pattern);
|
||||
RegionVisitor visitor = new RegionVisitor(region, replace, queue instanceof MappedFaweQueue ? (MappedFaweQueue) queue : null);
|
||||
RegionVisitor visitor = new RegionVisitor(region, replace, queue instanceof MappedIQueueExtent ? (MappedIQueueExtent) queue : null);
|
||||
Operations.completeBlindly(visitor);
|
||||
return this.changes = visitor.getAffected();
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.boydti.fawe.jnbt.anvil.generator;
|
||||
package com.sk89q.worldedit.function.generator;
|
||||
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
@ -1,4 +1,4 @@
|
||||
package com.boydti.fawe.jnbt.anvil.generator;
|
||||
package com.sk89q.worldedit.function.generator;
|
||||
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.extent.Extent;
|
@ -1,4 +1,4 @@
|
||||
package com.boydti.fawe.jnbt.anvil.generator;
|
||||
package com.sk89q.worldedit.function.generator;
|
||||
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
@ -1,4 +1,4 @@
|
||||
package com.boydti.fawe.jnbt.anvil.generator;
|
||||
package com.sk89q.worldedit.function.generator;
|
||||
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.boydti.fawe.jnbt.anvil.generator;
|
||||
package com.sk89q.worldedit.function.generator;
|
||||
|
||||
import com.boydti.fawe.object.schematic.Schematic;
|
||||
import com.sk89q.worldedit.math.MutableBlockVector3;
|
@ -22,8 +22,8 @@ package com.sk89q.worldedit.function.operation;
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import com.boydti.fawe.example.MappedFaweQueue;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.example.MappedIQueueExtent;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.extent.BlockTranslateExtent;
|
||||
import com.boydti.fawe.object.extent.PositionTransformExtent;
|
||||
import com.boydti.fawe.object.function.block.BiomeCopy;
|
||||
@ -277,7 +277,7 @@ public class ForwardExtentCopy implements Operation {
|
||||
if (currentTransform == null) {
|
||||
currentTransform = transform;
|
||||
}
|
||||
FaweQueue queue;
|
||||
IQueueExtent queue;
|
||||
if (source instanceof EditSession) {
|
||||
queue = ((EditSession) source).getQueue();
|
||||
} else if (destination instanceof EditSession) {
|
||||
@ -368,7 +368,7 @@ public class ForwardExtentCopy implements Operation {
|
||||
if (copyingBiomes && (!(source instanceof BlockArrayClipboard) || ((BlockArrayClipboard) source).IMP.hasBiomes())) {
|
||||
copy = CombinedRegionFunction.combine(copy, new BiomeCopy(source, finalDest));
|
||||
}
|
||||
blockCopy = new RegionVisitor(region, copy, queue instanceof MappedFaweQueue ? (MappedFaweQueue) queue : null);
|
||||
blockCopy = new RegionVisitor(region, copy, queue instanceof MappedIQueueExtent ? (MappedIQueueExtent) queue : null);
|
||||
}
|
||||
|
||||
List<? extends Entity> entities;
|
||||
|
@ -22,7 +22,7 @@ package com.sk89q.worldedit.function.visitor;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import com.boydti.fawe.config.BBC;
|
||||
import com.boydti.fawe.example.MappedFaweQueue;
|
||||
import com.boydti.fawe.example.MappedIQueueExtent;
|
||||
import com.boydti.fawe.object.collection.BlockVectorSet;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.function.RegionFunction;
|
||||
|
@ -20,9 +20,9 @@
|
||||
package com.sk89q.worldedit.function.visitor;
|
||||
|
||||
import com.boydti.fawe.config.BBC;
|
||||
import com.boydti.fawe.example.MappedFaweQueue;
|
||||
import com.boydti.fawe.object.FaweQueue;
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.example.MappedIQueueExtent;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
import com.boydti.fawe.object.visitor.Fast2DIterator;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
@ -41,7 +41,7 @@ import java.util.List;
|
||||
public class FlatRegionVisitor implements Operation {
|
||||
|
||||
private final FlatRegionFunction function;
|
||||
private MappedFaweQueue queue;
|
||||
private MappedIQueueExtent queue;
|
||||
private int affected = 0;
|
||||
private final Iterable<BlockVector2> iterator;
|
||||
|
||||
@ -59,13 +59,13 @@ public class FlatRegionVisitor implements Operation {
|
||||
this.iterator = flatRegion.asFlatRegion();
|
||||
}
|
||||
|
||||
public FlatRegionVisitor(final FlatRegion flatRegion, final FlatRegionFunction function, HasFaweQueue hasFaweQueue) {
|
||||
public FlatRegionVisitor(final FlatRegion flatRegion, final FlatRegionFunction function, HasIQueueExtent hasIQueueExtent) {
|
||||
checkNotNull(flatRegion);
|
||||
checkNotNull(function);
|
||||
this.function = function;
|
||||
this.iterator = flatRegion.asFlatRegion();
|
||||
FaweQueue queue = hasFaweQueue.getQueue();
|
||||
this.queue = (MappedFaweQueue) (queue instanceof MappedFaweQueue ? queue : null);
|
||||
IQueueExtent queue = hasIQueueExtent.getQueue();
|
||||
this.queue = (MappedIQueueExtent) (queue instanceof MappedIQueueExtent ? queue : null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,7 @@
|
||||
|
||||
package com.sk89q.worldedit.function.visitor;
|
||||
|
||||
import com.boydti.fawe.object.HasFaweQueue;
|
||||
import com.boydti.fawe.object.HasIQueueExtent;
|
||||
|
||||
import com.sk89q.worldedit.function.RegionFunction;
|
||||
import com.sk89q.worldedit.function.mask.Mask;
|
||||
@ -42,8 +42,8 @@ public class NonRisingVisitor extends RecursiveVisitor {
|
||||
this(mask, function, Integer.MAX_VALUE, null);
|
||||
}
|
||||
|
||||
public NonRisingVisitor(Mask mask, RegionFunction function, int depth, HasFaweQueue hasFaweQueue) {
|
||||
super(mask, function, depth, hasFaweQueue);
|
||||
public NonRisingVisitor(Mask mask, RegionFunction function, int depth, HasIQueueExtent hasIQueueExtent) {
|
||||
super(mask, function, depth, hasIQueueExtent);
|
||||
setDirections(
|
||||
BlockVector3.UNIT_X,
|
||||
BlockVector3.UNIT_MINUS_X,
|
||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren