Add support for specifying channels in consoles

Although it doesn't work unless it receives an object signal
This commit is contained in:
Norbi Peti 2020-07-10 01:37:35 +02:00
parent 20cd8b7a50
commit 62a0c2d242

View file

@ -20,6 +20,7 @@ namespace BlockMod
{
private Block[] blocks = new Block[0];
private Block refBlock;
public void OnApplicationStart()
{
Main.Init();
@ -63,6 +64,7 @@ namespace BlockMod
RegisterBlockCommand("colorBlocks", "Colors the blocks you're looking at",
(color, darkness, blocks, refBlock) =>
{
if (!Enum.TryParse(color, true, out BlockColors clr))
{
Logging.CommandLogWarning("Color " + color + " not found");
@ -71,9 +73,10 @@ namespace BlockMod
foreach (var block in blocks)
block.Color = new BlockColor {Color = clr, Darkness = darkness};
});
CommandBuilder.Builder("selectBlocksLookedAt", "Selects blocks (1 or more) to change. Only works in build mode, however the blocks can be changed afterwards." +
" Paramter: whether one (true) or all connected (false) blocks should be selected.")
CommandBuilder.Builder("selectBlocksLookedAt",
"Selects blocks (1 or more) to change. Only works in build mode, however the blocks can be changed afterwards." +
" Paramter: whether one (true) or all connected (false) blocks should be selected.")
.Action<bool>(single =>
{
refBlock = new Player(PlayerType.Local).GetBlockLookedAt();
@ -91,10 +94,7 @@ namespace BlockMod
refBlock = blocks.Length > 0 ? blocks[0] : null;
}).Build();
ConsoleCommands.RegisterWithChannel("selectSendSignal", ch =>
{
}, ChannelType.Object,
ConsoleCommands.RegisterWithChannel("selectSendSignal", ch => { }, ChannelType.Object,
"Sends a signal for selecting a given object ID for a command block.");
RegisterBlockCommand("pushBlocks", "Adds velocity to the selected blocks. Only works in simulation.",
@ -121,7 +121,7 @@ namespace BlockMod
new Player(PlayerType.Local).AngularVelocity += new float3(x, y, z);
}).Build();
}
private string GetBlockInfo()
{
if (GameState.IsBuildMode())
@ -143,7 +143,8 @@ namespace BlockMod
$"- Rotation: {rot.x:F}° {rot.y:F}° {rot.z:F}°\n" +
$"- Color: {block.Color.Color} darkness: {block.Color.Darkness}\n" +
$"- Scale: {scale.x:F} {scale.y:F} {scale.z:F}\n" +
$"- Label: {block.Label}";
$"- Label: {block.Label}\n" +
$"- ID: {block.Id}";
}
private static string GetBodyInfoInSimMode()
@ -182,35 +183,94 @@ namespace BlockMod
return blocks;
}
private void RegisterBlockCommand(string name, string desc, Action<string, byte, Block[], Block> action)
private Block[] SelectBlocks(char id)
{
RuntimeCommands.Register<string, byte>(name, (a1, a2) =>
var blocks = ObjectIdentifier.GetByID(id).SelectMany(oid => oid.GetConnectedCubes())
.ToArray();
return blocks;
}
private void RegisterBlockCommandInternal(string name, string desc, Action<string, Block[], Block> action)
{
RuntimeCommands.Register<string>(name, a1 =>
{
if (CheckNoBlocks(blocks)) return;
action(a1, a2, blocks, refBlock);
action(a1, blocks, refBlock);
}, desc);
ConsoleCommands.RegisterWithChannel<string, byte>(name, (a1, a2, ch) =>
ConsoleCommands.RegisterWithChannel<string>(name, (a1, ch) =>
{
Console.WriteLine($"Command {name} with args {a1} and channel {ch} executing");
var blks = SelectBlocks(ch);
if (CheckNoBlocks(blks)) return;
action(a1, a2, blks, blks[0]);
action(a1, blks, blks[0]);
}, ChannelType.Object, desc);
}
private void RegisterBlockCommand(string name, string desc, Action<float, float, float, Block[], Block> action)
{
RuntimeCommands.Register<float, float, float>(name, (x, y, z) =>
{
if (CheckNoBlocks(blocks)) return;
action(x, y, z, blocks, refBlock);
},
desc);
ConsoleCommands.RegisterWithChannel<float, float, float>(name, (x, y, z, ch) =>
RegisterBlockCommandInternal(name, desc, (args, bs, b) =>
{
var blks = SelectBlocks(ch);
if (CheckNoBlocks(blks)) return;
action(x, y, z, blks, blks[0]);
}, ChannelType.Object, desc);
var argsa = args.Split(' ');
if (argsa.Length < 3)
{
Log.Error("Too few arguments. Needed arguments are: <x> <y> <z> and [id] is optional.");
return;
}
if (!float.TryParse(argsa[0], out float x) || !float.TryParse(argsa[1], out float y) ||
!float.TryParse(argsa[2], out float z))
{
Log.Error("Could not parse arguments as floats.");
return;
}
if (argsa.Length > 3)
{
if (argsa[3].Length == 0)
{
Log.Error("Missing channel.");
return;
}
var blocks = SelectBlocks(argsa[3][0]);
if (CheckNoBlocks(blocks)) return;
action(x, y, z, blocks, blocks[0]);
}
else if (!CheckNoBlocks(bs))
action(x, y, z, bs, b);
});
}
private void RegisterBlockCommand(string name, string desc, Action<string, byte, Block[], Block> action)
{
RegisterBlockCommandInternal(name, desc, (args, bs, b) =>
{
var argsa = args.Split(' ');
if (argsa.Length < 2)
{
Log.Error("Too few arguments. Needed arguments are: <color> <darkness> and [id] is optional.");
return;
}
if (!byte.TryParse(argsa[1], out byte darkness))
{
Log.Error("Could not parse color darkness.");
return;
}
if (argsa.Length > 2)
{
if (argsa[2].Length == 0)
{
Log.Error("Missing channel.");
return;
}
var blocks = SelectBlocks(argsa[2][0]);
if (CheckNoBlocks(blocks)) return;
action(argsa[0], darkness, blocks, blocks[0]);
}
else if(!CheckNoBlocks(bs))
action(argsa[0], darkness, bs, b);
});
}
public void OnApplicationQuit()