Beispiel #1
0
        static void WriteHeader([NotNull] Map mapToSave, [NotNull] string path, [NotNull] NbtWriter writer)
        {
            writer.WriteByte("FormatVersion", 1);

            // write name and UUID
            World  mapWorld = mapToSave.World;
            string mapName;

            if (mapWorld != null)
            {
                mapName = mapWorld.Name;
            }
            else
            {
                mapName = Path.GetFileNameWithoutExtension(path);
            }
            writer.WriteString("Name", mapName);
            writer.WriteByteArray("UUID", mapToSave.Guid.ToByteArray());

            // write map dimensions
            writer.WriteShort("X", (short)mapToSave.Width);
            writer.WriteShort("Y", (short)mapToSave.Height);
            writer.WriteShort("Z", (short)mapToSave.Length);

            // write spawn
            writer.BeginCompound("Spawn");
            {
                Position spawn = mapToSave.Spawn;
                writer.WriteShort("X", spawn.X);
                writer.WriteShort("Y", spawn.Z);
                writer.WriteShort("Z", spawn.Y);
                writer.WriteByte("H", spawn.R);
                writer.WriteByte("P", spawn.L);
            }
            writer.EndCompound();

            // write timestamps
            writer.WriteLong("TimeCreated", mapToSave.DateCreated.ToUnixTime());
            writer.WriteLong("LastModified", mapToSave.DateCreated.ToUnixTime());
            // TODO: TimeAccessed

            // TODO: write CreatedBy

            // Write map origin information
            writer.BeginCompound("MapGenerator");
            {
                writer.WriteString("Software", "fCraft " + Updater.CurrentRelease.VersionString);
                string genName;
                if (!mapToSave.Metadata.TryGetValue(MapGenUtil.ParamsMetaGroup,
                                                    MapGenUtil.GenNameMetaKey,
                                                    out genName))
                {
                    genName = "Unknown";
                }
                writer.WriteString("MapGeneratorName", genName);
            }
            writer.EndCompound();
        }
Beispiel #2
0
        public void TransferTags(NbtWriter writer)
        {
            writer.WriteBool("piglin_safe", this.Element.PiglinSafe);
            writer.WriteBool("natural", this.Element.Natural);

            writer.WriteFloat("ambient_light", this.Element.AmbientLight);

            if (this.Element.FixedTime.HasValue)
            {
                writer.WriteLong("fixed_time", this.Element.FixedTime.Value);
            }

            writer.WriteString("infiniburn", this.Element.Infiniburn);

            writer.WriteBool("respawn_anchor_works", this.Element.RespawnAnchorWorks);
            writer.WriteBool("has_skylight", this.Element.HasSkylight);
            writer.WriteBool("bed_works", this.Element.BedWorks);

            writer.WriteString("effects", this.Element.Effects);

            writer.WriteBool("has_raids", this.Element.HasRaids);

            writer.WriteInt("logical_height", this.Element.LogicalHeight);

            writer.WriteFloat("coordinate_scale", this.Element.CoordinateScale);

            writer.WriteBool("ultrawarm", this.Element.Ultrawarm);
            writer.WriteBool("has_ceiling", this.Element.HasCeiling);
        }
Beispiel #3
0
        public void ValueTest()
        {
            // write one named tag for every value type, and read it back
            using (var ms = new MemoryStream()) {
                var writer = new NbtWriter(ms, "root");
                Assert.AreEqual(ms, writer.BaseStream);
                {
                    writer.WriteByte("byte", 1);
                    writer.WriteShort("short", 2);
                    writer.WriteInt("int", 3);
                    writer.WriteLong("long", 4L);
                    writer.WriteFloat("float", 5f);
                    writer.WriteDouble("double", 6d);
                    writer.WriteByteArray("byteArray", new byte[] { 10, 11, 12 });
                    writer.WriteIntArray("intArray", new[] { 20, 21, 22 });
                    writer.WriteString("string", "123");
                }
                Assert.IsFalse(writer.IsDone);
                writer.EndCompound();
                Assert.IsTrue(writer.IsDone);
                writer.Finish();

                ms.Position = 0;
                var file = new NbtFile();
                file.LoadFromStream(ms, NbtCompression.None);

                TestFiles.AssertValueTest(file);
            }
        }
