// Decompiled with JetBrains decompiler // Type: Terraria.IO.WorldFile // Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null // MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83 // Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Threading; using Terraria.DataStructures; using Terraria.GameContent; using Terraria.GameContent.Creative; using Terraria.GameContent.Events; using Terraria.GameContent.Tile_Entities; using Terraria.ID; using Terraria.Localization; using Terraria.Social; using Terraria.UI; using Terraria.Utilities; namespace Terraria.IO { public class WorldFile { private static readonly object IOLock = new object(); private static double _tempTime = Main.time; private static bool _tempRaining; private static float _tempMaxRain; private static int _tempRainTime; private static bool _tempDayTime = Main.dayTime; private static bool _tempBloodMoon = Main.bloodMoon; private static bool _tempEclipse = Main.eclipse; private static int _tempMoonPhase = Main.moonPhase; private static int _tempCultistDelay = CultistRitual.delay; private static int _versionNumber; private static bool _isWorldOnCloud; private static bool _tempPartyGenuine; private static bool _tempPartyManual; private static int _tempPartyCooldown; private static readonly List TempPartyCelebratingNPCs = new List(); private static bool _hasCache; private static bool? _cachedDayTime; private static double? _cachedTime; private static int? _cachedMoonPhase; private static bool? _cachedBloodMoon; private static bool? _cachedEclipse; private static int? _cachedCultistDelay; private static bool? _cachedPartyGenuine; private static bool? _cachedPartyManual; private static int? _cachedPartyDaysOnCooldown; private static readonly List CachedCelebratingNPCs = new List(); private static bool? _cachedSandstormHappening; private static bool _tempSandstormHappening; private static int? _cachedSandstormTimeLeft; private static int _tempSandstormTimeLeft; private static float? _cachedSandstormSeverity; private static float _tempSandstormSeverity; private static float? _cachedSandstormIntendedSeverity; private static float _tempSandstormIntendedSeverity; private static bool _tempLanternNightGenuine; private static bool _tempLanternNightManual; private static bool _tempLanternNightNextNightIsGenuine; private static int _tempLanternNightCooldown; private static bool? _cachedLanternNightGenuine; private static bool? _cachedLanternNightManual; private static bool? _cachedLanternNightNextNightIsGenuine; private static int? _cachedLanternNightCooldown; public static Exception LastThrownLoadException; public static event Action OnWorldLoad; public static void CacheSaveTime() { WorldFile._hasCache = true; WorldFile._cachedDayTime = new bool?(Main.dayTime); WorldFile._cachedTime = new double?(Main.time); WorldFile._cachedMoonPhase = new int?(Main.moonPhase); WorldFile._cachedBloodMoon = new bool?(Main.bloodMoon); WorldFile._cachedEclipse = new bool?(Main.eclipse); WorldFile._cachedCultistDelay = new int?(CultistRitual.delay); WorldFile._cachedPartyGenuine = new bool?(BirthdayParty.GenuineParty); WorldFile._cachedPartyManual = new bool?(BirthdayParty.ManualParty); WorldFile._cachedPartyDaysOnCooldown = new int?(BirthdayParty.PartyDaysOnCooldown); WorldFile.CachedCelebratingNPCs.Clear(); WorldFile.CachedCelebratingNPCs.AddRange((IEnumerable) BirthdayParty.CelebratingNPCs); WorldFile._cachedSandstormHappening = new bool?(Sandstorm.Happening); WorldFile._cachedSandstormTimeLeft = new int?(Sandstorm.TimeLeft); WorldFile._cachedSandstormSeverity = new float?(Sandstorm.Severity); WorldFile._cachedSandstormIntendedSeverity = new float?(Sandstorm.IntendedSeverity); WorldFile._cachedLanternNightCooldown = new int?(LanternNight.LanternNightsOnCooldown); WorldFile._cachedLanternNightGenuine = new bool?(LanternNight.GenuineLanterns); WorldFile._cachedLanternNightManual = new bool?(LanternNight.ManualLanterns); WorldFile._cachedLanternNightNextNightIsGenuine = new bool?(LanternNight.NextNightIsLanternNight); } public static void SetOngoingToTemps() { Main.dayTime = WorldFile._tempDayTime; Main.time = WorldFile._tempTime; Main.moonPhase = WorldFile._tempMoonPhase; Main.bloodMoon = WorldFile._tempBloodMoon; Main.eclipse = WorldFile._tempEclipse; Main.raining = WorldFile._tempRaining; Main.rainTime = WorldFile._tempRainTime; Main.maxRaining = WorldFile._tempMaxRain; Main.cloudAlpha = WorldFile._tempMaxRain; CultistRitual.delay = WorldFile._tempCultistDelay; BirthdayParty.ManualParty = WorldFile._tempPartyManual; BirthdayParty.GenuineParty = WorldFile._tempPartyGenuine; BirthdayParty.PartyDaysOnCooldown = WorldFile._tempPartyCooldown; BirthdayParty.CelebratingNPCs.Clear(); BirthdayParty.CelebratingNPCs.AddRange((IEnumerable) WorldFile.TempPartyCelebratingNPCs); Sandstorm.Happening = WorldFile._tempSandstormHappening; Sandstorm.TimeLeft = WorldFile._tempSandstormTimeLeft; Sandstorm.Severity = WorldFile._tempSandstormSeverity; Sandstorm.IntendedSeverity = WorldFile._tempSandstormIntendedSeverity; LanternNight.GenuineLanterns = WorldFile._tempLanternNightGenuine; LanternNight.LanternNightsOnCooldown = WorldFile._tempLanternNightCooldown; LanternNight.ManualLanterns = WorldFile._tempLanternNightManual; LanternNight.NextNightIsLanternNight = WorldFile._tempLanternNightNextNightIsGenuine; } public static bool IsValidWorld(string file, bool cloudSave) => WorldFile.GetFileMetadata(file, cloudSave) != null; public static WorldFileData GetAllMetadata(string file, bool cloudSave) { if (file == null || cloudSave && SocialAPI.Cloud == null) return (WorldFileData) null; WorldFileData worldFileData = new WorldFileData(file, cloudSave); if (!FileUtilities.Exists(file, cloudSave)) { worldFileData.CreationTime = DateTime.Now; worldFileData.Metadata = FileMetadata.FromCurrentSettings(FileType.World); return worldFileData; } try { using (Stream input = cloudSave ? (Stream) new MemoryStream(SocialAPI.Cloud.Read(file)) : (Stream) new FileStream(file, FileMode.Open)) { using (BinaryReader reader = new BinaryReader(input)) { int num1 = reader.ReadInt32(); if (num1 >= 135) worldFileData.Metadata = FileMetadata.Read(reader, FileType.World); else worldFileData.Metadata = FileMetadata.FromCurrentSettings(FileType.World); if (num1 <= 230) { int num2 = (int) reader.ReadInt16(); input.Position = (long) reader.ReadInt32(); worldFileData.Name = reader.ReadString(); if (num1 >= 179) { string seedText = num1 != 179 ? reader.ReadString() : reader.ReadInt32().ToString(); worldFileData.SetSeed(seedText); worldFileData.WorldGeneratorVersion = reader.ReadUInt64(); } else { worldFileData.SetSeedToEmpty(); worldFileData.WorldGeneratorVersion = 0UL; } worldFileData.UniqueId = num1 < 181 ? Guid.Empty : new Guid(reader.ReadBytes(16)); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); int y = reader.ReadInt32(); int x = reader.ReadInt32(); worldFileData.SetWorldSize(x, y); if (num1 >= 209) { worldFileData.GameMode = reader.ReadInt32(); if (num1 >= 222) { worldFileData.DrunkWorld = reader.ReadBoolean(); if (num1 >= 227) reader.ReadBoolean(); } } else if (num1 >= 112) worldFileData.GameMode = !reader.ReadBoolean() ? 0 : 1; worldFileData.CreationTime = num1 < 141 ? (cloudSave ? DateTime.Now : File.GetCreationTime(file)) : DateTime.FromBinary(reader.ReadInt64()); int num3 = (int) reader.ReadByte(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadInt32(); reader.ReadDouble(); reader.ReadDouble(); reader.ReadDouble(); reader.ReadBoolean(); reader.ReadInt32(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadInt32(); reader.ReadInt32(); worldFileData.HasCrimson = reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); int num4 = num1 < 118 ? 0 : (reader.ReadBoolean() ? 1 : 0); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); reader.ReadBoolean(); int num5 = (int) reader.ReadByte(); reader.ReadInt32(); worldFileData.IsHardMode = reader.ReadBoolean(); return worldFileData; } } } } catch (Exception ex) { } return (WorldFileData) null; } public static WorldFileData CreateMetadata( string name, bool cloudSave, int GameMode) { WorldFileData worldFileData = new WorldFileData(Main.GetWorldPathFromName(name, cloudSave), cloudSave); if (Main.autoGenFileLocation != null && Main.autoGenFileLocation != "") { worldFileData = new WorldFileData(Main.autoGenFileLocation, cloudSave); Main.autoGenFileLocation = (string) null; } worldFileData.Name = name; worldFileData.GameMode = GameMode; worldFileData.CreationTime = DateTime.Now; worldFileData.Metadata = FileMetadata.FromCurrentSettings(FileType.World); worldFileData.SetFavorite(false); worldFileData.WorldGeneratorVersion = 987842478081UL; worldFileData.UniqueId = Guid.NewGuid(); if (Main.DefaultSeed == "") worldFileData.SetSeedToRandom(); else worldFileData.SetSeed(Main.DefaultSeed); return worldFileData; } public static void ResetTemps() { WorldFile._tempRaining = false; WorldFile._tempMaxRain = 0.0f; WorldFile._tempRainTime = 0; WorldFile._tempDayTime = true; WorldFile._tempBloodMoon = false; WorldFile._tempEclipse = false; WorldFile._tempMoonPhase = 0; Main.anglerWhoFinishedToday.Clear(); Main.anglerQuestFinished = false; } private static void ClearTempTiles() { for (int i = 0; i < Main.maxTilesX; ++i) { for (int j = 0; j < Main.maxTilesY; ++j) { if (Main.tile[i, j].type == (ushort) sbyte.MaxValue || Main.tile[i, j].type == (ushort) 504) WorldGen.KillTile(i, j); } } } public static void LoadWorld(bool loadFromCloud) { Main.lockMenuBGChange = true; WorldFile._isWorldOnCloud = loadFromCloud; Main.checkXMas(); Main.checkHalloween(); bool flag = loadFromCloud && SocialAPI.Cloud != null; if (!FileUtilities.Exists(Main.worldPathName, flag) && Main.autoGen) { if (!flag) { for (int index = Main.worldPathName.Length - 1; index >= 0; --index) { if (Main.worldPathName.Substring(index, 1) == (Path.DirectorySeparatorChar.ToString() ?? "")) { Utils.TryCreatingDirectory(Main.worldPathName.Substring(0, index)); break; } } } WorldGen.clearWorld(); Main.ActiveWorldFileData = WorldFile.CreateMetadata(Main.worldName == "" ? "World" : Main.worldName, flag, Main.GameMode); string seedText = (Main.AutogenSeedName ?? "").Trim(); if (seedText.Length == 0) Main.ActiveWorldFileData.SetSeedToRandom(); else Main.ActiveWorldFileData.SetSeed(seedText); WorldGen.GenerateWorld(Main.ActiveWorldFileData.Seed, Main.AutogenProgress); WorldFile.SaveWorld(); } using (MemoryStream memoryStream = new MemoryStream(FileUtilities.ReadAllBytes(Main.worldPathName, flag))) { using (BinaryReader binaryReader = new BinaryReader((Stream) memoryStream)) { try { WorldGen.loadFailed = false; WorldGen.loadSuccess = false; int num1 = binaryReader.ReadInt32(); WorldFile._versionNumber = num1; if (WorldFile._versionNumber <= 0 || WorldFile._versionNumber > 230) { WorldGen.loadFailed = true; return; } int num2 = num1 > 87 ? WorldFile.LoadWorld_Version2(binaryReader) : WorldFile.LoadWorld_Version1_Old_BeforeRelease88(binaryReader); if (num1 < 141) Main.ActiveWorldFileData.CreationTime = loadFromCloud ? DateTime.Now : File.GetCreationTime(Main.worldPathName); WorldFile.CheckSavedOreTiers(); binaryReader.Close(); memoryStream.Close(); if (num2 != 0) WorldGen.loadFailed = true; else WorldGen.loadSuccess = true; if (WorldGen.loadFailed || !WorldGen.loadSuccess) return; WorldFile.ConvertOldTileEntities(); WorldFile.ClearTempTiles(); WorldGen.gen = true; WorldGen.waterLine = Main.maxTilesY; Liquid.QuickWater(2); WorldGen.WaterCheck(); int num3 = 0; Liquid.quickSettle = true; int num4 = Liquid.numLiquid + LiquidBuffer.numLiquidBuffer; float num5 = 0.0f; while (Liquid.numLiquid > 0 && num3 < 100000) { ++num3; float num6 = (float) (num4 - (Liquid.numLiquid + LiquidBuffer.numLiquidBuffer)) / (float) num4; if (Liquid.numLiquid + LiquidBuffer.numLiquidBuffer > num4) num4 = Liquid.numLiquid + LiquidBuffer.numLiquidBuffer; if ((double) num6 > (double) num5) num5 = num6; else num6 = num5; Main.statusText = Lang.gen[27].Value + " " + (object) (int) ((double) num6 * 100.0 / 2.0 + 50.0) + "%"; Liquid.UpdateLiquid(); } Liquid.quickSettle = false; Main.weatherCounter = WorldGen.genRand.Next(3600, 18000); Cloud.resetClouds(); WorldGen.WaterCheck(); WorldGen.gen = false; NPC.setFireFlyChance(); if (Main.slimeRainTime > 0.0) Main.StartSlimeRain(false); NPC.SetWorldSpecificMonstersByWorldID(); } catch (Exception ex) { WorldFile.LastThrownLoadException = ex; WorldGen.loadFailed = true; WorldGen.loadSuccess = false; try { binaryReader.Close(); memoryStream.Close(); return; } catch { return; } } } } if (WorldFile.OnWorldLoad == null) return; WorldFile.OnWorldLoad(); } public static void CheckSavedOreTiers() { if (WorldGen.SavedOreTiers.Copper != -1 && WorldGen.SavedOreTiers.Iron != -1 && WorldGen.SavedOreTiers.Silver != -1 && WorldGen.SavedOreTiers.Gold != -1) return; int[] numArray = WorldGen.CountTileTypesInWorld(7, 166, 6, 167, 9, 168, 8, 169); for (int index = 0; index < numArray.Length; index += 2) { int num1 = numArray[index]; int num2 = numArray[index + 1]; switch (index) { case 0: WorldGen.SavedOreTiers.Copper = num1 <= num2 ? 166 : 7; break; case 2: WorldGen.SavedOreTiers.Iron = num1 <= num2 ? 167 : 6; break; case 4: WorldGen.SavedOreTiers.Silver = num1 <= num2 ? 168 : 9; break; case 6: WorldGen.SavedOreTiers.Gold = num1 <= num2 ? 169 : 8; break; } } } public static void SaveWorld() { try { WorldFile.SaveWorld(WorldFile._isWorldOnCloud); } catch (Exception ex) { string worldPath = Main.WorldPath; FancyErrorPrinter.ShowFileSavingFailError(ex, worldPath); throw; } } public static void SaveWorld(bool useCloudSaving, bool resetTime = false) { if (useCloudSaving && SocialAPI.Cloud == null) return; if (Main.worldName == "") Main.worldName = "World"; while (WorldGen.IsGeneratingHardMode) Main.statusText = Lang.gen[48].Value; if (!Monitor.TryEnter(WorldFile.IOLock)) return; try { FileUtilities.ProtectedInvoke((Action) (() => WorldFile.InternalSaveWorld(useCloudSaving, resetTime))); } finally { Monitor.Exit(WorldFile.IOLock); } } private static void InternalSaveWorld(bool useCloudSaving, bool resetTime) { Utils.TryCreatingDirectory(Main.WorldPath); if (Main.skipMenu) return; if (WorldFile._hasCache) WorldFile.SetTempToCache(); else WorldFile.SetTempToOngoing(); if (resetTime) WorldFile.ResetTempsToDayTime(); if (Main.worldPathName == null) return; new Stopwatch().Start(); byte[] array; int length; using (MemoryStream memoryStream = new MemoryStream(7000000)) { using (BinaryWriter writer = new BinaryWriter((Stream) memoryStream)) WorldFile.SaveWorld_Version2(writer); array = memoryStream.ToArray(); length = array.Length; } byte[] data = (byte[]) null; if (FileUtilities.Exists(Main.worldPathName, useCloudSaving)) data = FileUtilities.ReadAllBytes(Main.worldPathName, useCloudSaving); FileUtilities.Write(Main.worldPathName, array, length, useCloudSaving); byte[] buffer = FileUtilities.ReadAllBytes(Main.worldPathName, useCloudSaving); string str = (string) null; using (MemoryStream memoryStream = new MemoryStream(buffer, 0, length, false)) { using (BinaryReader fileIO = new BinaryReader((Stream) memoryStream)) { if (!Main.validateSaves || WorldFile.ValidateWorld(fileIO)) { if (data != null) { str = Main.worldPathName + ".bak"; Main.statusText = Lang.gen[50].Value; } WorldFile.DoRollingBackups(str); } else str = Main.worldPathName; } } if (str == null || data == null) return; FileUtilities.WriteAllBytes(str, data, useCloudSaving); } private static void DoRollingBackups(string backupWorldWritePath) { if (Main.WorldRollingBackupsCountToKeep <= 1) return; int num1 = Main.WorldRollingBackupsCountToKeep; if (num1 > 9) num1 = 9; int num2 = 1; for (int index = 1; index < num1; ++index) { string path = backupWorldWritePath + (object) index; if (index == 1) path = backupWorldWritePath; if (FileUtilities.Exists(path, false)) num2 = index + 1; else break; } for (int index = num2 - 1; index > 0; --index) { string str = backupWorldWritePath + (object) index; if (index == 1) str = backupWorldWritePath; string destination = backupWorldWritePath + (object) (index + 1); if (FileUtilities.Exists(str, false)) FileUtilities.Move(str, destination, false); } } private static void ResetTempsToDayTime() { WorldFile._tempDayTime = true; WorldFile._tempTime = 13500.0; WorldFile._tempMoonPhase = 0; WorldFile._tempBloodMoon = false; WorldFile._tempEclipse = false; WorldFile._tempCultistDelay = 86400; WorldFile._tempPartyManual = false; WorldFile._tempPartyGenuine = false; WorldFile._tempPartyCooldown = 0; WorldFile.TempPartyCelebratingNPCs.Clear(); WorldFile._tempSandstormHappening = false; WorldFile._tempSandstormTimeLeft = 0; WorldFile._tempSandstormSeverity = 0.0f; WorldFile._tempSandstormIntendedSeverity = 0.0f; WorldFile._tempLanternNightCooldown = 0; WorldFile._tempLanternNightGenuine = false; WorldFile._tempLanternNightManual = false; WorldFile._tempLanternNightNextNightIsGenuine = false; } private static void SetTempToOngoing() { WorldFile._tempDayTime = Main.dayTime; WorldFile._tempTime = Main.time; WorldFile._tempMoonPhase = Main.moonPhase; WorldFile._tempBloodMoon = Main.bloodMoon; WorldFile._tempEclipse = Main.eclipse; WorldFile._tempCultistDelay = CultistRitual.delay; WorldFile._tempPartyManual = BirthdayParty.ManualParty; WorldFile._tempPartyGenuine = BirthdayParty.GenuineParty; WorldFile._tempPartyCooldown = BirthdayParty.PartyDaysOnCooldown; WorldFile.TempPartyCelebratingNPCs.Clear(); WorldFile.TempPartyCelebratingNPCs.AddRange((IEnumerable) BirthdayParty.CelebratingNPCs); WorldFile._tempSandstormHappening = Sandstorm.Happening; WorldFile._tempSandstormTimeLeft = Sandstorm.TimeLeft; WorldFile._tempSandstormSeverity = Sandstorm.Severity; WorldFile._tempSandstormIntendedSeverity = Sandstorm.IntendedSeverity; WorldFile._tempRaining = Main.raining; WorldFile._tempRainTime = Main.rainTime; WorldFile._tempMaxRain = Main.maxRaining; WorldFile._tempLanternNightCooldown = LanternNight.LanternNightsOnCooldown; WorldFile._tempLanternNightGenuine = LanternNight.GenuineLanterns; WorldFile._tempLanternNightManual = LanternNight.ManualLanterns; WorldFile._tempLanternNightNextNightIsGenuine = LanternNight.NextNightIsLanternNight; } private static void SetTempToCache() { WorldFile._hasCache = false; WorldFile._tempDayTime = WorldFile._cachedDayTime.Value; WorldFile._tempTime = WorldFile._cachedTime.Value; WorldFile._tempMoonPhase = WorldFile._cachedMoonPhase.Value; WorldFile._tempBloodMoon = WorldFile._cachedBloodMoon.Value; WorldFile._tempEclipse = WorldFile._cachedEclipse.Value; WorldFile._tempCultistDelay = WorldFile._cachedCultistDelay.Value; WorldFile._tempPartyManual = WorldFile._cachedPartyManual.Value; WorldFile._tempPartyGenuine = WorldFile._cachedPartyGenuine.Value; WorldFile._tempPartyCooldown = WorldFile._cachedPartyDaysOnCooldown.Value; WorldFile.TempPartyCelebratingNPCs.Clear(); WorldFile.TempPartyCelebratingNPCs.AddRange((IEnumerable) WorldFile.CachedCelebratingNPCs); WorldFile._tempSandstormHappening = WorldFile._cachedSandstormHappening.Value; WorldFile._tempSandstormTimeLeft = WorldFile._cachedSandstormTimeLeft.Value; WorldFile._tempSandstormSeverity = WorldFile._cachedSandstormSeverity.Value; WorldFile._tempSandstormIntendedSeverity = WorldFile._cachedSandstormIntendedSeverity.Value; WorldFile._tempRaining = Main.raining; WorldFile._tempRainTime = Main.rainTime; WorldFile._tempMaxRain = Main.maxRaining; WorldFile._tempLanternNightCooldown = WorldFile._cachedLanternNightCooldown.Value; WorldFile._tempLanternNightGenuine = WorldFile._cachedLanternNightGenuine.Value; WorldFile._tempLanternNightManual = WorldFile._cachedLanternNightManual.Value; WorldFile._tempLanternNightNextNightIsGenuine = WorldFile._cachedLanternNightNextNightIsGenuine.Value; } private static void ConvertOldTileEntities() { List pointList1 = new List(); List pointList2 = new List(); for (int x = 0; x < Main.maxTilesX; ++x) { for (int y = 0; y < Main.maxTilesY; ++y) { Tile tile = Main.tile[x, y]; if ((tile.type == (ushort) 128 || tile.type == (ushort) 269) && tile.frameY == (short) 0 && ((int) tile.frameX % 100 == 0 || (int) tile.frameX % 100 == 36)) pointList1.Add(new Point(x, y)); if (tile.type == (ushort) 334 && tile.frameY == (short) 0 && (int) tile.frameX % 54 == 0) pointList2.Add(new Point(x, y)); if (tile.type == (ushort) 49 && (tile.frameX == (short) -1 || tile.frameY == (short) -1)) { tile.frameX = (short) 0; tile.frameY = (short) 0; } } } foreach (Point point in pointList1) { if (WorldGen.InWorld(point.X, point.Y, 5)) { int frameX1 = (int) Main.tile[point.X, point.Y].frameX; int frameX2 = (int) Main.tile[point.X, point.Y + 1].frameX; int frameX3 = (int) Main.tile[point.X, point.Y + 2].frameX; for (int index1 = 0; index1 < 2; ++index1) { for (int index2 = 0; index2 < 3; ++index2) { Tile tile = Main.tile[point.X + index1, point.Y + index2]; tile.frameX %= (short) 100; if (tile.type == (ushort) 269) tile.frameX += (short) 72; tile.type = (ushort) 470; } } int key = TEDisplayDoll.Place(point.X, point.Y); if (key != -1) (TileEntity.ByID[key] as TEDisplayDoll).SetInventoryFromMannequin(frameX1, frameX2, frameX3); } } foreach (Point point in pointList2) { if (WorldGen.InWorld(point.X, point.Y, 5)) { bool flag1 = Main.tile[point.X, point.Y].frameX >= (short) 54; int frameX4 = (int) Main.tile[point.X, point.Y + 1].frameX; int frameX5 = (int) Main.tile[point.X + 1, point.Y + 1].frameX; bool flag2 = frameX4 >= 5000; int netid = frameX4 % 5000 - 100; int prefix = frameX5 - (frameX5 >= 25000 ? 25000 : 10000); for (int index3 = 0; index3 < 3; ++index3) { for (int index4 = 0; index4 < 3; ++index4) { Tile tile = Main.tile[point.X + index3, point.Y + index4]; tile.type = (ushort) 471; tile.frameX = (short) ((flag1 ? 54 : 0) + index3 * 18); tile.frameY = (short) (index4 * 18); } } if (TEWeaponsRack.Place(point.X, point.Y) != -1 & flag2) TEWeaponsRack.TryPlacing(point.X, point.Y, netid, prefix, 1); } } } private static void SaveWorld_Version2(BinaryWriter writer) { int[] pointers = new int[11] { WorldFile.SaveFileFormatHeader(writer), WorldFile.SaveWorldHeader(writer), WorldFile.SaveWorldTiles(writer), WorldFile.SaveChests(writer), WorldFile.SaveSigns(writer), WorldFile.SaveNPCs(writer), WorldFile.SaveTileEntities(writer), WorldFile.SaveWeightedPressurePlates(writer), WorldFile.SaveTownManager(writer), WorldFile.SaveBestiary(writer), WorldFile.SaveCreativePowers(writer) }; WorldFile.SaveFooter(writer); WorldFile.SaveHeaderPointers(writer, pointers); } private static int SaveFileFormatHeader(BinaryWriter writer) { short num1 = 623; short num2 = 11; writer.Write(230); Main.WorldFileMetadata.IncrementAndWrite(writer); writer.Write(num2); for (int index = 0; index < (int) num2; ++index) writer.Write(0); writer.Write(num1); byte num3 = 0; byte num4 = 1; for (int index = 0; index < (int) num1; ++index) { if (Main.tileFrameImportant[index]) num3 |= num4; if (num4 == (byte) 128) { writer.Write(num3); num3 = (byte) 0; num4 = (byte) 1; } else num4 <<= 1; } if (num4 != (byte) 1) writer.Write(num3); return (int) writer.BaseStream.Position; } private static int SaveHeaderPointers(BinaryWriter writer, int[] pointers) { writer.BaseStream.Position = 0L; writer.Write(230); writer.BaseStream.Position += 20L; writer.Write((short) pointers.Length); for (int index = 0; index < pointers.Length; ++index) writer.Write(pointers[index]); return (int) writer.BaseStream.Position; } private static int SaveWorldHeader(BinaryWriter writer) { writer.Write(Main.worldName); writer.Write(Main.ActiveWorldFileData.SeedText); writer.Write(Main.ActiveWorldFileData.WorldGeneratorVersion); writer.Write(Main.ActiveWorldFileData.UniqueId.ToByteArray()); writer.Write(Main.worldID); writer.Write((int) Main.leftWorld); writer.Write((int) Main.rightWorld); writer.Write((int) Main.topWorld); writer.Write((int) Main.bottomWorld); writer.Write(Main.maxTilesY); writer.Write(Main.maxTilesX); writer.Write(Main.GameMode); writer.Write(Main.drunkWorld); writer.Write(Main.getGoodWorld); writer.Write(Main.ActiveWorldFileData.CreationTime.ToBinary()); writer.Write((byte) Main.moonType); writer.Write(Main.treeX[0]); writer.Write(Main.treeX[1]); writer.Write(Main.treeX[2]); writer.Write(Main.treeStyle[0]); writer.Write(Main.treeStyle[1]); writer.Write(Main.treeStyle[2]); writer.Write(Main.treeStyle[3]); writer.Write(Main.caveBackX[0]); writer.Write(Main.caveBackX[1]); writer.Write(Main.caveBackX[2]); writer.Write(Main.caveBackStyle[0]); writer.Write(Main.caveBackStyle[1]); writer.Write(Main.caveBackStyle[2]); writer.Write(Main.caveBackStyle[3]); writer.Write(Main.iceBackStyle); writer.Write(Main.jungleBackStyle); writer.Write(Main.hellBackStyle); writer.Write(Main.spawnTileX); writer.Write(Main.spawnTileY); writer.Write(Main.worldSurface); writer.Write(Main.rockLayer); writer.Write(WorldFile._tempTime); writer.Write(WorldFile._tempDayTime); writer.Write(WorldFile._tempMoonPhase); writer.Write(WorldFile._tempBloodMoon); writer.Write(WorldFile._tempEclipse); writer.Write(Main.dungeonX); writer.Write(Main.dungeonY); writer.Write(WorldGen.crimson); writer.Write(NPC.downedBoss1); writer.Write(NPC.downedBoss2); writer.Write(NPC.downedBoss3); writer.Write(NPC.downedQueenBee); writer.Write(NPC.downedMechBoss1); writer.Write(NPC.downedMechBoss2); writer.Write(NPC.downedMechBoss3); writer.Write(NPC.downedMechBossAny); writer.Write(NPC.downedPlantBoss); writer.Write(NPC.downedGolemBoss); writer.Write(NPC.downedSlimeKing); writer.Write(NPC.savedGoblin); writer.Write(NPC.savedWizard); writer.Write(NPC.savedMech); writer.Write(NPC.downedGoblins); writer.Write(NPC.downedClown); writer.Write(NPC.downedFrost); writer.Write(NPC.downedPirates); writer.Write(WorldGen.shadowOrbSmashed); writer.Write(WorldGen.spawnMeteor); writer.Write((byte) WorldGen.shadowOrbCount); writer.Write(WorldGen.altarCount); writer.Write(Main.hardMode); writer.Write(Main.invasionDelay); writer.Write(Main.invasionSize); writer.Write(Main.invasionType); writer.Write(Main.invasionX); writer.Write(Main.slimeRainTime); writer.Write((byte) Main.sundialCooldown); writer.Write(WorldFile._tempRaining); writer.Write(WorldFile._tempRainTime); writer.Write(WorldFile._tempMaxRain); writer.Write(WorldGen.SavedOreTiers.Cobalt); writer.Write(WorldGen.SavedOreTiers.Mythril); writer.Write(WorldGen.SavedOreTiers.Adamantite); writer.Write((byte) WorldGen.treeBG1); writer.Write((byte) WorldGen.corruptBG); writer.Write((byte) WorldGen.jungleBG); writer.Write((byte) WorldGen.snowBG); writer.Write((byte) WorldGen.hallowBG); writer.Write((byte) WorldGen.crimsonBG); writer.Write((byte) WorldGen.desertBG); writer.Write((byte) WorldGen.oceanBG); writer.Write((int) Main.cloudBGActive); writer.Write((short) Main.numClouds); writer.Write(Main.windSpeedTarget); writer.Write(Main.anglerWhoFinishedToday.Count); for (int index = 0; index < Main.anglerWhoFinishedToday.Count; ++index) writer.Write(Main.anglerWhoFinishedToday[index]); writer.Write(NPC.savedAngler); writer.Write(Main.anglerQuest); writer.Write(NPC.savedStylist); writer.Write(NPC.savedTaxCollector); writer.Write(NPC.savedGolfer); writer.Write(Main.invasionSizeStart); writer.Write(WorldFile._tempCultistDelay); writer.Write((short) 663); for (int index = 0; index < 663; ++index) writer.Write(NPC.killCount[index]); writer.Write(Main.fastForwardTime); writer.Write(NPC.downedFishron); writer.Write(NPC.downedMartians); writer.Write(NPC.downedAncientCultist); writer.Write(NPC.downedMoonlord); writer.Write(NPC.downedHalloweenKing); writer.Write(NPC.downedHalloweenTree); writer.Write(NPC.downedChristmasIceQueen); writer.Write(NPC.downedChristmasSantank); writer.Write(NPC.downedChristmasTree); writer.Write(NPC.downedTowerSolar); writer.Write(NPC.downedTowerVortex); writer.Write(NPC.downedTowerNebula); writer.Write(NPC.downedTowerStardust); writer.Write(NPC.TowerActiveSolar); writer.Write(NPC.TowerActiveVortex); writer.Write(NPC.TowerActiveNebula); writer.Write(NPC.TowerActiveStardust); writer.Write(NPC.LunarApocalypseIsUp); writer.Write(WorldFile._tempPartyManual); writer.Write(WorldFile._tempPartyGenuine); writer.Write(WorldFile._tempPartyCooldown); writer.Write(WorldFile.TempPartyCelebratingNPCs.Count); for (int index = 0; index < WorldFile.TempPartyCelebratingNPCs.Count; ++index) writer.Write(WorldFile.TempPartyCelebratingNPCs[index]); writer.Write(WorldFile._tempSandstormHappening); writer.Write(WorldFile._tempSandstormTimeLeft); writer.Write(WorldFile._tempSandstormSeverity); writer.Write(WorldFile._tempSandstormIntendedSeverity); writer.Write(NPC.savedBartender); DD2Event.Save(writer); writer.Write((byte) WorldGen.mushroomBG); writer.Write((byte) WorldGen.underworldBG); writer.Write((byte) WorldGen.treeBG2); writer.Write((byte) WorldGen.treeBG3); writer.Write((byte) WorldGen.treeBG4); writer.Write(NPC.combatBookWasUsed); writer.Write(WorldFile._tempLanternNightCooldown); writer.Write(WorldFile._tempLanternNightGenuine); writer.Write(WorldFile._tempLanternNightManual); writer.Write(WorldFile._tempLanternNightNextNightIsGenuine); WorldGen.TreeTops.Save(writer); writer.Write(Main.forceHalloweenForToday); writer.Write(Main.forceXMasForToday); writer.Write(WorldGen.SavedOreTiers.Copper); writer.Write(WorldGen.SavedOreTiers.Iron); writer.Write(WorldGen.SavedOreTiers.Silver); writer.Write(WorldGen.SavedOreTiers.Gold); writer.Write(NPC.boughtCat); writer.Write(NPC.boughtDog); writer.Write(NPC.boughtBunny); writer.Write(NPC.downedEmpressOfLight); writer.Write(NPC.downedQueenSlime); return (int) writer.BaseStream.Position; } private static int SaveWorldTiles(BinaryWriter writer) { byte[] buffer = new byte[15]; for (int index1 = 0; index1 < Main.maxTilesX; ++index1) { float num1 = (float) index1 / (float) Main.maxTilesX; Main.statusText = Lang.gen[49].Value + " " + (object) (int) ((double) num1 * 100.0 + 1.0) + "%"; int num2; for (int index2 = 0; index2 < Main.maxTilesY; index2 = num2 + 1) { Tile tile = Main.tile[index1, index2]; int index3 = 3; int num3; byte num4 = (byte) (num3 = 0); byte num5 = (byte) num3; byte num6 = (byte) num3; bool flag = false; if (tile.active()) flag = true; if (flag) { num6 |= (byte) 2; buffer[index3] = (byte) tile.type; ++index3; if (tile.type > (ushort) byte.MaxValue) { buffer[index3] = (byte) ((uint) tile.type >> 8); ++index3; num6 |= (byte) 32; } if (Main.tileFrameImportant[(int) tile.type]) { buffer[index3] = (byte) ((uint) tile.frameX & (uint) byte.MaxValue); int index4 = index3 + 1; buffer[index4] = (byte) (((int) tile.frameX & 65280) >> 8); int index5 = index4 + 1; buffer[index5] = (byte) ((uint) tile.frameY & (uint) byte.MaxValue); int index6 = index5 + 1; buffer[index6] = (byte) (((int) tile.frameY & 65280) >> 8); index3 = index6 + 1; } if (tile.color() != (byte) 0) { num4 |= (byte) 8; buffer[index3] = tile.color(); ++index3; } } if (tile.wall != (ushort) 0) { num6 |= (byte) 4; buffer[index3] = (byte) tile.wall; ++index3; if (tile.wallColor() != (byte) 0) { num4 |= (byte) 16; buffer[index3] = tile.wallColor(); ++index3; } } if (tile.liquid != (byte) 0) { if (tile.lava()) num6 |= (byte) 16; else if (tile.honey()) num6 |= (byte) 24; else num6 |= (byte) 8; buffer[index3] = tile.liquid; ++index3; } if (tile.wire()) num5 |= (byte) 2; if (tile.wire2()) num5 |= (byte) 4; if (tile.wire3()) num5 |= (byte) 8; int num7 = !tile.halfBrick() ? (tile.slope() == (byte) 0 ? 0 : (int) tile.slope() + 1 << 4) : 16; byte num8 = (byte) ((uint) num5 | (uint) (byte) num7); if (tile.actuator()) num4 |= (byte) 2; if (tile.inActive()) num4 |= (byte) 4; if (tile.wire4()) num4 |= (byte) 32; if (tile.wall > (ushort) byte.MaxValue) { buffer[index3] = (byte) ((uint) tile.wall >> 8); ++index3; num4 |= (byte) 64; } int index7 = 2; if (num4 != (byte) 0) { num8 |= (byte) 1; buffer[index7] = num4; --index7; } if (num8 != (byte) 0) { num6 |= (byte) 1; buffer[index7] = num8; --index7; } short num9 = 0; int index8 = index2 + 1; for (int index9 = Main.maxTilesY - index2 - 1; index9 > 0 && tile.isTheSameAs(Main.tile[index1, index8]); ++index8) { ++num9; --index9; } num2 = index2 + (int) num9; if (num9 > (short) 0) { buffer[index3] = (byte) ((uint) num9 & (uint) byte.MaxValue); ++index3; if (num9 > (short) byte.MaxValue) { num6 |= (byte) 128; buffer[index3] = (byte) (((int) num9 & 65280) >> 8); ++index3; } else num6 |= (byte) 64; } buffer[index7] = num6; writer.Write(buffer, index7, index3 - index7); } } return (int) writer.BaseStream.Position; } private static int SaveChests(BinaryWriter writer) { short num = 0; for (int index = 0; index < 8000; ++index) { Chest chest = Main.chest[index]; if (chest != null) { bool flag = false; for (int x = chest.x; x <= chest.x + 1; ++x) { for (int y = chest.y; y <= chest.y + 1; ++y) { if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY) { flag = true; break; } Tile tile = Main.tile[x, y]; if (!tile.active() || !Main.tileContainer[(int) tile.type]) { flag = true; break; } } } if (flag) Main.chest[index] = (Chest) null; else ++num; } } writer.Write(num); writer.Write((short) 40); for (int index1 = 0; index1 < 8000; ++index1) { Chest chest = Main.chest[index1]; if (chest != null) { writer.Write(chest.x); writer.Write(chest.y); writer.Write(chest.name); for (int index2 = 0; index2 < 40; ++index2) { Item obj = chest.item[index2]; if (obj == null) { writer.Write((short) 0); } else { if (obj.stack > obj.maxStack) obj.stack = obj.maxStack; if (obj.stack < 0) obj.stack = 1; writer.Write((short) obj.stack); if (obj.stack > 0) { writer.Write(obj.netID); writer.Write(obj.prefix); } } } } } return (int) writer.BaseStream.Position; } private static int SaveSigns(BinaryWriter writer) { short num = 0; for (int index = 0; index < 1000; ++index) { Sign sign = Main.sign[index]; if (sign != null && sign.text != null) ++num; } writer.Write(num); for (int index = 0; index < 1000; ++index) { Sign sign = Main.sign[index]; if (sign != null && sign.text != null) { writer.Write(sign.text); writer.Write(sign.x); writer.Write(sign.y); } } return (int) writer.BaseStream.Position; } private static int SaveNPCs(BinaryWriter writer) { for (int index = 0; index < Main.npc.Length; ++index) { NPC npc = Main.npc[index]; if (npc.active && npc.townNPC && npc.type != 368) { writer.Write(npc.active); writer.Write(npc.netID); writer.Write(npc.GivenName); writer.Write(npc.position.X); writer.Write(npc.position.Y); writer.Write(npc.homeless); writer.Write(npc.homeTileX); writer.Write(npc.homeTileY); BitsByte bitsByte = (BitsByte) (byte) 0; bitsByte[0] = npc.townNPC; writer.Write((byte) bitsByte); if (bitsByte[0]) writer.Write(npc.townNpcVariationIndex); } } writer.Write(false); for (int index = 0; index < Main.npc.Length; ++index) { NPC npc = Main.npc[index]; if (npc.active && NPCID.Sets.SavesAndLoads[npc.type]) { writer.Write(npc.active); writer.Write(npc.netID); writer.WriteVector2(npc.position); } } writer.Write(false); return (int) writer.BaseStream.Position; } private static int SaveFooter(BinaryWriter writer) { writer.Write(true); writer.Write(Main.worldName); writer.Write(Main.worldID); return (int) writer.BaseStream.Position; } private static int LoadWorld_Version2(BinaryReader reader) { reader.BaseStream.Position = 0L; bool[] importance; int[] positions; if (!WorldFile.LoadFileFormatHeader(reader, out importance, out positions) || reader.BaseStream.Position != (long) positions[0]) return 5; WorldFile.LoadHeader(reader); if (reader.BaseStream.Position != (long) positions[1]) return 5; WorldFile.LoadWorldTiles(reader, importance); if (reader.BaseStream.Position != (long) positions[2]) return 5; WorldFile.LoadChests(reader); if (reader.BaseStream.Position != (long) positions[3]) return 5; WorldFile.LoadSigns(reader); if (reader.BaseStream.Position != (long) positions[4]) return 5; WorldFile.LoadNPCs(reader); if (reader.BaseStream.Position != (long) positions[5]) return 5; if (WorldFile._versionNumber >= 116) { if (WorldFile._versionNumber < 122) { WorldFile.LoadDummies(reader); if (reader.BaseStream.Position != (long) positions[6]) return 5; } else { WorldFile.LoadTileEntities(reader); if (reader.BaseStream.Position != (long) positions[6]) return 5; } } if (WorldFile._versionNumber >= 170) { WorldFile.LoadWeightedPressurePlates(reader); if (reader.BaseStream.Position != (long) positions[7]) return 5; } if (WorldFile._versionNumber >= 189) { WorldFile.LoadTownManager(reader); if (reader.BaseStream.Position != (long) positions[8]) return 5; } if (WorldFile._versionNumber >= 210) { WorldFile.LoadBestiary(reader, WorldFile._versionNumber); if (reader.BaseStream.Position != (long) positions[9]) return 5; } else WorldFile.LoadBestiaryForVersionsBefore210(); if (WorldFile._versionNumber >= 220) { WorldFile.LoadCreativePowers(reader, WorldFile._versionNumber); if (reader.BaseStream.Position != (long) positions[10]) return 5; } return WorldFile.LoadFooter(reader); } private static bool LoadFileFormatHeader( BinaryReader reader, out bool[] importance, out int[] positions) { importance = (bool[]) null; positions = (int[]) null; if ((WorldFile._versionNumber = reader.ReadInt32()) >= 135) { try { Main.WorldFileMetadata = FileMetadata.Read(reader, FileType.World); } catch (FileFormatException ex) { Console.WriteLine(Language.GetTextValue("Error.UnableToLoadWorld")); Console.WriteLine((object) ex); return false; } } else Main.WorldFileMetadata = FileMetadata.FromCurrentSettings(FileType.World); short num1 = reader.ReadInt16(); positions = new int[(int) num1]; for (int index = 0; index < (int) num1; ++index) positions[index] = reader.ReadInt32(); short num2 = reader.ReadInt16(); importance = new bool[(int) num2]; byte num3 = 0; byte num4 = 128; for (int index = 0; index < (int) num2; ++index) { if (num4 == (byte) 128) { num3 = reader.ReadByte(); num4 = (byte) 1; } else num4 <<= 1; if (((int) num3 & (int) num4) == (int) num4) importance[index] = true; } return true; } private static void LoadHeader(BinaryReader reader) { int versionNumber = WorldFile._versionNumber; Main.worldName = reader.ReadString(); if (versionNumber >= 179) { string seedText = versionNumber != 179 ? reader.ReadString() : reader.ReadInt32().ToString(); Main.ActiveWorldFileData.SetSeed(seedText); Main.ActiveWorldFileData.WorldGeneratorVersion = reader.ReadUInt64(); } Main.ActiveWorldFileData.UniqueId = versionNumber < 181 ? Guid.NewGuid() : new Guid(reader.ReadBytes(16)); Main.worldID = reader.ReadInt32(); Main.leftWorld = (float) reader.ReadInt32(); Main.rightWorld = (float) reader.ReadInt32(); Main.topWorld = (float) reader.ReadInt32(); Main.bottomWorld = (float) reader.ReadInt32(); Main.maxTilesY = reader.ReadInt32(); Main.maxTilesX = reader.ReadInt32(); WorldGen.clearWorld(); if (versionNumber >= 209) { Main.GameMode = reader.ReadInt32(); if (versionNumber >= 222) Main.drunkWorld = reader.ReadBoolean(); if (versionNumber >= 227) Main.getGoodWorld = reader.ReadBoolean(); } else { Main.GameMode = versionNumber < 112 ? 0 : (reader.ReadBoolean() ? 1 : 0); if (versionNumber == 208 && reader.ReadBoolean()) Main.GameMode = 2; } if (versionNumber >= 141) Main.ActiveWorldFileData.CreationTime = DateTime.FromBinary(reader.ReadInt64()); Main.moonType = (int) reader.ReadByte(); Main.treeX[0] = reader.ReadInt32(); Main.treeX[1] = reader.ReadInt32(); Main.treeX[2] = reader.ReadInt32(); Main.treeStyle[0] = reader.ReadInt32(); Main.treeStyle[1] = reader.ReadInt32(); Main.treeStyle[2] = reader.ReadInt32(); Main.treeStyle[3] = reader.ReadInt32(); Main.caveBackX[0] = reader.ReadInt32(); Main.caveBackX[1] = reader.ReadInt32(); Main.caveBackX[2] = reader.ReadInt32(); Main.caveBackStyle[0] = reader.ReadInt32(); Main.caveBackStyle[1] = reader.ReadInt32(); Main.caveBackStyle[2] = reader.ReadInt32(); Main.caveBackStyle[3] = reader.ReadInt32(); Main.iceBackStyle = reader.ReadInt32(); Main.jungleBackStyle = reader.ReadInt32(); Main.hellBackStyle = reader.ReadInt32(); Main.spawnTileX = reader.ReadInt32(); Main.spawnTileY = reader.ReadInt32(); Main.worldSurface = reader.ReadDouble(); Main.rockLayer = reader.ReadDouble(); WorldFile._tempTime = reader.ReadDouble(); WorldFile._tempDayTime = reader.ReadBoolean(); WorldFile._tempMoonPhase = reader.ReadInt32(); WorldFile._tempBloodMoon = reader.ReadBoolean(); WorldFile._tempEclipse = reader.ReadBoolean(); Main.eclipse = WorldFile._tempEclipse; Main.dungeonX = reader.ReadInt32(); Main.dungeonY = reader.ReadInt32(); WorldGen.crimson = reader.ReadBoolean(); NPC.downedBoss1 = reader.ReadBoolean(); NPC.downedBoss2 = reader.ReadBoolean(); NPC.downedBoss3 = reader.ReadBoolean(); NPC.downedQueenBee = reader.ReadBoolean(); NPC.downedMechBoss1 = reader.ReadBoolean(); NPC.downedMechBoss2 = reader.ReadBoolean(); NPC.downedMechBoss3 = reader.ReadBoolean(); NPC.downedMechBossAny = reader.ReadBoolean(); NPC.downedPlantBoss = reader.ReadBoolean(); NPC.downedGolemBoss = reader.ReadBoolean(); if (versionNumber >= 118) NPC.downedSlimeKing = reader.ReadBoolean(); NPC.savedGoblin = reader.ReadBoolean(); NPC.savedWizard = reader.ReadBoolean(); NPC.savedMech = reader.ReadBoolean(); NPC.downedGoblins = reader.ReadBoolean(); NPC.downedClown = reader.ReadBoolean(); NPC.downedFrost = reader.ReadBoolean(); NPC.downedPirates = reader.ReadBoolean(); WorldGen.shadowOrbSmashed = reader.ReadBoolean(); WorldGen.spawnMeteor = reader.ReadBoolean(); WorldGen.shadowOrbCount = (int) reader.ReadByte(); WorldGen.altarCount = reader.ReadInt32(); Main.hardMode = reader.ReadBoolean(); Main.invasionDelay = reader.ReadInt32(); Main.invasionSize = reader.ReadInt32(); Main.invasionType = reader.ReadInt32(); Main.invasionX = reader.ReadDouble(); if (versionNumber >= 118) Main.slimeRainTime = reader.ReadDouble(); if (versionNumber >= 113) Main.sundialCooldown = (int) reader.ReadByte(); WorldFile._tempRaining = reader.ReadBoolean(); WorldFile._tempRainTime = reader.ReadInt32(); WorldFile._tempMaxRain = reader.ReadSingle(); WorldGen.SavedOreTiers.Cobalt = reader.ReadInt32(); WorldGen.SavedOreTiers.Mythril = reader.ReadInt32(); WorldGen.SavedOreTiers.Adamantite = reader.ReadInt32(); WorldGen.setBG(0, (int) reader.ReadByte()); WorldGen.setBG(1, (int) reader.ReadByte()); WorldGen.setBG(2, (int) reader.ReadByte()); WorldGen.setBG(3, (int) reader.ReadByte()); WorldGen.setBG(4, (int) reader.ReadByte()); WorldGen.setBG(5, (int) reader.ReadByte()); WorldGen.setBG(6, (int) reader.ReadByte()); WorldGen.setBG(7, (int) reader.ReadByte()); Main.cloudBGActive = (float) reader.ReadInt32(); Main.cloudBGAlpha = (double) Main.cloudBGActive < 1.0 ? 0.0f : 1f; Main.cloudBGActive = (float) -WorldGen.genRand.Next(8640, 86400); Main.numClouds = (int) reader.ReadInt16(); Main.windSpeedTarget = reader.ReadSingle(); Main.windSpeedCurrent = Main.windSpeedTarget; if (versionNumber < 95) return; Main.anglerWhoFinishedToday.Clear(); for (int index = reader.ReadInt32(); index > 0; --index) Main.anglerWhoFinishedToday.Add(reader.ReadString()); if (versionNumber < 99) return; NPC.savedAngler = reader.ReadBoolean(); if (versionNumber < 101) return; Main.anglerQuest = reader.ReadInt32(); if (versionNumber < 104) return; NPC.savedStylist = reader.ReadBoolean(); if (versionNumber >= 129) NPC.savedTaxCollector = reader.ReadBoolean(); if (versionNumber >= 201) NPC.savedGolfer = reader.ReadBoolean(); if (versionNumber < 107) { if (Main.invasionType > 0 && Main.invasionSize > 0) Main.FakeLoadInvasionStart(); } else Main.invasionSizeStart = reader.ReadInt32(); WorldFile._tempCultistDelay = versionNumber >= 108 ? reader.ReadInt32() : 86400; if (versionNumber < 109) return; int num1 = (int) reader.ReadInt16(); for (int index = 0; index < num1; ++index) { if (index < 663) NPC.killCount[index] = reader.ReadInt32(); else reader.ReadInt32(); } if (versionNumber < 128) return; Main.fastForwardTime = reader.ReadBoolean(); Main.UpdateTimeRate(); if (versionNumber < 131) return; NPC.downedFishron = reader.ReadBoolean(); NPC.downedMartians = reader.ReadBoolean(); NPC.downedAncientCultist = reader.ReadBoolean(); NPC.downedMoonlord = reader.ReadBoolean(); NPC.downedHalloweenKing = reader.ReadBoolean(); NPC.downedHalloweenTree = reader.ReadBoolean(); NPC.downedChristmasIceQueen = reader.ReadBoolean(); NPC.downedChristmasSantank = reader.ReadBoolean(); NPC.downedChristmasTree = reader.ReadBoolean(); if (versionNumber < 140) return; NPC.downedTowerSolar = reader.ReadBoolean(); NPC.downedTowerVortex = reader.ReadBoolean(); NPC.downedTowerNebula = reader.ReadBoolean(); NPC.downedTowerStardust = reader.ReadBoolean(); NPC.TowerActiveSolar = reader.ReadBoolean(); NPC.TowerActiveVortex = reader.ReadBoolean(); NPC.TowerActiveNebula = reader.ReadBoolean(); NPC.TowerActiveStardust = reader.ReadBoolean(); NPC.LunarApocalypseIsUp = reader.ReadBoolean(); if (NPC.TowerActiveSolar) NPC.ShieldStrengthTowerSolar = NPC.ShieldStrengthTowerMax; if (NPC.TowerActiveVortex) NPC.ShieldStrengthTowerVortex = NPC.ShieldStrengthTowerMax; if (NPC.TowerActiveNebula) NPC.ShieldStrengthTowerNebula = NPC.ShieldStrengthTowerMax; if (NPC.TowerActiveStardust) NPC.ShieldStrengthTowerStardust = NPC.ShieldStrengthTowerMax; if (versionNumber < 170) { WorldFile._tempPartyManual = false; WorldFile._tempPartyGenuine = false; WorldFile._tempPartyCooldown = 0; WorldFile.TempPartyCelebratingNPCs.Clear(); } else { WorldFile._tempPartyManual = reader.ReadBoolean(); WorldFile._tempPartyGenuine = reader.ReadBoolean(); WorldFile._tempPartyCooldown = reader.ReadInt32(); int num2 = reader.ReadInt32(); WorldFile.TempPartyCelebratingNPCs.Clear(); for (int index = 0; index < num2; ++index) WorldFile.TempPartyCelebratingNPCs.Add(reader.ReadInt32()); } if (versionNumber < 174) { WorldFile._tempSandstormHappening = false; WorldFile._tempSandstormTimeLeft = 0; WorldFile._tempSandstormSeverity = 0.0f; WorldFile._tempSandstormIntendedSeverity = 0.0f; } else { WorldFile._tempSandstormHappening = reader.ReadBoolean(); WorldFile._tempSandstormTimeLeft = reader.ReadInt32(); WorldFile._tempSandstormSeverity = reader.ReadSingle(); WorldFile._tempSandstormIntendedSeverity = reader.ReadSingle(); } DD2Event.Load(reader, versionNumber); if (versionNumber > 194) WorldGen.setBG(8, (int) reader.ReadByte()); else WorldGen.setBG(8, 0); if (versionNumber >= 215) WorldGen.setBG(9, (int) reader.ReadByte()); else WorldGen.setBG(9, 0); if (versionNumber > 195) { WorldGen.setBG(10, (int) reader.ReadByte()); WorldGen.setBG(11, (int) reader.ReadByte()); WorldGen.setBG(12, (int) reader.ReadByte()); } else { WorldGen.setBG(10, WorldGen.treeBG1); WorldGen.setBG(11, WorldGen.treeBG1); WorldGen.setBG(12, WorldGen.treeBG1); } if (versionNumber >= 204) NPC.combatBookWasUsed = reader.ReadBoolean(); if (versionNumber < 207) { WorldFile._tempLanternNightCooldown = 0; WorldFile._tempLanternNightGenuine = false; WorldFile._tempLanternNightManual = false; WorldFile._tempLanternNightNextNightIsGenuine = false; } else { WorldFile._tempLanternNightCooldown = reader.ReadInt32(); WorldFile._tempLanternNightGenuine = reader.ReadBoolean(); WorldFile._tempLanternNightManual = reader.ReadBoolean(); WorldFile._tempLanternNightNextNightIsGenuine = reader.ReadBoolean(); } WorldGen.TreeTops.Load(reader, versionNumber); if (versionNumber >= 212) { Main.forceHalloweenForToday = reader.ReadBoolean(); Main.forceXMasForToday = reader.ReadBoolean(); } else { Main.forceHalloweenForToday = false; Main.forceXMasForToday = false; } if (versionNumber >= 216) { WorldGen.SavedOreTiers.Copper = reader.ReadInt32(); WorldGen.SavedOreTiers.Iron = reader.ReadInt32(); WorldGen.SavedOreTiers.Silver = reader.ReadInt32(); WorldGen.SavedOreTiers.Gold = reader.ReadInt32(); } else { WorldGen.SavedOreTiers.Copper = -1; WorldGen.SavedOreTiers.Iron = -1; WorldGen.SavedOreTiers.Silver = -1; WorldGen.SavedOreTiers.Gold = -1; } if (versionNumber >= 217) { NPC.boughtCat = reader.ReadBoolean(); NPC.boughtDog = reader.ReadBoolean(); NPC.boughtBunny = reader.ReadBoolean(); } else { NPC.boughtCat = false; NPC.boughtDog = false; NPC.boughtBunny = false; } if (versionNumber >= 223) { NPC.downedEmpressOfLight = reader.ReadBoolean(); NPC.downedQueenSlime = reader.ReadBoolean(); } else { NPC.downedEmpressOfLight = false; NPC.downedQueenSlime = false; } } private static void LoadWorldTiles(BinaryReader reader, bool[] importance) { for (int index1 = 0; index1 < Main.maxTilesX; ++index1) { float num1 = (float) index1 / (float) Main.maxTilesX; Main.statusText = Lang.gen[51].Value + " " + (object) (int) ((double) num1 * 100.0 + 1.0) + "%"; for (int index2 = 0; index2 < Main.maxTilesY; ++index2) { int index3 = -1; byte num2; byte num3 = num2 = (byte) 0; Tile from = Main.tile[index1, index2]; byte num4 = reader.ReadByte(); if (((int) num4 & 1) == 1) { num3 = reader.ReadByte(); if (((int) num3 & 1) == 1) num2 = reader.ReadByte(); } if (((int) num4 & 2) == 2) { from.active(true); if (((int) num4 & 32) == 32) { byte num5 = reader.ReadByte(); index3 = (int) reader.ReadByte() << 8 | (int) num5; } else index3 = (int) reader.ReadByte(); from.type = (ushort) index3; if (importance[index3]) { from.frameX = reader.ReadInt16(); from.frameY = reader.ReadInt16(); if (from.type == (ushort) 144) from.frameY = (short) 0; } else { from.frameX = (short) -1; from.frameY = (short) -1; } if (((int) num2 & 8) == 8) from.color(reader.ReadByte()); } if (((int) num4 & 4) == 4) { from.wall = (ushort) reader.ReadByte(); if (from.wall >= (ushort) 316) from.wall = (ushort) 0; if (((int) num2 & 16) == 16) from.wallColor(reader.ReadByte()); } byte num6 = (byte) (((int) num4 & 24) >> 3); if (num6 != (byte) 0) { from.liquid = reader.ReadByte(); if (num6 > (byte) 1) { if (num6 == (byte) 2) from.lava(true); else from.honey(true); } } if (num3 > (byte) 1) { if (((int) num3 & 2) == 2) from.wire(true); if (((int) num3 & 4) == 4) from.wire2(true); if (((int) num3 & 8) == 8) from.wire3(true); byte num7 = (byte) (((int) num3 & 112) >> 4); if (num7 != (byte) 0 && (Main.tileSolid[(int) from.type] || TileID.Sets.NonSolidSaveSlopes[(int) from.type])) { if (num7 == (byte) 1) from.halfBrick(true); else from.slope((byte) ((uint) num7 - 1U)); } } if (num2 > (byte) 0) { if (((int) num2 & 2) == 2) from.actuator(true); if (((int) num2 & 4) == 4) from.inActive(true); if (((int) num2 & 32) == 32) from.wire4(true); if (((int) num2 & 64) == 64) { byte num8 = reader.ReadByte(); from.wall = (ushort) ((uint) num8 << 8 | (uint) from.wall); if (from.wall >= (ushort) 316) from.wall = (ushort) 0; } } int num9; switch ((byte) (((int) num4 & 192) >> 6)) { case 0: num9 = 0; break; case 1: num9 = (int) reader.ReadByte(); break; default: num9 = (int) reader.ReadInt16(); break; } if (index3 != -1) { if ((double) index2 <= Main.worldSurface) { if ((double) (index2 + num9) <= Main.worldSurface) { WorldGen.tileCounts[index3] += (num9 + 1) * 5; } else { int num10 = (int) (Main.worldSurface - (double) index2 + 1.0); int num11 = num9 + 1 - num10; WorldGen.tileCounts[index3] += num10 * 5 + num11; } } else WorldGen.tileCounts[index3] += num9 + 1; } for (; num9 > 0; --num9) { ++index2; Main.tile[index1, index2].CopyFrom(from); } } } WorldGen.AddUpAlignmentCounts(true); if (WorldFile._versionNumber >= 105) return; WorldGen.FixHearts(); } private static void LoadChests(BinaryReader reader) { int num1 = (int) reader.ReadInt16(); int num2 = (int) reader.ReadInt16(); int num3; int num4; if (num2 < 40) { num3 = num2; num4 = 0; } else { num3 = 40; num4 = num2 - 40; } int index1; for (index1 = 0; index1 < num1; ++index1) { Chest chest = new Chest(); chest.x = reader.ReadInt32(); chest.y = reader.ReadInt32(); chest.name = reader.ReadString(); for (int index2 = 0; index2 < num3; ++index2) { short num5 = reader.ReadInt16(); Item obj = new Item(); if (num5 > (short) 0) { obj.netDefaults(reader.ReadInt32()); obj.stack = (int) num5; obj.Prefix((int) reader.ReadByte()); } else if (num5 < (short) 0) { obj.netDefaults(reader.ReadInt32()); obj.Prefix((int) reader.ReadByte()); obj.stack = 1; } chest.item[index2] = obj; } for (int index3 = 0; index3 < num4; ++index3) { if (reader.ReadInt16() > (short) 0) { reader.ReadInt32(); int num6 = (int) reader.ReadByte(); } } Main.chest[index1] = chest; } List point16List = new List(); for (int index4 = 0; index4 < index1; ++index4) { if (Main.chest[index4] != null) { Point16 point16 = new Point16(Main.chest[index4].x, Main.chest[index4].y); if (point16List.Contains(point16)) Main.chest[index4] = (Chest) null; else point16List.Add(point16); } } for (; index1 < 8000; ++index1) Main.chest[index1] = (Chest) null; if (WorldFile._versionNumber >= 115) return; WorldFile.FixDresserChests(); } private static void LoadSigns(BinaryReader reader) { short num = reader.ReadInt16(); int index1; for (index1 = 0; index1 < (int) num; ++index1) { string str = reader.ReadString(); int index2 = reader.ReadInt32(); int index3 = reader.ReadInt32(); Tile tile = Main.tile[index2, index3]; Sign sign; if (tile.active() && Main.tileSign[(int) tile.type]) { sign = new Sign(); sign.text = str; sign.x = index2; sign.y = index3; } else sign = (Sign) null; Main.sign[index1] = sign; } List point16List = new List(); for (int index4 = 0; index4 < 1000; ++index4) { if (Main.sign[index4] != null) { Point16 point16 = new Point16(Main.sign[index4].x, Main.sign[index4].y); if (point16List.Contains(point16)) Main.sign[index4] = (Sign) null; else point16List.Add(point16); } } for (; index1 < 1000; ++index1) Main.sign[index1] = (Sign) null; } private static void LoadDummies(BinaryReader reader) { int num = reader.ReadInt32(); for (int index = 0; index < num; ++index) DeprecatedClassLeftInForLoading.dummies[index] = new DeprecatedClassLeftInForLoading((int) reader.ReadInt16(), (int) reader.ReadInt16()); for (int index = num; index < 1000; ++index) DeprecatedClassLeftInForLoading.dummies[index] = (DeprecatedClassLeftInForLoading) null; } private static void LoadNPCs(BinaryReader reader) { int index = 0; for (bool flag = reader.ReadBoolean(); flag; flag = reader.ReadBoolean()) { NPC npc = Main.npc[index]; if (WorldFile._versionNumber >= 190) npc.SetDefaults(reader.ReadInt32()); else npc.SetDefaults(NPCID.FromLegacyName(reader.ReadString())); npc.GivenName = reader.ReadString(); npc.position.X = reader.ReadSingle(); npc.position.Y = reader.ReadSingle(); npc.homeless = reader.ReadBoolean(); npc.homeTileX = reader.ReadInt32(); npc.homeTileY = reader.ReadInt32(); if (WorldFile._versionNumber >= 213 && ((BitsByte) reader.ReadByte())[0]) npc.townNpcVariationIndex = reader.ReadInt32(); ++index; } if (WorldFile._versionNumber < 140) return; for (bool flag = reader.ReadBoolean(); flag; flag = reader.ReadBoolean()) { NPC npc = Main.npc[index]; if (WorldFile._versionNumber >= 190) npc.SetDefaults(reader.ReadInt32()); else npc.SetDefaults(NPCID.FromLegacyName(reader.ReadString())); npc.position = reader.ReadVector2(); ++index; } } private static void ValidateLoadNPCs(BinaryReader fileIO) { for (bool flag = fileIO.ReadBoolean(); flag; flag = fileIO.ReadBoolean()) { fileIO.ReadInt32(); fileIO.ReadString(); double num1 = (double) fileIO.ReadSingle(); double num2 = (double) fileIO.ReadSingle(); fileIO.ReadBoolean(); fileIO.ReadInt32(); fileIO.ReadInt32(); if (((BitsByte) fileIO.ReadByte())[0]) fileIO.ReadInt32(); } for (bool flag = fileIO.ReadBoolean(); flag; flag = fileIO.ReadBoolean()) { fileIO.ReadInt32(); double num3 = (double) fileIO.ReadSingle(); double num4 = (double) fileIO.ReadSingle(); } } private static int LoadFooter(BinaryReader reader) => !reader.ReadBoolean() || reader.ReadString() != Main.worldName || reader.ReadInt32() != Main.worldID ? 6 : 0; private static bool ValidateWorld(BinaryReader fileIO) { new Stopwatch().Start(); try { Stream baseStream = fileIO.BaseStream; int num1 = fileIO.ReadInt32(); if (num1 == 0 || num1 > 230) return false; baseStream.Position = 0L; bool[] importance; int[] positions; if (!WorldFile.LoadFileFormatHeader(fileIO, out importance, out positions)) return false; string str1 = fileIO.ReadString(); if (num1 >= 179) { if (num1 == 179) fileIO.ReadInt32(); else fileIO.ReadString(); long num2 = (long) fileIO.ReadUInt64(); } if (num1 >= 181) fileIO.ReadBytes(16); int num3 = fileIO.ReadInt32(); fileIO.ReadInt32(); fileIO.ReadInt32(); fileIO.ReadInt32(); fileIO.ReadInt32(); int num4 = fileIO.ReadInt32(); int num5 = fileIO.ReadInt32(); baseStream.Position = (long) positions[1]; for (int index1 = 0; index1 < num5; ++index1) { float num6 = (float) index1 / (float) Main.maxTilesX; Main.statusText = Lang.gen[73].Value + " " + (object) (int) ((double) num6 * 100.0 + 1.0) + "%"; int num7; for (int index2 = 0; index2 < num4; index2 = index2 + num7 + 1) { byte num8 = 0; byte num9 = fileIO.ReadByte(); if (((int) num9 & 1) == 1 && ((int) fileIO.ReadByte() & 1) == 1) num8 = fileIO.ReadByte(); if (((int) num9 & 2) == 2) { int index3; if (((int) num9 & 32) == 32) { byte num10 = fileIO.ReadByte(); index3 = (int) fileIO.ReadByte() << 8 | (int) num10; } else index3 = (int) fileIO.ReadByte(); if (importance[index3]) { int num11 = (int) fileIO.ReadInt16(); int num12 = (int) fileIO.ReadInt16(); } if (((int) num8 & 8) == 8) { int num13 = (int) fileIO.ReadByte(); } } if (((int) num9 & 4) == 4) { int num14 = (int) fileIO.ReadByte(); if (((int) num8 & 16) == 16) { int num15 = (int) fileIO.ReadByte(); } } if (((int) num9 & 24) >> 3 != 0) { int num16 = (int) fileIO.ReadByte(); } if (((int) num8 & 64) == 64) { int num17 = (int) fileIO.ReadByte(); } switch ((byte) (((int) num9 & 192) >> 6)) { case 0: num7 = 0; break; case 1: num7 = (int) fileIO.ReadByte(); break; default: num7 = (int) fileIO.ReadInt16(); break; } } } if (baseStream.Position != (long) positions[2]) return false; int num18 = (int) fileIO.ReadInt16(); int num19 = (int) fileIO.ReadInt16(); for (int index4 = 0; index4 < num18; ++index4) { fileIO.ReadInt32(); fileIO.ReadInt32(); fileIO.ReadString(); for (int index5 = 0; index5 < num19; ++index5) { if (fileIO.ReadInt16() > (short) 0) { fileIO.ReadInt32(); int num20 = (int) fileIO.ReadByte(); } } } if (baseStream.Position != (long) positions[3]) return false; int num21 = (int) fileIO.ReadInt16(); for (int index = 0; index < num21; ++index) { fileIO.ReadString(); fileIO.ReadInt32(); fileIO.ReadInt32(); } if (baseStream.Position != (long) positions[4]) return false; WorldFile.ValidateLoadNPCs(fileIO); if (baseStream.Position != (long) positions[5]) return false; if (WorldFile._versionNumber >= 116 && WorldFile._versionNumber <= 121) { int num22 = fileIO.ReadInt32(); for (int index = 0; index < num22; ++index) { int num23 = (int) fileIO.ReadInt16(); int num24 = (int) fileIO.ReadInt16(); } if (baseStream.Position != (long) positions[6]) return false; } if (WorldFile._versionNumber >= 122) { int num25 = fileIO.ReadInt32(); for (int index = 0; index < num25; ++index) TileEntity.Read(fileIO); } if (WorldFile._versionNumber >= 170) { int num26 = fileIO.ReadInt32(); for (int index = 0; index < num26; ++index) fileIO.ReadInt64(); } if (WorldFile._versionNumber >= 189) { int num27 = fileIO.ReadInt32(); fileIO.ReadBytes(12 * num27); } if (WorldFile._versionNumber >= 210) Main.BestiaryTracker.ValidateWorld(fileIO, WorldFile._versionNumber); if (WorldFile._versionNumber >= 220) CreativePowerManager.Instance.ValidateWorld(fileIO, WorldFile._versionNumber); int num28 = fileIO.ReadBoolean() ? 1 : 0; string str2 = fileIO.ReadString(); int num29 = fileIO.ReadInt32(); bool flag = false; if (num28 != 0 && (str2 == str1 || num29 == num3)) flag = true; return flag; } catch (Exception ex) { using (StreamWriter streamWriter = new StreamWriter("client-crashlog.txt", true)) { streamWriter.WriteLine((object) DateTime.Now); streamWriter.WriteLine((object) ex); streamWriter.WriteLine(""); } return false; } } private static FileMetadata GetFileMetadata(string file, bool cloudSave) { if (file == null) return (FileMetadata) null; try { byte[] buffer = (byte[]) null; int num = !cloudSave ? 0 : (SocialAPI.Cloud != null ? 1 : 0); if (num != 0) { int length = 24; buffer = new byte[length]; SocialAPI.Cloud.Read(file, buffer, length); } using (Stream input = num != 0 ? (Stream) new MemoryStream(buffer) : (Stream) new FileStream(file, FileMode.Open)) { using (BinaryReader reader = new BinaryReader(input)) return reader.ReadInt32() >= 135 ? FileMetadata.Read(reader, FileType.World) : FileMetadata.FromCurrentSettings(FileType.World); } } catch { } return (FileMetadata) null; } private static void FixDresserChests() { for (int X = 0; X < Main.maxTilesX; ++X) { for (int Y = 0; Y < Main.maxTilesY; ++Y) { Tile tile = Main.tile[X, Y]; if (tile.active() && tile.type == (ushort) 88 && (int) tile.frameX % 54 == 0 && (int) tile.frameY % 36 == 0) Chest.CreateChest(X, Y); } } } private static int SaveTileEntities(BinaryWriter writer) { lock (TileEntity.ByID) { writer.Write(TileEntity.ByID.Count); foreach (KeyValuePair keyValuePair in TileEntity.ByID) TileEntity.Write(writer, keyValuePair.Value); } return (int) writer.BaseStream.Position; } private static void LoadTileEntities(BinaryReader reader) { TileEntity.ByID.Clear(); TileEntity.ByPosition.Clear(); int num1 = reader.ReadInt32(); int num2 = 0; for (int index = 0; index < num1; ++index) { TileEntity tileEntity1 = TileEntity.Read(reader); tileEntity1.ID = num2++; TileEntity.ByID[tileEntity1.ID] = tileEntity1; TileEntity tileEntity2; if (TileEntity.ByPosition.TryGetValue(tileEntity1.Position, out tileEntity2)) TileEntity.ByID.Remove(tileEntity2.ID); TileEntity.ByPosition[tileEntity1.Position] = tileEntity1; } TileEntity.TileEntitiesNextID = num1; List point16List = new List(); foreach (KeyValuePair keyValuePair in TileEntity.ByPosition) { if (!WorldGen.InWorld((int) keyValuePair.Value.Position.X, (int) keyValuePair.Value.Position.Y, 1)) point16List.Add(keyValuePair.Value.Position); else if (!TileEntity.manager.CheckValidTile((int) keyValuePair.Value.type, (int) keyValuePair.Value.Position.X, (int) keyValuePair.Value.Position.Y)) point16List.Add(keyValuePair.Value.Position); } try { foreach (Point16 key in point16List) { TileEntity tileEntity = TileEntity.ByPosition[key]; if (TileEntity.ByID.ContainsKey(tileEntity.ID)) TileEntity.ByID.Remove(tileEntity.ID); if (TileEntity.ByPosition.ContainsKey(key)) TileEntity.ByPosition.Remove(key); } } catch { } } private static int SaveWeightedPressurePlates(BinaryWriter writer) { lock (PressurePlateHelper.PressurePlatesPressed) { writer.Write(PressurePlateHelper.PressurePlatesPressed.Count); foreach (KeyValuePair keyValuePair in PressurePlateHelper.PressurePlatesPressed) { writer.Write(keyValuePair.Key.X); writer.Write(keyValuePair.Key.Y); } } return (int) writer.BaseStream.Position; } private static void LoadWeightedPressurePlates(BinaryReader reader) { PressurePlateHelper.Reset(); PressurePlateHelper.NeedsFirstUpdate = true; int num = reader.ReadInt32(); for (int index = 0; index < num; ++index) { Point key = new Point(reader.ReadInt32(), reader.ReadInt32()); PressurePlateHelper.PressurePlatesPressed.Add(key, new bool[(int) byte.MaxValue]); } } private static int SaveTownManager(BinaryWriter writer) { WorldGen.TownManager.Save(writer); return (int) writer.BaseStream.Position; } private static void LoadTownManager(BinaryReader reader) => WorldGen.TownManager.Load(reader); private static int SaveBestiary(BinaryWriter writer) { Main.BestiaryTracker.Save(writer); return (int) writer.BaseStream.Position; } private static void LoadBestiary(BinaryReader reader, int loadVersionNumber) => Main.BestiaryTracker.Load(reader, loadVersionNumber); private static void LoadBestiaryForVersionsBefore210() => Main.BestiaryTracker.FillBasedOnVersionBefore210(); private static int SaveCreativePowers(BinaryWriter writer) { CreativePowerManager.Instance.SaveToWorld(writer); return (int) writer.BaseStream.Position; } private static void LoadCreativePowers(BinaryReader reader, int loadVersionNumber) => CreativePowerManager.Instance.LoadFromWorld(reader, loadVersionNumber); private static int LoadWorld_Version1_Old_BeforeRelease88(BinaryReader fileIO) { Main.WorldFileMetadata = FileMetadata.FromCurrentSettings(FileType.World); int versionNumber = WorldFile._versionNumber; if (versionNumber > 230) return 1; Main.worldName = fileIO.ReadString(); Main.worldID = fileIO.ReadInt32(); Main.leftWorld = (float) fileIO.ReadInt32(); Main.rightWorld = (float) fileIO.ReadInt32(); Main.topWorld = (float) fileIO.ReadInt32(); Main.bottomWorld = (float) fileIO.ReadInt32(); Main.maxTilesY = fileIO.ReadInt32(); Main.maxTilesX = fileIO.ReadInt32(); Main.GameMode = versionNumber < 112 ? 0 : (fileIO.ReadBoolean() ? 1 : 0); if (versionNumber >= 63) Main.moonType = (int) fileIO.ReadByte(); else WorldGen.RandomizeMoonState(); WorldGen.clearWorld(); if (versionNumber >= 44) { Main.treeX[0] = fileIO.ReadInt32(); Main.treeX[1] = fileIO.ReadInt32(); Main.treeX[2] = fileIO.ReadInt32(); Main.treeStyle[0] = fileIO.ReadInt32(); Main.treeStyle[1] = fileIO.ReadInt32(); Main.treeStyle[2] = fileIO.ReadInt32(); Main.treeStyle[3] = fileIO.ReadInt32(); } if (versionNumber >= 60) { Main.caveBackX[0] = fileIO.ReadInt32(); Main.caveBackX[1] = fileIO.ReadInt32(); Main.caveBackX[2] = fileIO.ReadInt32(); Main.caveBackStyle[0] = fileIO.ReadInt32(); Main.caveBackStyle[1] = fileIO.ReadInt32(); Main.caveBackStyle[2] = fileIO.ReadInt32(); Main.caveBackStyle[3] = fileIO.ReadInt32(); Main.iceBackStyle = fileIO.ReadInt32(); if (versionNumber >= 61) { Main.jungleBackStyle = fileIO.ReadInt32(); Main.hellBackStyle = fileIO.ReadInt32(); } } else WorldGen.RandomizeCaveBackgrounds(); Main.spawnTileX = fileIO.ReadInt32(); Main.spawnTileY = fileIO.ReadInt32(); Main.worldSurface = fileIO.ReadDouble(); Main.rockLayer = fileIO.ReadDouble(); WorldFile._tempTime = fileIO.ReadDouble(); WorldFile._tempDayTime = fileIO.ReadBoolean(); WorldFile._tempMoonPhase = fileIO.ReadInt32(); WorldFile._tempBloodMoon = fileIO.ReadBoolean(); if (versionNumber >= 70) { WorldFile._tempEclipse = fileIO.ReadBoolean(); Main.eclipse = WorldFile._tempEclipse; } Main.dungeonX = fileIO.ReadInt32(); Main.dungeonY = fileIO.ReadInt32(); WorldGen.crimson = versionNumber >= 56 && fileIO.ReadBoolean(); NPC.downedBoss1 = fileIO.ReadBoolean(); NPC.downedBoss2 = fileIO.ReadBoolean(); NPC.downedBoss3 = fileIO.ReadBoolean(); if (versionNumber >= 66) NPC.downedQueenBee = fileIO.ReadBoolean(); if (versionNumber >= 44) { NPC.downedMechBoss1 = fileIO.ReadBoolean(); NPC.downedMechBoss2 = fileIO.ReadBoolean(); NPC.downedMechBoss3 = fileIO.ReadBoolean(); NPC.downedMechBossAny = fileIO.ReadBoolean(); } if (versionNumber >= 64) { NPC.downedPlantBoss = fileIO.ReadBoolean(); NPC.downedGolemBoss = fileIO.ReadBoolean(); } if (versionNumber >= 29) { NPC.savedGoblin = fileIO.ReadBoolean(); NPC.savedWizard = fileIO.ReadBoolean(); if (versionNumber >= 34) { NPC.savedMech = fileIO.ReadBoolean(); if (versionNumber >= 80) NPC.savedStylist = fileIO.ReadBoolean(); } if (versionNumber >= 129) NPC.savedTaxCollector = fileIO.ReadBoolean(); if (versionNumber >= 201) NPC.savedGolfer = fileIO.ReadBoolean(); NPC.downedGoblins = fileIO.ReadBoolean(); } if (versionNumber >= 32) NPC.downedClown = fileIO.ReadBoolean(); if (versionNumber >= 37) NPC.downedFrost = fileIO.ReadBoolean(); if (versionNumber >= 56) NPC.downedPirates = fileIO.ReadBoolean(); WorldGen.shadowOrbSmashed = fileIO.ReadBoolean(); WorldGen.spawnMeteor = fileIO.ReadBoolean(); WorldGen.shadowOrbCount = (int) fileIO.ReadByte(); if (versionNumber >= 23) { WorldGen.altarCount = fileIO.ReadInt32(); Main.hardMode = fileIO.ReadBoolean(); } Main.invasionDelay = fileIO.ReadInt32(); Main.invasionSize = fileIO.ReadInt32(); Main.invasionType = fileIO.ReadInt32(); Main.invasionX = fileIO.ReadDouble(); if (versionNumber >= 113) Main.sundialCooldown = (int) fileIO.ReadByte(); if (versionNumber >= 53) { WorldFile._tempRaining = fileIO.ReadBoolean(); WorldFile._tempRainTime = fileIO.ReadInt32(); WorldFile._tempMaxRain = fileIO.ReadSingle(); } if (versionNumber >= 54) { WorldGen.SavedOreTiers.Cobalt = fileIO.ReadInt32(); WorldGen.SavedOreTiers.Mythril = fileIO.ReadInt32(); WorldGen.SavedOreTiers.Adamantite = fileIO.ReadInt32(); } else if (versionNumber >= 23 && WorldGen.altarCount == 0) { WorldGen.SavedOreTiers.Cobalt = -1; WorldGen.SavedOreTiers.Mythril = -1; WorldGen.SavedOreTiers.Adamantite = -1; } else { WorldGen.SavedOreTiers.Cobalt = 107; WorldGen.SavedOreTiers.Mythril = 108; WorldGen.SavedOreTiers.Adamantite = 111; } int style1 = 0; int style2 = 0; int style3 = 0; int style4 = 0; int style5 = 0; int style6 = 0; int style7 = 0; int style8 = 0; int style9 = 0; int style10 = 0; if (versionNumber >= 55) { style1 = (int) fileIO.ReadByte(); style2 = (int) fileIO.ReadByte(); style3 = (int) fileIO.ReadByte(); } if (versionNumber >= 60) { style4 = (int) fileIO.ReadByte(); style5 = (int) fileIO.ReadByte(); style6 = (int) fileIO.ReadByte(); style7 = (int) fileIO.ReadByte(); style8 = (int) fileIO.ReadByte(); } WorldGen.setBG(0, style1); WorldGen.setBG(1, style2); WorldGen.setBG(2, style3); WorldGen.setBG(3, style4); WorldGen.setBG(4, style5); WorldGen.setBG(5, style6); WorldGen.setBG(6, style7); WorldGen.setBG(7, style8); WorldGen.setBG(8, style9); WorldGen.setBG(9, style10); WorldGen.setBG(10, style1); WorldGen.setBG(11, style1); WorldGen.setBG(12, style1); if (versionNumber >= 60) { Main.cloudBGActive = (float) fileIO.ReadInt32(); Main.cloudBGAlpha = (double) Main.cloudBGActive < 1.0 ? 0.0f : 1f; } else Main.cloudBGActive = (float) -WorldGen.genRand.Next(8640, 86400); if (versionNumber >= 62) { Main.numClouds = (int) fileIO.ReadInt16(); Main.windSpeedTarget = fileIO.ReadSingle(); Main.windSpeedCurrent = Main.windSpeedTarget; } else WorldGen.RandomizeWeather(); for (int index1 = 0; index1 < Main.maxTilesX; ++index1) { float num1 = (float) index1 / (float) Main.maxTilesX; Main.statusText = Lang.gen[51].Value + " " + (object) (int) ((double) num1 * 100.0 + 1.0) + "%"; for (int index2 = 0; index2 < Main.maxTilesY; ++index2) { Tile tile = Main.tile[index1, index2]; int index3 = -1; tile.active(fileIO.ReadBoolean()); if (tile.active()) { index3 = versionNumber <= 77 ? (int) fileIO.ReadByte() : (int) fileIO.ReadUInt16(); tile.type = (ushort) index3; if (tile.type == (ushort) sbyte.MaxValue || tile.type == (ushort) 504) tile.active(false); if (versionNumber < 72 && (tile.type == (ushort) 35 || tile.type == (ushort) 36 || tile.type == (ushort) 170 || tile.type == (ushort) 171 || tile.type == (ushort) 172)) { tile.frameX = fileIO.ReadInt16(); tile.frameY = fileIO.ReadInt16(); } else if (Main.tileFrameImportant[index3]) { if (versionNumber < 28 && index3 == 4) { tile.frameX = (short) 0; tile.frameY = (short) 0; } else if (versionNumber < 40 && tile.type == (ushort) 19) { tile.frameX = (short) 0; tile.frameY = (short) 0; } else if (versionNumber < 195 && tile.type == (ushort) 49) { tile.frameX = (short) 0; tile.frameY = (short) 0; } else { tile.frameX = fileIO.ReadInt16(); tile.frameY = fileIO.ReadInt16(); if (tile.type == (ushort) 144) tile.frameY = (short) 0; } } else { tile.frameX = (short) -1; tile.frameY = (short) -1; } if (versionNumber >= 48 && fileIO.ReadBoolean()) tile.color(fileIO.ReadByte()); } if (versionNumber <= 25) fileIO.ReadBoolean(); if (fileIO.ReadBoolean()) { tile.wall = (ushort) fileIO.ReadByte(); if (tile.wall >= (ushort) 316) tile.wall = (ushort) 0; if (versionNumber >= 48 && fileIO.ReadBoolean()) tile.wallColor(fileIO.ReadByte()); } if (fileIO.ReadBoolean()) { tile.liquid = fileIO.ReadByte(); tile.lava(fileIO.ReadBoolean()); if (versionNumber >= 51) tile.honey(fileIO.ReadBoolean()); } if (versionNumber >= 33) tile.wire(fileIO.ReadBoolean()); if (versionNumber >= 43) { tile.wire2(fileIO.ReadBoolean()); tile.wire3(fileIO.ReadBoolean()); } if (versionNumber >= 41) { tile.halfBrick(fileIO.ReadBoolean()); if (!Main.tileSolid[(int) tile.type] && !TileID.Sets.NonSolidSaveSlopes[(int) tile.type]) tile.halfBrick(false); if (versionNumber >= 49) { tile.slope(fileIO.ReadByte()); if (!Main.tileSolid[(int) tile.type] && !TileID.Sets.NonSolidSaveSlopes[(int) tile.type]) tile.slope((byte) 0); } } if (versionNumber >= 42) { tile.actuator(fileIO.ReadBoolean()); tile.inActive(fileIO.ReadBoolean()); } int num2 = 0; if (versionNumber >= 25) num2 = (int) fileIO.ReadInt16(); if (index3 != -1) { if ((double) index2 <= Main.worldSurface) { if ((double) (index2 + num2) <= Main.worldSurface) { WorldGen.tileCounts[index3] += (num2 + 1) * 5; } else { int num3 = (int) (Main.worldSurface - (double) index2 + 1.0); int num4 = num2 + 1 - num3; WorldGen.tileCounts[index3] += num3 * 5 + num4; } } else WorldGen.tileCounts[index3] += num2 + 1; } if (num2 > 0) { for (int index4 = index2 + 1; index4 < index2 + num2 + 1; ++index4) Main.tile[index1, index4].CopyFrom(Main.tile[index1, index2]); index2 += num2; } } } WorldGen.AddUpAlignmentCounts(true); if (versionNumber < 67) WorldGen.FixSunflowers(); if (versionNumber < 72) WorldGen.FixChands(); int num5 = 40; if (versionNumber < 58) num5 = 20; int num6 = 1000; for (int index5 = 0; index5 < num6; ++index5) { if (fileIO.ReadBoolean()) { Main.chest[index5] = new Chest(); Main.chest[index5].x = fileIO.ReadInt32(); Main.chest[index5].y = fileIO.ReadInt32(); if (versionNumber >= 85) { string str = fileIO.ReadString(); if (str.Length > 20) str = str.Substring(0, 20); Main.chest[index5].name = str; } for (int index6 = 0; index6 < 40; ++index6) { Main.chest[index5].item[index6] = new Item(); if (index6 < num5) { int num7 = versionNumber < 59 ? (int) fileIO.ReadByte() : (int) fileIO.ReadInt16(); if (num7 > 0) { if (versionNumber >= 38) { Main.chest[index5].item[index6].netDefaults(fileIO.ReadInt32()); } else { short num8 = ItemID.FromLegacyName(fileIO.ReadString(), versionNumber); Main.chest[index5].item[index6].SetDefaults((int) num8); } Main.chest[index5].item[index6].stack = num7; if (versionNumber >= 36) Main.chest[index5].item[index6].Prefix((int) fileIO.ReadByte()); } } } } } for (int index7 = 0; index7 < 1000; ++index7) { if (fileIO.ReadBoolean()) { string str = fileIO.ReadString(); int index8 = fileIO.ReadInt32(); int index9 = fileIO.ReadInt32(); if (Main.tile[index8, index9].active() && (Main.tile[index8, index9].type == (ushort) 55 || Main.tile[index8, index9].type == (ushort) 85)) { Main.sign[index7] = new Sign(); Main.sign[index7].x = index8; Main.sign[index7].y = index9; Main.sign[index7].text = str; } } } bool flag = fileIO.ReadBoolean(); int index = 0; while (flag) { if (versionNumber >= 190) Main.npc[index].SetDefaults(fileIO.ReadInt32()); else Main.npc[index].SetDefaults(NPCID.FromLegacyName(fileIO.ReadString())); if (versionNumber >= 83) Main.npc[index].GivenName = fileIO.ReadString(); Main.npc[index].position.X = fileIO.ReadSingle(); Main.npc[index].position.Y = fileIO.ReadSingle(); Main.npc[index].homeless = fileIO.ReadBoolean(); Main.npc[index].homeTileX = fileIO.ReadInt32(); Main.npc[index].homeTileY = fileIO.ReadInt32(); flag = fileIO.ReadBoolean(); ++index; } if (versionNumber >= 31 && versionNumber <= 83) { NPC.setNPCName(fileIO.ReadString(), 17, true); NPC.setNPCName(fileIO.ReadString(), 18, true); NPC.setNPCName(fileIO.ReadString(), 19, true); NPC.setNPCName(fileIO.ReadString(), 20, true); NPC.setNPCName(fileIO.ReadString(), 22, true); NPC.setNPCName(fileIO.ReadString(), 54, true); NPC.setNPCName(fileIO.ReadString(), 38, true); NPC.setNPCName(fileIO.ReadString(), 107, true); NPC.setNPCName(fileIO.ReadString(), 108, true); if (versionNumber >= 35) { NPC.setNPCName(fileIO.ReadString(), 124, true); if (versionNumber >= 65) { NPC.setNPCName(fileIO.ReadString(), 160, true); NPC.setNPCName(fileIO.ReadString(), 178, true); NPC.setNPCName(fileIO.ReadString(), 207, true); NPC.setNPCName(fileIO.ReadString(), 208, true); NPC.setNPCName(fileIO.ReadString(), 209, true); NPC.setNPCName(fileIO.ReadString(), 227, true); NPC.setNPCName(fileIO.ReadString(), 228, true); NPC.setNPCName(fileIO.ReadString(), 229, true); if (versionNumber >= 79) NPC.setNPCName(fileIO.ReadString(), 353, true); } } } if (Main.invasionType > 0 && Main.invasionSize > 0) Main.FakeLoadInvasionStart(); if (versionNumber < 7) return 0; int num9 = fileIO.ReadBoolean() ? 1 : 0; string str1 = fileIO.ReadString(); int num10 = fileIO.ReadInt32(); return num9 != 0 && (str1 == Main.worldName || num10 == Main.worldID) ? 0 : 2; } } }