• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Schilder zum joinen

1X_GamerHD1

Minecrafter
Registriert
11 Februar 2017
Beiträge
4
Alter
30
Diamanten
250
Hallo Leute,

Ich bin neu im bereich programmieren und hab da ein Problem.
Also wie im Titel steht versuche ich Schilder zu Programmieren wo wenn man drauf klickt tele portiert wird.
Es funktioniert auch alles. Aber ich habe auf den Schild noch eine Anzeige wie viele gerade in der Welt sind.
Mein Problem ist: Wenn jemand den Server verlässt soll das auf den Schild auch passieren.
Es passiert auch, aber es wird nicht upgedatet (also auf den Schild angezeigt) .
Also wenn jetzt 2 Dort sind und einer verlässt steht immer noch 2 dort, wenn man nochmal drauf geht und wieder verlässt steht immer noch 2 dort.

Also ich muss das Schild updaten, was ich aber nicht hin bekomme.
Ich habe es schon mit sign.update(); gemacht aber ich muss halt (sign) noch für das Event registrieren. Hab bloß keinen Plan wie das geht.




Hier mein Code:

(Die HashMap)
public static HashMap<String, Integer> Lobby = new HashMap<String, Integer>();

@EventHandler
public void onQuit(PlayerQuitEvent e) {
Player p = e.getPlayer();

if(Lobby.containsKey(p.getName())) {
Lobby.remove(p.getName());
sign.update();
}
}

Hoffe mir hilft jemand. :D
MFG 1X_GamerHD1
 

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
Verwende bei Speicherungen nicht den Namen der Spieler. Dieser kann sich ändern. Jeder Spieler besitzt eine eindeutige ID: player.getUniqueId() vom Datentyp UUID.

Diese Schilder solltest du über ihre Koordinaten (Location) speichern.
Du kommst dann mit "blockState = location.getBlock().getBlockState();" an das Schild ran. Du prüfst dann zunächst, ob an der Stelle sich noch ein Schild befindet "if (blockState instanceof Sign)" und führst dann eine Typkonvertierung durch: "Sign sign = (Sign) blockState;"
 

1X_GamerHD1

Minecrafter
Registriert
11 Februar 2017
Beiträge
4
Alter
30
Diamanten
250
Hi,

Ich glaube es hat alles geklappt, aber der Spieler wird irgendwie nicht von der HashMap entfernt oder irgendwas anderes ist falsch.

Fehlermeldungen bekomme ich nicht.

public static HashMap<String, Integer> Lobby = new HashMap<String, Integer>();
private Block location = Bukkit.getWorld("Lobby").getBlockAt(-21, 17, 150);

}
@EventHandler
public void onQuit(PlayerQuitEvent e) {
Player p = e.getPlayer();

BlockState bs = location.getState();
if(bs instanceof Sign) {
Sign sign = (Sign) bs;

if(Lobby.containsKey(p.getName())) {
Lobby.remove(p.getName());
sign.update();
}
}
}
 
Zuletzt bearbeitet:
F

Figz

Guest
Versuch es doch mal mit der UUID, wie es dir schon vorher geraten wurde.

HashMap<UUID, Integer> Lobby = new HashMap<>();

EDIT: Sorry, dies wird wohl wahrscheinlich wenig hilfreich sein, das Problem ist, dass deine Fehlerbeschreibung ziemlich schlecht ist...
Du glaubst es habe alles geklappt, was hat nun geklappt? Das konvertieren der Location bis zum Schild inklusive updaten des Schildes? Oder updatet das Schild immernoch nicht?
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
Kann es sein, dass du mit "sign.update()" zwar dein Schild updatest, aber keine Sachen an dem Schild selbst änderst?
Ich erkenne zwar die Überprüfung, ob der Spieler in der Map drin ist, aber keine Methode bzw. keinen Codeteil, der dem Schild eine neue Zeile zuweist.

Achso - bitte benenne doch deine HashMap noch in "lobby" um. Auch wenn du das Plugin nur für dich schreibst, sind Java Konventionen eine sinnvolle Sache. Nicht, dass du irgendwann nach einer Klasse suchst, welche "Lobby.java" heißt ;)
 

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
Im Spawnbereich wird dein Plugin so funktionieren, Schilder, die sich in ungeladenen Chunks befinden, würden aber Exceptions auslösen.
Hier kannst du entweder prüfen, ob der Chunk mit den Schild geladen ist oder die Location des Schildes speichern, nicht den Block.
Ein location.getBlock() oder ein world.getBlockAt() lösen ein Laden des betroffenen Chunks aus. Spätere Zugriffe auf die Methoden aber nicht.
 

ausgbildet

Minecrafter
Registriert
22 November 2016
Beiträge
3
Alter
28
Diamanten
0
Verwende bei Speicherungen nicht den Namen der Spieler. Dieser kann sich ändern. Jeder Spieler besitzt eine eindeutige ID: player.getUniqueId() vom Datentyp UUID.

Diese Schilder solltest du über ihre Koordinaten (Location) speichern.
Du kommst dann mit "blockState = location.getBlock().getBlockState();" an das Schild ran. Du prüfst dann zunächst, ob an der Stelle sich noch ein Schild befindet "if (blockState instanceof Sign)" und führst dann eine Typkonvertierung durch: "Sign sign = (Sign) blockState;"

Wieso sollte man um einen Spieler in der HashMap zu speichern die UUID des Spielers speichern wenn dieser bei Quit eh wieder entfernt wird. Mach keinen Sinn.
 

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
Damit man sich das mit dem Speichern über Namen erst gar nicht angewöhnt. Bei Codererweiterungen kann eine spätere Umstellung auf UUIDs dann viel aufwändiger werden.
Und es gibt im Jahr 2017 immer noch Plugins, die nicht auf Namensänderungen vorbereitet sind und auch den Namen zur persistenten Speicherung verwenden.
 
Oben