public float ApplyArmorProtection(float attackPower) { float num = m_random.UniformFloat(0f, 1f); ClothingSlot slot = (num < 0.1f) ? ClothingSlot.Feet : ((num < 0.3f) ? ClothingSlot.Legs : ((num < 0.9f) ? ClothingSlot.Torso : ClothingSlot.Head)); float num2 = ((MekClothingBlock)BlocksManager.Blocks[1011]).Durability + 1; List <int> list = new List <int>(GetClothes(slot)); for (int i = 0; i < list.Count; i++) { int value = list[i]; MekClothData clothingData = MekClothingBlock.GetClothingData(Terrain.ExtractData(value)); float x = (num2 - (float)BlocksManager.Blocks[1011].GetDamage(value)) / num2 * clothingData.Sturdiness; float num3 = MathUtils.Min(attackPower * MathUtils.Saturate(clothingData.ArmorProtection), x); if (num3 > 0f) { attackPower -= num3; if (m_subsystemGameInfo.WorldSettings.GameMode != 0) { float x2 = num3 / clothingData.Sturdiness * num2 + 0.001f; int damageCount = (int)(MathUtils.Floor(x2) + (float)(m_random.Bool(MathUtils.Remainder(x2, 1f)) ? 1 : 0)); list[i] = BlocksManager.DamageItem(value, damageCount); } if (!string.IsNullOrEmpty(clothingData.ImpactSoundsFolder)) { m_subsystemAudio.PlayRandomSound(clothingData.ImpactSoundsFolder, 1f, m_random.UniformFloat(-0.3f, 0.3f), m_componentBody.Position, 4f, 0.15f); } } } int num4 = 0; while (num4 < list.Count) { if (Terrain.ExtractContents(list[num4]) != 1011) { list.RemoveAt(num4); m_subsystemParticles.AddParticleSystem(new BlockDebrisParticleSystem(m_subsystemTerrain, m_componentBody.Position + m_componentBody.BoxSize / 2f, 1f, 1f, Color.White, 0)); } else { num4++; } } SetClothes(slot, list); return(MathUtils.Max(attackPower, 0f)); }
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); } } } }
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); } }
public override void Load(ValuesDictionary valuesDictionary) { base.Load(valuesDictionary); Utils.Load(Project); //Utils.SubsystemItemsScanner.ItemsScanned += GarbageCollectItems; var arr = valuesDictionary.GetValue("AlloysData", "0").Split(','); AlloysData = new DynamicArray <Metal>(arr.Length); int i; for (i = 0; i < arr.Length; i++) { if (short.TryParse(arr[i], NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out short value)) { AlloysData.Add((Metal)value); } } SmallBrushes = new TerrainBrush[16]; PtBrushes = new TerrainBrush[16]; BBrushes = new TerrainBrush[16]; ABrushes = new TerrainBrush[16]; //NaruralGasBrushes = new TerrainBrush[16]; OilPocketCells = new TerrainBrush.Cell[16][]; //MinCounts = new int[12, 16]; var random = new Random(17034); TerrainBrush brush; int j, k; for (i = 0; i < 16; i++) { brush = new TerrainBrush(); Vector3 v, vec; for (j = random.Int() & 1; j-- != 0;) { v = 0.5f * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f))); vec = Vector3.Zero; for (k = random.UniformInt(2, 5); k-- != 0;) { brush.AddBox((int)MathUtils.Floor(vec.X), (int)MathUtils.Floor(vec.Y), (int)MathUtils.Floor(vec.Z), 1, 1, 1, 1); //Ag vec += v; } } brush.Compile(); SmallBrushes[i] = brush; brush = new TerrainBrush(); for (j = random.UniformInt(1, 3); j-- != 0;) { v = 0.5f * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-2f, 2f), random.UniformFloat(-1f, 1f))); vec = Vector3.Zero; for (k = random.UniformInt(2, 3); k-- != 0;) { brush.AddBox((int)MathUtils.Floor(vec.X), (int)MathUtils.Floor(vec.Y), (int)MathUtils.Floor(vec.Z), 1, 1, 1, 2); //Pt vec += v; } } brush.Compile(); PtBrushes[i] = brush; brush = new TerrainBrush(); for (j = random.UniformInt(2, 4); j-- != 0;) { v = 0.5f * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-0.25f, 0.25f), random.UniformFloat(-1f, 1f))); vec = Vector3.Zero; for (k = random.UniformInt(3, 5); k-- != 0;) { brush.AddBox((int)MathUtils.Floor(vec.X), (int)MathUtils.Floor(vec.Y), (int)MathUtils.Floor(vec.Z), 1, 1, 1, 8); //Ti vec += v; } } brush.Compile(); ABrushes[i] = brush; brush = new TerrainBrush(); for (j = random.UniformInt(3, 5); j-- != 0;) { v = 0.5f * Vector3.Normalize(new Vector3(random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f), random.UniformFloat(-1f, 1f))); vec = Vector3.Zero; for (k = random.UniformInt(2, 5); k-- != 0;) { brush.AddBox((int)MathUtils.Floor(vec.X), (int)MathUtils.Floor(vec.Y), (int)MathUtils.Floor(vec.Z), 1, 1, 1, 5); //Sn vec += v; } } brush.Compile(); BBrushes[i] = brush; var cells = TerrainContentsGenerator.m_basaltPocketBrushes[i].Cells; OilPocketCells[i] = new TerrainBrush.Cell[j = cells.Length]; while (j-- != 0) { if ((cells[j].Value & random.Int()) != 0) { OilPocketCells[i][j] = cells[j]; OilPocketCells[i][j].Value = RottenMeatBlock.Index | 1 << 4 << 14; } } } }