Beispiel #4
0
        public void ValueTest()
        {
            // write one named tag for every value type, and read it back
            using (var ms = new MemoryStream()) {
                var writer = new NbtWriter(ms, "root");
                {
                    writer.WriteByte("byte", 1);
                    writer.WriteShort("short", 2);
                    writer.WriteInt("int", 3);
                    writer.WriteLong("long", 4L);
                    writer.WriteFloat("float", 5f);
                    writer.WriteDouble("double", 6d);
                    writer.WriteByteArray("byteArray", new byte[] { 10, 11, 12 });
                    writer.WriteIntArray("intArray", new[] { 20, 21, 22 });
                    writer.WriteString("string", "123");
                }
                writer.EndCompound();
                writer.Finish();

                ms.Position = 0;
                var file = new NbtFile();
                file.LoadFromStream(ms, NbtCompression.None);

                TestFiles.AssertValueTest(file);
            }
        }
Beispiel #5
0
        public void ListTest()
        {
            // write short (1-element) lists of every possible kind
            using (var ms = new MemoryStream()) {
                var writer = new NbtWriter(ms, "Test");
                writer.BeginList("LotsOfLists", NbtTagType.List, 11);
                {
                    writer.BeginList(NbtTagType.Byte, 1);
                    writer.WriteByte(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.ByteArray, 1);
                    writer.WriteByteArray(new byte[] {
                        1
                    });
                    writer.EndList();

                    writer.BeginList(NbtTagType.Compound, 1);
                    writer.BeginCompound();
                    writer.EndCompound();
                    writer.EndList();

                    writer.BeginList(NbtTagType.Double, 1);
                    writer.WriteDouble(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.Float, 1);
                    writer.WriteFloat(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.Int, 1);
                    writer.WriteInt(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.IntArray, 1);
                    writer.WriteIntArray(new[] {
                        1
                    });
                    writer.EndList();

                    writer.BeginList(NbtTagType.List, 1);
                    writer.BeginList(NbtTagType.List, 0);
                    writer.EndList();
                    writer.EndList();

                    writer.BeginList(NbtTagType.Long, 1);
                    writer.WriteLong(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.Short, 1);
                    writer.WriteShort(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.String, 1);
                    writer.WriteString("ponies");
                    writer.EndList();
                }
                writer.EndList();
                writer.EndCompound();
                writer.Finish();

                ms.Position = 0;
                var reader = new NbtReader(ms);
                Assert.DoesNotThrow(() => reader.ReadAsTag());
            }
        }
Beispiel #6
0
        public void ListTest()
        {
            // write short (1-element) lists of every possible kind
            using (var ms = new MemoryStream()) {
                var writer = new NbtWriter(ms, "Test");
                writer.BeginList("LotsOfLists", NbtTagType.List, 11);
                {
                    writer.BeginList(NbtTagType.Byte, 1);
                    writer.WriteByte(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.ByteArray, 1);
                    writer.WriteByteArray(new byte[] {
                        1
                    });
                    writer.EndList();

                    writer.BeginList(NbtTagType.Compound, 1);
                    writer.BeginCompound();
                    writer.EndCompound();
                    writer.EndList();

                    writer.BeginList(NbtTagType.Double, 1);
                    writer.WriteDouble(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.Float, 1);
                    writer.WriteFloat(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.Int, 1);
                    writer.WriteInt(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.IntArray, 1);
                    writer.WriteIntArray(new[] {
                        1
                    });
                    writer.EndList();

                    writer.BeginList(NbtTagType.List, 1);
                    writer.BeginList(NbtTagType.List, 0);
                    writer.EndList();
                    writer.EndList();

                    writer.BeginList(NbtTagType.Long, 1);
                    writer.WriteLong(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.Short, 1);
                    writer.WriteShort(1);
                    writer.EndList();

                    writer.BeginList(NbtTagType.String, 1);
                    writer.WriteString("ponies");
                    writer.EndList();
                }
                writer.EndList();
                Assert.IsFalse(writer.IsDone);
                writer.EndCompound();
                Assert.IsTrue(writer.IsDone);
                writer.Finish();

                ms.Position = 0;
                var reader = new NbtReader(ms);
                Assert.DoesNotThrow(() => reader.ReadAsTag());
            }
        }
