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

Hier könnt ihr anderen Leuten helfen, indem ihr Anleitungen oder praktische Codesegmente zur Verfügung stellt.

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

Beitragvon Fastet » Do 7. Aug 2014, 09:05

Bei mir steht die ganze Zeit "Pining..." auf dem Schild und nichts passiert :(. Ich habe alles genauso gemacht, wie du im Tutorial gezeigt hast.
Benutzeravatar
Fastet
 
Beiträge: 11
Registriert: Do 7. Aug 2014, 09:01

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

Beitragvon Summerfeeling » Do 7. Aug 2014, 13:20

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?
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

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

Beitragvon Fastet » Do 7. Aug 2014, 13:56

Ja, ich pinge einen Bukkit Server an.
Benutzeravatar
Fastet
 
Beiträge: 11
Registriert: Do 7. Aug 2014, 09:01

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

Beitragvon Summerfeeling » Do 7. Aug 2014, 17:52

spaten0815 hat geschrieben:Ja, ich pinge einen Bukkit Server an.

Schick uns mal deinen Code, vielleicht finden wir ja einen Fehler^^
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

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

Beitragvon Fastet » Do 7. Aug 2014, 17:56

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.     }
Benutzeravatar
Fastet
 
Beiträge: 11
Registriert: Do 7. Aug 2014, 09:01

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

Beitragvon ilouHD » Di 30. Sep 2014, 13:51

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.
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

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

Beitragvon Howaner » Fr 3. Okt 2014, 19:47

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 ???)
Benutzeravatar
Howaner
 
Beiträge: 34
Registriert: Di 18. Mär 2014, 14:01

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

Beitragvon ilouHD » Fr 3. Okt 2014, 20:25

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.
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

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

Beitragvon Jofkos » Fr 3. Okt 2014, 20:46

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? :?
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

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

Beitragvon ilouHD » Sa 4. Okt 2014, 08:27

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.
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

VorherigeNächste

Zurück zu Anleitungen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron