Wie setze/bekomme ich die Spieleranzahl, die maximale Spieleranzahl, Map und den State vom CS?

 In diesem Artikel solle es darum gehen wie man bei CloudSystem von DevCubeHD den State bzw allgemein die Informationen eines Servers ändern kann.

Als erstes Poste ich hier mal die Standardmethode die wir brauchen rein damit ihr diese habt:

public void sendSignMessage(int players, int maxplayers, String newstate, String newmap) {
        Ping ping = new Ping()
        {
            public JsonObject ping()
            {
                JsonObject packet = new JsonObject();

                packet.addProperty("packet", "PING");
                packet.addProperty("players", Integer.valueOf(players));
                packet.addProperty("maxplayers", Integer.valueOf(maxplayers));
                packet.addProperty("status", newstate);
                packet.addProperty("motd", CloudSystemCore.getMotD());
                packet.addProperty("map", newmap);

                return packet;
            }
        };
        NetManager.setPing(ping);
    }

 

 Wenn ihr diese in euer Projekt hinzugefügt habt, werdet ihr merken das eure IDE keinen NetManager hat.

Dieses Objekt/Klasse bekommt ihr wenn ihr aus dem pfad/zum/wrapper/wrapper/servers/plugins/CloudSystemCore-NEPTUN-1.0.5.jar in eurem Projekt rein packt.

Also einfach runterladen und wie die Spigot in euer Projekt importieren.

!!!Wenn ihr maven nutzt müsst ihr dieses Plugin auf eure/eine Repo laden von wo ihr die Dependencies runterladen könnt!!!

Sobald ihr das Importiert habt sollte hier auch kein Fehler mehr auftauchen.

Die Methode packt ihr am besten in eure Main-Klasse (extends JavaPlugin) damit sie leicht von über all geladen werden kann.

Nun wollen wir ein Minispiel schreiben welches nach starten den State „Lobby“ bekommt und die Aktuelle Map übergeben.

Dies machen wir einfach in de onEnable-Methode:

 

 public void onEnable(){

sendSignMessage(getServer().getOnlinePlayers().size(), getServer().getMaxPlayers(), "Lobby", getServer().getWorlds().get(0).getName());
}

 

Damit erhält unser Server jetzt beim %map% Parameter den Welt namen der Ersten Welt.

Hier also bei getWorlds().get(<int>) an der stelle <int>, wenn man mit Multiworld oder Multiverse ne Map geladen hat die 1 rein schreiben,statt ne 0.

Die 2 ersten Parameter, und der letzte bleiben in der Regel gleich außer du willst das auf den Schildern nicht die max Anzahl an Spielern steht, damit Admins noch als Spectator joinen können etc.

Nun wollen wir sobald die Lobbyphase beendet ist, das das Schild verschwindet, also führen wir im Countdown, der die Phase einleitet, wo das Schild verschwinden soll, einmal die folgende Methode aus:

 

private void hideServer(){
Main.main.sendSignMessage(0,0,"Ingame","");
}

 

Die Methode sollte in der selben Klasse wie der Countdown sein.

Nun nur noch schauen, das auch in pfad/zum/wrapper/wrapper/servers/<group>/plugins/CloudSystemCore/Config.yml im sortout der State „Ingame“ drin ist.

Wenn das alles ist, sollte sobald der Countdown die Methode aus führt auch das Schild in der Lobby verschwinden.

!!!Wichtig nur der Server verschwindet vom Schild, wenn keine weiteren Server an sind, die auf noch keinem Schild sind und noch in der Lobby-Phase erscheint die Loading Animation, sonst der nächste Server der noch auf keinen Schild ist.!!!

Sobald wieder Platz ist für einen Server und der Server neugestartet hat taucht dieser auch wieder auf.

!!!Dir wird in der Console angezeigt das die Ping Klasse nicht gefunden wurde? ganz einfach in deine plugin.yml den wert: „depend: [CloudSystemCore]“ hinzufügen dann sollte es klappen.

Fehler die Anzahl der Spieler wird auf dem Schild nicht geupdatet, dieser Fehler lässt sich ganz leicht beheben in dem man  im PlayerJoinEvent die selbe Methode ausführt wie im onEnable teil und im PlayerQuitEvent bloß das man die Size um 1 reduzieren muss. Also so:

@EventHandler
public void onJoin(PlayerJoinEvent event){
if(GameState.getState().equals(GameState.LOBBY)
Main.main.sendSignMessage(getServer().getOnlinePlayers().size(), getServer().getMaxPlayers(), "Lobby", getServer().getWorlds().get(0).getName());
}

@EventHandler
public void onQuit(PlayerQuitEvent event){
if(GameState.getState().equals(GameState.LOBBY)
Main.main.sendSignMessage(getServer().getOnlinePlayers().size()-1, getServer().getMaxPlayers(), "Lobby", getServer().getWorlds().get(0).getName());
}

 

 

//Part 2 Bekommen von den Daten Nachtrag am 14.05.17

 

Als erstes gebe ich euch mal den Code:

public TreeMap<String, ServerObject> get(){
    return SignSystemManager.getServers();
  }
  
  public ArrayList<ServerObject> getArrayList(){
    ArrayList<ServerObject> serverObjects = new ArrayList<ServerObject>();
    get().keySet().stream().forEach(k->{
      serverObjects.add(get().get(k));
    });
    return serverObjects;
  }
  
  public ServerObject getServer(String key){
             return get().get(key);
         }

diese Methoden am besten Zentral in der Main abspeichern, damit ihr überall drauf zugreifen könnt.

 

Damit holt ihr alle Server die grade laufen
und wenn ihr wollt könnt ihr euch mit der 2 Methode einen bestimmten Server holen.

nun zeige ich euch noch wie man die Daten bekommt:

public void test(){
    int max = getArrayList().get(0).getMaxPlayers();
    String group = getArrayList().get(0).getGroup();
    String map = getArrayList().get(0).getMap();
    String motd = getArrayList().get(0).getMotD();
    String name = getArrayList().get(0).getName();
    int akt = getArrayList().get(0).getPlayers();
    Signobject sign = getArrayList().get(0).getSignObject();
    String state = getArrayList().get(0).getStatus();
  }

so hier ist jz das Bsp. für den ersten gestarteten Server.
Wie ihr seht können wir die Max Spieleranzahl auslesen, die Group, die Map, die MotD, den Namen, die Aktuellen Spieleranzahl, das Schild und den Status vom Server
und mit diesen Werten könnt ihr dann arbeiten.

und so könnt ihr auch mit den Daten anstellen was ihr wollt.

//Weitere Hilfe

Falls du sonst ein Problem mit der Cloud hast oder Hilfe beim Installieren brauchst hat Galatheas eine super Guide dafür geschrieben den du hier findest.

10
0

Schreibe einen Kommentar