Beispiel #7
0
        internal void SaveNBT(NbtWriter writer)
        {
            writer.BeginCompound();

            // Identity
            writer.WriteInt("ID", Id);
            writer.WriteString("N", Name);
            if (DisplayedName != null)
            {
                writer.WriteString("DN", DisplayedName);
            }
            if (Email != null)
            {
                writer.WriteString("E", Email);
            }

            // Network information
            if (AccountType != AccountType.Unknown)
            {
                writer.WriteByte("AT", (byte)AccountType);
            }
            if (!Equals(LastIP, IPAddress.None))
            {
                writer.WriteByteArray("IP", LastIP.GetAddressBytes());
            }
            if (LastFailedLoginDate != DateTime.MinValue)
            {
                writer.WriteLong("LFD", LastFailedLoginDate.ToUnixTime());
                writer.WriteByteArray("LFIP", LastFailedLoginIP.GetAddressBytes());
            }
            if (BandwidthUseMode != BandwidthUseMode.Default)
            {
                writer.WriteByte("BUM", (byte)BandwidthUseMode);
            }

            // Online status
            writer.WriteLong("LFD", FirstLoginDate.ToUnixTime());
            writer.WriteLong("LLD", LastLoginDate.ToUnixTime());
            DateTime lastSeen;

            if (IsOnline)
            {
                lastSeen = DateTime.UtcNow;
            }
            else
            {
                lastSeen = LastSeen;
            }
            writer.WriteLong("LS", lastSeen.ToUnixTime());
            writer.WriteByte("IH", (byte)(IsHidden ? 1 : 0));

            // Rank information
            writer.WriteString("R", Rank.FullName);
            if (PreviousRank != null)
            {
                writer.WriteString("PR", PreviousRank.FullName);
            }
            if (RankChangeDate != DateTime.MinValue)
            {
                writer.WriteLong("RCD", RankChangeDate.ToUnixTime());
            }
            if (RankChangedBy != null)
            {
                writer.WriteString("RCB", RankChangedBy);
            }
            if (RankChangeReason != null)
            {
                writer.WriteString("RCR", RankChangeReason);
            }
            writer.WriteByte("RCT", (byte)RankChangeType);

            // Kicks
            if (TimesKicked > 0)
            {
                writer.WriteInt("TK", TimesKicked);
                writer.WriteLong("LKD", LastKickDate.ToUnixTime());
                if (LastKickBy != null)
                {
                    writer.WriteString("LKB", LastKickBy);
                }
                if (LastKickReason != null)
                {
                    writer.WriteString("LKR", LastKickReason);
                }
            }

            // Bans
            if (BanStatus != BanStatus.NotBanned)
            {
                writer.WriteByte("BS", (byte)BanStatus);
            }

            if (BanDate != DateTime.MinValue)
            {
                writer.WriteLong("BD", BanDate.ToUnixTime());
            }
            if (BannedBy != null)
            {
                writer.WriteString("BB", BannedBy);
            }
            if (BanReason != null)
            {
                writer.WriteString("BR", BanReason);
            }
            if (UnbanDate != DateTime.MinValue)
            {
                writer.WriteLong("UD", UnbanDate.ToUnixTime());
            }
            if (UnbannedBy != null)
            {
                writer.WriteString("UB", UnbannedBy);
            }
            if (UnbanReason != null)
            {
                writer.WriteString("UR", UnbanReason);
            }

            // Freeze
            if (IsFrozen)
            {
                writer.WriteByte("IF", 1);
                if (FrozenBy != null)
                {
                    writer.WriteString("FB", FrozenBy);
                }
                writer.WriteLong("FD", FrozenOn.ToUnixTime());
            }

            // Mute
            if (IsMuted)
            {
                writer.WriteLong("MU", MutedUntil.ToUnixTime());
                if (MutedBy != null)
                {
                    writer.WriteString("MB", MutedBy);
                }
            }

            // Stats
            writer.WriteInt("BBC", BlocksBuilt);
            writer.WriteInt("BDC", BlocksDeleted);
            writer.WriteLong("BRC", BlocksDrawn);
            writer.WriteInt("MW", MessagesWritten);
            writer.WriteInt("TV", TimesVisited);

            int    seconds;
            Player pObject = PlayerObject;

            if (pObject != null)
            {
                seconds = (int)TotalTime.Add(TimeSinceLastLogin).TotalSeconds;
            }
            else
            {
                seconds = (int)TotalTime.TotalSeconds;
            }
            writer.WriteInt("TT", seconds);
            if (TimesKickedOthers > 0)
            {
                writer.WriteInt("TKO", TimesKickedOthers);
            }
            if (TimesBannedOthers > 0)
            {
                writer.WriteInt("TBO", TimesBannedOthers);
            }

            writer.EndCompound();
        }