Seite 5 von 7

Re: [Komplett] Join-Schilder mit Java-Network und BungeeCord

BeitragVerfasst: Do 7. Aug 2014, 09:05
von Fastet
Bei mir steht die ganze Zeit "Pining..." auf dem Schild und nichts passiert :(. Ich habe alles genauso gemacht, wie du im Tutorial gezeigt hast.

Re: [Komplett] Join-Schilder mit Java-Network und BungeeCord

BeitragVerfasst: Do 7. Aug 2014, 13:20
von Summerfeeling
spaten0815 hat geschrieben:Bei mir steht die ganze Zeit "Pining..." auf dem Schild und nichts passiert :(. Ich habe alles genauso gemacht, wie du im Tutorial gezeigt hast.

Pingst du auch 100% einen Bukkit/Vanilla/Spigot/WhatEvent-Server an, und kein BungeeCord-Proxy?

Re: [Komplett] Join-Schilder mit Java-Network und BungeeCord

BeitragVerfasst: Do 7. Aug 2014, 13:56
von Fastet
Ja, ich pinge einen Bukkit Server an.

Re: [Komplett] Join-Schilder mit Java-Network und BungeeCord

BeitragVerfasst: Do 7. Aug 2014, 17:52
von Summerfeeling
spaten0815 hat geschrieben:Ja, ich pinge einen Bukkit Server an.

Schick uns mal deinen Code, vielleicht finden wir ja einen Fehler^^

Re: [Komplett] Join-Schilder mit Java-Network und BungeeCord

BeitragVerfasst: Do 7. Aug 2014, 17:56
von Fastet
Server-Klasse:

Code: Alles auswählen
  1. package de.FastetLP.KitPvPSigns;
  2. import java.io.DataOutputStream;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.net.InetSocketAddress;
  7. import java.net.Socket;
  8. import java.nio.charset.Charset;
  9. public class Server {
  10.    
  11.    private String host;
  12.    private int port;
  13.    
  14.    public Server(String host, int port) {
  15.       this.host = host;
  16.       this.port = port;
  17.    }
  18.    
  19.    public Server(String host) {
  20.       this.host = host;
  21.       this.port = 25565;
  22.    }
  23.    
  24.    public Server() {
  25.       this.host = "127.0.0.1";
  26.       this.port = 25565;
  27.    }
  28.    
  29.    public String parseData(Connection connection) {
  30.       try {
  31.          
  32.          @SuppressWarnings("resource")
  33.       Socket socket = new Socket();
  34.          OutputStream os;
  35.          DataOutputStream dos;
  36.          InputStream is;
  37.          InputStreamReader isr;
  38.          
  39.          socket.setSoTimeout(2500);
  40.          socket.connect(new InetSocketAddress(host, port));
  41.          
  42.          os = socket.getOutputStream();
  43.          dos = new DataOutputStream(os);
  44.          
  45.          is = socket.getInputStream();
  46.          isr = new InputStreamReader(is, Charset.forName("UTF-16BE"));
  47.          
  48.          dos.write(new byte[] { (byte) 0xFE, (byte) 0x01 });
  49.          
  50.          int packetID = is.read();
  51.          
  52.          if(packetID == -1) {
  53.             System.out.println("Invalid Packet ID! (End Of Stream)");
  54.          }
  55.          if(packetID != 0xFF) {
  56.             System.out.println("Invalid Packet Id! " + packetID);
  57.          }
  58.          
  59.          int length = isr.read();
  60.          
  61.          if(length == -1) {
  62.             System.out.println("End Of Stream");
  63.          }
  64.          
  65.          if(length == 0) {
  66.             System.out.println("Invalid length");
  67.          }
  68.          
  69.          char[] chars = new char[length];
  70.          
  71.          if(isr.read(chars, 0, length) != length) {
  72.             System.out.println("End Of Stream");
  73.          }
  74.          
  75.          String string = new String(chars);
  76.          String[] data = string.split("\0");
  77.          
  78.          if(connection == Connection.ONLINE_PLAYERS) {
  79.             return data[4];
  80.          } else if(connection == Connection.MOTD) {
  81.             return data[3];
  82.          } else if(connection == Connection.MAX_PLAYERS) {
  83.             return data[5];
  84.          } else {
  85.             System.out.println("Connection value not handled!");
  86.          }
  87.          
  88.       } catch (Exception e) {
  89.          
  90.       }
  91.       return null;
  92.    }
  93.    
  94.    public enum Connection {
  95.       ONLINE_PLAYERS, MAX_PLAYERS, MOTD
  96.    }
  97. }


Game-Klasse:

Code: Alles auswählen
  1. package de.FastetLP.KitPvPSigns;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import org.bukkit.Bukkit;
  5. import org.bukkit.Location;
  6. import org.bukkit.World;
  7. import org.bukkit.block.Sign;
  8. import org.bukkit.configuration.file.FileConfiguration;
  9. import org.bukkit.configuration.file.YamlConfiguration;
  10. import org.bukkit.entity.Player;
  11. import org.bukkit.event.EventHandler;
  12. import org.bukkit.event.Listener;
  13. import org.bukkit.event.block.SignChangeEvent;
  14. import org.bukkit.plugin.java.JavaPlugin;
  15. import de.FastetLP.KitPvPSigns.Server.Connection;
  16. public class Game extends JavaPlugin implements Listener {
  17.    
  18.    public static String prefix = "§7[§6KitPvP§7]§3 ";
  19.    
  20.    public static Game instance;
  21.       
  22.       public Game() {
  23.          instance = this;
  24.       }
  25.       
  26.       public static Game getInstance() {
  27.          return instance;
  28.       }
  29.       
  30.       public static File locFile = new File("plugins/KitPvPSigns", "Locations.yml");
  31.       public static FileConfiguration locCfg = YamlConfiguration.loadConfiguration(locFile);
  32.    @Override
  33.    public void onDisable() {
  34.       
  35.    }
  36.    @Override
  37.    public void onEnable() {
  38.       getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
  39.       Bukkit.getPluginManager().registerEvents(this, this);
  40.       Bukkit.getPluginManager().registerEvents(new ClickListener(), this);
  41.       updateSign();
  42.    }
  43.       
  44.     @EventHandler
  45.       public void onSignChange(SignChangeEvent e) {
  46.          Player p = e.getPlayer();
  47.          Location loc = e.getBlock().getLocation();
  48.          if(e.getLine(0).toLowerCase().contains("[join]")) {
  49.              locCfg.set("loc.sign.X", loc.getX());
  50.              locCfg.set("loc.sign.Y", loc.getY());
  51.              locCfg.set("loc.sign.Z", loc.getZ());
  52.              locCfg.set("loc.sign.World", loc.getWorld().getName());
  53.             
  54.              e.setLine(0, "§4§l");
  55.              e.setLine(1, "§4§lPinging");
  56.              e.setLine(2, "§4§l...");
  57.              e.setLine(3, "§4§l");
  58.              try {
  59.                 locCfg.save(locFile);
  60.                 p.sendMessage(prefix + "§aSchild erstellt");
  61.              } catch (IOException e1) {
  62.                 p.sendMessage(prefix + "§cSchild NICHT erstellt");
  63.                 e1.printStackTrace();
  64.              }
  65.           }
  66.       }
  67.    
  68.     public void updateSign() {
  69.          Bukkit.getScheduler().runTaskTimerAsynchronously(this, new Runnable() {
  70.            
  71.             @Override
  72.             public void run() {
  73.                double x = locCfg.getDouble("loc.sign.X");
  74.                double y = locCfg.getDouble("loc.sign.Y");
  75.                double z = locCfg.getDouble("loc.sign.Z");
  76.                World w = Bukkit.getWorld(locCfg.getString("loc.sign.World"));
  77.               
  78.                Location loc = new Location(w, x, y, z);
  79.               
  80.                Sign s = (Sign) loc.getBlock().getState();
  81.               
  82.                Server server = new Server((Game.locCfg.getString("Server." + s.getLine(1) + ".IP")));
  83.               
  84.                s.setLine(3, server.parseData(Connection.ONLINE_PLAYERS) + "/500");
  85.                s.setLine(2, server.parseData(Connection.MOTD));
  86.               
  87.                if(s.getLine(2).equalsIgnoreCase("null")) {
  88.                   s.setLine(0, "§4§l");
  89.                   s.setLine(1, "§4§lOFFLINE");
  90.                   s.setLine(2, "§4§l- / -");
  91.                   s.setLine(3, "§4§l");
  92.                   s.update();
  93.                } else if (!s.getLine(2).equalsIgnoreCase("null")){
  94.                   s.setLine(0, "§7[Join]");
  95.                   s.setLine(1, "Map");
  96.                   s.setLine(2, "§2" + server.parseData(Connection.MOTD));
  97.                   s.setLine(3, "§f" + server.parseData(Connection.ONLINE_PLAYERS) + "/500");
  98.                   s.update();
  99.                }
  100.             }
  101.             
  102.          }, 100L, 10L);
  103.       }
  104. }


ClickListener:

Code: Alles auswählen
  1. package de.FastetLP.KitPvPSigns;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import org.bukkit.block.Sign;
  6. import org.bukkit.entity.Player;
  7. import org.bukkit.event.EventHandler;
  8. import org.bukkit.event.Listener;
  9. import org.bukkit.event.block.Action;
  10. import org.bukkit.event.player.PlayerInteractEvent;
  11. public class ClickListener implements Listener {
  12.    
  13.    @EventHandler
  14.       public void onClick(PlayerInteractEvent e) {
  15.          if(e.getAction() == Action.RIGHT_CLICK_BLOCK) {
  16.             if(e.getClickedBlock().getState() instanceof Sign) {
  17.                Player p = e.getPlayer();
  18.                Sign s = (Sign) e.getClickedBlock().getState();
  19.                ByteArrayOutputStream b = new ByteArrayOutputStream();
  20.                DataOutputStream out = new DataOutputStream(b);
  21.                if(s.getLine(0).equalsIgnoreCase("[join]")) {
  22.                   e.getPlayer().sendMessage("Verbinde zu Server...");
  23.                   try {
  24.                      out.writeUTF("Connect");
  25.                      out.writeUTF("85.131.184.27:25565");
  26.                   } catch (IOException ioe) {
  27.                      ioe.printStackTrace();
  28.                   }
  29.                   p.sendPluginMessage(Game.getInstance(), "BungeeCord", b.toByteArray());
  30.                }
  31.             }
  32.          }
  33.       }
  34.     }

Re: [Komplett] Join-Schilder mit Java-Network und BungeeCord

BeitragVerfasst: Di 30. Sep 2014, 13:51
von ilouHD
Ein Special-Feature dazu:


Ein Hoch auf PHP und meine Kenntnisse, die ich seit paar Wochen besitze. Ich will euch hier nun noch zeigen - da es ja zum Thema passt - wie man mit Hilfe von PHP einen Server ganz einfach anpingen kann. Wir können dann die MOTD, die MAXPLAYERS und die ONLINEPLAYERS GETTEN. Durch eine weitere einfache abfrage, können wir dann auch ganz einfach gucken ob der Server online ist. Also fangen wir mit dem 1. Thema an - Ist der Server online?

--------------------------------------------------

Um zu gucken, ob ein Server online ist, erstellen wir uns am besten eine neue Datei. Bei mir pinge ich einen BungeeCord-Proxy an, um zu gucken, ob dieser online ist. Ich nenne die Datei einfach mal 'BungeeCord.php'. In diese schreiben wir diesen Code hinein:
Code: Alles auswählen
  1. <?php
  2.      $server = "127.0.0.1";
  3.      $port = "25565";
  4.      $timeout = "10";
  5.    
  6.      if ($server and $port and $timeout) {
  7.      $minecraft= @fsockopen("$server",$port,$timeout);
  8.      }
  9.      if($minecraft) {
  10.       echo("ONLINE");
  11.      }
  12.      else {
  13.       echo("OFFLINE");
  14.      }
  15. ?>


Erläuterung: Wir erstellen uns in PHP - wie auch in Java - 3 Variablen: 'server' (Die IP des Servers), 'port' (Der Port des Servers) und 'timeout' (Integer des Connection-Timeouts in Sekunden). Danach öffnen wir eine Verbindung und erstellen uns dabei die Variable 'minecraft', die wir dann wie einen boolean in Java abfragen. Ist dieser auf 'true', so geben wir über 'echo(STRING);' 'ONLINE' als Status aus. Ansonsten geben wir 'OFFLINE' als Status aus.

Mehr gibt es auch nicht zu tun, um den ONLINE-Status ausgeben zu lassen. Nun zum anderen Teil - wie lassen uns ONLINE_PLAYERS, MAX_PLAYERS, und MOTD ausgeben:

--------------------------------------------------

In diesem Falle erstelle ich mir ebenfalls eine neue Datei. ich nenne sie 'SimpleMinecraftQuery.php'. Da fügen wir diesen Code ein, der nicht von mir stammt. Daher BITTE 1:1 übernehmen, sonst bekommt ihr Stress mit dem Entwickler, und das wollt ihr, der Autor, und ich auch nicht:
Code: Alles auswählen
  1. <?php
  2. /* Minecraft Query Class
  3. * @author prog266
  4. * @license GPLv3
  5. */
  6. class SimpleMinecraftQuery {
  7.    
  8.    private $socket;
  9.    private $handle;
  10.    public $info;
  11.    
  12.    public function query($hostname, $port) {
  13.       $socket = @fsockopen("tcp://" . $hostname, $port, $errno, $errstr, 5);
  14.       
  15.       if(!($socket)) {
  16.          return false;
  17.       }
  18.    
  19.       fwrite($socket, "\xFE");
  20.       $handle = fread($socket, 80000000);
  21.       $handle = substr($handle, 2);
  22.       $info = explode("\xA7", $handle);
  23.       return $info;
  24.    }
  25. }
  26. ?>

Haben wir das geschafft, können wir auch hier einen Server anpingen:
Code: Alles auswählen
  1. <?php
  2.    require('SimpleMinecraftQuery.php');
  3.    $info = SimpleMinecraftQuery::query("127.0.0.1", 25561);
  4.    echo "Es sind " . $info[1] . "/" . $info[2] . " Players Online!";
  5. ?>


Hier ganz einfach:
Wir pingen einen Server an. Dabei geben wir bei
Code: Alles auswählen
  1. $info = SimpleMinecraftQuery::query("127.0.0.1", 25561);

IP (HIER: "127.0.0.1") und Port (HIER: 25561) an. Nun können wir über 'echo(STRING);' uns wieder eine Nachricht ausgeben lassen. Dabei verwenden wir
  • $info[0] für die MOTD
  • $info[1] für die Aktuelle Spieleranzahl
  • $info[2] für die Maximale Spieleranzahl

--------------------------------------------------

Ich hoffe ich konnte euch helfen, eure Webseite ein bisschen zu verschönern.

Mit freundlichen Grüßen,
ilouHD

PS: Wenn ihr sehen wollt, wie man das machen kann, könnt ihr ab ~16.00 Uhr auf dieser Seite hier sehen:
http://clashcraft.cwsurf.de/ilouHD/ServerInfo

//EDIT: Webseite ist Online!

//EDIT 2: Die Methode funktioniert auch bei MySQL-Servern oder auch BungeeCord-Servern - also sollte man daraus schließen können, dass es bei (fast) jedem Server funktioniert.

Re: [Komplett] Join-Schilder mit Java-Network und BungeeCord

BeitragVerfasst: Fr 3. Okt 2014, 19:47
von Howaner
Wow, das ist noch für die 1.6.
Außerdem hast du wohl noch nicht viel Erfahrung in PHP (Der Port ist bei dir ein String ???)

Re: [Komplett] Join-Schilder mit Java-Network und BungeeCord

BeitragVerfasst: Fr 3. Okt 2014, 20:25
von ilouHD
Howaner hat geschrieben:Wow, das ist noch für die 1.6.
Außerdem hast du wohl noch nicht viel Erfahrung in PHP (Der Port ist bei dir ein String ???)


Ähhhm, ja. Erfahrung in PHP - Ich arbeite dran.

Die eigentliche Anleitung ist mehr oder weniger Java-Basiert und nicht Bukkit-Basiert. Daher sollte das auch in der Minecraft 1.0 Alpha funktionieren. Du setzt später nur die Infos auf Schidler, und das ist dann Bukkit-Abhängig - genauso wie die Scheduler. Die könnte man aber auch Java-Basiert erstellen.

Re: [Komplett] Join-Schilder mit Java-Network und BungeeCord

BeitragVerfasst: Fr 3. Okt 2014, 20:46
von Jofkos
ilouHD hat geschrieben:er nicht von mir stammt. Daher BITTE 1:1 übernehmen, sonst bekommt ihr Stress mit dem Entwickler, und das wollt ihr, der Autor, und ich auch nicht:
PHP code gelangt nie an den enduser. Wie sollte also irgendjemand etwas von einer Änderung mitbekommen, wo der Code doch vom Server interpretiert wird? :?

Re: [Komplett] Join-Schilder mit Java-Network und BungeeCord

BeitragVerfasst: Sa 4. Okt 2014, 08:27
von ilouHD
Jofkos hat geschrieben:
ilouHD hat geschrieben:er nicht von mir stammt. Daher BITTE 1:1 übernehmen, sonst bekommt ihr Stress mit dem Entwickler, und das wollt ihr, der Autor, und ich auch nicht:
PHP code gelangt nie an den enduser. Wie sollte also irgendjemand etwas von einer Änderung mitbekommen, wo der Code doch vom Server interpretiert wird? :?


Ehhhm, ja. Dass man den php-Code nicht sieht ist mir auch schon aufgefallen. Is nun aber auch egal. Trotzdem Danke für den Hinweis.

Aber es wäre schon schlau das zu kopieren, dann hat man es nämlich und muss nicht selber etwas schreiben.