SteamWar/BauSystem
Archiviert
13
0

Add Regional Reset History #211

Manuell gemergt
YoyoNow hat 9 Commits von reset_history nach master 2021-04-02 20:45:17 +02:00 zusammengeführt
7 geänderte Dateien mit 279 neuen und 87 gelöschten Zeilen

Datei anzeigen

@ -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;
}
}

Datei anzeigen

@ -21,7 +21,6 @@ package de.steamwar.bausystem.world;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.bukkit.BukkitWorld;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
@ -29,14 +28,7 @@ import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.transform.AffineTransform;
import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.world.block.BaseBlock;
import net.minecraft.server.v1_15_R1.BlockPosition;
import net.minecraft.server.v1_15_R1.WorldServer;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_15_R1.block.data.CraftBlockData;
import java.io.File;
import java.io.FileInputStream;
@ -47,7 +39,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 +47,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);
Veraltet
Review

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.

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.
}
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,48 +62,11 @@ 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);
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());
e.flushSession();
}
static void fastpaste(File file, int x, int y, int z, boolean rotate) {
Clipboard clipboard;
try {
clipboard = Objects.requireNonNull(ClipboardFormats.findByFile(file)).getReader(new FileInputStream(file)).read();
} catch (NullPointerException | IOException e) {
throw new SecurityException("Bausystem schematic not found", e);
}
BlockVector3 dimensions = clipboard.getDimensions();
BlockVector3 v = BlockVector3.at(x, y, z);
BlockVector3 offset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin());
if (rotate) {
v = v.add(dimensions.getX() / 2 + dimensions.getX() % 2, 0, dimensions.getZ() / 2 + dimensions.getZ() % 2).subtract(offset.multiply(-1, 1, -1)).subtract(1, 0, 1);
} else {
v = v.subtract(dimensions.getX() / 2 - dimensions.getX() % 2, 0, dimensions.getZ() / 2 - dimensions.getZ() % 2).subtract(offset);
}
WorldServer world = ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle();
v = v.add(offset);
for (int X = v.getBlockX(); X < v.getBlockX() + dimensions.getBlockX(); X++) {
for (int Y = v.getBlockY(); Y < v.getBlockY() + dimensions.getBlockY(); Y++) {
for (int Z = v.getBlockZ(); Z < v.getBlockZ() + dimensions.getBlockZ(); Z++) {
BlockPosition blockPos = new BlockPosition(X, Y, Z);
BaseBlock fullBlock = clipboard.getFullBlock(BlockVector3.at(X, Y, Z).subtract(v).add(clipboard.getRegion().getMinimumPoint()));
BlockData replaceTo = BukkitAdapter.adapt(fullBlock);
world.removeTileEntity(blockPos);
if (replaceTo == null)
world.setTypeAndData(blockPos, ((CraftBlockData) Material.AIR.createBlockData()).getState(), 1042);
else
world.setTypeAndData(new BlockPosition(X, Y, Z), ((CraftBlockData) replaceTo).getState(), 1042);
world.getChunkProvider().flagDirty(blockPos);
}
}
return e;
}
}
}

Datei anzeigen

@ -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();
}
}

Datei anzeigen

@ -91,6 +91,7 @@ public class BauSystem extends JavaPlugin implements Listener {
new CommandRedstoneTester();
new CommandGUI();
new CommandWorldSpawn();
new CommandRegion();
Bukkit.getPluginManager().registerEvents(this, this);
Bukkit.getPluginManager().registerEvents(new RegionListener(), this);

Datei anzeigen

@ -0,0 +1,73 @@
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 de.steamwar.command.SWCommand;
import org.bukkit.entity.Player;
public class CommandRegion extends SWCommand {
public CommandRegion() {
super("region", "rg");
}
@Register
public void genericCommand(Player player) {
genericHelp(player);
}
@Register(help = true)
public void genericHelp(Player player, String... args) {
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");
}
@Register
public void undoCommand(Player p, Action action) {
if(!permissionCheck(p)) return;
Region region = Region.getRegion(p.getLocation());
if(checkGlobalRegion(region, p)) return;
switch (action) {
case UNDO:
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(region.redo()) {
p.sendMessage(BauSystem.PREFIX + "Letzte Aktion wiederhohlt");
} else {
p.sendMessage(BauSystem.PREFIX + "§cNichts zum wiederhohlen");
}
break;
default:
genericHelp(p);
}
}
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;
}
private boolean permissionCheck(Player player) {
if (Welt.noPermission(player, Permission.worldedit)) {
player.sendMessage(BauSystem.PREFIX + "§cDu darfst hier nicht die Region verändern");
return false;
}
return true;
}
enum Action {
UNDO,
REDO
}
}

Datei anzeigen

@ -68,7 +68,7 @@ public class CommandReset extends SWCommand {
return;
}
try {
region.reset(null);
region.reset(schem);
p.sendMessage(BauSystem.PREFIX + "§7Region zurückgesetzt");
} catch (IOException e) {
p.sendMessage(BauSystem.PREFIX + "§cFehler beim Zurücksetzen der Region");

Datei anzeigen

@ -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() {
@ -192,7 +198,8 @@ public class Region {
}
public void protect(Schematic schem) throws IOException, NoClipboardException {
prototype.protect(this, schem);
initSessions();
undosessions.push(prototype.protect(this, schem));
}
public boolean hasExtensionAreaRegistered() {
@ -203,6 +210,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 +368,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));
}
}
}