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