2013-10-25 64 views
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函數逐個字包含消息。

這工作,但我覺得這是一個有點變通。

我要的是一個命令的基礎設施(有點像我的世界),這是很容易適應我的需要。就像在我的世界裏,你可以輸入:「/ tp 1000 64 1000」和「/ tp someplayer 1000 64 1000」。在我的代碼中,你不能受到我的限制。我將不得不做一個新的方法「tp2」或某些東西能夠採取額外的參數。

我希望有人能幫助我解決這個問題,因爲它是非常惱人的。

b.t.w.我使用.Net 4.5.1來編程。如果我在某個地方有點模糊,請問我,我會澄清。

翁Dokter

回答

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)... 
} 
0

我的兩分錢,一致認爲String.Split是有點麻煩,如果你的性格分裂使得它成爲一個命令,所以我說使用XML結構;

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

此外,根據遊戲(多人連接到同一臺服務器?)使用多個端口,你甚至可以爲同一個客戶使用不同功能的多個端口(遊戲中,如果遊戲是足夠複雜保證)。這將幫助你分離你的命令邏輯。

但最終,你被卡住解析什麼命令進入,爲你的遊戲棒有意義的字符串名稱的調試階段,在部署之前,你可以減少這些下降到相同的幾個字節。

至於確定用戶的文本輸入爲命令,像你這樣的命令有/tp,那麼String.Split,建議強制第一個參數是必需的參數,然後是可選參數。並且在個人記錄中,鍵入命令,然後應該顯示參數列表,用戶然後'鍵入'以幫助他們

0

我的建議是:不要使用字符串。如果你不得不使用序列化。所以你可以發送任何對象。此外,如果你的問題是關於您希望能夠發送不同的參數號(它有點難以猜測你正在做什麼,在這裏)使用PARAMS關鍵字

public void DoSomething (string command, params string[] paramters) { 
// Whatever 
} 
+0

謝謝大家的快速回答!但是如果我不使用字符串,那麼怎麼做呢? – Geoxion

0

我告訴你一種我們內部做到的方式。 我們做了一個叫做RemoteInvoke的js proc。它需要一個命令和一系列參數並將它們發送到服務器。然後,服務器將採取命令和查找通過反射的方法,這是:命名爲命令

  • [RemoteInvocable]屬性
  • 是公開
  • 當初的觀點的權利數量這將

    1. 被類型匹配英寸

    原因是,當我想打電話的東西,我打電話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 
    } 
    

    的一點是:當命令處理很棘手,但同樣的一切 - 只是一堆反射和類型推斷的,但一旦完成添加新命令或具有相同名稱和不同參數的多個命令是微不足道的。

  • 相關問題