Added Dirty Flag

Added a flag to NewDimData so that we can avoid writing dimensions to
disk if they haven't been modified. They're still rewritten when the
server shuts down.
This commit is contained in:
SenseiKiwi
2014-03-28 02:07:20 -04:00
parent 1de34d1c2d
commit cc2def03fd
5 changed files with 57 additions and 20 deletions

View File

@@ -185,7 +185,7 @@ public class EventHookContainer
{
if (event.world.provider.dimensionId == 0)
{
PocketManager.save();
PocketManager.save(true);
if (mod_pocketDim.deathTracker != null && mod_pocketDim.deathTracker.isModified())
{

View File

@@ -130,6 +130,7 @@ public abstract class NewDimData
protected Point4D origin;
protected int orientation;
protected DungeonData dungeon;
protected boolean modified;
public IUpdateWatcher<ClientLinkData> linkWatcher;
protected NewDimData(int id, NewDimData parent, boolean isPocket, boolean isDungeon,
@@ -157,6 +158,7 @@ public abstract class NewDimData
this.origin = null;
this.dungeon = null;
this.linkWatcher = linkWatcher;
this.modified = true;
//Register with parent
if (parent != null)
@@ -165,6 +167,7 @@ public abstract class NewDimData
this.root = parent.root;
this.depth = parent.depth + 1;
parent.children.add(this);
parent.modified = true;
}
else
{
@@ -288,6 +291,7 @@ public abstract class NewDimData
{
return Math.abs(i) + Math.abs(j) + Math.abs(k);
}
public DimLink createLink(int x, int y, int z, int linkType, int orientation)
{
return createLink(new Point4D(x, y, z, id), linkType, orientation);
@@ -307,6 +311,8 @@ public abstract class NewDimData
{
link.overwrite(linkType, orientation);
}
modified = true;
//Link created!
if (linkType != LinkTypes.CLIENT_SIDE)
{
@@ -348,6 +354,7 @@ public abstract class NewDimData
linkWatcher.onCreated(link.link);
}
}
modified = true;
return link;
}
@@ -364,6 +371,7 @@ public abstract class NewDimData
//Raise deletion event
linkWatcher.onDeleted(target.link);
target.clear();
modified = true;
}
return (target != null);
}
@@ -418,6 +426,7 @@ public abstract class NewDimData
public void setFilled(boolean isFilled)
{
this.isFilled = isFilled;
this.modified = true;
}
public int id()
@@ -499,16 +508,19 @@ public abstract class NewDimData
this.orientation = orientation;
this.dungeon = dungeon;
this.packDepth = calculatePackDepth(parent, dungeon);
this.modified = true;
}
/**
* effectivly moves the dungeon to the 'top' of a chain as far as dungeon generation is concerend.
* Effectively moves the dungeon to the 'top' of a chain as far as dungeon generation is concerned.
*/
public void setParentToRoot()
{
this.depth = 1;
this.parent = this.root;
this.root.children.add(this);
this.root.modified = true;
this.modified = true;
}
public static int calculatePackDepth(NewDimData parent, DungeonData current)
@@ -557,12 +569,14 @@ public abstract class NewDimData
setDestination(incoming, originX, originY, originZ);
this.origin = incoming.destination();
this.orientation = orientation;
this.modified = true;
}
public void setDestination(DimLink incoming, int x, int y, int z)
{
InnerDimLink link = (InnerDimLink) incoming;
link.setDestination(x, y, z, this);
this.modified = true;
}
public DimLink getRandomLink()
@@ -581,6 +595,16 @@ public abstract class NewDimData
}
}
public boolean isModified()
{
return modified;
}
public void clearModified()
{
this.modified = false;
}
public String toString()
{
return "DimID= " + this.id;

View File

@@ -446,7 +446,7 @@ public class PocketManager
}
}
public static void save()
public static void save(boolean checkModified)
{
if (!isLoaded)
{
@@ -466,7 +466,7 @@ public class PocketManager
try
{
DDSaveHandler.saveAll(dimensionData.values(), dimensionIDBlackList);
DDSaveHandler.saveAll(dimensionData.values(), dimensionIDBlackList, checkModified);
}
catch (Exception e)
{
@@ -627,7 +627,7 @@ public class PocketManager
throw new IllegalStateException("Pocket dimensions have already been unloaded!");
}
save();
save(false);
unregisterPockets();
dimensionData = null;
rootDimensions = null;

View File

@@ -239,7 +239,8 @@ public class DDSaveHandler
}
}
public static boolean saveAll(Iterable<? extends IPackable<PackedDimData>> dimensions, List<Integer> blacklist) throws IOException
public static boolean saveAll(Iterable<? extends IPackable<PackedDimData>> dimensions,
List<Integer> blacklist, boolean checkModified) throws IOException
{
// Create the data directory for our dimensions
// Don't catch exceptions here. If we can't create this folder,
@@ -261,7 +262,17 @@ public class DDSaveHandler
DimDataProcessor writer = new DimDataProcessor();
for (IPackable<PackedDimData> dimension : dimensions)
{
succeeded &= writeDimension(dimension, writer, savePath + "/dim_");
if (!checkModified || dimension.isModified())
{
if (writeDimension(dimension, writer, savePath + "/dim_"))
{
dimension.clearModified();
}
else
{
succeeded = false;
}
}
}
return succeeded;
}

View File

@@ -4,4 +4,6 @@ public interface IPackable<T>
{
public String name();
public T pack();
public boolean isModified();
public void clearModified();
}