uploading what I have so far, unfinished
This commit is contained in:
commit
88705dc761
7 changed files with 338 additions and 0 deletions
12
.classpath
Normal file
12
.classpath
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||||
|
<classpathentry kind="lib" path="/Users/kevinmathewson/Local_Test_Server_1.12.2/craftbukkit-1.12.2.jar" sourcepath="/Users/kevinmathewson/Local_Test_Server_1.12.2/Spigot/CraftBukkit/src/main"/>
|
||||||
|
<classpathentry kind="lib" path="/Users/kevinmathewson/Local_Test_Server_1.12.2/spigot-1.12.2.jar">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="javadoc_location" value="jar:file:/Users/kevinmathewson/Local_Test_Server_1.12.2/craftbukkit-1.12.2.jar!/"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/bin/
|
17
.project
Normal file
17
.project
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>SimpleWarBackup</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
11
.settings/org.eclipse.jdt.core.prefs
Normal file
11
.settings/org.eclipse.jdt.core.prefs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
206
src/simpleWarBackup/ChunkNBTWriter.java
Normal file
206
src/simpleWarBackup/ChunkNBTWriter.java
Normal file
|
@ -0,0 +1,206 @@
|
||||||
|
package simpleWarBackup;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.server.v1_12_R1.Block;
|
||||||
|
import net.minecraft.server.v1_12_R1.Chunk;
|
||||||
|
import net.minecraft.server.v1_12_R1.ChunkSection;
|
||||||
|
import net.minecraft.server.v1_12_R1.Entity;
|
||||||
|
import net.minecraft.server.v1_12_R1.MinecraftKey;
|
||||||
|
import net.minecraft.server.v1_12_R1.NBTTagCompound;
|
||||||
|
import net.minecraft.server.v1_12_R1.NBTTagList;
|
||||||
|
import net.minecraft.server.v1_12_R1.NextTickListEntry;
|
||||||
|
import net.minecraft.server.v1_12_R1.NibbleArray;
|
||||||
|
import net.minecraft.server.v1_12_R1.TileEntity;
|
||||||
|
import net.minecraft.server.v1_12_R1.World;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Methods for writing a chunk's data to NBT. These have been copied from private, static
|
||||||
|
* methods in ChunkRegionLoader, an NMS class. Changes have been commented, so that these
|
||||||
|
* methods may be more easily updated as Spigot releases newer versions.
|
||||||
|
*/
|
||||||
|
public final class ChunkNBTWriter
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* To find the new data version after an update,
|
||||||
|
* open ChunkRegionLoader in an editor and search
|
||||||
|
* for "DataVersion"
|
||||||
|
*/
|
||||||
|
private static final int DATA_VERSION = 1343;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO Loosely copied from an NMS void method called saveChunk.
|
||||||
|
*
|
||||||
|
* @param chunk
|
||||||
|
* @param world
|
||||||
|
* @param DATA_VERSION
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static NBTTagCompound getChunkNBT(Chunk chunk, World world)
|
||||||
|
{
|
||||||
|
NBTTagCompound chunkNBT = new NBTTagCompound();
|
||||||
|
NBTTagCompound levelNBT = new NBTTagCompound();
|
||||||
|
|
||||||
|
chunkNBT.set("Level", levelNBT);
|
||||||
|
chunkNBT.setInt("DataVersion", DATA_VERSION);
|
||||||
|
|
||||||
|
ChunkNBTWriter.saveEntities(levelNBT, chunk, world);
|
||||||
|
ChunkNBTWriter.saveBody(levelNBT, chunk, world);
|
||||||
|
|
||||||
|
return chunkNBT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copied from a private method of the same name in the NMS class ChunkRegionLoader,
|
||||||
|
* version 1.12.2. Local variables have been renamed and some passages reformatted.
|
||||||
|
* ChunkRegionLoader 1.12.2 calls this private method only once, in saveChunk(...).
|
||||||
|
*
|
||||||
|
* This method saves a chunk's entity data to the given NBTTagCompound. The given
|
||||||
|
* compound is assumed to be the chunk's "level" compound, i.e. the compound holding
|
||||||
|
* all of the chunk's information except its Data Version.
|
||||||
|
*
|
||||||
|
* @param levelNBT
|
||||||
|
* @param chunk
|
||||||
|
* @param world
|
||||||
|
*/
|
||||||
|
public static void saveEntities(NBTTagCompound levelNBT, Chunk chunk, World world)
|
||||||
|
{
|
||||||
|
//the three TagLists to be written to levelNBT
|
||||||
|
NBTTagList entitiesNBT = new NBTTagList();
|
||||||
|
NBTTagList tileEntitiesNBT = new NBTTagList();
|
||||||
|
NBTTagList tileTicksNBT;
|
||||||
|
|
||||||
|
//reusable iteration variables
|
||||||
|
NBTTagCompound compound;
|
||||||
|
Iterator iterator;
|
||||||
|
Entity entity;
|
||||||
|
TileEntity tileEntity;
|
||||||
|
NextTickListEntry nextTickListEntry;
|
||||||
|
MinecraftKey minecraftKey;
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------ENTITIES--------------------
|
||||||
|
//chunk.g(false);
|
||||||
|
for (int i = 0; i < chunk.getEntitySlices().length; ++i)
|
||||||
|
{
|
||||||
|
iterator = chunk.getEntitySlices()[i].iterator();
|
||||||
|
while (iterator.hasNext())
|
||||||
|
{
|
||||||
|
entity = (Entity) iterator.next();
|
||||||
|
compound = new NBTTagCompound();
|
||||||
|
if (entity.d(compound))
|
||||||
|
{
|
||||||
|
//chunk.g(true);
|
||||||
|
entitiesNBT.add(compound);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
levelNBT.set("Entities", entitiesNBT);
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------TILE ENTITIES------------------
|
||||||
|
iterator = chunk.getTileEntities().values().iterator();
|
||||||
|
while (iterator.hasNext())
|
||||||
|
{
|
||||||
|
tileEntity = (TileEntity) iterator.next();
|
||||||
|
compound = tileEntity.save(new NBTTagCompound());
|
||||||
|
tileEntitiesNBT.add(compound);
|
||||||
|
}
|
||||||
|
levelNBT.set("TileEntities", tileEntitiesNBT);
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------TILE TICKS-------------------
|
||||||
|
List nextTickList = world.a(chunk, false);
|
||||||
|
if (nextTickList != null)
|
||||||
|
{
|
||||||
|
tileTicksNBT = new NBTTagList();
|
||||||
|
long worldTime = world.getTime();
|
||||||
|
|
||||||
|
iterator = nextTickList.iterator();
|
||||||
|
while (iterator.hasNext())
|
||||||
|
{
|
||||||
|
nextTickListEntry = (NextTickListEntry) iterator.next();
|
||||||
|
minecraftKey = (MinecraftKey) Block.REGISTRY.b(nextTickListEntry.a());
|
||||||
|
compound = new NBTTagCompound();
|
||||||
|
|
||||||
|
compound.setString("i", minecraftKey == null ? "" : minecraftKey.toString());
|
||||||
|
compound.setInt("x", nextTickListEntry.a.getX());
|
||||||
|
compound.setInt("y", nextTickListEntry.a.getY());
|
||||||
|
compound.setInt("z", nextTickListEntry.a.getZ());
|
||||||
|
compound.setInt("t", (int) (nextTickListEntry.b - worldTime));
|
||||||
|
compound.setInt("p", nextTickListEntry.c);
|
||||||
|
tileTicksNBT.add(compound);
|
||||||
|
}
|
||||||
|
levelNBT.set("TileTicks", tileTicksNBT);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO cleanup, add more comments
|
||||||
|
*
|
||||||
|
* @param levelNBT
|
||||||
|
* @param chunk
|
||||||
|
* @param worldTime
|
||||||
|
* @param worldHasSkyLight
|
||||||
|
*/
|
||||||
|
public static void saveBody(NBTTagCompound levelNBT, Chunk chunk, World world)
|
||||||
|
{
|
||||||
|
/* passed variables worldTime and worldHasSkyLight have been
|
||||||
|
* replaced with world. The values are now obtained directly:
|
||||||
|
*/
|
||||||
|
long worldTime = world.getTime();
|
||||||
|
boolean worldHasSkyLight = world.worldProvider.m();
|
||||||
|
|
||||||
|
levelNBT.setInt("xPos", chunk.locX);
|
||||||
|
levelNBT.setInt("zPos", chunk.locZ);
|
||||||
|
levelNBT.setLong("LastUpdate", worldTime);
|
||||||
|
levelNBT.setIntArray("HeightMap", chunk.r());
|
||||||
|
levelNBT.setBoolean("TerrainPopulated", chunk.isDone());
|
||||||
|
levelNBT.setBoolean("LightPopulated", chunk.v());
|
||||||
|
levelNBT.setLong("InhabitedTime", chunk.x());
|
||||||
|
|
||||||
|
ChunkSection[] chunkSections = chunk.getSections();
|
||||||
|
ChunkSection[] chunkSectionsCopy = chunkSections;
|
||||||
|
|
||||||
|
NBTTagList chunkSectionsNBT = new NBTTagList();
|
||||||
|
NBTTagCompound chunkSection;
|
||||||
|
int i = chunkSections.length;
|
||||||
|
|
||||||
|
|
||||||
|
for (int j = 0; j < i; ++j) {
|
||||||
|
ChunkSection chunksection = chunkSectionsCopy[j];
|
||||||
|
|
||||||
|
if (chunksection != Chunk.a) {
|
||||||
|
chunkSection = new NBTTagCompound();
|
||||||
|
chunkSection.setByte("Y", (byte) (chunksection.getYPosition() >> 4 & 255));
|
||||||
|
byte[] abyte = new byte[4096];
|
||||||
|
NibbleArray nibblearray = new NibbleArray();
|
||||||
|
NibbleArray nibblearray1 = chunksection.getBlocks().exportData(abyte, nibblearray);
|
||||||
|
|
||||||
|
chunkSection.setByteArray("Blocks", abyte);
|
||||||
|
chunkSection.setByteArray("Data", nibblearray.asBytes());
|
||||||
|
if (nibblearray1 != null)
|
||||||
|
{
|
||||||
|
chunkSection.setByteArray("Add", nibblearray1.asBytes());
|
||||||
|
}
|
||||||
|
chunkSection.setByteArray("BlockLight", chunksection.getEmittedLightArray().asBytes());
|
||||||
|
if (worldHasSkyLight)
|
||||||
|
chunkSection.setByteArray("SkyLight", chunksection.getSkyLightArray().asBytes());
|
||||||
|
else
|
||||||
|
chunkSection.setByteArray("SkyLight", new byte[chunksection.getEmittedLightArray().asBytes().length]);
|
||||||
|
|
||||||
|
chunkSectionsNBT.add(chunkSection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
levelNBT.set("Sections", chunkSectionsNBT);
|
||||||
|
levelNBT.setByteArray("Biomes", chunk.getBiomeIndex());
|
||||||
|
}
|
||||||
|
}
|
78
src/simpleWarBackup/Main.java
Normal file
78
src/simpleWarBackup/Main.java
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
package simpleWarBackup;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Server;
|
||||||
|
import org.bukkit.craftbukkit.v1_12_R1.CraftChunk;
|
||||||
|
import org.bukkit.craftbukkit.v1_12_R1.CraftServer;
|
||||||
|
import org.bukkit.craftbukkit.v1_12_R1.CraftWorld;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import net.minecraft.server.v1_12_R1.Chunk;
|
||||||
|
import net.minecraft.server.v1_12_R1.ChunkRegionLoader;
|
||||||
|
import net.minecraft.server.v1_12_R1.DataConverterManager;
|
||||||
|
import net.minecraft.server.v1_12_R1.MinecraftServer;
|
||||||
|
import net.minecraft.server.v1_12_R1.NBTTagCompound;
|
||||||
|
import net.minecraft.server.v1_12_R1.World;
|
||||||
|
|
||||||
|
public class Main extends JavaPlugin implements Listener
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
private static File dataFolder,
|
||||||
|
backupsFolder;
|
||||||
|
|
||||||
|
public static final HashMap<org.bukkit.World, HashMap<String, File>> backups
|
||||||
|
= new HashMap<org.bukkit.World, HashMap<String, File>>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO
|
||||||
|
*/
|
||||||
|
public static void mapBackupDirectoriesToWorlds()
|
||||||
|
{
|
||||||
|
/* Directories that do not exist will be made when
|
||||||
|
* the plugin attempts to save a backup for the
|
||||||
|
* given world.
|
||||||
|
*/
|
||||||
|
|
||||||
|
HashMap<String, File> map;
|
||||||
|
|
||||||
|
File worldFolder;
|
||||||
|
File backupFolder;
|
||||||
|
|
||||||
|
for (org.bukkit.World world : Bukkit.getWorlds())
|
||||||
|
{
|
||||||
|
backups.put(world, map = new HashMap<String, File>());
|
||||||
|
|
||||||
|
worldFolder = new File(backupsFolder, world.getName());
|
||||||
|
for (String backupName : worldFolder.list())
|
||||||
|
{
|
||||||
|
backupFolder = new File(worldFolder, backupName);
|
||||||
|
map.put(backupName, backupFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void onEnable()
|
||||||
|
{
|
||||||
|
dataFolder = this.getDataFolder();
|
||||||
|
backupsFolder = new File(dataFolder, "Backup Files");
|
||||||
|
|
||||||
|
dataFolder.mkdir();
|
||||||
|
backupsFolder.mkdir();
|
||||||
|
|
||||||
|
mapBackupDirectoriesToWorlds();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean backupChunk(org.bukkit.World bukkitWorld, int chunkX, int chunkZ)
|
||||||
|
{
|
||||||
|
Chunk chunk = ((CraftChunk) bukkitWorld.getChunkAt(chunkX, chunkZ)).getHandle();
|
||||||
|
World world = ((CraftWorld) bukkitWorld).getHandle();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
13
src/simpleWarBackup/RegionFileCache.java
Normal file
13
src/simpleWarBackup/RegionFileCache.java
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
package simpleWarBackup;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
|
import net.minecraft.server.v1_12_R1.RegionFile;
|
||||||
|
|
||||||
|
public class RegionFileCache
|
||||||
|
{
|
||||||
|
public static final Map<File, RegionFile> files = Maps.newHashMap();
|
||||||
|
}
|
Loading…
Reference in a new issue