mirror of
https://github.com/boy0001/FastAsyncWorldedit.git
synced 2025-02-26 17:31:23 +01:00
Minor inventory + queue management changes
This commit is contained in:
parent
135d936825
commit
295aad0f2f
@ -17,7 +17,6 @@ import org.bukkit.block.Block;
|
|||||||
public class BukkitQueue_All extends BukkitQueue_0<Chunk, Chunk, Chunk> {
|
public class BukkitQueue_All extends BukkitQueue_0<Chunk, Chunk, Chunk> {
|
||||||
|
|
||||||
public static int ALLOCATE;
|
public static int ALLOCATE;
|
||||||
public static double TPS_TARGET = 18.5;
|
|
||||||
private static int LIGHT_MASK = 0x739C0;
|
private static int LIGHT_MASK = 0x739C0;
|
||||||
|
|
||||||
public BukkitQueue_All(com.sk89q.worldedit.world.World world) {
|
public BukkitQueue_All(com.sk89q.worldedit.world.World world) {
|
||||||
|
@ -51,6 +51,7 @@ import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
|
|||||||
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
|
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
|
||||||
import com.sk89q.worldedit.extent.clipboard.io.SchematicReader;
|
import com.sk89q.worldedit.extent.clipboard.io.SchematicReader;
|
||||||
import com.sk89q.worldedit.extent.clipboard.io.SchematicWriter;
|
import com.sk89q.worldedit.extent.clipboard.io.SchematicWriter;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.BlockBagExtent;
|
||||||
import com.sk89q.worldedit.extent.transform.BlockTransformExtent;
|
import com.sk89q.worldedit.extent.transform.BlockTransformExtent;
|
||||||
import com.sk89q.worldedit.function.entity.ExtentEntityCopy;
|
import com.sk89q.worldedit.function.entity.ExtentEntityCopy;
|
||||||
import com.sk89q.worldedit.function.mask.BlockMask;
|
import com.sk89q.worldedit.function.mask.BlockMask;
|
||||||
@ -389,6 +390,7 @@ public class Fawe {
|
|||||||
// Extents
|
// Extents
|
||||||
BlockTransformExtent.inject(); // Fix for cache not being mutable
|
BlockTransformExtent.inject(); // Fix for cache not being mutable
|
||||||
AbstractDelegateExtent.inject(); // Optimizations
|
AbstractDelegateExtent.inject(); // Optimizations
|
||||||
|
BlockBagExtent.inject(); // Fixes + Optimizations
|
||||||
// Vector
|
// Vector
|
||||||
Vector.inject(); // Optimizations
|
Vector.inject(); // Optimizations
|
||||||
// Pattern
|
// Pattern
|
||||||
|
@ -16,6 +16,7 @@ import com.sk89q.jnbt.StringTag;
|
|||||||
import com.sk89q.jnbt.Tag;
|
import com.sk89q.jnbt.Tag;
|
||||||
import com.sk89q.worldedit.CuboidClipboard;
|
import com.sk89q.worldedit.CuboidClipboard;
|
||||||
import com.sk89q.worldedit.blocks.BaseBlock;
|
import com.sk89q.worldedit.blocks.BaseBlock;
|
||||||
|
import com.sk89q.worldedit.blocks.BaseItem;
|
||||||
import com.sk89q.worldedit.world.registry.BundledBlockData;
|
import com.sk89q.worldedit.world.registry.BundledBlockData;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
@ -65,6 +66,8 @@ public class FaweCache {
|
|||||||
*/
|
*/
|
||||||
public final static BaseBlock[] CACHE_BLOCK = new BaseBlock[Character.MAX_VALUE + 1];
|
public final static BaseBlock[] CACHE_BLOCK = new BaseBlock[Character.MAX_VALUE + 1];
|
||||||
|
|
||||||
|
public final static BaseItem[] CACHE_ITEM = new BaseItem[Character.MAX_VALUE + 1];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Faster than java random (since it just needs to look random)
|
* Faster than java random (since it just needs to look random)
|
||||||
*/
|
*/
|
||||||
@ -83,6 +86,10 @@ public class FaweCache {
|
|||||||
return CACHE_BLOCK[(id << 4) + data];
|
return CACHE_BLOCK[(id << 4) + data];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final BaseItem getItem(int id, int data) {
|
||||||
|
return CACHE_ITEM[(id << 4) + data];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the combined data for a block
|
* Get the combined data for a block
|
||||||
* @param id
|
* @param id
|
||||||
@ -174,6 +181,23 @@ public class FaweCache {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
CACHE_ITEM[i] = new BaseItem(id, (short) data) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setData(short data) {
|
||||||
|
throw new IllegalStateException("Cannot set data");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDamage(short data) {
|
||||||
|
throw new IllegalStateException("Cannot set data");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setType(int id) {
|
||||||
|
throw new IllegalStateException("Cannot set id");
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
CACHE_COLOR[getCombined(0, 0)] = new Color(128, 128, 128); //Air
|
CACHE_COLOR[getCombined(0, 0)] = new Color(128, 128, 128); //Air
|
||||||
|
@ -169,6 +169,7 @@ public enum BBC {
|
|||||||
"Error"),
|
"Error"),
|
||||||
|
|
||||||
WORLDEDIT_SOME_FAILS("&c%s0 blocks weren't placed because they were outside your allowed region.", "Error"),
|
WORLDEDIT_SOME_FAILS("&c%s0 blocks weren't placed because they were outside your allowed region.", "Error"),
|
||||||
|
WORLDEDIT_SOME_FAILS_BLOCKBAG("&cMissing blocks: %s0", "Error"),
|
||||||
|
|
||||||
WORLDEDIT_CANCEL_COUNT("&cCancelled %s0 edits.", "Cancel"),
|
WORLDEDIT_CANCEL_COUNT("&cCancelled %s0 edits.", "Cancel"),
|
||||||
WORLDEDIT_CANCEL_REASON("&cYour WorldEdit action was cancelled:&7 %s0&c.", "Cancel"),
|
WORLDEDIT_CANCEL_REASON("&cYour WorldEdit action was cancelled:&7 %s0&c.", "Cancel"),
|
||||||
|
@ -3,17 +3,14 @@ package com.boydti.fawe.logging;
|
|||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.FaweCache;
|
import com.boydti.fawe.FaweCache;
|
||||||
import com.boydti.fawe.object.FawePlayer;
|
import com.boydti.fawe.object.FawePlayer;
|
||||||
|
import com.boydti.fawe.object.changeset.AbstractDelegateChangeSet;
|
||||||
import com.boydti.fawe.object.changeset.FaweChangeSet;
|
import com.boydti.fawe.object.changeset.FaweChangeSet;
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
|
||||||
import com.sk89q.worldedit.extent.inventory.BlockBag;
|
|
||||||
import com.sk89q.worldedit.history.change.Change;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.primesoft.blockshub.IBlocksHubApi;
|
import org.primesoft.blockshub.IBlocksHubApi;
|
||||||
import org.primesoft.blockshub.api.IPlayer;
|
import org.primesoft.blockshub.api.IPlayer;
|
||||||
import org.primesoft.blockshub.api.IWorld;
|
import org.primesoft.blockshub.api.IWorld;
|
||||||
|
|
||||||
public class LoggingChangeSet extends FaweChangeSet {
|
public class LoggingChangeSet extends AbstractDelegateChangeSet {
|
||||||
|
|
||||||
private static boolean initialized = false;
|
private static boolean initialized = false;
|
||||||
|
|
||||||
@ -30,8 +27,6 @@ public class LoggingChangeSet extends FaweChangeSet {
|
|||||||
|
|
||||||
public static IBlocksHubApi api;
|
public static IBlocksHubApi api;
|
||||||
|
|
||||||
private final FaweChangeSet parent;
|
|
||||||
|
|
||||||
private final MutableVector loc;
|
private final MutableVector loc;
|
||||||
private final IPlayer player;
|
private final IPlayer player;
|
||||||
private final IWorld world;
|
private final IWorld world;
|
||||||
@ -39,8 +34,7 @@ public class LoggingChangeSet extends FaweChangeSet {
|
|||||||
private final MutableBlockData newBlock;
|
private final MutableBlockData newBlock;
|
||||||
|
|
||||||
private LoggingChangeSet(FawePlayer player, FaweChangeSet parent) {
|
private LoggingChangeSet(FawePlayer player, FaweChangeSet parent) {
|
||||||
super(parent.getWorld());
|
super(parent);
|
||||||
this.parent = parent;
|
|
||||||
this.world = api.getWorld(player.getLocation().world);
|
this.world = api.getWorld(player.getLocation().world);
|
||||||
this.loc = new MutableVector();
|
this.loc = new MutableVector();
|
||||||
this.oldBlock = new MutableBlockData();
|
this.oldBlock = new MutableBlockData();
|
||||||
@ -48,11 +42,6 @@ public class LoggingChangeSet extends FaweChangeSet {
|
|||||||
this.player = api.getPlayer(player.getUUID());
|
this.player = api.getPlayer(player.getUUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean flush() {
|
|
||||||
return parent.flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(int x, int y, int z, int combinedId4DataFrom, int combinedId4DataTo) {
|
public void add(int x, int y, int z, int combinedId4DataFrom, int combinedId4DataTo) {
|
||||||
// Mutable (avoids object creation)
|
// Mutable (avoids object creation)
|
||||||
@ -67,39 +56,4 @@ public class LoggingChangeSet extends FaweChangeSet {
|
|||||||
api.logBlock(loc, player, world, oldBlock, newBlock);
|
api.logBlock(loc, player, world, oldBlock, newBlock);
|
||||||
parent.add(x, y, z, combinedId4DataFrom, combinedId4DataTo);
|
parent.add(x, y, z, combinedId4DataFrom, combinedId4DataTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addTileCreate(CompoundTag tag) {
|
|
||||||
parent.addTileCreate(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addTileRemove(CompoundTag tag) {
|
|
||||||
parent.addTileRemove(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addEntityRemove(CompoundTag tag) {
|
|
||||||
parent.addEntityRemove(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addEntityCreate(CompoundTag tag) {
|
|
||||||
parent.addEntityCreate(tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterator<Change> getIterator(BlockBag blockBag, int mode, boolean redo) {
|
|
||||||
return parent.getIterator(blockBag, mode, redo);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterator<Change> getIterator(boolean undo) {
|
|
||||||
return parent.getIterator(undo);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int size() {
|
|
||||||
return parent.size();
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -2,6 +2,7 @@ package com.boydti.fawe.object;
|
|||||||
|
|
||||||
import com.boydti.fawe.FaweCache;
|
import com.boydti.fawe.FaweCache;
|
||||||
import com.boydti.fawe.object.changeset.FaweChangeSet;
|
import com.boydti.fawe.object.changeset.FaweChangeSet;
|
||||||
|
import com.boydti.fawe.object.exception.FaweException;
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
import com.sk89q.worldedit.EditSession;
|
import com.sk89q.worldedit.EditSession;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
@ -67,20 +68,24 @@ public class HistoryExtent extends AbstractDelegateExtent {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!FaweCache.hasNBT(id)) {
|
try {
|
||||||
if (FaweCache.hasNBT(block.getId())) {
|
if (!FaweCache.hasNBT(id)) {
|
||||||
this.changeSet.add(x, y, z, combined, block);
|
if (FaweCache.hasNBT(block.getId())) {
|
||||||
|
this.changeSet.add(x, y, z, combined, block);
|
||||||
|
} else {
|
||||||
|
this.changeSet.add(x, y, z, combined, (block.getId() << 4) + block.getData());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
this.changeSet.add(x, y, z, combined, (block.getId() << 4) + block.getData());
|
try {
|
||||||
}
|
CompoundTag tag = queue.getTileEntity(x, y, z);
|
||||||
} else {
|
this.changeSet.add(x, y, z, new BaseBlock(id, combined & 0xF, tag), block);
|
||||||
try {
|
} catch (Throwable e) {
|
||||||
CompoundTag tag = queue.getTileEntity(x, y, z);
|
e.printStackTrace();
|
||||||
this.changeSet.add(x, y, z, new BaseBlock(id, combined & 0xF, tag), block);
|
this.changeSet.add(x, y, z, combined, block);
|
||||||
} catch (Throwable e) {
|
}
|
||||||
e.printStackTrace();
|
|
||||||
this.changeSet.add(x, y, z, combined, block);
|
|
||||||
}
|
}
|
||||||
|
} catch (FaweException ignore) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return extent.setBlock(x, y, z, block);
|
return extent.setBlock(x, y, z, block);
|
||||||
}
|
}
|
||||||
|
@ -60,24 +60,24 @@ public class MutableFullBlockChange implements Change {
|
|||||||
|
|
||||||
public void perform(FaweQueue queue) {
|
public void perform(FaweQueue queue) {
|
||||||
int idFrom = FaweCache.getId(from);
|
int idFrom = FaweCache.getId(from);
|
||||||
int dataFrom = FaweCache.getData(from);
|
|
||||||
if (blockBag != null) {
|
if (blockBag != null) {
|
||||||
if (allowFetch && idFrom != 0) {
|
|
||||||
try {
|
|
||||||
blockBag.fetchPlacedBlock(idFrom, dataFrom);
|
|
||||||
} catch (BlockBagException e) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int idTo = FaweCache.getId(to);
|
int idTo = FaweCache.getId(to);
|
||||||
int dataTo = FaweCache.getData(to);
|
if (idFrom != idTo) {
|
||||||
if (allowStore && idTo != 0) {
|
if (allowFetch && from != 0) {
|
||||||
try {
|
try {
|
||||||
blockBag.storeDroppedBlock(idTo, dataTo);
|
blockBag.fetchPlacedBlock(idFrom, FaweCache.getData(from));
|
||||||
} catch (BlockBagException ignored) {
|
} catch (BlockBagException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (allowStore && to != 0) {
|
||||||
|
try {
|
||||||
|
blockBag.storeDroppedBlock(idTo, FaweCache.getData(to));
|
||||||
|
} catch (BlockBagException ignored) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
queue.setBlock(x, y, z, idFrom, dataFrom);
|
queue.setBlock(x, y, z, idFrom, FaweCache.getData(from));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,148 @@
|
|||||||
|
package com.boydti.fawe.object.changeset;
|
||||||
|
|
||||||
|
import com.boydti.fawe.object.FawePlayer;
|
||||||
|
import com.boydti.fawe.object.FaweQueue;
|
||||||
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
|
import com.sk89q.worldedit.EditSession;
|
||||||
|
import com.sk89q.worldedit.Vector;
|
||||||
|
import com.sk89q.worldedit.blocks.BaseBlock;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.BlockBag;
|
||||||
|
import com.sk89q.worldedit.history.change.BlockChange;
|
||||||
|
import com.sk89q.worldedit.history.change.Change;
|
||||||
|
import com.sk89q.worldedit.history.change.EntityCreate;
|
||||||
|
import com.sk89q.worldedit.history.change.EntityRemove;
|
||||||
|
import com.sk89q.worldedit.world.World;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class AbstractDelegateChangeSet extends FaweChangeSet {
|
||||||
|
public final FaweChangeSet parent;
|
||||||
|
|
||||||
|
public AbstractDelegateChangeSet(FaweChangeSet parent) {
|
||||||
|
super(parent.getWorld());
|
||||||
|
this.parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final FaweChangeSet getParent() {
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FaweChangeSet getDefaultChangeSet(World world, UUID uuid) {
|
||||||
|
return FaweChangeSet.getDefaultChangeSet(world, uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public World getWorld() {
|
||||||
|
return parent.getWorld();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean flushAsync() {
|
||||||
|
return parent.flushAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean flush() {
|
||||||
|
return parent.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(int x, int y, int z, int combinedFrom, int combinedTo) {
|
||||||
|
parent.add(x, y, z, combinedFrom, combinedTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<Change> backwardIterator() {
|
||||||
|
return parent.backwardIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<Change> forwardIterator() {
|
||||||
|
return parent.forwardIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
return parent.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addTileCreate(CompoundTag tag) {
|
||||||
|
parent.addTileCreate(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addTileRemove(CompoundTag tag) {
|
||||||
|
parent.addTileRemove(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addEntityRemove(CompoundTag tag) {
|
||||||
|
parent.addEntityRemove(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addEntityCreate(CompoundTag tag) {
|
||||||
|
parent.addEntityCreate(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<Change> getIterator(BlockBag blockBag, int mode, boolean redo) {
|
||||||
|
return parent.getIterator(blockBag, mode, redo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<Change> getIterator(boolean redo) {
|
||||||
|
return parent.getIterator(redo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delete() {
|
||||||
|
parent.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EditSession toEditSession(FawePlayer player) {
|
||||||
|
return parent.toEditSession(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(EntityCreate change) {
|
||||||
|
parent.add(change);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(EntityRemove change) {
|
||||||
|
parent.add(change);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(Change change) {
|
||||||
|
parent.add(change);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(BlockChange change) {
|
||||||
|
parent.add(change);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(Vector loc, BaseBlock from, BaseBlock to) {
|
||||||
|
parent.add(loc, from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(int x, int y, int z, BaseBlock from, BaseBlock to) {
|
||||||
|
parent.add(x, y, z, from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(int x, int y, int z, int combinedFrom, BaseBlock to) {
|
||||||
|
parent.add(x, y, z, combinedFrom, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addChangeTask(FaweQueue queue) {
|
||||||
|
parent.addChangeTask(queue);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
package com.boydti.fawe.object.changeset;
|
||||||
|
|
||||||
|
import com.boydti.fawe.FaweCache;
|
||||||
|
import com.boydti.fawe.object.exception.FaweException;
|
||||||
|
import com.boydti.fawe.util.ReflectionUtils;
|
||||||
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
|
import com.sk89q.jnbt.Tag;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.BlockBag;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.BlockBagException;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.UnplaceableBlockException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
public class BlockBagChangeSet extends AbstractDelegateChangeSet {
|
||||||
|
|
||||||
|
private final boolean mine;
|
||||||
|
private int[] missingBlocks = new int[Character.MAX_VALUE + 1];
|
||||||
|
private BlockBag blockBag;
|
||||||
|
|
||||||
|
public BlockBagChangeSet(FaweChangeSet parent, BlockBag blockBag, boolean mine) {
|
||||||
|
super(parent);
|
||||||
|
this.blockBag = blockBag;
|
||||||
|
this.mine = mine;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the block bag.
|
||||||
|
*
|
||||||
|
* @return a block bag, which may be null if none is used
|
||||||
|
*/
|
||||||
|
public @Nullable
|
||||||
|
BlockBag getBlockBag() {
|
||||||
|
return blockBag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the block bag.
|
||||||
|
*
|
||||||
|
* @param blockBag a block bag, which may be null if none is used
|
||||||
|
*/
|
||||||
|
public void setBlockBag(@Nullable BlockBag blockBag) {
|
||||||
|
this.blockBag = blockBag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the list of missing blocks and clears the list for the next
|
||||||
|
* operation.
|
||||||
|
*
|
||||||
|
* @return a map of missing blocks
|
||||||
|
*/
|
||||||
|
public Map<Integer, Integer> popMissing() {
|
||||||
|
HashMap<Integer, Integer> map = new HashMap<>();
|
||||||
|
for (int i = 0; i < missingBlocks.length; i++) {
|
||||||
|
int count = missingBlocks[i];
|
||||||
|
if (count > 0) {
|
||||||
|
map.put(i, count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Arrays.fill(missingBlocks, 0);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(int x, int y, int z, int combinedFrom, int combinedTo) {
|
||||||
|
if (combinedTo != 0) {
|
||||||
|
try {
|
||||||
|
blockBag.fetchPlacedBlock(FaweCache.getId(combinedTo), FaweCache.getData(combinedTo));
|
||||||
|
} catch (UnplaceableBlockException e) {
|
||||||
|
throw new FaweException.FaweBlockBagException();
|
||||||
|
} catch (BlockBagException e) {
|
||||||
|
missingBlocks[combinedTo]++;
|
||||||
|
throw new FaweException.FaweBlockBagException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mine) {
|
||||||
|
if (combinedFrom != 0) {
|
||||||
|
try {
|
||||||
|
blockBag.storeDroppedBlock(FaweCache.getId(combinedFrom), FaweCache.getData(combinedFrom));
|
||||||
|
} catch (BlockBagException ignored) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.add(x, y, z, combinedFrom, combinedTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addTileCreate(CompoundTag nbt) {
|
||||||
|
if (nbt.containsKey("items")) {
|
||||||
|
Map<String, Tag> map = ReflectionUtils.getMap(nbt.getValue());
|
||||||
|
map.remove("items");
|
||||||
|
}
|
||||||
|
super.addTileCreate(nbt);
|
||||||
|
}
|
||||||
|
}
|
@ -94,7 +94,9 @@ public abstract class FaweChangeSet implements ChangeSet {
|
|||||||
public abstract void addTileRemove(CompoundTag tag);
|
public abstract void addTileRemove(CompoundTag tag);
|
||||||
public abstract void addEntityRemove(CompoundTag tag);
|
public abstract void addEntityRemove(CompoundTag tag);
|
||||||
public abstract void addEntityCreate(CompoundTag tag);
|
public abstract void addEntityCreate(CompoundTag tag);
|
||||||
public abstract Iterator<Change> getIterator(BlockBag blockBag, int mode, boolean redo);
|
public Iterator<Change> getIterator(BlockBag blockBag, int mode, boolean redo) {
|
||||||
|
return getIterator(redo);
|
||||||
|
}
|
||||||
public abstract Iterator<Change> getIterator(boolean redo);
|
public abstract Iterator<Change> getIterator(boolean redo);
|
||||||
|
|
||||||
public void delete() {};
|
public void delete() {};
|
||||||
|
@ -35,6 +35,12 @@ public class FaweException extends RuntimeException {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class FaweBlockBagException extends FaweException {
|
||||||
|
public FaweBlockBagException() {
|
||||||
|
super(BBC.WORLDEDIT_SOME_FAILS_BLOCKBAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Faster exception throwing if you don't fill the stacktrace
|
* Faster exception throwing if you don't fill the stacktrace
|
||||||
* @return
|
* @return
|
||||||
|
@ -5,9 +5,11 @@ import java.io.OutputStream;
|
|||||||
import java.io.RandomAccessFile;
|
import java.io.RandomAccessFile;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutorCompletionService;
|
import java.util.concurrent.ExecutorCompletionService;
|
||||||
|
import java.util.concurrent.ForkJoinPool;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -101,44 +103,25 @@ public class FastByteArrayOutputStream extends OutputStream {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] toByteArray() {
|
|
||||||
byte[] data = new byte[getSize()];
|
|
||||||
|
|
||||||
// Check if we have a list of buffers
|
|
||||||
int pos = 0;
|
|
||||||
|
|
||||||
if (buffers != null) {
|
|
||||||
for (byte[] bytes : buffers) {
|
|
||||||
System.arraycopy(bytes, 0, data, pos, bytes.length);
|
|
||||||
pos += bytes.length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// write the internal buffer directly
|
|
||||||
System.arraycopy(buffer, 0, data, pos, index);
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return new String(toByteArray());
|
return new String(toByteArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(byte[] b) throws IOException {
|
public void write(byte[] b) throws IOException {
|
||||||
if (b.length > blockSize) {
|
if (b.length > blockSize) {
|
||||||
if (index > 0) {
|
if (index > 0) {
|
||||||
byte[] buf2 = new byte[index];
|
byte[] buf2 = new byte[index];
|
||||||
System.arraycopy(buffer, 0, buf2, 0, index);
|
System.arraycopy(buffer, 0, buf2, 0, index);
|
||||||
buffer = buf2;
|
buffer = buf2;
|
||||||
addBuffer();
|
addBuffer();
|
||||||
|
}
|
||||||
|
size += b.length;
|
||||||
|
buffers.addLast(b);
|
||||||
|
} else {
|
||||||
|
write(b, 0, b.length);
|
||||||
}
|
}
|
||||||
size += b.length;
|
|
||||||
buffers.addLast(b);
|
|
||||||
} else {
|
|
||||||
write(b, 0, b.length);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void write(int datum) {
|
public void write(int datum) {
|
||||||
if (index == blockSize) {
|
if (index == blockSize) {
|
||||||
|
@ -61,6 +61,9 @@ public class FaweTimer implements Runnable {
|
|||||||
private long skipTick = 0;
|
private long skipTick = 0;
|
||||||
|
|
||||||
public boolean isAbove(double tps) {
|
public boolean isAbove(double tps) {
|
||||||
|
if (tps <= 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (skip > 0) {
|
if (skip > 0) {
|
||||||
if (skipTick != tick) {
|
if (skipTick != tick) {
|
||||||
skip--;
|
skip--;
|
||||||
|
@ -60,7 +60,8 @@ public class SetQueue {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
while (!tasks.isEmpty() && Fawe.get().getTimer().isAbove(18.5)) {
|
double targetTPS = 18 - Math.max(Settings.QUEUE.EXTRA_TIME_MS * 0.05, 0);
|
||||||
|
while (!tasks.isEmpty() && Fawe.get().getTimer().isAbove(targetTPS)) {
|
||||||
tasks.poll().run();
|
tasks.poll().run();
|
||||||
}
|
}
|
||||||
if (inactiveQueues.isEmpty() && activeQueues.isEmpty()) {
|
if (inactiveQueues.isEmpty() && activeQueues.isEmpty()) {
|
||||||
@ -86,7 +87,7 @@ public class SetQueue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
FaweQueue queue = getNextQueue();
|
FaweQueue queue = getNextQueue();
|
||||||
if (queue == null || !Fawe.get().getTimer().isAbove(18.5)) {
|
if (queue == null || !Fawe.get().getTimer().isAbove(targetTPS)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Thread.currentThread() != Fawe.get().getMainThread()) {
|
if (Thread.currentThread() != Fawe.get().getMainThread()) {
|
||||||
|
@ -36,6 +36,7 @@ import com.boydti.fawe.object.HistoryExtent;
|
|||||||
import com.boydti.fawe.object.NullChangeSet;
|
import com.boydti.fawe.object.NullChangeSet;
|
||||||
import com.boydti.fawe.object.RegionWrapper;
|
import com.boydti.fawe.object.RegionWrapper;
|
||||||
import com.boydti.fawe.object.RunnableVal;
|
import com.boydti.fawe.object.RunnableVal;
|
||||||
|
import com.boydti.fawe.object.changeset.BlockBagChangeSet;
|
||||||
import com.boydti.fawe.object.changeset.CPUOptimizedChangeSet;
|
import com.boydti.fawe.object.changeset.CPUOptimizedChangeSet;
|
||||||
import com.boydti.fawe.object.changeset.DiskStorageHistory;
|
import com.boydti.fawe.object.changeset.DiskStorageHistory;
|
||||||
import com.boydti.fawe.object.changeset.FaweChangeSet;
|
import com.boydti.fawe.object.changeset.FaweChangeSet;
|
||||||
@ -70,7 +71,6 @@ import com.sk89q.worldedit.extent.Extent;
|
|||||||
import com.sk89q.worldedit.extent.MaskingExtent;
|
import com.sk89q.worldedit.extent.MaskingExtent;
|
||||||
import com.sk89q.worldedit.extent.buffer.ForgetfulExtentBuffer;
|
import com.sk89q.worldedit.extent.buffer.ForgetfulExtentBuffer;
|
||||||
import com.sk89q.worldedit.extent.inventory.BlockBag;
|
import com.sk89q.worldedit.extent.inventory.BlockBag;
|
||||||
import com.sk89q.worldedit.extent.inventory.BlockBagExtent;
|
|
||||||
import com.sk89q.worldedit.extent.world.SurvivalModeExtent;
|
import com.sk89q.worldedit.extent.world.SurvivalModeExtent;
|
||||||
import com.sk89q.worldedit.function.GroundFunction;
|
import com.sk89q.worldedit.function.GroundFunction;
|
||||||
import com.sk89q.worldedit.function.RegionMaskingFilter;
|
import com.sk89q.worldedit.function.RegionMaskingFilter;
|
||||||
@ -285,9 +285,6 @@ public class EditSession extends AbstractWorld implements HasFaweQueue {
|
|||||||
this.bypassAll = wrapExtent(new FastWorldEditExtent(world, queue), bus, event, Stage.BEFORE_CHANGE);
|
this.bypassAll = wrapExtent(new FastWorldEditExtent(world, queue), bus, event, Stage.BEFORE_CHANGE);
|
||||||
this.bypassHistory = (this.extent = wrapExtent(bypassAll, bus, event, Stage.BEFORE_REORDER));
|
this.bypassHistory = (this.extent = wrapExtent(bypassAll, bus, event, Stage.BEFORE_REORDER));
|
||||||
if (!fastmode) {
|
if (!fastmode) {
|
||||||
if (this.blockBag != null && limit.INVENTORY_MODE > 0) {
|
|
||||||
this.bypassHistory = new BlockBagExtent(this.bypassHistory, this.blockBag, limit.INVENTORY_MODE == 1);
|
|
||||||
}
|
|
||||||
if (limit.SPEED_REDUCTION > 0) {
|
if (limit.SPEED_REDUCTION > 0) {
|
||||||
this.bypassHistory = new SlowExtent(this.bypassHistory, limit.SPEED_REDUCTION);
|
this.bypassHistory = new SlowExtent(this.bypassHistory, limit.SPEED_REDUCTION);
|
||||||
}
|
}
|
||||||
@ -295,6 +292,9 @@ public class EditSession extends AbstractWorld implements HasFaweQueue {
|
|||||||
if (player != null && Fawe.imp().getBlocksHubApi() != null) {
|
if (player != null && Fawe.imp().getBlocksHubApi() != null) {
|
||||||
changeSet = LoggingChangeSet.wrap(player, changeSet);
|
changeSet = LoggingChangeSet.wrap(player, changeSet);
|
||||||
}
|
}
|
||||||
|
if (this.blockBag != null && limit.INVENTORY_MODE > 0) {
|
||||||
|
changeSet = new BlockBagChangeSet(changeSet, blockBag, limit.INVENTORY_MODE == 1);
|
||||||
|
}
|
||||||
if (combineStages) {
|
if (combineStages) {
|
||||||
changeTask = changeSet;
|
changeTask = changeSet;
|
||||||
changeSet.addChangeTask(queue);
|
changeSet.addChangeTask(queue);
|
||||||
@ -728,6 +728,37 @@ public class EditSession extends AbstractWorld implements HasFaweQueue {
|
|||||||
* @return a map of missing blocks
|
* @return a map of missing blocks
|
||||||
*/
|
*/
|
||||||
public Map<Integer, Integer> popMissingBlocks() {
|
public Map<Integer, Integer> popMissingBlocks() {
|
||||||
|
ChangeSet changeSet = getChangeSet();
|
||||||
|
if (changeSet instanceof BlockBagChangeSet) {
|
||||||
|
BlockBagChangeSet bbcs = (BlockBagChangeSet) changeSet;
|
||||||
|
BlockBag bag = bbcs.getBlockBag();
|
||||||
|
if (bag != null) {
|
||||||
|
bag.flushChanges();
|
||||||
|
Map<Integer, Integer> missingBlocks = ((BlockBagChangeSet) changeSet).popMissing();
|
||||||
|
if (!missingBlocks.isEmpty()) {
|
||||||
|
StringBuilder str = new StringBuilder();
|
||||||
|
int size = missingBlocks.size();
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (Map.Entry<Integer, Integer> entry : missingBlocks.entrySet()) {
|
||||||
|
int combined = entry.getKey();
|
||||||
|
int id = FaweCache.getId(combined);
|
||||||
|
int data = FaweCache.getData(combined);
|
||||||
|
int amount = entry.getValue();
|
||||||
|
BlockType type = BlockType.fromID(id);
|
||||||
|
str.append((type != null ? type.getName() : "" + id))
|
||||||
|
.append((data != 0 ? ":" + data : ""))
|
||||||
|
.append((amount != 1 ? "x" + amount : ""));
|
||||||
|
++i;
|
||||||
|
if (i != size) {
|
||||||
|
str.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BBC.WORLDEDIT_SOME_FAILS_BLOCKBAG.send(player, str.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return new HashMap<>();
|
return new HashMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.sk89q.worldedit.extent.inventory;
|
package com.sk89q.worldedit.extent.inventory;
|
||||||
|
|
||||||
|
import com.boydti.fawe.FaweCache;
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
import com.sk89q.worldedit.WorldEditException;
|
import com.sk89q.worldedit.WorldEditException;
|
||||||
@ -108,4 +109,8 @@ public class BlockBagExtent extends AbstractDelegateExtent {
|
|||||||
}
|
}
|
||||||
return super.setBlock(position, block);
|
return super.setBlock(position, block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Class<?> inject() {
|
||||||
|
return BlockBagExtent.class;
|
||||||
|
}
|
||||||
}
|
}
|
@ -28,7 +28,6 @@ public class NukkitQueue extends NMSMappedFaweQueue<Level, BaseFullChunk, BaseFu
|
|||||||
private Level world;
|
private Level world;
|
||||||
|
|
||||||
public static int ALLOCATE;
|
public static int ALLOCATE;
|
||||||
public static double TPS_TARGET = 18.5;
|
|
||||||
private static int LIGHT_MASK = 0x739C0;
|
private static int LIGHT_MASK = 0x739C0;
|
||||||
|
|
||||||
public NukkitQueue(FaweNukkit fn, World world) {
|
public NukkitQueue(FaweNukkit fn, World world) {
|
||||||
|
Loading…
Reference in New Issue
Block a user