2013-04-06 2 views
1

Я пытаюсь создать графический интерфейс для размещения серверов Minecraft CraftBukkit в C#. Серверы CraftBukkit размещены с помощью .jar, исходный код которого можно найти здесь: https://github.com/Bukkit/CraftBukkit/.Поймать нестандартный вывод из файла .jar

До сих пор я могу получить выход из него и внести свой вклад в это так:

var serverProcInfo = new ProcessStartInfo("javaw", 
                "-jar -Xms" + Ram + "M -Xmx" + Ram + "M \"" + 
                JarFileLocation + "\" -nojline " + AdditionalParams) 
      { 
       RedirectStandardInput = true, 
       RedirectStandardOutput = true, 
       RedirectStandardError = true, 
       UseShellExecute = false 
      }; 

     serverProc = new Process {StartInfo = serverProcInfo }; 

     serverProc.OutputDataReceived += ServerOutputDataReceived; 
     serverProc.ErrorDataReceived += ServerOutputDataReceived; 

     serverProc.BeginOutputReadLine(); 
     serverProc.BeginErrorReadLine(); 
     serverProc.WaitForExit(); 

Я хочу, чтобы создать список всех игроков, которые в настоящее время онлайн.

Когда игрок присоединяется к сообщению, подобному этому, выводится player <playername> has joined the server. Я знаю, что я мог бы разделить эту строку и получить имя игрока, но я думаю, что это не очень хорошо, так как кто-то может сказать что-то подобное в чате, и моя программа может интерпретировать его так, как будто кто-то присоединился к серверу.

Я видел, что другие программы делают это («BukkitGUI»), но я не уверен, как я мог это сделать. Выводит ли файл .jar список игроков? Что я должен искать в своем исходном коде, чтобы узнать, что он выводит?

Я относительно новичок в C# и никогда не изучал Java. Любая помощь будет оценена по достоинству.

EDIT1: Я обнаружил, что CraftBukkit.jar имеет класс вроде этого:

@SuppressWarnings("unchecked") 
public Player[] getOnlinePlayers() { 
    List<EntityPlayer> online = playerList.players; 
    Player[] players = new Player[online.size()]; 

    for (int i = 0; i < players.length; i++) { 
     players[i] = online.get(i).playerConnection.getPlayer(); 
    } 
    return players; 
} 

Есть ли способ, я могу назвать этот класс?

ответ

0

Я нахожу решение этого. На самом деле это довольно просто.

Сначала я создаю процесс, который запустит файл .jar. Тогда я сделать следующее:

Process.OutputDataReceived += ServerOutputHandler.ServerOutputReceived; 
Process.ErrorDataReceived += ServerOutputHandler.ServerOutputReceived; 

и после того, как я начала процесса (Process.Start):

Process.BeginOutputReadLine(); 
Process.BeginErrorReadLine(); 

Если вы хотите узнать больше о работе с .jar файлы, не стесняйтесь, чтобы взглянуть на мой проект с открытым исходным кодом (я отказался от него некоторое время назад) ServerCrafter. Для части исходного кода, где я делаю код, о котором я упоминал выше, посмотрите здесь: Server Crafter source code: ServerCrafter\ServerCrafter.ClassLibrary\ClassLibrary\Server\Server.cs

1

К сожалению, межпроцессное взаимодействие между Java и C# не так просто. Лучше всего либо отправить команду списка на сервер, либо проанализировать вывод, либо если вы захотите написать некоторую java, вы можете создать плагин для сервера minecraft, который откроет сокет и отправит информацию туда и обратно.

+0

Да, к сожалению, это единственный способ, но спасибо за ваш ответ. – davidwroxy

Смежные вопросы