[Major WIP] Rewrite the highlighting bit of the code, still need to fix some the undo bit.

This commit is contained in:
UnknownShadow200 2016-08-20 00:16:15 +10:00
parent 075e99f118
commit 4f8b279c63
4 changed files with 63 additions and 37 deletions

View File

@ -30,10 +30,15 @@ namespace MCGalaxy.Util {
public static UndoFile NewFormat = new UndoFileCBin();
protected class UndoEntriesArgs {
public Player Player;
public Player Player;
public byte[] Temp;
public bool Stop;
public DateTime StartRange;
public UndoEntriesArgs(Player p, DateTime start) {
Player = p;
StartRange = start;
}
}
protected abstract void SaveUndoData(List<Player.UndoPos> buffer, string path);
@ -42,7 +47,7 @@ namespace MCGalaxy.Util {
protected abstract IEnumerable<Player.UndoPos> GetEntries(Stream s, UndoEntriesArgs args);
protected abstract string Extension { get; }
protected abstract string Ext { get; }
public static void SaveUndo(Player p) {
if (p == null || p.UndoBuffer.Count < 1) return;
@ -59,7 +64,7 @@ namespace MCGalaxy.Util {
Directory.CreateDirectory(playerDir);
int numFiles = Directory.GetFiles(playerDir).Length;
string path = Path.Combine(playerDir, numFiles + NewFormat.Extension);
string path = Path.Combine(playerDir, numFiles + NewFormat.Ext);
UndoCache cache = p.UndoBuffer;
using (IDisposable locker = cache.ClearLock.AccquireReadLock()) {
@ -89,7 +94,7 @@ namespace MCGalaxy.Util {
return;
string[] files = Directory.GetFiles(path);
Array.Sort<string>(files, CompareFiles);
byte[] temp = null;
UndoEntriesArgs args = new UndoFile.UndoEntriesArgs(p, start);
for (int i = files.Length - 1; i >= 0; i--) {
path = files[i];
@ -98,15 +103,18 @@ namespace MCGalaxy.Util {
continue;
UndoFile format = null;
if (path.EndsWith(TxtFormat.Extension)) format = TxtFormat;
if (path.EndsWith(BinFormat.Extension)) format = BinFormat;
if (path.EndsWith(NewFormat.Extension)) format = NewFormat;
if (path.EndsWith(TxtFormat.Ext)) format = TxtFormat;
if (path.EndsWith(BinFormat.Ext)) format = BinFormat;
if (path.EndsWith(NewFormat.Ext)) format = NewFormat;
if (format == null) continue;
if (highlight) {
if (!format.HighlightEntry(p, path, ref temp, start)) break;
} else {
if (!format.UndoEntry(p, path, marks, ref temp, start)) break;
using (Stream s = File.OpenRead(path)) {
if (highlight) {
DoHighlight(s, format, args);
} else {
if (!format.UndoEntry(p, path, marks, ref temp, start)) break;
}
if (args.Stop) break;
}
}
FoundUser = true;
@ -122,8 +130,8 @@ namespace MCGalaxy.Util {
return aNum.CompareTo(bNum);
}
protected internal static void UndoBlock(Player pl, Level lvl, Player.UndoPos P,
int timeDelta, BufferedBlockSender buffer) {
protected internal static void UndoBlock(Player pl, Level lvl, Player.UndoPos P,
int timeDelta, BufferedBlockSender buffer) {
byte lvlTile = lvl.GetTile(P.x, P.y, P.z);
if (lvlTile == P.newtype || Block.Convert(lvlTile) == Block.water
|| Block.Convert(lvlTile) == Block.lava || lvlTile == Block.grass) {
@ -146,23 +154,32 @@ namespace MCGalaxy.Util {
if (diffBlock) {
buffer.Add(lvl.PosToInt(P.x, P.y, P.z), P.newtype, P.newExtType);
buffer.CheckIfSend(false);
}
}
lvl.SetTile(P.x, P.y, P.z, P.newtype);
if (P.newtype == Block.custom_block)
lvl.SetExtTile(P.x, P.y, P.z, P.newExtType);
}
}
}
}
protected static void HighlightBlock(Player p, Level lvl, byte type, byte newType,
ushort x, ushort y, ushort z) {
byte block = (newType == Block.air
static void DoHighlight(Stream s, UndoFile format, UndoEntriesArgs args) {
BufferedBlockSender buffer = new BufferedBlockSender(args.Player);
Level lvl = args.Player.level;
foreach (Player.UndoPos P in format.GetEntries(s, args)) {
byte type = P.type, newType = P.newtype;
byte block = (newType == Block.air
|| Block.Convert(type) == Block.water || type == Block.waterstill
|| Block.Convert(type) == Block.lava || type == Block.lavastill)
|| Block.Convert(type) == Block.lava || type == Block.lavastill)
? Block.red : Block.green;
p.SendBlockchange(x, y, z, block);
buffer.Add(lvl.PosToInt(P.x, P.y, P.z), block, 0);
buffer.CheckIfSend(false);
}
buffer.CheckIfSend(true);
}
public static void CreateDefaultDirectories() {
if (!Directory.Exists(undoDir))
Directory.CreateDirectory(undoDir);
@ -177,23 +194,27 @@ namespace MCGalaxy.Util {
static void UpgradeFiles(string dir, string name) {
string path = Path.Combine(dir, name);
if (!Directory.Exists(path))
return;
if (!Directory.Exists(path)) return;
string[] files = Directory.GetFiles(path);
List<Player.UndoPos> buffer = new List<Player.UndoPos>();
UndoEntriesArgs args = new UndoEntriesArgs(null, DateTime.MinValue);
for (int i = 0; i < files.Length; i++) {
path = files[i];
if (path.EndsWith(BinFormat.Extension)) {
buffer.Clear();
BinFormat.ReadUndoData(buffer, path);
} else if (path.EndsWith(TxtFormat.Extension)) {
buffer.Clear();
TxtFormat.ReadUndoData(buffer, path);
}
if (!path.EndsWith(BinFormat.Ext) && !path.EndsWith(TxtFormat.Ext)) continue;
string newPath = Path.ChangeExtension(path, NewFormat.Extension);
NewFormat.SaveUndoData(buffer, newPath);
IEnumerable<Player.UndoPos> data = null;
using (FileStream s = File.OpenRead(path)) {
data = path.EndsWith(BinFormat.Ext)
? BinFormat.GetEntries(s, args)
: TxtFormat.GetEntries(s, args);
foreach (Player.UndoPos pos in data)
buffer.Add(pos);
buffer.Reverse();
string newPath = Path.ChangeExtension(path, NewFormat.Ext);
NewFormat.SaveUndoData(buffer, newPath);
}
File.Delete(path);
}
}

View File

@ -24,7 +24,7 @@ namespace MCGalaxy.Util {
public sealed class UndoFileBin : UndoFile {
protected override string Extension { get { return ".unbin"; } }
protected override string Ext { get { return ".unbin"; } }
const int entrySize = 12;
protected override void SaveUndoData(List<Player.UndoPos> buffer, string path) {
@ -37,7 +37,7 @@ namespace MCGalaxy.Util {
protected override IEnumerable<Player.UndoPos> GetEntries(Stream s, UndoEntriesArgs args) {
List<ChunkHeader> list = new List<ChunkHeader>();
Player.UndoPos pos = default(Player.UndoPos);
Player.UndoPos pos;
bool super = args.Player == null || args.Player.ircNick != null;
DateTime start = args.StartRange;
@ -48,6 +48,7 @@ namespace MCGalaxy.Util {
bool inRange = chunk.BaseTime.AddTicks(65536 * TimeSpan.TicksPerSecond) >= start;
if (!inRange) { args.Stop = true; yield break; }
if (!super && !args.Player.level.name.CaselessEq(chunk.LevelName)) continue;
pos.mapName = chunk.LevelName;
s.Seek(chunk.DataPosition, SeekOrigin.Begin);
if (args.Temp == null)
@ -59,6 +60,7 @@ namespace MCGalaxy.Util {
int offset = j * entrySize;
DateTime time = chunk.BaseTime.AddTicks(U16(temp, offset + 0) * TimeSpan.TicksPerSecond);
if (time < start) { args.Stop = true; yield break; }
pos.timeDelta = (int)time.Subtract(Server.StartTime).TotalSeconds;
pos.x = U16(temp, offset + 2);
pos.y = U16(temp, offset + 4);

View File

@ -25,7 +25,7 @@ namespace MCGalaxy.Util {
public sealed class UndoFileCBin : UndoFile {
protected override string Extension { get { return ".uncbin"; } }
protected override string Ext { get { return ".uncbin"; } }
const int entrySize = 8;
protected override void SaveUndoData(List<Player.UndoPos> buffer, string path) {
@ -100,7 +100,7 @@ namespace MCGalaxy.Util {
protected override IEnumerable<Player.UndoPos> GetEntries(Stream s, UndoEntriesArgs args) {
List<ChunkHeader> list = new List<ChunkHeader>();
Player.UndoPos pos = default(Player.UndoPos);
Player.UndoPos pos;
UndoCacheItem item = default(UndoCacheItem);
bool super = args.Player == null || args.Player.ircNick != null;
DateTime start = args.StartRange;
@ -125,6 +125,7 @@ namespace MCGalaxy.Util {
item.Flags = U16(temp, offset + 0);
DateTime time = chunk.BaseTime.AddTicks((item.Flags & 0x3FFF) * TimeSpan.TicksPerSecond);
if (time < start) { args.Stop = true; yield break; }
pos.timeDelta = (int)time.Subtract(Server.StartTime).TotalSeconds;
int index = I32(temp, offset + 2);
pos.x = (ushort)(index % chunk.Width);

View File

@ -24,7 +24,7 @@ namespace MCGalaxy.Util {
public sealed class UndoFileText : UndoFile {
protected override string Extension { get { return ".undo"; } }
protected override string Ext { get { return ".undo"; } }
protected override void SaveUndoData(List<Player.UndoPos> buffer, string path) {
throw new NotSupportedException("Text undo files have been deprecated");
@ -35,7 +35,8 @@ namespace MCGalaxy.Util {
}
protected override IEnumerable<Player.UndoPos> GetEntries(Stream s, UndoEntriesArgs args) {
Player.UndoPos pos = default(Player.UndoPos);
Player.UndoPos pos;
pos.newExtType = 0; pos.extType = 0;
string[] lines = new StreamReader(s).ReadToEnd().Split(' ');
Player p = args.Player;
bool super = p == null || p.ircNick != null;
@ -47,6 +48,7 @@ namespace MCGalaxy.Util {
string timeRaw = lines[(i * 7) - 3].Replace('&', ' ');
DateTime time = DateTime.Parse(timeRaw, CultureInfo.InvariantCulture);
if (time < start) { args.Stop = true; yield break; }
pos.timeDelta = (int)time.Subtract(Server.StartTimeLocal).TotalSeconds;
string map = lines[(i * 7) - 7];
if (!super && !p.level.name.CaselessEq(map)) continue;