Per player history size (in MB)
This commit is contained in:
parent
e8ae5ca119
commit
478cbbf393
|
@ -2,6 +2,7 @@ package com.boydti.fawe.config;
|
||||||
|
|
||||||
import com.boydti.fawe.object.FaweLimit;
|
import com.boydti.fawe.object.FaweLimit;
|
||||||
import com.boydti.fawe.object.FawePlayer;
|
import com.boydti.fawe.object.FawePlayer;
|
||||||
|
import com.sk89q.worldedit.LocalSession;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -63,6 +64,8 @@ public class Settings extends Config {
|
||||||
"NoteBlock, Sign, Skull, Structure"
|
"NoteBlock, Sign, Skull, Structure"
|
||||||
})
|
})
|
||||||
public int MAX_BLOCKSTATES = 1337;
|
public int MAX_BLOCKSTATES = 1337;
|
||||||
|
@Comment("Maximum size of the player's history in Megabytes")
|
||||||
|
public int MAX_HISTORY_MB = 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class HISTORY {
|
public static class HISTORY {
|
||||||
|
@ -211,13 +214,18 @@ public class Settings extends Config {
|
||||||
|
|
||||||
public static void load(File file) {
|
public static void load(File file) {
|
||||||
load(file, Settings.class);
|
load(file, Settings.class);
|
||||||
|
if (HISTORY.USE_DISK) {
|
||||||
|
LocalSession.MAX_HISTORY_SIZE = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static FaweLimit getLimit(FawePlayer player) {
|
public static FaweLimit getLimit(FawePlayer player) {
|
||||||
|
FaweLimit limit;
|
||||||
if (player.hasWorldEditBypass()) {
|
if (player.hasWorldEditBypass()) {
|
||||||
return FaweLimit.MAX.copy();
|
limit = FaweLimit.MAX.copy();
|
||||||
|
} else {
|
||||||
|
limit = new FaweLimit();
|
||||||
}
|
}
|
||||||
FaweLimit limit = new FaweLimit();
|
|
||||||
Collection<String> keys = LIMITS.getSections();
|
Collection<String> keys = LIMITS.getSections();
|
||||||
for (String key : keys) {
|
for (String key : keys) {
|
||||||
if (key.equals("default") || (player != null && player.hasPermission("fawe.limit." + key))) {
|
if (key.equals("default") || (player != null && player.hasPermission("fawe.limit." + key))) {
|
||||||
|
@ -228,6 +236,7 @@ public class Settings extends Config {
|
||||||
limit.MAX_ENTITIES = Math.max(limit.MAX_ENTITIES, newLimit.MAX_ENTITIES != -1 ? newLimit.MAX_ENTITIES : Integer.MAX_VALUE);
|
limit.MAX_ENTITIES = Math.max(limit.MAX_ENTITIES, newLimit.MAX_ENTITIES != -1 ? newLimit.MAX_ENTITIES : Integer.MAX_VALUE);
|
||||||
limit.MAX_FAILS = Math.max(limit.MAX_FAILS, newLimit.MAX_FAILS != -1 ? newLimit.MAX_FAILS : Integer.MAX_VALUE);
|
limit.MAX_FAILS = Math.max(limit.MAX_FAILS, newLimit.MAX_FAILS != -1 ? newLimit.MAX_FAILS : Integer.MAX_VALUE);
|
||||||
limit.MAX_ITERATIONS = Math.max(limit.MAX_ITERATIONS, newLimit.MAX_ITERATIONS != -1 ? newLimit.MAX_ITERATIONS : Integer.MAX_VALUE);
|
limit.MAX_ITERATIONS = Math.max(limit.MAX_ITERATIONS, newLimit.MAX_ITERATIONS != -1 ? newLimit.MAX_ITERATIONS : Integer.MAX_VALUE);
|
||||||
|
limit.MAX_HISTORY = HISTORY.USE_DISK ? Integer.MAX_VALUE : Math.max(limit.MAX_HISTORY, newLimit.MAX_HISTORY_MB != -1 ? newLimit.MAX_HISTORY_MB : Integer.MAX_VALUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return limit;
|
return limit;
|
||||||
|
|
|
@ -1,9 +1,5 @@
|
||||||
package com.boydti.fawe.object;
|
package com.boydti.fawe.object;
|
||||||
|
|
||||||
import com.boydti.fawe.configuration.ConfigurationSection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Jesse on 4/5/2016.
|
* Created by Jesse on 4/5/2016.
|
||||||
*/
|
*/
|
||||||
|
@ -14,6 +10,8 @@ public class FaweLimit {
|
||||||
public int MAX_ITERATIONS = 0;
|
public int MAX_ITERATIONS = 0;
|
||||||
public int MAX_BLOCKSTATES = 0;
|
public int MAX_BLOCKSTATES = 0;
|
||||||
public int MAX_ENTITIES = 0;
|
public int MAX_ENTITIES = 0;
|
||||||
|
public int MAX_HISTORY = 0;
|
||||||
|
|
||||||
|
|
||||||
public static FaweLimit MAX;
|
public static FaweLimit MAX;
|
||||||
static {
|
static {
|
||||||
|
@ -49,6 +47,7 @@ public class FaweLimit {
|
||||||
MAX.MAX_ITERATIONS = Integer.MAX_VALUE;
|
MAX.MAX_ITERATIONS = Integer.MAX_VALUE;
|
||||||
MAX.MAX_BLOCKSTATES = Integer.MAX_VALUE;
|
MAX.MAX_BLOCKSTATES = Integer.MAX_VALUE;
|
||||||
MAX.MAX_ENTITIES = Integer.MAX_VALUE;
|
MAX.MAX_ENTITIES = Integer.MAX_VALUE;
|
||||||
|
MAX.MAX_HISTORY = 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean MAX_CHANGES() {
|
public boolean MAX_CHANGES() {
|
||||||
|
@ -75,31 +74,6 @@ public class FaweLimit {
|
||||||
return MAX_ENTITIES-- > 0;
|
return MAX_ENTITIES-- > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean load(ConfigurationSection section, FaweLimit defaultLimit, boolean save) {
|
|
||||||
this.MAX_CHANGES = section.getInt("max-changes", defaultLimit == null ? MAX_CHANGES : defaultLimit.MAX_CHANGES);
|
|
||||||
this.MAX_FAILS = section.getInt("max-fails", defaultLimit == null ? MAX_FAILS : defaultLimit.MAX_FAILS);
|
|
||||||
this.MAX_CHECKS = section.getInt("max-checks", defaultLimit == null ? MAX_CHECKS : defaultLimit.MAX_CHECKS);
|
|
||||||
this.MAX_ITERATIONS = section.getInt("max-iterations", defaultLimit == null ? MAX_ITERATIONS : defaultLimit.MAX_ITERATIONS);
|
|
||||||
this.MAX_BLOCKSTATES = section.getInt("max-blockstates", defaultLimit == null ? MAX_BLOCKSTATES : defaultLimit.MAX_BLOCKSTATES);
|
|
||||||
this.MAX_ENTITIES = section.getInt("max-entities", defaultLimit == null ? MAX_ENTITIES : defaultLimit.MAX_ENTITIES);
|
|
||||||
boolean changed = false;
|
|
||||||
if (save) {
|
|
||||||
HashMap<String, Object> options = new HashMap<>();
|
|
||||||
options.put("max-changes", MAX_CHANGES);
|
|
||||||
options.put("max-fails", MAX_FAILS);
|
|
||||||
options.put("max-checks", MAX_CHECKS);
|
|
||||||
options.put("max-iterations", MAX_ITERATIONS);
|
|
||||||
options.put("max-blockstates", MAX_BLOCKSTATES);
|
|
||||||
options.put("max-entities", MAX_ENTITIES);
|
|
||||||
for (Map.Entry<String, Object> entry : options.entrySet()) {
|
|
||||||
if (!section.contains(entry.getKey())) {
|
|
||||||
section.set(entry.getKey(), entry.getValue());
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FaweLimit copy() {
|
public FaweLimit copy() {
|
||||||
FaweLimit limit = new FaweLimit();
|
FaweLimit limit = new FaweLimit();
|
||||||
|
@ -109,6 +83,7 @@ public class FaweLimit {
|
||||||
limit.MAX_ENTITIES = MAX_ENTITIES;
|
limit.MAX_ENTITIES = MAX_ENTITIES;
|
||||||
limit.MAX_FAILS = MAX_FAILS;
|
limit.MAX_FAILS = MAX_FAILS;
|
||||||
limit.MAX_ITERATIONS = MAX_ITERATIONS;
|
limit.MAX_ITERATIONS = MAX_ITERATIONS;
|
||||||
|
limit.MAX_HISTORY = MAX_HISTORY;
|
||||||
return limit;
|
return limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -180,7 +180,7 @@ public abstract class FawePlayer<T> {
|
||||||
FaweStreamChangeSet set = new DiskStorageHistory(world, uuid, index);
|
FaweStreamChangeSet set = new DiskStorageHistory(world, uuid, index);
|
||||||
EditSession edit = set.toEditSession(FawePlayer.this);
|
EditSession edit = set.toEditSession(FawePlayer.this);
|
||||||
if (world.equals(getWorld())) {
|
if (world.equals(getWorld())) {
|
||||||
session.remember(edit, false, false);
|
session.remember(edit, false, false, Integer.MAX_VALUE);
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,6 +150,11 @@ public class DiskStorageHistory extends FaweStreamChangeSet {
|
||||||
return bdFile.exists() ? (int) bdFile.length() : 0;
|
return bdFile.exists() ? (int) bdFile.length() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getSizeInMemory() {
|
||||||
|
return 80;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public OutputStream getBlockOS(int x, int y, int z) throws IOException {
|
public OutputStream getBlockOS(int x, int y, int z) throws IOException {
|
||||||
if (osBD != null) {
|
if (osBD != null) {
|
||||||
|
|
|
@ -46,6 +46,8 @@ public abstract class FaweStreamChangeSet extends FaweChangeSet {
|
||||||
|
|
||||||
public abstract int getCompressedSize();
|
public abstract int getCompressedSize();
|
||||||
|
|
||||||
|
public abstract long getSizeInMemory();
|
||||||
|
|
||||||
public abstract OutputStream getBlockOS(int x, int y, int z) throws IOException;
|
public abstract OutputStream getBlockOS(int x, int y, int z) throws IOException;
|
||||||
public abstract NBTOutputStream getEntityCreateOS() throws IOException;
|
public abstract NBTOutputStream getEntityCreateOS() throws IOException;
|
||||||
public abstract NBTOutputStream getEntityRemoveOS() throws IOException;
|
public abstract NBTOutputStream getEntityRemoveOS() throws IOException;
|
||||||
|
|
|
@ -91,6 +91,11 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet {
|
||||||
return ids == null ? 0 : ids.length;
|
return ids == null ? 0 : ids.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getSizeInMemory() {
|
||||||
|
return 92 + getCompressedSize();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public OutputStream getBlockOS(int x, int y, int z) throws IOException {
|
public OutputStream getBlockOS(int x, int y, int z) throws IOException {
|
||||||
if (idsStreamZip != null) {
|
if (idsStreamZip != null) {
|
||||||
|
|
|
@ -107,7 +107,9 @@ public class Schematic {
|
||||||
extent = new BlockTransformExtent(clipboard, transform, world.getWorldData().getBlockRegistry());
|
extent = new BlockTransformExtent(clipboard, transform, world.getWorldData().getBlockRegistry());
|
||||||
}
|
}
|
||||||
ForwardExtentCopy copy = new ForwardExtentCopy(extent, clipboard.getRegion(), clipboard.getOrigin(), editSession, to);
|
ForwardExtentCopy copy = new ForwardExtentCopy(extent, clipboard.getRegion(), clipboard.getOrigin(), editSession, to);
|
||||||
|
if (transform != null) {
|
||||||
copy.setTransform(transform);
|
copy.setTransform(transform);
|
||||||
|
}
|
||||||
if (!pasteAir) {
|
if (!pasteAir) {
|
||||||
copy.setSourceMask(new ExistingBlockMask(clipboard));
|
copy.setSourceMask(new ExistingBlockMask(clipboard));
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import com.boydti.fawe.object.FaweOutputStream;
|
||||||
import com.boydti.fawe.object.FawePlayer;
|
import com.boydti.fawe.object.FawePlayer;
|
||||||
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.CPUOptimizedChangeSet;
|
||||||
import com.boydti.fawe.object.changeset.FaweStreamChangeSet;
|
import com.boydti.fawe.object.changeset.FaweStreamChangeSet;
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
import com.sk89q.jnbt.DoubleTag;
|
import com.sk89q.jnbt.DoubleTag;
|
||||||
|
@ -17,6 +18,7 @@ import com.sk89q.jnbt.ListTag;
|
||||||
import com.sk89q.jnbt.StringTag;
|
import com.sk89q.jnbt.StringTag;
|
||||||
import com.sk89q.jnbt.Tag;
|
import com.sk89q.jnbt.Tag;
|
||||||
import com.sk89q.worldedit.entity.Entity;
|
import com.sk89q.worldedit.entity.Entity;
|
||||||
|
import com.sk89q.worldedit.history.changeset.ChangeSet;
|
||||||
import com.sk89q.worldedit.util.Location;
|
import com.sk89q.worldedit.util.Location;
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
|
@ -87,6 +89,18 @@ public class MainUtil {
|
||||||
return getCompressedOS(os, Settings.HISTORY.COMPRESSION_LEVEL);
|
return getCompressedOS(os, Settings.HISTORY.COMPRESSION_LEVEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long getSizeInMemory(ChangeSet changeSet) {
|
||||||
|
if (changeSet instanceof FaweStreamChangeSet){
|
||||||
|
return 92 + ((FaweStreamChangeSet) changeSet).getSizeInMemory();
|
||||||
|
} else if (changeSet instanceof CPUOptimizedChangeSet) {
|
||||||
|
return changeSet.size() + 32;
|
||||||
|
} else if (changeSet != null) {
|
||||||
|
return changeSet.size() * 128;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static FaweOutputStream getCompressedOS(OutputStream os, int amount) throws IOException {
|
public static FaweOutputStream getCompressedOS(OutputStream os, int amount) throws IOException {
|
||||||
os.write((byte) amount);
|
os.write((byte) amount);
|
||||||
os = new BufferedOutputStream(os, Settings.HISTORY.BUFFER_SIZE);
|
os = new BufferedOutputStream(os, Settings.HISTORY.BUFFER_SIZE);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.boydti.fawe.wrappers;
|
package com.boydti.fawe.wrappers;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
|
import com.boydti.fawe.object.FawePlayer;
|
||||||
import com.boydti.fawe.object.RunnableVal;
|
import com.boydti.fawe.object.RunnableVal;
|
||||||
import com.boydti.fawe.util.MainUtil;
|
import com.boydti.fawe.util.MainUtil;
|
||||||
import com.boydti.fawe.util.TaskManager;
|
import com.boydti.fawe.util.TaskManager;
|
||||||
|
@ -205,7 +206,7 @@ public class PlayerWrapper implements Player {
|
||||||
edit.setBlock(new Vector(x, y - 1, z), new BaseBlock( BlockType.GLASS.getID()));
|
edit.setBlock(new Vector(x, y - 1, z), new BaseBlock( BlockType.GLASS.getID()));
|
||||||
LocalSession session = Fawe.get().getWorldEdit().getSession(this);
|
LocalSession session = Fawe.get().getWorldEdit().getSession(this);
|
||||||
if (session != null) {
|
if (session != null) {
|
||||||
session.remember(edit);
|
session.remember(edit, true, false, FawePlayer.wrap(this).getLimit().MAX_HISTORY);
|
||||||
}
|
}
|
||||||
} catch (MaxChangedBlocksException e) {
|
} catch (MaxChangedBlocksException e) {
|
||||||
MainUtil.handleError(e);
|
MainUtil.handleError(e);
|
||||||
|
|
|
@ -19,8 +19,9 @@
|
||||||
|
|
||||||
package com.sk89q.worldedit;
|
package com.sk89q.worldedit;
|
||||||
|
|
||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.object.FawePlayer;
|
||||||
import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard;
|
import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard;
|
||||||
|
import com.boydti.fawe.util.MainUtil;
|
||||||
import com.sk89q.jchronic.Chronic;
|
import com.sk89q.jchronic.Chronic;
|
||||||
import com.sk89q.jchronic.Options;
|
import com.sk89q.jchronic.Options;
|
||||||
import com.sk89q.jchronic.utils.Span;
|
import com.sk89q.jchronic.utils.Span;
|
||||||
|
@ -66,6 +67,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
*/
|
*/
|
||||||
public class LocalSession {
|
public class LocalSession {
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public transient static int MAX_HISTORY_SIZE = 15;
|
public transient static int MAX_HISTORY_SIZE = 15;
|
||||||
|
|
||||||
// Non-session related fields
|
// Non-session related fields
|
||||||
|
@ -77,6 +79,7 @@ public class LocalSession {
|
||||||
private transient boolean placeAtPos1 = false;
|
private transient boolean placeAtPos1 = false;
|
||||||
private transient List<EditSession> history = Collections.synchronizedList(new LinkedList<EditSession>());
|
private transient List<EditSession> history = Collections.synchronizedList(new LinkedList<EditSession>());
|
||||||
private transient volatile int historyPointer = 0;
|
private transient volatile int historyPointer = 0;
|
||||||
|
private transient volatile long historySize = 0;
|
||||||
private transient ClipboardHolder clipboard;
|
private transient ClipboardHolder clipboard;
|
||||||
private transient boolean toolControl = true;
|
private transient boolean toolControl = true;
|
||||||
private transient boolean superPickaxe = false;
|
private transient boolean superPickaxe = false;
|
||||||
|
@ -184,6 +187,7 @@ public class LocalSession {
|
||||||
public void clearHistory() {
|
public void clearHistory() {
|
||||||
history.clear();
|
history.clear();
|
||||||
historyPointer = 0;
|
historyPointer = 0;
|
||||||
|
historySize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -193,31 +197,31 @@ public class LocalSession {
|
||||||
* @param editSession the edit session
|
* @param editSession the edit session
|
||||||
*/
|
*/
|
||||||
public void remember(EditSession editSession) {
|
public void remember(EditSession editSession) {
|
||||||
remember(editSession, true, false);
|
FawePlayer fp = editSession.getPlayer();
|
||||||
|
int limit = fp == null ? Integer.MAX_VALUE : fp.getLimit().MAX_HISTORY;
|
||||||
|
remember(editSession, true, false, limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void remember(final EditSession editSession, final boolean append, final boolean sendMessage) {
|
public void remember(final EditSession editSession, final boolean append, final boolean sendMessage, int limitMb) {
|
||||||
if (editSession == null || editSession.getChangeSet() == null) {
|
if (editSession == null || editSession.getChangeSet() == null || limitMb == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// It should have already been flushed, but just in case!
|
// It should have already been flushed, but just in case!
|
||||||
editSession.flushQueue();
|
editSession.flushQueue();
|
||||||
if (Settings.HISTORY.USE_DISK) {
|
|
||||||
MAX_HISTORY_SIZE = Integer.MAX_VALUE;
|
|
||||||
} else if (MAX_HISTORY_SIZE == Integer.MAX_VALUE) {
|
|
||||||
MAX_HISTORY_SIZE = 15;
|
|
||||||
}
|
|
||||||
// Don't store anything if no changes were made
|
// Don't store anything if no changes were made
|
||||||
if (editSession.size() == 0 || editSession.hasFastMode()) {
|
if (editSession.size() == 0 || editSession.hasFastMode()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
System.out.println("SIZE: " + historySize + " | " + history.size());
|
||||||
// Destroy any sessions after this undo point
|
// Destroy any sessions after this undo point
|
||||||
if (append) {
|
if (append) {
|
||||||
while (historyPointer < history.size()) {
|
while (historyPointer < history.size()) {
|
||||||
|
EditSession item = history.get(historyPointer);
|
||||||
|
historySize -= MainUtil.getSizeInMemory(item.getChangeSet());
|
||||||
history.remove(historyPointer);
|
history.remove(historyPointer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
historySize += MainUtil.getSizeInMemory(editSession.getChangeSet());
|
||||||
if (append) {
|
if (append) {
|
||||||
history.add(editSession);
|
history.add(editSession);
|
||||||
historyPointer = history.size();
|
historyPointer = history.size();
|
||||||
|
@ -225,7 +229,9 @@ public class LocalSession {
|
||||||
history.add(0, editSession);
|
history.add(0, editSession);
|
||||||
historyPointer++;
|
historyPointer++;
|
||||||
}
|
}
|
||||||
while (history.size() > MAX_HISTORY_SIZE) {
|
while ((history.size() > MAX_HISTORY_SIZE || historySize > limitMb) && history.size() > 0) {
|
||||||
|
EditSession item = history.get(0);
|
||||||
|
historySize -= MainUtil.getSizeInMemory(item.getChangeSet());
|
||||||
history.remove(0);
|
history.remove(0);
|
||||||
historyPointer--;
|
historyPointer--;
|
||||||
}
|
}
|
||||||
|
|
|
@ -299,7 +299,7 @@ public final class CommandManager {
|
||||||
if (editSession != null) {
|
if (editSession != null) {
|
||||||
editSession.flushQueue();
|
editSession.flushQueue();
|
||||||
worldEdit.flushBlockBag(actor, editSession);
|
worldEdit.flushBlockBag(actor, editSession);
|
||||||
session.remember(editSession, true, true);
|
session.remember(editSession);
|
||||||
hasSession = editSession.size() > 0;
|
hasSession = editSession.size() > 0;
|
||||||
}
|
}
|
||||||
if (fp != null) {
|
if (fp != null) {
|
||||||
|
|
Loading…
Reference in New Issue