因此,我制作的机器人将启动/停止/更新我的Unturned 3.0服务器(Unity),而无需与我的Windows专用服务器进行交互。就在它的位置,我设法让服务器启动。我想将控制台的StandardOutput重定向到我的c#控制台应用程序,这样我就可以向discord发送消息说服务器在线并开始接受命令(比如列出在线玩家),但是我无法通过这一个障碍。每当我尝试重定向标准输出时,我得到的只是
Mono path[0] = 'E:/SteamCMD/servers/rust/RustDedicated_Data/Managed'
Mono path[1] = 'E:/SteamCMD/servers/rust/RustDedicated_Data/Mono'
Mono config path = 'E:/SteamCMD/servers/rust/RustDedicated_Data/Mono/etc'
之后,打开的未修改控制台或我的c#控制台应用程序(服务器仍然正常启动)中不会显示任何文本。我一直在谷歌试图找到有类似问题的人,但是我发现的最接近的人要求我调用统一功能,而我的程序是第三方程序,它与团结没有联系(超出它开始统一游戏服务器的事实。)
这是我目前的代码,但是我已经经历了这么多次迭代,试图找到一些有用的东西,这不是唯一的代码(我已经在这里完成了这个代码)现在没有运气的一天)
using Discord.WebSocket;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameBot
{
static class StartUnturned
{
private static IniFile ini = iniSettings.gamebotIni();
internal static async void startNewInstance(string serverName)
{
var t = new Task(() =>
{
Process p = new Process();
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = ini.IniReadValue("unturned", "installdirectory") + @"\Unturned.exe";
p.StartInfo.Arguments = "-logFile \"Servers\\" + serverName + "\\Rocket\\Unturned.log\" -nographics -batchmode -silent-crashes +secureserver/" + serverName;
p.EnableRaisingEvents = true;
p.OutputDataReceived += new DataReceivedEventHandler((s, e) => {
Console.WriteLine(e.Data);
});
p.ErrorDataReceived += new DataReceivedEventHandler((s, e) => {
Console.WriteLine(e.Data);
});
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();
while (p.StandardOutput.ReadToEnd() != null)
{
Console.WriteLine(p.StandardOutput.ReadToEnd());
}
});
await Task.Run(() =>
{
t.Start();
});
}
}
}
private static IniFile ini = iniSettings.gamebotIni();
是一个写入/读取我很久以前在网上找到的ini文件的类,这只用于获取Unturned.exe的起始路径(目前{{1} })
此外,我正在使用任务,因为我计划一次运行多个这些服务器,并希望根据传递的服务器名称单独与它们进行交互(即,在不和谐中,工作人员可以键入{{1}它将列出pvp上的玩家)。如果有更好的方法,我完全愿意接受建议。