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