Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
TerrainContentsGenerator21.cs
浏览该文件的文档.
1using System.Diagnostics;
2using Engine;
3
4namespace Game {
6 public class Random {
7 public static int m_counter = (int)Stopwatch.GetTimestamp();
8
9 public ulong m_seed;
10
11 public const ulong m_multiplier = 25214903917uL;
12
13 public const ulong m_addend = 11uL;
14
15 public const ulong m_mask = 281474976710655uL;
16
17 public static readonly Random GlobalRandom = new(0);
18
19 public Random() : this(997 * m_counter++) { }
20
21 public Random(int seed) {
22 Reset(seed);
23 }
24
25 public void Reset(int seed) {
26 m_seed = (ulong)(seed ^ 0x5DEECE66D);
27 }
28
29 public int Sign() => Int() % 2 != 0 ? 1 : -1;
30
31 public bool Bool() => Int() % 2 == 0;
32
33 public bool Bool(float probability) => Int() / 2.147484E+09f < probability;
34
35 public int Int() {
36 m_seed = (m_seed * 25214903917L + 11) & 0xFFFFFFFFFFFF;
37 return (int)(m_seed >> 17);
38 }
39
40 public int UniformInt(int min, int max) => (int)(min + Int() * (long)(max - min + 1) / 2147483648L);
41
42 public float UniformFloat(float min, float max) {
43 float num = Int() / 2.147484E+09f;
44 return min + num * (max - min);
45 }
46
47 public float NormalFloat(float mean, float stddev) {
48 float num = UniformFloat(0f, 1f);
49 if (num < 0.5) {
50 float num2 = MathF.Sqrt(-2f * MathF.Log(num));
51 float num3 = 0.322232425f + num2 * (1f + num2 * (0.3422421f + num2 * (0.0204231218f + num2 * 4.536422E-05f)));
52 float num4 = 0.09934846f + num2 * (0.588581562f + num2 * (0.5311035f + num2 * (0.103537753f + num2 * 0.00385607f)));
53 return mean + stddev * (num3 / num4 - num2);
54 }
55 float num5 = MathF.Sqrt(-2f * MathF.Log(1f - num));
56 float num6 = 0.322232425f + num5 * (1f + num5 * (0.3422421f + num5 * (0.0204231218f + num5 * 4.536422E-05f)));
57 float num7 = 0.09934846f + num5 * (0.588581562f + num5 * (0.5311035f + num5 * (0.103537753f + num5 * 0.00385607f)));
58 return mean - stddev * (num6 / num7 - num5);
59 }
60
61 public Vector2 Vector2(float length, bool circular = false) {
62 Vector2 v;
63 float num;
64 do {
65 v = new Vector2(UniformFloat(-1f, 1f), UniformFloat(-1f, 1f));
66 num = v.LengthSquared();
67 }
68 while (circular && num > 1f);
69 return v * (length / MathF.Sqrt(num));
70 }
71
72 public Vector2 UniformVector2(float minLength, float maxLength, bool circular = false) {
73 Vector2 v;
74 float num;
75 do {
76 v = new Vector2(UniformFloat(-1f, 1f), UniformFloat(-1f, 1f));
77 num = v.LengthSquared();
78 }
79 while (circular && num > 1f);
80 return v * (UniformFloat(minLength, maxLength) / MathF.Sqrt(num));
81 }
82
83 public Vector3 Vector3(float length, bool spherical = false) {
84 Vector3 v;
85 float num;
86 do {
87 v = new Vector3(UniformFloat(-1f, 1f), UniformFloat(-1f, 1f), UniformFloat(-1f, 1f));
88 num = v.LengthSquared();
89 }
90 while (spherical && num > 1f);
91 return v * (length / MathF.Sqrt(num));
92 }
93
94 public Vector3 UniformVector3(float minLength, float maxLength, bool spherical = false) {
95 Vector3 v;
96 float num;
97 do {
98 v = new Vector3(UniformFloat(-1f, 1f), UniformFloat(-1f, 1f), UniformFloat(-1f, 1f));
99 num = v.LengthSquared();
100 }
101 while (spherical && num > 1f);
102 return v * (UniformFloat(minLength, maxLength) / MathF.Sqrt(num));
103 }
104 }
105
106 public class OldRandom {
107 public class InternalRandom {
108 public int m_inext;
109
110 public int m_inextp;
111
112 public int[] m_seedArray;
113
114 public InternalRandom(int seed) {
115 m_seedArray = new int[56];
116 int num = seed == -2147483648 ? 2147483647 : Math.Abs(seed);
117 int num2 = 161803398 - num;
118 m_seedArray[55] = num2;
119 int num3 = 1;
120 for (int i = 1; i < 55; i++) {
121 int num4 = 21 * i % 55;
122 m_seedArray[num4] = num3;
123 num3 = num2 - num3;
124 if (num3 < 0) {
125 num3 += 2147483647;
126 }
127 num2 = m_seedArray[num4];
128 }
129 for (int j = 1; j < 5; j++) {
130 for (int k = 1; k < 56; k++) {
131 m_seedArray[k] -= m_seedArray[1 + (k + 30) % 55];
132 if (m_seedArray[k] < 0) {
133 m_seedArray[k] += 2147483647;
134 }
135 }
136 }
137 m_inext = 0;
138 m_inextp = 21;
139 }
140
141 public double GetSampleForLargeRange() {
142 int num = InternalSample();
143 if (InternalSample() % 2 == 0) {
144 num = -num;
145 }
146 return (num + 2147483646.0) / 4294967293.0;
147 }
148
149 public int InternalSample() {
150 int inext = m_inext;
151 int inextp = m_inextp;
152 if (++inext >= 56) {
153 inext = 1;
154 }
155 if (++inextp >= 56) {
156 inextp = 1;
157 }
158 int num = m_seedArray[inext] - m_seedArray[inextp];
159 if (num == 2147483647) {
160 num--;
161 }
162 if (num < 0) {
163 num += 2147483647;
164 }
165 m_seedArray[inext] = num;
166 m_inext = inext;
167 m_inextp = inextp;
168 return num;
169 }
170
171 public int Next() => InternalSample();
172
173 public int Next(int maxValue) {
174 if (maxValue < 0) {
175 throw new ArgumentOutOfRangeException(nameof(maxValue));
176 }
177 return (int)(Sample() * maxValue);
178 }
179
180 public int Next(int minValue, int maxValue) {
181 if (minValue > maxValue) {
182 throw new ArgumentOutOfRangeException(nameof(minValue));
183 }
184 long num = maxValue - minValue;
185 //if (num <= 2147483647)
186 //{
187 return (int)(Sample() * num) + minValue;
188 //}
189 //return (int)(long)(GetSampleForLargeRange() * num) + minValue;
190 }
191
192 public void NextBytes(byte[] buffer) {
193 ArgumentNullException.ThrowIfNull(buffer);
194 for (int i = 0; i < buffer.Length; i++) {
195 buffer[i] = (byte)(InternalSample() % 256);
196 }
197 }
198
199 public double NextDouble() => Sample();
200
201 public double Sample() => InternalSample() * 4.6566128752457969E-10;
202 }
203
205
206 public static int m_seed = (int)Stopwatch.GetTimestamp();
207
208 public static readonly OldRandom GlobalRandom = new(0);
209
210 public OldRandom() => m_random = new InternalRandom(997 * m_seed++);
211
212 public OldRandom(int seed) => m_random = new InternalRandom(seed);
213
214 public int Sign() {
215 if (m_random.Next() % 2 != 0) {
216 return 1;
217 }
218 return -1;
219 }
220
221 public bool Bool() => m_random.Next() % 2 == 0;
222
223 public int UniformInt(int min, int max) => m_random.Next(min, max + 1);
224
225 public float UniformFloat(float min, float max) => (float)m_random.NextDouble() * (max - min) + min;
226
227 public float NormalFloat(float mean, float stddev) {
228 float num = UniformFloat(0f, 1f);
229 if (num < 0.5) {
230 float num2 = MathF.Sqrt(-2f * MathF.Log(num));
231 float num3 = 0.322232425f + num2 * (1f + num2 * (0.3422421f + num2 * (0.0204231218f + num2 * 4.536422E-05f)));
232 float num4 = 0.09934846f + num2 * (0.588581562f + num2 * (0.5311035f + num2 * (0.103537753f + num2 * 0.00385607f)));
233 return mean + stddev * (num3 / num4 - num2);
234 }
235 float num5 = MathF.Sqrt(-2f * MathF.Log(1f - num));
236 float num6 = 0.322232425f + num5 * (1f + num5 * (0.3422421f + num5 * (0.0204231218f + num5 * 4.536422E-05f)));
237 float num7 = 0.09934846f + num5 * (0.588581562f + num5 * (0.5311035f + num5 * (0.103537753f + num5 * 0.00385607f)));
238 return mean - stddev * (num6 / num7 - num5);
239 }
240
241 public Vector2 Vector2(float length) => Engine.Vector2.Normalize(new Vector2(UniformFloat(-1f, 1f), UniformFloat(-1f, 1f))) * length;
242
243 public Vector2 UniformVector2(float minLength, float maxLength) =>
244 Engine.Vector2.Normalize(new Vector2(UniformFloat(-1f, 1f), UniformFloat(-1f, 1f))) * UniformFloat(minLength, maxLength);
245
246 public Vector3 Vector3(float length) =>
247 Engine.Vector3.Normalize(new Vector3(UniformFloat(-1f, 1f), UniformFloat(-1f, 1f), UniformFloat(-1f, 1f))) * length;
248
249 public Vector3 UniformVector3(float minLength, float maxLength) =>
250 Engine.Vector3.Normalize(new Vector3(UniformFloat(-1f, 1f), UniformFloat(-1f, 1f), UniformFloat(-1f, 1f)))
251 * UniformFloat(minLength, maxLength);
252 }
253
254 public class CavePoint {
256
258
259 public int BrushType;
260
261 public int Length;
262
263 public int StepsTaken;
264 }
265
266 public class Grid2d {
267 public int m_sizeX;
268
269 public int m_sizeY;
270
271 public float[] m_data;
272
273 public int SizeX => m_sizeX;
274
275 public int SizeY => m_sizeY;
276
277 public Grid2d(int sizeX, int sizeY) {
278 m_sizeX = sizeX;
279 m_sizeY = sizeY;
280 m_data = new float[m_sizeX * m_sizeY];
281 }
282
283 public float Get(int x, int y) => m_data[x + y * m_sizeX];
284
285 public void Set(int x, int y, float value) {
286 m_data[x + y * m_sizeX] = value;
287 }
288
289 public float Sample(float x, float y) {
290 int num = (int)MathF.Floor(x);
291 int num2 = (int)MathF.Floor(y);
292 int num3 = (int)MathF.Ceiling(x);
293 int num4 = (int)MathF.Ceiling(y);
294 float f = x - num;
295 float f2 = y - num2;
296 float x2 = m_data[num + num2 * m_sizeX];
297 float x3 = m_data[num3 + num2 * m_sizeX];
298 float x4 = m_data[num + num4 * m_sizeX];
299 float x5 = m_data[num3 + num4 * m_sizeX];
300 float x6 = MathUtils.Lerp(x2, x3, f);
301 float x7 = MathUtils.Lerp(x4, x5, f);
302 return MathUtils.Lerp(x6, x7, f2);
303 }
304 }
305
306 public class Grid3d {
307 public int m_sizeX;
308
309 public int m_sizeY;
310
311 public int m_sizeZ;
312
313 public int m_sizeXY;
314
315 public float[] m_data;
316
317 public int SizeX => m_sizeX;
318
319 public int SizeY => m_sizeY;
320
321 public int SizeZ => m_sizeZ;
322
323 public Grid3d(int sizeX, int sizeY, int sizeZ) {
324 m_sizeX = sizeX;
325 m_sizeY = sizeY;
326 m_sizeZ = sizeZ;
328 m_data = new float[m_sizeX * m_sizeY * m_sizeZ];
329 }
330
331 public void Get8(int x,
332 int y,
333 int z,
334 out float v111,
335 out float v211,
336 out float v121,
337 out float v221,
338 out float v112,
339 out float v212,
340 out float v122,
341 out float v222) {
342 int num = x + y * m_sizeX + z * m_sizeXY;
343 v111 = m_data[num];
344 v211 = m_data[num + 1];
345 v121 = m_data[num + m_sizeX];
346 v221 = m_data[num + 1 + m_sizeX];
347 v112 = m_data[num + m_sizeXY];
348 v212 = m_data[num + 1 + m_sizeXY];
349 v122 = m_data[num + m_sizeX + m_sizeXY];
350 v222 = m_data[num + 1 + m_sizeX + m_sizeXY];
351 }
352
353 public float Get(int x, int y, int z) => m_data[x + y * m_sizeX + z * m_sizeXY];
354
355 public void Set(int x, int y, int z, float value) {
356 m_data[x + y * m_sizeX + z * m_sizeXY] = value;
357 }
358
359 public float Sample(float x, float y, float z) {
360 int num = (int)MathF.Floor(x);
361 int num2 = (int)MathF.Ceiling(x);
362 int num3 = (int)MathF.Floor(y);
363 int num4 = (int)MathF.Ceiling(y);
364 int num5 = (int)MathF.Floor(z);
365 int num6 = (int)MathF.Ceiling(z);
366 float f = x - num;
367 float f2 = y - num3;
368 float f3 = z - num5;
369 float x2 = m_data[num + num3 * m_sizeX + num5 * m_sizeX * m_sizeY];
370 float x3 = m_data[num2 + num3 * m_sizeX + num5 * m_sizeX * m_sizeY];
371 float x4 = m_data[num + num4 * m_sizeX + num5 * m_sizeX * m_sizeY];
372 float x5 = m_data[num2 + num4 * m_sizeX + num5 * m_sizeX * m_sizeY];
373 float x6 = m_data[num + num3 * m_sizeX + num6 * m_sizeX * m_sizeY];
374 float x7 = m_data[num2 + num3 * m_sizeX + num6 * m_sizeX * m_sizeY];
375 float x8 = m_data[num + num4 * m_sizeX + num6 * m_sizeX * m_sizeY];
376 float x9 = m_data[num2 + num4 * m_sizeX + num6 * m_sizeX * m_sizeY];
377 float x10 = MathUtils.Lerp(x2, x3, f);
378 float x11 = MathUtils.Lerp(x4, x5, f);
379 float x12 = MathUtils.Lerp(x6, x7, f);
380 float x13 = MathUtils.Lerp(x8, x9, f);
381 float x14 = MathUtils.Lerp(x10, x11, f2);
382 float x15 = MathUtils.Lerp(x12, x13, f2);
383 return MathUtils.Lerp(x14, x15, f3);
384 }
385 }
386
387 public static List<TerrainBrush> m_coalBrushes;
388
389 public static List<TerrainBrush> m_ironBrushes;
390
391 public static List<TerrainBrush> m_copperBrushes;
392
393 public static List<TerrainBrush> m_saltpeterBrushes;
394
395 public static List<TerrainBrush> m_sulphurBrushes;
396
397 public static List<TerrainBrush> m_diamondBrushes;
398
399 public static List<TerrainBrush> m_germaniumBrushes;
400
401 public static List<TerrainBrush> m_dirtPocketBrushes;
402
403 public static List<TerrainBrush> m_gravelPocketBrushes;
404
405 public static List<TerrainBrush> m_limestonePocketBrushes;
406
407 public static List<TerrainBrush> m_sandPocketBrushes;
408
409 public static List<TerrainBrush> m_basaltPocketBrushes;
410
411 public static List<TerrainBrush> m_granitePocketBrushes;
412
413 public static List<TerrainBrush> m_clayPocketBrushes;
414
415 public static List<TerrainBrush> m_waterPocketBrushes;
416
417 public static List<TerrainBrush> m_magmaPocketBrushes;
418
419 public static List<List<TerrainBrush>> m_caveBrushesByType;
420
422
424
426
427 public int m_seed;
428
430
432
434
436
438
440
441 public bool TGNewBiomeNoise;
442
443 public float TGBiomeScaling;
444
446
448
449 public float TGOceanSlope;
450
452
453 public float TGIslandsFrequency;
454
455 public float TGDensityBias;
456
457 public float TGHeightBias;
458
459 public float TGHillsStrength;
460
462
463 public float TGMountainsPeriod;
464
466
467 public float TGRiversStrength;
468
470
472
473 public float TGTurbulencePower;
474
475 public static float TGSurfaceMultiplier;
476
477 public bool TGWater;
478
479 public bool TGExtras;
480
481 public bool TGCavesAndPockets;
482
483 public int OceanLevel => 64 + m_worldSettings.SeaLevelOffset;
484
505
507 m_subsystemTerrain = subsystemTerrain;
509 SubsystemGameInfo subsystemGameInfo = subsystemTerrain.Project.FindSubsystem<SubsystemGameInfo>(true);
510 m_worldSettings = subsystemGameInfo.WorldSettings;
511 m_seed = subsystemGameInfo.WorldSeed;
512 m_islandSize = m_worldSettings.TerrainGenerationMode == TerrainGenerationMode.Island ? new Vector2?(m_worldSettings.IslandSize) : null;
513 OldRandom oldRandom = new(100 + m_seed);
514 Random random = new(m_seed);
515 if (string.IsNullOrEmpty(subsystemGameInfo.WorldSettings.OriginalSerializationVersion)) {
516 m_oceanCorner = new Vector2(oldRandom.UniformFloat(2000f, 4000f), oldRandom.UniformFloat(2000f, 4000f));
517 m_temperatureOffset = new Vector2(1000f, 1000f);
518 m_humidityOffset = new Vector2(0f, 0f);
519 m_mountainsOffset = new Vector2(0f, 0f);
520 m_riversOffset = new Vector2(0f, 0f);
521 TGNewBiomeNoise = false;
522 TGBiomeScaling = 1f;
523 TGShoreFluctuations = 100f;
525 TGOceanSlope = 0.015f;
527 TGIslandsFrequency = 0.017f;
528 TGDensityBias = 57f;
529 TGHeightBias = 1f;
530 TGRiversStrength = 0f;
532 TGMountainsPeriod = 0.0014f;
533 TGMountainsPercentage = 0.15f;
534 TGHillsStrength = 13f;
537 TGTurbulencePower = 0.5f;
539 TGWater = true;
540 TGExtras = true;
541 TGCavesAndPockets = true;
542 }
543 else if (string.CompareOrdinal(subsystemGameInfo.WorldSettings.OriginalSerializationVersion, "2.1") < 0) {
544 m_oceanCorner = new Vector2(oldRandom.UniformFloat(2000f, 4000f), oldRandom.UniformFloat(2000f, 4000f));
545 m_temperatureOffset = new Vector2(1000f, 1000f);
546 m_humidityOffset = new Vector2(0f, 0f);
547 m_mountainsOffset = new Vector2(0f, 0f);
548 m_riversOffset = new Vector2(0f, 0f);
549 TGNewBiomeNoise = false;
550 TGBiomeScaling = 1f;
551 TGShoreFluctuations = 100f;
553 TGOceanSlope = 0.015f;
555 TGIslandsFrequency = 0.017f;
556 TGDensityBias = 57f;
557 TGHeightBias = 1f;
558 TGRiversStrength = 0f;
560 TGMountainsPeriod = 0.0014f;
561 TGMountainsPercentage = 0.15f;
562 TGHillsStrength = 10f;
565 TGTurbulencePower = 0.3f;
567 TGWater = true;
568 TGExtras = true;
569 TGCavesAndPockets = true;
570 }
571 else {
572 float num = m_islandSize.HasValue ? MathUtils.Min(m_islandSize.Value.X, m_islandSize.Value.Y) : 3.40282347E+38f;
573 m_oceanCorner = new Vector2(random.UniformFloat(-100f, -100f), random.UniformFloat(-100f, -100f));
574 m_temperatureOffset = new Vector2(random.UniformFloat(-2000f, 2000f), random.UniformFloat(-2000f, 2000f));
575 m_humidityOffset = new Vector2(random.UniformFloat(-2000f, 2000f), random.UniformFloat(-2000f, 2000f));
576 m_mountainsOffset = new Vector2(random.UniformFloat(-2000f, 2000f), random.UniformFloat(-2000f, 2000f));
577 m_riversOffset = new Vector2(random.UniformFloat(-2000f, 2000f), random.UniformFloat(-2000f, 2000f));
578 TGNewBiomeNoise = true;
579 TGBiomeScaling = 1.5f * m_worldSettings.BiomeSize;
580 TGShoreFluctuations = Math.Clamp(2f * num, 0f, 150f);
581 TGShoreFluctuationsScaling = Math.Clamp(0.04f * num, 0.5f, 3f);
582 TGOceanSlope = 0.006f;
583 TGOceanSlopeVariation = 0.004f;
584 TGIslandsFrequency = 0.01f;
585 TGDensityBias = 55f;
586 TGHeightBias = 1f;
587 TGRiversStrength = 1f;
589 TGMountainsPeriod = 0.0015f;
590 TGMountainsPercentage = 0.15f;
591 TGHillsStrength = 8f;
594 TGTurbulencePower = 0.3f;
596 TGWater = true;
597 TGExtras = true;
598 TGCavesAndPockets = true;
599 }
600 }
601
603 Vector2 vector = Vector2.Zero;
604 float num = -3.40282347E+38f;
605 for (int i = 0; i < 800; i += 2) {
606 for (int j = 4; j <= 8; j += 2) {
607 for (int k = 0; k < 2; k++) {
608 float num2;
609 float x;
610 if (k == 0) {
611 num2 = m_oceanCorner.Y + i;
612 x = CalculateOceanShoreX(num2) + j;
613 }
614 else {
615 x = m_oceanCorner.X + i;
616 num2 = CalculateOceanShoreZ(x) + j;
617 }
618 float num3 = ScoreSpawnPosition(Terrain.ToCell(x), Terrain.ToCell(num2));
619 if (num3 > num) {
620 vector = new Vector2(x, num2);
621 num = num3;
622 }
623 }
624 }
625 }
626 return new Vector3(vector.X, CalculateHeight(vector.X, vector.Y), vector.Y);
627 }
628
630 GenerateSurfaceParameters(chunk, 0, 0, 16, 8);
631 GenerateTerrain(chunk, 0, 0, 16, 8);
632 }
633
635 GenerateSurfaceParameters(chunk, 0, 8, 16, 16);
636 GenerateTerrain(chunk, 0, 8, 16, 16);
637 }
638
640 GenerateCaves(chunk);
641 GeneratePockets(chunk);
642 GenerateMinerals(chunk);
643 GenerateSurface(chunk);
645 }
646
650 GenerateCacti(chunk);
651 GeneratePumpkins(chunk);
652 GenerateKelp(chunk);
653 GenerateSeagrass(chunk);
655 GenerateTraps(chunk);
656 GenerateIvy(chunk);
657 GenerateGraves(chunk);
658 GenerateSnowAndIce(chunk);
660 UpdateFluidIsTop(chunk);
661 }
662
663 public float CalculateOceanShoreDistance(float x, float z) {
664 if (m_islandSize.HasValue) {
665 float num = CalculateOceanShoreX(z);
666 float num2 = CalculateOceanShoreZ(x);
667 float num3 = CalculateOceanShoreX(z + 1000f) + m_islandSize.Value.X;
668 float num4 = CalculateOceanShoreZ(x + 1000f) + m_islandSize.Value.Y;
669 return MathUtils.Min(x - num, z - num2, num3 - x, num4 - z);
670 }
671 float num5 = CalculateOceanShoreX(z);
672 float num6 = CalculateOceanShoreZ(x);
673 return MathUtils.Min(x - num5, z - num6);
674 }
675
676 public float CalculateMountainRangeFactor(float x, float z) => 1f
677 - MathF.Abs(
679 - 1f
680 );
681
682 public float CalculateHeight(float x, float z) {
683 float num = TGOceanSlope
685 * MathUtils.PowSign(2f * SimplexNoise.OctavedNoise(x + m_mountainsOffset.X, z + m_mountainsOffset.Y, 0.01f, 1, 2f, 0.5f) - 1f, 0.5f);
686 float num2 = CalculateOceanShoreDistance(x, z);
687 float num3 = MathUtils.Saturate(1f - 0.05f * MathF.Abs(num2));
688 float num4 = MathUtils.Saturate(MathF.Sin(TGIslandsFrequency * num2));
689 float num5 = MathUtils.Saturate(MathUtils.Saturate((0f - num) * num2) - 0.85f * num4);
690 float num6 = MathUtils.Saturate(MathUtils.Saturate(0.05f * (0f - num2 - 10f)) - num4);
691 float num7 = CalculateMountainRangeFactor(x, z);
692 float f = (1f - num3) * SimplexNoise.OctavedNoise(x, z, 0.001f / TGBiomeScaling, 2, 1.97f, 0.8f);
693 float f2 = (1f - num3) * SimplexNoise.OctavedNoise(x, z, 0.0017f / TGBiomeScaling, 2, 1.93f, 0.7f);
694 float num8 = (1f - num6) * (1f - num3) * MathUtils.Saturate((num7 - 0.6f) / 0.4f);
695 float num9 = (1f - num6) * MathUtils.Saturate((num7 - (1f - TGMountainsPercentage)) / TGMountainsPercentage);
696 float num10 = 2f * SimplexNoise.OctavedNoise(x, z, 0.02f, 3, 1.93f, 0.8f) - 1f;
697 float num11 = 1.5f * SimplexNoise.OctavedNoise(x, z, 0.004f, 4, 1.98f, 0.9f) - 0.5f;
698 float num12 = MathUtils.Lerp(60f, 30f, MathUtils.Saturate(1f * num9 + 0.5f * num8 + MathUtils.Saturate(1f - num2 / 30f)));
699 float x2 = MathUtils.Lerp(-2f, -4f, MathUtils.Saturate(num9 + 0.5f * num8));
700 float num13 = MathUtils.Saturate(
701 1.5f - num12 * MathF.Abs(2f * SimplexNoise.OctavedNoise(x + m_riversOffset.X, z + m_riversOffset.Y, 0.001f, 4, 2f, 0.5f) - 1f)
702 );
703 float num14 = -50f * num5 + TGHeightBias;
704 float num15 = MathUtils.Lerp(0f, 8f, f);
705 float num16 = MathUtils.Lerp(0f, -6f, f2);
706 float num17 = TGHillsStrength * num8 * num10;
707 float num18 = TGMountainsStrength * num9 * num11;
708 float f3 = TGRiversStrength * num13;
709 float num19 = num14 + num15 + num16 + num18 + num17;
710 float num20 = MathUtils.Min(MathUtils.Lerp(num19, x2, f3), num19);
711 return Math.Clamp(64f + num20, 10f, 251f);
712 }
713
714 public int CalculateTemperature(float x, float z) {
715 if (TGNewBiomeNoise) {
716 return Math.Clamp(
717 (int)(MathUtils.Saturate(
718 4f
720 - 1.6f
721 + m_worldSettings.TemperatureOffset / 16f
722 )
723 * 16f),
724 0,
725 15
726 );
727 }
728 return Math.Clamp(
729 (int)((MathUtils.Saturate(
730 4f
732 - 1.6f
733 )
734 + m_worldSettings.TemperatureOffset / 16f)
735 * 16f),
736 0,
737 15
738 );
739 }
740
741 public int CalculateHumidity(float x, float z) {
742 if (TGNewBiomeNoise) {
743 return Math.Clamp(
744 (int)(MathUtils.Saturate(
745 4f * SimplexNoise.OctavedNoise(x + m_humidityOffset.X, z + m_humidityOffset.Y, 0.0012f / TGBiomeScaling, 5, 2f, 0.7f)
746 - 1.2f
747 + m_worldSettings.HumidityOffset / 16f
748 )
749 * 16f),
750 0,
751 15
752 );
753 }
754 return Math.Clamp(
755 (int)((MathUtils.Saturate(
756 4f * SimplexNoise.OctavedNoise(x + m_humidityOffset.X, z + m_humidityOffset.Y, 0.0008f / TGBiomeScaling, 5, 1.97f, 1f)
757 - 1.5f
758 )
759 + m_worldSettings.HumidityOffset / 16f)
760 * 16f),
761 0,
762 15
763 );
764 }
765
766 public float CalculateOceanShoreX(float z) => m_oceanCorner.X
768
769 public float CalculateOceanShoreZ(float x) => m_oceanCorner.Y
771
772 public float ScoreSpawnPosition(int x, int z) {
773 float num = 0f;
774 float num2 = CalculateOceanShoreDistance(x, z);
775 float num3 = CalculateMountainRangeFactor(x, z);
776 int num4 = CalculateHumidity(x, z);
777 int num5 = CalculateTemperature(x, z);
778 if (num2 < 0f) {
779 num -= 1f;
780 }
781 if (num2 > 10f) {
782 num -= 1f;
783 }
784 if (num3 > 0.66f) {
785 num -= 0.5f;
786 }
787 if (num4 < 10) {
788 num -= 1f;
789 }
790 if (num5 < 2) {
791 num -= 0.5f;
792 }
793 float x2 = CalculateHeight(x, z);
794 float x3 = CalculateHeight(x - 5, z - 5);
795 float x4 = CalculateHeight(x - 5, z + 5);
796 float x5 = CalculateHeight(x + 5, z - 5);
797 float x6 = CalculateHeight(x + 5, z + 5);
798 float num6 = MathUtils.Min(x2, MathUtils.Min(x3, x4, x5, x6));
799 float num7 = MathUtils.Max(x2, MathUtils.Max(x3, x4, x5, x6));
800 if (num6 < 64f
801 || num7 > 75f) {
802 num -= 1f;
803 }
804 return num;
805 }
806
807 public void GenerateSurfaceParameters(TerrainChunk chunk, int x1, int z1, int x2, int z2) {
808 for (int i = x1; i < x2; i++) {
809 for (int j = z1; j < z2; j++) {
810 int num = i + chunk.Origin.X;
811 int num2 = j + chunk.Origin.Y;
812 int temperature = CalculateTemperature(num, num2);
813 int humidity = CalculateHumidity(num, num2);
814 chunk.SetTemperatureFast(i, j, temperature);
815 chunk.SetHumidityFast(i, j, humidity);
816 }
817 }
818 }
819
820 public void GenerateTerrain(TerrainChunk chunk, int x1, int z1, int x2, int z2) {
821 int num = x2 - x1;
822 int num2 = z2 - z1;
823 _ = m_subsystemTerrain.Terrain;
824 int num3 = chunk.Origin.X + x1;
825 int num4 = chunk.Origin.Y + z1;
826 Grid2d grid2d = new(num, num2);
827 Grid2d grid2d2 = new(num, num2);
828 for (int i = 0; i < num2; i++) {
829 for (int j = 0; j < num; j++) {
830 grid2d.Set(j, i, CalculateOceanShoreDistance(j + num3, i + num4));
831 grid2d2.Set(j, i, CalculateMountainRangeFactor(j + num3, i + num4));
832 }
833 }
834 Grid3d grid3d = new(num / 4 + 1, 33, num2 / 4 + 1);
835 for (int k = 0; k < grid3d.SizeX; k++) {
836 for (int l = 0; l < grid3d.SizeZ; l++) {
837 int num5 = k * 4 + num3;
838 int num6 = l * 4 + num4;
839 float num7 = CalculateHeight(num5, num6);
840 float num8 = CalculateMountainRangeFactor(num5, num6);
841 float num9 = MathUtils.Saturate(0.9f * (num8 - 0.8f) / 0.2f + 0.1f);
842 for (int m = 0; m < grid3d.SizeY; m++) {
843 int num10 = m * 8;
844 float num11 = num7 - TGTurbulenceTopOffset;
845 float num12 = MathUtils.Lerp(0f, TGTurbulenceStrength * num9, MathUtils.Saturate((num11 - num10) * 0.2f))
847 2f
849 num5,
850 num10 + 1000,
851 num6,
852 0.008f,
853 3,
854 2f,
855 0.75f
856 )
857 - 1f,
859 );
860 float num13 = num10 + num12;
861 float num14 = num7 - num13;
862 num14 += MathUtils.Max(4f * (TGDensityBias - num10), 0f);
863 grid3d.Set(k, m, l, num14);
864 }
865 }
866 }
867 int oceanLevel = OceanLevel;
868 for (int n = 0; n < grid3d.SizeX - 1; n++) {
869 for (int num15 = 0; num15 < grid3d.SizeZ - 1; num15++) {
870 for (int num16 = 0; num16 < grid3d.SizeY - 1; num16++) {
871 grid3d.Get8(
872 n,
873 num16,
874 num15,
875 out float v,
876 out float v2,
877 out float v3,
878 out float v4,
879 out float v5,
880 out float v6,
881 out float v7,
882 out float v8
883 );
884 float num17 = (v2 - v) / 4f;
885 float num18 = (v4 - v3) / 4f;
886 float num19 = (v6 - v5) / 4f;
887 float num20 = (v8 - v7) / 4f;
888 float num21 = v;
889 float num22 = v3;
890 float num23 = v5;
891 float num24 = v7;
892 for (int num25 = 0; num25 < 4; num25++) {
893 float num26 = (num23 - num21) / 4f;
894 float num27 = (num24 - num22) / 4f;
895 float num28 = num21;
896 float num29 = num22;
897 for (int num30 = 0; num30 < 4; num30++) {
898 float num31 = (num29 - num28) / 8f;
899 float num32 = num28;
900 int num33 = num25 + n * 4;
901 int num34 = num30 + num15 * 4;
902 int x3 = x1 + num33;
903 int z3 = z1 + num34;
904 float x4 = grid2d.Get(num33, num34);
905 float num35 = grid2d2.Get(num33, num34);
906 int temperatureFast = chunk.GetTemperatureFast(x3, z3);
907 int humidityFast = chunk.GetHumidityFast(x3, z3);
908 float f = num35 - 0.01f * humidityFast;
909 float num36 = MathUtils.Lerp(100f, 0f, f);
910 float num37 = MathUtils.Lerp(300f, 30f, f);
911 bool flag = (temperatureFast > 8 && humidityFast < 8 && num35 < 0.95f) || (MathF.Abs(x4) < 12f && num35 < 0.9f);
912 int num38 = TerrainChunk.CalculateCellIndex(x3, 0, z3);
913 for (int num39 = 0; num39 < 8; num39++) {
914 int num40 = num39 + num16 * 8;
915 int value = 0;
916 if (num32 < 0f) {
917 if (num40 <= oceanLevel) {
918 value = 18;
919 }
920 }
921 else {
922 value = !flag ? !(num32 < num37) ? 67 : 3 :
923 !(num32 < num36) ? !(num32 < num37) ? 67 : 3 : 4;
924 }
925 chunk.SetCellValueFast(num38 + num40, value);
926 num32 += num31;
927 }
928 num28 += num26;
929 num29 += num27;
930 }
931 num21 += num17;
932 num22 += num18;
933 num23 += num19;
934 num24 += num20;
935 }
936 }
937 }
938 }
939 }
940
941 public void GenerateSurface(TerrainChunk chunk) {
942 Terrain terrain = m_subsystemTerrain.Terrain;
943 Random random = new(m_seed + chunk.Coords.X + 101 * chunk.Coords.Y);
944 for (int i = 0; i < 16; i++) {
945 for (int j = 0; j < 16; j++) {
946 int num = i + chunk.Origin.X;
947 int num2 = j + chunk.Origin.Y;
948 int num3 = TerrainChunk.CalculateCellIndex(i, 254, j);
949 int num4 = 254;
950 while (num4 >= 0) {
951 int value5 = chunk.GetCellValueFast(num3);
952 int num5 = Terrain.ExtractContents(value5);
953 if (!BlocksManager.Blocks[num5].IsTransparent_(value5)) {
954 float num6 = CalculateMountainRangeFactor(num, num2);
955 int temperature = terrain.GetTemperature(num, num2);
956 int humidity = terrain.GetHumidity(num, num2);
957 float f = MathUtils.Saturate(
958 MathUtils.Saturate((num6 - 0.9f) / 0.1f)
959 - MathUtils.Saturate((humidity - 3f) / 12f)
960 + TGSurfaceMultiplier * MathUtils.Saturate((num4 - 85f) * 0.05f)
961 );
962 int min = (int)MathUtils.Lerp(4f, 0f, f);
963 int max = (int)MathUtils.Lerp(7f, 0f, f);
964 int num7 = MathUtils.Min(random.UniformInt(min, max), num4);
965 int num8;
966 if (num5 == 4) {
967 num8 = temperature > 4 && temperature < 7 ? 6 : 7;
968 }
969 else {
970 int num9 = temperature / 4;
971 int num10 = num4 + 1 < 255 ? chunk.GetCellContentsFast(i, num4 + 1, j) : 0;
972 num8 = (num4 < 66 || num4 == 84 + num9 || num4 == 103 + num9) && humidity == 9 && temperature % 6 == 1 ? 66 :
973 num10 != 18 || humidity <= 8 || humidity % 2 != 0 || temperature % 3 != 0 ? 2 : 72;
974 }
975 int num11 = TerrainChunk.CalculateCellIndex(i, num4 + 1, j);
976 for (int k = num11 - num7; k < num11; k++) {
977 if (Terrain.ExtractContents(chunk.GetCellValueFast(k)) != 0) {
978 int value = Terrain.ReplaceContents(num8);
979 chunk.SetCellValueFast(k, value);
980 }
981 }
982 break;
983 }
984 num4--;
985 num3--;
986 }
987 }
988 }
989 }
990
991 public void GenerateMinerals(TerrainChunk chunk) {
992 if (!TGCavesAndPockets) {
993 return;
994 }
995 int x = chunk.Coords.X;
996 int y = chunk.Coords.Y;
997 for (int i = x - 1; i <= x + 1; i++) {
998 for (int j = y - 1; j <= y + 1; j++) {
999 Random random = new(m_seed + i + 119 * j);
1000 int num = random.UniformInt(0, 10);
1001 for (int k = 0; k < num; k++) {
1002 random.UniformInt(0, 1);
1003 }
1004 float num2 = CalculateMountainRangeFactor(i * 16, j * 16);
1005 int num3 = (int)(5f + 2f * num2 * SimplexNoise.OctavedNoise(i, j, 0.33f, 1, 1f, 1f));
1006 for (int l = 0; l < num3; l++) {
1007 int x2 = i * 16 + random.UniformInt(0, 15);
1008 int y2 = random.UniformInt(5, 80);
1009 int z = j * 16 + random.UniformInt(0, 15);
1010 m_coalBrushes[random.UniformInt(0, m_coalBrushes.Count - 1)].PaintFastSelective(chunk, x2, y2, z, 3);
1011 }
1012 int num4 = (int)(6f + 2f * num2 * SimplexNoise.OctavedNoise(i + 1211, j + 396, 0.33f, 1, 1f, 1f));
1013 for (int m = 0; m < num4; m++) {
1014 int x3 = i * 16 + random.UniformInt(0, 15);
1015 int y3 = random.UniformInt(20, 65);
1016 int z2 = j * 16 + random.UniformInt(0, 15);
1017 m_copperBrushes[random.UniformInt(0, m_copperBrushes.Count - 1)].PaintFastSelective(chunk, x3, y3, z2, 3);
1018 }
1019 int num5 = (int)(5f + 2f * num2 * SimplexNoise.OctavedNoise(i + 713, j + 211, 0.33f, 1, 1f, 1f));
1020 for (int n = 0; n < num5; n++) {
1021 int x4 = i * 16 + random.UniformInt(0, 15);
1022 int y4 = random.UniformInt(2, 40);
1023 int z3 = j * 16 + random.UniformInt(0, 15);
1024 m_ironBrushes[random.UniformInt(0, m_ironBrushes.Count - 1)].PaintFastSelective(chunk, x4, y4, z3, 67);
1025 }
1026 int num6 = (int)(3f + 2f * num2 * SimplexNoise.OctavedNoise(i + 915, j + 272, 0.33f, 1, 1f, 1f));
1027 for (int num7 = 0; num7 < num6; num7++) {
1028 int x5 = i * 16 + random.UniformInt(0, 15);
1029 int y5 = random.UniformInt(50, 70);
1030 int z4 = j * 16 + random.UniformInt(0, 15);
1031 m_saltpeterBrushes[random.UniformInt(0, m_saltpeterBrushes.Count - 1)].PaintFastSelective(chunk, x5, y5, z4, 4);
1032 }
1033 int num8 = (int)(3f + 2f * num2 * SimplexNoise.OctavedNoise(i + 711, j + 1194, 0.33f, 1, 1f, 1f));
1034 for (int num9 = 0; num9 < num8; num9++) {
1035 int x6 = i * 16 + random.UniformInt(0, 15);
1036 int y6 = random.UniformInt(2, 40);
1037 int z5 = j * 16 + random.UniformInt(0, 15);
1038 m_sulphurBrushes[random.UniformInt(0, m_sulphurBrushes.Count - 1)].PaintFastSelective(chunk, x6, y6, z5, 67);
1039 }
1040 int num10 = (int)(0.5f + 2f * num2 * SimplexNoise.OctavedNoise(i + 432, j + 907, 0.33f, 1, 1f, 1f));
1041 for (int num11 = 0; num11 < num10; num11++) {
1042 int x7 = i * 16 + random.UniformInt(0, 15);
1043 int y7 = random.UniformInt(2, 15);
1044 int z6 = j * 16 + random.UniformInt(0, 15);
1045 m_diamondBrushes[random.UniformInt(0, m_diamondBrushes.Count - 1)].PaintFastSelective(chunk, x7, y7, z6, 67);
1046 }
1047 int num12 = (int)(3f + 2f * num2 * SimplexNoise.OctavedNoise(i + 799, j + 131, 0.33f, 1, 1f, 1f));
1048 for (int num13 = 0; num13 < num12; num13++) {
1049 int x8 = i * 16 + random.UniformInt(0, 15);
1050 int y8 = random.UniformInt(2, 50);
1051 int z7 = j * 16 + random.UniformInt(0, 15);
1052 m_germaniumBrushes[random.UniformInt(0, m_germaniumBrushes.Count - 1)].PaintFastSelective(chunk, x8, y8, z7, 67);
1053 }
1054 }
1055 }
1056 }
1057
1058 public void GeneratePockets(TerrainChunk chunk) {
1059 if (!TGCavesAndPockets) {
1060 return;
1061 }
1062 for (int i = -1; i <= 1; i++) {
1063 for (int j = -1; j <= 1; j++) {
1064 int num = i + chunk.Coords.X;
1065 int num2 = j + chunk.Coords.Y;
1066 Random random = new(m_seed + num + 71 * num2);
1067 int num3 = random.UniformInt(0, 10);
1068 for (int k = 0; k < num3; k++) {
1069 random.UniformInt(0, 1);
1070 }
1071 float num4 = CalculateMountainRangeFactor(num * 16, num2 * 16);
1072 for (int l = 0; l < 3; l++) {
1073 int x = num * 16 + random.UniformInt(0, 15);
1074 int y = random.UniformInt(50, 100);
1075 int z = num2 * 16 + random.UniformInt(0, 15);
1076 m_dirtPocketBrushes[random.UniformInt(0, m_dirtPocketBrushes.Count - 1)].PaintFastSelective(chunk, x, y, z, 3);
1077 }
1078 for (int m = 0; m < 10; m++) {
1079 int x2 = num * 16 + random.UniformInt(0, 15);
1080 int y2 = random.UniformInt(20, 80);
1081 int z2 = num2 * 16 + random.UniformInt(0, 15);
1082 m_gravelPocketBrushes[random.UniformInt(0, m_gravelPocketBrushes.Count - 1)].PaintFastSelective(chunk, x2, y2, z2, 3);
1083 }
1084 for (int n = 0; n < 2; n++) {
1085 int x3 = num * 16 + random.UniformInt(0, 15);
1086 int y3 = random.UniformInt(20, 120);
1087 int z3 = num2 * 16 + random.UniformInt(0, 15);
1088 m_limestonePocketBrushes[random.UniformInt(0, m_limestonePocketBrushes.Count - 1)].PaintFastSelective(chunk, x3, y3, z3, 3);
1089 }
1090 for (int num5 = 0; num5 < 1; num5++) {
1091 int x4 = num * 16 + random.UniformInt(0, 15);
1092 int y4 = random.UniformInt(50, 70);
1093 int z4 = num2 * 16 + random.UniformInt(0, 15);
1094 m_clayPocketBrushes[random.UniformInt(0, m_clayPocketBrushes.Count - 1)].PaintFastSelective(chunk, x4, y4, z4, 3);
1095 }
1096 for (int num6 = 0; num6 < 6; num6++) {
1097 int x5 = num * 16 + random.UniformInt(0, 15);
1098 int y5 = random.UniformInt(40, 80);
1099 int z5 = num2 * 16 + random.UniformInt(0, 15);
1100 m_sandPocketBrushes[random.UniformInt(0, m_sandPocketBrushes.Count - 1)].PaintFastSelective(chunk, x5, y5, z5, 4);
1101 }
1102 for (int num7 = 0; num7 < 4; num7++) {
1103 int x6 = num * 16 + random.UniformInt(0, 15);
1104 int y6 = random.UniformInt(40, 60);
1105 int z6 = num2 * 16 + random.UniformInt(0, 15);
1106 m_basaltPocketBrushes[random.UniformInt(0, m_basaltPocketBrushes.Count - 1)].PaintFastSelective(chunk, x6, y6, z6, 4);
1107 }
1108 for (int num8 = 0; num8 < 3; num8++) {
1109 int x7 = num * 16 + random.UniformInt(0, 15);
1110 int y7 = random.UniformInt(20, 40);
1111 int z7 = num2 * 16 + random.UniformInt(0, 15);
1112 m_basaltPocketBrushes[random.UniformInt(0, m_basaltPocketBrushes.Count - 1)].PaintFastSelective(chunk, x7, y7, z7, 3);
1113 }
1114 for (int num9 = 0; num9 < 6; num9++) {
1115 int x8 = num * 16 + random.UniformInt(0, 15);
1116 int y8 = random.UniformInt(4, 50);
1117 int z8 = num2 * 16 + random.UniformInt(0, 15);
1118 m_granitePocketBrushes[random.UniformInt(0, m_granitePocketBrushes.Count - 1)].PaintFastSelective(chunk, x8, y8, z8, 67);
1119 }
1120 if (random.Bool(0.02f + 0.01f * num4)) {
1121 int num10 = num * 16;
1122 int num11 = random.UniformInt(40, 60);
1123 int num12 = num2 * 16;
1124 int num13 = random.UniformInt(1, 3);
1125 for (int num14 = 0; num14 < num13; num14++) {
1126 Vector2 vector = random.Vector2(7f);
1127 int num15 = 8 + (int)MathF.Round(vector.X);
1128 int num16 = 0;
1129 int num17 = 8 + (int)MathF.Round(vector.Y);
1131 .PaintFast(chunk, num10 + num15, num11 + num16, num12 + num17);
1132 }
1133 }
1134 if (random.Bool(0.06f + 0.05f * num4)) {
1135 int num18 = num * 16;
1136 int num19 = random.UniformInt(15, 42);
1137 int num20 = num2 * 16;
1138 int num21 = random.UniformInt(1, 2);
1139 for (int num22 = 0; num22 < num21; num22++) {
1140 Vector2 vector2 = random.Vector2(7f);
1141 int num23 = 8 + (int)MathF.Round(vector2.X);
1142 int num24 = random.UniformInt(0, 1);
1143 int num25 = 8 + (int)MathF.Round(vector2.Y);
1145 .PaintFast(chunk, num18 + num23, num19 + num24, num20 + num25);
1146 }
1147 }
1148 }
1149 }
1150 }
1151
1152 public void GenerateCaves(TerrainChunk chunk) {
1153 if (!TGCavesAndPockets) {
1154 return;
1155 }
1156 List<CavePoint> list = new();
1157 int x = chunk.Coords.X;
1158 int y = chunk.Coords.Y;
1159 for (int i = x - 2; i <= x + 2; i++) {
1160 for (int j = y - 2; j <= y + 2; j++) {
1161 list.Clear();
1162 Random random = new(m_seed + i + 9973 * j);
1163 int num = i * 16 + random.UniformInt(0, 15);
1164 int num2 = j * 16 + random.UniformInt(0, 15);
1165 float probability = 0.5f;
1166 if (!random.Bool(probability)) {
1167 continue;
1168 }
1169 int num3 = (int)CalculateHeight(num, num2);
1170 int num4 = (int)CalculateHeight(num + 3, num2);
1171 int num5 = (int)CalculateHeight(num, num2 + 3);
1172 Vector3 position = new(num, num3 - 1, num2);
1173 Vector3 v = new(3f, num4 - num3, 0f);
1174 Vector3 v2 = new(0f, num5 - num3, 3f);
1175 Vector3 direction = Vector3.Normalize(Vector3.Cross(v, v2));
1176 if (direction.Y > -0.6f) {
1177 list.Add(new CavePoint { Position = position, Direction = direction, BrushType = 0, Length = random.UniformInt(80, 240) });
1178 }
1179 int num6 = i * 16 + 8;
1180 int num7 = j * 16 + 8;
1181 int num8 = 0;
1182 while (num8 < list.Count) {
1183 CavePoint cavePoint = list[num8];
1184 List<TerrainBrush> list2 = m_caveBrushesByType[cavePoint.BrushType];
1185 list2[random.UniformInt(0, list2.Count - 1)]
1186 .PaintFastAvoidWater(
1187 chunk,
1188 Terrain.ToCell(cavePoint.Position.X),
1189 Terrain.ToCell(cavePoint.Position.Y),
1190 Terrain.ToCell(cavePoint.Position.Z)
1191 );
1192 cavePoint.Position += 2f * cavePoint.Direction;
1193 cavePoint.StepsTaken += 2;
1194 float num9 = cavePoint.Position.X - num6;
1195 float num10 = cavePoint.Position.Z - num7;
1196 if (random.Bool(0.5f)) {
1197 Vector3 v3 = Vector3.Normalize(random.Vector3(1f, true));
1198 if ((num9 < -25.5f && v3.X < 0f)
1199 || (num9 > 25.5f && v3.X > 0f)) {
1200 v3.X = 0f - v3.X;
1201 }
1202 if ((num10 < -25.5f && v3.Z < 0f)
1203 || (num10 > 25.5f && v3.Z > 0f)) {
1204 v3.Z = 0f - v3.Z;
1205 }
1206 if ((cavePoint.Direction.Y < -0.5f && v3.Y < -10f)
1207 || (cavePoint.Direction.Y > 0.1f && v3.Y > 0f)) {
1208 v3.Y = 0f - v3.Y;
1209 }
1210 cavePoint.Direction = Vector3.Normalize(cavePoint.Direction + 0.5f * v3);
1211 }
1212 if (cavePoint.StepsTaken > 20
1213 && random.Bool(0.06f)) {
1214 cavePoint.Direction = Vector3.Normalize(random.Vector3(1f, true) * new Vector3(1f, 0.33f, 1f));
1215 }
1216 if (cavePoint.StepsTaken > 20
1217 && random.Bool(0.05f)) {
1218 cavePoint.Direction.Y = 0f;
1219 cavePoint.BrushType = MathUtils.Min(cavePoint.BrushType + 2, m_caveBrushesByType.Count - 1);
1220 }
1221 if (cavePoint.StepsTaken > 30
1222 && random.Bool(0.03f)) {
1223 cavePoint.Direction.X = 0f;
1224 cavePoint.Direction.Y = -1f;
1225 cavePoint.Direction.Z = 0f;
1226 }
1227 if (cavePoint.StepsTaken > 30
1228 && cavePoint.Position.Y < 30f
1229 && random.Bool(0.02f)) {
1230 cavePoint.Direction.X = 0f;
1231 cavePoint.Direction.Y = 1f;
1232 cavePoint.Direction.Z = 0f;
1233 }
1234 if (random.Bool(0.33f)) {
1235 cavePoint.BrushType = (int)(MathF.Pow(random.UniformFloat(0f, 0.999f), 7f) * m_caveBrushesByType.Count);
1236 }
1237 if (random.Bool(0.06f)
1238 && list.Count < 12
1239 && cavePoint.StepsTaken > 20
1240 && cavePoint.Position.Y < 58f) {
1241 list.Add(
1242 new CavePoint {
1243 Position = cavePoint.Position,
1244 Direction = Vector3.Normalize(random.UniformVector3(1f, 1f) * new Vector3(1f, 0.33f, 1f)),
1245 BrushType = (int)(MathF.Pow(random.UniformFloat(0f, 0.999f), 7f) * m_caveBrushesByType.Count),
1246 Length = random.UniformInt(40, 180)
1247 }
1248 );
1249 }
1250 if (cavePoint.StepsTaken >= cavePoint.Length
1251 || MathF.Abs(num9) > 34f
1252 || MathF.Abs(num10) > 34f
1253 || cavePoint.Position.Y < 5f
1254 || cavePoint.Position.Y > 246f) {
1255 num8++;
1256 }
1257 else if (cavePoint.StepsTaken % 20 == 0) {
1258 float num11 = CalculateHeight(cavePoint.Position.X, cavePoint.Position.Z);
1259 if (cavePoint.Position.Y > num11 + 1f) {
1260 num8++;
1261 }
1262 }
1263 }
1264 }
1265 }
1266 }
1267
1269 if (!TGExtras) {
1270 return;
1271 }
1272 Terrain terrain = m_subsystemTerrain.Terrain;
1273 int x = chunk.Origin.X;
1274 int num = x + 16;
1275 int y = chunk.Origin.Y;
1276 int num2 = y + 16;
1277 int x2 = chunk.Coords.X;
1278 int y2 = chunk.Coords.Y;
1279 for (int i = x2; i <= x2; i++) {
1280 for (int j = y2; j <= y2; j++) {
1281 Game.Random random = new(m_seed + i + 3943 * j);
1282 int humidity = CalculateHumidity(i * 16, j * 16);
1283 int num3 = CalculateTemperature(i * 16, j * 16);
1284 float num4 = MathUtils.Saturate(
1285 (SimplexNoise.OctavedNoise(i, j, 0.1f, 2, 2f, 0.5f) - 0.25f) / 0.2f + (random.Bool(0.25f) ? 0.5f : 0f)
1286 );
1287 int num5 = 0;
1288 if (num4 > 0.95f) {
1289 num5 = 1 + (random.Bool(0.25f) ? 1 : 0);
1290 }
1291 else if (num4 > 0.5f) {
1292 num5 = random.Bool(0.25f) ? 1 : 0;
1293 }
1294 int num6 = 0;
1295 for (int k = 0; k < 8; k++) {
1296 if (num6 >= num5) {
1297 break;
1298 }
1299 int num7 = i * 16 + random.Int(0, 15);
1300 int num8 = j * 16 + random.Int(0, 15);
1301 int num9 = terrain.CalculateTopmostCellHeight(num7, num8);
1302 if (num9 < 66) {
1303 continue;
1304 }
1305 int cellContentsFast = terrain.GetCellContentsFast(num7, num9, num8);
1306 if (cellContentsFast != 2
1307 && cellContentsFast != 8) {
1308 continue;
1309 }
1310 num9++;
1311 int num10 = random.Int(3, 7);
1312 Point3 point = CellFace.FaceToPoint3(random.Int(0, 3));
1313 if (point.X < 0
1314 && num7 - num10 + 1 < 0) {
1315 point.X *= -1;
1316 }
1317 if (point.X > 0
1318 && num7 + num10 - 1 > 15) {
1319 point.X *= -1;
1320 }
1321 if (point.Z < 0
1322 && num8 - num10 + 1 < 0) {
1323 point.Z *= -1;
1324 }
1325 if (point.Z > 0
1326 && num8 + num10 - 1 > 15) {
1327 point.Z *= -1;
1328 }
1329 bool flag = true;
1330 bool flag2 = false;
1331 bool flag3 = false;
1332 for (int l = 0; l < num10; l++) {
1333 int num11 = num7 + point.X * l;
1334 int num12 = num8 + point.Z * l;
1335 if (num11 < x + 1
1336 || num11 >= num - 1
1337 || num12 < y + 1
1338 || num12 >= num2 - 1) {
1339 flag = false;
1340 break;
1341 }
1342 int cellValue1 = terrain.GetCellValueFast(num11, num9, num12);
1343 int cellValue2 = terrain.GetCellValueFast(num11, num9 - 1, num12);
1344 if (BlocksManager.Blocks[Terrain.ExtractContents(cellValue1)].IsCollidable_(cellValue1)) {
1345 flag = false;
1346 break;
1347 }
1348 if (BlocksManager.Blocks[Terrain.ExtractContents(cellValue2)].IsCollidable_(cellValue2)) {
1349 if (l <= MathUtils.Max(num10 / 2, 0)) {
1350 flag2 = true;
1351 }
1352 if (l >= MathUtils.Min(num10 / 2 + 1, num10 - 1)) {
1353 flag3 = true;
1354 }
1355 }
1356 }
1357 if (!((flag && flag2) & flag3)) {
1358 continue;
1359 }
1360 Point3 point2 = point.X != 0 ? new Point3(0, 0, 1) : new Point3(1, 0, 0);
1362 random,
1364 humidity,
1365 num9
1366 );
1367 if (treeType.HasValue) {
1368 int treeTrunkValue = PlantsManager.GetTreeTrunkValue(treeType.Value);
1369 treeTrunkValue = Terrain.ReplaceData(
1370 treeTrunkValue,
1371 WoodBlock.SetCutFace(Terrain.ExtractData(treeTrunkValue), point.X != 0 ? 1 : 0)
1372 );
1373 int treeLeavesValue = PlantsManager.GetTreeLeavesValue(treeType.Value);
1374 for (int m = 0; m < num10; m++) {
1375 int num13 = num7 + point.X * m;
1376 int num14 = num8 + point.Z * m;
1377 terrain.SetCellValueFast(num13, num9, num14, treeTrunkValue);
1378 if (m > num10 / 2) {
1379 int value3 = terrain.GetCellValueFast(num13 + point2.X, num9, num14 + point2.Z);
1380 int value4 = terrain.GetCellValueFast(num13 + point2.X, num9, num14 + point2.Z);
1381 int value5 = terrain.GetCellValueFast(num13 - point2.X, num9, num14 - point2.Z);
1382 int value6 = terrain.GetCellValueFast(num13 - point2.X, num9, num14 - point2.Z);
1383 int value7 = terrain.GetCellValueFast(num13, num9 + 1, num14);
1384 if (random.Bool(0.3f)
1386 terrain.SetCellValueFast(num13 + point2.X, num9, num14 + point2.Z, treeLeavesValue);
1387 }
1388 if (random.Bool(0.05f)
1390 terrain.SetCellValueFast(num13 + point2.X, num9, num14 + point2.Z, treeTrunkValue);
1391 }
1392 if (random.Bool(0.3f)
1394 terrain.SetCellValueFast(num13 - point2.X, num9, num14 - point2.Z, treeLeavesValue);
1395 }
1396 if (random.Bool(0.05f)
1398 terrain.SetCellValueFast(num13 - point2.X, num9, num14 - point2.Z, treeTrunkValue);
1399 }
1400 if (random.Bool(0.1f)
1402 terrain.SetCellValueFast(num13, num9 + 1, num14, treeLeavesValue);
1403 }
1404 }
1405 }
1406 }
1407 num6++;
1408 }
1409 int num15 = (int)(5f * num4);
1410 int num16 = 0;
1411 for (int n = 0; n < 32; n++) {
1412 if (num16 >= num15) {
1413 break;
1414 }
1415 int num17 = i * 16 + random.Int(2, 13);
1416 int num18 = j * 16 + random.Int(2, 13);
1417 int num19 = terrain.CalculateTopmostCellHeight(num17, num18);
1418 if (num19 < 66) {
1419 continue;
1420 }
1421 int cellContentsFast2 = terrain.GetCellContentsFast(num17, num19, num18);
1422 if (cellContentsFast2 != 2
1423 && cellContentsFast2 != 8) {
1424 continue;
1425 }
1426 num19++;
1427 int value1 = terrain.GetCellValueFast(num17 + 1, num19, num18);
1428 int value2 = terrain.GetCellValueFast(num17 - 1, num19, num18);
1429 int value3 = terrain.GetCellValueFast(num17, num19, num18 + 1);
1430 int value4 = terrain.GetCellValueFast(num17, num19, num18 - 1);
1436 random,
1438 humidity,
1439 num19
1440 );
1441 if (treeType2.HasValue) {
1442 ReadOnlyList<TerrainBrush> treeBrushes = PlantsManager.GetTreeBrushes(treeType2.Value);
1443 treeBrushes[random.Int(treeBrushes.Count)].PaintFast(chunk, num17, num19, num18);
1444 }
1445 num16++;
1446 }
1447 }
1448 }
1449 }
1450 }
1451
1453 int value = Terrain.MakeBlockValue(1);
1454 for (int i = 0; i < 16; i++) {
1455 for (int j = 0; j < 16; j++) {
1456 int num = i + chunk.Origin.X;
1457 int num2 = j + chunk.Origin.Y;
1458 float num3 = 2 + (int)(4f * SimplexNoise.OctavedNoise(num, num2, 0.1f, 1, 1f, 1f));
1459 for (int k = 0; k < num3; k++) {
1460 chunk.SetCellValueFast(i, k, j, value);
1461 }
1462 chunk.SetCellValueFast(i, 255, j, 0);
1463 }
1464 }
1465 }
1466
1468 if (!TGExtras) {
1469 return;
1470 }
1471 Game.Random random = new(m_seed + chunk.Coords.X + 3943 * chunk.Coords.Y);
1472 for (int i = 0; i < 16; i++) {
1473 for (int j = 0; j < 16; j++) {
1474 for (int num = 254; num >= 0; num--) {
1475 int cellValueFast = chunk.GetCellValueFast(i, num, j);
1476 int num2 = Terrain.ExtractContents(cellValueFast);
1477 if (num2 != 0) {
1478 if (!(BlocksManager.Blocks[num2] is FluidBlock)) {
1479 int temperatureFast = chunk.GetTemperatureFast(i, j);
1480 int humidityFast = chunk.GetHumidityFast(i, j);
1481 int num3 = PlantsManager.GenerateRandomPlantValue(random, cellValueFast, temperatureFast, humidityFast, num + 1);
1482 if (num3 != 0) {
1483 chunk.SetCellValueFast(i, num + 1, j, num3);
1484 }
1485 if (num2 == 2) {
1486 chunk.SetCellValueFast(i, num, j, Terrain.MakeBlockValue(8, 0, 0));
1487 }
1488 }
1489 break;
1490 }
1491 }
1492 }
1493 }
1494 }
1495
1497 if (!TGExtras) {
1498 return;
1499 }
1500 Random random = new(m_seed + chunk.Coords.X + 2210 * chunk.Coords.Y);
1501 for (int i = 0; i < 16; i++) {
1502 for (int j = 0; j < 16; j++) {
1503 if (!random.Bool(0.2f)) {
1504 continue;
1505 }
1506 int num = chunk.Origin.X + i;
1507 int num2 = chunk.Origin.Y + j;
1508 int temperatureFast = chunk.GetTemperatureFast(i, j);
1509 if (CalculateOceanShoreDistance(num, num2) > 10f) {
1510 continue;
1511 }
1512 int num3 = 0;
1513 for (int num4 = 254; num4 >= 0; num4--) {
1514 if (Terrain.ExtractContents(chunk.GetCellValueFast(i, num4, j)) == 18) {
1515 num3++;
1516 int face = random.UniformInt(0, 5);
1517 Point3 point = CellFace.FaceToPoint3(face);
1518 if (i + point.X >= 0
1519 && i + point.X < 16
1520 && num4 + point.Y >= 0
1521 && num4 + point.Y < 254
1522 && j + point.Z >= 0
1523 && j + point.Z < 16) {
1524 int cellValueFast = chunk.GetCellValueFast(i + point.X, num4 + point.Y, j + point.Z);
1525 if (m_subsystemBottomSuckerBlockBehavior.IsSupport(cellValueFast, CellFace.OppositeFace(face))) {
1526 int num5 = 0;
1527 float num6 = 0.6f;
1528 float num7 = 0.4f;
1529 if (temperatureFast < 8) {
1530 num6 = 0.9f;
1531 num7 = 0.1f;
1532 }
1533 if (num3 > 6) {
1534 num6 *= 0.25f;
1535 }
1536 if (num3 > 12) {
1537 num7 *= 0.5f;
1538 }
1539 if (num3 < 4) {
1540 num7 *= 0.5f;
1541 }
1542 if (num4 < 45) {
1543 num6 *= 0.1f;
1544 num7 *= 0.1f;
1545 }
1546 float num8 = random.UniformFloat(0f, 1f);
1547 num8 -= num6;
1548 if ( /*num5 == 0 && */num8 < 0f) {
1549 num5 = 226;
1550 }
1551 num8 -= num7;
1552 if (num5 == 0
1553 && num8 < 0f) {
1554 num5 = 229;
1555 }
1556 if (num5 != 0) {
1557 int face2 = random.UniformInt(0, 3);
1559 int value = Terrain.MakeBlockValue(num5, 0, data);
1560 chunk.SetCellValueFast(i, num4, j, value);
1561 }
1562 }
1563 }
1564 }
1565 else {
1566 num3 = 0;
1567 }
1568 }
1569 }
1570 }
1571 }
1572
1573 public void GenerateCacti(TerrainChunk chunk) {
1574 if (!TGExtras) {
1575 return;
1576 }
1577 int x = chunk.Coords.X;
1578 int y = chunk.Coords.Y;
1579 Random random = new(m_seed + x + 1991 * y);
1580 if (!random.Bool(0.5f)) {
1581 return;
1582 }
1583 int num = random.UniformInt(0, MathUtils.Max(1, 1));
1584 for (int i = 0; i < num; i++) {
1585 int num2 = random.UniformInt(3, 12);
1586 int num3 = random.UniformInt(3, 12);
1587 int humidityFast = chunk.GetHumidityFast(num2, num3);
1588 int temperatureFast = chunk.GetTemperatureFast(num2, num3);
1589 if (humidityFast >= 6
1590 || temperatureFast <= 8) {
1591 continue;
1592 }
1593 for (int j = 0; j < 8; j++) {
1594 int num4 = num2 + random.UniformInt(-2, 2);
1595 int num5 = num3 + random.UniformInt(-2, 2);
1596 for (int num6 = 251; num6 >= 0; num6--) {
1597 switch (Terrain.ExtractContents(chunk.GetCellValueFast(num4, num6, num5))) {
1598 case 7: {
1599 for (int k = num6 + 1;
1600 k <= num6 + 3
1601 && chunk.GetCellContentsFast(num4 + 1, k, num5) == 0
1602 && chunk.GetCellContentsFast(num4 - 1, k, num5) == 0
1603 && chunk.GetCellContentsFast(num4, k, num5 + 1) == 0
1604 && chunk.GetCellContentsFast(num4, k, num5 - 1) == 0;
1605 k++) {
1606 chunk.SetCellValueFast(num4, k, num5, Terrain.MakeBlockValue(127));
1607 }
1608 break;
1609 }
1610 case 0: continue;
1611 }
1612 break;
1613 }
1614 }
1615 }
1616 }
1617
1618 public void GeneratePumpkins(TerrainChunk chunk) {
1619 if (!TGExtras) {
1620 return;
1621 }
1622 int x = chunk.Coords.X;
1623 int y = chunk.Coords.Y;
1624 Random random = new(m_seed + x + 1495 * y);
1625 if (!random.Bool(0.2f)) {
1626 return;
1627 }
1628 int num = random.UniformInt(0, MathUtils.Max(1, 1));
1629 for (int i = 0; i < num; i++) {
1630 int num2 = random.UniformInt(1, 14);
1631 int num3 = random.UniformInt(1, 14);
1632 int humidityFast = chunk.GetHumidityFast(num2, num3);
1633 int temperatureFast = chunk.GetTemperatureFast(num2, num3);
1634 if (humidityFast < 10
1635 || temperatureFast <= 6) {
1636 continue;
1637 }
1638 for (int j = 0; j < 5; j++) {
1639 int x2 = num2 + random.UniformInt(-1, 1);
1640 int z = num3 + random.UniformInt(-1, 1);
1641 for (int num4 = 254; num4 >= 0; num4--) {
1642 switch (Terrain.ExtractContents(chunk.GetCellValueFast(x2, num4, z))) {
1643 case 8:
1644 chunk.SetCellValueFast(
1645 x2,
1646 num4 + 1,
1647 z,
1648 random.Bool(0.25f) ? Terrain.MakeBlockValue(244) : Terrain.MakeBlockValue(131)
1649 ); break;
1650 case 0: continue;
1651 }
1652 break;
1653 }
1654 }
1655 }
1656 }
1657
1658 public void GenerateKelp(TerrainChunk chunk) {
1659 if (!TGExtras) {
1660 return;
1661 }
1662 int x = chunk.Coords.X;
1663 int y = chunk.Coords.Y;
1664 Random random = new(0);
1665 float num = 0f;
1666 for (int i = 0; i < 9; i++) {
1667 int num2 = i % 3 - 1;
1668 int num3 = i / 3 - 1;
1669 random.Reset(m_seed + x + num2 + 850 * (y + num3));
1670 if (random.Bool(0.2f)) {
1671 num = MathUtils.Max(num, 0.025f);
1672 if (i == 4) {
1673 num = MathUtils.Max(num, 0.1f);
1674 }
1675 }
1676 }
1677 if (num == 0f) {
1678 return;
1679 }
1680 random.Reset(m_seed + x + 850 * y);
1681 int num4 = random.UniformInt(0, MathUtils.Max((int)(256f * num), 1));
1682 for (int j = 0; j < num4; j++) {
1683 int num5 = random.UniformInt(2, 13);
1684 int num6 = random.UniformInt(2, 13);
1685 int num7 = num5 + chunk.Origin.X;
1686 int num8 = num6 + chunk.Origin.Y;
1687 int num9 = random.UniformInt(10, 26);
1688 int num10 = 6;
1689 bool flag = true;
1690 if (CalculateOceanShoreDistance(num7, num8) > 5f) {
1691 num10 = 4;
1692 flag = false;
1693 }
1694 if (num9 <= 0) {
1695 continue;
1696 }
1697 for (int k = 0; k < num9; k++) {
1698 int x2 = num5 + random.UniformInt(-2, 2);
1699 int z = num6 + random.UniformInt(-2, 2);
1700 int num11 = 0;
1701 for (int num12 = 254; num12 >= 0; num12--) {
1702 int num13 = Terrain.ExtractContents(chunk.GetCellValueFast(x2, num12, z));
1703 Block block = BlocksManager.Blocks[num13];
1704 if (num13 != 0) {
1705 if (!(block is WaterBlock)) {
1706 if ((num13 == 2 || num13 == 7 || num13 == 72)
1707 && num11 >= 2) {
1708 int num14 = flag ? random.UniformInt(num11 - 2, num11 - 1) : random.UniformInt(num11 - 1, num11);
1709 for (int l = 0; l < num14; l++) {
1710 chunk.SetCellValueFast(x2, num12 + 1 + l, z, Terrain.MakeBlockValue(232));
1711 }
1712 }
1713 break;
1714 }
1715 num11++;
1716 if (num11 > num10) {
1717 break;
1718 }
1719 }
1720 }
1721 }
1722 }
1723 }
1724
1725 public void GenerateSeagrass(TerrainChunk chunk) {
1726 if (!TGExtras) {
1727 return;
1728 }
1729 int x = chunk.Coords.X;
1730 int y = chunk.Coords.Y;
1731 Random random = new(m_seed + x + 378 * y);
1732 for (int i = 0; i < 6; i++) {
1733 int num = random.UniformInt(1, 14);
1734 int num2 = random.UniformInt(1, 14);
1735 int num3 = chunk.Origin.X + num;
1736 int num4 = chunk.Origin.Y + num2;
1737 bool flag = CalculateOceanShoreDistance(num3, num4) < 10f;
1738 int num5 = random.UniformInt(1, 3);
1739 for (int j = 0; j < num5; j++) {
1740 int x2 = num + random.UniformInt(-1, 1);
1741 int z = num2 + random.UniformInt(-1, 1);
1742 int num6 = 0;
1743 for (int num7 = 254; num7 >= 0; num7--) {
1744 int num8 = Terrain.ExtractContents(chunk.GetCellValueFast(x2, num7, z));
1745 switch (num8) {
1746 case 18:
1747 num6++;
1748 if (num6 <= 16) {
1749 continue;
1750 }
1751 break;
1752 default:
1753 if (num6 > 1
1754 && (num8 == 2 || num8 == 7 || num8 == 72 || num8 == 3)) {
1755 int x3 = !random.Bool(0.1f) ? 1 : 2;
1756 x3 = flag ? MathUtils.Min(x3, num6 - 1) : MathUtils.Min(x3, num6);
1757 for (int k = 0; k < x3; k++) {
1758 chunk.SetCellValueFast(x2, num7 + 1 + k, z, Terrain.MakeBlockValue(233));
1759 }
1760 }
1761 break;
1762 case 0: continue;
1763 }
1764 break;
1765 }
1766 }
1767 }
1768 }
1769
1770 public void GenerateIvy(TerrainChunk chunk) {
1771 if (!TGExtras) {
1772 return;
1773 }
1774 Random random = new(m_seed + chunk.Coords.X + 2191 * chunk.Coords.Y);
1775 int num = random.UniformInt(0, MathUtils.Max(12, 1));
1776 for (int i = 0; i < num; i++) {
1777 int num2 = random.UniformInt(4, 11);
1778 int num3 = random.UniformInt(4, 11);
1779 int humidityFast = chunk.GetHumidityFast(num2, num3);
1780 int temperatureFast = chunk.GetTemperatureFast(num2, num3);
1781 if (humidityFast <= 10
1782 || temperatureFast <= 10) {
1783 continue;
1784 }
1785 int num4 = chunk.CalculateTopmostCellHeight(num2, num3);
1786 for (int j = 0; j < 100; j++) {
1787 int num5 = num2 + random.UniformInt(-3, 3);
1788 int num6 = Math.Clamp(num4 + random.UniformInt(-10, 1), 1, 255);
1789 int num7 = num3 + random.UniformInt(-3, 3);
1790 switch (Terrain.ExtractContents(chunk.GetCellValueFast(num5, num6, num7))) {
1791 case 2:
1792 case 3:
1793 case 8:
1794 case 9:
1795 case 12:
1796 case 66:
1797 case 67: {
1798 int num8 = random.UniformInt(0, 3);
1799 for (int k = 0; k < 4; k++) {
1800 int face = (k + num8) % 4;
1801 Point3 point = CellFace.FaceToPoint3(face);
1802 if (chunk.GetCellContentsFast(num5 + point.X, num6, num7 + point.Z) != 0) {
1803 continue;
1804 }
1805 int num9 = num6 - 1;
1806 while (num9 >= 1
1807 && chunk.GetCellContentsFast(num5 + point.X, num9, num7 + point.Z) == 0
1808 && chunk.GetCellContentsFast(num5, num9, num7) != 0) {
1809 num9--;
1810 }
1811 if (chunk.GetCellContentsFast(num5 + point.X, num9, num7 + point.Z) != 0) {
1812 break;
1813 }
1814 num9++;
1815 int value = Terrain.MakeBlockValue(197, 0, IvyBlock.SetFace(0, CellFace.OppositeFace(face)));
1816 while (num9 >= 1
1817 && chunk.GetCellContentsFast(num5 + point.X, num9, num7 + point.Z) == 0) {
1818 chunk.SetCellValueFast(num5 + point.X, num9, num7 + point.Z, value);
1819 if (IvyBlock.IsGrowthStopCell(num5 + point.X, num9, num7 + point.Z)) {
1820 break;
1821 }
1822 num9--;
1823 }
1824 break;
1825 }
1826 break;
1827 }
1828 }
1829 }
1830 }
1831 }
1832
1833 public void GenerateTraps(TerrainChunk chunk) {
1834 if (!TGExtras) {
1835 return;
1836 }
1837 int x = chunk.Coords.X;
1838 int y = chunk.Coords.Y;
1839 _ = m_subsystemTerrain.Terrain;
1840 Random random = new(m_seed + x + 2113 * y);
1841 if (!random.Bool(0.15f)
1842 || !(CalculateOceanShoreDistance(chunk.Origin.X, chunk.Origin.Y) > 50f)) {
1843 return;
1844 }
1845 int num = random.UniformInt(0, MathUtils.Max(2, 1));
1846 for (int i = 0; i < num; i++) {
1847 int num2 = random.UniformInt(2, 5);
1848 int num3 = random.UniformInt(2, 5);
1849 int num4 = random.UniformInt(1, 16 - num2 - 2);
1850 int num5 = random.UniformInt(1, 16 - num3 - 2);
1851 bool flag = random.UniformFloat(0f, 1f) < 0.5f;
1852 int num6 = random.UniformInt(3, 5);
1853 int? num7 = null;
1854 int num8 = num4 - 1;
1855 while (true) {
1856 if (num8 < num4 + num2 + 1) {
1857 for (int j = num5 - 1; j < num5 + num3 + 1; j++) {
1858 int num9 = chunk.CalculateTopmostCellHeight(num8, j);
1859 int num10 = MathUtils.Max(num9 - 20, 5);
1860 while (num9 >= num10
1861 && chunk.GetCellContentsFast(num8, num9, j) != 8) {
1862 num9--;
1863 }
1864 if (num7.HasValue
1865 && num7 != num9) {
1866 goto end_IL_019b;
1867 }
1868 num7 = num9;
1869 if (chunk.GetCellContentsFast(num8, num9, j) != 8) {
1870 goto end_IL_019b;
1871 }
1872 }
1873 num8++;
1874 continue;
1875 }
1876 if (!num7.HasValue
1877 || num7 - num6 < 5) {
1878 break;
1879 }
1880 for (int k = num4; k < num4 + num2; k++) {
1881 for (int l = num5; l < num5 + num3; l++) {
1882 for (int num11 = num7.Value - 1; num11 >= num7 - num6 + 1; num11--) {
1883 chunk.SetCellValueFast(k, num11, l, Terrain.MakeBlockValue(0));
1884 }
1885 chunk.SetCellValueFast(k, num7.Value, l, Terrain.MakeBlockValue(87));
1886 if (flag) {
1887 int data = SpikedPlankBlock.SetSpikesState(0, random.UniformFloat(0f, 1f) < 0.33f);
1888 chunk.SetCellValueFast(k, num7.Value - num6 + 1, l, Terrain.MakeBlockValue(86, 0, data));
1889 }
1890 }
1891 }
1892 break;
1893 end_IL_019b:
1894 break;
1895 }
1896 }
1897 }
1898
1899 public void GenerateGraves(TerrainChunk chunk) {
1900 if (!TGExtras) {
1901 return;
1902 }
1903 int x = chunk.Coords.X;
1904 int y = chunk.Coords.Y;
1905 Random random = new((int)MathUtils.Hash((uint)(m_seed + x + 10323 * y)));
1906 if (!(random.UniformFloat(0f, 1f) < 0.033f)
1907 || !(CalculateOceanShoreDistance(chunk.Origin.X, chunk.Origin.Y) > 10f)) {
1908 return;
1909 }
1910 int num = random.UniformInt(0, MathUtils.Max(1, 1));
1911 for (int i = 0; i < num; i++) {
1912 int num2 = random.UniformInt(6, 9);
1913 int num3 = random.UniformInt(6, 9);
1914 int num4 = random.Bool(0.2f) ? random.UniformInt(6, 20) : random.UniformInt(1, 5);
1915 bool flag = random.Bool(0.5f);
1916 for (int j = 0; j < num4; j++) {
1917 int num5 = num2 + random.UniformInt(-4, 4);
1918 int num6 = num3 + random.UniformInt(-4, 4);
1919 int num7 = chunk.CalculateTopmostCellHeight(num5, num6);
1920 if (num7 < 10
1921 || num7 > 246) {
1922 continue;
1923 }
1924 int num8 = random.UniformInt(0, 3);
1925 for (int k = 0; k < 4; k++) {
1926 int num9 = (k + num8) % 4;
1927 Point3 p = CellFace.FaceToPoint3(num9);
1928 Point3 p2 = new(-p.Z, p.Y, p.X);
1929 int num10 = p.X < 0 ? num5 - 2 : num5 - 1;
1930 int num11 = p.X > 0 ? num5 + 2 : num5 + 1;
1931 int num12 = p.Z < 0 ? num6 - 2 : num6 - 1;
1932 int num13 = p.Z > 0 ? num6 + 2 : num6 + 1;
1933 for (int l = num10; l <= num11; l++) {
1934 for (int m = num7 - 2; m <= num7 + 2; m++) {
1935 for (int n = num12; n <= num13; n++) {
1936 int value = chunk.GetCellValueFast(l, m, n);
1937 int num14 = Terrain.ExtractContents(value);
1938 Block block = BlocksManager.Blocks[num14];
1939 if (m > num7) {
1940 if (!block.IsCollidable_(value)) {
1941 continue;
1942 }
1943 }
1944 else if (num14 == 8
1945 || num14 == 2
1946 || num14 == 7
1947 || num14 == 3
1948 || num14 == 4) {
1949 continue;
1950 }
1951 goto IL_06ac;
1952 }
1953 }
1954 }
1955 int num15 = random.UniformInt(0, 7);
1956 int data = GravestoneBlock.SetVariant(GravestoneBlock.SetRotation(0, num9 % 2), num15);
1957 int? num16 = null;
1958 int contents = 217;
1959 int contents2 = 136;
1960 if (num15 >= 4
1961 && !flag) {
1962 int cellContentsFast = chunk.GetCellContentsFast(num5, num7, num6);
1963 if (cellContentsFast == 7
1964 || cellContentsFast == 4) {
1965 num16 = Terrain.MakeBlockValue(4);
1966 contents = 51;
1967 contents2 = 52;
1968 }
1969 else if (random.UniformFloat(0f, 1f) < 0.5f) {
1970 num16 = Terrain.MakeBlockValue(3);
1971 contents = 217;
1972 contents2 = 136;
1973 }
1974 else {
1975 num16 = Terrain.MakeBlockValue(67);
1976 contents = 96;
1977 contents2 = 95;
1978 }
1979 }
1980 bool flag2 = num16.HasValue && random.Bool(0.33f);
1981 float num17 = random.UniformFloat(0f, 1f);
1982 float num18 = random.UniformFloat(0f, 1f);
1983 int num19 = random.UniformInt(-1, 0);
1984 int num20 = random.UniformInt(1, 2);
1985 int num21 = flag2 ? num7 + 2 : num7 + 1;
1986 chunk.SetCellValueFast(num5, num21, num6, Terrain.MakeBlockValue(189, 0, data));
1987 for (int num22 = num19; num22 <= num20; num22++) {
1988 int num23 = num5 + p.X * num22;
1989 int num24 = num6 + p.Z * num22;
1990 if (num22 == 0
1991 || num22 == 1) {
1992 chunk.SetCellValueFast(num23, num21 - 2, num24, Terrain.MakeBlockValue(190));
1993 if (num16.HasValue) {
1994 chunk.SetCellValueFast(num23, num21 - 1, num24, num16.Value);
1995 if (num22 == 1) {
1996 int num25 = 0;
1997 if (num18 < 0.2f) {
1998 num25 = Terrain.MakeBlockValue(20);
1999 }
2000 else if (num18 < 0.3f) {
2001 num25 = Terrain.MakeBlockValue(24);
2002 }
2003 else if (num18 < 0.4f) {
2004 num25 = Terrain.MakeBlockValue(25);
2005 }
2006 else if (num18 < 0.5f) {
2007 num25 = Terrain.MakeBlockValue(31, 0, 4);
2008 }
2009 else if (num18 < 0.6f) {
2010 num25 = Terrain.MakeBlockValue(132, 0, CellFace.OppositeFace(num9));
2011 }
2012 if (num25 != 0) {
2013 chunk.SetCellValueFast(num23, num21, num24, num25);
2014 }
2015 }
2016 }
2017 }
2018 if (!flag2) {
2019 continue;
2020 }
2021 if (num17 < 0.3f) {
2022 int value = Terrain.MakeBlockValue(contents, 0, StairsBlock.SetRotation(0, CellFace.Point3ToFace(p2)));
2023 int value2 = Terrain.MakeBlockValue(
2024 contents,
2025 0,
2027 );
2028 chunk.SetCellValueFast(num23 + p2.X, num21 - 1, num24 + p2.Z, value);
2029 chunk.SetCellValueFast(num23 - p2.X, num21 - 1, num24 - p2.Z, value2);
2030 if (num22 == -1) {
2031 int value3 = Terrain.MakeBlockValue(
2032 contents,
2033 0,
2035 );
2036 chunk.SetCellValueFast(num23, num21 - 1, num24, value3);
2037 }
2038 if (num22 == 2) {
2039 int value4 = Terrain.MakeBlockValue(contents, 0, StairsBlock.SetRotation(0, CellFace.Point3ToFace(p)));
2040 chunk.SetCellValueFast(num23, num21 - 1, num24, value4);
2041 }
2042 }
2043 else if (num17 < 0.4f) {
2044 chunk.SetCellValueFast(num23 + p2.X, num21 - 1, num24 + p2.Z, Terrain.MakeBlockValue(contents2));
2045 chunk.SetCellValueFast(num23 - p2.X, num21 - 1, num24 - p2.Z, Terrain.MakeBlockValue(contents2));
2046 if (num22 == -1) {
2047 chunk.SetCellValueFast(num23, num21 - 1, num24, Terrain.MakeBlockValue(contents2));
2048 }
2049 if (num22 == 2) {
2050 chunk.SetCellValueFast(num23, num21 - 1, num24, Terrain.MakeBlockValue(contents2));
2051 }
2052 }
2053 else if (num17 < 0.6f) {
2054 if (num22 == 0
2055 || num22 == 1) {
2056 chunk.SetCellValueFast(
2057 num23 + p2.X,
2058 num21 - 1,
2059 num24 + p2.Z,
2061 );
2062 chunk.SetCellValueFast(
2063 num23 - p2.X,
2064 num21 - 1,
2065 num24 - p2.Z,
2067 );
2068 }
2069 if (num22 == -1) {
2070 chunk.SetCellValueFast(num23, num21 - 1, num24, Terrain.MakeBlockValue(31, 0, CellFace.OppositeFace(num9)));
2071 }
2072 if (num22 == 2) {
2073 chunk.SetCellValueFast(num23, num21 - 1, num24, Terrain.MakeBlockValue(31, 0, num9));
2074 }
2075 }
2076 }
2077 break;
2078 IL_06ac: ;
2079 }
2080 }
2081 }
2082 }
2083
2085 for (int i = 0; i < 16; i++) {
2086 for (int j = 0; j < 16; j++) {
2087 int num = i + chunk.Origin.X;
2088 int num2 = j + chunk.Origin.Y;
2089 for (int num3 = 254; num3 >= 0; num3--) {
2090 int cellValueFast = chunk.GetCellValueFast(i, num3, j);
2091 int num4 = Terrain.ExtractContents(cellValueFast);
2092 if (num4 != 0) {
2093 if (!SubsystemWeather.IsPlaceFrozen(chunk.GetTemperatureFast(i, j), num3)) {
2094 break;
2095 }
2096 if (BlocksManager.Blocks[num4] is WaterBlock) {
2097 if (CalculateOceanShoreDistance(num, num2) > -20f) {
2098 float num5 = 1 + (int)(2f * MathUtils.Sqr(SimplexNoise.OctavedNoise(num, num2, 0.2f, 1, 2f, 1f)));
2099 for (int k = 0; k < num5; k++) {
2100 if (num3 - k > 0) {
2101 if (!(BlocksManager.Blocks[chunk.GetCellContentsFast(i, num3 - k, j)] is WaterBlock)) {
2102 break;
2103 }
2104 chunk.SetCellValueFast(i, num3 - k, j, 62);
2105 }
2106 }
2107 if (SubsystemWeather.ShaftHasSnowOnIce(num, num2)) {
2108 chunk.SetCellValueFast(i, num3 + 1, j, 61);
2109 }
2110 }
2111 }
2112 else if (SubsystemSnowBlockBehavior.CanSupportSnow(cellValueFast)) {
2113 chunk.SetCellValueFast(i, num3 + 1, j, 61);
2114 }
2115 if (num4 == 8) {
2116 chunk.SetCellValueFast(i, num3, j, Terrain.MakeBlockValue(8, 0, 1));
2117 }
2118 break;
2119 }
2120 }
2121 }
2122 }
2123 }
2124
2126 for (int i = 0; i < 16; i++) {
2127 for (int j = 0; j < 16; j++) {
2128 int num = TerrainChunk.CalculateCellIndex(i, 255, j);
2129 int num2 = 0;
2130 int num3 = 255;
2131 while (num3 >= 0) {
2132 int num4 = Terrain.ExtractContents(chunk.GetCellValueFast(num));
2133 if (num4 == 0
2134 && num2 != 0
2135 && BlocksManager.FluidBlocks[num2] != null) {
2136 chunk.SetCellValueFast(num, num2);
2137 num4 = num2;
2138 }
2139 num2 = num4;
2140 num3--;
2141 num--;
2142 }
2143 }
2144 }
2145 }
2146
2147 public virtual void UpdateFluidIsTop(TerrainChunk chunk) {
2148 for (int i = 0; i < 16; i++) {
2149 for (int j = 0; j < 16; j++) {
2150 int num = TerrainChunk.CalculateCellIndex(i, 255, j);
2151 int num2 = 0;
2152 int num3 = 255;
2153 while (num3 >= 0) {
2154 int cellValueFast = chunk.GetCellValueFast(num);
2155 int num4 = Terrain.ExtractContents(cellValueFast);
2156 if (num4 != num2
2157 && BlocksManager.FluidBlocks[num4] != null
2158 && BlocksManager.FluidBlocks[num2] == null) {
2159 int data = Terrain.ExtractData(cellValueFast);
2160 chunk.SetCellValueFast(num, Terrain.MakeBlockValue(num4, 0, FluidBlock.SetIsTop(data, true)));
2161 }
2162 num2 = num4;
2163 num3--;
2164 num--;
2165 }
2166 }
2167 }
2168 }
2169
2170 public static void CreateBrushes() {
2171 Random random = new(17);
2172 for (int i = 0; i < 16; i++) {
2173 TerrainBrush terrainBrush = new();
2174 int num = random.UniformInt(4, 12);
2175 for (int j = 0; j < num; j++) {
2176 Vector3 vector = 0.5f
2177 * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f)));
2178 int num2 = random.UniformInt(3, 8);
2179 Vector3 zero = Vector3.Zero;
2180 for (int k = 0; k < num2; k++) {
2181 terrainBrush.AddBox(
2182 (int)MathF.Floor(zero.X),
2183 (int)MathF.Floor(zero.Y),
2184 (int)MathF.Floor(zero.Z),
2185 1,
2186 1,
2187 1,
2188 16
2189 );
2190 zero += vector;
2191 }
2192 }
2193 if (i == 0) {
2194 terrainBrush.AddCell(0, 0, 0, 150);
2195 }
2196 terrainBrush.Compile();
2197 m_coalBrushes.Add(terrainBrush);
2198 }
2199 for (int l = 0; l < 16; l++) {
2200 TerrainBrush terrainBrush2 = new();
2201 int num3 = random.UniformInt(3, 7);
2202 for (int m = 0; m < num3; m++) {
2203 Vector3 vector2 = 0.5f
2204 * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f)));
2205 int num4 = random.UniformInt(3, 6);
2206 Vector3 zero2 = Vector3.Zero;
2207 for (int n = 0; n < num4; n++) {
2208 terrainBrush2.AddBox(
2209 (int)MathF.Floor(zero2.X),
2210 (int)MathF.Floor(zero2.Y),
2211 (int)MathF.Floor(zero2.Z),
2212 1,
2213 1,
2214 1,
2215 39
2216 );
2217 zero2 += vector2;
2218 }
2219 }
2220 terrainBrush2.Compile();
2221 m_ironBrushes.Add(terrainBrush2);
2222 }
2223 for (int num5 = 0; num5 < 16; num5++) {
2224 TerrainBrush terrainBrush3 = new();
2225 int num6 = random.UniformInt(4, 10);
2226 for (int num7 = 0; num7 < num6; num7++) {
2227 Vector3 vector3 = 0.5f
2228 * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-2f, 2f), random.UniformFloat(-1f, 1f)));
2229 int num8 = random.UniformInt(3, 6);
2230 Vector3 zero3 = Vector3.Zero;
2231 for (int num9 = 0; num9 < num8; num9++) {
2232 terrainBrush3.AddBox(
2233 (int)MathF.Floor(zero3.X),
2234 (int)MathF.Floor(zero3.Y),
2235 (int)MathF.Floor(zero3.Z),
2236 1,
2237 1,
2238 1,
2239 41
2240 );
2241 zero3 += vector3;
2242 }
2243 }
2244 terrainBrush3.Compile();
2245 m_copperBrushes.Add(terrainBrush3);
2246 }
2247 for (int num10 = 0; num10 < 16; num10++) {
2248 TerrainBrush terrainBrush4 = new();
2249 int num11 = random.UniformInt(8, 16);
2250 for (int num12 = 0; num12 < num11; num12++) {
2251 Vector3 vector4 = 0.5f
2253 new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-0.25f, 0.25f), random.UniformFloat(-1f, 1f))
2254 );
2255 int num13 = random.UniformInt(4, 8);
2256 Vector3 zero4 = Vector3.Zero;
2257 for (int num14 = 0; num14 < num13; num14++) {
2258 terrainBrush4.AddBox(
2259 (int)MathF.Floor(zero4.X),
2260 (int)MathF.Floor(zero4.Y),
2261 (int)MathF.Floor(zero4.Z),
2262 1,
2263 1,
2264 1,
2265 100
2266 );
2267 zero4 += vector4;
2268 }
2269 }
2270 terrainBrush4.Compile();
2271 m_saltpeterBrushes.Add(terrainBrush4);
2272 }
2273 for (int num15 = 0; num15 < 16; num15++) {
2274 TerrainBrush terrainBrush5 = new();
2275 int num16 = random.UniformInt(4, 10);
2276 for (int num17 = 0; num17 < num16; num17++) {
2277 Vector3 vector5 = 0.5f
2278 * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f)));
2279 int num18 = random.UniformInt(3, 6);
2280 Vector3 zero5 = Vector3.Zero;
2281 for (int num19 = 0; num19 < num18; num19++) {
2282 terrainBrush5.AddBox(
2283 (int)MathF.Floor(zero5.X),
2284 (int)MathF.Floor(zero5.Y),
2285 (int)MathF.Floor(zero5.Z),
2286 1,
2287 1,
2288 1,
2289 101
2290 );
2291 zero5 += vector5;
2292 }
2293 }
2294 terrainBrush5.Compile();
2295 m_sulphurBrushes.Add(terrainBrush5);
2296 }
2297 for (int num20 = 0; num20 < 16; num20++) {
2298 TerrainBrush terrainBrush6 = new();
2299 int num21 = random.UniformInt(2, 6);
2300 for (int num22 = 0; num22 < num21; num22++) {
2301 Vector3 vector6 = 0.5f
2302 * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f)));
2303 int num23 = random.UniformInt(3, 6);
2304 Vector3 zero6 = Vector3.Zero;
2305 for (int num24 = 0; num24 < num23; num24++) {
2306 terrainBrush6.AddBox(
2307 (int)MathF.Floor(zero6.X),
2308 (int)MathF.Floor(zero6.Y),
2309 (int)MathF.Floor(zero6.Z),
2310 1,
2311 1,
2312 1,
2313 112
2314 );
2315 zero6 += vector6;
2316 }
2317 }
2318 terrainBrush6.Compile();
2319 m_diamondBrushes.Add(terrainBrush6);
2320 }
2321 for (int num25 = 0; num25 < 16; num25++) {
2322 TerrainBrush terrainBrush7 = new();
2323 int num26 = random.UniformInt(4, 10);
2324 for (int num27 = 0; num27 < num26; num27++) {
2325 Vector3 vector7 = 0.5f
2326 * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f)));
2327 int num28 = random.UniformInt(3, 6);
2328 Vector3 zero7 = Vector3.Zero;
2329 for (int num29 = 0; num29 < num28; num29++) {
2330 terrainBrush7.AddBox(
2331 (int)MathF.Floor(zero7.X),
2332 (int)MathF.Floor(zero7.Y),
2333 (int)MathF.Floor(zero7.Z),
2334 1,
2335 1,
2336 1,
2337 148
2338 );
2339 zero7 += vector7;
2340 }
2341 }
2342 terrainBrush7.Compile();
2343 m_germaniumBrushes.Add(terrainBrush7);
2344 }
2345 for (int num30 = 0; num30 < 16; num30++) {
2346 TerrainBrush terrainBrush8 = new();
2347 int num31 = random.UniformInt(16, 32);
2348 for (int num32 = 0; num32 < num31; num32++) {
2349 Vector3 vector8 = 0.5f
2351 new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-0.75f, 0.75f), random.UniformFloat(-1f, 1f))
2352 );
2353 int num33 = random.UniformInt(6, 12);
2354 Vector3 zero8 = Vector3.Zero;
2355 for (int num34 = 0; num34 < num33; num34++) {
2356 terrainBrush8.AddBox(
2357 (int)MathF.Floor(zero8.X),
2358 (int)MathF.Floor(zero8.Y),
2359 (int)MathF.Floor(zero8.Z),
2360 1,
2361 1,
2362 1,
2363 2
2364 );
2365 zero8 += vector8;
2366 }
2367 }
2368 terrainBrush8.Compile();
2369 m_dirtPocketBrushes.Add(terrainBrush8);
2370 }
2371 for (int num35 = 0; num35 < 16; num35++) {
2372 TerrainBrush terrainBrush9 = new();
2373 int num36 = random.UniformInt(16, 32);
2374 for (int num37 = 0; num37 < num36; num37++) {
2375 Vector3 vector9 = 0.5f
2377 new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-0.75f, 0.75f), random.UniformFloat(-1f, 1f))
2378 );
2379 int num38 = random.UniformInt(6, 12);
2380 Vector3 zero9 = Vector3.Zero;
2381 for (int num39 = 0; num39 < num38; num39++) {
2382 terrainBrush9.AddBox(
2383 (int)MathF.Floor(zero9.X),
2384 (int)MathF.Floor(zero9.Y),
2385 (int)MathF.Floor(zero9.Z),
2386 1,
2387 1,
2388 1,
2389 6
2390 );
2391 zero9 += vector9;
2392 }
2393 }
2394 terrainBrush9.Compile();
2395 m_gravelPocketBrushes.Add(terrainBrush9);
2396 }
2397 for (int num40 = 0; num40 < 16; num40++) {
2398 TerrainBrush terrainBrush10 = new();
2399 int num41 = random.UniformInt(16, 32);
2400 for (int num42 = 0; num42 < num41; num42++) {
2401 Vector3 vector10 = 0.5f
2403 new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-0.75f, 0.75f), random.UniformFloat(-1f, 1f))
2404 );
2405 int num43 = random.UniformInt(6, 12);
2406 Vector3 zero10 = Vector3.Zero;
2407 for (int num44 = 0; num44 < num43; num44++) {
2408 terrainBrush10.AddBox(
2409 (int)MathF.Floor(zero10.X),
2410 (int)MathF.Floor(zero10.Y),
2411 (int)MathF.Floor(zero10.Z),
2412 1,
2413 1,
2414 1,
2415 66
2416 );
2417 zero10 += vector10;
2418 }
2419 }
2420 terrainBrush10.Compile();
2421 m_limestonePocketBrushes.Add(terrainBrush10);
2422 }
2423 for (int num45 = 0; num45 < 16; num45++) {
2424 TerrainBrush terrainBrush11 = new();
2425 int num46 = random.UniformInt(16, 32);
2426 for (int num47 = 0; num47 < num46; num47++) {
2427 Vector3 vector11 = 0.5f
2429 new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-0.1f, 0.1f), random.UniformFloat(-1f, 1f))
2430 );
2431 int num48 = random.UniformInt(6, 12);
2432 Vector3 zero11 = Vector3.Zero;
2433 for (int num49 = 0; num49 < num48; num49++) {
2434 terrainBrush11.AddBox(
2435 (int)MathF.Floor(zero11.X),
2436 (int)MathF.Floor(zero11.Y),
2437 (int)MathF.Floor(zero11.Z),
2438 1,
2439 1,
2440 1,
2441 72
2442 );
2443 zero11 += vector11;
2444 }
2445 }
2446 terrainBrush11.Compile();
2447 m_clayPocketBrushes.Add(terrainBrush11);
2448 }
2449 for (int num50 = 0; num50 < 16; num50++) {
2450 TerrainBrush terrainBrush12 = new();
2451 int num51 = random.UniformInt(16, 32);
2452 for (int num52 = 0; num52 < num51; num52++) {
2453 Vector3 vector12 = 0.5f
2455 new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-0.75f, 0.75f), random.UniformFloat(-1f, 1f))
2456 );
2457 int num53 = random.UniformInt(6, 12);
2458 Vector3 zero12 = Vector3.Zero;
2459 for (int num54 = 0; num54 < num53; num54++) {
2460 terrainBrush12.AddBox(
2461 (int)MathF.Floor(zero12.X),
2462 (int)MathF.Floor(zero12.Y),
2463 (int)MathF.Floor(zero12.Z),
2464 1,
2465 1,
2466 1,
2467 7
2468 );
2469 zero12 += vector12;
2470 }
2471 }
2472 terrainBrush12.Compile();
2473 m_sandPocketBrushes.Add(terrainBrush12);
2474 }
2475 for (int num55 = 0; num55 < 16; num55++) {
2476 TerrainBrush terrainBrush13 = new();
2477 int num56 = random.UniformInt(16, 32);
2478 for (int num57 = 0; num57 < num56; num57++) {
2479 Vector3 vector13 = 0.5f
2481 new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-0.75f, 0.75f), random.UniformFloat(-1f, 1f))
2482 );
2483 int num58 = random.UniformInt(6, 12);
2484 Vector3 zero13 = Vector3.Zero;
2485 for (int num59 = 0; num59 < num58; num59++) {
2486 terrainBrush13.AddBox(
2487 (int)MathF.Floor(zero13.X),
2488 (int)MathF.Floor(zero13.Y),
2489 (int)MathF.Floor(zero13.Z),
2490 1,
2491 1,
2492 1,
2493 67
2494 );
2495 zero13 += vector13;
2496 }
2497 }
2498 terrainBrush13.Compile();
2499 m_basaltPocketBrushes.Add(terrainBrush13);
2500 }
2501 for (int num60 = 0; num60 < 16; num60++) {
2502 TerrainBrush terrainBrush14 = new();
2503 int num61 = random.UniformInt(16, 32);
2504 for (int num62 = 0; num62 < num61; num62++) {
2505 Vector3 vector14 = 0.5f
2506 * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f)));
2507 int num63 = random.UniformInt(5, 10);
2508 Vector3 zero14 = Vector3.Zero;
2509 for (int num64 = 0; num64 < num63; num64++) {
2510 terrainBrush14.AddBox(
2511 (int)MathF.Floor(zero14.X),
2512 (int)MathF.Floor(zero14.Y),
2513 (int)MathF.Floor(zero14.Z),
2514 1,
2515 1,
2516 1,
2517 3
2518 );
2519 zero14 += vector14;
2520 }
2521 }
2522 terrainBrush14.Compile();
2523 m_granitePocketBrushes.Add(terrainBrush14);
2524 }
2525 int[] array = [4, 6, 8];
2526 for (int num65 = 0; num65 < 4 * array.Length; num65++) {
2527 TerrainBrush terrainBrush15 = new();
2528 int num66 = array[num65 / 4];
2529 int num67 = num65 % 2 + 1;
2530 float num68 = num65 % 4 == 2 ? 0.5f : 1f;
2531 bool circular = num65 % 4 >= 2;
2532 int num69 = num65 % 4 == 1 ? num66 * num66 : 2 * num66 * num66;
2533 for (int num70 = 0; num70 < num69; num70++) {
2534 Vector2 vector15 = random.UniformVector2(0f, num66, circular);
2535 float num71 = vector15.Length();
2536 int num72 = random.UniformInt(3, 4);
2537 int sizeY = 1 + (int)MathUtils.Lerp(MathUtils.Max(num66 / 3, 2.5f) * num68, 0f, num71 / num66) + random.UniformInt(0, 1);
2538 terrainBrush15.AddBox(
2539 (int)MathF.Floor(vector15.X),
2540 0,
2541 (int)MathF.Floor(vector15.Y),
2542 num72,
2543 sizeY,
2544 num72,
2545 0
2546 );
2547 terrainBrush15.AddBox(
2548 (int)MathF.Floor(vector15.X),
2549 -num67,
2550 (int)MathF.Floor(vector15.Y),
2551 num72,
2552 num67,
2553 num72,
2554 18
2555 );
2556 }
2557 terrainBrush15.Compile();
2558 m_waterPocketBrushes.Add(terrainBrush15);
2559 }
2560 int[] array2 = [8, 12, 14, 16];
2561 for (int num73 = 0; num73 < 4 * array2.Length; num73++) {
2562 TerrainBrush terrainBrush16 = new();
2563 int num74 = array2[num73 / 4];
2564 int num75 = num74 + 2;
2565 float num76 = num73 % 4 == 2 ? 0.5f : 1f;
2566 bool circular2 = num73 % 4 >= 2;
2567 int num77 = num73 % 4 == 1 ? num74 * num74 : 2 * num74 * num74;
2568 for (int num78 = 0; num78 < num77; num78++) {
2569 Vector2 vector16 = random.UniformVector2(0f, num74, circular2);
2570 float num79 = vector16.Length();
2571 int num80 = random.UniformInt(3, 4);
2572 int sizeY2 = 1 + (int)MathUtils.Lerp(MathUtils.Max(num74 / 3, 2.5f) * num76, 0f, num79 / num74) + random.UniformInt(0, 1);
2573 int num81 = 1 + (int)MathUtils.Lerp(num75, 0f, num79 / num74) + random.UniformInt(0, 1);
2574 terrainBrush16.AddBox(
2575 (int)MathF.Floor(vector16.X),
2576 0,
2577 (int)MathF.Floor(vector16.Y),
2578 num80,
2579 sizeY2,
2580 num80,
2581 0
2582 );
2583 terrainBrush16.AddBox(
2584 (int)MathF.Floor(vector16.X),
2585 -num81,
2586 (int)MathF.Floor(vector16.Y),
2587 num80,
2588 num81,
2589 num80,
2590 92
2591 );
2592 }
2593 terrainBrush16.Compile();
2594 m_magmaPocketBrushes.Add(terrainBrush16);
2595 }
2596 for (int num82 = 0; num82 < 7; num82++) {
2597 m_caveBrushesByType.Add([]);
2598 for (int num83 = 0; num83 < 3; num83++) {
2599 TerrainBrush terrainBrush17 = new();
2600 int num84 = 6 + 4 * num82;
2601 int max = 3 + num82 / 3;
2602 int max2 = 9 + num82;
2603 for (int num85 = 0; num85 < num84; num85++) {
2604 int num86 = random.UniformInt(2, max);
2605 int num87 = random.UniformInt(8, max2) - 2 * num86;
2606 Vector3 vector17 = 0.5f
2607 * new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(0f, 1f), random.UniformFloat(-1f, 1f));
2608 Vector3 zero15 = Vector3.Zero;
2609 for (int num88 = 0; num88 < num87; num88++) {
2610 terrainBrush17.AddBox(
2611 (int)MathF.Floor(zero15.X) - num86 / 2,
2612 (int)MathF.Floor(zero15.Y) - num86 / 2,
2613 (int)MathF.Floor(zero15.Z) - num86 / 2,
2614 num86,
2615 num86,
2616 num86,
2617 0
2618 );
2619 zero15 += vector17;
2620 }
2621 }
2622 terrainBrush17.Compile();
2623 m_caveBrushesByType[num82].Add(terrainBrush17);
2624 }
2625 }
2626 }
2627 }
2628}
Engine.Vector3 Vector3
static int Min(int x1, int x2)
static int Hash(int key)
static float Saturate(float x)
static float PowSign(float x, float n)
static int Max(int x1, int x2)
static int Sqr(int x)
static float Lerp(float x1, float x2, float f)
virtual bool IsTransparent_(int value)
virtual bool IsCollidable_(int value)
static FluidBlock[] FluidBlocks
static int SetSubvariant(int data, int face)
static int SetFace(int data, int face)
static int SetIsTop(int data, bool isTop)
static int SetVariant(int data, int variant)
static int SetRotation(int data, int rotation)
static int SetFace(int data, int face)
static bool IsGrowthStopCell(int x, int y, int z)
static int GenerateRandomPlantValue(Random random, int groundValue, int temperature, int humidity, int y)
static ReadOnlyList< TerrainBrush > GetTreeBrushes(TreeType treeType)
static ? TreeType GenerateRandomTreeType(Random random, int temperature, int humidity, int y, float densityMultiplier=1f)
static int GetTreeTrunkValue(TreeType treeType)
static int GetTreeLeavesValue(TreeType treeType)
static float OctavedNoise(float x, float frequency, int octaves, float frequencyStep, float amplitudeStep, bool ridged=false)
static int SetSpikesState(int data, bool spikesState)
static int SetRotation(int data, int rotation)
static Func< int, int, bool > ShaftHasSnowOnIce
static Func< int, int > GetTemperatureAdjustmentAtHeight
static Func< int, int, bool > IsPlaceFrozen
void AddBox(int x, int y, int z, int sizeX, int sizeY, int sizeZ, Brush brush)
void AddCell(int x, int y, int z, Brush brush)
static int CalculateCellIndex(int x, int y, int z)
virtual int GetCellValueFast(int index)
virtual void SetCellValueFast(int x, int y, int z, int value)
virtual int GetTemperatureFast(int x, int z)
virtual void SetHumidityFast(int x, int z, int humidity)
virtual void SetTemperatureFast(int x, int z, int temperature)
virtual int GetCellContentsFast(int x, int y, int z)
virtual int GetHumidityFast(int x, int z)
virtual int CalculateTopmostCellHeight(int x, int z)
void Get8(int x, int y, int z, out float v111, out float v211, out float v121, out float v221, out float v112, out float v212, out float v122, out float v222)
Vector3 UniformVector3(float minLength, float maxLength)
Vector2 UniformVector2(float minLength, float maxLength)
Vector3 Vector3(float length, bool spherical=false)
Vector2 UniformVector2(float minLength, float maxLength, bool circular=false)
Vector3 UniformVector3(float minLength, float maxLength, bool spherical=false)
Vector2 Vector2(float length, bool circular=false)
virtual void UpdateFluidIsTop(TerrainChunk chunk)
void GenerateSurfaceParameters(TerrainChunk chunk, int x1, int z1, int x2, int z2)
static List< List< TerrainBrush > > m_caveBrushesByType
TerrainContentsGenerator21(SubsystemTerrain subsystemTerrain)
SubsystemBottomSuckerBlockBehavior m_subsystemBottomSuckerBlockBehavior
void GenerateTerrain(TerrainChunk chunk, int x1, int z1, int x2, int z2)
static int ExtractContents(int value)
static int ReplaceData(int value, int data)
virtual int GetCellValueFast(int x, int y, int z)
virtual int GetHumidity(int x, int z)
virtual void SetCellValueFast(int x, int y, int z, int value)
static int ToCell(float x)
virtual int GetCellContentsFast(int x, int y, int z)
static int ReplaceContents(int value, int contents)
方块值的最低10位,替换为目标Content
static int MakeBlockValue(int contents)
static int ExtractData(int value)
virtual int CalculateTopmostCellHeight(int x, int z)
virtual int GetTemperature(int x, int z)
static int SetCutFace(int data, int cutFace)
virtual Subsystem FindSubsystem(Type type, string name, bool throwOnError)
static readonly Vector2 Zero
static Vector2 Round(Vector2 v)
static Vector2 Normalize(Vector2 v)
float LengthSquared()
static Vector3 Cross(Vector3 v1, Vector3 v2)
static Vector3 Normalize(Vector3 v)
static readonly Vector3 Zero
float LengthSquared()
static int OppositeFace(int face)
static Point3 FaceToPoint3(int face)
static int Point3ToFace(Point3 p, int maxFace=5)