public static void Mountain(Point3 Start, int Radius, int Size, SubsystemTerrain subsystemTerrain, int id, int id1, int id2, ComponentPlayer player) { Task.Run(() => { Game.Random random = new Game.Random(); double num1 = Math.PI / 2.0; float num2 = (float)Size + 0.8f; int num3 = 0; double num4 = 10.0; double num5 = 15.0; float num6 = random.UniformFloat((float)num4, (float)num5) + 10f; for (int index1 = -Radius; index1 < Radius; ++index1) { for (int index2 = -Radius; index2 < Radius; ++index2) { double num7 = Math.Cos(num1 * (double)index1 / (double)Radius) * Math.Cos(num1 * (double)index2 / (double)Radius) * (double)num2; double num8 = Math.Sin(num1 * (double)index1 * 1.39999997615814 / (double)Radius + 4.0) * Math.Cos(num1 * (double)index2 * 1.39999997615814 / (double)Radius + 7.0) * (double)num2 * 0.25; double num9 = Math.Cos(num1 * (double)index1 * 1.39999997615814 * 2.0 / (double)Radius + 4.0 * (double)num6) * Math.Sin(num1 * (double)index2 * 1.39999997615814 * 2.0 / (double)Radius + 8.0 * (double)num6) * (double)num2 * 0.200000002980232; double num10 = Math.Sin(num1 * (double)index1 * 1.39999997615814 * 4.0 / (double)Radius + 4.0 * (double)num6 * 1.5) * Math.Sin(num1 * (double)index2 * 1.39999997615814 * 4.0 / (double)Radius + 8.0 * (double)num6 * 1.5) * (double)num2 * 0.150000005960464; double num11 = num8; double num12 = num7 - num11 + num9 - num10; if (num12 > 0.0) { for (int index3 = 0; (double)index3 <= num12; ++index3) { if (index3 > 3) { subsystemTerrain.ChangeCell(Start.X + index1, Start.Y + (int)num12 - index3, Start.Z + index2, id, true); ++num3; } else if (index3 > 0) { subsystemTerrain.ChangeCell(Start.X + index1, Start.Y + (int)num12 - index3, Start.Z + index2, id1, true); ++num3; } else if (index3 == 0) { subsystemTerrain.ChangeCell(Start.X + index1, Start.Y + (int)num12, Start.Z + index2, id2, true); ++num3; } } } } } player.ComponentGui.DisplaySmallMessage(string.Format("Sucsses {0} place blocks", num3), true, true); }); }
public void DropAllItems(Vector3 position) { Game.Random random = new Game.Random(); SubsystemPickables subsystemPickables = base.Project.FindSubsystem <SubsystemPickables>(throwOnError: true); for (int i = 0; i < SlotsCount; i++) { int slotCount = GetSlotCount(i); if (slotCount > 0) { int slotValue = GetSlotValue(i); int count = RemoveSlotItems(i, slotCount); Vector3 value = random.UniformFloat(5f, 10f) * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(1f, 2f), random.UniformFloat(-1f, 1f))); subsystemPickables.AddPickable(slotValue, count, position, value, null); } } }
public void generateMineralLikeCoal(TerrainChunk chunk, int value, int replacevalue, int minHeight, int maxHeight) //生成矿物算法-类似煤的生成概率 { int cx = chunk.Coords.X; int cy = chunk.Coords.Y; List <TerrainBrush> terrainBrushes = new List <TerrainBrush>(); Game.Random random = new Game.Random(17); for (int i = 0; i < 16; i++) {//煤块的生成概率 TerrainBrush terrainBrush = new TerrainBrush(); int num = random.UniformInt(4, 12); for (int j = 0; j < num; j++) { Vector3 vector = 0.5f * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f))); int num2 = random.UniformInt(3, 8); Vector3 zero = Vector3.Zero; for (int k = 0; k < num2; k++) { terrainBrush.AddBox((int)MathUtils.Floor(zero.X), (int)MathUtils.Floor(zero.Y), (int)MathUtils.Floor(zero.Z), 1, 1, 1, value); zero += vector; } } if (i == 0) { terrainBrush.AddCell(0, 0, 0, 150); } terrainBrush.Compile(); terrainBrushes.Add(terrainBrush); } for (int i = cx - 1; i <= cx + 1; i++) { for (int j = cy - 1; j <= cy + 1; j++) { float num2 = CalculateMountainRangeFactor(i * 16, j * 16); int num3 = (int)(5f + 2f * num2 * SimplexNoise.OctavedNoise(i, j, 0.33f, 1, 1f, 1f)); for (int l = 0; l < num3; l++) { int x2 = i * 16 + random.UniformInt(0, 15); int y2 = random.UniformInt(minHeight, maxHeight); int cz = j * 16 + random.UniformInt(0, 15); terrainBrushes[random.UniformInt(0, terrainBrushes.Count - 1)].PaintFastSelective(chunk, x2, y2, cz, replacevalue); } } } }
/*private Vector2? islandSize; * * private static float TGSurfaceMultiplier; * public bool TGWater; * public bool TGExtras; * public bool TGCavesAndPockets;*/ public CreatorNormalTerrain(SubsystemTerrain subsystemTerrain) { this.subsystemTerrain = subsystemTerrain; this.subsystemBottomSuckerBlockBehavior = subsystemTerrain.Project.FindSubsystem <SubsystemBottomSuckerBlockBehavior>(true); SubsystemGameInfo subsystemGameInfo = subsystemTerrain.Project.FindSubsystem <SubsystemGameInfo>(true); this.worldSettings = subsystemGameInfo.WorldSettings; this.worldSeed = subsystemGameInfo.WorldSeed; OldRandom oldRandom = new OldRandom(100 + this.worldSeed); Game.Random random = new Game.Random(this.worldSeed); float num = float.MaxValue; this.oceanCorner = new Vector2(random.UniformFloat(-100f, -100f), random.UniformFloat(-100f, -100f)); this.temperatureOffset = new Vector2(random.UniformFloat(-2000f, 2000f), random.UniformFloat(-2000f, 2000f)); this.humidityOffset = new Vector2(random.UniformFloat(-2000f, 2000f), random.UniformFloat(-2000f, 2000f)); this.mountainsOffset = new Vector2(random.UniformFloat(-2000f, 2000f), random.UniformFloat(-2000f, 2000f)); this.riversOffset = new Vector2(random.UniformFloat(-2000f, 2000f), random.UniformFloat(-2000f, 2000f)); this.TGNewBiomeNoise = true; this.TGBiomeScaling = 2.5f * this.worldSettings.BiomeSize; this.TGShoreFluctuations = MathUtils.Clamp(2f * num, 0f, 150f); this.TGShoreFluctuationsScaling = MathUtils.Clamp(0.04f * num, 0.5f, 3f); this.TGOceanSlope = 0.006f; this.TGOceanSlopeVariation = 0.004f; this.TGIslandsFrequency = 0.01f; this.TGDensityBias = 55f; this.TGHeightBias = 1f; this.TGRiversStrength = 3f; this.TGMountainsStrength = 125f; this.TGMountainsPeriod = 0.0015f; this.TGMountainsPercentage = 0.15f; this.TGHillsStrength = 8f; this.TGTurbulenceStrength = 35f; this.TGTurbulenceTopOffset = 0f; this.TGTurbulencePower = 0.3f; TerrainContentsGenerator.TGSurfaceMultiplier = 2f; /*this.TGWater = true; * this.TGExtras = true; * this.TGCavesAndPockets = true;*/ }
public override void Update() { this.num_1.Text = $"参数1 :{(int)num1.Value}"; this.num_2.Text = $"参数2 :{(int)num2.Value}"; this.num_3.Text = $"参数3 :{(int)num3.Value}"; if (this.restting.IsClicked) { this.num1.Value = 0f; this.num2.Value = 0f; this.num3.Value = 100f; this.TextBox.Text = "3:2:8"; } if (this.cancelButton.IsClicked) { DialogsManager.HideDialog(this); } if (this.OK.IsClicked) { int BlockID_1; int? BlockID_2 = null, BlockID_3 = null; string[] texts = TextBox.Text.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (texts.Length == 2) { if (!int.TryParse(texts[0], out BlockID_1)) { BlockID_1 = 0; } int id; if (int.TryParse(texts[1], out id)) { BlockID_2 = id; } } else if (texts.Length >= 3) { if (!int.TryParse(texts[0], out BlockID_1)) { BlockID_1 = 0; } int id; if (int.TryParse(texts[1], out id)) { BlockID_2 = id; } if (int.TryParse(texts[2], out id)) { BlockID_3 = id; } } else { if (!int.TryParse(TextBox.Text, out BlockID_1)) { BlockID_1 = 0; } } Vector3 vector = new Vector3 { X = num1.Value, Y = num2.Value, Z = num3.Value }; Point3 Start = creatorAPI.Position[0]; Point3 End = creatorAPI.Position[1]; CreatorMain.Math.StartEnd(ref Start, ref End); float X_Radius = (Start.X - End.X) / 2f; float Z_Radius = (Start.Z - End.Z) / 2f; float Radius = X_Radius > Z_Radius ? X_Radius : Z_Radius; float radius = X_Radius > Z_Radius ? Z_Radius : X_Radius; Radius = Math.Abs(Math.Abs(Radius) - 2f + vector.X); if (BlockID_2 == null) { BlockID_2 = BlockID_1; } if (BlockID_3 == null) { BlockID_3 = BlockID_2; } Task.Run(() => { ChunkData chunkData = new ChunkData(this.creatorAPI); creatorAPI.revokeData = new ChunkData(this.creatorAPI); Game.Random random = new Game.Random(); double pi = Math.PI * 0.5f; int number = 0; float num = 1.25f + (vector.Y / 99f); float rand = random.UniformFloat(18f, 25f + (vector.Z / 10f)); for (int x = (int)-X_Radius; x <= (int)X_Radius; x++) { for (int z = (int)-Z_Radius; z <= Z_Radius; z++) { var a = (Math.Cos(pi * x / Radius) * Math.Cos(pi * z / radius)) * (Start.Y - End.Y); var b = (Math.Sin(pi * x * num / radius + 2f) * Math.Cos(pi * z * num / Radius + 7f)) * (Start.Y - End.Y) * 0.35f; var c = (Math.Sin(pi * x * num * 2f / Radius + 2f * rand) * Math.Sin(pi * z * num * 2f / radius + 8f * rand)) * (Start.Y - End.Y) * 0.2f; var e = (Math.Sin(pi * x * num * 3.5f / radius + 2f * rand * 1.5f) * Math.Sin(pi * z * num * 3.5f / Radius + 12f * rand * 1.5f)) * (Start.Y - End.Y) * 0.15f; var ls = a - b + c - e; if (ls > 0f) { for (var i = 0; i <= ls; i++) { Point3 point3 = new Point3((Start.X + End.X) / 2 + x, End.Y + (int)ls - i, (Start.Z + End.Z) / 2 + z); if (i > 5) { creatorAPI.CreateBlock(point3, BlockID_1, chunkData); } else if (i > 0) { creatorAPI.CreateBlock(point3, (int)BlockID_2, chunkData); } else if (i == 0) { creatorAPI.CreateBlock(point3, (int)BlockID_3, chunkData); } number++; if (!creatorAPI.launch) { return; } } } } } chunkData.Render(); this.player.ComponentGui.DisplaySmallMessage($"操作成功,共生成{number}个方块", true, true); }); DialogsManager.HideDialog(this); } }
void AddHakoRandom() { Vector2Int[] _candi = new Vector2Int[Data.Size.x * Data.Size.y]; int _maxCount = 0; int[] _typeCount = new int[] { 0, 0, 0, 0, 0, 0 }; // 出現位置は:まず、外周以外にランダム。 for (int x = 1; x < Data.Size.x - 1; x++) { for (int y = 1; y < Data.Size.y - 1; y++) { if (HakoManaer.Instance.Map[x, y] < 0) { _candi[_maxCount] = new Vector2Int(x, y); _maxCount++; } else { _typeCount[(int)HakoManaer.Instance.Hakos[HakoManaer.Instance.Map[x, y]].Type]++; } } } // 出現位置は:つぎに、外周にランダム。 if (_maxCount <= 0) { Vector2Int _start = Vector2Int.zero; for (int i = 0; i < 4; i++) { Vector2Int _dir = HakoManaer.Instance.DirVector(InputManager.GetIntToDir(i)); int _max = i % 2 == 0?Data.Size.y - 1:Data.Size.x - 1; for (int j = 0; j < _max; j++) { Vector2Int _target = _start + _dir * j; if (HakoManaer.Instance.Map[_target.x, _target.y] < 0) { _candi[_maxCount] = _target; _maxCount++; } else { _typeCount[(int)HakoManaer.Instance.Hakos[HakoManaer.Instance.Map[_target.x, _target.y]].Type]++; } } _start += _dir * _max; } } if (_maxCount > 0) { HakoType _type = 0; int _typeRandom = 0; for (int i = 1; i < 5; i++) { _typeRandom += (Data.MaxHakos - _typeCount[i]); } _typeRandom = Random.Range(0, _typeRandom - 1); for (int i = 1; i < 5; i++) { _typeRandom -= (Data.MaxHakos - _typeCount[i]); if (_typeRandom < 0) { _type = HakoManaer.Instance.GetIntToType(i); break; } } Vector2Int _pos = _candi[Random.Range(0, _maxCount)]; HakoManaer.Instance.AddHako(_type, _pos, 1.0f / Data.AppearTimes[Level]); } }