2

简而言之:我正在为我正在开发的游戏制作服务器程序。为了控制服务器,我想使用命令。类似“/Server Start 5555”的东西。这些命令以字符串格式发送到服务器。这是我的代码:

ServerCommandsClass ServerCommands = new ServerCommandsClass();
Type Service = typeof(ServerCommandsClass);
MethodInfo method = Service.GetMethod(Signals[Count].MessageArray[0]);

List<object> ObjectList = new List<object>();
for (int i = 1; i < Signals[Count].MessageArray.Length; i++)
{
    ObjectList.Add(Signals[Count].MessageArray[i]);
}

string result = Convert.ToString(method.Invoke(ServerCommands, ObjectList.ToArray()));

它看起来很乱,因为它是...

基本上我得到的是一个存储新消息/命令的类(SignalClass)。首先,我确定消息是否是命令。如果是这样,则运行此代码。我的 MessageArray 使用 string.split 函数逐字包含消息。

这行得通,但我觉得这是一种解决方法。

我想要的是一个命令基础设施(有点像我的世界),它很容易适应我的需要。就像在 minecraft 中一样,您可以输入:“/tp 1000 64 1000”和“/tp someplayer 1000 64 1000”。由于我的代码的限制,在我的情况下你不能。我将不得不创建一个新方法“tp2”或其他能够采用该额外参数的方法。

我希望有人可以帮助我解决这个问题,因为它很烦人。

顺便说一句,我使用 .Net 4.5.1 对此进行了编程。如果我在某个地方有点模糊,请问我,我会澄清。

迪翁·多克特

4

4 回答 4

0

当然可以,问题不在于您发布的代码,而在于您正在调用的方法。你想要做的基本上是超载。

/tp x y z

/tp someplaya x y z

与 String.Substring(0) 和 String.Substring(0, 5) 没有什么不同。如果你赶上我的漂移。

所以,我想你的方法看起来像这样:

public static void Teleport(params object[])
{
   //here you validate your parameters and take decisions
   //e.g.
   //if(params[0] is String && params[1] is Int32)...
}
于 2013-10-25T12:56:08.287 回答
0

我的两分钱,同意 String.Split 如果您的拆分字符使其成为命令有点麻烦,所以我说使用 XML 结构;

<Command>
<CommandName value="">
<Arg1 value="">
<Arg2 value="">etc...
</Command>

此外,根据游戏(多人连接到同一服务器?)使用多个端口,即使对于同一个客户端,您也可以将多个端口用于游戏中的不同功能(如果游戏足够复杂以保证这一点)。这将帮助您隔离命令逻辑。

但最终,您仍需解析传入的命令,因为游戏的调试阶段坚持使用有意义的字符串名称,在部署之前您可以将它们减少到相同的几个字节。

至于确定用户 text-entry-as-command,像你这样的命令/tp,然后是 String.Split,建议强制第一个参数是必需参数,然后是可选参数。就个人而言,键入的命令应显示参数列表,然后用户“键入”以帮助他们

于 2013-10-25T12:57:13.610 回答
0

我的建议是:不要使用字符串。

如果必须,可以使用序列化。所以你可以发送任何对象。此外,如果您的问题是您希望能够发送不同数量的参数(在这里很难猜出您在做什么),请使用 params-keyword

public void DoSomething (string command, params string[] paramters) {
// Whatever
}
于 2013-10-25T12:58:09.890 回答
0

我告诉你我们在内部做这件事的一种方式。我们制作了一个名为 RemoteInvoke 的 js proc。它需要一个命令和一组参数并将它们发送到服务器。然后,服务器将接受命令并通过反射寻找一种方法,即:

  1. 以命令命名
  2. [RemoteInvocable]属性
  3. 是公开的
  4. 具有正确数量的类型匹配的参数。

原因是当我想调用某些东西时,我会调用 RemoteInvoke,它将参数发送到服务器。要添加新命令,我可以这样做:

[RemoteInvocable]
public void Tp(double x, double y, double z)
{
    Tp("default", x, y, z);
}

[RemoteInvocable]
public void Tp(string location, double x, double y, double z)
{
   // whatever
}

关键是命令处理很棘手,但对所有事情都是一样的——只是一堆反射和类型推断,但是一旦添加一个新命令或多个具有相同名称和不同参数的命令就变得微不足道了。

于 2013-10-25T13:26:11.253 回答