diff --git a/HarmonySrc/NecroDevCommands.cs b/HarmonySrc/NecroDevCommands.cs index 5b1ffe5..4b494a1 100644 --- a/HarmonySrc/NecroDevCommands.cs +++ b/HarmonySrc/NecroDevCommands.cs @@ -152,6 +152,90 @@ namespace NecromancerTome ", очередь " + q + ", выход" + Stacks(ws.Output)); break; } + case "necrofill": + { + // necrofill x0 z0 x1 z1 y [блок] [соседей] - засыпать ямы рельефа на уровне y: пустую клетку, у которой рядом по + // уровню не меньше двух клеток земли, - землёй с полной плотностью; повторять, пока засыпается. + // Ровную землю рядом не поднимает (у неё на этом уровне соседи - воздух). 18.10: ямы в test8. + int x0 = int.Parse(_params[0]), z0 = int.Parse(_params[1]), x1 = int.Parse(_params[2]), z1 = int.Parse(_params[3]); + int fy = int.Parse(_params[4]); + Block fb = Block.GetBlockByName(_params.Count > 5 ? _params[5] : "terrForestGround", true); + int total = 0; + for (int pass = 0; pass < 20; pass++) + { + List fill = new List(); + for (int x = Mathf.Min(x0, x1); x <= Mathf.Max(x0, x1); x++) + { + for (int z = Mathf.Min(z0, z1); z <= Mathf.Max(z0, z1); z++) + { + Vector3i c = new Vector3i(x, fy, z); + if (!w.GetBlock(c).isair || w.GetBlock(c - Vector3i.up).isair) + { + continue; + } + int n = 0; + foreach (Vector3i d in new[] { Vector3i.forward, Vector3i.back, Vector3i.left, Vector3i.right }) + { + BlockValue nb = w.GetBlock(c + d); + if (!nb.isair && nb.Block != null && nb.Block.shape.IsTerrain()) + { + n++; + } + } + if (n >= (_params.Count > 6 ? int.Parse(_params[6]) : 2)) // седьмой параметр - сколько соседей-земли нужно (широкие ямы - 1) + { + fill.Add(c); + } + } + } + if (fill.Count == 0) + { + break; + } + foreach (Vector3i c in fill) + { + w.SetBlockRPC(c, fb.ToBlockValue(), MarchingCubes.DensityTerrain); + } + total += fill.Count; + } + Out("necrofill: засыпано клеток " + total); + break; + } + case "necrosmooth": + { + // necrosmooth x0 z0 x1 z1 y [плотность] - край насыпи скатом: клеткам земли на уровне y, у которых сбоку воздух, + // - неполная плотность (по умолчанию -30; полная земля -128), игра рисует их наклоном. + int x0 = int.Parse(_params[0]), z0 = int.Parse(_params[1]), x1 = int.Parse(_params[2]), z1 = int.Parse(_params[3]); + int sy = int.Parse(_params[4]); + sbyte dens = (sbyte)(_params.Count > 5 ? int.Parse(_params[5]) : -30); + List<(Vector3i, BlockValue)> edge = new List<(Vector3i, BlockValue)>(); + for (int x = Mathf.Min(x0, x1); x <= Mathf.Max(x0, x1); x++) + { + for (int z = Mathf.Min(z0, z1); z <= Mathf.Max(z0, z1); z++) + { + Vector3i c = new Vector3i(x, sy, z); + BlockValue bv = w.GetBlock(c); + if (bv.isair || bv.Block == null || !bv.Block.shape.IsTerrain() || !w.GetBlock(c + Vector3i.up).isair) + { + continue; + } + foreach (Vector3i d in new[] { Vector3i.forward, Vector3i.back, Vector3i.left, Vector3i.right }) + { + if (w.GetBlock(c + d).isair) + { + edge.Add((c, bv)); + break; + } + } + } + } + foreach ((Vector3i c, BlockValue bv) in edge) + { + w.SetBlockRPC(c, bv, dens); + } + Out("necrosmooth: краевых клеток " + edge.Count); + break; + } case "necrogod": God(pl, _params.Count == 0 || _params[0] != "off"); break; case "necroclick": // necroclick 0|1 [x y z] - по блоку под прицелом или по указанной клетке (луч не всегда попадает в низкий череп). @@ -513,4 +597,22 @@ namespace NecromancerTome public override bool AllowedInMainMenu => false; public override void Execute(List _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necrostation", _params); } + + [Preserve] + public class ConsoleCmdNecroFill : ConsoleCmdAbstract + { + public override string[] getCommands() => new[] { "necrofill" }; + public override string getDescription() => "NecromancerTome (разработка): засыпать ямы x0 z0 x1 z1 y [блок]"; + public override bool AllowedInMainMenu => false; + public override void Execute(List _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necrofill", _params); + } + + [Preserve] + public class ConsoleCmdNecroSmooth : ConsoleCmdAbstract + { + public override string[] getCommands() => new[] { "necrosmooth" }; + public override string getDescription() => "NecromancerTome (разработка): край насыпи скатом x0 z0 x1 z1 y [плотность]"; + public override bool AllowedInMainMenu => false; + public override void Execute(List _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necrosmooth", _params); + } } diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll index c3b7684..ceee007 100644 Binary files a/NecromancerHarmony.dll and b/NecromancerHarmony.dll differ diff --git a/NecromancerHarmony.pdb b/NecromancerHarmony.pdb index b7f1e06..71131df 100644 Binary files a/NecromancerHarmony.pdb and b/NecromancerHarmony.pdb differ