Add Regional Reset History #211
@ -40,7 +40,7 @@ class Region_12 {
|
||||
private Region_12() {
|
||||
}
|
||||
|
||||
static void paste(File file, int x, int y, int z, boolean rotate) {
|
||||
static EditSession paste(File file, int x, int y, int z, boolean rotate) {
|
||||
World w = new BukkitWorld(Bukkit.getWorlds().get(0));
|
||||
Clipboard clipboard;
|
||||
try {
|
||||
@ -49,10 +49,10 @@ class Region_12 {
|
||||
throw new SecurityException("Bausystem schematic not found", e);
|
||||
}
|
||||
|
||||
paste(clipboard, x, y, z, rotate);
|
||||
return paste(clipboard, x, y, z, rotate);
|
||||
}
|
||||
|
||||
static void paste(Clipboard clipboard, int x, int y, int z, boolean rotate) {
|
||||
static EditSession paste(Clipboard clipboard, int x, int y, int z, boolean rotate) {
|
||||
World w = new BukkitWorld(Bukkit.getWorlds().get(0));
|
||||
|
||||
Vector dimensions = clipboard.getDimensions();
|
||||
@ -70,6 +70,6 @@ class Region_12 {
|
||||
ClipboardHolder ch = new ClipboardHolder(clipboard, w.getWorldData());
|
||||
ch.setTransform(aT);
|
||||
Operations.completeBlindly(ch.createPaste(e, w.getWorldData()).to(v).build());
|
||||
e.flushQueue();
|
||||
return e;
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ class Region_15 {
|
||||
private Region_15() {
|
||||
}
|
||||
|
||||
static void paste(File file, int x, int y, int z, boolean rotate) {
|
||||
static EditSession paste(File file, int x, int y, int z, boolean rotate) {
|
||||
|
||||
Clipboard clipboard;
|
||||
try {
|
||||
clipboard = Objects.requireNonNull(ClipboardFormats.findByFile(file)).getReader(new FileInputStream(file)).read();
|
||||
@ -55,10 +55,10 @@ class Region_15 {
|
||||
throw new SecurityException("Bausystem schematic not found", e);
|
||||
}
|
||||
|
||||
paste(clipboard, x, y, z, rotate);
|
||||
return paste(clipboard, x, y, z, rotate);
|
||||
}
|
||||
|
||||
static void paste(Clipboard clipboard, int x, int y, int z, boolean rotate) {
|
||||
static EditSession paste(Clipboard clipboard, int x, int y, int z, boolean rotate) {
|
||||
BlockVector3 dimensions = clipboard.getDimensions();
|
||||
BlockVector3 v = BlockVector3.at(x, y, z);
|
||||
BlockVector3 offset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin());
|
||||
@ -70,11 +70,12 @@ class Region_15 {
|
||||
v = v.subtract(dimensions.getX() / 2 - dimensions.getX() % 2, 0, dimensions.getZ() / 2 - dimensions.getZ() % 2).subtract(offset);
|
||||
}
|
||||
|
||||
EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1);
|
||||
ClipboardHolder ch = new ClipboardHolder(clipboard);
|
||||
ch.setTransform(aT);
|
||||
Operations.completeBlindly(ch.createPaste(e).to(v).build());
|
||||
e.flushSession();
|
||||
try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) {
|
||||
ClipboardHolder ch = new ClipboardHolder(clipboard);
|
||||
ch.setTransform(aT);
|
||||
Operations.completeBlindly(ch.createPaste(e).to(v).build());
|
||||
return e;
|
||||
}
|
||||
}
|
||||
|
||||
static void fastpaste(File file, int x, int y, int z, boolean rotate) {
|
||||
|
124
BauSystem_API/src/de/steamwar/bausystem/world/SizedStack.java
Normale Datei
124
BauSystem_API/src/de/steamwar/bausystem/world/SizedStack.java
Normale Datei
@ -0,0 +1,124 @@
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
@SuppressWarnings({"unused", "UnusedReturnValue"})
|
||||
public class SizedStack<T> {
|
||||
|
||||
private int maxSize;
|
||||
private T[] data;
|
||||
private int size;
|
||||
private int head;
|
||||
|
||||
public SizedStack(int size) {
|
||||
this.maxSize = size;
|
||||
//noinspection unchecked
|
||||
this.data = (T[]) new Object[this.maxSize];
|
||||
this.head = 0;
|
||||
this.size = 0;
|
||||
}
|
||||
|
||||
public T push(final T element) {
|
||||
this.data[this.head] = element;
|
||||
this.increaseHead();
|
||||
this.increaseSize();
|
||||
return element;
|
||||
}
|
||||
|
||||
public T pop() {
|
||||
this.decreaseHead();
|
||||
this.decreaseSize();
|
||||
final T result = this.data[this.head];
|
||||
this.data[this.head] = null;
|
||||
return result;
|
||||
}
|
||||
|
||||
public T peek() {
|
||||
return this.data[this.head];
|
||||
}
|
||||
|
||||
public boolean empty() {
|
||||
return this.size == 0;
|
||||
}
|
||||
|
||||
protected boolean canEqual(final Object other) {
|
||||
return other instanceof SizedStack;
|
||||
}
|
||||
|
||||
private void increaseHead() {
|
||||
this.head++;
|
||||
while (this.head > this.maxSize - 1) {
|
||||
this.head -= this.maxSize;
|
||||
}
|
||||
}
|
||||
|
||||
private void decreaseHead() {
|
||||
this.head--;
|
||||
while (this.head < 0) {
|
||||
this.head += this.maxSize;
|
||||
}
|
||||
}
|
||||
|
||||
private void increaseSize() {
|
||||
if (this.size < this.maxSize) {
|
||||
this.size++;
|
||||
}
|
||||
}
|
||||
|
||||
private void decreaseSize() {
|
||||
if (this.size > 0) {
|
||||
this.size--;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
result = result * PRIME + this.maxSize;
|
||||
result = result * PRIME + this.toString().hashCode();
|
||||
result = result * PRIME + this.size;
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (o == this) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof SizedStack)) {
|
||||
return false;
|
||||
}
|
||||
final SizedStack<?> other = (SizedStack<?>) o;
|
||||
if (!other.canEqual(this)) {
|
||||
return false;
|
||||
}
|
||||
if (this.maxSize != other.maxSize) {
|
||||
return false;
|
||||
}
|
||||
if (this.size != other.size) {
|
||||
return false;
|
||||
}
|
||||
if (!this.data.getClass().equals(other.data.getClass())) {
|
||||
return false;
|
||||
}
|
||||
return this.toString().equals(other.toString());
|
||||
}
|
||||
|
||||
public int getMaxSize() {
|
||||
return maxSize;
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
final StringBuilder result = new StringBuilder("[");
|
||||
for (int i = 0; i < this.size - 1; i++) {
|
||||
result.append(this.data[(this.head - i - 1 < 0) ? (this.head - i - 1 + this.maxSize) : (this.head - i - 1)]).append(",");
|
||||
}
|
||||
result.append(this.data[(this.head - this.size < 0) ? (this.head - this.size + this.maxSize) : (this.head - this.size)]);
|
||||
result.append("]");
|
||||
return result.toString();
|
||||
}
|
||||
}
|
@ -100,6 +100,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
getCommand("simulator").setExecutor(new CommandSimulator());
|
||||
getCommand("simulator").setTabCompleter(new CommandSimulatorTabCompleter());
|
||||
getCommand("gui").setExecutor(new CommandGUI());
|
||||
getCommand("region").setExecutor(new CommandRegion());
|
||||
|
||||
Bukkit.getPluginManager().registerEvents(this, this);
|
||||
Bukkit.getPluginManager().registerEvents(new RegionListener(), this);
|
||||
|
65
BauSystem_Main/src/de/steamwar/bausystem/commands/CommandRegion.java
Normale Datei
65
BauSystem_Main/src/de/steamwar/bausystem/commands/CommandRegion.java
Normale Datei
@ -0,0 +1,65 @@
|
||||
package de.steamwar.bausystem.commands;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.world.Region;
|
||||
import de.steamwar.bausystem.world.Welt;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class CommandRegion implements CommandExecutor {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String s, String[] args) {
|
||||
if (!(sender instanceof Player))
|
||||
return false;
|
||||
|
||||
Player p = (Player) sender;
|
||||
if (Welt.noPermission(p, Permission.world)) {
|
||||
p.sendMessage(BauSystem.PREFIX + "§cDu darfst hier nicht die Region zurücksetzen");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(args.length == 0) {
|
||||
sendHelp(p);
|
||||
} else {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "undo":
|
||||
if(checkGlobalRegion(region, p)) return false;
|
||||
if(region.undo()) {
|
||||
p.sendMessage(BauSystem.PREFIX + "Letzte Aktion rückgangig gemacht");
|
||||
} else {
|
||||
p.sendMessage(BauSystem.PREFIX + "§cNichts zum rückgängig machen");
|
||||
}
|
||||
break;
|
||||
case "redo":
|
||||
if(checkGlobalRegion(region, p)) return false;
|
||||
if(region.redo()) {
|
||||
p.sendMessage(BauSystem.PREFIX + "Letzte Aktion wiederhohlt");
|
||||
} else {
|
||||
p.sendMessage(BauSystem.PREFIX + "§cNichts zum wiederhohlen");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
sendHelp(p);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void sendHelp(Player player) {
|
||||
player.sendMessage(BauSystem.PREFIX + "§8/§7region undo §8- §7Mache die letzten 10 /testblock oder /reset rückgängig");
|
||||
player.sendMessage(BauSystem.PREFIX + "§8/§7region redo §8- §7Wiederhohle die letzten 10 §8/§7rg undo");
|
||||
}
|
||||
|
||||
static boolean checkGlobalRegion(Region region, Player p) {
|
||||
if(Region.GlobalRegion.isGlobalRegion(region)) {
|
||||
p.sendMessage(BauSystem.PREFIX + "§cDu bist in keiner Region");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -59,7 +59,7 @@ public class CommandReset implements CommandExecutor {
|
||||
}
|
||||
region.reset(schem);
|
||||
} else {
|
||||
region.fastreset();
|
||||
region.reset();
|
||||
}
|
||||
player.sendMessage(BauSystem.PREFIX + "§7Region zurückgesetzt");
|
||||
} catch (Exception e) {
|
||||
|
@ -19,9 +19,10 @@
|
||||
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||
import de.steamwar.bausystem.commands.CommandTNT.TNTMode;
|
||||
import de.steamwar.core.VersionedRunnable;
|
||||
import de.steamwar.core.VersionedCallable;
|
||||
import de.steamwar.sql.NoClipboardException;
|
||||
import de.steamwar.sql.Schematic;
|
||||
import org.bukkit.Bukkit;
|
||||
@ -85,6 +86,8 @@ public class Region {
|
||||
private final Prototype prototype;
|
||||
private final String optionsLinkedWith; // nullable
|
||||
private Region linkedRegion = null; // nullable
|
||||
private SizedStack<EditSession> undosessions;
|
||||
private SizedStack<EditSession> redosessions;
|
||||
|
||||
private TNTMode tntMode = Region.buildAreaEnabled() ? TNTMode.ONLY_TB : TNTMode.OFF;
|
||||
private boolean freeze = false;
|
||||
@ -171,12 +174,14 @@ public class Region {
|
||||
return prototype.buildArea.inRegionExtension(this, l);
|
||||
}
|
||||
|
||||
public void fastreset() {
|
||||
prototype.fastreset(this);
|
||||
public void reset() throws IOException {
|
||||
initSessions();
|
||||
undosessions.push(prototype.reset(this, null));
|
||||
}
|
||||
|
||||
public void reset(Schematic schem) throws IOException, NoClipboardException {
|
||||
prototype.reset(this, schem);
|
||||
initSessions();
|
||||
undosessions.push(prototype.reset(this, schem));
|
||||
}
|
||||
|
||||
public boolean hasTestblock() {
|
||||
@ -184,7 +189,8 @@ public class Region {
|
||||
}
|
||||
|
||||
public void resetTestblock(Schematic schem) throws IOException, NoClipboardException {
|
||||
prototype.resetTestblock(this, schem);
|
||||
initSessions();
|
||||
undosessions.push(prototype.resetTestblock(this, schem));
|
||||
}
|
||||
|
||||
public boolean hasProtection() {
|
||||
@ -203,6 +209,47 @@ public class Region {
|
||||
return prototype.testblock.extensionPrototypeArea;
|
||||
}
|
||||
|
||||
private void initSessions() {
|
||||
if(undosessions == null) {
|
||||
undosessions = new SizedStack<>(20);
|
||||
redosessions = new SizedStack<>(20);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean undo() {
|
||||
initSessions();
|
||||
EditSession session = null;
|
||||
try {
|
||||
session = undosessions.pop();
|
||||
if(session == null)
|
||||
return false;
|
||||
session.undo(session);
|
||||
redosessions.push(session);
|
||||
return true;
|
||||
} finally {
|
||||
if (session != null) {
|
||||
session.flushSession();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean redo() {
|
||||
initSessions();
|
||||
EditSession session = null;
|
||||
try {
|
||||
session = redosessions.pop();
|
||||
if(session == null)
|
||||
return false;
|
||||
session.redo(session);
|
||||
undosessions.push(session);
|
||||
return true;
|
||||
} finally {
|
||||
if (session != null) {
|
||||
session.flushSession();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class GlobalRegion extends Region {
|
||||
|
||||
private static final GlobalRegion GLOBAL_REGION = new GlobalRegion();
|
||||
@ -320,59 +367,50 @@ public class Region {
|
||||
inRange(l.getZ(), region.minZ + offsetZ - extensionNegativeZ + 1, sizeZ + extensionNegativeZ - 1 + extensionPositiveZ);
|
||||
}
|
||||
|
||||
public void fastreset(Region region) {
|
||||
File file = new File(schematic);
|
||||
int x = region.minX + offsetX + sizeX / 2;
|
||||
int y = region.minY + offsetY;
|
||||
int z = region.minZ + offsetZ + sizeZ / 2;
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> Region_12.paste(file, x, y, z, rotate), 8),
|
||||
new VersionedRunnable(() -> Region_15.fastpaste(file, x, y, z, rotate), 15));
|
||||
}
|
||||
|
||||
public void reset(Region region, Schematic schem) throws IOException, NoClipboardException {
|
||||
public EditSession reset(Region region, Schematic schem) throws IOException, NoClipboardException {
|
||||
int x = region.minX + offsetX + sizeX / 2;
|
||||
int y = region.minY + offsetY;
|
||||
int z = region.minZ + offsetZ + sizeZ / 2;
|
||||
if (schem == null)
|
||||
paste(new File(schematic), x, y, z, rotate);
|
||||
return paste(new File(schematic), x, y, z, rotate);
|
||||
else
|
||||
paste(schem.load(), x, y, z, rotate);
|
||||
return paste(schem.load(), x, y, z, rotate);
|
||||
}
|
||||
|
||||
public boolean hasProtection() {
|
||||
return protectSchematic != null;
|
||||
}
|
||||
|
||||
public void protect(Region region, Schematic schem) throws IOException, NoClipboardException {
|
||||
public EditSession protect(Region region, Schematic schem) throws IOException, NoClipboardException {
|
||||
int x = region.minX + offsetX + sizeX / 2;
|
||||
int y = region.minY + testblock.offsetY - 1;
|
||||
int z = region.minZ + offsetZ + sizeZ / 2;
|
||||
if (schem == null)
|
||||
paste(new File(protectSchematic), x, y, z, rotate);
|
||||
return paste(new File(protectSchematic), x, y, z, rotate);
|
||||
else
|
||||
paste(schem.load(), x, y, z, rotate);
|
||||
return paste(schem.load(), x, y, z, rotate);
|
||||
}
|
||||
|
||||
public boolean hasTestblock() {
|
||||
return testblock != null;
|
||||
}
|
||||
|
||||
public void resetTestblock(Region region, Schematic schem) throws IOException, NoClipboardException {
|
||||
testblock.reset(region, schem);
|
||||
public EditSession resetTestblock(Region region, Schematic schem) throws IOException, NoClipboardException {
|
||||
return testblock.reset(region, schem);
|
||||
}
|
||||
|
||||
private static boolean inRange(double l, int min, int size) {
|
||||
return min <= l && l <= min + size;
|
||||
}
|
||||
|
||||
private static void paste(File file, int x, int y, int z, boolean rotate) { //Type of protect
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> Region_12.paste(file, x, y, z, rotate), 8),
|
||||
new VersionedRunnable(() -> Region_15.paste(file, x, y, z, rotate), 15));
|
||||
private static EditSession paste(File file, int x, int y, int z, boolean rotate) { //Type of protect
|
||||
return (EditSession) VersionedCallable.call(new VersionedCallable(() -> Region_12.paste(file, x, y, z, rotate), 8),
|
||||
new VersionedCallable(() -> Region_15.paste(file, x, y, z, rotate), 15));
|
||||
}
|
||||
|
||||
private static void paste(Clipboard clipboard, int x, int y, int z, boolean rotate) {
|
||||
VersionedRunnable.call(new VersionedRunnable(() -> Region_12.paste(clipboard, x, y, z, rotate), 8),
|
||||
new VersionedRunnable(() -> Region_15.paste(clipboard, x, y, z, rotate), 15));
|
||||
private static EditSession paste(Clipboard clipboard, int x, int y, int z, boolean rotate) {
|
||||
return (EditSession) VersionedCallable.call(new VersionedCallable(() -> Region_12.paste(clipboard, x, y, z, rotate), 8),
|
||||
new VersionedCallable(() -> Region_15.paste(clipboard, x, y, z, rotate), 15));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -38,4 +38,6 @@ commands:
|
||||
script:
|
||||
simulator:
|
||||
aliases: sim
|
||||
gui:
|
||||
gui:
|
||||
region:
|
||||
aliases: rg
|
In neuem Issue referenzieren
Einen Benutzer sperren
Was machst du mit dem fastreset? das muss auch da rein bzw du kannst es raus nehmen, wenn das WorldEdit fertig ist, weil das dann langsamer ist als WE.