diff --git a/MCGalaxy/Database/PlayerData.cs b/MCGalaxy/Database/PlayerData.cs index 4ea39865c..5b01e8a21 100644 --- a/MCGalaxy/Database/PlayerData.cs +++ b/MCGalaxy/Database/PlayerData.cs @@ -122,12 +122,12 @@ public class PlayerData { data.Kicks = record.GetInt(ColumnKicked); data.Messages = record.GetInt(ColumnMessages); - long blocks = record.GetLong(ColumnTotalBlocks); - long cuboided = record.GetLong(ColumnTotalCuboided); - data.TotalModified = blocks & LowerBitsMask; - data.TotalPlaced = blocks >> LowerBits; - data.TotalDrawn = cuboided & LowerBitsMask; - data.TotalDeleted = cuboided >> LowerBits; + long blocks = record.GetLong(ColumnTotalBlocks); + long drawn = record.GetLong(ColumnTotalCuboided); + data.TotalModified = UnpackLo(blocks); + data.TotalPlaced = UnpackHi(blocks); + data.TotalDrawn = UnpackLo(drawn); + data.TotalDeleted = UnpackHi(drawn); return data; } internal static object Read(IDataRecord record, object arg) { return Parse(record); } @@ -166,12 +166,15 @@ public class PlayerData { } - internal static long BlocksPacked(long placed, long modified) { - return placed << LowerBits | modified; + internal static long UnpackHi(long value) { + // unsigned shift right + return (long)((ulong)value >> LowerBits); } - - internal static long CuboidPacked(long deleted, long drawn) { - return deleted << LowerBits | drawn; + internal static long UnpackLo(long value) { + return value & LowerBitsMask; + } + internal static long Pack(long hi, long lo) { + return hi << LowerBits | lo; } public const int LowerBits = 38; diff --git a/MCGalaxy/Player/Player.cs b/MCGalaxy/Player/Player.cs index bcabe7c32..b81ea9c1a 100644 --- a/MCGalaxy/Player/Player.cs +++ b/MCGalaxy/Player/Player.cs @@ -141,13 +141,13 @@ public partial class Player : Entity, IDisposable { // Player disconnected before SQL data was retrieved if (!gotSQLData) return; - long blocks = PlayerData.BlocksPacked(TotalPlaced, TotalModified); - long cuboided = PlayerData.CuboidPacked(TotalDeleted, TotalDrawn); + long blocks = PlayerData.Pack(TotalPlaced, TotalModified); + long drawn = PlayerData.Pack(TotalDeleted, TotalDrawn); Database.Backend.UpdateRows("Players", "IP=@0, LastLogin=@1, totalLogin=@2, totalDeaths=@3, Money=@4, " + "totalBlocks=@5, totalCuboided=@6, totalKicked=@7, TimeSpent=@8, Messages=@9", "WHERE Name=@10", ip, LastLogin.ToString(Database.DateFormat), TimesVisited, TimesDied, money, blocks, - cuboided, TimesBeenKicked, (long)TotalTime.TotalSeconds, TotalMessagesSent, name); + drawn, TimesBeenKicked, (long)TotalTime.TotalSeconds, TotalMessagesSent, name); } public bool CanUse(Command cmd) { return group.Commands.Contains(cmd); }