diff --git a/MCGalaxy/Commands/Maintenance/CmdPlayerEdit.cs b/MCGalaxy/Commands/Maintenance/CmdPlayerEdit.cs index 8cc139bae..f816d394e 100644 --- a/MCGalaxy/Commands/Maintenance/CmdPlayerEdit.cs +++ b/MCGalaxy/Commands/Maintenance/CmdPlayerEdit.cs @@ -90,16 +90,16 @@ public sealed class CmdPlayerEdit : Command2 { PlayerDB.Update(args[0], PlayerData.ColumnIP, args[2]); MessageDataChanged(p, args[0], args[1], args[2]); } else if (opt == "modified") { - SetInteger(p, args, PlayerData.ColumnTotalBlocks, int.MaxValue, who, + SetInteger(p, args, PlayerData.ColumnBlocks, int.MaxValue, who, v => who.TotalModified = v, type_lo); } else if (opt == "drawn") { - SetInteger(p, args, PlayerData.ColumnTotalCuboided, int.MaxValue, who, + SetInteger(p, args, PlayerData.ColumnDrawn, int.MaxValue, who, v => who.TotalDrawn = v, type_lo); } else if (opt == "placed") { - SetInteger(p, args, PlayerData.ColumnTotalBlocks, int.MaxValue, who, + SetInteger(p, args, PlayerData.ColumnBlocks, int.MaxValue, who, v => who.TotalPlaced = v, type_hi); } else if (opt == "deleted") { - SetInteger(p, args, PlayerData.ColumnTotalCuboided, int.MaxValue, who, + SetInteger(p, args, PlayerData.ColumnDrawn, int.MaxValue, who, v => who.TotalDeleted = v, type_hi); } else if (opt == "totalkicked") { SetInteger(p, args, PlayerData.ColumnKicked, 16777215, who, @@ -198,12 +198,12 @@ public sealed class CmdPlayerEdit : Command2 { string dbValue = args[2]; // special case handling for packed forms of totalBlocks and totalCuboided if (type == 1) { - long packed = GetLong(args[0], column) & ~PlayerData.LowerBitsMask; // hi value only + long packed = GetLong(args[0], column) & ~PlayerData.LoBitsMask; // hi value only packed |= (uint)value; dbValue = packed.ToString(); } else if (type == 2) { - long packed = GetLong(args[0], column) & PlayerData.LowerBitsMask; // lo value only - packed |= ((long)value) << PlayerData.LowerBits; + long packed = GetLong(args[0], column) & PlayerData.LoBitsMask; // lo value only + packed |= ((long)value) << PlayerData.HiBitsShift; dbValue = packed.ToString(); } PlayerDB.Update(args[0], column, dbValue); diff --git a/MCGalaxy/Database/PlayerData.cs b/MCGalaxy/Database/PlayerData.cs index 5b01e8a21..341673b3a 100644 --- a/MCGalaxy/Database/PlayerData.cs +++ b/MCGalaxy/Database/PlayerData.cs @@ -41,9 +41,9 @@ public class PlayerData { public const string ColumnLastLogin = "LastLogin"; public const string ColumnTimeSpent = "TimeSpent"; - public const string ColumnTotalBlocks = "totalBlocks"; - public const string ColumnTotalCuboided = "totalCuboided"; - public const string ColumnMessages = "Messages"; + public const string ColumnBlocks = "totalBlocks"; + public const string ColumnDrawn = "totalCuboided"; + public const string ColumnMessages = "Messages"; public string Name, Color, Title, TitleColor, IP; public DateTime FirstLogin, LastLogin; @@ -122,8 +122,8 @@ public class PlayerData { data.Kicks = record.GetInt(ColumnKicked); data.Messages = record.GetInt(ColumnMessages); - long blocks = record.GetLong(ColumnTotalBlocks); - long drawn = record.GetLong(ColumnTotalCuboided); + long blocks = record.GetLong(ColumnBlocks); + long drawn = record.GetLong(ColumnDrawn); data.TotalModified = UnpackLo(blocks); data.TotalPlaced = UnpackHi(blocks); data.TotalDrawn = UnpackLo(drawn); @@ -167,17 +167,18 @@ public class PlayerData { internal static long UnpackHi(long value) { - // unsigned shift right - return (long)((ulong)value >> LowerBits); + return (value >> HiBitsShift) & HiBitsMask; } internal static long UnpackLo(long value) { - return value & LowerBitsMask; + return value & LoBitsMask; } internal static long Pack(long hi, long lo) { - return hi << LowerBits | lo; + return hi << HiBitsShift | lo; } - public const int LowerBits = 38; - public const long LowerBitsMask = (1L << LowerBits) - 1; + public const int HiBitsShift = 38; + public const long LoBitsMask = (1L << HiBitsShift) - 1; + // convert negative to positive after shifting + public const long HiBitsMask = (1L << 26) - 1; } } diff --git a/MCGalaxy/Database/Stats/TopStat.cs b/MCGalaxy/Database/Stats/TopStat.cs index efeb56a72..dcb8d9e4a 100644 --- a/MCGalaxy/Database/Stats/TopStat.cs +++ b/MCGalaxy/Database/Stats/TopStat.cs @@ -69,16 +69,16 @@ public sealed class TopStat { new TopStat("Kicked", "Players", PlayerData.ColumnKicked, MostKicked, FormatInteger), new TopStat("Modified", "Players", - PlayerData.ColumnTotalBlocks + " & " + PlayerData.LowerBitsMask, + PlayerData.ColumnBlocks + " & " + PlayerData.LoBitsMask, MostModified, FormatInteger), new TopStat("Drawn", "Players", - PlayerData.ColumnTotalCuboided + " & " + PlayerData.LowerBitsMask, + PlayerData.ColumnDrawn + " & " + PlayerData.LoBitsMask, MostDrawn, FormatInteger), new TopStat("Placed", "Players", - PlayerData.ColumnTotalBlocks + " >> " + PlayerData.LowerBits, + PlayerData.ColumnBlocks + " >> " + PlayerData.HiBitsShift + " & " + PlayerData.HiBitsMask, MostPlaced, FormatInteger), new TopStat("Deleted", "Players", - PlayerData.ColumnTotalCuboided + " >> " + PlayerData.LowerBits, + PlayerData.ColumnDrawn + " >> " + PlayerData.HiBitsShift + " & " + PlayerData.HiBitsMask, MostDeleted, FormatInteger), new TopStat("TimeSpent", "Players", PlayerData.ColumnTimeSpent, MostTime, FormatTimespan,