Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ InternalSaveMap()

static void Terraria.Map.MapHelper.InternalSaveMap ( )
inlinestaticprivate

Definition at line 2910 of file MapHelper.cs.

2911 {
2912 //IL_00ac: Unknown result type (might be due to invalid IL or missing references)
2913 //IL_00b3: Expected O, but got Unknown
2914 bool isCloudSave = Main.ActivePlayerFileData.IsCloudSave;
2915 string text = Main.playerPathName.Substring(0, Main.playerPathName.Length - 4);
2916 if (!isCloudSave)
2917 {
2918 Utils.TryCreatingDirectory(text);
2919 }
2921 text = ((!Main.ActiveWorldFileData.UseGuidAsMapName) ? (text + Main.worldID + ".map") : string.Concat(text, Main.ActiveWorldFileData.UniqueId, ".map"));
2922 new Stopwatch().Start();
2923 if (!Main.gameMenu)
2924 {
2925 noStatusText = true;
2926 }
2927 using (MemoryStream memoryStream = new MemoryStream(4000))
2928 {
2929 using BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
2930 DeflateStream val = new DeflateStream((Stream)memoryStream, (CompressionMode)0);
2931 try
2932 {
2933 int num = 0;
2934 byte[] array = new byte[16384];
2935 binaryWriter.Write(279);
2936 Main.MapFileMetadata.IncrementAndWrite(binaryWriter);
2937 binaryWriter.Write(Main.worldName);
2938 binaryWriter.Write(Main.worldID);
2939 binaryWriter.Write(Main.maxTilesY);
2940 binaryWriter.Write(Main.maxTilesX);
2941 binaryWriter.Write((short)TileID.Count);
2942 binaryWriter.Write((short)WallID.Count);
2943 binaryWriter.Write((short)4);
2944 binaryWriter.Write((short)256);
2945 binaryWriter.Write((short)256);
2946 binaryWriter.Write((short)256);
2947 byte b = 1;
2948 byte b2 = 0;
2949 int i;
2950 for (i = 0; i < TileID.Count; i++)
2951 {
2952 if (tileOptionCounts[i] != 1)
2953 {
2954 b2 |= b;
2955 }
2956 if (b == 128)
2957 {
2958 binaryWriter.Write(b2);
2959 b2 = 0;
2960 b = 1;
2961 }
2962 else
2963 {
2964 b <<= 1;
2965 }
2966 }
2967 if (b != 1)
2968 {
2969 binaryWriter.Write(b2);
2970 }
2971 i = 0;
2972 b = 1;
2973 b2 = 0;
2974 for (; i < WallID.Count; i++)
2975 {
2976 if (wallOptionCounts[i] != 1)
2977 {
2978 b2 |= b;
2979 }
2980 if (b == 128)
2981 {
2982 binaryWriter.Write(b2);
2983 b2 = 0;
2984 b = 1;
2985 }
2986 else
2987 {
2988 b <<= 1;
2989 }
2990 }
2991 if (b != 1)
2992 {
2993 binaryWriter.Write(b2);
2994 }
2995 for (i = 0; i < TileID.Count; i++)
2996 {
2997 if (tileOptionCounts[i] != 1)
2998 {
2999 binaryWriter.Write((byte)tileOptionCounts[i]);
3000 }
3001 }
3002 for (i = 0; i < WallID.Count; i++)
3003 {
3004 if (wallOptionCounts[i] != 1)
3005 {
3006 binaryWriter.Write((byte)wallOptionCounts[i]);
3007 }
3008 }
3009 binaryWriter.Flush();
3010 for (int j = 0; j < Main.maxTilesY; j++)
3011 {
3012 if (!noStatusText)
3013 {
3014 float num2 = (float)j / (float)Main.maxTilesY;
3015 Main.statusText = Lang.gen[66].Value + " " + (int)(num2 * 100f + 1f) + "%";
3016 }
3017 int num3;
3018 for (num3 = 0; num3 < Main.maxTilesX; num3++)
3019 {
3020 MapTile mapTile = Main.Map[num3, j];
3021 byte b4;
3022 byte b3;
3023 byte b5 = (b4 = (b3 = 0));
3024 int num4 = 0;
3025 bool flag = true;
3026 bool flag2 = true;
3027 int num5 = 0;
3028 int num6 = 0;
3029 byte b6 = 0;
3030 int num7;
3031 ushort num8;
3032 if (mapTile.Light <= 18)
3033 {
3034 flag2 = false;
3035 flag = false;
3036 num7 = 0;
3037 num8 = 0;
3038 num4 = 0;
3039 int num9 = num3 + 1;
3040 int num10 = Main.maxTilesX - num3 - 1;
3041 while (num10 > 0 && Main.Map[num9, j].Light <= 18)
3042 {
3043 num4++;
3044 num10--;
3045 num9++;
3046 }
3047 }
3048 else
3049 {
3050 b6 = mapTile.Color;
3051 num8 = mapTile.Type;
3052 if (num8 < wallPosition)
3053 {
3054 num7 = 1;
3055 num8 -= tilePosition;
3056 }
3057 else if (num8 < liquidPosition)
3058 {
3059 num7 = 2;
3060 num8 -= wallPosition;
3061 }
3062 else if (num8 < skyPosition)
3063 {
3064 int num11 = num8 - liquidPosition;
3065 if (num11 == 3)
3066 {
3067 b4 = (byte)(b4 | 0x40u);
3068 num11 = 0;
3069 }
3070 num7 = 3 + num11;
3071 flag = false;
3072 }
3073 else if (num8 < dirtPosition)
3074 {
3075 num7 = 6;
3076 flag2 = false;
3077 flag = false;
3078 }
3079 else if (num8 < hellPosition)
3080 {
3081 num7 = 7;
3082 num8 = ((num8 >= rockPosition) ? ((ushort)(num8 - rockPosition)) : ((ushort)(num8 - dirtPosition)));
3083 }
3084 else
3085 {
3086 num7 = 6;
3087 flag = false;
3088 }
3089 if (mapTile.Light == byte.MaxValue)
3090 {
3091 flag2 = false;
3092 }
3093 if (flag2)
3094 {
3095 num4 = 0;
3096 int num9 = num3 + 1;
3097 int num10 = Main.maxTilesX - num3 - 1;
3098 num5 = num9;
3099 while (num10 > 0)
3100 {
3101 MapTile other = Main.Map[num9, j];
3102 if (mapTile.EqualsWithoutLight(ref other))
3103 {
3104 num10--;
3105 num4++;
3106 num9++;
3107 continue;
3108 }
3109 num6 = num9;
3110 break;
3111 }
3112 }
3113 else
3114 {
3115 num4 = 0;
3116 int num9 = num3 + 1;
3117 int num10 = Main.maxTilesX - num3 - 1;
3118 while (num10 > 0)
3119 {
3120 MapTile other2 = Main.Map[num9, j];
3121 if (!mapTile.Equals(ref other2))
3122 {
3123 break;
3124 }
3125 num10--;
3126 num4++;
3127 num9++;
3128 }
3129 }
3130 }
3131 if (b6 > 0)
3132 {
3133 b4 |= (byte)(b6 << 1);
3134 }
3135 if (b3 != 0)
3136 {
3137 b4 = (byte)(b4 | 1u);
3138 }
3139 if (b4 != 0)
3140 {
3141 b5 = (byte)(b5 | 1u);
3142 }
3143 b5 |= (byte)(num7 << 1);
3144 if (flag && num8 > 255)
3145 {
3146 b5 = (byte)(b5 | 0x10u);
3147 }
3148 if (flag2)
3149 {
3150 b5 = (byte)(b5 | 0x20u);
3151 }
3152 if (num4 > 0)
3153 {
3154 b5 = ((num4 <= 255) ? ((byte)(b5 | 0x40u)) : ((byte)(b5 | 0x80u)));
3155 }
3156 array[num] = b5;
3157 num++;
3158 if (b4 != 0)
3159 {
3160 array[num] = b4;
3161 num++;
3162 }
3163 if (b3 != 0)
3164 {
3165 array[num] = b3;
3166 num++;
3167 }
3168 if (flag)
3169 {
3170 array[num] = (byte)num8;
3171 num++;
3172 if (num8 > 255)
3173 {
3174 array[num] = (byte)(num8 >> 8);
3175 num++;
3176 }
3177 }
3178 if (flag2)
3179 {
3180 array[num] = mapTile.Light;
3181 num++;
3182 }
3183 if (num4 > 0)
3184 {
3185 array[num] = (byte)num4;
3186 num++;
3187 if (num4 > 255)
3188 {
3189 array[num] = (byte)(num4 >> 8);
3190 num++;
3191 }
3192 }
3193 for (int k = num5; k < num6; k++)
3194 {
3195 array[num] = Main.Map[k, j].Light;
3196 num++;
3197 }
3198 num3 += num4;
3199 if (num >= 4096)
3200 {
3201 ((Stream)(object)val).Write(array, 0, num);
3202 num = 0;
3203 }
3204 }
3205 }
3206 if (num > 0)
3207 {
3208 ((Stream)(object)val).Write(array, 0, num);
3209 }
3210 ((Stream)(object)val).Dispose();
3211 FileUtilities.WriteAllBytes(text, memoryStream.ToArray(), isCloudSave);
3212 }
3213 finally
3214 {
3215 ((IDisposable)val)?.Dispose();
3216 }
3217 }
3218 noStatusText = false;
3219 }
static readonly char DirectorySeparatorChar
Definition Path.cs:71
static readonly ushort Count
Definition TileID.cs:1698
static readonly ushort Count
Definition WallID.cs:753
static ushort rockPosition
Definition MapHelper.cs:194
static ushort dirtPosition
Definition MapHelper.cs:192
static ushort tilePosition
Definition MapHelper.cs:184
static bool noStatusText
Definition MapHelper.cs:206
static ushort wallPosition
Definition MapHelper.cs:186
static int[] tileOptionCounts
Definition MapHelper.cs:176
static ushort hellPosition
Definition MapHelper.cs:196
static ushort skyPosition
Definition MapHelper.cs:190
static ushort liquidPosition
Definition MapHelper.cs:188
static int[] wallOptionCounts
Definition MapHelper.cs:178
static void WriteAllBytes(string path, byte[] data, bool cloud)

References Terraria.Main.ActivePlayerFileData, Terraria.Main.ActiveWorldFileData, System.array, Terraria.Map.MapTile.Color, Terraria.ID.TileID.Count, Terraria.ID.WallID.Count, System.IO.Path.DirectorySeparatorChar, Terraria.Map.MapHelper.dirtPosition, Terraria.Map.MapTile.Equals(), Terraria.Map.MapTile.EqualsWithoutLight(), Terraria.Main.gameMenu, Terraria.Lang.gen, Terraria.Map.MapHelper.hellPosition, Terraria.Map.MapTile.Light, Terraria.Map.MapHelper.liquidPosition, Terraria.Main.Map, Terraria.Main.MapFileMetadata, Terraria.Main.maxTilesX, Terraria.Main.maxTilesY, Terraria.Map.MapHelper.noStatusText, System.other, Terraria.Main.playerPathName, Terraria.Map.MapHelper.rockPosition, Terraria.Map.MapHelper.skyPosition, System.Diagnostics.Stopwatch.Start(), System.text, Terraria.Map.MapHelper.tileOptionCounts, Terraria.Map.MapHelper.tilePosition, Terraria.Utils.TryCreatingDirectory(), Terraria.Map.MapTile.Type, Terraria.Map.MapHelper.wallOptionCounts, Terraria.Map.MapHelper.wallPosition, Terraria.Main.worldID, Terraria.Main.worldName, System.IO.Write, and Terraria.Utilities.FileUtilities.WriteAllBytes().

Referenced by Terraria.Map.MapHelper.SaveMap().